handle_options(): do not miscount how many arguments were used

The handle_options() function advances the base of the argument array and returns the number of arguments it used. The caller in handle_alias() wants to reallocate the argv array it passes to this function, and attempts to do so by subtracting the returned value to compensate for the change handle_options() makes to the new_argv. But handle_options() did not correctly count when "-c <config=value>" is given, causing a wrong pointer to be passed to realloc(). Fix it by saving the original argv at the beginning of handle_options(), and return the difference between the final value of argv, which will relieve the places that move the array pointer from the additional burden of keeping track of "handled" counter. Noticed-by: Kazuki Tsujimoto Signed-off-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Junio C Hamano committed May 24, 2011 at 18:50 UTC 73546c085d49694c5e54b421f80bde6bc25006fb
2 files changed +3 -5
git.c
+2 -4
@@ -55,7 +55,7 @@ static void commit_pager_choice(void) {
55
56 static int handle_options(const char ***argv, int *argc, int *envchanged)
57 {
58 - int handled = 0;
58 + const char **orig_argv = *argv;
59
60 while (*argc > 0) {
61 const char *cmd = (*argv)[0];
@@ -105,7 +105,6 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
105 *envchanged = 1;
106 (*argv)++;
107 (*argc)--;
108 - handled++;
108 } else if (!prefixcmp(cmd, "--git-dir=")) {
109 setenv(GIT_DIR_ENVIRONMENT, cmd + 10, 1);
110 if (envchanged)
@@ -145,9 +144,8 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
144
145 (*argv)++;
146 (*argc)--;
148 - handled++;
147 }
150 - return handled;
148 + return (*argv) - orig_argv;
149 }
150
151 static int handle_alias(int *argcp, const char ***argv)
t/t1300-repo-config.sh
+1 -1
@@ -854,7 +854,7 @@ test_expect_success 'git -c "key=value" support' '
854 test_must_fail git -c core.name=value config name
855 '
856
857 -test_expect_failure 'git -c works with aliases of builtins' '
857 +test_expect_success 'git -c works with aliases of builtins' '
858 git config alias.checkconfig "-c foo.check=bar config foo.check" &&
859 echo bar >expect &&
860 git checkconfig >actual &&