git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 4/4] handle_options(): do not miscount how many arguments were used

From
Jeff King <peff@peff.net>
Date
May 24, 2011, 22:50 UTC
Message-ID
<20110524225035.GD24527@sigill.intra.peff.net>
In-Reply-To
<20110524224903.GA16265@sigill.intra.peff.net>
From: Junio C Hamano <gitster@pobox.com>

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>
---
 git.c                  |    6 ++----
 t/t1300-repo-config.sh |    2 +-
 2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/git.c b/git.c
index a5ef3c6..89721d4 100644
--- a/git.c
+++ b/git.c
@@ -66,7 +66,7 @@ static void commit_pager_choice(void) {
 
 static int handle_options(const char ***argv, int *argc, int *envchanged)
 {
-	int handled = 0;
+	const char **orig_argv = *argv;
 
 	while (*argc > 0) {
 		const char *cmd = (*argv)[0];
@@ -122,7 +122,6 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
 				*envchanged = 1;
 			(*argv)++;
 			(*argc)--;
-			handled++;
 		} else if (!prefixcmp(cmd, "--git-dir=")) {
 			setenv(GIT_DIR_ENVIRONMENT, cmd + 10, 1);
 			if (envchanged)
@@ -162,9 +161,8 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
 
 		(*argv)++;
 		(*argc)--;
-		handled++;
 	}
-	return handled;
+	return (*argv) - orig_argv;
 }
 
 static int handle_alias(int *argcp, const char ***argv)
diff --git a/t/t1300-repo-config.sh b/t/t1300-repo-config.sh
index fe7a153..3db5626 100755
--- a/t/t1300-repo-config.sh
+++ b/t/t1300-repo-config.sh
@@ -897,7 +897,7 @@ test_expect_success 'key sanity-checking' '
 	git config foo."ba =z".bar false
 '
 
-test_expect_failure 'git -c works with aliases of builtins' '
+test_expect_success 'git -c works with aliases of builtins' '
 	git config alias.checkconfig "-c foo.check=bar config foo.check" &&
 	echo bar >expect &&
 	git checkconfig >actual &&
-- 
1.7.4.5.7.g2e01
Previous: Jeff King
Message 10 of 10 in “handle_options(): do not miscount how many arguments were used”
  1. handle_options(): do not miscount how many arguments were usedJunio C Hamano, May 24, 2011
  2. Allow built-ins to also use -c var=val via aliasJunio C Hamano, May 24, 2011
  3. Jeff KingMay 24, 2011
  4. Jeff KingMay 24, 2011
  5. Jeff KingMay 24, 2011
  6. Jeff KingMay 24, 2011
  7. 1/4 config: make environment parsing routines staticJeff King, May 24, 2011
  8. 2/4 git_config: don't peek at global config_parametersJeff King, May 24, 2011
  9. 3/4 config: always parse GIT_CONFIG_PARAMETERS during git_configJeff King, May 24, 2011
  10. 4/4 handle_options(): do not miscount how many arguments were usedJeff King, May 24, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.