git: update to 2.47.0.
This commit is contained in:
parent
e42578e4fa
commit
1467f26ee1
|
@ -0,0 +1,114 @@
|
||||||
|
From: Patrick Steinhardt <ps@pks.im>
|
||||||
|
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 <shubham.kanodia10@gmail.com>
|
||||||
|
Signed-off-by: Patrick Steinhardt <ps@pks.im>
|
||||||
|
---
|
||||||
|
|
||||||
|
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=<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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Template file for 'git'
|
# Template file for 'git'
|
||||||
pkgname=git
|
pkgname=git
|
||||||
version=2.46.2
|
version=2.47.0
|
||||||
revision=1
|
revision=1
|
||||||
hostmakedepends="asciidoc gettext perl pkg-config tk xmlto"
|
hostmakedepends="asciidoc gettext perl pkg-config tk xmlto"
|
||||||
makedepends="libglib-devel libcurl-devel libsecret-devel pcre2-devel tk-devel"
|
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/"
|
homepage="https://git-scm.com/"
|
||||||
changelog="https://raw.githubusercontent.com/git/git/master/Documentation/RelNotes/${version}.txt"
|
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"
|
distfiles="https://www.kernel.org/pub/software/scm/git/git-${version}.tar.xz"
|
||||||
checksum=5ee8a1c68536094a4f7f9515edc154b12a275b8a57dda4c21ecfbf1afbae2ca3
|
checksum=1ce114da88704271b43e027c51e04d9399f8c88e9ef7542dae7aebae7d87bc4e
|
||||||
replaces="git-perl>=0"
|
replaces="git-perl>=0"
|
||||||
python_version=3
|
python_version=3
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue