OLE32: test and fix a few problems with OLE storage streams

Mike McCormack mike at codeweavers.com
Tue Jan 11 03:01:02 CST 2005


ChangeLog:
* test and fix a few problems with OLE storage streams
-------------- next part --------------
Index: dlls/ole32/stg_stream.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/stg_stream.c,v
retrieving revision 1.23
diff -u -r1.23 stg_stream.c
--- dlls/ole32/stg_stream.c	7 Oct 2004 03:06:49 -0000	1.23
+++ dlls/ole32/stg_stream.c	11 Jan 2005 09:00:01 -0000
@@ -447,6 +447,9 @@
       return STG_E_ACCESSDENIED;
   }
 
+  if (!pv)
+    return STG_E_INVALIDPOINTER;
+
   /*
    * If the caller is not interested in the number of bytes written,
    * we use another buffer to avoid "if" statements in the code.
Index: dlls/ole32/storage32.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/storage32.c,v
retrieving revision 1.65
diff -u -r1.65 storage32.c
--- dlls/ole32/storage32.c	10 Jan 2005 12:26:25 -0000	1.65
+++ dlls/ole32/storage32.c	11 Jan 2005 09:00:02 -0000
@@ -872,18 +872,23 @@
   if (pwcsName == 0)
     return STG_E_INVALIDNAME;
 
+  if (reserved1 || reserved2)
+    return STG_E_INVALIDPARAMETER;
+
   /*
    * Validate the STGM flags
    */
   if ( FAILED( validateSTGM(grfMode) ))
     return STG_E_INVALIDFLAG;
 
+  if ( !(grfMode & STGM_SHARE_EXCLUSIVE) )
+    return STG_E_INVALIDFLAG;
+
   /*
    * As documented.
    */
