From: Patrick Monnerat Date: Wed, 3 Dec 2025 20:13:52 +0000 (+0100) Subject: lib: turn state.referer into a struct bufref X-Git-Tag: rc-8_18_0-1~26 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2cb868242dc2ac9cd52ee64987ef51d5964a56f9;p=thirdparty%2Fcurl.git lib: turn state.referer into a struct bufref Closes #19827 --- diff --git a/lib/easy.c b/lib/easy.c index c18fdd09bf..68ec3000f8 100644 --- a/lib/easy.c +++ b/lib/easy.c @@ -977,6 +977,7 @@ CURL *curl_easy_duphandle(CURL *d) 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_bufref_init(&outcurl->state.referer); Curl_netrc_init(&outcurl->state.netrc); /* the connection pool is setup on demand */ @@ -1016,16 +1017,19 @@ CURL *curl_easy_duphandle(CURL *d) } #endif - if(Curl_bufref_ptr(&data->state.url)) + 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); - if(!outcurl->state.referer) + 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_free); + if(!Curl_bufref_ptr(&outcurl->state.referer)) goto fail; - outcurl->state.referer_alloc = TRUE; } /* Reinitialize an SSL engine for the new handle diff --git a/lib/getinfo.c b/lib/getinfo.c index 59dc198777..82c701e07c 100644 --- a/lib/getinfo.c +++ b/lib/getinfo.c @@ -148,7 +148,7 @@ static CURLcode getinfo_char(struct Curl_easy *data, CURLINFO info, break; case CURLINFO_REFERER: /* Return the referrer header for this request, or NULL if unset */ - *param_charp = data->state.referer; + *param_charp = Curl_bufref_ptr(&data->state.referer); break; case CURLINFO_PRIMARY_IP: /* Return the ip address of the most recent (primary) connection */ diff --git a/lib/http.c b/lib/http.c index ae7458572b..afe37da5b6 100644 --- a/lib/http.c +++ b/lib/http.c @@ -1235,11 +1235,7 @@ CURLcode Curl_http_follow(struct Curl_easy *data, const char *newurl, /* We are asked to automatically set the previous URL as the referer when we get the next URL. We pick the ->url field, which may or may not be 100% correct */ - - if(data->state.referer_alloc) { - Curl_safefree(data->state.referer); - data->state.referer_alloc = FALSE; - } + Curl_bufref_free(&data->state.referer); /* Make a copy of the URL without credentials and fragment */ u = curl_url(); @@ -1262,8 +1258,7 @@ CURLcode Curl_http_follow(struct Curl_easy *data, const char *newurl, if(uc || !referer) return CURLE_OUT_OF_MEMORY; - data->state.referer = referer; - data->state.referer_alloc = TRUE; /* yes, free this later */ + Curl_bufref_set(&data->state.referer, referer, 0, curl_free); } } } @@ -2867,8 +2862,10 @@ static CURLcode http_add_hd(struct Curl_easy *data, case H1_HD_REFERER: Curl_safefree(data->state.aptr.ref); - if(data->state.referer && !Curl_checkheaders(data, STRCONST("Referer"))) - result = curlx_dyn_addf(req, "Referer: %s\r\n", data->state.referer); + if(Curl_bufref_ptr(&data->state.referer) && + !Curl_checkheaders(data, STRCONST("Referer"))) + result = curlx_dyn_addf(req, "Referer: %s\r\n", + Curl_bufref_ptr(&data->state.referer)); break; #ifndef CURL_DISABLE_PROXY diff --git a/lib/rtsp.c b/lib/rtsp.c index ee5d822a54..0a807899f9 100644 --- a/lib/rtsp.c +++ b/lib/rtsp.c @@ -40,6 +40,7 @@ #include "connect.h" #include "cfilters.h" #include "strdup.h" +#include "bufref.h" #include "curlx/strparse.h" @@ -536,9 +537,10 @@ static CURLcode rtsp_do(struct Curl_easy *data, bool *done) /* Referrer */ Curl_safefree(data->state.aptr.ref); - if(data->state.referer && !Curl_checkheaders(data, STRCONST("Referer"))) - data->state.aptr.ref = curl_maprintf("Referer: %s\r\n", - data->state.referer); + if(Curl_bufref_ptr(&data->state.referer) && + !Curl_checkheaders(data, STRCONST("Referer"))) + data->state.aptr.ref = + curl_maprintf("Referer: %s\r\n", Curl_bufref_ptr(&data->state.referer)); p_referrer = data->state.aptr.ref; diff --git a/lib/setopt.c b/lib/setopt.c index bcaf3fc2ae..476506dad4 100644 --- a/lib/setopt.c +++ b/lib/setopt.c @@ -1754,12 +1754,8 @@ static CURLcode setopt_cptr(struct Curl_easy *data, CURLoption option, /* * String to set in the HTTP Referer: field. */ - if(data->state.referer_alloc) { - Curl_safefree(data->state.referer); - data->state.referer_alloc = FALSE; - } result = Curl_setstropt(&s->str[STRING_SET_REFERER], ptr); - data->state.referer = s->str[STRING_SET_REFERER]; + Curl_bufref_set(&data->state.referer, s->str[STRING_SET_REFERER], 0, NULL); break; case CURLOPT_USERAGENT: diff --git a/lib/url.c b/lib/url.c index 65161d7e24..64ad16a1ae 100644 --- a/lib/url.c +++ b/lib/url.c @@ -180,11 +180,7 @@ void Curl_freeset(struct Curl_easy *data) Curl_safefree(data->set.blobs[j]); } - if(data->state.referer_alloc) { - Curl_safefree(data->state.referer); - data->state.referer_alloc = FALSE; - } - data->state.referer = NULL; + Curl_bufref_free(&data->state.referer); Curl_bufref_free(&data->state.url); Curl_mime_cleanpart(&data->set.mimepost); @@ -271,11 +267,7 @@ CURLcode Curl_close(struct Curl_easy **datap) Curl_safefree(data->state.first_host); Curl_ssl_free_certinfo(data); - if(data->state.referer_alloc) { - Curl_safefree(data->state.referer); - data->state.referer_alloc = FALSE; - } - data->state.referer = NULL; + Curl_bufref_free(&data->state.referer); up_free(data); curlx_dyn_free(&data->state.headerb); @@ -514,6 +506,7 @@ CURLcode Curl_open(struct Curl_easy **curl) 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_bufref_init(&data->state.referer); Curl_req_init(&data->req); Curl_initinfo(data); #ifndef CURL_DISABLE_HTTP diff --git a/lib/urldata.h b/lib/urldata.h index 554e002020..76aefec01e 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -1027,7 +1027,7 @@ struct UrlState { CURLU *uh; /* URL handle for the current parsed URL */ struct urlpieces up; struct bufref url; /* work URL, initially copied from UserDefined */ - char *referer; /* referer string */ + struct bufref referer; /* referer string */ struct curl_slist *resolve; /* set to point to the set.resolve list when this should be dealt with in pretransfer */ #ifndef CURL_DISABLE_HTTP @@ -1123,7 +1123,6 @@ struct UrlState { #ifdef CURL_LIST_ONLY_PROTOCOL BIT(list_only); /* list directory contents */ #endif - 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 */ BIT(internal); /* internal: true if this easy handle was created for