← Commit list

36542b7349

Patrick Monnerat
Patrick Monnerat
2025-12-04
SUCCESS Duration: 362s

Subject

lib: turn state.url into a struct bufref

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 →

lib/cookie.c+2 -1
@@ -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]);
lib/curl_rtmp.c+2 -1
@@ -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 <curl/curl.h>
#include <librtmp/rtmp.h>
@@ -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;
lib/easy.c+6 -6
@@ -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);
lib/getinfo.c+5 -2
@@ -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];
lib/http.c+11 -11
@@ -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;
lib/http2.c+3 -5
@@ -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;
lib/ldap.c+3 -2
@@ -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
lib/multi.c+3 -2
@@ -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));
}
}
lib/openldap.c+3 -2
@@ -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)
lib/setopt.c+3 -11
@@ -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;
lib/transfer.c+3 -8
@@ -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;
lib/url.c+13 -24
@@ -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;
}
lib/urldata.h+2 -2
@@ -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 */
lib/vquic/curl_ngtcp2.c+2 -1
@@ -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,
lib/vquic/curl_osslq.c+2 -1
@@ -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,
lib/vquic/curl_quiche.c+4 -3
@@ -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,