Nikolay Sivov : scrrun: Fix invalid read/write access to path buffer ( Valgrind).

Alexandre Julliard julliard at winehq.org
Mon May 5 15:03:26 CDT 2014


Module: wine
Branch: master
Commit: 8595d70203c207e75403fb6e7c55d5e18d852456
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8595d70203c207e75403fb6e7c55d5e18d852456

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon May  5 13:58:25 2014 +0400

scrrun: Fix invalid read/write access to path buffer (Valgrind).

---

 dlls/scrrun/filesystem.c       |    3 ---
 dlls/scrrun/tests/filesystem.c |   55 +++++++++++++++++++++++++---------------
 2 files changed, 34 insertions(+), 24 deletions(-)

diff --git a/dlls/scrrun/filesystem.c b/dlls/scrrun/filesystem.c
index b2a1a35..aead0d2 100644
--- a/dlls/scrrun/filesystem.c
+++ b/dlls/scrrun/filesystem.c
@@ -2721,9 +2721,6 @@ static HRESULT create_file(BSTR path, IFile **file)
         return E_FAIL;
     }
 
-    if(path[len-1]=='/' || path[len-1]=='\\')
-        path[len-1] = 0;
-
     attrs = GetFileAttributesW(f->path);
     if(attrs==INVALID_FILE_ATTRIBUTES ||
             (attrs&(FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_DEVICE))) {
diff --git a/dlls/scrrun/tests/filesystem.c b/dlls/scrrun/tests/filesystem.c
index c258a0f..409cf4b 100644
--- a/dlls/scrrun/tests/filesystem.c
+++ b/dlls/scrrun/tests/filesystem.c
@@ -45,6 +45,15 @@ static const WCHAR crlfW[] = {'\r','\n',0};
 #define GET_REFCOUNT(iface) \
     get_refcount((IUnknown*)iface)
 
+static inline void get_temp_path(const WCHAR *prefix, WCHAR *path)
+{
+    WCHAR buffW[MAX_PATH];
+
+    GetTempPathW(MAX_PATH, buffW);
+    GetTempFileNameW(buffW, prefix, 0, path);
+    DeleteFileW(path);
+}
+
 static void test_interfaces(void)
 {
     static const WCHAR nonexistent_dirW[] = {
@@ -129,15 +138,13 @@ static void test_interfaces(void)
 
 static void test_createfolder(void)
 {
-    WCHAR pathW[MAX_PATH], buffW[MAX_PATH];
+    WCHAR buffW[MAX_PATH];
     HRESULT hr;
     BSTR path;
     IFolder *folder;
     BOOL ret;
 
-    GetTempPathW(MAX_PATH, pathW);
-    GetTempFileNameW(pathW, NULL, 0, buffW);
-    DeleteFileW(buffW);
+    get_temp_path(NULL, buffW);
     ret = CreateDirectoryW(buffW, NULL);
     ok(ret, "got %d, %d\n", ret, GetLastError());
 
@@ -528,33 +535,31 @@ static void test_GetAbsolutePathName(void)
 
 static void test_GetFile(void)
 {
-    static const WCHAR get_file[] = {'g','e','t','_','f','i','l','e','.','t','s','t',0};
-
-    BSTR path = SysAllocString(get_file);
+    static const WCHAR slW[] = {'\\',0};
+    BSTR path;
+    WCHAR pathW[MAX_PATH];
     FileAttribute fa;
     VARIANT size;
     DWORD gfa;
     IFile *file;
     HRESULT hr;
     HANDLE hf;
+    BOOL ret;
 
+    get_temp_path(NULL, pathW);
+
+    path = SysAllocString(pathW);
     hr = IFileSystem3_GetFile(fs3, path, NULL);
     ok(hr == E_POINTER, "GetFile returned %x, expected E_POINTER\n", hr);
     hr = IFileSystem3_GetFile(fs3, NULL, &file);
     ok(hr == E_INVALIDARG, "GetFile returned %x, expected E_INVALIDARG\n", hr);
 
-    if(GetFileAttributesW(path) != INVALID_FILE_ATTRIBUTES) {
-        skip("File already exists, skipping GetFile tests\n");
-        SysFreeString(path);
-        return;
-    }
-
     file = (IFile*)0xdeadbeef;
     hr = IFileSystem3_GetFile(fs3, path, &file);
     ok(!file, "file != NULL\n");
     ok(hr == CTL_E_FILENOTFOUND, "GetFile returned %x, expected CTL_E_FILENOTFOUND\n", hr);
 
-    hf = CreateFileW(path, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_READONLY, NULL);
+    hf = CreateFileW(pathW, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_READONLY, NULL);
     if(hf == INVALID_HANDLE_VALUE) {
         skip("Can't create temporary file\n");
         SysFreeString(path);
@@ -566,7 +571,7 @@ static void test_GetFile(void)
     ok(hr == S_OK, "GetFile returned %x, expected S_OK\n", hr);
 
     hr = IFile_get_Attributes(file, &fa);
-    gfa = GetFileAttributesW(get_file) & (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN |
+    gfa = GetFileAttributesW(pathW) & (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN |
             FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_ARCHIVE |
             FILE_ATTRIBUTE_REPARSE_POINT | FILE_ATTRIBUTE_COMPRESSED);
     ok(hr == S_OK, "get_Attributes returned %x, expected S_OK\n", hr);
@@ -589,6 +594,18 @@ static void test_GetFile(void)
     ok(hr == CTL_E_FILENOTFOUND, "DeleteFile returned %x, expected CTL_E_FILENOTFOUND\n", hr);
 
     SysFreeString(path);
+
+    /* try with directory */
+    lstrcatW(pathW, slW);
+    ret = CreateDirectoryW(pathW, NULL);
+    ok(ret, "got %d, error %d\n", ret, GetLastError());
+
+    path = SysAllocString(pathW);
+    hr = IFileSystem3_GetFile(fs3, path, &file);
+    ok(hr == CTL_E_FILENOTFOUND, "GetFile returned %x, expected S_OK\n", hr);
+    SysFreeString(path);
+
+    RemoveDirectoryW(pathW);
 }
 
 static inline BOOL create_file(const WCHAR *name)
@@ -858,9 +875,7 @@ static void test_FolderCollection(void)
     BSTR str;
     int found_a = 0, found_b = 0, found_c = 0;
 
-    GetTempPathW(MAX_PATH, pathW);
-    GetTempFileNameW(pathW, fooW, 0, buffW);
-    DeleteFileW(buffW);
+    get_temp_path(fooW, buffW);
     CreateDirectoryW(buffW, NULL);
 
     str = SysAllocString(buffW);
@@ -1042,9 +1057,7 @@ static void test_FileCollection(void)
     HANDLE file_a, file_b, file_c;
     int found_a = 0, found_b = 0, found_c = 0;
 
-    GetTempPathW(MAX_PATH, pathW);
-    GetTempFileNameW(pathW, fooW, 0, buffW);
-    DeleteFileW(buffW);
+    get_temp_path(fooW, buffW);
     CreateDirectoryW(buffW, NULL);
 
     str = SysAllocString(buffW);




More information about the wine-cvs mailing list