[4/5] webservices: Always create a copy of strings to insert in the dictionary.
Hans Leidekker
hans at codeweavers.com
Tue Oct 3 09:14:44 CDT 2017
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
dlls/webservices/channel.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/dlls/webservices/channel.c b/dlls/webservices/channel.c
index ef37095c00..92569fd543 100644
--- a/dlls/webservices/channel.c
+++ b/dlls/webservices/channel.c
@@ -1208,14 +1208,24 @@ static HRESULT CALLBACK dict_cb( void *state, const WS_XML_STRING *str, BOOL *fo
{
struct dictionary *dict = state;
HRESULT hr = S_OK;
+ BYTE *bytes;
int index;
- if ((index = find_string( dict, str->bytes, str->length, id )) == -1 ||
- (hr = insert_string( dict, str->bytes, str->length, index, id )) == S_OK)
+ if ((index = find_string( dict, str->bytes, str->length, id )) == -1)
+ {
+ *found = TRUE;
+ return S_OK;
+ }
+
+ if (!(bytes = heap_alloc( str->length ))) return E_OUTOFMEMORY;
+ memcpy( bytes, str->bytes, str->length );
+ if ((hr = insert_string( dict, bytes, str->length, index, id )) == S_OK)
{
*found = TRUE;
return S_OK;
}
+ heap_free( bytes );
+
*found = FALSE;
return hr;
}
@@ -1672,6 +1682,7 @@ static HRESULT build_dict( const BYTE *buf, ULONG buflen, struct dictionary *dic
}
if ((hr = insert_string( dict, bytes, size, index, NULL )) != S_OK)
{
+ heap_free( bytes );
clear_dict( dict );
return hr;
}
--
2.11.0
More information about the wine-patches
mailing list