[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