[patch 5 of 7]: 0005-Rewrite-of-getcwd-and-wgetcwd.txt
Kai Tietz
ktietz70 at googlemail.com
Thu Dec 29 10:09:05 CST 2011
Hi,
this patch suggests a rewritte of getcwd and wgetcwd. It adds locking
and additionally handles some unhandled error-cases.
Regards,
Kai
-------------- next part --------------
From ad8cbdc795d9dfa31938cd9c0ee288c6eaf1af7d Mon Sep 17 00:00:00 2001
From: Kai Tietz <ktietz70 at googlemail.com>
Date: Thu, 29 Dec 2011 15:52:34 +0100
Subject: Rewrite of getcwd and wgetcwd
---
dlls/msvcrt/dir.c | 162 ++++++++++++++++++++++++++++++++++++++---------------
1 files changed, 117 insertions(+), 45 deletions(-)
diff --git a/dlls/msvcrt/dir.c b/dlls/msvcrt/dir.c
index 3bd342f..833d9d7 100644
--- a/dlls/msvcrt/dir.c
+++ b/dlls/msvcrt/dir.c
@@ -890,24 +890,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 && 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)
+ {
+ msvcrt_set_errno (GetLastError ());
+ _unlock (_ENV_LOCK);
+ return NULL;
+ }
- if (!buf)
+ if (buf != NULL)
+ {
+ if (l < i)
+ {
+ _unlock (_ENV_LOCK);
+ return buf;
+ }
+
+ *MSVCRT__errno() = MSVCRT_ERANGE;
+ *buf = 0;
+ _unlock (_ENV_LOCK);
+ return NULL;
+ }
+
+ if (l > size)
+ size = l;
+
+ if ((p = (char *) MSVCRT_malloc (size)) == NULL)
{
- if (size <= dir_len) size = dir_len + 1;
- if (!(buf = MSVCRT_malloc( size ))) return NULL;
+ msvcrt_set_errno (ERROR_NOT_ENOUGH_MEMORY);
+ _unlock (_ENV_LOCK);
+ return NULL;
}
- else if (dir_len >= size)
+ memset (p, 0, size);
+ l = GetFullPathNameA (s, size, p, &fname);
+ if (!l || l >= size)
{
- *MSVCRT__errno() = MSVCRT_ERANGE;
- return NULL; /* buf too small */
+ msvcrt_set_errno (GetLastError ());
+ _unlock (_ENV_LOCK);
+ return NULL;
}
- strcpy(buf,dir);
- return buf;
+ _unlock (_ENV_LOCK);
+ return p;
}
/*********************************************************************
@@ -917,45 +961,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);
-
- if (dir_len < 1)
- return NULL; /* FIXME: Real return value untested */
+ MSVCRT_wchar_t s[4], *p, *fname;
+ int i, l, drv;
- 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)
+ {
+ s[0] = '.';
+ s[1] = 0;
+ }
+ else
{
- if (size <= dir_len) size = dir_len + 1;
- if (!(buf = MSVCRT_malloc( size * sizeof(WCHAR) ))) return NULL;
+ s[0] = 'A' + drv - 1;
+ s[1] = ':';
+ s[2] = '.';
+ s[3] = 0;
}
- if (dir_len >= size)
+ if ((l = GetFullPathNameW (s, i, buf, &fname)) == 0)
{
- *MSVCRT__errno() = MSVCRT_ERANGE;
- return NULL; /* buf too small */
+ msvcrt_set_errno (GetLastError ());
+ _unlock (_ENV_LOCK);
+ return NULL;
}
+ if (buf != NULL)
+ {
+ if (l < i)
+ {
+ _unlock (_ENV_LOCK);
+ return buf;
+ }
+
+ *MSVCRT__errno() = MSVCRT_ERANGE;
+ *buf = 0;
+ _unlock (_ENV_LOCK);
+ return NULL;
+ }
+
+ 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.5.1
More information about the wine-patches
mailing list