Commit 69906b59 authored by Henri Verbeet's avatar Henri Verbeet Committed by Alexandre Julliard

d2d1: Properly cleanup in d2d_rectangle_geometry_init() failure paths.

This avoids leaking the factory reference in particular.
parent 5eaf2b51
...@@ -977,13 +977,12 @@ static BOOL d2d_path_geometry_add_figure(struct d2d_geometry *geometry) ...@@ -977,13 +977,12 @@ static BOOL d2d_path_geometry_add_figure(struct d2d_geometry *geometry)
return TRUE; return TRUE;
} }
static void d2d_geometry_destroy(struct d2d_geometry *geometry) static void d2d_geometry_cleanup(struct d2d_geometry *geometry)
{ {
HeapFree(GetProcessHeap(), 0, geometry->beziers); HeapFree(GetProcessHeap(), 0, geometry->beziers);
HeapFree(GetProcessHeap(), 0, geometry->faces); HeapFree(GetProcessHeap(), 0, geometry->faces);
HeapFree(GetProcessHeap(), 0, geometry->vertices); HeapFree(GetProcessHeap(), 0, geometry->vertices);
ID2D1Factory_Release(geometry->factory); ID2D1Factory_Release(geometry->factory);
HeapFree(GetProcessHeap(), 0, geometry);
} }
static void d2d_geometry_init(struct d2d_geometry *geometry, ID2D1Factory *factory, static void d2d_geometry_init(struct d2d_geometry *geometry, ID2D1Factory *factory,
...@@ -1363,7 +1362,8 @@ static ULONG STDMETHODCALLTYPE d2d_path_geometry_Release(ID2D1PathGeometry *ifac ...@@ -1363,7 +1362,8 @@ static ULONG STDMETHODCALLTYPE d2d_path_geometry_Release(ID2D1PathGeometry *ifac
if (!refcount) if (!refcount)
{ {
d2d_path_geometry_free_figures(geometry); d2d_path_geometry_free_figures(geometry);
d2d_geometry_destroy(geometry); d2d_geometry_cleanup(geometry);
HeapFree(GetProcessHeap(), 0, geometry);
} }
return refcount; return refcount;
...@@ -1622,7 +1622,10 @@ static ULONG STDMETHODCALLTYPE d2d_rectangle_geometry_Release(ID2D1RectangleGeom ...@@ -1622,7 +1622,10 @@ static ULONG STDMETHODCALLTYPE d2d_rectangle_geometry_Release(ID2D1RectangleGeom
TRACE("%p decreasing refcount to %u.\n", iface, refcount); TRACE("%p decreasing refcount to %u.\n", iface, refcount);
if (!refcount) if (!refcount)
d2d_geometry_destroy(geometry); {
d2d_geometry_cleanup(geometry);
HeapFree(GetProcessHeap(), 0, geometry);
}
return refcount; return refcount;
} }
...@@ -1792,11 +1795,14 @@ HRESULT d2d_rectangle_geometry_init(struct d2d_geometry *geometry, ID2D1Factory ...@@ -1792,11 +1795,14 @@ HRESULT d2d_rectangle_geometry_init(struct d2d_geometry *geometry, ID2D1Factory
geometry->u.rectangle.rect = *rect; geometry->u.rectangle.rect = *rect;
if (!(geometry->vertices = HeapAlloc(GetProcessHeap(), 0, 4 * sizeof(*geometry->vertices)))) if (!(geometry->vertices = HeapAlloc(GetProcessHeap(), 0, 4 * sizeof(*geometry->vertices))))
{
d2d_geometry_cleanup(geometry);
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
}
geometry->vertex_count = 4; geometry->vertex_count = 4;
if (!d2d_array_reserve((void **)&geometry->faces, &geometry->faces_size, 2, sizeof(*geometry->faces))) if (!d2d_array_reserve((void **)&geometry->faces, &geometry->faces_size, 2, sizeof(*geometry->faces)))
{ {
HeapFree(GetProcessHeap(), 0, geometry->vertices); d2d_geometry_cleanup(geometry);
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
} }
geometry->face_count = 2; geometry->face_count = 2;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment