From: Patrick Monnerat Date: Wed, 3 Dec 2025 22:15:18 +0000 (+0100) Subject: lib: turn state.url into a struct bufref X-Git-Tag: rc-8_18_0-1~27 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=36542b734966fce2ce5689d689a0e4922a103e50;p=thirdparty%2Fcurl.git lib: turn state.url into a struct bufref Closes #19827 --- diff --git a/lib/cookie.c b/lib/cookie.c index e3cf8e4e0c..dff5198c11 100644 --- a/lib/cookie.c +++ b/lib/cookie.c @@ -40,6 +40,7 @@ #include "rename.h" #include "strdup.h" #include "llist.h" +#include "bufref.h" #include "curlx/strparse.h" static void strstore(char **str, const char *newstr, size_t len); @@ -1622,7 +1623,7 @@ void Curl_flush_cookies(struct Curl_easy *data, bool cleanup) set), as otherwise the cookies were not completely initialized and there might be cookie files that were not loaded so saving the file is the wrong thing. */ - if(data->set.str[STRING_COOKIEJAR] && data->state.url) { + if(data->set.str[STRING_COOKIEJAR] && Curl_bufref_ptr(&data->state.url)) { /* if we have a destination file for all the cookies to get dumped to */ CURLcode result = cookie_output(data, data->cookies, data->set.str[STRING_COOKIEJAR]); diff --git a/lib/curl_rtmp.c b/lib/curl_rtmp.c index 1eebbb5b3f..e0597cdcca 100644 --- a/lib/curl_rtmp.c +++ b/lib/curl_rtmp.c @@ -33,6 +33,7 @@ #include "curlx/nonblock.h" /* for curlx_nonblock */ #include "progress.h" /* for Curl_pgrsSetUploadSize */ #include "transfer.h" +#include "bufref.h" #include "curlx/warnless.h" #include #include @@ -233,7 +234,7 @@ static CURLcode rtmp_setup_connection(struct Curl_easy *data, RTMP_Init(r); RTMP_SetBufferMS(r, DEF_BUFTIME); - if(!RTMP_SetupURL(r, data->state.url)) + if(!RTMP_SetupURL(r, CURL_UNCONST(Curl_bufref_ptr(&data->state.url)))) /* rtmp_conn_dtor() performs the cleanup */ return CURLE_URL_MALFORMAT; return CURLE_OK; diff --git a/lib/easy.c b/lib/easy.c index d2f6c36c0d..c18fdd09bf 100644 --- a/lib/easy.c +++ b/lib/easy.c @@ -75,6 +75,7 @@ #include "system_win32.h" #include "http2.h" #include "curlx/dynbuf.h" +#include "bufref.h" #include "altsvc.h" #include "hsts.h" @@ -975,6 +976,7 @@ CURL *curl_easy_duphandle(CURL *d) Curl_hash_init(&outcurl->meta_hash, 23, Curl_hash_str, curlx_str_key_compare, dupeasy_meta_freeentry); curlx_dyn_init(&outcurl->state.headerb, CURL_MAX_HTTP_HEADER); + Curl_bufref_init(&outcurl->state.url); Curl_netrc_init(&outcurl->state.netrc); /* the connection pool is setup on demand */ @@ -1014,12 +1016,10 @@ CURL *curl_easy_duphandle(CURL *d) } #endif - if(data->state.url) { - outcurl->state.url = curlx_strdup(data->state.url); - if(!outcurl->state.url) - goto fail; - outcurl->state.url_alloc = TRUE; - } + if(Curl_bufref_ptr(&data->state.url)) + Curl_bufref_set(&outcurl->state.url, + curlx_strdup(Curl_bufref_ptr(&data->state.url)), 0, + curl_free); if(data->state.referer) { outcurl->state.referer = curlx_strdup(data->state.referer); diff --git a/lib/getinfo.c b/lib/getinfo.c index 13e9622d33..59dc198777 100644 --- a/lib/getinfo.c +++ b/lib/getinfo.c @@ -32,6 +32,7 @@ #include "vtls/vtls.h" #include "connect.h" /* Curl_getconnectinfo() */ #include "progress.h" +#include "bufref.h" #include "curlx/strparse.h" /* @@ -91,8 +92,10 @@ static CURLcode getinfo_char(struct Curl_easy *data, CURLINFO info, const char **param_charp) { switch(info) { - case CURLINFO_EFFECTIVE_URL: - *param_charp = data->state.url ? data->state.url : ""; + case CURLINFO_EFFECTIVE_URL: { + const char *s = Curl_bufref_ptr(&data->state.url); + *param_charp = s ? s : ""; + } break; case CURLINFO_EFFECTIVE_METHOD: { const char *m = data->set.str[STRING_CUSTOMREQUEST]; diff --git a/lib/http.c b/lib/http.c index 3178ca59e9..ae7458572b 100644 --- a/lib/http.c +++ b/lib/http.c @@ -84,6 +84,7 @@ #include "altsvc.h" #include "hsts.h" #include "ws.h" +#include "bufref.h" #include "curl_ctype.h" #include "curlx/strparse.h" @@ -610,7 +611,8 @@ CURLcode Curl_http_auth_act(struct Curl_easy *data) we must make sure to free it before allocating a new one. As figured out in bug #2284386 */ curlx_free(data->req.newurl); - data->req.newurl = curlx_strdup(data->state.url); /* clone URL */ + /* clone URL */ + data->req.newurl = curlx_strdup(Curl_bufref_ptr(&data->state.url)); if(!data->req.newurl) return CURLE_OUT_OF_MEMORY; } @@ -623,7 +625,8 @@ CURLcode Curl_http_auth_act(struct Curl_easy *data) we did not try HEAD or GET */ if((data->state.httpreq != HTTPREQ_GET) && (data->state.httpreq != HTTPREQ_HEAD)) { - data->req.newurl = curlx_strdup(data->state.url); /* clone URL */ + /* clone URL */ + data->req.newurl = curlx_strdup(Curl_bufref_ptr(&data->state.url)); if(!data->req.newurl) return CURLE_OUT_OF_MEMORY; data->state.authhost.done = TRUE; @@ -909,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(data->state.url); + data->req.newurl = curlx_strdup(Curl_bufref_ptr(&data->state.url)); if(!data->req.newurl) return CURLE_OUT_OF_MEMORY; data->state.authproblem = FALSE; @@ -1243,7 +1246,8 @@ CURLcode Curl_http_follow(struct Curl_easy *data, const char *newurl, if(!u) return CURLE_OUT_OF_MEMORY; - uc = curl_url_set(u, CURLUPART_URL, data->state.url, 0); + uc = curl_url_set(u, CURLUPART_URL, + Curl_bufref_ptr(&data->state.url), 0); if(!uc) uc = curl_url_set(u, CURLUPART_FRAGMENT, NULL, 0); if(!uc) @@ -1365,13 +1369,9 @@ CURLcode Curl_http_follow(struct Curl_easy *data, const char *newurl, if(disallowport) data->state.allow_port = FALSE; - if(data->state.url_alloc) - Curl_safefree(data->state.url); - - data->state.url = follow_url; - data->state.url_alloc = TRUE; + Curl_bufref_set(&data->state.url, follow_url, 0, curl_free); rewind_result = Curl_req_soft_reset(&data->req, data); - infof(data, "Issue another request to this URL: '%s'", data->state.url); + infof(data, "Issue another request to this URL: '%s'", follow_url); if((data->set.http_follow_mode == CURLFOLLOW_FIRSTONLY) && data->set.str[STRING_CUSTOMREQUEST] && !data->state.http_ignorecustom) { @@ -4054,7 +4054,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(data->state.url); + data->req.newurl = curlx_strdup(Curl_bufref_ptr(&data->state.url)); if(!data->req.newurl) { result = CURLE_OUT_OF_MEMORY; goto out; diff --git a/lib/http2.c b/lib/http2.c index a3ff8c8529..df38f82caf 100644 --- a/lib/http2.c +++ b/lib/http2.c @@ -44,6 +44,7 @@ #include "rand.h" #include "curlx/strparse.h" #include "transfer.h" +#include "bufref.h" #include "curlx/dynbuf.h" #include "curlx/warnless.h" #include "headers.h" @@ -920,10 +921,7 @@ fail: if(rc) return rc; - if(data->state.url_alloc) - curlx_free(data->state.url); - data->state.url_alloc = TRUE; - data->state.url = url; + Curl_bufref_set(&data->state.url, url, 0, curl_free); return 0; } @@ -2316,7 +2314,7 @@ static CURLcode h2_submit(struct h2_stream_ctx **pstream, size_t acc = 0, i; infof(data, "[HTTP/2] [%d] OPENED stream for %s", - stream_id, data->state.url); + stream_id, Curl_bufref_ptr(&data->state.url)); for(i = 0; i < nheader; ++i) { acc += nva[i].namelen + nva[i].valuelen; diff --git a/lib/ldap.c b/lib/ldap.c index 0911a9239a..b6ed43d904 100644 --- a/lib/ldap.c +++ b/lib/ldap.c @@ -89,6 +89,7 @@ #include "progress.h" #include "transfer.h" #include "curlx/strparse.h" +#include "bufref.h" #include "curl_ldap.h" #include "curlx/multibyte.h" #include "curlx/base64.h" @@ -338,10 +339,10 @@ static CURLcode ldap_do(struct Curl_easy *data, bool *done) *done = TRUE; /* unconditionally */ infof(data, "LDAP local: LDAP Vendor = %s ; LDAP Version = %d", LDAP_VENDOR_NAME, LDAP_VENDOR_VERSION); - infof(data, "LDAP local: %s", data->state.url); + infof(data, "LDAP local: %s", Curl_bufref_ptr(&data->state.url)); #ifdef HAVE_LDAP_URL_PARSE - rc = ldap_url_parse(data->state.url, &ludp); + rc = ldap_url_parse(Curl_bufref_ptr(&data->state.url), &ludp); #else rc = ldap_url_parse_low(data, conn, &ludp); #endif diff --git a/lib/multi.c b/lib/multi.c index b912f7a212..3086d61c74 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -53,6 +53,7 @@ #include "socketpair.h" #include "socks.h" #include "urlapi-int.h" +#include "bufref.h" /* initial multi->xfers table size for a full multi */ #define CURL_XFER_TABLE_SIZE 512 @@ -2006,7 +2007,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(data->state.url); + newurl = curlx_strdup(Curl_bufref_ptr(&data->state.url)); if(!newurl) { result = CURLE_OUT_OF_MEMORY; } @@ -4066,7 +4067,7 @@ static void multi_xfer_dump(struct Curl_multi *multi, uint32_t mid, ", url=%s\n", mid, (data->magic == CURLEASY_MAGIC_NUMBER) ? "GOOD" : "BAD!", - (void *)data, data->id, data->state.url); + (void *)data, data->id, Curl_bufref_ptr(&data->state.url)); } } diff --git a/lib/openldap.c b/lib/openldap.c index ba1a39181f..a1756e4279 100644 --- a/lib/openldap.c +++ b/lib/openldap.c @@ -52,6 +52,7 @@ #include "connect.h" #include "curl_sasl.h" #include "strcase.h" +#include "bufref.h" /* * Uncommenting this will enable the built-in debug logging of the openldap @@ -272,7 +273,7 @@ static CURLcode oldap_url_parse(struct Curl_easy *data, LDAPURLDesc **ludp) *ludp = NULL; if(!data->state.up.user && !data->state.up.password && !data->state.up.options) - rc = ldap_url_parse(data->state.url, ludp); + rc = ldap_url_parse(Curl_bufref_ptr(&data->state.url), ludp); if(rc != LDAP_URL_SUCCESS) { const char *msg = "url parsing problem"; @@ -988,7 +989,7 @@ static CURLcode oldap_do(struct Curl_easy *data, bool *done) if(!li) return CURLE_FAILED_INIT; - infof(data, "LDAP local: %s", data->state.url); + infof(data, "LDAP local: %s", Curl_bufref_ptr(&data->state.url)); result = oldap_url_parse(data, &lud); if(result) diff --git a/lib/setopt.c b/lib/setopt.c index 0a377be1f1..bcaf3fc2ae 100644 --- a/lib/setopt.c +++ b/lib/setopt.c @@ -54,6 +54,7 @@ #include "tftp.h" #include "strdup.h" #include "escape.h" +#include "bufref.h" static CURLcode setopt_set_timeout_sec(timediff_t *ptimeout_ms, long secs) { @@ -1971,12 +1972,8 @@ static CURLcode setopt_cptr(struct Curl_easy *data, CURLoption option, /* * The URL to fetch. */ - if(data->state.url_alloc) { - Curl_safefree(data->state.url); - data->state.url_alloc = FALSE; - } result = Curl_setstropt(&s->str[STRING_SET_URL], ptr); - data->state.url = s->str[STRING_SET_URL]; + Curl_bufref_set(&data->state.url, s->str[STRING_SET_URL], 0, NULL); break; case CURLOPT_USERPWD: @@ -2063,12 +2060,7 @@ static CURLcode setopt_cptr(struct Curl_easy *data, CURLoption option, /* * pass CURLU to set URL */ - if(data->state.url_alloc) { - Curl_safefree(data->state.url); - data->state.url_alloc = FALSE; - } - else - data->state.url = NULL; + Curl_bufref_free(&data->state.url); Curl_safefree(s->str[STRING_SET_URL]); s->uh = (CURLU *)ptr; break; diff --git a/lib/transfer.c b/lib/transfer.c index a8a66f86c7..34f0698ebd 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -79,6 +79,7 @@ #include "hsts.h" #include "setopt.h" #include "headers.h" +#include "bufref.h" #include "curlx/warnless.h" #if !defined(CURL_DISABLE_HTTP) || !defined(CURL_DISABLE_SMTP) || \ @@ -484,13 +485,7 @@ CURLcode Curl_pretransfer(struct Curl_easy *data) } } - /* since the URL may have been redirected in a previous use of this handle */ - if(data->state.url_alloc) { - Curl_safefree(data->state.url); - data->state.url_alloc = FALSE; - } - - data->state.url = data->set.str[STRING_SET_URL]; + Curl_bufref_set(&data->state.url, data->set.str[STRING_SET_URL], 0, NULL); if(data->set.postfields && data->set.set_resume_from) { /* we cannot */ @@ -676,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(data->state.url); + *url = curlx_strdup(Curl_bufref_ptr(&data->state.url)); if(!*url) return CURLE_OUT_OF_MEMORY; diff --git a/lib/url.c b/lib/url.c index f646b74ed4..65161d7e24 100644 --- a/lib/url.c +++ b/lib/url.c @@ -73,6 +73,7 @@ #include "netrc.h" #include "formdata.h" #include "mime.h" +#include "bufref.h" #include "vtls/vtls.h" #include "hostip.h" #include "transfer.h" @@ -184,11 +185,7 @@ void Curl_freeset(struct Curl_easy *data) data->state.referer_alloc = FALSE; } data->state.referer = NULL; - if(data->state.url_alloc) { - Curl_safefree(data->state.url); - data->state.url_alloc = FALSE; - } - data->state.url = NULL; + Curl_bufref_free(&data->state.url); Curl_mime_cleanpart(&data->set.mimepost); @@ -516,6 +513,7 @@ CURLcode Curl_open(struct Curl_easy **curl) Curl_hash_init(&data->meta_hash, 23, Curl_hash_str, curlx_str_key_compare, easy_meta_freeentry); curlx_dyn_init(&data->state.headerb, CURL_MAX_HTTP_HEADER); + Curl_bufref_init(&data->state.url); Curl_req_init(&data->req); Curl_initinfo(data); #ifndef CURL_DISABLE_HTTP @@ -1769,22 +1767,19 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data, return CURLE_OUT_OF_MEMORY; if(data->set.str[STRING_DEFAULT_PROTOCOL] && - !Curl_is_absolute_url(data->state.url, NULL, 0, TRUE)) { + !Curl_is_absolute_url(Curl_bufref_ptr(&data->state.url), NULL, 0, TRUE)) { char *url = curl_maprintf("%s://%s", data->set.str[STRING_DEFAULT_PROTOCOL], - data->state.url); + Curl_bufref_ptr(&data->state.url)); if(!url) return CURLE_OUT_OF_MEMORY; - if(data->state.url_alloc) - curlx_free(data->state.url); - data->state.url = url; - data->state.url_alloc = TRUE; + Curl_bufref_set(&data->state.url, url, 0, curl_free); } if(!use_set_uh) { char *newurl; - uc = curl_url_set(uh, CURLUPART_URL, data->state.url, (unsigned int) - (CURLU_GUESS_SCHEME | + uc = curl_url_set(uh, CURLUPART_URL, Curl_bufref_ptr(&data->state.url), + (unsigned int) (CURLU_GUESS_SCHEME | CURLU_NON_SUPPORT_SCHEME | (data->set.disallow_username_in_url ? CURLU_DISALLOW_USER : 0) | @@ -1798,10 +1793,7 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data, uc = curl_url_get(uh, CURLUPART_URL, &newurl, 0); if(uc) return Curl_uc_to_curlcode(uc); - if(data->state.url_alloc) - curlx_free(data->state.url); - data->state.url = newurl; - data->state.url_alloc = TRUE; + Curl_bufref_set(&data->state.url, newurl, 0, curl_free); } uc = curl_url_get(uh, CURLUPART_SCHEME, &data->state.up.scheme, 0); @@ -1855,8 +1847,7 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data, uc = curl_url_set(uh, CURLUPART_SCHEME, "https", 0); if(uc) return Curl_uc_to_curlcode(uc); - if(data->state.url_alloc) - Curl_safefree(data->state.url); + Curl_bufref_free(&data->state.url); /* after update, get the updated version */ uc = curl_url_get(uh, CURLUPART_URL, &url, 0); if(uc) @@ -1866,10 +1857,8 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data, curlx_free(url); return Curl_uc_to_curlcode(uc); } - data->state.url = url; - data->state.url_alloc = TRUE; - infof(data, "Switched from HTTP to HTTPS due to HSTS => %s", - data->state.url); + Curl_bufref_set(&data->state.url, url, 0, curl_free); + infof(data, "Switched from HTTP to HTTPS due to HSTS => %s", url); } } #endif @@ -3396,7 +3385,7 @@ static CURLcode create_conn(struct Curl_easy *data, /************************************************************* * Check input data *************************************************************/ - if(!data->state.url) { + if(!Curl_bufref_ptr(&data->state.url)) { result = CURLE_URL_MALFORMAT; goto out; } diff --git a/lib/urldata.h b/lib/urldata.h index aa1326d2a6..554e002020 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -154,6 +154,7 @@ typedef unsigned int curl_prot_t; #include "hash.h" #include "splay.h" #include "curlx/dynbuf.h" +#include "bufref.h" #include "dynhds.h" #include "request.h" #include "ratelimit.h" @@ -1025,7 +1026,7 @@ struct UrlState { void *in; /* CURLOPT_READDATA */ CURLU *uh; /* URL handle for the current parsed URL */ struct urlpieces up; - char *url; /* work URL, copied from UserDefined */ + struct bufref url; /* work URL, initially copied from UserDefined */ char *referer; /* referer string */ struct curl_slist *resolve; /* set to point to the set.resolve list when this should be dealt with in pretransfer */ @@ -1122,7 +1123,6 @@ struct UrlState { #ifdef CURL_LIST_ONLY_PROTOCOL BIT(list_only); /* list directory contents */ #endif - BIT(url_alloc); /* URL string is malloc()'ed */ BIT(referer_alloc); /* referer string is malloc()ed */ BIT(wildcard_resolve); /* Set to true if any resolve change is a wildcard */ BIT(upload); /* upload request */ diff --git a/lib/vquic/curl_ngtcp2.c b/lib/vquic/curl_ngtcp2.c index 09b30229f0..cf7b95bf6f 100644 --- a/lib/vquic/curl_ngtcp2.c +++ b/lib/vquic/curl_ngtcp2.c @@ -61,6 +61,7 @@ #include "../select.h" #include "../curlx/inet_pton.h" #include "../transfer.h" +#include "../bufref.h" #include "vquic.h" #include "vquic_int.h" #include "vquic-tls.h" @@ -1631,7 +1632,7 @@ static CURLcode h3_stream_open(struct Curl_cfilter *cf, if(Curl_trc_is_verbose(data)) { infof(data, "[HTTP/3] [%" PRId64 "] OPENED stream for %s", - stream->id, data->state.url); + stream->id, Curl_bufref_ptr(&data->state.url)); for(i = 0; i < nheader; ++i) { infof(data, "[HTTP/3] [%" PRId64 "] [%.*s: %.*s]", stream->id, (int)nva[i].namelen, nva[i].name, diff --git a/lib/vquic/curl_osslq.c b/lib/vquic/curl_osslq.c index ece4ce6ad5..79bd1180dc 100644 --- a/lib/vquic/curl_osslq.c +++ b/lib/vquic/curl_osslq.c @@ -54,6 +54,7 @@ #include "../vtls/openssl.h" #include "curl_osslq.h" #include "../url.h" +#include "../bufref.h" #include "../curlx/warnless.h" #include "../curlx/strerr.h" @@ -1985,7 +1986,7 @@ static CURLcode h3_stream_open(struct Curl_cfilter *cf, if(Curl_trc_is_verbose(data)) { infof(data, "[HTTP/3] [%" PRId64 "] OPENED stream for %s", - stream->s.id, data->state.url); + stream->s.id, Curl_bufref_ptr(&data->state.url)); for(i = 0; i < nheader; ++i) { infof(data, "[HTTP/3] [%" PRId64 "] [%.*s: %.*s]", stream->s.id, diff --git a/lib/vquic/curl_quiche.c b/lib/vquic/curl_quiche.c index 9133110852..a35ffbec65 100644 --- a/lib/vquic/curl_quiche.c +++ b/lib/vquic/curl_quiche.c @@ -46,6 +46,7 @@ #include "curl_quiche.h" #include "../transfer.h" #include "../url.h" +#include "../bufref.h" #include "../curlx/inet_pton.h" #include "../curlx/warnless.h" #include "../vtls/openssl.h" @@ -1023,8 +1024,8 @@ static CURLcode h3_open_stream(struct Curl_cfilter *cf, goto out; } else { - CURL_TRC_CF(data, cf, "send_request(%s) -> %" PRId64, - data->state.url, rv); + CURL_TRC_CF(data, cf, "send_request(%s) -> %" PRIu64, + Curl_bufref_ptr(&data->state.url), rv); } result = CURLE_SEND_ERROR; goto out; @@ -1038,7 +1039,7 @@ static CURLcode h3_open_stream(struct Curl_cfilter *cf, if(Curl_trc_is_verbose(data)) { infof(data, "[HTTP/3] [%" PRIu64 "] OPENED stream for %s", - stream->id, data->state.url); + stream->id, Curl_bufref_ptr(&data->state.url)); for(i = 0; i < nheader; ++i) { infof(data, "[HTTP/3] [%" PRIu64 "] [%.*s: %.*s]", stream->id, (int)nva[i].name_len, nva[i].name,