X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=urlmatch.c;h=4670f310aea5c4e2fd3b7d1addf879ed56c0f766;hp=36699fc248471749d14cbd6badea70e78917b8c5;hb=23445442f4bf0aa0bcf6e35df09daf8ef0d69d99;hpb=8ff919206b9740c46e7fe93e01d62f594d14262e diff --git a/urlmatch.c b/urlmatch.c index 36699fc2..4670f310 100644 --- a/urlmatch.c +++ b/urlmatch.c @@ -5,7 +5,7 @@ * Purpose : Declares functions to match URLs against URL * patterns. * - * Copyright : Written by and Copyright (C) 2001-2014 + * Copyright : Written by and Copyright (C) 2001-2020 * the Privoxy team. https://www.privoxy.org/ * * Based on the Internet Junkbuster originally written @@ -45,7 +45,7 @@ #include #include -#if !defined(_WIN32) && !defined(__OS2__) +#if !defined(_WIN32) #include #endif @@ -63,7 +63,7 @@ enum regex_anchoring RIGHT_ANCHORED_HOST }; static jb_err compile_vanilla_host_pattern(struct pattern_spec *url, const char *host_pattern); -#ifdef FEATURE_EXTENDED_HOST_PATTERNS +#ifdef FEATURE_PCRE_HOST_PATTERNS static jb_err compile_pcre_host_pattern(struct pattern_spec *url, const char *host_pattern); #endif @@ -263,7 +263,9 @@ jb_err parse_http_url(const char *url, struct http_request *http, int require_pr else if (strncmpic(url_noproto, "https://", 8) == 0) { /* - * Should only happen when called from cgi_show_url_info(). + * Should only happen when called from cgi_show_url_info() + * or when the request was https-inspected and the request + * line got rewritten. */ url_noproto += 8; http->ssl = 1; @@ -302,7 +304,7 @@ jb_err parse_http_url(const char *url, struct http_request *http, int require_pr url_path ); *url_path = '\0'; - http->hostport = strdup_or_die(url_noproto); + http->hostport = string_tolower(url_noproto); } else { @@ -311,10 +313,15 @@ jb_err parse_http_url(const char *url, struct http_request *http, int require_pr * or CONNECT requests */ http->path = strdup_or_die("/"); - http->hostport = strdup_or_die(url_noproto); + http->hostport = string_tolower(url_noproto); } freez(buf); + + if (http->hostport == NULL) + { + return JB_ERR_PARSE; + } } if (!host_available) @@ -699,12 +706,12 @@ static jb_err compile_pattern(const char *pattern, enum regex_anchoring anchorin static jb_err compile_url_pattern(struct pattern_spec *url, char *buf) { char *p; - -#ifdef FEATURE_EXTENDED_HOST_PATTERNS const size_t prefix_length = 18; + +#ifdef FEATURE_PCRE_HOST_PATTERNS if (strncmpic(buf, "PCRE-HOST-PATTERN:", prefix_length) == 0) { - url->pattern.url_spec.host_regex_type = EXTENDED_HOST_PATTERN; + url->pattern.url_spec.host_regex_type = PCRE_HOST_PATTERN; /* Overwrite the "PCRE-HOST-PATTERN:" prefix */ memmove(buf, buf+prefix_length, strlen(buf+prefix_length)+1); } @@ -712,6 +719,22 @@ static jb_err compile_url_pattern(struct pattern_spec *url, char *buf) { url->pattern.url_spec.host_regex_type = VANILLA_HOST_PATTERN; } +#else + if (strncmpic(buf, "PCRE-HOST-PATTERN:", prefix_length) == 0) + { + log_error(LOG_LEVEL_ERROR, + "PCRE-HOST-PATTERN detected while Privoxy has been compiled " + "without FEATURE_PCRE_HOST_PATTERNS: %s", + buf); + /* Overwrite the "PCRE-HOST-PATTERN:" prefix */ + memmove(buf, buf+prefix_length, strlen(buf+prefix_length)+1); + /* + * The pattern will probably not work as expected. + * We don't simply return JB_ERR_PARSE here so the + * regression tests can be loaded with and without + * FEATURE_PCRE_HOST_PATTERNS. + */ + } #endif p = strchr(buf, '/'); @@ -775,8 +798,8 @@ static jb_err compile_url_pattern(struct pattern_spec *url, char *buf) if (buf[0] != '\0') { -#ifdef FEATURE_EXTENDED_HOST_PATTERNS - if (url->pattern.url_spec.host_regex_type == EXTENDED_HOST_PATTERN) +#ifdef FEATURE_PCRE_HOST_PATTERNS + if (url->pattern.url_spec.host_regex_type == PCRE_HOST_PATTERN) { return compile_pcre_host_pattern(url, buf); } @@ -792,7 +815,7 @@ static jb_err compile_url_pattern(struct pattern_spec *url, char *buf) } -#ifdef FEATURE_EXTENDED_HOST_PATTERNS +#ifdef FEATURE_PCRE_HOST_PATTERNS /********************************************************************* * * Function : compile_pcre_host_pattern @@ -812,7 +835,7 @@ static jb_err compile_pcre_host_pattern(struct pattern_spec *url, const char *ho { return compile_pattern(host_pattern, RIGHT_ANCHORED_HOST, url, &url->pattern.url_spec.host_regex); } -#endif /* def FEATURE_EXTENDED_HOST_PATTERNS */ +#endif /* def FEATURE_PCRE_HOST_PATTERNS */ /********************************************************************* @@ -1240,13 +1263,13 @@ void free_pattern_spec(struct pattern_spec *pattern) if (pattern == NULL) return; freez(pattern->spec); -#ifdef FEATURE_EXTENDED_HOST_PATTERNS +#ifdef FEATURE_PCRE_HOST_PATTERNS if (pattern->pattern.url_spec.host_regex) { regfree(pattern->pattern.url_spec.host_regex); freez(pattern->pattern.url_spec.host_regex); } -#endif /* def FEATURE_EXTENDED_HOST_PATTERNS */ +#endif /* def FEATURE_PCRE_HOST_PATTERNS */ freez(pattern->pattern.url_spec.dbuffer); freez(pattern->pattern.url_spec.dvec); pattern->pattern.url_spec.dcount = 0; @@ -1300,8 +1323,9 @@ static int host_matches(const struct http_request *http, const struct pattern_spec *pattern) { assert(http->host != NULL); -#ifdef FEATURE_EXTENDED_HOST_PATTERNS - if (pattern->pattern.url_spec.host_regex_type == EXTENDED_HOST_PATTERN) { +#ifdef FEATURE_PCRE_HOST_PATTERNS + if (pattern->pattern.url_spec.host_regex_type == PCRE_HOST_PATTERN) + { return ((NULL == pattern->pattern.url_spec.host_regex) || (0 == regexec(pattern->pattern.url_spec.host_regex, http->host, 0, NULL, 0)));