From: Piotr Caban piotr@codeweavers.com
--- dlls/msvcrt/dir.c | 49 +++++++++++++------------------------- dlls/ucrtbase/tests/file.c | 6 +++++ 2 files changed, 22 insertions(+), 33 deletions(-)
diff --git a/dlls/msvcrt/dir.c b/dlls/msvcrt/dir.c index b878a5ab1a9..ff26a0ce2b8 100644 --- a/dlls/msvcrt/dir.c +++ b/dlls/msvcrt/dir.c @@ -1296,43 +1296,26 @@ wchar_t * CDECL _wfullpath(wchar_t * absPath, const wchar_t* relPath, size_t siz * Otherwise populates absPath with the path and returns it. * Failure: NULL. errno indicates the error. */ -char * CDECL _fullpath(char * absPath, const char* relPath, size_t size) +char * CDECL _fullpath(char *abs_path, const char *rel_path, size_t size) { - DWORD rc; - char* lastpart; - char* buffer; - BOOL alloced = FALSE; - - if (!relPath || !*relPath) - return _getcwd(absPath, size); - - if (absPath == NULL) - { - buffer = malloc(MAX_PATH); - size = MAX_PATH; - alloced = TRUE; - } - else - buffer = absPath; - - if (size < 4) - { - *_errno() = ERANGE; - return NULL; - } - - TRACE(":resolving relative path '%s'\n",relPath); + wchar_t abs_pathW[MAX_PATH], *rel_pathW = NULL, *retW; + size_t len;
- rc = GetFullPathNameA(relPath,size,buffer,&lastpart); + if (rel_path && !(rel_pathW = wstrdupa_utf8(rel_path))) return NULL; + retW = _wfullpath(abs_pathW, rel_pathW, ARRAY_SIZE(abs_pathW)); + free(rel_pathW); + if (!retW) return NULL;
- if (rc > 0 && rc <= size) - return buffer; - else - { - if (alloced) - free(buffer); + if (!abs_path) return astrdupw_utf8(abs_pathW); + len = convert_wcs_to_acp_utf8(abs_pathW, NULL, 0); + if (!len) return NULL; + if (len > size) + { + *_errno() = ERANGE; return NULL; - } + } + convert_wcs_to_acp_utf8(abs_pathW, abs_path, size); + return abs_path; }
/********************************************************************* diff --git a/dlls/ucrtbase/tests/file.c b/dlls/ucrtbase/tests/file.c index 620745be1ef..a81f23a549d 100644 --- a/dlls/ucrtbase/tests/file.c +++ b/dlls/ucrtbase/tests/file.c @@ -255,6 +255,12 @@ static void test_utf8(void) ok(!!p, "strrchr returned NULL, buf = %s\n", debugstr_a(buf)); ok(!strcmp(p + 1, dir), "unexpected working directory: %s\n", debugstr_a(buf));
+ p = _fullpath(buf, NULL, sizeof(buf)); + ok(p == buf, "_fulpath returned %p, errno %d\n", p, errno); + p = strrchr(p, '\'); + ok(!!p, "strrchr returned NULL, buf = %s\n", debugstr_a(buf)); + ok(!strcmp(p + 1, dir), "unexpected working directory: %s\n", debugstr_a(buf)); + ret = _chdir(".."); ok(!ret, "_chdir returned %d, error %d\n", ret, errno);