Check for error in dbg decrated oom funcs
authorAndre Heinecke <aheinecke@intevation.de>
Mon, 19 Nov 2018 09:58:20 +0000 (10:58 +0100)
committerAndre Heinecke <aheinecke@intevation.de>
Mon, 19 Nov 2018 10:04:59 +0000 (11:04 +0100)
* src/oomhelp.cpp (gpgol_openProperty, gpgol_queryInterface):
Check result before calling memdbg_addRef.

--
Calling something on the pointer on error is undefined
so we may not do it. memdbg_addRef tries to get the
name of the interface. That might then crash.
Usually the returned pointer should be NULL so
on error so it does not happen much.

GnuPG-Bug-Id: T4262

src/oomhelp.cpp

index 205eec5..bef4170 100644 (file)
@@ -41,7 +41,12 @@ HRESULT
 gpgol_queryInterface (LPUNKNOWN pObj, REFIID riid, LPVOID FAR *ppvObj)
 {
   HRESULT ret = pObj->QueryInterface (riid, ppvObj);
-  if ((opt.enable_debug & DBG_MEMORY) && *ppvObj)
+  if (ret)
+    {
+      log_debug ("%s:%s: QueryInterface failed hr=%#lx",
+                 SRCNAME, __func__, ret);
+    }
+  else if ((opt.enable_debug & DBG_MEMORY) && *ppvObj)
     {
       memdbg_addRef (*ppvObj);
     }
@@ -56,7 +61,12 @@ gpgol_openProperty (LPMAPIPROP obj, ULONG ulPropTag, LPCIID lpiid,
   HRESULT ret = obj->OpenProperty (ulPropTag, lpiid,
                                    ulInterfaceOptions, ulFlags,
                                    lppUnk);
-  if ((opt.enable_debug & DBG_MEMORY) && *lppUnk)
+  if (ret)
+    {
+      log_debug ("%s:%s: OpenProperty failed hr=%#lx",
+                 SRCNAME, __func__, ret);
+    }
+  else if ((opt.enable_debug & DBG_MEMORY) && *lppUnk)
     {
       memdbg_addRef (*lppUnk);
       log_debug ("%s:%s: OpenProperty on %p prop %lx result %p",