]> granicus.if.org Git - curl/commitdiff
OS400: handle memory error in list conversion
authorDaniel Gustafsson <daniel@yesql.se>
Thu, 13 Dec 2018 09:15:00 +0000 (10:15 +0100)
committerDaniel Gustafsson <daniel@yesql.se>
Thu, 13 Dec 2018 09:15:00 +0000 (10:15 +0100)
Curl_slist_append_nodup() returns NULL when it fails to create a new
item for the specified list, and since the coding here reassigned the
new list on top of the old list it would result in a dangling pointer
and lost memory. Also, in case we hit an allocation failure at some
point during the conversion, with allocation succeeding again on the
subsequent call(s) we will return a truncated list around the malloc
failure point. Fix by assigning to a temporary list pointer, which can
be checked (which is the common pattern for slist appending), and free
all the resources on allocation failure.

Closes #3372
Reviewed-by: Daniel Stenberg <daniel@haxx.se>
packages/OS400/ccsidcurl.c

index b1d3ba845d8956fa731c92a24eedbf83016f4078..ca711d0c01406de8f28bf1b585c1715b972fdc64 100644 (file)
@@ -219,13 +219,20 @@ slist_convert(int dccsid, struct curl_slist * from, int sccsid)
   struct curl_slist * to = (struct curl_slist *) NULL;
 
   for(; from; from = from->next) {
+    struct curl_slist *nl;
     char * cp = dynconvert(dccsid, from->data, -1, sccsid);
 
     if(!cp) {
       curl_slist_free_all(to);
       return (struct curl_slist *) NULL;
     }
-    to = Curl_slist_append_nodup(to, cp);
+    nl = Curl_slist_append_nodup(to, cp);
+    if(!nl) {
+      curl_slist_free_all(to);
+      free(cp);
+      return NULL;
+    }
+    to = nl;
   }
   return to;
 }