From: Piotr Caban piotr@codeweavers.com
--- dlls/msvcrt/dir.c | 15 +++++++++++---- dlls/ucrtbase/tests/file.c | 7 +++++++ 2 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/dlls/msvcrt/dir.c b/dlls/msvcrt/dir.c index 587517ab1bb..1ba14308f85 100644 --- a/dlls/msvcrt/dir.c +++ b/dlls/msvcrt/dir.c @@ -1639,6 +1639,7 @@ int CDECL _searchenv_s(const char* file, const char* env, char *buf, size_t coun char *envVal, *penv, *end; char path[MAX_PATH]; size_t path_len, fname_len; + int old_errno, access;
if (!MSVCRT_CHECK_PMT(file != NULL)) return EINVAL; if (!MSVCRT_CHECK_PMT(buf != NULL)) return EINVAL; @@ -1651,10 +1652,13 @@ int CDECL _searchenv_s(const char* file, const char* env, char *buf, size_t coun *buf = '\0';
/* Try CWD first */ - if (GetFileAttributesA( file ) != INVALID_FILE_ATTRIBUTES) + old_errno = *_errno(); + access = _access(file, 0); + *_errno() = old_errno; + if (!access) { - if (GetFullPathNameA( file, count, buf, NULL )) return 0; - msvcrt_set_errno(GetLastError()); + if (!_fullpath(buf, file, count)) + return *_errno(); return 0; }
@@ -1700,7 +1704,10 @@ int CDECL _searchenv_s(const char* file, const char* env, char *buf, size_t coun
memcpy(path + path_len, file, fname_len + 1); TRACE("Checking for file %s\n", path); - if (GetFileAttributesA( path ) != INVALID_FILE_ATTRIBUTES) + old_errno = *_errno(); + access = _access(path, 0); + *_errno() = old_errno; + if (!access) { if (path_len + fname_len + 1 > count) { diff --git a/dlls/ucrtbase/tests/file.c b/dlls/ucrtbase/tests/file.c index 0214015c37a..ad0eb086fbe 100644 --- a/dlls/ucrtbase/tests/file.c +++ b/dlls/ucrtbase/tests/file.c @@ -320,6 +320,13 @@ static void test_utf8(void) ret = remove(file2); ok(!ret, "remove returned %d, errno %d\n", ret, errno);
+ buf[0] = 'x'; + _searchenv(file, "env", buf); + p = strrchr(buf, '\'); + ok(!!p, "buf = %s\n", debugstr_a(buf)); + todo_wine_if(!is_lossless_convertion(file)) + ok(!strcmp(p + 1, file), "buf = %s\n", debugstr_a(buf)); + ret = _wunlink(fileW); todo_wine_if(GetACP() != CP_UTF8) ok(!ret, "_wunlink returned %d, errno %d\n", ret, errno); if (ret)