webservices: Always create a copy of strings to insert in the dictionary.

Signed-off-by: Hans Leidekker <hans@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Hans Leidekker 2017-10-03 16:14:44 +02:00 committed by Alexandre Julliard
parent 0567952c70
commit 3076f5e3fb
1 changed files with 13 additions and 2 deletions

View File

@ -1208,14 +1208,24 @@ static HRESULT CALLBACK dict_cb( void *state, const WS_XML_STRING *str, BOOL *fo
{ {
struct dictionary *dict = state; struct dictionary *dict = state;
HRESULT hr = S_OK; HRESULT hr = S_OK;
BYTE *bytes;
int index; int index;
if ((index = find_string( dict, str->bytes, str->length, id )) == -1 || if ((index = find_string( dict, str->bytes, str->length, id )) == -1)
(hr = insert_string( dict, str->bytes, str->length, index, id )) == S_OK)
{ {
*found = TRUE; *found = TRUE;
return S_OK; 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; *found = FALSE;
return hr; 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) if ((hr = insert_string( dict, bytes, size, index, NULL )) != S_OK)
{ {
heap_free( bytes );
clear_dict( dict ); clear_dict( dict );
return hr; return hr;
} }