Re: [PATCH] is_submodule_modified(): clear environment properly
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Feb 24, 2010, 03:32 UTC
- Message-ID
- <7veikbjokw.fsf@alter.siamese.dyndns.org>
- In-Reply-To
- <cb7bb73a1002231413n3a38e344hce8188671763c17b@mail.gmail.com>
Giuseppe Bilotta <giuseppe.bilotta@gmail.com> writes:
Show 8 quoted lines
> On Tue, Feb 23, 2010 at 10:47 PM, Jens Lehmann <Jens.Lehmann@web.de> wrote: >> Only GIT_INDEX_FILE was cleared until now, but other environment variables >> have to be cleared too before running git status in a submodule. >> > Of course this third use-case has a difference in that GIT_DIR is > actually set to something else and not just cleared, but this > particular case could just deep-copy the array modifying the > appropriate entry.
Something like this, I guess.
It is a bit frustrating that local_repo_env[] is a NULL terminated array and we cannot use ARRAY_SIZE(local_repo_env) as a compile-time constant.
submodule.c | 26 +++++++++++++++----------- 1 files changed, 15 insertions(+), 11 deletions(-)
diff --git a/submodule.c b/submodule.c index 7d70c4f..5bd70c4 100644 --- a/submodule.c +++ b/submodule.c @@ -123,14 +123,14 @@ void show_submodule_summary(FILE *f, const char *path, int is_submodule_modified(const char *path) { - int len; + int len, i, dynbase; struct child_process cp; const char *argv[] = { "status", "--porcelain", NULL, }; - char *env[4]; + const char *env[20]; struct strbuf buf = STRBUF_INIT; strbuf_addf(&buf, "%s/.git/", path); @@ -142,17 +142,21 @@ int is_submodule_modified(const char *path) } strbuf_reset(&buf); + for (i = 0; local_repo_env[i] && i < ARRAY_SIZE(env); i++) + env[i] = local_repo_env[i]; + if (ARRAY_SIZE(env) <= i + 3) + die("Bug: recompile submodule.c with larger array size"); + dynbase = i; + strbuf_addf(&buf, "GIT_WORK_TREE=%s", path); - env[0] = strbuf_detach(&buf, NULL); + env[i++] = strbuf_detach(&buf, NULL); strbuf_addf(&buf, "GIT_DIR=%s/.git", path); - env[1] = strbuf_detach(&buf, NULL); - strbuf_addf(&buf, "GIT_INDEX_FILE"); - env[2] = strbuf_detach(&buf, NULL); - env[3] = NULL; + env[i++] = strbuf_detach(&buf, NULL); + env[i++] = NULL; memset(&cp, 0, sizeof(cp)); cp.argv = argv; - cp.env = (const char *const *)env; + cp.env = env; cp.git_cmd = 1; cp.no_stdin = 1; cp.out = -1; @@ -165,9 +169,9 @@ int is_submodule_modified(const char *path) if (finish_command(&cp)) die("git status --porcelain failed"); - free(env[0]); - free(env[1]); - free(env[2]); + for (i = dynbase; env[i]; i++) + free((char *)env[i]); + strbuf_release(&buf); return len != 0; }