builtin/rev-parse: fix memory leak with `--parseopt`

The `--parseopt` mode allows shell scripts to have the same option parsing mode as we have in C builtins. It soaks up a set of option descriptions via stdin and massages them into proper `struct option`s that we can then use to parse a set of arguments. We only partially free those options when done though, creating a memory leak. Interestingly, we only end up free'ing the first option's help, which is of course wrong. Fix this by freeing all option's help fields as well as their `argh` fields to plug this memory leak. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Patrick Steinhardt committed Aug 1, 2024 at 12:40 UTC 2d197e4a0f34b97b03416666bebcb993e41fed26
2 files changed +6 -1
builtin/rev-parse.c
+4 -1
@@ -553,7 +553,10 @@ static int cmd_parseopt(int argc, const char **argv, const char *prefix)
553 strbuf_release(&sb);
554 strvec_clear(&longnames);
555 strvec_clear(&usage);
556 - free((char *) opts->help);
556 + for (size_t i = 0; i < opts_nr; i++) {
557 + free((char *) opts[i].help);
558 + free((char *) opts[i].argh);
559 + }
560 free(opts);
561 return 0;
562 }
t/t1502-rev-parse-parseopt.sh
+2
@@ -1,6 +1,8 @@
1 #!/bin/sh
2
3 test_description='test git rev-parse --parseopt'
4 +
5 +TEST_PASSES_SANITIZE_LEAK=true
6 . ./test-lib.sh
7
8 check_invalid_long_option () {