Commit e98cdc32 authored by Piotr Caban's avatar Piotr Caban Committed by Alexandre Julliard

dwrite: Don't crash on uninitialized cached and factory fields in dwritefontface_Release.

The function may be called with the fields uninitialized from create_fontface when init_font_data fails. Signed-off-by: 's avatarPiotr Caban <piotr@codeweavers.com> Signed-off-by: 's avatarNikolay Sivov <nsivov@codeweavers.com> Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
parent 6bc8ecaf
...@@ -501,8 +501,10 @@ static ULONG WINAPI dwritefontface_Release(IDWriteFontFace4 *iface) ...@@ -501,8 +501,10 @@ static ULONG WINAPI dwritefontface_Release(IDWriteFontFace4 *iface)
heap_free(This->glyphs[i]); heap_free(This->glyphs[i]);
freetype_notify_cacheremove(iface); freetype_notify_cacheremove(iface);
factory_release_cached_fontface(This->cached); if (This->cached)
IDWriteFactory4_Release(This->factory); factory_release_cached_fontface(This->cached);
if (This->factory)
IDWriteFactory4_Release(This->factory);
heap_free(This); heap_free(This);
} }
...@@ -4283,7 +4285,7 @@ HRESULT create_fontface(const struct fontface_desc *desc, struct list *cached_li ...@@ -4283,7 +4285,7 @@ HRESULT create_fontface(const struct fontface_desc *desc, struct list *cached_li
*ret = NULL; *ret = NULL;
fontface = heap_alloc(sizeof(struct dwrite_fontface)); fontface = heap_alloc_zero(sizeof(struct dwrite_fontface));
if (!fontface) if (!fontface)
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
...@@ -4301,11 +4303,6 @@ HRESULT create_fontface(const struct fontface_desc *desc, struct list *cached_li ...@@ -4301,11 +4303,6 @@ HRESULT create_fontface(const struct fontface_desc *desc, struct list *cached_li
fontface->ref = 1; fontface->ref = 1;
fontface->type = desc->face_type; fontface->type = desc->face_type;
fontface->file_count = desc->files_number; fontface->file_count = desc->files_number;
memset(&fontface->cmap, 0, sizeof(fontface->cmap));
memset(&fontface->vdmx, 0, sizeof(fontface->vdmx));
memset(&fontface->gasp, 0, sizeof(fontface->gasp));
memset(&fontface->cpal, 0, sizeof(fontface->cpal));
memset(&fontface->colr, 0, sizeof(fontface->colr));
fontface->cmap.exists = TRUE; fontface->cmap.exists = TRUE;
fontface->vdmx.exists = TRUE; fontface->vdmx.exists = TRUE;
fontface->gasp.exists = TRUE; fontface->gasp.exists = TRUE;
...@@ -4313,7 +4310,6 @@ HRESULT create_fontface(const struct fontface_desc *desc, struct list *cached_li ...@@ -4313,7 +4310,6 @@ HRESULT create_fontface(const struct fontface_desc *desc, struct list *cached_li
fontface->colr.exists = TRUE; fontface->colr.exists = TRUE;
fontface->index = desc->index; fontface->index = desc->index;
fontface->simulations = desc->simulations; fontface->simulations = desc->simulations;
memset(fontface->glyphs, 0, sizeof(fontface->glyphs));
for (i = 0; i < fontface->file_count; i++) { for (i = 0; i < fontface->file_count; i++) {
hr = get_stream_from_file(desc->files[i], &fontface->streams[i]); hr = get_stream_from_file(desc->files[i], &fontface->streams[i]);
...@@ -4338,7 +4334,6 @@ HRESULT create_fontface(const struct fontface_desc *desc, struct list *cached_li ...@@ -4338,7 +4334,6 @@ HRESULT create_fontface(const struct fontface_desc *desc, struct list *cached_li
} }
} }
fontface->flags = 0;
fontface->charmap = freetype_get_charmap_index(&fontface->IDWriteFontFace4_iface, &is_symbol); fontface->charmap = freetype_get_charmap_index(&fontface->IDWriteFontFace4_iface, &is_symbol);
if (is_symbol) if (is_symbol)
fontface->flags |= FONTFACE_IS_SYMBOL; fontface->flags |= FONTFACE_IS_SYMBOL;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment