From: Daniel Stenberg Date: Thu, 4 Dec 2025 15:39:22 +0000 (+0100) Subject: bufref: add Curl_bufref_dup that returns a strdup()ed version X-Git-Tag: rc-8_18_0-1~22 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d517efe5bd1dbcc6faafe6b0c123521f96d955b0;p=thirdparty%2Fcurl.git bufref: add Curl_bufref_dup that returns a strdup()ed version Cleans up a common pattern somewhat. Implemented as a macro. Closes #19834 --- diff --git a/docs/internals/BUFREF.md b/docs/internals/BUFREF.md index cd101f08a9..46f7ee6b3e 100644 --- a/docs/internals/BUFREF.md +++ b/docs/internals/BUFREF.md @@ -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. diff --git a/lib/bufref.h b/lib/bufref.h index abf1d617df..5d331adbdf 100644 --- a/lib/bufref.h +++ b/lib/bufref.h @@ -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 diff --git a/lib/easy.c b/lib/easy.c index 68ec3000f8..bdda114850 100644 --- a/lib/easy.c +++ b/lib/easy.c @@ -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; diff --git a/lib/http.c b/lib/http.c index afe37da5b6..ba42f19ff0 100644 --- a/lib/http.c +++ b/lib/http.c @@ -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; diff --git a/lib/multi.c b/lib/multi.c index f87ee012d8..531ec6605e 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -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; } diff --git a/lib/transfer.c b/lib/transfer.c index 34f0698ebd..11e7e6e793 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -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;