← Commit list

2cb868242d

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

Subject

lib: turn state.referer 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/easy.c+10 -6
@@ -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
lib/getinfo.c+1 -1
@@ -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 */
lib/http.c+6 -9
@@ -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
lib/rtsp.c+5 -3
@@ -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;
lib/setopt.c+1 -5
@@ -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:
lib/url.c+3 -10
@@ -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
lib/urldata.h+1 -2
@@ -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