]> git.ipfire.org Git - thirdparty/git.git/commitdiff
maintenance --unregister: fix uninit'd data use & -Wdeclaration-after-statement
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Tue, 15 Nov 2022 16:04:27 +0000 (17:04 +0100)
committerTaylor Blau <me@ttaylorr.com>
Tue, 15 Nov 2022 17:31:53 +0000 (12:31 -0500)
Since (maintenance: add option to register in a specific config,
2022-11-09) we've been unable to build with "DEVELOPER=1" without
"DEVOPTS=no-error", as the added code triggers a
"-Wdeclaration-after-statement" warning.

And worse than that, the data handed to git_configset_clear() is
uninitialized, as can be spotted with e.g.:

./t7900-maintenance.sh -vixd --run=23 --valgrind
[...]
+ git maintenance unregister --force
Conditional jump or move depends on uninitialised value(s)
   at 0x6B5F1E: git_configset_clear (config.c:2367)
   by 0x4BA64E: maintenance_unregister (gc.c:1619)
   by 0x4BD278: cmd_maintenance (gc.c:2650)
   by 0x409905: run_builtin (git.c:466)
   by 0x40A21C: handle_builtin (git.c:721)
   by 0x40A58E: run_argv (git.c:788)
   by 0x40AF68: cmd_main (git.c:926)
   by 0x5D39FE: main (common-main.c:57)
 Uninitialised value was created by a stack allocation
   at 0x4BA22C: maintenance_unregister (gc.c:1557)

Let's fix both of these issues, and also move the scope of the
variable to the "if" statement it's used in, to make it obvious where
it's used.

Helped-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
builtin/gc.c

index 56b107e7f0b9649a0f2d1ef9a230ef46328aece9..d87cf84041f4ab63c3c44f92798af10d59ede43d 100644 (file)
@@ -1550,11 +1550,13 @@ static int maintenance_unregister(int argc, const char **argv, const char *prefi
                usage_with_options(builtin_maintenance_unregister_usage,
                                   options);
 
-       struct config_set cs;
        if (config_file) {
+               struct config_set cs;
+
                git_configset_init(&cs);
                git_configset_add_file(&cs, config_file);
                list = git_configset_get_value_multi(&cs, key);
+               git_configset_clear(&cs);
        } else {
                list = git_config_get_value_multi(key);
        }
@@ -1590,7 +1592,6 @@ static int maintenance_unregister(int argc, const char **argv, const char *prefi
                die(_("repository '%s' is not registered"), maintpath);
        }
 
-       git_configset_clear(&cs);
        free(maintpath);
        return 0;
 }