[PATCH 4/6] msvcrt: Add locking for getcwd and wgetcwd functions.

Kai Tietz ktietz70 at googlemail.com
Thu Aug 8 07:49:29 CDT 2013


Hi,

next ...

Ok for apply?

Kai

>From 3c4fcf6ab535f3d65b6852486f6393771a986aae Mon Sep 17 00:00:00 2001
From: Kai Tietz <ktietz70 at googlemail.com>
Date: Thu, 29 Dec 2011 15:52:34 +0100
Subject: [PATCH 4/6] msvcrt: Add locking for getcwd and wgetcwd functions.

---
 dlls/msvcrt/dir.c |  160 ++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 116 insertions(+), 44 deletions(-)

diff --git a/dlls/msvcrt/dir.c b/dlls/msvcrt/dir.c
index 2249c7f..274d965 100644
--- a/dlls/msvcrt/dir.c
+++ b/dlls/msvcrt/dir.c
@@ -930,24 +930,68 @@ int CDECL MSVCRT__wfindnext64i32(MSVCRT_intptr_t
hand, struct MSVCRT__wfinddata6
  */
 char* CDECL MSVCRT__getcwd(char * buf, int size)
 {
-  char dir[MAX_PATH];
-  int dir_len = GetCurrentDirectoryA(MAX_PATH,dir);
+  char s[4], *p, *fname;
+  int i, l, drv;

-  if (dir_len < 1)
-    return NULL; /* FIXME: Real return value untested */
-
-  if (!buf)
+  if (buf && size <= 0)
+  {
+    *MSVCRT__errno() = MSVCRT_EINVAL;
+    return NULL;
+  }
+  _lock (_ENV_LOCK);
+  if (buf)
+  {
+    buf[0] = 0;
+    i = size;
+  }
+  drv = MSVCRT__getdrive ();
+  if (drv == 0)
+    strcpy (s, ".");
+  else
+  {
+    strcpy (s, "A:.");
+    s[0] += drv - 1;
+  }
+  if ((l = GetFullPathNameA (s, i, buf, &fname)) == 0)
   {
-      if (size <= dir_len) size = dir_len + 1;
-      if (!(buf = MSVCRT_malloc( size ))) return NULL;
+    msvcrt_set_errno (GetLastError ());
+    _unlock (_ENV_LOCK);
+    return NULL;
   }
-  else if (dir_len >= size)
+
+  if (buf != NULL)
   {
+    if (l < i)
+    {
+      _unlock (_ENV_LOCK);
+      return buf;
+    }
+
     *MSVCRT__errno() = MSVCRT_ERANGE;
-    return NULL; /* buf too small */
+    *buf = 0;
+    _unlock (_ENV_LOCK);
+    return NULL;
   }
-  strcpy(buf,dir);
-  return buf;
+
+  if (l > size)
+    size = l;
+
+  if ((p = (char *) MSVCRT_malloc (size)) == NULL)
+  {
+    msvcrt_set_errno (ERROR_NOT_ENOUGH_MEMORY);
+    _unlock (_ENV_LOCK);
+    return NULL;
+  }
+  memset (p, 0, size);
+  l = GetFullPathNameA (s, size, p, &fname);
+  if (!l || l >= size)
+  {
+    msvcrt_set_errno (GetLastError ());
+    _unlock (_ENV_LOCK);
+    return NULL;
+  }
+  _unlock (_ENV_LOCK);
+  return p;
 }

 /*********************************************************************
@@ -957,45 +1001,73 @@ char* CDECL MSVCRT__getcwd(char * buf, int size)
  */
 MSVCRT_wchar_t* CDECL MSVCRT__wgetcwd(MSVCRT_wchar_t * buf, int size)
 {
-  MSVCRT_wchar_t dir[MAX_PATH];
-  int dir_len = GetCurrentDirectoryW(MAX_PATH,dir);
+  MSVCRT_wchar_t s[4], *p, *fname;
+  int i, l, drv;

-  if (dir_len < 1)
-    return NULL; /* FIXME: Real return value untested */
-
-  if (!buf)
+  if (buf && size <= 0)
+  {
+    *MSVCRT__errno() = MSVCRT_EINVAL;
+    return NULL;
+  }
+  _lock (_ENV_LOCK);
+  if (buf)
   {
-      if (size <= dir_len) size = dir_len + 1;
-      if (!(buf = MSVCRT_malloc( size * sizeof(WCHAR) ))) return NULL;
+    buf[0] = 0;
+    i = size;
   }
-  if (dir_len >= size)
+  drv = MSVCRT__getdrive ();
+  if (drv == 0)
   {
+    s[0] = '.';
+    s[1] = 0;
+  }
+  else
+  {
+    s[0] = 'A' + drv - 1;
+    s[1] = ':';
+    s[2] = '.';
+    s[3] = 0;
+  }
+  if ((l = GetFullPathNameW (s, i, buf, &fname)) == 0)
+  {
+    msvcrt_set_errno (GetLastError ());
+    _unlock (_ENV_LOCK);
+    return NULL;
+  }
+
+  if (buf != NULL)
+  {
+    if (l < i)
+    {
+      _unlock (_ENV_LOCK);
+      return buf;
+    }
+
     *MSVCRT__errno() = MSVCRT_ERANGE;
-    return NULL; /* buf too small */
+    *buf = 0;
+    _unlock (_ENV_LOCK);
+    return NULL;
   }
-  strcpyW(buf,dir);
-  return buf;
-}

-/*********************************************************************
- *        _getdrive (MSVCRT.@)
- *
- * Get the current drive number.
- *
- * PARAMS
- *  None.
- *
- * RETURNS
- *  Success: The drive letter number from 1 to 26 ("A:" to "Z:").
- *  Failure: 0.
- */
-int CDECL MSVCRT__getdrive(void)
-{
-    WCHAR buffer[MAX_PATH];
-    if (GetCurrentDirectoryW( MAX_PATH, buffer ) &&
-        buffer[0] >= 'A' && buffer[0] <= 'z' && buffer[1] == ':')
-        return toupperW(buffer[0]) - 'A' + 1;
-    return 0;
+  if (l > size)
+    size = l;
+
+  if ((p = (char *) MSVCRT_malloc (size * sizeof (MSVCRT_wchar_t))) == NULL)
+  {
+    msvcrt_set_errno (ERROR_NOT_ENOUGH_MEMORY);
+    _unlock (_ENV_LOCK);
+    return NULL;
+  }
+  memset (p, 0, size * sizeof (MSVCRT_wchar_t));
+  l = GetFullPathNameW (s, size, p, &fname);
+  if (!l || l >= size)
+  {
+    msvcrt_set_errno (GetLastError ());
+    _unlock (_ENV_LOCK);
+    return NULL;
+  }
+  _unlock (_ENV_LOCK);
+  return p;
 }

 /*********************************************************************
-- 
1.7.9



More information about the wine-patches mailing list