]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
lib1591: free memory properly on OOM, in the trailers callback
authorDaniel Stenberg <daniel@haxx.se>
Sun, 15 Dec 2019 11:33:24 +0000 (12:33 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Sun, 15 Dec 2019 17:19:01 +0000 (18:19 +0100)
Detected by torture tests.

Closes #4720

tests/libtest/lib1591.c

index f0c6b4cb7657a7e5ac8c9e2681ab022a2a10fb59..cc1c5b22846ee4de0aceb90ab6995ae8e96d9ec5 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -50,12 +50,25 @@ static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
   return amount;
 }
 
+/*
+ * carefully not leak memory on OOM
+ */
 static int trailers_callback(struct curl_slist **list, void *userdata)
 {
+  struct curl_slist *nlist = NULL;
+  struct curl_slist *nlist2 = NULL;
   (void)userdata;
-  *list = curl_slist_append(*list, "my-super-awesome-trailer: trail1");
-  *list = curl_slist_append(*list, "my-other-awesome-trailer: trail2");
-  return CURL_TRAILERFUNC_OK;
+  nlist = curl_slist_append(*list, "my-super-awesome-trailer: trail1");
+  if(nlist)
+    nlist2 = curl_slist_append(nlist, "my-other-awesome-trailer: trail2");
+  if(nlist2) {
+    *list = nlist2;
+    return CURL_TRAILERFUNC_OK;
+  }
+  else {
+    curl_slist_free_all(nlist);
+    return CURL_TRAILERFUNC_ABORT;
+  }
 }
 
 int test(char *URL)