Rob Shearman : ole32: ReadClassStm should return STG_E_READFAULT is not all of the data could be read , not S_FALSE.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Jan 10 05:36:02 CST 2007


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

Author: Rob Shearman <rob at codeweavers.com>
Date:   Tue Jan  9 17:17:52 2007 +0000

ole32: ReadClassStm should return STG_E_READFAULT is not all of the data could be read, not S_FALSE.

Clear pclsid in case of errors.
Add tests for ReadClassStm.

---

 dlls/ole32/storage32.c       |    5 ++++-
 dlls/ole32/tests/storage32.c |   33 +++++++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+), 1 deletions(-)

diff --git a/dlls/ole32/storage32.c b/dlls/ole32/storage32.c
index 450d5cd..c575ce5 100644
--- a/dlls/ole32/storage32.c
+++ b/dlls/ole32/storage32.c
@@ -7930,13 +7930,16 @@ HRESULT WINAPI ReadClassStm(IStream *pSt
     if (!pStm || !pclsid)
         return E_INVALIDARG;
 
+    /* clear the output args */
+    memcpy(pclsid, &CLSID_NULL, sizeof(*pclsid));
+
     res = IStream_Read(pStm,(void*)pclsid,sizeof(CLSID),&nbByte);
 
     if (FAILED(res))
         return res;
 
     if (nbByte != sizeof(CLSID))
-        return S_FALSE;
+        return STG_E_READFAULT;
     else
         return S_OK;
 }
diff --git a/dlls/ole32/tests/storage32.c b/dlls/ole32/tests/storage32.c
index 80b6cb0..663bc30 100644
--- a/dlls/ole32/tests/storage32.c
+++ b/dlls/ole32/tests/storage32.c
@@ -31,6 +31,8 @@
 
 DEFINE_GUID( test_stg_cls, 0x88888888, 0x0425, 0x0000, 0,0,0,0,0,0,0,0);
 
+#define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08x\n", hr)
+
 static void test_hglobal_storage_stat(void)
 {
     ILockBytes *ilb = NULL;
@@ -913,6 +915,36 @@ static void test_transact(void)
     ok( r == TRUE, "deleted file\n");
 }
 
+static void test_ReadClassStm(void)
+{
+    CLSID clsid;
+    HRESULT hr;
+    IStream *pStream;
+    static const LARGE_INTEGER llZero;
+
+    hr = ReadClassStm(NULL, &clsid);
+    ok(hr == E_INVALIDARG, "ReadClassStm should have returned E_INVALIDARG instead of 0x%08x\n", hr);
+
+    hr = CreateStreamOnHGlobal(NULL, TRUE, &pStream);
+    ok_ole_success(hr, "CreateStreamOnHGlobal");
+    hr = WriteClassStm(pStream, &test_stg_cls);
+    ok_ole_success(hr, "WriteClassStm");
+
+    hr = ReadClassStm(pStream, NULL);
+    ok(hr == E_INVALIDARG, "ReadClassStm should have returned E_INVALIDARG instead of 0x%08x\n", hr);
+
+    /* test not rewound stream */
+    hr = ReadClassStm(pStream, &clsid);
+    ok(hr == STG_E_READFAULT, "ReadClassStm should have returned STG_E_READFAULT instead of 0x%08x\n", hr);
+    ok(IsEqualCLSID(&clsid, &CLSID_NULL), "clsid should have been zeroed\n");
+
+    hr = IStream_Seek(pStream, llZero, STREAM_SEEK_SET, NULL);
+    ok_ole_success(hr, "IStream_Seek");
+    hr = ReadClassStm(pStream, &clsid);
+    ok_ole_success(hr, "ReadClassStm");
+    ok(IsEqualCLSID(&clsid, &test_stg_cls), "clsid should have been set to CLSID_WineTest\n");
+}
+
 START_TEST(storage32)
 {
     test_hglobal_storage_stat();
@@ -923,4 +955,5 @@ START_TEST(storage32)
     test_storage_refcount();
     test_streamenum();
     test_transact();
+    test_ReadClassStm();
 }




More information about the wine-cvs mailing list