Re: [PATCH 3/3] Replace setenv(GIT_DIR_ENVIRONMENT, ...) with set_git_dir()
- From
Steffen Prohaska <prohaska@zib.de>
- Date
- Jan 1, 2008, 18:52 UTC
- Message-ID
- <0FFA1D0A-DB70-446C-9C43-A6FBAEFE7CA4@zib.de>
- In-Reply-To
- <3B6B19E6-255F-4D8F-B6A3-255A9E8E0AB0@zib.de>
Eventually I found some time to investigate this issue ...
On Nov 22, 2007, at 6:56 PM, Steffen Prohaska wrote:
Show 29 quoted lines
> > On Nov 22, 2007, at 10:58 AM, Johannes Sixt wrote: > >> Steffen Prohaska schrieb: >>> On Nov 22, 2007, at 8:52 AM, Junio C Hamano wrote: >>>> I suspect that if there are even earlier callers than these >>>> early parts in the codepaths (handle_options, enter_repo, and >>>> setup_git_directory_gently), maybe these earlier callers are >>>> doing something wrong. Logically, if you are somewhere very >>>> early in the codepath that you can still change the value of >>>> GIT_DIR, you shouldn't have assumed the unknown value of GIT_DIR >>>> and cached locations relative to that directory, no? What are >>>> the problematic callers? What values do they access and why? >>> I thought about these questions, too. But only very briefly. >>> I did not analyze the code path that lead to calls of getenv(). >>> I'm not sure if it's really necessary. Calling set_git_dir() >>> looks more sensible too me than the old code. I believe using >>> set_git_dir() is the safer choice, and should not do any harm. >>> So I stopped analyzing too much, and instead proposed to use >>> set_git_dir(). >> >> Junio's point is this: If we stumble over a dangling pointer that >> getenv() produced, then this has obviously happened before setenv >> (GIT_DIR), and caching that pointer is probably the wrong thing to >> do anyway (because it refers to the wrong GIT_DIR) and needs to be >> fixed. > > I see your point. It is probably more important to investigate > this than I recognized at a first glance.
I instrumented the code to verify if setenv(GIT_DIR) is called after setup_git_env(). This is not the case for all tests.
I also searched for problematic code paths.
setup_git_directory_gently() looks correct. It explicitly calls getenv(GIT_DIR_ENVIRONMENT); but uses the value returned in a safe manner. It does not cache the result and the only code path that calls set_git_dir() does not access the return value of the getenv() call after the call to set_git_dir().
setup_work_tree() looks correct, too. Here, get_git_dir() is called, which implicitly results in caching the pointer returned from getenv(GIT_DIR_ENVIRONMENT). But the result of get_git_dir() is neither cached nor used after a subsequent call to set_git_dir().
So, I don't find any obvious problems.
Show 10 quoted lines
>>> Interesting, though, is to find out if we have other potentially >>> dangerous calls to getenv() that are not removed by this patch. >> >> Side note for other readers: This is a Windows specific problem >> for the moment because its getenv() does not behave well. > > Yes, and apparently even nobody knows how to trigger the problem > on Windows. At this point, we only know that caching getenv() > calls is unsafe, while on Unix it is safe (at least for BSD > it's documented to be safe).
In conclusion, using setenv() as in the original code instead of set_git_dir() should be safe and this patch is not needed.
I tend to revert the changes in msysgit and see if we hit any problems. But I'll wait until 1.5.4 is released.
Steffen