]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
bufref: add Curl_bufref_dup that returns a strdup()ed version
authorDaniel Stenberg <daniel@haxx.se>
Thu, 4 Dec 2025 15:39:22 +0000 (16:39 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 4 Dec 2025 18:04:19 +0000 (19:04 +0100)
Cleans up a common pattern somewhat. Implemented as a macro.

Closes #19834

docs/internals/BUFREF.md
lib/bufref.h
lib/easy.c
lib/http.c
lib/multi.c
lib/transfer.c

index cd101f08a9a3a30598401ccb2592a55670ca6030..46f7ee6b3e500069d584b6ba9b39143d22ed69ff 100644 (file)
@@ -93,3 +93,12 @@ size_t Curl_bufref_len(const struct bufref *br);
 ```
 
 Returns the stored length of the referenced buffer.
+
+## `dup`
+
+```c
+char *Curl_bufref_dup(const struct bufref *br);
+```
+
+Returns a strdup() version of the buffer. Note that this assumes that the
+bufref is null terminated.
index abf1d617df5a7640a3aba7fec38b85a54a49ad22..5d331adbdf0f94732e696e0171c7619b2d5e0e90 100644 (file)
@@ -45,4 +45,7 @@ size_t Curl_bufref_len(const struct bufref *br);
 CURLcode Curl_bufref_memdup0(struct bufref *br, const void *ptr, size_t len);
 void Curl_bufref_free(struct bufref *br);
 
+/* return a strdup() version of the buffer */
+#define Curl_bufref_dup(x) curlx_strdup(Curl_bufref_ptr(x))
+
 #endif
index 68ec3000f85631047319d11ab1176a46d93a61e8..bdda114850adde3410a6369a843938a701d22e32 100644 (file)
@@ -1019,14 +1019,14 @@ CURL *curl_easy_duphandle(CURL *d)
 
   if(Curl_bufref_ptr(&data->state.url)) {
     Curl_bufref_set(&outcurl->state.url,
-                    curlx_strdup(Curl_bufref_ptr(&data->state.url)), 0,
+                    Curl_bufref_dup(&data->state.url), 0,
                     curl_free);
     if(!Curl_bufref_ptr(&outcurl->state.url))
       goto fail;
   }
   if(Curl_bufref_ptr(&data->state.referer)) {
     Curl_bufref_set(&outcurl->state.referer,
-                    curlx_strdup(Curl_bufref_ptr(&data->state.referer)), 0,
+                    Curl_bufref_dup(&data->state.referer), 0,
                     curl_free);
     if(!Curl_bufref_ptr(&outcurl->state.referer))
       goto fail;
index afe37da5b66064bc2e1af6b88ae5222b4f8e7448..ba42f19ff0f943a4c811192264c475450d453bde 100644 (file)
@@ -612,7 +612,7 @@ CURLcode Curl_http_auth_act(struct Curl_easy *data)
        out in bug #2284386 */
     curlx_free(data->req.newurl);
     /* clone URL */
-    data->req.newurl = curlx_strdup(Curl_bufref_ptr(&data->state.url));
+    data->req.newurl = Curl_bufref_dup(&data->state.url);
     if(!data->req.newurl)
       return CURLE_OUT_OF_MEMORY;
   }
@@ -626,7 +626,7 @@ CURLcode Curl_http_auth_act(struct Curl_easy *data)
     if((data->state.httpreq != HTTPREQ_GET) &&
        (data->state.httpreq != HTTPREQ_HEAD)) {
       /* clone URL */
-      data->req.newurl = curlx_strdup(Curl_bufref_ptr(&data->state.url));
+      data->req.newurl = Curl_bufref_dup(&data->state.url);
       if(!data->req.newurl)
         return CURLE_OUT_OF_MEMORY;
       data->state.authhost.done = TRUE;
@@ -912,7 +912,7 @@ static CURLcode auth_spnego(struct Curl_easy *data,
         &conn->http_negotiate_state;
       if(!result) {
         curlx_free(data->req.newurl);
-        data->req.newurl = curlx_strdup(Curl_bufref_ptr(&data->state.url));
+        data->req.newurl = Curl_bufref_dup(&data->state.url);
         if(!data->req.newurl)
           return CURLE_OUT_OF_MEMORY;
         data->state.authproblem = FALSE;
@@ -4051,7 +4051,7 @@ static CURLcode http_on_response(struct Curl_easy *data,
             data->state.disableexpect = TRUE;
             Curl_req_abort_sending(data);
             DEBUGASSERT(!data->req.newurl);
-            data->req.newurl = curlx_strdup(Curl_bufref_ptr(&data->state.url));
+            data->req.newurl = Curl_bufref_dup(&data->state.url);
             if(!data->req.newurl) {
               result = CURLE_OUT_OF_MEMORY;
               goto out;
index f87ee012d86b89766de538904df88b0bc3c5977a..531ec6605e46f40b2fd5782c99f3b46fd8a9be1f 100644 (file)
@@ -2011,7 +2011,7 @@ static CURLMcode state_performing(struct Curl_easy *data,
       data->state.errorbuf = FALSE;
       if(!newurl)
         /* typically for HTTP_1_1_REQUIRED error on first flight */
-        newurl = curlx_strdup(Curl_bufref_ptr(&data->state.url));
+        newurl = Curl_bufref_dup(&data->state.url);
       if(!newurl) {
         result = CURLE_OUT_OF_MEMORY;
       }
index 34f0698ebd754962bceeb0191c2c2a587e81ec13..11e7e6e793c3ca317ab04efb309d42da03f4b460 100644 (file)
@@ -671,7 +671,7 @@ CURLcode Curl_retry_request(struct Curl_easy *data, char **url)
     }
     infof(data, "Connection died, retrying a fresh connect (retry count: %d)",
           data->state.retrycount);
-    *url = curlx_strdup(Curl_bufref_ptr(&data->state.url));
+    *url = Curl_bufref_dup(&data->state.url);
     if(!*url)
       return CURLE_OUT_OF_MEMORY;