threads / bug / 37181

Bug in get_pwd_cwd() in Windows?

Subject: Bug in get_pwd_cwd() in Windows?

## tl;dr

4 messages between Jul 21, 2014 and Jul 23, 2014.

replies: 3people: 3as markdown or json

Duy Nguyen· Jul 21, 2014, 14:13 UTC · lore

This function tests if $PWD is the same as getcwd() using st_dev and st_ino. But on Windows these fields are always zero (mingw.c:do_lstat). If cwd is moved away, I think falling back to $PWD is wrong. I don't understand the use of $PWD in the first place. 1b9a946 (Use nonrelative paths instead of absolute paths for cloned repositories - 2008-06-05) does not explain much.

-- 
Duy
René Scharfe· Jul 22, 2014, 19:35 UTC · re: Duy Nguyen · lore

Re: Bug in get_pwd_cwd() in Windows?

Am 21.07.2014 16:13, schrieb Duy Nguyen:
Show 6 quoted lines
> This function tests if $PWD is the same as getcwd() using st_dev and
> st_ino. But on Windows these fields are always zero
> (mingw.c:do_lstat). If cwd is moved away, I think falling back to $PWD
> is wrong. I don't understand the use of $PWD in the first place.
> 1b9a946 (Use nonrelative paths instead of absolute paths for cloned
> repositories - 2008-06-05) does not explain much.
The commit message reads:
   Particularly for the "alternates" file, if one will be created, we
   want a path that doesn't depend on the current directory, but we want
   to retain any symlinks in the path as given and any in the user's view
   of the current directory when the path was given.

The intent of the patch seems to be to prefer $PWD if it points to the same directory as the one returned by getcwd() in order to preserve "the user's view". That's why it introduces make_nonrelative_path() (now called absolute_path()), in contrast to make_absolute_path() (now called real_path()).

I imagine it's useful e.g. if your home is accessed through a symlink:
	/home/foo -> /some/boring/mountpoint

Then real_path("bar") would give you "/some/boring/mountpoint/bar", while absolute_path("bar") returned "/home/foo/bar". Not resolving symlinks keeps the path friendly in this case. And it keeps working even after the user's home is migrated to /a/bigger/partition and /home/foo is updated accordingly.

René
Duy Nguyen· Jul 23, 2014, 11:53 UTC · re: René Scharfe · lore

Re: Bug in get_pwd_cwd() in Windows?

On Wed, Jul 23, 2014 at 2:35 AM, René Scharfe <l.s.r@web.de> wrote:
Show 32 quoted lines
> Am 21.07.2014 16:13, schrieb Duy Nguyen:
>
>> This function tests if $PWD is the same as getcwd() using st_dev and
>> st_ino. But on Windows these fields are always zero
>> (mingw.c:do_lstat). If cwd is moved away, I think falling back to $PWD
>> is wrong. I don't understand the use of $PWD in the first place.
>> 1b9a946 (Use nonrelative paths instead of absolute paths for cloned
>> repositories - 2008-06-05) does not explain much.
>
>
> The commit message reads:
>
>   Particularly for the "alternates" file, if one will be created, we
>   want a path that doesn't depend on the current directory, but we want
>   to retain any symlinks in the path as given and any in the user's view
>   of the current directory when the path was given.
>
> The intent of the patch seems to be to prefer $PWD if it points to the same
> directory as the one returned by getcwd() in order to preserve "the user's
> view".  That's why it introduces make_nonrelative_path() (now called
> absolute_path()), in contrast to make_absolute_path() (now called
> real_path()).
>
> I imagine it's useful e.g. if your home is accessed through a symlink:
>
>         /home/foo -> /some/boring/mountpoint
>
> Then real_path("bar") would give you "/some/boring/mountpoint/bar", while
> absolute_path("bar") returned "/home/foo/bar".  Not resolving symlinks keeps
> the path friendly in this case.  And it keeps working even after the user's
> home is migrated to /a/bigger/partition and /home/foo is updated
> accordingly.

If it's saved back, then yes it's useful. And I think that's the case in clone.c. I was tempted to remove this code (because it only works if you stand at worktree's root dir anyway, else cwd is moved) but I guess we can just disable this code on Windows only instead.

-- 
Duy
Karsten Blees· Jul 23, 2014, 12:40 UTC · re: Duy Nguyen · lore

Re: Bug in get_pwd_cwd() in Windows?

Am 23.07.2014 13:53, schrieb Duy Nguyen:
Show 39 quoted lines
> On Wed, Jul 23, 2014 at 2:35 AM, René Scharfe <l.s.r@web.de> wrote:
>> Am 21.07.2014 16:13, schrieb Duy Nguyen:
>>
>>> This function tests if $PWD is the same as getcwd() using st_dev and
>>> st_ino. But on Windows these fields are always zero
>>> (mingw.c:do_lstat). If cwd is moved away, I think falling back to $PWD
>>> is wrong. I don't understand the use of $PWD in the first place.
>>> 1b9a946 (Use nonrelative paths instead of absolute paths for cloned
>>> repositories - 2008-06-05) does not explain much.
>>
>>
>> The commit message reads:
>>
>>   Particularly for the "alternates" file, if one will be created, we
>>   want a path that doesn't depend on the current directory, but we want
>>   to retain any symlinks in the path as given and any in the user's view
>>   of the current directory when the path was given.
>>
>> The intent of the patch seems to be to prefer $PWD if it points to the same
>> directory as the one returned by getcwd() in order to preserve "the user's
>> view".  That's why it introduces make_nonrelative_path() (now called
>> absolute_path()), in contrast to make_absolute_path() (now called
>> real_path()).
>>
>> I imagine it's useful e.g. if your home is accessed through a symlink:
>>
>>         /home/foo -> /some/boring/mountpoint
>>
>> Then real_path("bar") would give you "/some/boring/mountpoint/bar", while
>> absolute_path("bar") returned "/home/foo/bar".  Not resolving symlinks keeps
>> the path friendly in this case.  And it keeps working even after the user's
>> home is migrated to /a/bigger/partition and /home/foo is updated
>> accordingly.
> 
> If it's saved back, then yes it's useful. And I think that's the case
> in clone.c. I was tempted to remove this code (because it only works
> if you stand at worktree's root dir anyway, else cwd is moved) but I
> guess we can just disable this code on Windows only instead.
> 
It is disabled on Windows as of 7d092adc get_pwd_cwd(): Do not trust st_dev/st_ino blindly

← back to recent threads