lib: turn state.referer into a struct bufref

Closes #19827
This commit is contained in:
Patrick Monnerat 2025-12-03 21:13:52 +01:00 committed by Daniel Stenberg
parent 36542b7349
commit 2cb868242d
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
7 changed files with 27 additions and 36 deletions

View file

@ -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

View file

@ -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 */

View file

@ -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

View file

@ -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;

View file

@ -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:

View file

@ -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

View file

@ -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