diff --git a/srcpkgs/git/patches/ps b/srcpkgs/git/patches/ps new file mode 100644 index 00000000000..fe1bc804bff --- /dev/null +++ b/srcpkgs/git/patches/ps @@ -0,0 +1,114 @@ +From: Patrick Steinhardt +Subject: [PATCH v3] builtin/gc: fix crash when running `git maintenance start` + +It was reported on the mailing list that running `git maintenance start` +immediately segfaults starting with b6c3f8e12c (builtin/maintenance: fix +leak in `get_schedule_cmd()`, 2024-09-26). And indeed, this segfault is +trivial to reproduce up to a point where one is scratching their head +why we didn't catch this regression in our test suite. + +The root cause of this error is `get_schedule_cmd()`, which does not +populate the `out` parameter in all cases anymore starting with the +mentioned commit. Callers do assume it to always be populated though and +will e.g. call `strvec_split()` on the returned value, which will of +course segfault when the variable is uninitialized. + +So why didn't we catch this trivial regression? The reason is that our +tests always set up the "GIT_TEST_MAINT_SCHEDULER" environment variable +via "t/test-lib.sh", which allows us to override the scheduler command +with a custom one so that we don't accidentally modify the developer's +system. But the faulty code where we don't set the `out` parameter will +only get hit in case that environment variable is _not_ set, which is +never the case when executing our tests. + +Fix the regression by again unconditionally allocating the value in the +`out` parameter, if provided. Add a test that unsets the environment +variable to catch future regressions in this area. + +Reported-by: Shubham Kanodia +Signed-off-by: Patrick Steinhardt +--- + + builtin/gc.c | 7 +++++-- + t/t7900-maintenance.sh | 16 ++++++++++++++++ + 2 files changed, 21 insertions(+), 2 deletions(-) + +diff --git a/builtin/gc.c b/builtin/gc.c +index 6a7a2da006..d52735354c 100644 +--- a/builtin/gc.c ++++ b/builtin/gc.c +@@ -1832,7 +1832,7 @@ static const char *get_extra_launchctl_strings(void) { + * | Input | Output | + * | *cmd | return code | *out | *is_available | + * +-------+-------------+-------------------+---------------+ +- * | "foo" | false | NULL | (unchanged) | ++ * | "foo" | false | "foo" (allocated) | (unchanged) | + * +-------+-------------+-------------------+---------------+ + * + * GIT_TEST_MAINT_SCHEDULER set to “foo:./mock_foo.sh,bar:./mock_bar.sh” +@@ -1850,8 +1850,11 @@ static int get_schedule_cmd(const char *cmd, int *is_available, char **out) + struct string_list_item *item; + struct string_list list = STRING_LIST_INIT_NODUP; + +- if (!testing) ++ if (!testing) { ++ if (out) ++ *out = xstrdup(cmd); + return 0; ++ } + + if (is_available) + *is_available = 0; +diff --git a/t/t7900-maintenance.sh b/t/t7900-maintenance.sh +index a66d0e089d..c224c8450c 100755 +--- a/t/t7900-maintenance.sh ++++ b/t/t7900-maintenance.sh +@@ -646,6 +646,22 @@ test_expect_success !MINGW 'register and unregister with regex metacharacters' ' + maintenance.repo "$(pwd)/$META" + ' + ++test_expect_success 'start without GIT_TEST_MAINT_SCHEDULER' ' ++ test_when_finished "rm -rf systemctl.log script repo" && ++ mkdir script && ++ write_script script/systemctl <<-\EOF && ++ echo "$*" >>../systemctl.log ++ EOF ++ git init repo && ++ ( ++ cd repo && ++ sane_unset GIT_TEST_MAINT_SCHEDULER && ++ PATH="$PWD/../script:$PATH" git maintenance start --scheduler=systemd ++ ) && ++ test_grep -- "--user list-timers" systemctl.log && ++ test_grep -- "enable --now git-maintenance@" systemctl.log ++' ++ + test_expect_success 'start --scheduler=' ' + test_expect_code 129 git maintenance start --scheduler=foo 2>err && + test_grep "unrecognized --scheduler argument" err && + +Range-diff against v2: +1: 5798c31e1e ! 1: a5b1433abf builtin/gc: fix crash when running `git maintenance start` + @@ t/t7900-maintenance.sh: test_expect_success !MINGW 'register and unregister with + +test_expect_success 'start without GIT_TEST_MAINT_SCHEDULER' ' + + test_when_finished "rm -rf systemctl.log script repo" && + + mkdir script && + -+ write_script script/systemctl <<-EOF && + -+ echo "\$*" >>"$(pwd)"/systemctl.log + ++ write_script script/systemctl <<-\EOF && + ++ echo "$*" >>../systemctl.log + + EOF + + git init repo && + + ( + + cd repo && + + sane_unset GIT_TEST_MAINT_SCHEDULER && + -+ PATH="$(pwd)/../script:$PATH" git maintenance start --scheduler=systemd + ++ PATH="$PWD/../script:$PATH" git maintenance start --scheduler=systemd + + ) && + + test_grep -- "--user list-timers" systemctl.log && + + test_grep -- "enable --now git-maintenance@" systemctl.log +-- +2.47.0.dirty + + + diff --git a/srcpkgs/git/template b/srcpkgs/git/template index cc3a4098f6a..042eded4ee8 100644 --- a/srcpkgs/git/template +++ b/srcpkgs/git/template @@ -1,6 +1,6 @@ # Template file for 'git' pkgname=git -version=2.46.2 +version=2.47.0 revision=1 hostmakedepends="asciidoc gettext perl pkg-config tk xmlto" makedepends="libglib-devel libcurl-devel libsecret-devel pcre2-devel tk-devel" @@ -14,7 +14,7 @@ license="GPL-2.0-only" homepage="https://git-scm.com/" changelog="https://raw.githubusercontent.com/git/git/master/Documentation/RelNotes/${version}.txt" distfiles="https://www.kernel.org/pub/software/scm/git/git-${version}.tar.xz" -checksum=5ee8a1c68536094a4f7f9515edc154b12a275b8a57dda4c21ecfbf1afbae2ca3 +checksum=1ce114da88704271b43e027c51e04d9399f8c88e9ef7542dae7aebae7d87bc4e replaces="git-perl>=0" python_version=3