Module: wine Branch: master Commit: d37b669503ec73fde07f274f0ec97e69fd543d77 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d37b669503ec73fde07f274f0e...
Author: Rob Shearman rob@codeweavers.com Date: Sat Dec 2 18:16:47 2006 +0000
ole32: Check that the specified clipboard format and tymed are valid in IOleCache::Cache in the data cache.
---
dlls/ole32/datacache.c | 30 +++++++++++++++++++++++++++++- 1 files changed, 29 insertions(+), 1 deletions(-)
diff --git a/dlls/ole32/datacache.c b/dlls/ole32/datacache.c index f5f43eb..d6d34d0 100644 --- a/dlls/ole32/datacache.c +++ b/dlls/ole32/datacache.c @@ -249,8 +249,36 @@ static DataCacheEntry *DataCache_GetEntr return NULL; }
+/* checks that the clipformat and tymed are valid and returns an error if they +* aren't and CACHE_S_NOTSUPPORTED if they are valid, but can't be rendered by +* DataCache_Draw */ +static HRESULT check_valid_clipformat_and_tymed(CLIPFORMAT cfFormat, DWORD tymed) +{ + if (!cfFormat || !tymed || + (cfFormat == CF_METAFILEPICT && tymed == TYMED_MFPICT) || + (cfFormat == CF_BITMAP && tymed == TYMED_GDI) || + (cfFormat == CF_DIB && tymed == TYMED_HGLOBAL) || + (cfFormat == CF_ENHMETAFILE && tymed == TYMED_ENHMF)) + return S_OK; + else if (tymed == TYMED_HGLOBAL) + return CACHE_S_FORMATETC_NOTSUPPORTED; + else + { + WARN("invalid clipformat/tymed combination: %d/%d\n", cfFormat, tymed); + return DV_E_TYMED; + } +} + static HRESULT DataCache_CreateEntry(DataCache *This, const FORMATETC *formatetc, DataCacheEntry **cache_entry) { + HRESULT hr; + + hr = check_valid_clipformat_and_tymed(formatetc->cfFormat, formatetc->tymed); + if (FAILED(hr)) + return hr; + if (hr == CACHE_S_FORMATETC_NOTSUPPORTED) + TRACE("creating unsupported format %d\n", formatetc->cfFormat); + *cache_entry = HeapAlloc(GetProcessHeap(), 0, sizeof(**cache_entry)); if (!*cache_entry) return E_OUTOFMEMORY; @@ -268,7 +296,7 @@ static HRESULT DataCache_CreateEntry(Dat (*cache_entry)->dirty = TRUE; (*cache_entry)->stream_number = -1; list_add_tail(&This->cache_list, &(*cache_entry)->entry); - return S_OK; + return hr; }
/************************************************************************