[PATCH v2 2/3] git: protect against unbalanced calls to {save,restore}_env()
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jan 27, 2016, 23:19 UTC
- Message-ID
- <xmqqtwly625m.fsf_-_@gitster.mtv.corp.google.com>
- In-Reply-To
- <xmqq7fiva53g.fsf_-_@gitster.mtv.corp.google.com>
We made sure that save_env_before_alias() does not skip saving the environment when asked to (which led to use-after-free of orig_cwd in restore_env() in the buggy version) with the previous step.
Protect against future breakage where somebody adds new callers of these functions in an unbalanced fashion.
Signed-off-by: Junio C Hamano <gitster@pobox.com> --- git.c | 7 +++++++ 1 file changed, 7 insertions(+)
diff --git a/git.c b/git.c index a57a4cb..e39b972 100644 --- a/git.c +++ b/git.c @@ -26,11 +26,15 @@ static const char *env_names[] = { }; static char *orig_env[4]; static int saved_env_before_alias; +static int save_restore_env_balance; static void save_env_before_alias(void) { int i; saved_env_before_alias = 1; + + assert(save_restore_env_balance == 0); + save_restore_env_balance = 1; orig_cwd = xgetcwd(); for (i = 0; i < ARRAY_SIZE(env_names); i++) { orig_env[i] = getenv(env_names[i]); @@ -42,6 +46,9 @@ static void save_env_before_alias(void) static void restore_env(int external_alias) { int i; + + assert(save_restore_env_balance == 1); + save_restore_env_balance = 0; if (!external_alias && orig_cwd && chdir(orig_cwd)) die_errno("could not move to %s", orig_cwd); free(orig_cwd);
-- 2.7.0-368-gb6e04f9