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