]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
slist.c, slist.h, cookie.c: new internal procedure Curl_slist_append_nodup()
authorPatrick Monnerat <pm@datasphere.ch>
Mon, 15 Jul 2013 14:53:43 +0000 (16:53 +0200)
committerPatrick Monnerat <pm@datasphere.ch>
Mon, 15 Jul 2013 14:53:43 +0000 (16:53 +0200)
lib/cookie.c
lib/slist.c
lib/slist.h

index fc918136a0006b233673ca1b0c954a8749c0c2de..b6790677fdbf41dee9957234c3e4c7091e05e2b6 100644 (file)
@@ -89,6 +89,7 @@ Example set of cookies:
 #include "strequal.h"
 #include "strtok.h"
 #include "sendf.h"
+#include "slist.h"
 #include "curl_memory.h"
 #include "share.h"
 #include "strtoofft.h"
@@ -1232,9 +1233,9 @@ struct curl_slist *Curl_cookie_list(struct SessionHandle *data)
       curl_slist_free_all(list);
       return NULL;
     }
-    beg = curl_slist_append(list, line);
-    free(line);
+    beg = Curl_slist_append_nodup(list, line);
     if(!beg) {
+      free(line);
       curl_slist_free_all(list);
       return NULL;
     }
index 92c699ec965f73fa9b613341b5f38daff8015b97..8e52c70611bdefb3d8f21da86b42c3ad8abdc572 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2013, 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
@@ -46,41 +46,58 @@ static struct curl_slist *slist_get_last(struct curl_slist *list)
 }
 
 /*
- * curl_slist_append() appends a string to the linked list. It always returns
+ * Curl_slist_append_nodup() appends a string to the linked list. Rather than
+ * copying the string in dynamic storage, it takes its ownership. The string
+ * should have been malloc()ated. Curl_slist_append_nodup always returns
  * the address of the first record, so that you can use this function as an
- * initialization function as well as an append function. If you find this
- * bothersome, then simply create a separate _init function and call it
- * appropriately from within the program.
+ * initialization function as well as an append function.
+ * If an error occurs, NULL is returned and the string argument is NOT
+ * released.
  */
-struct curl_slist *curl_slist_append(struct curl_slist *list,
-                                     const char *data)
+struct curl_slist *Curl_slist_append_nodup(struct curl_slist *list, char *data)
 {
   struct curl_slist     *last;
   struct curl_slist     *new_item;
 
+  if(!data)
+    return NULL;
+
   new_item = malloc(sizeof(struct curl_slist));
-  if(new_item) {
-    char *dupdata = strdup(data);
-    if(dupdata) {
-      new_item->next = NULL;
-      new_item->data = dupdata;
-    }
-    else {
-      free(new_item);
-      return NULL;
-    }
-  }
-  else
+  if(!new_item)
     return NULL;
 
-  if(list) {
+  new_item->next = NULL;
+  new_item->data = data;
+
+  /* if this is the first item, then new_item *is* the list */
+  if(!list)
+    return new_item;
+
     last = slist_get_last(list);
     last->next = new_item;
     return list;
   }
 
-  /* if this is the first item, then new_item *is* the list */
-  return new_item;
+/*
+ * curl_slist_append() appends a string to the linked list. It always returns
+ * the address of the first record, so that you can use this function as an
+ * initialization function as well as an append function. If you find this
+ * bothersome, then simply create a separate _init function and call it
+ * appropriately from within the program.
+ */
+struct curl_slist *curl_slist_append(struct curl_slist *list,
+                                     const char *data)
+{
+  char *dupdata = strdup(data);
+
+  if(!data)
+    return NULL;
+
+  list = Curl_slist_append_nodup(list, dupdata);
+  if(!list)
+    free(dupdata);
+
+  return list;
 }
 
 /*
index aede1f04189c666cc027f539ee8709678113ad90..ea7dcc48b6741067616d409ff275517cd4bd1cf0 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2013, 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
  */
 struct curl_slist *Curl_slist_duplicate(struct curl_slist *inlist);
 
+/*
+ * Curl_slist_append_nodup() takes ownership of the given string and appends
+ * it to the list.
+ */
+struct curl_slist *Curl_slist_append_nodup(struct curl_slist *list,
+                                           char *data);
+
 #endif /* HEADER_CURL_SLIST_H */