msxml3: Check for unsafe cast in addCollection().

This commit is contained in:
Nikolay Sivov 2012-03-08 12:04:41 +03:00 committed by Alexandre Julliard
parent f73e02152c
commit 8889b66ffe
1 changed files with 24 additions and 4 deletions

View File

@ -786,11 +786,23 @@ static LONG cache_entry_release(cache_entry* entry)
return ref;
}
static const struct IXMLDOMSchemaCollection2Vtbl XMLDOMSchemaCollection2Vtbl;
static inline schema_cache* impl_from_IXMLDOMSchemaCollection2(IXMLDOMSchemaCollection2* iface)
{
return CONTAINING_RECORD(iface, schema_cache, IXMLDOMSchemaCollection2_iface);
}
static inline schema_cache* impl_from_IXMLDOMSchemaCollection(IXMLDOMSchemaCollection* iface)
{
return CONTAINING_RECORD(iface, schema_cache, IXMLDOMSchemaCollection2_iface);
}
static inline schema_cache* unsafe_impl_from_IXMLDOMSchemaCollection(IXMLDOMSchemaCollection *iface)
{
return iface->lpVtbl == (void*)&XMLDOMSchemaCollection2Vtbl ? impl_from_IXMLDOMSchemaCollection(iface) : NULL;
}
static inline CacheEntryType cache_type_from_xmlDocPtr(xmlDocPtr schema)
{
xmlNodePtr root = NULL;
@ -1292,15 +1304,23 @@ static void cache_copy(void* data, void* dest, xmlChar* name)
}
static HRESULT WINAPI schema_cache_addCollection(IXMLDOMSchemaCollection2* iface,
IXMLDOMSchemaCollection* otherCollection)
IXMLDOMSchemaCollection* collection)
{
schema_cache* This = impl_from_IXMLDOMSchemaCollection2(iface);
schema_cache* That = impl_from_IXMLDOMSchemaCollection2((IXMLDOMSchemaCollection2*)otherCollection);
TRACE("(%p)->(%p)\n", This, That);
schema_cache* That;
if (!otherCollection)
TRACE("(%p)->(%p)\n", This, collection);
if (!collection)
return E_POINTER;
That = unsafe_impl_from_IXMLDOMSchemaCollection(collection);
if (!That)
{
ERR("external collection implementation\n");
return E_FAIL;
}
/* TODO: detect errors while copying & return E_FAIL */
xmlHashScan(That->cache, cache_copy, This);