[PATCH 4/4] gdi32: Fix some leaks on error paths.
Sven Baars
sbaars at codeweavers.com
Sun Apr 18 07:30:26 CDT 2021
Signed-off-by: Sven Baars <sbaars at codeweavers.com>
---
dlls/gdi32/bidi.c | 88 +++++++++++++++++++----------------------------
1 file changed, 36 insertions(+), 52 deletions(-)
diff --git a/dlls/gdi32/bidi.c b/dlls/gdi32/bidi.c
index 18971026395..8f3d31bf2ec 100644
--- a/dlls/gdi32/bidi.c
+++ b/dlls/gdi32/bidi.c
@@ -336,17 +336,17 @@ BOOL BIDI_Reorder(
INT *cGlyphs /* [out] number of glyphs generated */
)
{
- WORD *chartype;
- BYTE *levels;
+ WORD *chartype = NULL;
+ BYTE *levels = NULL;
INT i, done;
unsigned glyph_i;
- BOOL is_complex;
+ BOOL is_complex, ret = FALSE;
int maxItems;
int nItems;
SCRIPT_CONTROL Control;
SCRIPT_STATE State;
- SCRIPT_ITEM *pItems;
+ SCRIPT_ITEM *pItems = NULL;
HRESULT res;
SCRIPT_CACHE psc = NULL;
WORD *run_glyphs = NULL;
@@ -429,8 +429,7 @@ BOOL BIDI_Reorder(
if (!levels)
{
WARN("Out of memory\n");
- HeapFree(GetProcessHeap(), 0, chartype);
- return FALSE;
+ goto cleanup;
}
maxItems = 5;
@@ -438,9 +437,7 @@ BOOL BIDI_Reorder(
if (!pItems)
{
WARN("Out of memory\n");
- HeapFree(GetProcessHeap(), 0, chartype);
- HeapFree(GetProcessHeap(), 0, levels);
- return FALSE;
+ goto cleanup;
}
if (lpGlyphs)
@@ -450,31 +447,19 @@ BOOL BIDI_Reorder(
if (!run_glyphs)
{
WARN("Out of memory\n");
- HeapFree(GetProcessHeap(), 0, chartype);
- HeapFree(GetProcessHeap(), 0, levels);
- HeapFree(GetProcessHeap(), 0, pItems);
- return FALSE;
+ goto cleanup;
}
pwLogClust = HeapAlloc(GetProcessHeap(),0,sizeof(WORD) * uCount);
if (!pwLogClust)
{
WARN("Out of memory\n");
- HeapFree(GetProcessHeap(), 0, chartype);
- HeapFree(GetProcessHeap(), 0, levels);
- HeapFree(GetProcessHeap(), 0, pItems);
- HeapFree(GetProcessHeap(), 0, run_glyphs);
- return FALSE;
+ goto cleanup;
}
psva = HeapAlloc(GetProcessHeap(),0,sizeof(SCRIPT_VISATTR) * uCount);
if (!psva)
{
WARN("Out of memory\n");
- HeapFree(GetProcessHeap(), 0, chartype);
- HeapFree(GetProcessHeap(), 0, levels);
- HeapFree(GetProcessHeap(), 0, pItems);
- HeapFree(GetProcessHeap(), 0, run_glyphs);
- HeapFree(GetProcessHeap(), 0, pwLogClust);
- return FALSE;
+ goto cleanup;
}
}
@@ -519,18 +504,14 @@ BOOL BIDI_Reorder(
res = ScriptItemize(lpString + done, i, maxItems, &Control, &State, pItems, &nItems);
while (res == E_OUTOFMEMORY)
{
- maxItems = maxItems * 2;
- pItems = HeapReAlloc(GetProcessHeap(), 0, pItems, sizeof(SCRIPT_ITEM) * maxItems);
- if (!pItems)
+ SCRIPT_ITEM *new_pItems = HeapReAlloc(GetProcessHeap(), 0, pItems, sizeof(*pItems) * maxItems * 2);
+ if (!new_pItems)
{
WARN("Out of memory\n");
- HeapFree(GetProcessHeap(), 0, chartype);
- HeapFree(GetProcessHeap(), 0, levels);
- HeapFree(GetProcessHeap(), 0, run_glyphs);
- HeapFree(GetProcessHeap(), 0, pwLogClust);
- HeapFree(GetProcessHeap(), 0, psva);
- return FALSE;
+ goto cleanup;
}
+ pItems = new_pItems;
+ maxItems *= 2;
res = ScriptItemize(lpString + done, i, maxItems, &Control, &State, pItems, &nItems);
}
@@ -587,12 +568,7 @@ BOOL BIDI_Reorder(
WARN("Out of memory\n");
HeapFree(GetProcessHeap(), 0, runOrder);
HeapFree(GetProcessHeap(), 0, visOrder);
- HeapFree(GetProcessHeap(), 0, chartype);
- HeapFree(GetProcessHeap(), 0, levels);
- HeapFree(GetProcessHeap(), 0, pItems);
- HeapFree(GetProcessHeap(), 0, psva);
- HeapFree(GetProcessHeap(), 0, pwLogClust);
- return FALSE;
+ goto cleanup;
}
for (j = 0; j < nItems; j++)
@@ -611,23 +587,18 @@ BOOL BIDI_Reorder(
res = ScriptShape(hDC, &psc, lpString + done + curItem->iCharPos, cChars, cMaxGlyphs, &curItem->a, run_glyphs, pwLogClust, psva, &cOutGlyphs);
while (res == E_OUTOFMEMORY)
{
- cMaxGlyphs *= 2;
- run_glyphs = HeapReAlloc(GetProcessHeap(), 0, run_glyphs, sizeof(WORD) * cMaxGlyphs);
- if (!run_glyphs)
+ WORD *new_run_glyphs = HeapReAlloc(GetProcessHeap(), 0, run_glyphs, sizeof(*run_glyphs) * cMaxGlyphs * 2);
+ if (!new_run_glyphs)
{
WARN("Out of memory\n");
HeapFree(GetProcessHeap(), 0, runOrder);
HeapFree(GetProcessHeap(), 0, visOrder);
- HeapFree(GetProcessHeap(), 0, chartype);
- HeapFree(GetProcessHeap(), 0, levels);
- HeapFree(GetProcessHeap(), 0, pItems);
- HeapFree(GetProcessHeap(), 0, psva);
- HeapFree(GetProcessHeap(), 0, pwLogClust);
HeapFree(GetProcessHeap(), 0, *lpGlyphs);
- ScriptFreeCache(&psc);
*lpGlyphs = NULL;
- return FALSE;
+ goto cleanup;
}
+ run_glyphs = new_run_glyphs;
+ cMaxGlyphs *= 2;
res = ScriptShape(hDC, &psc, lpString + done + curItem->iCharPos, cChars, cMaxGlyphs, &curItem->a, run_glyphs, pwLogClust, psva, &cOutGlyphs);
}
if (res)
@@ -643,10 +614,21 @@ BOOL BIDI_Reorder(
}
else
{
+ WORD *new_glyphs;
if (*lpGlyphs)
- *lpGlyphs = HeapReAlloc(GetProcessHeap(), 0, *lpGlyphs, sizeof(WORD) * (glyph_i + cOutGlyphs));
+ new_glyphs = HeapReAlloc(GetProcessHeap(), 0, *lpGlyphs, sizeof(**lpGlyphs) * (glyph_i + cOutGlyphs));
else
- *lpGlyphs = HeapAlloc(GetProcessHeap(), 0, sizeof(WORD) * (glyph_i + cOutGlyphs));
+ new_glyphs = HeapAlloc(GetProcessHeap(), 0, sizeof(**lpGlyphs) * (glyph_i + cOutGlyphs));
+ if (!new_glyphs)
+ {
+ WARN("Out of memory\n");
+ HeapFree(GetProcessHeap(), 0, runOrder);
+ HeapFree(GetProcessHeap(), 0, visOrder);
+ HeapFree(GetProcessHeap(), 0, *lpGlyphs);
+ *lpGlyphs = NULL;
+ goto cleanup;
+ }
+ *lpGlyphs = new_glyphs;
for (k = 0; k < cOutGlyphs; k++)
(*lpGlyphs)[glyph_i+k] = run_glyphs[k];
glyph_i += cOutGlyphs;
@@ -661,6 +643,8 @@ BOOL BIDI_Reorder(
if (cGlyphs)
*cGlyphs = glyph_i;
+ ret = TRUE;
+cleanup:
HeapFree(GetProcessHeap(), 0, chartype);
HeapFree(GetProcessHeap(), 0, levels);
HeapFree(GetProcessHeap(), 0, pItems);
@@ -668,5 +652,5 @@ BOOL BIDI_Reorder(
HeapFree(GetProcessHeap(), 0, pwLogClust);
HeapFree(GetProcessHeap(), 0, psva);
ScriptFreeCache(&psc);
- return TRUE;
+ return ret;
}
--
2.30.0.335.ge6362826a0
More information about the wine-devel
mailing list