Rob Shearman : rpcrt4: Don' t crash in NdrDllGetClassObject when a NULL pclsid is passed in.

Alexandre Julliard julliard at winehq.org
Mon Sep 15 06:54:00 CDT 2008


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

Author: Rob Shearman <robertshearman at gmail.com>
Date:   Fri Sep 12 12:59:43 2008 +0100

rpcrt4: Don't crash in NdrDllGetClassObject when a NULL pclsid is passed in.

Add tests for this.

---

 dlls/rpcrt4/cpsf.c        |    2 +-
 dlls/rpcrt4/tests/cstub.c |   13 +++++++++++++
 2 files changed, 14 insertions(+), 1 deletions(-)

diff --git a/dlls/rpcrt4/cpsf.c b/dlls/rpcrt4/cpsf.c
index 373c97a..80b4186 100644
--- a/dlls/rpcrt4/cpsf.c
+++ b/dlls/rpcrt4/cpsf.c
@@ -174,7 +174,7 @@ HRESULT WINAPI NdrDllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv,
     if(max_delegating_vtbl_size > 0)
       create_delegating_vtbl(max_delegating_vtbl_size);
   }
-  if (IsEqualGUID(rclsid, pclsid))
+  if (pclsid && IsEqualGUID(rclsid, pclsid))
     return IPSFactoryBuffer_QueryInterface((LPPSFACTORYBUFFER)pPSFactoryBuffer, iid, ppv);
   else {
     const ProxyFileInfo *info;
diff --git a/dlls/rpcrt4/tests/cstub.c b/dlls/rpcrt4/tests/cstub.c
index 37b5985..29bcb27 100644
--- a/dlls/rpcrt4/tests/cstub.c
+++ b/dlls/rpcrt4/tests/cstub.c
@@ -432,6 +432,7 @@ static IPSFactoryBuffer *test_NdrDllGetClassObject(void)
 {
     IPSFactoryBuffer *ppsf = NULL;
     const CLSID PSDispatch = {0x20420, 0, 0, {0xc0, 0, 0, 0, 0, 0, 0, 0x46}};
+    const CLSID CLSID_Unknown = {0x45678, 0x1234, 0x6666, {0xff, 0x67, 0x45, 0x98, 0x76, 0x12, 0x34, 0x56}};
     HRESULT r;
     HMODULE hmod = LoadLibraryA("rpcrt4.dll");
     void *CStd_QueryInterface = GetProcAddress(hmod, "CStdStubBuffer_QueryInterface");
@@ -446,6 +447,11 @@ static IPSFactoryBuffer *test_NdrDllGetClassObject(void)
     void *CStd_DebugServerRelease = GetProcAddress(hmod, "CStdStubBuffer_DebugServerRelease");
 
     r = NdrDllGetClassObject(&PSDispatch, &IID_IPSFactoryBuffer, (void**)&ppsf, proxy_file_list,
+                             &CLSID_Unknown, &PSFactoryBuffer);
+    ok(r == CLASS_E_CLASSNOTAVAILABLE, "NdrDllGetClassObject with unknown clsid should have returned CLASS_E_CLASSNOTAVAILABLE instead of 0x%x\n", r);
+    ok(ppsf == NULL, "NdrDllGetClassObject should have set ppsf to NULL on failure\n");
+
+    r = NdrDllGetClassObject(&PSDispatch, &IID_IPSFactoryBuffer, (void**)&ppsf, proxy_file_list,
                          &PSDispatch, &PSFactoryBuffer);
 
     ok(r == S_OK, "ret %08x\n", r);
@@ -518,6 +524,13 @@ static IPSFactoryBuffer *test_NdrDllGetClassObject(void)
 #undef VTBL_TEST_ZERO
 
     ok(PSFactoryBuffer.RefCount == 1, "ref count %d\n", PSFactoryBuffer.RefCount);
+    IPSFactoryBuffer_Release(ppsf);
+
+    r = NdrDllGetClassObject(&IID_if3, &IID_IPSFactoryBuffer, (void**)&ppsf, proxy_file_list,
+                             NULL, &PSFactoryBuffer);
+    ok(r == S_OK, "ret %08x\n", r);
+    ok(ppsf != NULL, "ppsf == NULL\n");
+
     return ppsf;
 }
 




More information about the wine-cvs mailing list