[PATCH 2/9] dwrite/tests: Use table access helpers for CBLC tests.

Nikolay Sivov nsivov at codeweavers.com
Mon Apr 25 05:31:42 CDT 2022


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/dwrite/tests/font.c | 45 ++++++++++++++++++++++++++--------------
 1 file changed, 30 insertions(+), 15 deletions(-)

diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index af88c716ad8..3d4c4caad98 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -321,11 +321,12 @@ typedef struct {
     BYTE data[1];
 } sbix_glyph_data;
 
-typedef struct {
+struct cblc_header
+{
     WORD majorVersion;
     WORD minorVersion;
     DWORD numSizes;
-} CBLCHeader;
+};
 
 typedef struct {
     BYTE res[12];
@@ -3526,6 +3527,14 @@ struct dwrite_fonttable
     UINT32 size;
 };
 
+static const void *table_read_ensure(const struct dwrite_fonttable *table, unsigned int offset, unsigned int size)
+{
+    if (size > table->size || offset > table->size - size)
+        return NULL;
+
+    return table->data + offset;
+}
+
 static WORD table_read_be_word(const struct dwrite_fonttable *table, void *ptr, DWORD offset)
 {
     if (!ptr)
@@ -9303,34 +9312,40 @@ static DWORD get_sbix_formats(IDWriteFontFace4 *fontface)
 
 static DWORD get_cblc_formats(IDWriteFontFace4 *fontface)
 {
-    CBLCBitmapSizeTable *sizes;
-    UINT32 num_sizes, size, s;
+    const CBLCBitmapSizeTable *sizes;
+    struct dwrite_fonttable cblc;
+    unsigned int i, num_sizes;
     BOOL exists = FALSE;
-    CBLCHeader *header;
     DWORD ret = 0;
-    void *context;
     HRESULT hr;
 
-    hr = IDWriteFontFace4_TryGetFontTable(fontface, MS_CBLC_TAG, (const void **)&header, &size, &context, &exists);
-    ok(hr == S_OK, "TryGetFontTable() failed, %#lx\n", hr);
-    ok(exists, "Expected CBLC table\n");
+    hr = IDWriteFontFace4_TryGetFontTable(fontface, MS_CBLC_TAG, (const void **)&cblc.data, &cblc.size, &cblc.context, &exists);
+    ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+    ok(exists, "Expected CBLC table.\n");
 
     if (!exists)
         return 0;
 
-    num_sizes = GET_BE_DWORD(header->numSizes);
-    sizes = (CBLCBitmapSizeTable *)(header + 1);
-
-    for (s = 0; s < num_sizes; s++) {
-        BYTE bpp = sizes[s].bitDepth;
+    num_sizes = table_read_be_dword(&cblc, NULL, FIELD_OFFSET(struct cblc_header, numSizes));
+    if (!(sizes = table_read_ensure(&cblc, sizeof(struct cblc_header), num_sizes * sizeof(*sizes))))
+    {
+        skip("Malformed CBLC table.\n");
+        num_sizes = 0;
+    }
 
+    for (i = 0; i < num_sizes; ++i)
+    {
+        BYTE bpp = sizes[i].bitDepth;
         if (bpp == 1 || bpp == 2 || bpp == 4 || bpp == 8)
             ret |= DWRITE_GLYPH_IMAGE_FORMATS_PNG;
         else if (bpp == 32)
             ret |= DWRITE_GLYPH_IMAGE_FORMATS_PREMULTIPLIED_B8G8R8A8;
+
+        if (ret == (DWRITE_GLYPH_IMAGE_FORMATS_PNG | DWRITE_GLYPH_IMAGE_FORMATS_PREMULTIPLIED_B8G8R8A8))
+            break;
     }
 
-    IDWriteFontFace4_ReleaseFontTable(fontface, context);
+    IDWriteFontFace4_ReleaseFontTable(fontface, cblc.context);
 
     return ret;
 }
-- 
2.35.1




More information about the wine-devel mailing list