mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-06 15:04:44 +00:00
msxml3/saxreader: Fix attributes array growing size.
This commit is contained in:
parent
bf10dd3ee4
commit
66b5dd71e9
|
@ -301,8 +301,8 @@ typedef struct
|
||||||
struct list elements;
|
struct list elements;
|
||||||
|
|
||||||
BSTR namespaceUri;
|
BSTR namespaceUri;
|
||||||
int attributesSize;
|
int attr_alloc_count;
|
||||||
int nb_attributes;
|
int attr_count;
|
||||||
struct _attributes
|
struct _attributes
|
||||||
{
|
{
|
||||||
BSTR szLocalname;
|
BSTR szLocalname;
|
||||||
|
@ -1106,11 +1106,16 @@ static HRESULT WINAPI isaxattributes_getLength(
|
||||||
{
|
{
|
||||||
saxlocator *This = impl_from_ISAXAttributes( iface );
|
saxlocator *This = impl_from_ISAXAttributes( iface );
|
||||||
|
|
||||||
*length = This->nb_attributes;
|
*length = This->attr_count;
|
||||||
TRACE("Length set to %d\n", *length);
|
TRACE("Length set to %d\n", *length);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline BOOL is_valid_attr_index(const saxlocator *locator, int index)
|
||||||
|
{
|
||||||
|
return index < locator->attr_count && index >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI isaxattributes_getURI(
|
static HRESULT WINAPI isaxattributes_getURI(
|
||||||
ISAXAttributes* iface,
|
ISAXAttributes* iface,
|
||||||
int index,
|
int index,
|
||||||
|
@ -1120,7 +1125,7 @@ static HRESULT WINAPI isaxattributes_getURI(
|
||||||
saxlocator *This = impl_from_ISAXAttributes( iface );
|
saxlocator *This = impl_from_ISAXAttributes( iface );
|
||||||
TRACE("(%p)->(%d)\n", This, index);
|
TRACE("(%p)->(%d)\n", This, index);
|
||||||
|
|
||||||
if(index >= This->nb_attributes || index < 0) return E_INVALIDARG;
|
if(!is_valid_attr_index(This, index)) return E_INVALIDARG;
|
||||||
if(!url || !size) return E_POINTER;
|
if(!url || !size) return E_POINTER;
|
||||||
|
|
||||||
*size = SysStringLen(This->attributes[index].szURI);
|
*size = SysStringLen(This->attributes[index].szURI);
|
||||||
|
@ -1133,36 +1138,36 @@ static HRESULT WINAPI isaxattributes_getURI(
|
||||||
|
|
||||||
static HRESULT WINAPI isaxattributes_getLocalName(
|
static HRESULT WINAPI isaxattributes_getLocalName(
|
||||||
ISAXAttributes* iface,
|
ISAXAttributes* iface,
|
||||||
int nIndex,
|
int index,
|
||||||
const WCHAR **pLocalName,
|
const WCHAR **pLocalName,
|
||||||
int *pLocalNameLength)
|
int *pLocalNameLength)
|
||||||
{
|
{
|
||||||
saxlocator *This = impl_from_ISAXAttributes( iface );
|
saxlocator *This = impl_from_ISAXAttributes( iface );
|
||||||
TRACE("(%p)->(%d)\n", This, nIndex);
|
TRACE("(%p)->(%d)\n", This, index);
|
||||||
|
|
||||||
if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
|
if(!is_valid_attr_index(This, index)) return E_INVALIDARG;
|
||||||
if(!pLocalName || !pLocalNameLength) return E_POINTER;
|
if(!pLocalName || !pLocalNameLength) return E_POINTER;
|
||||||
|
|
||||||
*pLocalNameLength = SysStringLen(This->attributes[nIndex].szLocalname);
|
*pLocalNameLength = SysStringLen(This->attributes[index].szLocalname);
|
||||||
*pLocalName = This->attributes[nIndex].szLocalname;
|
*pLocalName = This->attributes[index].szLocalname;
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI isaxattributes_getQName(
|
static HRESULT WINAPI isaxattributes_getQName(
|
||||||
ISAXAttributes* iface,
|
ISAXAttributes* iface,
|
||||||
int nIndex,
|
int index,
|
||||||
const WCHAR **pQName,
|
const WCHAR **pQName,
|
||||||
int *pQNameLength)
|
int *pQNameLength)
|
||||||
{
|
{
|
||||||
saxlocator *This = impl_from_ISAXAttributes( iface );
|
saxlocator *This = impl_from_ISAXAttributes( iface );
|
||||||
TRACE("(%p)->(%d)\n", This, nIndex);
|
TRACE("(%p)->(%d)\n", This, index);
|
||||||
|
|
||||||
if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
|
if(!is_valid_attr_index(This, index)) return E_INVALIDARG;
|
||||||
if(!pQName || !pQNameLength) return E_POINTER;
|
if(!pQName || !pQNameLength) return E_POINTER;
|
||||||
|
|
||||||
*pQNameLength = SysStringLen(This->attributes[nIndex].szQName);
|
*pQNameLength = SysStringLen(This->attributes[index].szQName);
|
||||||
*pQName = This->attributes[nIndex].szQName;
|
*pQName = This->attributes[index].szQName;
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
@ -1180,7 +1185,7 @@ static HRESULT WINAPI isaxattributes_getName(
|
||||||
saxlocator *This = impl_from_ISAXAttributes( iface );
|
saxlocator *This = impl_from_ISAXAttributes( iface );
|
||||||
TRACE("(%p)->(%d)\n", This, index);
|
TRACE("(%p)->(%d)\n", This, index);
|
||||||
|
|
||||||
if(index>=This->nb_attributes || index<0) return E_INVALIDARG;
|
if(!is_valid_attr_index(This, index)) return E_INVALIDARG;
|
||||||
if(!uri || !pUriLength || !localName || !pLocalNameSize
|
if(!uri || !pUriLength || !localName || !pLocalNameSize
|
||||||
|| !QName || !pQNameLength) return E_POINTER;
|
|| !QName || !pQNameLength) return E_POINTER;
|
||||||
|
|
||||||
|
@ -1211,7 +1216,7 @@ static HRESULT WINAPI isaxattributes_getIndexFromName(
|
||||||
|
|
||||||
if(!pUri || !pLocalName || !index) return E_POINTER;
|
if(!pUri || !pLocalName || !index) return E_POINTER;
|
||||||
|
|
||||||
for(i=0; i<This->nb_attributes; i++)
|
for(i=0; i<This->attr_count; i++)
|
||||||
{
|
{
|
||||||
if(cUriLength!=SysStringLen(This->attributes[i].szURI)
|
if(cUriLength!=SysStringLen(This->attributes[i].szURI)
|
||||||
|| cocalNameLength!=SysStringLen(This->attributes[i].szLocalname))
|
|| cocalNameLength!=SysStringLen(This->attributes[i].szLocalname))
|
||||||
|
@ -1243,7 +1248,7 @@ static HRESULT WINAPI isaxattributes_getIndexFromQName(
|
||||||
if(!pQName || !index) return E_POINTER;
|
if(!pQName || !index) return E_POINTER;
|
||||||
if(!nQNameLength) return E_INVALIDARG;
|
if(!nQNameLength) return E_INVALIDARG;
|
||||||
|
|
||||||
for(i=0; i<This->nb_attributes; i++)
|
for(i=0; i<This->attr_count; i++)
|
||||||
{
|
{
|
||||||
if(nQNameLength!=SysStringLen(This->attributes[i].szQName)) continue;
|
if(nQNameLength!=SysStringLen(This->attributes[i].szQName)) continue;
|
||||||
if(memcmp(pQName, This->attributes[i].szQName, sizeof(WCHAR)*nQNameLength)) continue;
|
if(memcmp(pQName, This->attributes[i].szQName, sizeof(WCHAR)*nQNameLength)) continue;
|
||||||
|
@ -1305,7 +1310,7 @@ static HRESULT WINAPI isaxattributes_getValue(
|
||||||
saxlocator *This = impl_from_ISAXAttributes( iface );
|
saxlocator *This = impl_from_ISAXAttributes( iface );
|
||||||
TRACE("(%p)->(%d)\n", This, index);
|
TRACE("(%p)->(%d)\n", This, index);
|
||||||
|
|
||||||
if(index>=This->nb_attributes || index<0) return E_INVALIDARG;
|
if(!is_valid_attr_index(This, index)) return E_INVALIDARG;
|
||||||
if(!value || !nValue) return E_POINTER;
|
if(!value || !nValue) return E_POINTER;
|
||||||
|
|
||||||
*nValue = SysStringLen(This->attributes[index].szValue);
|
*nValue = SysStringLen(This->attributes[index].szValue);
|
||||||
|
@ -1423,7 +1428,7 @@ static void free_attribute_values(saxlocator *locator)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < locator->nb_attributes; i++)
|
for (i = 0; i < locator->attr_count; i++)
|
||||||
{
|
{
|
||||||
SysFreeString(locator->attributes[i].szLocalname);
|
SysFreeString(locator->attributes[i].szLocalname);
|
||||||
locator->attributes[i].szLocalname = NULL;
|
locator->attributes[i].szLocalname = NULL;
|
||||||
|
@ -1450,19 +1455,19 @@ static HRESULT SAXAttributes_populate(saxlocator *locator,
|
||||||
if ((locator->saxreader->features & NamespacePrefixes) == 0)
|
if ((locator->saxreader->features & NamespacePrefixes) == 0)
|
||||||
nb_namespaces = 0;
|
nb_namespaces = 0;
|
||||||
|
|
||||||
locator->nb_attributes = nb_namespaces + nb_attributes;
|
locator->attr_count = nb_namespaces + nb_attributes;
|
||||||
if(locator->nb_attributes > locator->attributesSize)
|
if(locator->attr_count > locator->attr_alloc_count)
|
||||||
{
|
{
|
||||||
int new_size = locator->attributesSize * 2;
|
int new_size = locator->attr_count * 2;
|
||||||
attrs = heap_realloc_zero(locator->attributes, new_size * sizeof(struct _attributes));
|
attrs = heap_realloc_zero(locator->attributes, new_size * sizeof(struct _attributes));
|
||||||
if(!attrs)
|
if(!attrs)
|
||||||
{
|
{
|
||||||
free_attribute_values(locator);
|
free_attribute_values(locator);
|
||||||
locator->nb_attributes = 0;
|
locator->attr_count = 0;
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
}
|
}
|
||||||
locator->attributes = attrs;
|
locator->attributes = attrs;
|
||||||
locator->attributesSize = new_size;
|
locator->attr_alloc_count = new_size;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1706,7 +1711,7 @@ static void libxmlEndElementNS(
|
||||||
if (!saxreader_has_handler(This, SAXContentHandler))
|
if (!saxreader_has_handler(This, SAXContentHandler))
|
||||||
{
|
{
|
||||||
free_attribute_values(This);
|
free_attribute_values(This);
|
||||||
This->nb_attributes = 0;
|
This->attr_count = 0;
|
||||||
free_element_entry(element);
|
free_element_entry(element);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1728,7 +1733,7 @@ static void libxmlEndElementNS(
|
||||||
element->qname, SysStringLen(element->qname));
|
element->qname, SysStringLen(element->qname));
|
||||||
|
|
||||||
free_attribute_values(This);
|
free_attribute_values(This);
|
||||||
This->nb_attributes = 0;
|
This->attr_count = 0;
|
||||||
|
|
||||||
if (sax_callback_failed(This, hr))
|
if (sax_callback_failed(This, hr))
|
||||||
{
|
{
|
||||||
|
@ -2326,7 +2331,7 @@ static ULONG WINAPI isaxlocator_Release(
|
||||||
SysFreeString(This->systemId);
|
SysFreeString(This->systemId);
|
||||||
SysFreeString(This->namespaceUri);
|
SysFreeString(This->namespaceUri);
|
||||||
|
|
||||||
for(index=0; index<This->attributesSize; index++)
|
for(index = 0; index < This->attr_alloc_count; index++)
|
||||||
{
|
{
|
||||||
SysFreeString(This->attributes[index].szLocalname);
|
SysFreeString(This->attributes[index].szLocalname);
|
||||||
SysFreeString(This->attributes[index].szValue);
|
SysFreeString(This->attributes[index].szValue);
|
||||||
|
@ -2462,9 +2467,9 @@ static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator, B
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
locator->attributesSize = 8;
|
locator->attr_alloc_count = 8;
|
||||||
locator->nb_attributes = 0;
|
locator->attr_count = 0;
|
||||||
locator->attributes = heap_alloc_zero(sizeof(struct _attributes)*locator->attributesSize);
|
locator->attributes = heap_alloc_zero(sizeof(struct _attributes)*locator->attr_alloc_count);
|
||||||
if(!locator->attributes)
|
if(!locator->attributes)
|
||||||
{
|
{
|
||||||
ISAXXMLReader_Release(&reader->ISAXXMLReader_iface);
|
ISAXXMLReader_Release(&reader->ISAXXMLReader_iface);
|
||||||
|
|
Loading…
Reference in a new issue