Jacek Caban : mshtml: Properly handle OOM errors in nsio.c (coverity).

Alexandre Julliard julliard at winehq.org
Fri Oct 19 13:33:53 CDT 2012


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Oct 19 11:58:01 2012 +0200

mshtml: Properly handle OOM errors in nsio.c (coverity).

---

 dlls/mshtml/nsio.c |   39 ++++++++++++++++++++++++---------------
 1 files changed, 24 insertions(+), 15 deletions(-)

diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c
index 6e63244..7fc2a3a 100644
--- a/dlls/mshtml/nsio.c
+++ b/dlls/mshtml/nsio.c
@@ -1005,11 +1005,17 @@ static nsresult async_open(nsChannel *This, HTMLOuterWindow *window, BOOL is_doc
         hres = create_pending_window(window, bscallback);
         if(SUCCEEDED(hres))
             async_start_doc_binding(window, window->pending_window);
-        IUnknown_Release((IUnknown*)bscallback);
+        IBindStatusCallback_Release(&bscallback->bsc.IBindStatusCallback_iface);
         if(FAILED(hres))
             return NS_ERROR_UNEXPECTED;
     }else {
-        start_binding_task_t *task = heap_alloc(sizeof(start_binding_task_t));
+        start_binding_task_t *task;
+
+        task = heap_alloc(sizeof(start_binding_task_t));
+        if(!task) {
+            IBindStatusCallback_Release(&bscallback->bsc.IBindStatusCallback_iface);
+            return NS_ERROR_OUT_OF_MEMORY;
+        }
 
         task->window = window->base.inner_window;
         task->bscallback = bscallback;
@@ -2846,9 +2852,13 @@ static const nsIStandardURLVtbl nsStandardURLVtbl = {
 
 static nsresult create_nsuri(IUri *iuri, HTMLOuterWindow *window, NSContainer *container, nsWineURI **_retval)
 {
-    nsWineURI *ret = heap_alloc_zero(sizeof(nsWineURI));
+    nsWineURI *ret;
     HRESULT hres;
 
+    ret = heap_alloc_zero(sizeof(nsWineURI));
+    if(!ret)
+        return NS_ERROR_OUT_OF_MEMORY;
+
     ret->nsIFileURL_iface.lpVtbl = &nsFileURLVtbl;
     ret->nsIStandardURL_iface.lpVtbl = &nsStandardURLVtbl;
     ret->ref = 1;
@@ -3121,17 +3131,6 @@ static const nsIProtocolHandlerVtbl nsProtocolHandlerVtbl = {
     nsProtocolHandler_AllowPort
 };
 
-static nsIProtocolHandler *create_protocol_handler(nsIProtocolHandler *nshandler)
-{
-    nsProtocolHandler *ret = heap_alloc(sizeof(nsProtocolHandler));
-
-    ret->nsIProtocolHandler_iface.lpVtbl = &nsProtocolHandlerVtbl;
-    ret->ref = 1;
-    ret->nshandler = nshandler;
-
-    return &ret->nsIProtocolHandler_iface;
-}
-
 static nsresult NSAPI nsIOService_QueryInterface(nsIIOService*,nsIIDRef,void**);
 
 static nsrefcnt NSAPI nsIOService_AddRef(nsIIOService *iface)
@@ -3149,6 +3148,7 @@ static nsresult NSAPI nsIOService_GetProtocolHandler(nsIIOService *iface, const
 {
     nsIExternalProtocolHandler *nsexthandler;
     nsIProtocolHandler *nshandler;
+    nsProtocolHandler *ret;
     nsresult nsres;
 
     TRACE("(%s %p)\n", debugstr_a(aScheme), _retval);
@@ -3167,7 +3167,16 @@ static nsresult NSAPI nsIOService_GetProtocolHandler(nsIIOService *iface, const
     }
 
     nsIExternalProtocolHandler_Release(nsexthandler);
-    *_retval = create_protocol_handler(nshandler);
+
+    ret = heap_alloc(sizeof(nsProtocolHandler));
+    if(!ret)
+        return NS_ERROR_OUT_OF_MEMORY;
+
+    ret->nsIProtocolHandler_iface.lpVtbl = &nsProtocolHandlerVtbl;
+    ret->ref = 1;
+    ret->nshandler = nshandler;
+    *_retval = &ret->nsIProtocolHandler_iface;
+
     TRACE("return %p\n", *_retval);
     return NS_OK;
 }




More information about the wine-cvs mailing list