Nikolay Sivov : dwrite: Refuse to create IDWriteFontFace with invalid collection index.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Oct 15 11:37:25 CDT 2014
Module: wine
Branch: master
Commit: d8a66e634c969925b9022a23eefb42ff3314247d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d8a66e634c969925b9022a23eefb42ff3314247d
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Sun Oct 12 18:18:10 2014 +0400
dwrite: Refuse to create IDWriteFontFace with invalid collection index.
---
dlls/dwrite/dwrite_private.h | 2 +-
dlls/dwrite/font.c | 5 ++++-
dlls/dwrite/opentype.c | 43 +++++++++++++++----------------------------
dlls/dwrite/tests/font.c | 10 +++++++---
4 files changed, 27 insertions(+), 33 deletions(-)
diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index af3ae79..b3bd1df 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -107,7 +107,7 @@ extern HRESULT font_create_fontface(IDWriteFactory *iface, DWRITE_FONT_FACE_TYPE
/* Opentype font table functions */
extern HRESULT opentype_analyze_font(IDWriteFontFileStream*,UINT32*,DWRITE_FONT_FILE_TYPE*,DWRITE_FONT_FACE_TYPE*,BOOL*) DECLSPEC_HIDDEN;
-extern HRESULT find_font_table(IDWriteFontFileStream *stream, UINT32 font_index, UINT32 tag, const void** table_data, void** table_context, UINT32 *table_size, BOOL* found) DECLSPEC_HIDDEN;
+extern HRESULT opentype_get_font_table(IDWriteFontFileStream*,DWRITE_FONT_FACE_TYPE,UINT32,UINT32,const void**,void**,UINT32*,BOOL*) DECLSPEC_HIDDEN;
extern VOID OpenType_CMAP_GetGlyphIndex(LPVOID data, DWORD utf32c, LPWORD pgi, DWORD flags) DECLSPEC_HIDDEN;
extern VOID get_font_properties(LPCVOID os2, LPCVOID head, LPCVOID post, DWRITE_FONT_METRICS *metrics, DWRITE_FONT_STRETCH *stretch, DWRITE_FONT_WEIGHT *weight, DWRITE_FONT_STYLE *style) DECLSPEC_HIDDEN;
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 3291054..a220501 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -429,7 +429,7 @@ static HRESULT WINAPI dwritefontface_TryGetFontTable(IDWriteFontFace2 *iface, UI
continue;
tablecontext->file_index = i;
- hr = find_font_table(stream, This->data->index, table_tag, table_data, &tablecontext->context, table_size, exists);
+ hr = opentype_get_font_table(stream, This->data->type, This->data->index, table_tag, table_data, &tablecontext->context, table_size, exists);
IDWriteFontFileStream_Release(stream);
}
@@ -1619,6 +1619,9 @@ HRESULT font_create_fontface(IDWriteFactory *iface, DWRITE_FONT_FACE_TYPE facety
*font_face = NULL;
+ if (facetype != DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION && index)
+ return E_INVALIDARG;
+
This = heap_alloc(sizeof(struct dwrite_fontface));
if (!This) return E_OUTOFMEMORY;
This->data = heap_alloc(sizeof(struct dwrite_fontface_data));
diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c
index 26ad333..9af04fd 100644
--- a/dlls/dwrite/opentype.c
+++ b/dlls/dwrite/opentype.c
@@ -225,48 +225,35 @@ HRESULT opentype_analyze_font(IDWriteFontFileStream *stream, UINT32* font_count,
return S_OK;
}
-HRESULT find_font_table(IDWriteFontFileStream *stream, UINT32 font_index, UINT32 tag, const void** table_data, void** table_context, UINT32 *table_size, BOOL* found)
+HRESULT opentype_get_font_table(IDWriteFontFileStream *stream, DWRITE_FONT_FACE_TYPE type, UINT32 font_index, UINT32 tag,
+ const void **table_data, void **table_context, UINT32 *table_size, BOOL *found)
{
- const CHAR *first_data;
- void *first_context;
HRESULT hr;
TTC_SFNT_V1 *font_header = NULL;
void *sfnt_context;
TT_TableRecord *table_record = NULL;
void *table_record_context;
+ int table_count, table_offset = 0;
int i;
- int table_count;
- int table_offset = 0;
*found = FALSE;
- hr = IDWriteFontFileStream_ReadFileFragment(stream, (const void**)&first_data, 0, 4, &first_context);
- if (SUCCEEDED(hr))
- {
- if (DWRITE_MAKE_OPENTYPE_TAG(first_data[0], first_data[1], first_data[2], first_data[3]) == MS_TTCF_TAG)
- {
- const TTC_Header_V1 *ttc_header;
- void * ttc_context;
- hr = IDWriteFontFileStream_ReadFileFragment(stream, (const void**)&ttc_header, 0, sizeof(*ttc_header), &ttc_context);
- if (SUCCEEDED(hr))
- {
- table_offset = GET_BE_DWORD(ttc_header->OffsetTable[0]);
- if (font_index >= GET_BE_DWORD(ttc_header->numFonts))
- hr = E_INVALIDARG;
- else
- hr = IDWriteFontFileStream_ReadFileFragment(stream, (const void**)&font_header, table_offset, sizeof(*font_header), &sfnt_context);
- IDWriteFontFileStream_ReleaseFileFragment(stream, ttc_context);
- }
- }
- else
- {
- if (font_index > 0)
+ if (type == DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION) {
+ const TTC_Header_V1 *ttc_header;
+ void * ttc_context;
+ hr = IDWriteFontFileStream_ReadFileFragment(stream, (const void**)&ttc_header, 0, sizeof(*ttc_header), &ttc_context);
+ if (SUCCEEDED(hr)) {
+ table_offset = GET_BE_DWORD(ttc_header->OffsetTable[0]);
+ if (font_index >= GET_BE_DWORD(ttc_header->numFonts))
hr = E_INVALIDARG;
else
- hr = IDWriteFontFileStream_ReadFileFragment(stream, (const void**)&font_header, 0, sizeof(*font_header), &sfnt_context);
+ hr = IDWriteFontFileStream_ReadFileFragment(stream, (const void**)&font_header, table_offset, sizeof(*font_header), &sfnt_context);
+ IDWriteFontFileStream_ReleaseFileFragment(stream, ttc_context);
}
- IDWriteFontFileStream_ReleaseFileFragment(stream, first_context);
}
+ else
+ hr = IDWriteFontFileStream_ReadFileFragment(stream, (const void**)&font_header, 0, sizeof(*font_header), &sfnt_context);
+
if (FAILED(hr))
return hr;
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index 582cab0..65cd398 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -982,10 +982,14 @@ static void test_FontLoader(void)
ok(face == DWRITE_FONT_FACE_TYPE_TRUETYPE, "got %i\n", face);
ok(count == 1, "got %i\n", count);
- hr = IDWriteFactory_CreateFontFace(factory, face, 1, &ffile, 0, 0, &fface);
- ok(hr == S_OK, "got 0x%08x\n",hr);
+ /* invalid index */
+ hr = IDWriteFactory_CreateFontFace(factory, face, 1, &ffile, 1, DWRITE_FONT_SIMULATIONS_NONE, &fface);
+ ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+
+ hr = IDWriteFactory_CreateFontFace(factory, face, 1, &ffile, 0, DWRITE_FONT_SIMULATIONS_NONE, &fface);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IDWriteFontFace_GetGlyphIndices(fface, codePoints, 1, indices);
- ok(hr == S_OK, "got0x%08x\n",hr);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
ok(indices[0] == 6, "got index %i\n",indices[0]);
IDWriteFontFace_Release(fface);
IDWriteFontFile_Release(ffile);
More information about the wine-cvs
mailing list