[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