Piotr Caban : msvcrt: Return error in stat function when path is specified with trailing slash character .
Alexandre Julliard
julliard at winehq.org
Thu Dec 27 13:02:29 CST 2012
Module: wine
Branch: master
Commit: bcf4467b86921b006d7782a1e52db3b232dcda4d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bcf4467b86921b006d7782a1e52db3b232dcda4d
Author: Piotr Caban <piotr at codeweavers.com>
Date: Thu Dec 27 12:03:51 2012 +0100
msvcrt: Return error in stat function when path is specified with trailing slash character.
---
dlls/msvcrt/file.c | 34 ++++++++++++++++++++++++----------
dlls/msvcrt/tests/file.c | 24 ++++++++++++++++++++++++
2 files changed, 48 insertions(+), 10 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index 9d75bc6..2db13f8 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -2159,10 +2159,20 @@ int CDECL MSVCRT_stat64(const char* path, struct MSVCRT__stat64 * buf)
TRACE(":file (%s) buf(%p)\n",path,buf);
+ plen = strlen(path);
+ while (plen && path[plen-1]==' ')
+ plen--;
+
+ if (plen && (path[plen-1]=='\\' || path[plen-1]=='/'))
+ {
+ *MSVCRT__errno() = MSVCRT_ENOENT;
+ return -1;
+ }
+
if (!GetFileAttributesExA(path, GetFileExInfoStandard, &hfi))
{
TRACE("failed (%d)\n",GetLastError());
- msvcrt_set_errno(ERROR_FILE_NOT_FOUND);
+ *MSVCRT__errno() = MSVCRT_ENOENT;
return -1;
}
@@ -2178,11 +2188,8 @@ int CDECL MSVCRT_stat64(const char* path, struct MSVCRT__stat64 * buf)
else
buf->st_dev = buf->st_rdev = MSVCRT__getdrive() - 1;
- plen = strlen(path);
-
/* Dir, or regular file? */
- if ((hfi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ||
- (path[plen-1] == '\\'))
+ if (hfi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
mode |= (MSVCRT__S_IFDIR | ALL_S_IEXEC);
else
{
@@ -2252,10 +2259,20 @@ int CDECL MSVCRT__wstat64(const MSVCRT_wchar_t* path, struct MSVCRT__stat64 * bu
TRACE(":file (%s) buf(%p)\n",debugstr_w(path),buf);
+ plen = strlenW(path);
+ while (plen && path[plen-1]==' ')
+ plen--;
+
+ if(plen && (path[plen-1]=='\\' || path[plen-1]=='/'))
+ {
+ *MSVCRT__errno() = MSVCRT_ENOENT;
+ return -1;
+ }
+
if (!GetFileAttributesExW(path, GetFileExInfoStandard, &hfi))
{
TRACE("failed (%d)\n",GetLastError());
- msvcrt_set_errno(ERROR_FILE_NOT_FOUND);
+ *MSVCRT__errno() = MSVCRT_ENOENT;
return -1;
}
@@ -2267,11 +2284,8 @@ int CDECL MSVCRT__wstat64(const MSVCRT_wchar_t* path, struct MSVCRT__stat64 * bu
else
buf->st_dev = buf->st_rdev = MSVCRT__getdrive() - 1;
- plen = strlenW(path);
-
/* Dir, or regular file? */
- if ((hfi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ||
- (path[plen-1] == '\\'))
+ if (hfi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
mode |= (MSVCRT__S_IFDIR | ALL_S_IEXEC);
else
{
diff --git a/dlls/msvcrt/tests/file.c b/dlls/msvcrt/tests/file.c
index e450b72..0078c2a 100644
--- a/dlls/msvcrt/tests/file.c
+++ b/dlls/msvcrt/tests/file.c
@@ -1444,6 +1444,11 @@ static void test_stat(void)
ok(buf.st_nlink == 1, "st_nlink is %d, expected 1\n", buf.st_nlink);
ok(buf.st_size == 0, "st_size is %d, expected 0\n", buf.st_size);
+ errno = 0xdeadbeef;
+ ret = stat("stat.tst\\", &buf);
+ ok(ret == -1, "stat returned %d\n", ret);
+ ok(errno == ENOENT, "errno = %d\n", errno);
+
close(fd);
remove("stat.tst");
}
@@ -1483,6 +1488,25 @@ static void test_stat(void)
}
else
skip("pipe failed with errno %d\n", errno);
+
+ /* Tests for directory */
+ if(mkdir("stat.tst") == 0)
+ {
+ ret = stat("stat.tst ", &buf);
+ ok(!ret, "stat(directory) failed: errno=%d\n", errno);
+ ok((buf.st_mode & _S_IFMT) == _S_IFDIR, "bad format = %06o\n", buf.st_mode);
+ ok((buf.st_mode & 0777) == 0777, "bad st_mode = %06o\n", buf.st_mode);
+ ok(buf.st_dev == buf.st_rdev, "st_dev (%d) and st_rdev (%d) differ\n", buf.st_dev, buf.st_rdev);
+ ok(buf.st_nlink == 1, "st_nlink is %d, expected 1\n", buf.st_nlink);
+
+ errno = 0xdeadbeef;
+ ret = stat("stat.tst\\ ", &buf);
+ ok(ret == -1, "stat returned %d\n", ret);
+ ok(errno == ENOENT, "errno = %d\n", errno);
+ rmdir( "stat.tst" );
+ }
+ else
+ skip("mkdir failed with errno %d\n", errno);
}
static const char* pipe_string="Hello world";
More information about the wine-cvs
mailing list