← Commit list

d517efe5bd

Daniel Stenberg
Daniel Stenberg
2025-12-04
SUCCESS Duration: 217s

Subject

bufref: add Curl_bufref_dup that returns a strdup()ed version

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

docs/internals/BUFREF.md+9 -0
@@ -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.
lib/bufref.h+3 -0
@@ -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
lib/easy.c+2 -2
@@ -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;
lib/http.c+4 -4
@@ -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;
lib/multi.c+1 -1
@@ -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;
}
lib/transfer.c+1 -1
@@ -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;