diff options
Diffstat (limited to 'content')
-rw-r--r-- | content/fetch.c | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/content/fetch.c b/content/fetch.c index c072a1e5a..89351b452 100644 --- a/content/fetch.c +++ b/content/fetch.c @@ -228,6 +228,7 @@ struct fetch * fetch_start(char *url, char *referer, CURLMcode codem; struct curl_slist *slist; url_func_result res; + char *ref1 = 0, *ref2 = 0; fetch = malloc(sizeof (*fetch)); if (!fetch) @@ -238,6 +239,18 @@ struct fetch * fetch_start(char *url, char *referer, if (res == URL_FUNC_NOMEM) goto failed; + res = url_scheme(url, &ref1); + /* we only fail memory exhaustion */ + if (res == URL_FUNC_NOMEM) + goto failed; + + if (referer) { + res = url_scheme(referer, &ref2); + /* we only fail memory exhaustion */ + if (res == URL_FUNC_NOMEM) + goto failed; + } + LOG(("fetch %p, url '%s'", fetch, url)); /* construct a new fetch structure */ @@ -250,8 +263,11 @@ struct fetch * fetch_start(char *url, char *referer, fetch->cookies = cookies; fetch->url = strdup(url); fetch->referer = 0; - if (referer) - fetch->referer = strdup(referer); + /* only send the referer if the schemes match */ + if (referer) { + if (ref1 && ref2 && strcasecmp(ref1, ref2) == 0) + fetch->referer = strdup(referer); + } fetch->p = p; fetch->headers = 0; fetch->host = host; @@ -269,11 +285,23 @@ struct fetch * fetch_start(char *url, char *referer, fetch->prev = 0; fetch->next = 0; - if (!fetch->url || (referer && !fetch->referer) || + if (!fetch->url || (referer && + (ref1 && ref2 && strcasecmp(ref1, ref2) == 0) && + !fetch->referer) || (post_urlenc && !fetch->post_urlenc) || (post_multipart && !fetch->post_multipart)) goto failed; + /* these aren't needed past here */ + if (ref1) { + free(ref1); + ref1 = 0; + } + if (ref2) { + free(ref2); + ref2 = 0; + } + #define APPEND(list, value) \ slist = curl_slist_append(list, value); \ if (!slist) \ @@ -336,6 +364,10 @@ struct fetch * fetch_start(char *url, char *referer, failed: free(host); + if (ref1) + free(ref1); + if (ref2) + free(ref2); free(fetch->url); free(fetch->referer); free(fetch->post_urlenc); |