X-Git-Url: http://www.privoxy.org/gitweb/?a=blobdiff_plain;f=filters.c;h=e2f490c7d274499026920b0f09878154921f4d78;hb=8c3e4f19001300c07cb076353eba625e4729fdd2;hp=865c6d8077d7cdccd1cd02e6c763c71674e3730f;hpb=fb7262efc9773f80c6737da5f02efe3bade66873;p=privoxy.git diff --git a/filters.c b/filters.c index 865c6d80..e2f490c7 100644 --- a/filters.c +++ b/filters.c @@ -1,4 +1,4 @@ -const char filters_rcs[] = "$Id: filters.c,v 1.151 2011/10/30 16:17:57 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.151 2011/10/30 16:17:57 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,6 +1124,8 @@ char *get_last_url(char *subject, const char *redirect_mode) * Keep the last one we spot. */ char *found = NULL; + + privoxy_mutex_lock(&strtok_mutex); char *token = strtok(subject, "?&"); while (token) { @@ -1126,28 +1135,42 @@ char *get_last_url(char *subject, const char *redirect_mode) log_error(LOG_LEVEL_ERROR, "Unable to decode \"%s\".", token); continue; } - char *h1 = strstr(dtoken, "http://"); - char *h2 = strstr(dtoken, "https://"); - char *h = (h1 && h2 - ? (h1 < h2 ? h1 : h2) - : (h1 ? h1 : h2)); - if (h) + 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, "?&"); } + privoxy_mutex_unlock(&strtok_mutex); freez(subject); return found; +#else + new_url = url_decode(subject); + if (new_url != NULL) + { + freez(subject); + subject = new_url; + } + 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. */ @@ -1302,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);