[newlib-cygwin] Don't check directories always case-insensitive in rename(2)

Corinna Vinschen corinna@sourceware.org
Wed Oct 19 11:26:00 GMT 2016


commit e3ccb686104103898ac9615a72f0189aa980c273
Author: Corinna Vinschen <corinna@vinschen.de>
Date:   Wed Oct 19 13:26:03 2016 +0200

    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
    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>

 winsup/cygwin/release/2.6.1 | 3 +++
 winsup/cygwin/syscalls.cc   | 2 +-
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/winsup/cygwin/release/2.6.1 b/winsup/cygwin/release/2.6.1
index 2d5aef8..61ce2de 100644
--- a/winsup/cygwin/release/2.6.1
+++ b/winsup/cygwin/release/2.6.1
@@ -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
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc
index ba7c743..13bb309 100644
--- a/winsup/cygwin/syscalls.cc
+++ b/winsup/cygwin/syscalls.cc
@@ -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)

More information about the Cygwin-cvs mailing list