[PATCH 5/6] msvcrt: Rewrite of getdcwd-functions so that locking is used.
Kai Tietz
ktietz70 at googlemail.com
Thu Aug 8 11:40:43 CDT 2013
Due line wrap of this gmail-thng, I attach the changes.
Sorry,
Kai
-------------- next part --------------
From d529ddc1e426d1971bb8536e3d5fdb2f6175770c Mon Sep 17 00:00:00 2001
From: Kai Tietz <ktietz70 at googlemail.com>
Date: Thu, 29 Dec 2011 16:10:31 +0100
Subject: [PATCH 6/7] msvcrt: Rewrite of getdcwd-functions so that locking is
used.
---
dlls/msvcrt/dir.c | 165 ++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 125 insertions(+), 40 deletions(-)
diff --git a/dlls/msvcrt/dir.c b/dlls/msvcrt/dir.c
index 274d965..9a97ea2 100644
--- a/dlls/msvcrt/dir.c
+++ b/dlls/msvcrt/dir.c
@@ -1087,39 +1087,80 @@ MSVCRT_wchar_t* CDECL MSVCRT__wgetcwd(MSVCRT_wchar_t * buf, int size)
*/
char* CDECL MSVCRT__getdcwd(int drive, char * buf, int size)
{
- static char* dummy;
+ char drivespec[] = {'A', ':', 0};
+ char s[4], *p, *fname;
+ int i, l;
+
+ if (buf && size <= 0)
+ {
+ *MSVCRT__errno() = MSVCRT_EINVAL;
+ return NULL;
+ }
TRACE(":drive %d(%c), size %d\n",drive, drive + 'A' - 1, size);
if (!drive || drive == MSVCRT__getdrive())
return MSVCRT__getcwd(buf,size); /* current */
- else
+
+ _lock (_ENV_LOCK);
+
+ drivespec[0] += drive - 1;
+ if (GetDriveTypeA(drivespec) < DRIVE_REMOVABLE)
{
- char dir[MAX_PATH];
- char drivespec[] = {'A', ':', 0};
- int dir_len;
+ *MSVCRT___doserrno() = ERROR_INVALID_DRIVE;
+ *MSVCRT__errno() = MSVCRT_EACCES;
+ _unlock (_ENV_LOCK);
+ return NULL;
+ }
- drivespec[0] += drive - 1;
- if (GetDriveTypeA(drivespec) < DRIVE_REMOVABLE)
- {
- *MSVCRT__errno() = MSVCRT_EACCES;
- return NULL;
- }
+ if (buf)
+ {
+ buf[0] = 0;
+ i = size;
+ }
+ strcpy (s, "A:.");
+ s[0] += drive - 1;
+
+ if ((l = GetFullPathNameA (s, i, buf, &fname)) == 0)
+ {
+ msvcrt_set_errno (GetLastError ());
+ _unlock (_ENV_LOCK);
+ return NULL;
+ }
- dir_len = GetFullPathNameA(drivespec,MAX_PATH,dir,&dummy);
- if (dir_len >= size || dir_len < 1)
+ if (buf != NULL)
+ {
+ if (l < i)
{
- *MSVCRT__errno() = MSVCRT_ERANGE;
- return NULL; /* buf too small */
+ _unlock (_ENV_LOCK);
+ return buf;
}
- TRACE(":returning '%s'\n", dir);
- if (!buf)
- return MSVCRT__strdup(dir); /* allocate */
+ *MSVCRT__errno() = MSVCRT_ERANGE;
+ *buf = 0;
+ _unlock (_ENV_LOCK);
+ return NULL;
+ }
+
+ if (l > size)
+ size = l;
- strcpy(buf,dir);
+ 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;
}
- return buf;
+ _unlock (_ENV_LOCK);
+ return p;
}
/*********************************************************************
@@ -1129,38 +1170,82 @@ char* CDECL MSVCRT__getdcwd(int drive, char * buf, int size)
*/
MSVCRT_wchar_t* CDECL MSVCRT__wgetdcwd(int drive, MSVCRT_wchar_t * buf, int size)
{
- static MSVCRT_wchar_t* dummy;
+ char drivespec[] = {'A', ':', 0};
+ MSVCRT_wchar_t s[4], *p, *fname;
+ int i, l;
+
+ if (buf && size <= 0)
+ {
+ *MSVCRT__errno() = MSVCRT_EINVAL;
+ return NULL;
+ }
TRACE(":drive %d(%c), size %d\n",drive, drive + 'A' - 1, size);
if (!drive || drive == MSVCRT__getdrive())
return MSVCRT__wgetcwd(buf,size); /* current */
- else
+
+ _lock (_ENV_LOCK);
+
+ drivespec[0] += drive - 1;
+ if (GetDriveTypeA(drivespec) < DRIVE_REMOVABLE)
{
- MSVCRT_wchar_t dir[MAX_PATH];
- MSVCRT_wchar_t drivespec[4] = {'A', ':', '\\', 0};
- int dir_len;
+ *MSVCRT___doserrno() = ERROR_INVALID_DRIVE;
+ *MSVCRT__errno() = MSVCRT_EACCES;
+ _unlock (_ENV_LOCK);
+ return NULL;
+ }
- drivespec[0] += drive - 1;
- if (GetDriveTypeW(drivespec) < DRIVE_REMOVABLE)
- {
- *MSVCRT__errno() = MSVCRT_EACCES;
- return NULL;
- }
+ if (buf)
+ {
+ buf[0] = 0;
+ i = size;
+ }
+ s[0] = 'A' + drive - 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;
+ }
- dir_len = GetFullPathNameW(drivespec,MAX_PATH,dir,&dummy);
- if (dir_len >= size || dir_len < 1)
+ if (buf != NULL)
+ {
+ if (l < i)
{
- *MSVCRT__errno() = MSVCRT_ERANGE;
- return NULL; /* buf too small */
+ _unlock (_ENV_LOCK);
+ return buf;
}
- TRACE(":returning %s\n", debugstr_w(dir));
- if (!buf)
- return MSVCRT__wcsdup(dir); /* allocate */
- strcpyW(buf,dir);
+ *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;
}
- return buf;
+ _unlock (_ENV_LOCK);
+ return p;
}
/*********************************************************************
--
1.7.9
More information about the wine-patches
mailing list