lib: turn state.referer into a struct bufref
No binary (build failed)
—
(log yok)
| @@ -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 | |
| @@ -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 */ | |
| @@ -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 | |
| @@ -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; | |
| @@ -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: | |
| @@ -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 | |
| @@ -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 | |