Module: wine Branch: master Commit: 66b5dd71e9627a4f51e4239a809e68aaa3158693 URL: http://source.winehq.org/git/wine.git/?a=commit;h=66b5dd71e9627a4f51e4239a80...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Thu Jul 31 23:07:10 2014 +0400
msxml3/saxreader: Fix attributes array growing size.
---
dlls/msxml3/saxreader.c | 65 ++++++++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 30 deletions(-)
diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c index 0d58db3..a926fed 100644 --- a/dlls/msxml3/saxreader.c +++ b/dlls/msxml3/saxreader.c @@ -301,8 +301,8 @@ typedef struct struct list elements;
BSTR namespaceUri; - int attributesSize; - int nb_attributes; + int attr_alloc_count; + int attr_count; struct _attributes { BSTR szLocalname; @@ -1106,11 +1106,16 @@ static HRESULT WINAPI isaxattributes_getLength( { saxlocator *This = impl_from_ISAXAttributes( iface );
- *length = This->nb_attributes; + *length = This->attr_count; TRACE("Length set to %d\n", *length); 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( ISAXAttributes* iface, int index, @@ -1120,7 +1125,7 @@ static HRESULT WINAPI isaxattributes_getURI( saxlocator *This = impl_from_ISAXAttributes( iface ); 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;
*size = SysStringLen(This->attributes[index].szURI); @@ -1133,36 +1138,36 @@ static HRESULT WINAPI isaxattributes_getURI(
static HRESULT WINAPI isaxattributes_getLocalName( ISAXAttributes* iface, - int nIndex, + int index, const WCHAR **pLocalName, int *pLocalNameLength) { 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;
- *pLocalNameLength = SysStringLen(This->attributes[nIndex].szLocalname); - *pLocalName = This->attributes[nIndex].szLocalname; + *pLocalNameLength = SysStringLen(This->attributes[index].szLocalname); + *pLocalName = This->attributes[index].szLocalname;
return S_OK; }
static HRESULT WINAPI isaxattributes_getQName( ISAXAttributes* iface, - int nIndex, + int index, const WCHAR **pQName, int *pQNameLength) { 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;
- *pQNameLength = SysStringLen(This->attributes[nIndex].szQName); - *pQName = This->attributes[nIndex].szQName; + *pQNameLength = SysStringLen(This->attributes[index].szQName); + *pQName = This->attributes[index].szQName;
return S_OK; } @@ -1180,7 +1185,7 @@ static HRESULT WINAPI isaxattributes_getName( saxlocator *This = impl_from_ISAXAttributes( iface ); 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 || !QName || !pQNameLength) return E_POINTER;
@@ -1211,7 +1216,7 @@ static HRESULT WINAPI isaxattributes_getIndexFromName(
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) || cocalNameLength!=SysStringLen(This->attributes[i].szLocalname)) @@ -1243,7 +1248,7 @@ static HRESULT WINAPI isaxattributes_getIndexFromQName( if(!pQName || !index) return E_POINTER; 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(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 ); 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;
*nValue = SysStringLen(This->attributes[index].szValue); @@ -1423,7 +1428,7 @@ static void free_attribute_values(saxlocator *locator) { int i;
- for (i = 0; i < locator->nb_attributes; i++) + for (i = 0; i < locator->attr_count; i++) { SysFreeString(locator->attributes[i].szLocalname); locator->attributes[i].szLocalname = NULL; @@ -1450,19 +1455,19 @@ static HRESULT SAXAttributes_populate(saxlocator *locator, if ((locator->saxreader->features & NamespacePrefixes) == 0) nb_namespaces = 0;
- locator->nb_attributes = nb_namespaces + nb_attributes; - if(locator->nb_attributes > locator->attributesSize) + locator->attr_count = nb_namespaces + nb_attributes; + 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)); if(!attrs) { free_attribute_values(locator); - locator->nb_attributes = 0; + locator->attr_count = 0; return E_OUTOFMEMORY; } locator->attributes = attrs; - locator->attributesSize = new_size; + locator->attr_alloc_count = new_size; } else { @@ -1706,7 +1711,7 @@ static void libxmlEndElementNS( if (!saxreader_has_handler(This, SAXContentHandler)) { free_attribute_values(This); - This->nb_attributes = 0; + This->attr_count = 0; free_element_entry(element); return; } @@ -1728,7 +1733,7 @@ static void libxmlEndElementNS( element->qname, SysStringLen(element->qname));
free_attribute_values(This); - This->nb_attributes = 0; + This->attr_count = 0;
if (sax_callback_failed(This, hr)) { @@ -2326,7 +2331,7 @@ static ULONG WINAPI isaxlocator_Release( SysFreeString(This->systemId); 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].szValue); @@ -2462,9 +2467,9 @@ static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator, B return E_OUTOFMEMORY; }
- locator->attributesSize = 8; - locator->nb_attributes = 0; - locator->attributes = heap_alloc_zero(sizeof(struct _attributes)*locator->attributesSize); + locator->attr_alloc_count = 8; + locator->attr_count = 0; + locator->attributes = heap_alloc_zero(sizeof(struct _attributes)*locator->attr_alloc_count); if(!locator->attributes) { ISAXXMLReader_Release(&reader->ISAXXMLReader_iface);