summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/ChangeLog6
-rw-r--r--winsup/cygwin/syscalls.cc33
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,5 +1,11 @@
2009-11-05 Corinna Vinschen <corinna@vinschen.de>
+ * 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 <corinna@vinschen.de>
+
* spawn.cc (dll_suffixes): Disable. Explain why.
(perhaps_suffix): Use stat_suffixes instead of dll_suffixes.
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;