]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
lib: add and use Curl_strndup()
authorDaniel Stenberg <daniel@haxx.se>
Thu, 2 Nov 2023 12:47:15 +0000 (13:47 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 2 Nov 2023 19:35:20 +0000 (20:35 +0100)
The Curl_strndup() function is similar to memdup(), but copies 'n' bytes
then adds a terminating null byte ('\0').

Closes #12251

lib/altsvc.c
lib/cookie.c
lib/formdata.c
lib/hsts.c
lib/strdup.c
lib/strdup.h
lib/urlapi.c

index 22b0b69c77f625b1af46aecf9294fc510b3c761e..d92dd909d6ff53cef7366b323caeffd77b45928e 100644 (file)
@@ -123,15 +123,13 @@ static struct altsvc *altsvc_createid(const char *srchost,
     dlen -= 2;
   }
 
-  as->src.host = Curl_memdup(srchost, hlen + 1);
+  as->src.host = Curl_strndup(srchost, hlen);
   if(!as->src.host)
     goto error;
-  as->src.host[hlen] = 0;
 
-  as->dst.host = Curl_memdup(dsthost, dlen + 1);
+  as->dst.host = Curl_strndup(dsthost, dlen);
   if(!as->dst.host)
     goto error;
-  as->dst.host[dlen] = 0;
 
   as->src.alpnid = srcalpnid;
   as->dst.alpnid = dstalpnid;
index af01203a9a26c48b177d33edc15c1bea297a585a..35502b7a11f961d583a2bec9674d2bd97851a0b1 100644 (file)
@@ -365,9 +365,7 @@ static void strstore(char **str, const char *newstr, size_t len)
   DEBUGASSERT(newstr);
   DEBUGASSERT(str);
   free(*str);
-  *str = Curl_memdup(newstr, len + 1);
-  if(*str)
-    (*str)[len] = 0;
+  *str = Curl_strndup(newstr, len);
 }
 
 /*
index 9781029555cfd81113485dabb5213593c5176a93..05dc9b53d680701d36030b0f7dd2fa3d971bd1ae 100644 (file)
@@ -603,9 +603,9 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
            app passed in a bad combo, so we better check for that first. */
         if(form->name) {
           /* copy name (without strdup; possibly not null-terminated) */
-          form->name = Curl_memdup(form->name, form->namelength?
-                                   form->namelength:
-                                   strlen(form->name) + 1);
+          form->name = Curl_strndup(form->name, form->namelength?
+                                    form->namelength:
+                                    strlen(form->name));
         }
         if(!form->name) {
           return_value = CURL_FORMADD_MEMORY;
index 6fac2b7c043d003036e02700e3c600b4d79e2354..42cc31569286c0322396f345ea6a3959a11717af 100644 (file)
@@ -135,12 +135,11 @@ static CURLcode hsts_create(struct hsts *h,
   if(!sts)
     return CURLE_OUT_OF_MEMORY;
 
-  duphost = Curl_memdup(hostname, hlen + 1);
+  duphost = Curl_strndup(hostname, hlen);
   if(!duphost) {
     free(sts);
     return CURLE_OUT_OF_MEMORY;
   }
-  duphost[hlen] = 0; /* might remove a dot */
 
   sts->host = duphost;
   sts->expires = expires;
index 07a61391ae579d0c8b88131aa1549b2cd11c5516..5336da7c6381c7002a61a8a527045d157e63eab6 100644 (file)
@@ -99,6 +99,24 @@ void *Curl_memdup(const void *src, size_t length)
   return buffer;
 }
 
+/***************************************************************************
+ *
+ * Curl_strndup(source, length)
+ *
+ * Copies the 'source' data to a newly allocated buffer (that is
+ * returned). Copies 'length' bytes then adds a null terminator.
+ *
+ * Returns the new pointer or NULL on failure.
+ *
+ ***************************************************************************/
+void *Curl_strndup(const void *src, size_t length)
+{
+  char *b = Curl_memdup(src, length + 1);
+  if(b)
+    b[length] = 0;
+  return b;
+}
+
 /***************************************************************************
  *
  * Curl_saferealloc(ptr, size)
index c3430b54d564f85d201239f43da8be250fba24be..83dd4b9b53f675fb07c31c1735d28a3573ff6122 100644 (file)
@@ -33,5 +33,6 @@ wchar_t* Curl_wcsdup(const wchar_t* src);
 #endif
 void *Curl_memdup(const void *src, size_t buffer_length);
 void *Curl_saferealloc(void *ptr, size_t size);
+void *Curl_strndup(const void *src, size_t length);
 
 #endif /* HEADER_CURL_STRDUP_H */
index 032859f88daa660a466069e924cab942eceb0309..4f941a8e20ea185444c84bd2a618ee2391d7111f 100644 (file)
@@ -1231,7 +1231,7 @@ static CURLUcode parseurl(const char *url, CURLU *u, unsigned int flags)
         u->fragment = Curl_dyn_ptr(&enc);
       }
       else {
-        u->fragment = Curl_memdup(fragment + 1, fraglen);
+        u->fragment = Curl_strndup(fragment + 1, fraglen - 1);
         if(!u->fragment) {
           result = CURLUE_OUT_OF_MEMORY;
           goto fail;
@@ -1260,12 +1260,11 @@ static CURLUcode parseurl(const char *url, CURLU *u, unsigned int flags)
         u->query = Curl_dyn_ptr(&enc);
       }
       else {
-        u->query = Curl_memdup(query + 1, qlen);
+        u->query = Curl_strndup(query + 1, qlen - 1);
         if(!u->query) {
           result = CURLUE_OUT_OF_MEMORY;
           goto fail;
         }
-        u->query[qlen - 1] = 0;
       }
     }
     else {
@@ -1295,12 +1294,11 @@ static CURLUcode parseurl(const char *url, CURLU *u, unsigned int flags)
   }
   else {
     if(!u->path) {
-      u->path = Curl_memdup(path, pathlen + 1);
+      u->path = Curl_strndup(path, pathlen);
       if(!u->path) {
         result = CURLUE_OUT_OF_MEMORY;
         goto fail;
       }
-      u->path[pathlen] = 0;
       path = u->path;
     }
     else if(flags & CURLU_URLENCODE)
@@ -1594,7 +1592,7 @@ CURLUcode curl_url_get(const CURLU *u, CURLUPart what,
   if(ptr) {
     size_t partlen = strlen(ptr);
     size_t i = 0;
-    *part = Curl_memdup(ptr, partlen + 1);
+    *part = Curl_strndup(ptr, partlen);
     if(!*part)
       return CURLUE_OUT_OF_MEMORY;
     if(plusdecode) {