From 2e19ef5ca0707fb8b421901e74a56ceed5c544f1 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Mon, 17 Feb 2025 20:57:46 +0800 Subject: [PATCH] git_hooks_handle.go: Read argv from hook --- git_hooks_handle.go | 40 +++++++++++++++++++++++++++++++++------- diff --git a/git_hooks_handle.go b/git_hooks_handle.go index 00b1c654adebdd486a7acaecdd0d86211d476fca..5cb59ce746dbe3d3fec1cc84f7b26a4b023cf86d 100644 --- a/git_hooks_handle.go +++ b/git_hooks_handle.go @@ -1,6 +1,8 @@ package main import ( + "bytes" + "encoding/binary" "errors" "fmt" "net" @@ -8,9 +10,11 @@ "os" "syscall" ) -var err_not_unixconn = errors.New("Not a unix connection") -var err_get_fd = errors.New("Unable to get file descriptor") -var err_get_ucred = errors.New("Failed getsockopt") +var ( + err_not_unixconn = errors.New("Not a unix connection") + err_get_fd = errors.New("Unable to get file descriptor") + err_get_ucred = errors.New("Failed getsockopt") +) func hooks_handle_connection(conn net.Conn) { defer conn.Close() @@ -21,17 +25,39 @@ conn.Write([]byte{1}) fmt.Fprintln(conn, "Unable to get peer credentials:", err.Error()) return } - if ucred.Uid != uint32(os.Getuid()) { conn.Write([]byte{1}) fmt.Fprintln(conn, "UID mismatch") return } - conn.Write([]byte{0}) - fmt.Fprintf(conn, "Your PID is %d\n", ucred.Pid) + var argc64 uint64 + err = binary.Read(conn, binary.NativeEndian, &argc64) + if err != nil { + conn.Write([]byte{1}) + fmt.Fprintln(conn, "Failed to read argc:", err.Error()) + return + } + var args []string + for i := uint64(0); i < argc64; i++ { + var arg bytes.Buffer + for { + b := make([]byte, 1) + n, err := conn.Read(b) + if err != nil || n != 1 { + conn.Write([]byte{1}) + fmt.Fprintln(conn, "Failed to read arg:", err.Error()) + return + } + if b[0] == 0 { + break + } + arg.WriteByte(b[0]) + } + args = append(args, arg.String()) + } - return + conn.Write([]byte{0}) } func serve_git_hooks(listener net.Listener) error { -- 2.48.1