Cygwin: align renameat2 to Linux behaviour
In contrast to rename default behaviour, Linux' renameat2 returns -1
with errno set to EEXIST, if oldfile and newfile refer to the same
file, and the RENAME_NOREPLACE flag is set.
Follow suit, given this is a Linux-only function anyway.
Fixes: f665b1cef3
("cygwin: Implement renameat2")
Reported-by: Bruno Haible <bruno@clisp.org>
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
parent
fa84aa4dd2
commit
d30a5917a9
|
@ -21,3 +21,7 @@ Bug Fixes
|
|||
|
||||
- Fix error handling in readlinkat.
|
||||
Addresses: https://cygwin.com/pipermail/cygwin/2023-April/253510.html
|
||||
|
||||
- Fix return code and errno set by renameat2, if oldfile and newfile
|
||||
refer to the same file, and the RENAME_NOREPLACE flag is set.
|
||||
Addresses: https://cygwin.com/pipermail/cygwin/2023-April/253514.html
|
||||
|
|
|
@ -2108,6 +2108,14 @@ nt_path_has_executable_suffix (PUNICODE_STRING upath)
|
|||
return false;
|
||||
}
|
||||
|
||||
inline int
|
||||
set_same_file_return (bool noreplace)
|
||||
{
|
||||
if (!noreplace)
|
||||
return 0;
|
||||
set_errno (EEXIST);
|
||||
return -1;
|
||||
}
|
||||
/* If newpath names an existing file and the RENAME_NOREPLACE flag is
|
||||
specified, fail with EEXIST. Exception: Don't fail if the purpose
|
||||
of the rename is just to change the case of oldpath on a
|
||||
|
@ -2286,7 +2294,7 @@ rename2 (const char *oldpath, const char *newpath, unsigned int at2flags)
|
|||
newpc.get_nt_native_path (),
|
||||
FALSE))
|
||||
{
|
||||
res = 0;
|
||||
res = set_same_file_return (noreplace);
|
||||
__leave;
|
||||
}
|
||||
newpc.file_attributes (INVALID_FILE_ATTRIBUTES);
|
||||
|
@ -2301,7 +2309,7 @@ rename2 (const char *oldpath, const char *newpath, unsigned int at2flags)
|
|||
if (newpc.get_nt_native_path ()->Length
|
||||
== oldpc.get_nt_native_path ()->Length)
|
||||
{
|
||||
res = 0;
|
||||
res = set_same_file_return (noreplace);
|
||||
__leave;
|
||||
}
|
||||
if (*(PWCHAR) ((PBYTE) newpc.get_nt_native_path ()->Buffer
|
||||
|
@ -2321,7 +2329,7 @@ rename2 (const char *oldpath, const char *newpath, unsigned int at2flags)
|
|||
newpc.get_nt_native_path (),
|
||||
oldpc.objcaseinsensitive ()))
|
||||
{
|
||||
res = 0;
|
||||
res = set_same_file_return (noreplace);
|
||||
__leave;
|
||||
}
|
||||
}
|
||||
|
@ -2350,7 +2358,7 @@ rename2 (const char *oldpath, const char *newpath, unsigned int at2flags)
|
|||
newpc.get_nt_native_path (),
|
||||
oldpc.objcaseinsensitive ()))
|
||||
{
|
||||
res = 0;
|
||||
res = set_same_file_return (noreplace);
|
||||
__leave;
|
||||
}
|
||||
}
|
||||
|
@ -2571,7 +2579,7 @@ skip_pre_W10_checks:
|
|||
{
|
||||
debug_printf ("%s and %s are the same file", oldpath, newpath);
|
||||
NtClose (nfh);
|
||||
res = 0;
|
||||
res = set_same_file_return (noreplace);
|
||||
__leave;
|
||||
}
|
||||
NtClose (nfh);
|
||||
|
|
Loading…
Reference in New Issue