From ca4ac52de24371172d129db48e780ac3d87b05a4 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Tue, 18 Feb 2025 23:02:53 +0800 Subject: [PATCH] hooks: Check error on conn.Write --- git_hooks_handle.go | 48 ++++++++++++++++++++++++++++++++++++------------ diff --git a/git_hooks_handle.go b/git_hooks_handle.go index 841c8d70d9d7e04708d728d4e4844a27f06926f0..00e262778095def630fc1624038be279ee37dd9a 100644 --- a/git_hooks_handle.go +++ b/git_hooks_handle.go @@ -27,12 +27,16 @@ // There aren't reasonable cases where someone would run this as // another user. ucred, err := get_ucred(conn) if err != nil { - conn.Write([]byte{1}) + if _, err := conn.Write([]byte{1}); err != nil { + return + } fmt.Fprintln(conn, "Unable to get peer credentials:", err.Error()) return } if ucred.Uid != uint32(os.Getuid()) { - conn.Write([]byte{1}) + if _, err := conn.Write([]byte{1}); err != nil { + return + } fmt.Fprintln(conn, "UID mismatch") return } @@ -40,14 +44,18 @@ cookie := make([]byte, 64) _, err = conn.Read(cookie) if err != nil { - conn.Write([]byte{1}) + if _, err := conn.Write([]byte{1}); err != nil { + return + } fmt.Fprintln(conn, "Failed to read cookie:", err.Error()) return } pack_to_hook, ok := pack_to_hook_by_cookie.Load(string(cookie)) if !ok { - conn.Write([]byte{1}) + if _, err := conn.Write([]byte{1}); err != nil { + return + } fmt.Fprintln(conn, "Invalid handler cookie") return } @@ -55,7 +63,9 @@ var argc64 uint64 err = binary.Read(conn, binary.NativeEndian, &argc64) if err != nil { - conn.Write([]byte{1}) + if _, err := conn.Write([]byte{1}); err != nil { + return + } fmt.Fprintln(conn, "Failed to read argc:", err.Error()) return } @@ -66,7 +76,9 @@ for { b := make([]byte, 1) n, err := conn.Read(b) if err != nil || n != 1 { - conn.Write([]byte{1}) + if _, err := conn.Write([]byte{1}); err != nil { + return + } fmt.Fprintln(conn, "Failed to read arg:", err.Error()) return } @@ -87,7 +99,9 @@ switch filepath.Base(args[0]) { case "pre-receive": if pack_to_hook.direct_access { - conn.Write([]byte{0}) + if _, err := conn.Write([]byte{0}); err != nil { + return + } } else { ref_ok := make(map[string]uint8) // 0 for ok @@ -103,14 +117,18 @@ line = line[:len(line)-1] old_oid, rest, found := strings.Cut(line, " ") if !found { - conn.Write([]byte{1}) + if _, err := conn.Write([]byte{1}); err != nil { + return + } fmt.Fprintln(conn, "Invalid pre-receive line:", line) break } new_oid, ref_name, found := strings.Cut(rest, " ") if !found { - conn.Write([]byte{1}) + if _, err := conn.Write([]byte{1}); err != nil { + return + } fmt.Fprintln(conn, "Invalid pre-receive line:", line) break } @@ -129,10 +147,14 @@ } } if or_all_in_map(ref_ok) == 0 { - conn.Write([]byte{0}) + if _, err := conn.Write([]byte{0}); err != nil { + return + } fmt.Fprintln(conn, "Stuff") } else { - conn.Write([]byte{1}) + if _, err := conn.Write([]byte{1}); err != nil { + return + } for ref, status := range ref_ok { switch status { case 0: @@ -148,7 +170,9 @@ } } } default: - conn.Write([]byte{1}) + if _, err := conn.Write([]byte{1}); err != nil { + return + } fmt.Fprintln(conn, "Invalid hook:", args[0]) } } -- 2.48.1