]> git.ipfire.org Git - thirdparty/git.git/commitdiff
find_hook(): refactor the `STRIP_EXTENSION` logic
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Thu, 28 Mar 2024 18:02:30 +0000 (19:02 +0100)
committerJohannes Schindelin <johannes.schindelin@gmx.de>
Wed, 17 Apr 2024 20:30:09 +0000 (22:30 +0200)
When looking for a hook and not finding one, and when `STRIP_EXTENSION`
is available (read: if we're on Windows and `.exe` is the required
extension for executable programs), we want to look also for a hook with
that extension.

Previously, we added that handling into the conditional block that was
meant to handle when no hook was found (possibly providing some advice
for the user's benefit). If the hook with that file extension was found,
we'd return early from that function instead of writing out said advice,
of course.

However, we're about to introduce a safety valve to prevent hooks from
being run during a clone, to reduce the attack surface of bugs that
allow writing files to be written into arbitrary locations.

To prepare for that, refactor the logic to avoid the early return, by
separating the `STRIP_EXTENSION` handling from the conditional block
handling the case when no hook was found.

This commit is best viewed with `--patience`.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
hook.c

diff --git a/hook.c b/hook.c
index a4fa1031f287652eb734b276d9d6c98df40d9a08..22b274b60b1949c906f8ff32048ff11e82c2c840 100644 (file)
--- a/hook.c
+++ b/hook.c
@@ -7,20 +7,24 @@ const char *find_hook(const char *name)
 {
        static struct strbuf path = STRBUF_INIT;
 
+       int found_hook;
+
        strbuf_reset(&path);
        strbuf_git_path(&path, "hooks/%s", name);
-       if (access(path.buf, X_OK) < 0) {
+       found_hook = access(path.buf, X_OK) >= 0;
+#ifdef STRIP_EXTENSION
+       if (!found_hook) {
                int err = errno;
 
-#ifdef STRIP_EXTENSION
                strbuf_addstr(&path, STRIP_EXTENSION);
-               if (access(path.buf, X_OK) >= 0)
-                       return path.buf;
-               if (errno == EACCES)
-                       err = errno;
+               found_hook = access(path.buf, X_OK) >= 0;
+               if (!found_hook)
+                       errno = err;
+       }
 #endif
 
-               if (err == EACCES && advice_enabled(ADVICE_IGNORED_HOOK)) {
+       if (!found_hook) {
+               if (errno == EACCES && advice_enabled(ADVICE_IGNORED_HOOK)) {
                        static struct string_list advise_given = STRING_LIST_INIT_DUP;
 
                        if (!string_list_lookup(&advise_given, name)) {