Deleting a directory with the same name as a shortcut deletes everything in CWD

Ken Brown kbrown@cornell.edu
Tue Aug 9 19:52:25 GMT 2022


On 8/8/2022 7:29 PM, Ken Brown wrote:
> On 8/8/2022 7:56 AM, Christian Franke wrote:
>> Testcase:
>>
>> $ ls -a
>> .  ..
>>
>> $ touch link.lnk file.txt
>>
>> $ ls -a
>> .  ..  file.txt  link.lnk
>>
>> $ stat -c %F link.lnk
>> regular empty file
>>
>> $ stat -c %F link
>> directory
> 
> This happens because symlink_info::check returns -1 instead of 0 when called on 
> "link".  The main loop over suffixes finds and rejects link.lnk but then leaves 
> "res" as -1 when it continues looping.  The following patch fixes the problem:
> 
> --- a/winsup/cygwin/path.cc
> +++ b/winsup/cygwin/path.cc
> @@ -3422,6 +3422,7 @@ restart:
>          {
>            fileattr = INVALID_FILE_ATTRIBUTES;
>            set_error (ENOENT);
> +         res = 0;
>            continue;
>          }
> 
> It's possible that a better fix would be to set res = 0 at the beginning of each 
> iteration of the loop, but I'll have to study the code more carefully before I'm 
> sure of that.  Also, the comment preceding symlink_info::check needs to be fixed 
> to correctly indicate what a negative return value means.  I'll look at all this 
> more carefully tomorrow if no one beats me to it.

I think the best fix is to set res = 0 at the beginning of the loop and to 
remove a "res = -1" that occurs later.  I've sent a patch to cygwin-patches.

Ken


More information about the Cygwin mailing list