aboutsummaryrefslogtreecommitdiff
path: root/packages/OS400/ccsidcurl.c
diff options
context:
space:
mode:
authorDaniel Gustafsson <daniel@yesql.se>2018-12-13 10:15:00 +0100
committerDaniel Gustafsson <daniel@yesql.se>2018-12-13 10:15:00 +0100
commita58b27740fd78fee88b35104fa71b7019280ccff (patch)
tree0dc220787d954029b296d5797d161d609aa42f22 /packages/OS400/ccsidcurl.c
parent7a09b52c98ac8d840a8a9907b1a1d9a9e684bcf5 (diff)
OS400: handle memory error in list conversion
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>
Diffstat (limited to 'packages/OS400/ccsidcurl.c')
-rw-r--r--packages/OS400/ccsidcurl.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/packages/OS400/ccsidcurl.c b/packages/OS400/ccsidcurl.c
index b1d3ba845..ca711d0c0 100644
--- a/packages/OS400/ccsidcurl.c
+++ b/packages/OS400/ccsidcurl.c
@@ -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;
}