X-Git-Url: http://www.privoxy.org/gitweb/%40user-manual%40%40actions-help-prefix%40HANDLE-AS-EMPTY-DOCUMENT?a=blobdiff_plain;f=filters.c;h=e2f490c7d274499026920b0f09878154921f4d78;hb=6bf286721045589f54e58247a54d9dc89db53c52;hp=cfdde10d8675a4dcaee691bb07e50272b154ea56;hpb=94c203c16875c63002889472e48cea13217996f8;p=privoxy.git diff --git a/filters.c b/filters.c index cfdde10d..e2f490c7 100644 --- a/filters.c +++ b/filters.c @@ -1,4 +1,4 @@ -const char filters_rcs[] = "$Id: filters.c,v 1.146 2011/10/30 16:15:29 fabiankeil Exp $"; +const char filters_rcs[] = "$Id: filters.c,v 1.154 2011/10/30 16:22:46 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/filters.c,v $ @@ -78,6 +78,11 @@ const char filters_rcs[] = "$Id: filters.c,v 1.146 2011/10/30 16:15:29 fabiankei #include "urlmatch.h" #include "loaders.h" +#ifdef HAVE_STRTOK +/* Only used for locks */ +#include "jcc.h" +#endif /* def HAVE_STRTOK */ + #ifdef _WIN32 #include "win32.h" #endif @@ -1109,6 +1114,8 @@ char *get_last_url(char *subject, const char *redirect_mode) { log_error(LOG_LEVEL_REDIRECTS, "Checking \"%s\" for encoded redirects.", subject); + +#if defined(MUTEX_LOCKS_AVAILABLE) && defined(HAVE_STRTOK) /* * Check each parameter in the URL separately. * Sectionize the URL at "?" and "&", @@ -1117,34 +1124,53 @@ char *get_last_url(char *subject, const char *redirect_mode) * Keep the last one we spot. */ char *found = NULL; - char *s = strdup(subject); - char *token = strtok(s, "?&"); + + privoxy_mutex_lock(&strtok_mutex); + char *token = strtok(subject, "?&"); while (token) { char *dtoken = url_decode(token); - if (!dtoken) continue; - char *h1 = strstr(dtoken, "http://"); - char *h2 = strstr(dtoken, "https://"); - char *h = (h1 && h2 - ? (h1 < h2 ? h1 : h2) - : (h1 ? h1 : h2)); - if (h) + if (NULL == dtoken) + { + log_error(LOG_LEVEL_ERROR, "Unable to decode \"%s\".", token); + continue; + } + char *http_url = strstr(dtoken, "http://"); + char *https_url = strstr(dtoken, "https://"); + char *last_url = (http_url && https_url + ? (http_url < https_url ? http_url : https_url) + : (http_url ? http_url : https_url)); + if (last_url) { freez(found); - found = strdup(h); + found = strdup(last_url); + if (found == NULL) + { + log_error(LOG_LEVEL_ERROR, + "Out of memory while searching for redirects."); + privoxy_mutex_unlock(&strtok_mutex); + return NULL; + } } + freez(dtoken); token = strtok(NULL, "?&"); } - freez(s); + privoxy_mutex_unlock(&strtok_mutex); + freez(subject); - if (found) + return found; +#else + new_url = url_decode(subject); + if (new_url != NULL) { freez(subject); - return found; + subject = new_url; } - - freez(subject); - return NULL; + else + { + log_error(LOG_LEVEL_ERROR, "Unable to decode \"%s\".", subject); + } +#endif /* defined(MUTEX_LOCKS_AVAILABLE) && defined(HAVE_STRTOK) */ } /* Else, just look for a URL inside this one, without decoding anything. */ @@ -1299,8 +1325,8 @@ struct http_response *redirect_url(struct client_state *csp) return cgi_error_memory(); } - if ( enlist_unique_header(rsp->headers, "Location", new_url) - || (NULL == (rsp->status = strdup("302 Local Redirect from Privoxy"))) ) + if (enlist_unique_header(rsp->headers, "Location", new_url) + || (NULL == (rsp->status = strdup("302 Local Redirect from Privoxy")))) { freez(new_url); free_http_response(rsp);