-  if ( !(grfMode & STGM_SHARE_EXCLUSIVE) ||
-        (grfMode & STGM_DELETEONRELEASE) ||
-        (grfMode & STGM_TRANSACTED) )
+  if ((grfMode & STGM_DELETEONRELEASE) ||
+      (grfMode & STGM_TRANSACTED))
     return STG_E_INVALIDFUNCTION;
 
   /*
Index: dlls/ole32/tests/storage32.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/tests/storage32.c,v
retrieving revision 1.3
diff -u -r1.3 storage32.c
--- dlls/ole32/tests/storage32.c	10 Jan 2005 12:26:25 -0000	1.3
+++ dlls/ole32/tests/storage32.c	11 Jan 2005 09:00:02 -0000
@@ -150,8 +150,115 @@
    ok(DeleteFileW(filename), "failed to delete file\n");
 }
 
+void test_storage_stream(void)
+{
+    static const WCHAR stmname[] = { 'C','O','N','T','E','N','T','S',0 };
+    static const WCHAR szPrefix[] = { 's','t','g',0 };
+    static const WCHAR szDot[] = { '.',0 };
+    static const WCHAR longname[] = {
+        'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',
+        'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',0
+    };
+    WCHAR filename[MAX_PATH];
+    IStorage *stg = NULL;
+    HRESULT r;
+    IStream *stm = NULL;
+    ULONG count = 0;
+    LARGE_INTEGER pos;
+    ULARGE_INTEGER p;
+    unsigned char buffer[0x100];
+
+    if(!GetTempFileNameW(szDot, szPrefix, 0, filename))
+        return;
+
+    DeleteFileW(filename);
+
+    r = StgCreateDocfile( filename, STGM_CREATE | STGM_SHARE_EXCLUSIVE | STGM_READWRITE |STGM_TRANSACTED, 0, &stg);
+    ok(r==S_OK, "StgCreateDocfile failed\n");
+
+    /* try create some invalid streams */
+    r = IStorage_CreateStream(stg, stmname, STGM_SHARE_EXCLUSIVE | STGM_READWRITE, 1, 0, &stm );
+    ok(r==STG_E_INVALIDPARAMETER, "IStorage->CreateStream wrong error\n");
+    r = IStorage_CreateStream(stg, stmname, STGM_SHARE_EXCLUSIVE | STGM_READWRITE, 0, 1, &stm );
+    ok(r==STG_E_INVALIDPARAMETER, "IStorage->CreateStream wrong error\n");
+    r = IStorage_CreateStream(stg, stmname, STGM_SHARE_EXCLUSIVE | STGM_READWRITE, 0, 0, NULL );
+    ok(r==STG_E_INVALIDPOINTER, "IStorage->CreateStream wrong error\n");
+    r = IStorage_CreateStream(stg, NULL, STGM_SHARE_EXCLUSIVE | STGM_READWRITE, 0, 0, &stm );
+    ok(r==STG_E_INVALIDNAME, "IStorage->CreateStream wrong error\n");
+    r = IStorage_CreateStream(stg, longname, STGM_SHARE_EXCLUSIVE | STGM_READWRITE, 0, 0, &stm );
+    ok(r==STG_E_INVALIDNAME, "IStorage->CreateStream wrong error\n");
+    r = IStorage_CreateStream(stg, stmname, STGM_READWRITE, 0, 0, &stm );
+    ok(r==STG_E_INVALIDFLAG, "IStorage->CreateStream wrong error\n");
+    r = IStorage_CreateStream(stg, stmname, STGM_READ, 0, 0, &stm );
+    ok(r==STG_E_INVALIDFLAG, "IStorage->CreateStream wrong error\n");
+    r = IStorage_CreateStream(stg, stmname, STGM_WRITE, 0, 0, &stm );
+    ok(r==STG_E_INVALIDFLAG, "IStorage->CreateStream wrong error\n");
+    r = IStorage_CreateStream(stg, stmname, STGM_SHARE_DENY_NONE | STGM_READWRITE, 0, 0, &stm );
+    ok(r==STG_E_INVALIDFLAG, "IStorage->CreateStream wrong error\n");
+    r = IStorage_CreateStream(stg, stmname, STGM_SHARE_DENY_NONE | STGM_READ, 0, 0, &stm );
+    ok(r==STG_E_INVALIDFLAG, "IStorage->CreateStream wrong error\n");
+
+    /* now really create a stream and delete it */
+    r = IStorage_CreateStream(stg, stmname, STGM_SHARE_EXCLUSIVE | STGM_READWRITE, 0, 0, &stm );
+    ok(r==S_OK, "IStorage->CreateStream failed\n");
+    r = IStream_Release(stm);
+    ok(r == 0, "wrong ref count\n");
+    r = IStorage_CreateStream(stg, stmname, STGM_SHARE_EXCLUSIVE | STGM_READWRITE, 0, 0, &stm );
+    ok(r==STG_E_FILEALREADYEXISTS, "IStorage->CreateStream failed\n");
+    r = IStorage_DestroyElement(stg,stmname);
+    ok(r==S_OK, "IStorage->DestroyElement failed\n");
+
+    /* create a stream and write to it */
+    r = IStorage_CreateStream(stg, stmname, STGM_SHARE_EXCLUSIVE | STGM_READWRITE, 0, 0, &stm );
+    ok(r==S_OK, "IStorage->CreateStream failed\n");
+
+    r = IStream_Write(stm, NULL, 0, NULL );
+    ok(r==STG_E_INVALIDPOINTER, "IStream->Write wrong error\n");
+    r = IStream_Write(stm, "Hello\n", 0, NULL );
+    ok(r==S_OK, "failed to write stream\n");
+    r = IStream_Write(stm, "Hello\n", 0, &count );
+    ok(r==S_OK, "failed to write stream\n");
+    r = IStream_Write(stm, "Hello\n", 6, &count );
+    ok(r==S_OK, "failed to write stream\n");
+    r = IStream_Commit(stm, STGC_DEFAULT );
+    ok(r==S_OK, "failed to commit stream\n");
+    r = IStream_Commit(stm, STGC_DEFAULT );
+    ok(r==S_OK, "failed to commit stream\n");
+
+    /* seek round a bit, reset the stream size */
+    pos.QuadPart = 0;
+    r = IStream_Seek(stm, pos, 3, &p );
+    ok(r==STG_E_INVALIDFUNCTION, "IStream->Seek returned wrong error\n");
+    r = IStream_Seek(stm, pos, STREAM_SEEK_SET, NULL);
+    ok(r==S_OK, "failed to seek stream\n");
+    r = IStream_Seek(stm, pos, STREAM_SEEK_SET, &p );
+    ok(r==S_OK, "failed to seek stream\n");
+    r = IStream_SetSize(stm,p);
+    ok(r==S_OK, "failed to set pos\n");
+    pos.QuadPart = 10;
+    r = IStream_Seek(stm, pos, STREAM_SEEK_SET, &p );
+    ok(r==S_OK, "failed to seek stream\n");
+    ok(p.QuadPart == 10, "at wrong place\n");
+    pos.QuadPart = 0;
+    r = IStream_Seek(stm, pos, STREAM_SEEK_END, &p );
+    ok(r==S_OK, "failed to seek stream\n");
+    ok(p.QuadPart == 0, "at wrong place\n");
+    r = IStream_Read(stm, buffer, sizeof buffer, &count );
+    ok(r==S_OK, "failed to set pos\n");
+    ok(count == 0, "read bytes from empty stream\n");
+
+    /* wrap up */
+    r = IStream_Release(stm);
+    ok(r == 0, "wrong ref count\n");
+    r = IStorage_Release(stg);
+    ok(r == 0, "wrong ref count\n");
+    r = DeleteFileW(filename);
+    ok(r == TRUE, "file should exist\n");
+}
+
 START_TEST(storage32)
 {
     test_hglobal_storage_stat();
     test_create_storage_modes();
+    test_storage_stream();
 }


More information about the wine-patches mailing list