OSDN Git Service

* ntdll.h (RtlAcquirePebLock): Declare.
authorcorinna <corinna>
Thu, 16 Aug 2007 14:30:53 +0000 (14:30 +0000)
committercorinna <corinna>
Thu, 16 Aug 2007 14:30:53 +0000 (14:30 +0000)
(RtlReleasePebLock): Declare.
* path.cc (cwdstuff::set): Change PEB only while it's locked.

winsup/cygwin/ChangeLog
winsup/cygwin/ntdll.h
winsup/cygwin/path.cc

index bc701fd..9f36db5 100644 (file)
@@ -1,5 +1,11 @@
 2007-08-16  Corinna Vinschen  <corinna@vinschen.de>
 
+       * ntdll.h (RtlAcquirePebLock): Declare.
+       (RtlReleasePebLock): Declare.
+       * path.cc (cwdstuff::set): Change PEB only while it's locked.
+
+2007-08-16  Corinna Vinschen  <corinna@vinschen.de>
+
        * fhandler.h (fhandler_base::get_namehash): Use NT native path.
        * fhandler_disk_file.cc (readdir_get_ino): Ditto in call to
        hash_path_name.
index 7b8c556..ff9f955 100644 (file)
@@ -827,6 +827,7 @@ extern "C"
   NTSTATUS NTAPI RtlAppendUnicodeToString (PUNICODE_STRING, PCWSTR);
   NTSTATUS NTAPI RtlAppendUnicodeStringToString (PUNICODE_STRING,
                                                 PUNICODE_STRING);
+  VOID NTAPI RtlAcquirePebLock ();
   NTSTATUS NTAPI RtlAnsiStringToUnicodeString (PUNICODE_STRING, PANSI_STRING,
                                               BOOLEAN);
   LONG NTAPI RtlCompareUnicodeString (PUNICODE_STRING, PUNICODE_STRING,
@@ -848,6 +849,7 @@ extern "C"
                                               BOOLEAN);
   BOOLEAN NTAPI RtlPrefixUnicodeString (PUNICODE_STRING, PUNICODE_STRING,
                                        BOOLEAN);
+  VOID NTAPI RtlReleasePebLock ();
   VOID NTAPI RtlSecondsSince1970ToTime (ULONG, PLARGE_INTEGER);
   NTSTATUS NTAPI RtlUnicodeStringToAnsiString (PANSI_STRING, PUNICODE_STRING,
                                               BOOLEAN);
index 5a0bc90..a8b64da 100644 (file)
@@ -4329,6 +4329,7 @@ cwdstuff::set (const char *win32_cwd, const char *posix_cwd, bool doit)
              strcpy (as.Buffer + len, "\\");
              ++as.Length;
            }
+         RtlAcquirePebLock ();
          if (current_codepage == ansi_cp)
            RtlAnsiStringToUnicodeString (
                        &get_user_proc_parms ()->CurrentDirectoryName,
@@ -4339,11 +4340,9 @@ cwdstuff::set (const char *win32_cwd, const char *posix_cwd, bool doit)
                        &as, FALSE);
          PHANDLE phdl = &get_user_proc_parms ()->CurrentDirectoryHandle;
          if (*phdl)
-           {
-             HANDLE old_h = *phdl;
-             *phdl = h;
-             CloseHandle (old_h);
-           }
+           CloseHandle (*phdl);
+         *phdl = h;
+         RtlReleasePebLock ();
        }
     }
   /* If there is no win32 path or it has the form c:xxx, get the value */