From ac4ad8bffcb1358c593b327ae1f1354ec26fee90 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Thu, 5 Nov 2009 14:44:12 +0000 Subject: [PATCH] * syscalls.cc (nt_path_has_suffix): New function. (rename): Don't append .exe suffix if binary target name has any suffix at all. --- winsup/cygwin/ChangeLog | 6 ++++++ winsup/cygwin/syscalls.cc | 33 ++++++++++++++++++++++++++++----- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index a7ed3fed6..88dc85942 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,9 @@ +2009-11-05 Corinna Vinschen + + * syscalls.cc (nt_path_has_suffix): New function. + (rename): Don't append .exe suffix if binary target name has any suffix + at all. + 2009-11-05 Corinna Vinschen * spawn.cc (dll_suffixes): Disable. Explain why. diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index d9c9d596f..f2c646480 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -1643,6 +1643,30 @@ stop_transaction (NTSTATUS status, HANDLE old_trans, HANDLE trans) return status; } +/* This function tests if a filename has *any* suffix. In order to + make this quick and simple, we define a suffix as being not longer + than 4 chars, plus the leading dot. */ +static inline bool +nt_path_has_suffix (PUNICODE_STRING upath) +{ + USHORT pos = upath->Length / sizeof (WCHAR); + const PWCHAR path = upath->Buffer; + USHORT upto; + + /* Too short for a native path? */ + if (pos < 8) + return false; + upto = pos - 5; + while (--pos >= upto) + { + if (path[pos] == L'.') + return true; + if (path[pos] == L'\\') + break; + } + return false; +} + extern "C" int rename (const char *oldpath, const char *newpath) { @@ -1841,9 +1865,8 @@ rename (const char *oldpath, const char *newpath) &ro_u_lnk, TRUE)) rename_append_suffix (newpc, newpath, nlen, ".lnk"); else if (oldpc.is_binary () && !old_explicit_suffix - && !RtlEqualUnicodePathSuffix (newpc.get_nt_native_path (), - &ro_u_exe, TRUE)) - /* To rename an executable foo.exe to bar-without-exe-suffix, the + && !nt_path_has_suffix (newpc.get_nt_native_path ())) + /* To rename an executable foo.exe to bar-without-suffix, the .exe suffix must be given explicitly in oldpath. */ rename_append_suffix (newpc, newpath, nlen, ".exe"); } @@ -1872,8 +1895,8 @@ rename (const char *oldpath, const char *newpath) } else if (oldpc.is_binary ()) { - if (!RtlEqualUnicodePathSuffix (newpc.get_nt_native_path (), - &ro_u_exe, TRUE)) + /* Never append .exe suffix if file has any suffix already. */ + if (!nt_path_has_suffix (newpc.get_nt_native_path ())) { rename_append_suffix (new2pc, newpath, nlen, ".exe"); removepc = &newpc; -- 2.43.5