From 40d9a2b6d234e85d79d599df7dd8ae97e62fad0b Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov@codeweavers.com>
Date: Mon, 26 Jan 2015 13:39:18 +0300
Subject: [PATCH] dwrite: Make sure we don't have duplicates in locale/value
 pairs for font names.

---
 dlls/dwrite/main.c     | 20 +++++++++++++++++++-
 dlls/dwrite/opentype.c | 14 ++++++++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c
index 58273fee12d..5a2ce2c9d3d 100644
--- a/dlls/dwrite/main.c
+++ b/dlls/dwrite/main.c
@@ -383,14 +383,32 @@ HRESULT create_localizedstrings(IDWriteLocalizedStrings **strings)
 HRESULT add_localizedstring(IDWriteLocalizedStrings *iface, const WCHAR *locale, const WCHAR *string)
 {
     struct localizedstrings *This = impl_from_IDWriteLocalizedStrings(iface);
+    UINT32 i;
+
+    /* make sure there's no duplicates */
+    for (i = 0; i < This->count; i++)
+        if (!strcmpW(This->data[i].locale, locale))
+            return S_OK;
 
     if (This->count == This->alloc) {
+        void *ptr;
+
+        ptr = heap_realloc(This->data, 2*This->alloc*sizeof(struct localizedpair));
+        if (!ptr)
+            return E_OUTOFMEMORY;
+
         This->alloc *= 2;
-        This->data = heap_realloc(This->data, This->alloc*sizeof(struct localizedpair));
+        This->data = ptr;
     }
 
     This->data[This->count].locale = heap_strdupW(locale);
     This->data[This->count].string = heap_strdupW(string);
+    if (!This->data[This->count].locale || !This->data[This->count].string) {
+        heap_free(This->data[This->count].locale);
+        heap_free(This->data[This->count].string);
+        return E_OUTOFMEMORY;
+    }
+
     This->count++;
 
     return S_OK;
diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c
index 8fa5a54dfd8..7b3fb1f0d78 100644
--- a/dlls/dwrite/opentype.c
+++ b/dlls/dwrite/opentype.c
@@ -1194,6 +1194,14 @@ HRESULT opentype_get_font_strings_from_id(const void *table_data, DWRITE_INFORMA
     if (FAILED(hr)) return hr;
 
     header = table_data;
+
+    switch (header->format) {
+    case 0:
+        break;
+    default:
+        FIXME("unsupported NAME format %d\n", header->format);
+    }
+
     storage_area = (LPBYTE)table_data + GET_BE_WORD(header->stringOffset);
     count = GET_BE_WORD(header->count);
 
@@ -1219,6 +1227,12 @@ HRESULT opentype_get_font_strings_from_id(const void *table_data, DWRITE_INFORMA
             continue;
         }
 
+        /* Skip such entries for now, as it's not clear which locale is implied when
+           unicode platform is used. Also fonts tend to duplicate those strings as
+           WIN platform entries. */
+        if (platform == OPENTYPE_PLATFORM_UNICODE)
+            continue;
+
         lang_id = GET_BE_WORD(record->languageID);
         length = GET_BE_WORD(record->length);
         offset = GET_BE_WORD(record->offset);
-- 
GitLab