Don't check directories always case-insensitive in rename(2)

Long-standing problem in one of the corner cases of rename(2):
If we rename a directory a check is performed to see if newpath is
identical to oldpath or a subdir of oldpath. This check is
(accidentally? no hints anywhere in ChangeLogs or code) performed
case-insensitive for as long as we use Unicode paths and NT functions.
This leads to the problems described in
https://cygwin.com/ml/cygwin/2016-09/msg00264.html

Change this to be conditional case-sensitive as all other checks but
let's take this with a grain of salt.  There may be corner-cases in
this corner-case which require to chek parts of the path always
case-insensitive.  Off the top of my head I can't construct such a
case but that's no proof they don't exist :}

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2016-10-19 13:26:03 +02:00
parent e1824aea27
commit e3ccb68610
2 changed files with 4 additions and 1 deletions

View File

@ -11,3 +11,6 @@ Bug Fixes
- Fix regression in console charset handling
Addresses: https://cygwin.com/ml/cygwin/2016-10/msg00000.html
- Fix case-sensitivity problem when renaming directories
Addresses: https://cygwin.com/ml/cygwin/2016-09/msg00264.html

View File

@ -2224,7 +2224,7 @@ rename (const char *oldpath, const char *newpath)
/* Check for newpath being identical or a subdir of oldpath. */
if (RtlPrefixUnicodeString (oldpc.get_nt_native_path (),
newpc.get_nt_native_path (),
TRUE))
oldpc.objcaseinsensitive ()))
{
if (newpc.get_nt_native_path ()->Length
== oldpc.get_nt_native_path ()->Length)