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

Re: [PATCH] Do not trust PWD blindly

From
Junio C Hamano <gitster@pobox.com>
Date
Jul 11, 2011, 16:56 UTC
Message-ID
<7vbox0g3hn.fsf@alter.siamese.dyndns.org>
In-Reply-To
<alpine.DEB.1.00.1107111121390.3379@bonsai2>
Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
Show 15 quoted lines
> On Sun, 10 Jul 2011, Randal L. Schwartz wrote:
> ...
>> If you ever depend on a userspace PWD to be your actual current 
>> directory without at least stat()ing it, you've failed.
>> 
>> In my experience, it is *never* reliable.  It's just a hint.
>
> To be precise, get_pwd_cwd() _does_ stat() what's in PWD, and _does_ 
> compare with the stat() of what comes out of getcwd(), but that comparison 
> uses only st_dev and st_ino, both of which happen to be 0 in my case -- 
> for each and every file/directory.
>
> I can only _guess_ at the reasoning behind get_pwd_cwd(). I _think_ it was 
> meant to catch the case when getcwd() and PWD refer to the same directory, 
> but PWD goes through symbolic links.

Thanks for a much clearer explanation than before. I tried to reword the proposed commit log message using the description above.

I feel that the title is still not optimal. If the original code used to return getenv("PWD") if the environment variable is set, and otherwise fell back to getcwd(), and the updated code tries to make sure they refer to the same directory, then "Do not trust PWD blindly" would be a good description for the fix, but the code you fixed the bug in tried not to trust PWD blindly but failed to realize that on some systems dev/ino field may be unreliable.

"Do not trust st.st_ino/st.st_dev blindly" might be a better title in that sense.

In any case, thanks for a fix; will queue.
Author: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Date:   Sat Jul 9 19:38:08 2011 +0200
    Do not trust PWD blindly
    
    10c4c88 (Allow add_path() to add non-existent directories to the path,
    2008-07-21) introduced get_pwd_cwd() function in order to favor $PWD when
    getenv("PWD") and getcwd() refer to the same directory but are different
    strings (e.g. the former gives a nicer looking name via a symbolic link to
    an uglier looking automounted path). The function tried to determine if
    two directories are the same by running stat(2) on both and comparing
    ino/dev fields.
    
    Unfortunately, stat() does not fill any ino or dev fields in msysgit.  But
    there is a telltale: both ino and dev are 0 when they are not filled
    correctly, so let's be extra cautious.
    
    This happens to fix a bug in "get-receive-pack working_directory/" when
    the GIT_DIR would not be set correctly due to absolute_path(".")
    returning the wrong value.
    
    Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
    Acked-by: Johannes Sixt <j6t@kdbg.org>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
Previous: Johannes SchindelinNext: Johannes Schindelin
Message 7 of 8 in “Do not trust PWD blindly”
  1. Do not trust PWD blindlyJohannes Schindelin, Jul 9, 2011
  2. Sebastian SchuberthJul 9, 2011
  3. Johannes SixtJul 10, 2011
  4. Johannes SchindelinJul 10, 2011
  5. Randal L. SchwartzJul 11, 2011
  6. Johannes SchindelinJul 11, 2011
  7. Junio C HamanoJul 11, 2011
  8. Johannes SchindelinJul 11, 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.