Module: wine Branch: master Commit: 7a4225c68f6d3029dc6f81afeeeb25bc5f55520b URL: http://source.winehq.org/git/wine.git/?a=commit;h=7a4225c68f6d3029dc6f81afee...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Sat Nov 10 13:36:12 2012 -0500
scrrun: Block stream reading calls if it's not in ForReading mode.
---
dlls/scrrun/filesystem.c | 32 ++++++++++- dlls/scrrun/tests/filesystem.c | 119 +++++++++++++++++++++++++++++++++------- 2 files changed, 129 insertions(+), 22 deletions(-)
diff --git a/dlls/scrrun/filesystem.c b/dlls/scrrun/filesystem.c index cd94c43..8fafc7c 100644 --- a/dlls/scrrun/filesystem.c +++ b/dlls/scrrun/filesystem.c @@ -41,6 +41,13 @@ struct folder { struct textstream { ITextStream ITextStream_iface; LONG ref; + + IOMode mode; +}; + +enum iotype { + IORead, + IOWrite };
static inline struct folder *impl_from_IFolder(IFolder *iface) @@ -53,6 +60,14 @@ static inline struct textstream *impl_from_ITextStream(ITextStream *iface) return CONTAINING_RECORD(iface, struct textstream, ITextStream_iface); }
+static int textstream_check_iomode(struct textstream *This, enum iotype type) +{ + if (type == IORead) + return This->mode == ForWriting || This->mode == ForAppending; + else + return 1; +} + static HRESULT WINAPI textstream_QueryInterface(ITextStream *iface, REFIID riid, void **obj) { struct textstream *This = impl_from_ITextStream(iface); @@ -183,6 +198,10 @@ static HRESULT WINAPI textstream_Read(ITextStream *iface, LONG len, BSTR *text) { struct textstream *This = impl_from_ITextStream(iface); FIXME("(%p)->(%p): stub\n", This, text); + + if (textstream_check_iomode(This, IORead)) + return CTL_E_BADFILEMODE; + return E_NOTIMPL; }
@@ -190,6 +209,10 @@ static HRESULT WINAPI textstream_ReadLine(ITextStream *iface, BSTR *text) { struct textstream *This = impl_from_ITextStream(iface); FIXME("(%p)->(%p): stub\n", This, text); + + if (textstream_check_iomode(This, IORead)) + return CTL_E_BADFILEMODE; + return E_NOTIMPL; }
@@ -197,6 +220,10 @@ static HRESULT WINAPI textstream_ReadAll(ITextStream *iface, BSTR *text) { struct textstream *This = impl_from_ITextStream(iface); FIXME("(%p)->(%p): stub\n", This, text); + + if (textstream_check_iomode(This, IORead)) + return CTL_E_BADFILEMODE; + return E_NOTIMPL; }
@@ -265,7 +292,7 @@ static const ITextStreamVtbl textstreamvtbl = { textstream_Close };
-static HRESULT create_textstream(ITextStream **ret) +static HRESULT create_textstream(IOMode mode, ITextStream **ret) { struct textstream *stream;
@@ -274,6 +301,7 @@ static HRESULT create_textstream(ITextStream **ret)
stream->ITextStream_iface.lpVtbl = &textstreamvtbl; stream->ref = 1; + stream->mode = mode;
*ret = &stream->ITextStream_iface; return S_OK; @@ -892,7 +920,7 @@ static HRESULT WINAPI filesys_OpenTextFile(IFileSystem3 *iface, BSTR filename, Tristate format, ITextStream **stream) { FIXME("(%p)->(%s %d %d %d %p)\n", iface, debugstr_w(filename), mode, create, format, stream); - return create_textstream(stream); + return create_textstream(mode, stream); }
static HRESULT WINAPI filesys_GetStandardStream(IFileSystem3 *iface, diff --git a/dlls/scrrun/tests/filesystem.c b/dlls/scrrun/tests/filesystem.c index d6c596c..e0c8684 100644 --- a/dlls/scrrun/tests/filesystem.c +++ b/dlls/scrrun/tests/filesystem.c @@ -31,6 +31,8 @@ #include "initguid.h" #include "scrrun.h"
+static IFileSystem3 *fs3; + static void test_interfaces(void) { static const WCHAR nonexistent_dirW[] = { @@ -41,27 +43,18 @@ static void test_interfaces(void) HRESULT hr; IDispatch *disp; IDispatchEx *dispex; - IFileSystem3 *fs3; IObjectWithSite *site; VARIANT_BOOL b; BSTR path; WCHAR windows_path[MAX_PATH]; WCHAR file_path[MAX_PATH];
- hr = CoCreateInstance(&CLSID_FileSystemObject, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, - &IID_IDispatch, (void**)&disp); - if(FAILED(hr)) { - win_skip("Could not create FileSystem object: %08x\n", hr); - return; - } + IFileSystem3_QueryInterface(fs3, &IID_IDispatch, (void**)&disp);
GetSystemDirectoryW(windows_path, MAX_PATH); lstrcpyW(file_path, windows_path); lstrcatW(file_path, file_kernel32W);
- hr = IDispatch_QueryInterface(disp, &IID_IFileSystem3, (void**)&fs3); - ok(hr == S_OK, "got 0x%08x, expected 0x%08x\n", hr, S_OK); - hr = IDispatch_QueryInterface(disp, &IID_IObjectWithSite, (void**)&site); ok(hr == E_NOINTERFACE, "got 0x%08x, expected 0x%08x\n", hr, E_NOINTERFACE);
@@ -119,25 +112,16 @@ static void test_interfaces(void) ok(b == VARIANT_FALSE, "Folder exists\n"); SysFreeString(path);
- IFileSystem3_Release(fs3); IDispatch_Release(disp); }
static void test_createfolder(void) { - IFileSystem3 *fs3; HRESULT hr; WCHAR pathW[MAX_PATH]; BSTR path; IFolder *folder;
- hr = CoCreateInstance(&CLSID_FileSystemObject, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, - &IID_IFileSystem3, (void**)&fs3); - if(FAILED(hr)) { - win_skip("Could not create FileSystem object: %08x\n", hr); - return; - } - /* create existing directory */ GetCurrentDirectoryW(sizeof(pathW)/sizeof(WCHAR), pathW); path = SysAllocString(pathW); @@ -146,16 +130,111 @@ static void test_createfolder(void) ok(hr == CTL_E_FILEALREADYEXISTS, "got 0x%08x\n", hr); ok(folder == NULL, "got %p\n", folder); SysFreeString(path); +}
- IFileSystem3_Release(fs3); +static void test_textstream(void) +{ + static WCHAR testfileW[] = {'t','e','s','t','f','i','l','e','.','t','x','t',0}; + ITextStream *stream; + VARIANT_BOOL b; + HANDLE file; + HRESULT hr; + BSTR name, data; + + file = CreateFileW(testfileW, GENERIC_READ, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + CloseHandle(file); + + name = SysAllocString(testfileW); + b = VARIANT_FALSE; + hr = IFileSystem3_FileExists(fs3, name, &b); + ok(hr == S_OK, "got 0x%08x, expected 0x%08x\n", hr, S_OK); + ok(b == VARIANT_TRUE, "got %x\n", b); + + hr = IFileSystem3_OpenTextFile(fs3, name, ForReading, VARIANT_FALSE, TristateFalse, &stream); + ok(hr == S_OK, "got 0x%08x\n", hr); + + b = 10; + hr = ITextStream_get_AtEndOfStream(stream, &b); +todo_wine { + ok(hr == S_FALSE || broken(hr == S_OK), "got 0x%08x\n", hr); + ok(b == VARIANT_TRUE, "got 0x%x\n", b); +} + ITextStream_Release(stream); + + hr = IFileSystem3_OpenTextFile(fs3, name, ForWriting, VARIANT_FALSE, TristateFalse, &stream); + ok(hr == S_OK, "got 0x%08x\n", hr); + + b = 10; + hr = ITextStream_get_AtEndOfStream(stream, &b); +todo_wine { + ok(hr == CTL_E_BADFILEMODE, "got 0x%08x\n", hr); + ok(b == VARIANT_TRUE || broken(b == 10), "got 0x%x\n", b); +} + b = 10; + hr = ITextStream_get_AtEndOfLine(stream, &b); +todo_wine { + ok(hr == CTL_E_BADFILEMODE, "got 0x%08x\n", hr); + ok(b == VARIANT_FALSE || broken(b == 10), "got 0x%x\n", b); +} + hr = ITextStream_Read(stream, 1, &data); + ok(hr == CTL_E_BADFILEMODE, "got 0x%08x\n", hr); + + hr = ITextStream_ReadLine(stream, &data); + ok(hr == CTL_E_BADFILEMODE, "got 0x%08x\n", hr); + + hr = ITextStream_ReadAll(stream, &data); + ok(hr == CTL_E_BADFILEMODE, "got 0x%08x\n", hr); + + ITextStream_Release(stream); + + hr = IFileSystem3_OpenTextFile(fs3, name, ForAppending, VARIANT_FALSE, TristateFalse, &stream); + ok(hr == S_OK, "got 0x%08x\n", hr); + SysFreeString(name); + + b = 10; + hr = ITextStream_get_AtEndOfStream(stream, &b); +todo_wine { + ok(hr == CTL_E_BADFILEMODE, "got 0x%08x\n", hr); + ok(b == VARIANT_TRUE || broken(b == 10), "got 0x%x\n", b); +} + b = 10; + hr = ITextStream_get_AtEndOfLine(stream, &b); +todo_wine { + ok(hr == CTL_E_BADFILEMODE, "got 0x%08x\n", hr); + ok(b == VARIANT_FALSE || broken(b == 10), "got 0x%x\n", b); +} + hr = ITextStream_Read(stream, 1, &data); + ok(hr == CTL_E_BADFILEMODE, "got 0x%08x\n", hr); + + hr = ITextStream_ReadLine(stream, &data); + ok(hr == CTL_E_BADFILEMODE, "got 0x%08x\n", hr); + + hr = ITextStream_ReadAll(stream, &data); + ok(hr == CTL_E_BADFILEMODE, "got 0x%08x\n", hr); + + ITextStream_Release(stream); + + DeleteFileW(testfileW); }
START_TEST(filesystem) { + HRESULT hr; + CoInitialize(NULL);
+ hr = CoCreateInstance(&CLSID_FileSystemObject, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, + &IID_IFileSystem3, (void**)&fs3); + if(FAILED(hr)) { + win_skip("Could not create FileSystem object: %08x\n", hr); + return; + } + test_interfaces(); test_createfolder(); + test_textstream(); + + IFileSystem3_Release(fs3);
CoUninitialize(); }