From e3ccb686104103898ac9615a72f0189aa980c273 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 19 Oct 2016 13:26:03 +0200 Subject: [PATCH] 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 --- 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 2d5aef88f..61ce2de64 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 ba7c743d9..13bb309a8 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)