Module: wine Branch: master Commit: 5b07cfc13ec3ddbb3092e2e5fd1a613a97fb2b00 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5b07cfc13ec3ddbb3092e2e5fd...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Thu Apr 20 12:50:07 2017 +0300
dwrite: Handle allocation failure when duplicating reference key.
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/dwrite/font.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-)
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index c1b2286..3b265cb 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -2,7 +2,7 @@ * Font and collections * * Copyright 2011 Huw Davies - * Copyright 2012, 2014-2016 Nikolay Sivov for CodeWeavers + * Copyright 2012, 2014-2017 Nikolay Sivov for CodeWeavers * Copyright 2014 Aric Stewart for CodeWeavers * * This library is free software; you can redistribute it and/or @@ -4212,23 +4212,32 @@ static const IDWriteFontFileVtbl dwritefontfilevtbl = { dwritefontfile_Analyze, };
-HRESULT create_font_file(IDWriteFontFileLoader *loader, const void *reference_key, UINT32 key_size, IDWriteFontFile **font_file) +HRESULT create_font_file(IDWriteFontFileLoader *loader, const void *reference_key, UINT32 key_size, + IDWriteFontFile **ret) { - struct dwrite_fontfile *This; + struct dwrite_fontfile *file; + void *key;
- This = heap_alloc(sizeof(struct dwrite_fontfile)); - if (!This) return E_OUTOFMEMORY; + *ret = NULL;
- This->IDWriteFontFile_iface.lpVtbl = &dwritefontfilevtbl; - This->ref = 1; + file = heap_alloc(sizeof(*file)); + key = heap_alloc(key_size); + if (!file || !key) { + heap_free(file); + heap_free(key); + return E_OUTOFMEMORY; + } + + file->IDWriteFontFile_iface.lpVtbl = &dwritefontfilevtbl; + file->ref = 1; IDWriteFontFileLoader_AddRef(loader); - This->loader = loader; - This->stream = NULL; - This->reference_key = heap_alloc(key_size); - memcpy(This->reference_key, reference_key, key_size); - This->key_size = key_size; + file->loader = loader; + file->stream = NULL; + file->reference_key = key; + memcpy(file->reference_key, reference_key, key_size); + file->key_size = key_size;
- *font_file = &This->IDWriteFontFile_iface; + *ret = &file->IDWriteFontFile_iface;
return S_OK; }