Module: wine Branch: master Commit: 78846236b938b1c5f2d2221ed0050656b54fb08e URL: https://gitlab.winehq.org/wine/wine/-/commit/78846236b938b1c5f2d2221ed005065...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Sat Jul 16 15:13:01 2022 +0300
dwrite: Filter out unusable ranges on AddMapping().
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com
---
dlls/dwrite/analyzer.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-)
diff --git a/dlls/dwrite/analyzer.c b/dlls/dwrite/analyzer.c index 2f5f1e1d7fe..1522d7638bc 100644 --- a/dlls/dwrite/analyzer.c +++ b/dlls/dwrite/analyzer.c @@ -2374,7 +2374,7 @@ static HRESULT WINAPI fontfallbackbuilder_AddMapping(IDWriteFontFallbackBuilder { struct dwrite_fontfallback_builder *builder = impl_from_IDWriteFontFallbackBuilder(iface); struct fallback_mapping *mapping; - UINT32 i; + unsigned int i, count;
TRACE("%p, %p, %u, %p, %u, %p, %s, %s, %f.\n", iface, ranges, ranges_count, families, families_count, collection, debugstr_w(locale_name), debugstr_w(base_family), scale); @@ -2397,8 +2397,22 @@ static HRESULT WINAPI fontfallbackbuilder_AddMapping(IDWriteFontFallbackBuilder if (!(mapping->ranges = calloc(ranges_count, sizeof(*mapping->ranges)))) goto failed;
- mapping->ranges_count = ranges_count; - memcpy(mapping->ranges, ranges, sizeof(*mapping->ranges) * ranges_count); + /* Filter ranges that won't be usable. */ + for (i = 0, count = 0; i < ranges_count; ++i) + { + if (ranges[i].first > ranges[i].last) continue; + if (ranges[i].first > 0x10ffff) continue; + mapping->ranges[count].first = ranges[i].first; + mapping->ranges[count].last = min(ranges[i].last, 0x10ffff); + count++; + } + if (!count) + { + release_fallback_mapping(mapping); + return S_OK; + } + + mapping->ranges_count = count;
if (!(mapping->families = calloc(families_count, sizeof(*mapping->families)))) goto failed;