Nikolay Sivov : dwrite: Check for allocation failures of glyph buffers.
Alexandre Julliard
julliard at winehq.org
Tue May 11 16:33:59 CDT 2021
Module: wine
Branch: master
Commit: 430145e43145017c73794a288b67538d814ce894
URL: https://source.winehq.org/git/wine.git/?a=commit;h=430145e43145017c73794a288b67538d814ce894
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Tue May 11 16:09:16 2021 +0300
dwrite: Check for allocation failures of glyph buffers.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/dwrite/analyzer.c | 30 ++++++++++++++++++++++++++----
1 file changed, 26 insertions(+), 4 deletions(-)
diff --git a/dlls/dwrite/analyzer.c b/dlls/dwrite/analyzer.c
index 93d507cf3dc..89c76da0bb9 100644
--- a/dlls/dwrite/analyzer.c
+++ b/dlls/dwrite/analyzer.c
@@ -1190,6 +1190,12 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphs(IDWriteTextAnalyzer2 *iface,
*actual_glyph_count = 0;
+ if (!context.u.subst.glyphs || !context.u.subst.glyph_props || !context.glyph_infos)
+ {
+ hr = E_OUTOFMEMORY;
+ goto failed;
+ }
+
scriptprops = &dwritescripts_properties[context.script];
hr = shape_get_glyphs(&context, scriptprops->scripttags);
if (SUCCEEDED(hr))
@@ -1199,6 +1205,7 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphs(IDWriteTextAnalyzer2 *iface,
memcpy(glyph_props, context.u.subst.glyph_props, context.glyph_count * sizeof(*glyph_props));
}
+failed:
heap_free(context.u.subst.glyph_props);
heap_free(context.u.subst.glyphs);
heap_free(context.glyph_infos);
@@ -1261,12 +1268,19 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphPlacements(IDWriteTextAnalyzer2
context.user_features.features = features;
context.user_features.range_lengths = feature_range_lengths;
context.user_features.range_count = feature_ranges;
- context.glyph_infos = heap_alloc_zero(sizeof(*context.glyph_infos) * glyph_count);
+ context.glyph_infos = heap_calloc(glyph_count, sizeof(*context.glyph_infos));
context.table = &context.cache->gpos;
+ if (!context.glyph_infos)
+ {
+ hr = E_OUTOFMEMORY;
+ goto failed;
+ }
+
scriptprops = &dwritescripts_properties[context.script];
hr = shape_get_positions(&context, scriptprops->scripttags);
+failed:
heap_free(context.glyph_infos);
return hr;
@@ -1331,12 +1345,19 @@ static HRESULT WINAPI dwritetextanalyzer_GetGdiCompatibleGlyphPlacements(IDWrite
context.user_features.features = features;
context.user_features.range_lengths = feature_range_lengths;
context.user_features.range_count = feature_ranges;
- context.glyph_infos = heap_alloc_zero(sizeof(*context.glyph_infos) * glyph_count);
+ context.glyph_infos = heap_calloc(glyph_count, sizeof(*context.glyph_infos));
context.table = &context.cache->gpos;
+ if (!context.glyph_infos)
+ {
+ hr = E_OUTOFMEMORY;
+ goto failed;
+ }
+
scriptprops = &dwritescripts_properties[context.script];
hr = shape_get_positions(&context, scriptprops->scripttags);
+failed:
heap_free(context.glyph_infos);
return hr;
@@ -1805,7 +1826,8 @@ static HRESULT WINAPI dwritetextanalyzer2_CheckTypographicFeature(IDWriteTextAna
context.cache = fontface_get_shaping_cache(font_obj);
context.language_tag = get_opentype_language(locale);
- context.glyph_infos = heap_calloc(glyph_count, sizeof(*context.glyph_infos));
+ if (!(context.glyph_infos = heap_calloc(glyph_count, sizeof(*context.glyph_infos))))
+ return E_OUTOFMEMORY;
props = &dwritescripts_properties[sa.script];
@@ -2355,7 +2377,7 @@ static HRESULT WINAPI fontfallbackbuilder_AddMapping(IDWriteFontFallbackBuilder
mapping->ranges = heap_calloc(ranges_count, sizeof(*mapping->ranges));
memcpy(mapping->ranges, ranges, sizeof(*mapping->ranges) * ranges_count);
mapping->ranges_count = ranges_count;
- mapping->families = heap_alloc_zero(sizeof(*mapping->families) * families_count);
+ mapping->families = heap_calloc(families_count, sizeof(*mapping->families));
mapping->families_count = families_count;
for (i = 0; i < families_count; i++)
mapping->families[i] = heap_strdupW(target_families[i]);
More information about the wine-cvs
mailing list