[4/4] msi: Only use Windows platform-specific encoded strings from the font naming table.

Hans Leidekker hans at codeweavers.com
Fri Sep 23 04:13:04 CDT 2011


See http://bugs.winehq.org/show_bug.cgi?id=28443
---
 dlls/msi/font.c |   19 +++++++++++++++----
 1 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/dlls/msi/font.c b/dlls/msi/font.c
index 528eab7..0b728a3 100644
--- a/dlls/msi/font.c
+++ b/dlls/msi/font.c
@@ -143,17 +143,28 @@ static WCHAR *load_ttf_name_id( const WCHAR *filename, DWORD id )
             break;
 
         ttRecord.uNameID = SWAPWORD(ttRecord.uNameID);
-        if (ttRecord.uNameID == id)
+        ttRecord.uPlatformID = SWAPWORD(ttRecord.uPlatformID);
+        ttRecord.uEncodingID = SWAPWORD(ttRecord.uEncodingID);
+        if (ttRecord.uNameID == id && ttRecord.uPlatformID == 3 &&
+            (ttRecord.uEncodingID == 0 || ttRecord.uEncodingID == 1))
         {
-            LPSTR buf;
+            WCHAR *buf;
+            unsigned int i;
 
             ttRecord.uStringLength = SWAPWORD(ttRecord.uStringLength);
             ttRecord.uStringOffset = SWAPWORD(ttRecord.uStringOffset);
             SetFilePointer(handle, tblDir.uOffset + ttRecord.uStringOffset + ttNTHeader.uStorageOffset,
                            NULL, FILE_BEGIN);
-            if (!(buf = msi_alloc_zero( ttRecord.uStringLength + 1 ))) goto end;
+            if (!(buf = msi_alloc_zero( ttRecord.uStringLength + sizeof(WCHAR) ))) goto end;
+            dwRead = 0;
             ReadFile(handle, buf, ttRecord.uStringLength, &dwRead, NULL);
-            ret = strdupAtoW(buf);
+            if (dwRead % sizeof(WCHAR))
+            {
+                msi_free(buf);
+                goto end;
+            }
+            for (i = 0; i < dwRead / sizeof(WCHAR); i++) buf[i] = SWAPWORD(buf[i]);
+            ret = strdupW(buf);
             msi_free(buf);
             break;
         }
-- 
1.7.5.4






More information about the wine-patches mailing list