]> Kevux Git Server - rit/commitdiff
revision: always store allocated strings in output encoding
authorPatrick Steinhardt <ps@pks.im>
Fri, 7 Jun 2024 06:39:07 +0000 (08:39 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 7 Jun 2024 17:30:54 +0000 (10:30 -0700)
The `git_log_output_encoding` variable can be set via the `--encoding=`
option. When doing so, we conditionally either assign it to the passed
value, or if the value is "none" we assign it the empty string.
Depending on which of the both code paths we pick though, the variable
may end up being assigned either an allocated string or a string
constant.

This is somewhat risky and may easily lead to bugs when a different code
path may want to reassign a new value to it, freeing the previous value.
We already to this when parsing the "i18n.logoutputencoding" config in
`git_default_i18n_config()`. But because the config is typically parsed
before we parse command line options this has been fine so far.

Regardless of that, safeguard the code such that the variable always
contains an allocated string. While at it, also free the old value in
case there was any to plug a potential memory leak.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
revision.c
t/t3900-i18n-commit.sh
t/t3901-i18n-patch.sh

index 7ddf0f1..2ee6886 100644 (file)
@@ -2650,10 +2650,11 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
        } else if (!strcmp(arg, "--invert-grep")) {
                revs->grep_filter.no_body_match = 1;
        } else if ((argcount = parse_long_opt("encoding", argv, &optarg))) {
+               free(git_log_output_encoding);
                if (strcmp(optarg, "none"))
                        git_log_output_encoding = xstrdup(optarg);
                else
-                       git_log_output_encoding = "";
+                       git_log_output_encoding = xstrdup("");
                return argcount;
        } else if (!strcmp(arg, "--reverse")) {
                revs->reverse ^= 1;
index f27d09c..db7b403 100755 (executable)
@@ -5,6 +5,7 @@
 
 test_description='commit and log output encodings'
 
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 compare_with () {
index 4b37f78..5f0b9af 100755 (executable)
@@ -8,6 +8,7 @@ test_description='i18n settings and format-patch | am pipe'
 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 check_encoding () {