[PATCH 7/7] ddraw: Fix memory leak in CreateSurface functions.

Alex Henrie alexhenrie24 at gmail.com
Wed Feb 15 00:53:49 CST 2017


Signed-off-by: Alex Henrie <alexhenrie24 at gmail.com>
---
 dlls/ddraw/ddraw.c | 96 +++++++++++++++++++++++++++++-------------------------
 1 file changed, 52 insertions(+), 44 deletions(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 7f0dec6059..4c53dd7788 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -2815,6 +2815,18 @@ static HRESULT WINAPI ddraw7_CreateSurface(IDirectDraw7 *iface, DDSURFACEDESC2 *
         return E_INVALIDARG;
     }
 
+    __TRY
+    {
+        *surface = NULL;
+    }
+    __EXCEPT_PAGE_FAULT
+    {
+        WARN("Application supplied invalid surface pointer\n");
+        wined3d_mutex_unlock();
+        return E_INVALIDARG;
+    }
+    __ENDTRY;
+
     if(surface_desc->ddsCaps.dwCaps & (DDSCAPS_FRONTBUFFER | DDSCAPS_BACKBUFFER))
     {
         if (TRACE_ON(ddraw))
@@ -2831,22 +2843,12 @@ static HRESULT WINAPI ddraw7_CreateSurface(IDirectDraw7 *iface, DDSURFACEDESC2 *
     hr = ddraw_surface_create(ddraw, surface_desc, &impl, outer_unknown, 7);
     wined3d_mutex_unlock();
 
-    __TRY
+    if (SUCCEEDED(hr))
     {
-        if (FAILED(hr))
-        {
-            *surface = NULL;
-            break;
-        }
         *surface = &impl->IDirectDrawSurface7_iface;
         IDirectDraw7_AddRef(iface);
         impl->ifaceToRelease = (IUnknown *)iface;
     }
-    __EXCEPT_PAGE_FAULT
-    {
-        hr = E_INVALIDARG;
-    }
-    __ENDTRY;
 
     return hr;
 }
@@ -2877,6 +2879,18 @@ static HRESULT WINAPI ddraw4_CreateSurface(IDirectDraw4 *iface,
         return E_INVALIDARG;
     }
 
+    __TRY
+    {
+        *surface = NULL;
+    }
+    __EXCEPT_PAGE_FAULT
+    {
+        WARN("Application supplied invalid surface pointer\n");
+        wined3d_mutex_unlock();
+        return E_INVALIDARG;
+    }
+    __ENDTRY;
+
     if(surface_desc->ddsCaps.dwCaps & (DDSCAPS_FRONTBUFFER | DDSCAPS_BACKBUFFER))
     {
         if (TRACE_ON(ddraw))
@@ -2893,22 +2907,12 @@ static HRESULT WINAPI ddraw4_CreateSurface(IDirectDraw4 *iface,
     hr = ddraw_surface_create(ddraw, surface_desc, &impl, outer_unknown, 4);
     wined3d_mutex_unlock();
 
-    __TRY
+    if (SUCCEEDED(hr))
     {
-        if (FAILED(hr))
-        {
-            *surface = NULL;
-            break;
-        }
         *surface = &impl->IDirectDrawSurface4_iface;
         IDirectDraw4_AddRef(iface);
         impl->ifaceToRelease = (IUnknown *)iface;
     }
-    __EXCEPT_PAGE_FAULT
-    {
-        hr = E_INVALIDARG;
-    }
-    __ENDTRY;
 
     return hr;
 }
@@ -2940,6 +2944,18 @@ static HRESULT WINAPI ddraw2_CreateSurface(IDirectDraw2 *iface,
         return E_INVALIDARG;
     }
 
+    __TRY
+    {
+        *surface = NULL;
+    }
+    __EXCEPT_PAGE_FAULT
+    {
+        WARN("Application supplied invalid surface pointer\n");
+        wined3d_mutex_unlock();
+        return E_INVALIDARG;
+    }
+    __ENDTRY;
+
     DDSD_to_DDSD2(surface_desc, &surface_desc2);
     if(surface_desc->ddsCaps.dwCaps & (DDSCAPS_FRONTBUFFER | DDSCAPS_BACKBUFFER))
     {
@@ -2957,21 +2973,11 @@ static HRESULT WINAPI ddraw2_CreateSurface(IDirectDraw2 *iface,
     hr = ddraw_surface_create(ddraw, &surface_desc2, &impl, outer_unknown, 2);
     wined3d_mutex_unlock();
 
-    __TRY
+    if (SUCCEEDED(hr))
     {
-        if (FAILED(hr))
-        {
-            *surface = NULL;
-            break;
-        }
         *surface = &impl->IDirectDrawSurface_iface;
         impl->ifaceToRelease = NULL;
     }
-    __EXCEPT_PAGE_FAULT
-    {
-        hr = E_INVALIDARG;
-    }
-    __ENDTRY;
 
     return hr;
 }
@@ -3003,6 +3009,18 @@ static HRESULT WINAPI ddraw1_CreateSurface(IDirectDraw *iface,
         return E_INVALIDARG;
     }
 
+    __TRY
+    {
+        *surface = NULL;
+    }
+    __EXCEPT_PAGE_FAULT
+    {
+        WARN("Application supplied invalid surface pointer\n");
+        wined3d_mutex_unlock();
+        return E_INVALIDARG;
+    }
+    __ENDTRY;
+
     if ((surface_desc->ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_BACKBUFFER))
             == (DDSCAPS_PRIMARYSURFACE | DDSCAPS_BACKBUFFER)
             || (surface_desc->ddsCaps.dwCaps & (DDSCAPS_FLIP | DDSCAPS_FRONTBUFFER))
@@ -3017,21 +3035,11 @@ static HRESULT WINAPI ddraw1_CreateSurface(IDirectDraw *iface,
     hr = ddraw_surface_create(ddraw, &surface_desc2, &impl, outer_unknown, 1);
     wined3d_mutex_unlock();
 
-    __TRY
+    if (SUCCEEDED(hr))
     {
-        if (FAILED(hr))
-        {
-            *surface = NULL;
-            break;
-        }
         *surface = &impl->IDirectDrawSurface_iface;
         impl->ifaceToRelease = NULL;
     }
-    __EXCEPT_PAGE_FAULT
-    {
-        hr = E_INVALIDARG;
-    }
-    __ENDTRY;
 
     return hr;
 }
-- 
2.11.1




More information about the wine-patches mailing list