[PATCH 5/6] usp10: Use heap_calloc() in ScriptStringAnalyse().

Aric Stewart aric at codeweavers.com
Thu Mar 8 06:58:28 CST 2018


Signed-off-by: Aric Stewart <aric at codeweavers.com>

On 3/8/18 1:05 AM, Henri Verbeet wrote:
> Note that this changes the allocation size of analysis->pItem. I believe that
> change to be correct.
> 
> Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
> ---
>   dlls/usp10/usp10.c | 38 +++++++++++++++++++-------------------
>   1 file changed, 19 insertions(+), 19 deletions(-)
> 
> diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c
> index 983eb83..f3b3405 100644
> --- a/dlls/usp10/usp10.c
> +++ b/dlls/usp10/usp10.c
> @@ -2012,8 +2012,10 @@ HRESULT WINAPI ScriptStringAnalyse(HDC hdc, const void *pString, int cString,
>       if (cString < 1 || !pString) return E_INVALIDARG;
>       if ((dwFlags & SSA_GLYPHS) && !hdc) return E_PENDING;
>   
> -    if (!(analysis = heap_alloc_zero(sizeof(StringAnalysis)))) return E_OUTOFMEMORY;
> -    if (!(analysis->pItem = heap_alloc_zero(num_items * sizeof(SCRIPT_ITEM) + 1))) goto error;
> +    if (!(analysis = heap_alloc_zero(sizeof(*analysis))))
> +        return E_OUTOFMEMORY;
> +    if (!(analysis->pItem = heap_calloc(num_items + 1, sizeof(*analysis->pItem))))
> +        goto error;
>   
>       /* FIXME: handle clipping */
>       analysis->clip_len = cString;
> @@ -2032,8 +2034,7 @@ HRESULT WINAPI ScriptStringAnalyse(HDC hdc, const void *pString, int cString,
>   
>       if (dwFlags & SSA_PASSWORD)
>       {
> -        iString = heap_alloc(sizeof(WCHAR)*cString);
> -        if (!iString)
> +        if (!(iString = heap_calloc(cString, sizeof(*iString))))
>           {
>               hr = E_OUTOFMEMORY;
>               goto error;
> @@ -2058,18 +2059,16 @@ HRESULT WINAPI ScriptStringAnalyse(HDC hdc, const void *pString, int cString,
>   
>       if (dwFlags & SSA_BREAK)
>       {
> -        if ((analysis->logattrs = heap_alloc(sizeof(SCRIPT_LOGATTR) * cString)))
> -        {
> -            for (i = 0; i < analysis->numItems; i++)
> -                ScriptBreak(&((WCHAR *)pString)[analysis->pItem[i].iCharPos],
> -                        analysis->pItem[i + 1].iCharPos - analysis->pItem[i].iCharPos,
> -                        &analysis->pItem[i].a, &analysis->logattrs[analysis->pItem[i].iCharPos]);
> -        }
> -        else
> +        if (!(analysis->logattrs = heap_calloc(cString, sizeof(*analysis->logattrs))))
>               goto error;
> +
> +        for (i = 0; i < analysis->numItems; ++i)
> +            ScriptBreak(&((const WCHAR *)pString)[analysis->pItem[i].iCharPos],
> +                    analysis->pItem[i + 1].iCharPos - analysis->pItem[i].iCharPos,
> +                    &analysis->pItem[i].a, &analysis->logattrs[analysis->pItem[i].iCharPos]);
>       }
>   
> -    if (!(analysis->logical2visual = heap_alloc_zero(sizeof(int) * analysis->numItems)))
> +    if (!(analysis->logical2visual = heap_calloc(analysis->numItems, sizeof(*analysis->logical2visual))))
>           goto error;
>       if (!(BidiLevel = heap_alloc_zero(analysis->numItems)))
>           goto error;
> @@ -2077,7 +2076,8 @@ HRESULT WINAPI ScriptStringAnalyse(HDC hdc, const void *pString, int cString,
>       if (dwFlags & SSA_GLYPHS)
>       {
>           int tab_x = 0;
> -        if (!(analysis->glyphs = heap_alloc_zero(sizeof(StringGlyphs) * analysis->numItems)))
> +
> +        if (!(analysis->glyphs = heap_calloc(analysis->numItems, sizeof(*analysis->glyphs))))
>           {
>               heap_free(BidiLevel);
>               goto error;
> @@ -2088,11 +2088,11 @@ HRESULT WINAPI ScriptStringAnalyse(HDC hdc, const void *pString, int cString,
>               SCRIPT_CACHE *sc = (SCRIPT_CACHE*)&analysis->glyphs[i].sc;
>               int cChar = analysis->pItem[i+1].iCharPos - analysis->pItem[i].iCharPos;
>               int numGlyphs = 1.5 * cChar + 16;
> -            WORD *glyphs = heap_alloc_zero(sizeof(WORD) * numGlyphs);
> -            WORD *pwLogClust = heap_alloc_zero(sizeof(WORD) * cChar);
> -            int *piAdvance = heap_alloc_zero(sizeof(int) * numGlyphs);
> -            SCRIPT_VISATTR *psva = heap_alloc_zero(sizeof(SCRIPT_VISATTR) * numGlyphs);
> -            GOFFSET *pGoffset = heap_alloc_zero(sizeof(GOFFSET) * numGlyphs);
> +            WORD *glyphs = heap_calloc(numGlyphs, sizeof(*glyphs));
> +            WORD *pwLogClust = heap_calloc(cChar, sizeof(*pwLogClust));
> +            int *piAdvance = heap_calloc(numGlyphs, sizeof(*piAdvance));
> +            SCRIPT_VISATTR *psva = heap_calloc(numGlyphs, sizeof(*psva));
> +            GOFFSET *pGoffset = heap_calloc(numGlyphs, sizeof(*pGoffset));
>               int numGlyphsReturned;
>               HFONT originalFont = 0x0;
>   
> 



More information about the wine-devel mailing list