OSDN Git Service

* spawn.cc (spawn_guts): Remove long path prefix from win32 path
authorcorinna <corinna>
Tue, 22 Jul 2008 16:59:58 +0000 (16:59 +0000)
committercorinna <corinna>
Tue, 22 Jul 2008 16:59:58 +0000 (16:59 +0000)
before calling CreateProcess if path length is < MAX_PATH.

winsup/cygwin/ChangeLog
winsup/cygwin/spawn.cc

index c703056..ad31bd2 100644 (file)
@@ -1,5 +1,10 @@
 2008-07-22  Corinna Vinschen  <corinna@vinschen.de>
 
+       * spawn.cc (spawn_guts): Remove long path prefix from win32 path
+       before calling CreateProcess if path length is < MAX_PATH.
+
+2008-07-22  Corinna Vinschen  <corinna@vinschen.de>
+
        * include/ctype.h: Declare __ctype_ptr__ to keep newlib build happy.
 
 2008-07-21  Corinna Vinschen  <corinna@vinschen.de>
index f90ffbc..0a94282 100644 (file)
@@ -472,6 +472,20 @@ spawn_guts (const char *prog_arg, const char *const *argv,
     }
 
   runpath = null_app_name ? NULL : real_path.get_wide_win32_path (runpath);
+  { /* If the executable path length is < MAX_PATH, make sure the long path
+       win32 prefix is removed from the path to make subsequent native Win32
+       child processes happy which are not long path aware. */
+    USHORT len = real_path.get_nt_native_path ()->Length;
+    if (len < (MAX_PATH + 4) * sizeof (WCHAR)
+       || (runpath[5] != L':'                          /* UNC path */
+           && len < (MAX_PATH + 6) * sizeof (WCHAR)))
+      {
+        PWCHAR r = runpath + 4;
+       if (r[1] != L':') /* UNC path */
+         r += 2;
+       runpath = r;
+      }
+  }
 
   syscall_printf ("null_app_name %d (%W, %.9500W)", null_app_name,
                  runpath, wone_line);