X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=loaders.c;h=e7dbbe42228826675dd5a59af493e859cfbc9585;hp=fe123aad160a1dcc0764f115a999bd26065ad699;hb=e734bb1389aaa25ccc30da467aa439a9b00f9973;hpb=90ea7f6b1ae23b022794bf78f8f9d000d7dcda4c diff --git a/loaders.c b/loaders.c index fe123aad..e7dbbe42 100644 --- a/loaders.c +++ b/loaders.c @@ -1,4 +1,4 @@ -const char loaders_rcs[] = "$Id: loaders.c,v 1.62 2007/04/30 15:02:18 fabiankeil Exp $"; +const char loaders_rcs[] = "$Id: loaders.c,v 1.71 2009/03/04 18:24:47 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/loaders.c,v $ @@ -8,7 +8,7 @@ const char loaders_rcs[] = "$Id: loaders.c,v 1.62 2007/04/30 15:02:18 fabiankeil * the list of active loaders, and to automatically * unload files that are no longer in use. * - * Copyright : Written by and Copyright (C) 2001-2007 the SourceForge + * Copyright : Written by and Copyright (C) 2001-2009 the * Privoxy team. http://www.privoxy.org/ * * Based on the Internet Junkbuster originally written @@ -35,6 +35,40 @@ const char loaders_rcs[] = "$Id: loaders.c,v 1.62 2007/04/30 15:02:18 fabiankeil * * Revisions : * $Log: loaders.c,v $ + * Revision 1.71 2009/03/04 18:24:47 fabiankeil + * No need to create empty strings manually, strdup("") FTW. + * + * Revision 1.70 2009/03/01 18:34:24 fabiankeil + * Help clang understand that we aren't dereferencing + * NULL pointers here. + * + * Revision 1.69 2008/09/21 13:36:52 fabiankeil + * If change-x-forwarded-for{add} is used and the client + * sends multiple X-Forwarded-For headers, append the client's + * IP address to each one of them. "Traditionally" we would + * lose all but the last one. + * + * Revision 1.68 2008/09/19 15:26:28 fabiankeil + * Add change-x-forwarded-for{} action to block or add + * X-Forwarded-For headers. Mostly based on code removed + * before 3.0.7. + * + * Revision 1.67 2008/03/30 14:52:08 fabiankeil + * Rename load_actions_file() and load_re_filterfile() + * as they load multiple files "now". + * + * Revision 1.66 2008/03/21 11:16:30 fabiankeil + * Garbage-collect csp->my_ip_addr_str and csp->my_hostname. + * + * Revision 1.65 2007/12/07 18:29:23 fabiankeil + * Remove now-obsolete csp member x_forwarded. + * + * Revision 1.64 2007/06/01 14:12:38 fabiankeil + * Add unload_forward_spec() in preparation for forward-override{}. + * + * Revision 1.63 2007/05/14 10:41:15 fabiankeil + * Ditch the csp member cookie_list[] which isn't used anymore. + * * Revision 1.62 2007/04/30 15:02:18 fabiankeil * Introduce dynamic pcrs jobs that can resolve variables. * @@ -419,14 +453,15 @@ static struct file_list *current_re_filterfile[MAX_AF_FILES] = { * * Parameters : None * - * Returns : N/A + * Returns : The number of threads that are still active. * *********************************************************************/ -void sweep(void) +unsigned int sweep(void) { struct file_list *fl, *nfl; struct client_state *csp, *last_active; int i; + unsigned int active_threads = 0; /* clear all of the file's active flags */ for ( fl = files->next; NULL != fl; fl = fl->next ) @@ -481,10 +516,11 @@ void sweep(void) csp->tlist->active = 1; } #endif /* def FEATURE_TRUST */ - + + active_threads++; + last_active = csp; csp = csp->next; - } else /* @@ -494,12 +530,14 @@ void sweep(void) last_active->next = csp->next; freez(csp->ip_addr_str); - freez(csp->my_ip_addr_str); - freez(csp->my_hostname); - freez(csp->x_forwarded); freez(csp->iob->buf); freez(csp->error_message); + if (csp->action->flags & ACTION_FORWARD_OVERRIDE && + NULL != csp->fwd) + { + unload_forward_spec(csp->fwd); + } free_http_request(csp->http); destroy_list(csp->headers); @@ -544,6 +582,8 @@ void sweep(void) } } + return active_threads; + } @@ -844,30 +884,30 @@ jb_err edit_read_line(FILE *fp, if (raw_out) { - if ((raw = malloc(1)) == NULL) + raw = strdup(""); + if (NULL == raw) { return JB_ERR_MEMORY; } - *raw = '\0'; } if (prefix_out) { - if ((prefix = malloc(1)) == NULL) + prefix = strdup(""); + if (NULL == prefix) { freez(raw); return JB_ERR_MEMORY; } - *prefix = '\0'; } if (data_out) { - if ((data = malloc(1)) == NULL) + data = strdup(""); + if (NULL == data) { freez(raw); freez(prefix); return JB_ERR_MEMORY; } - *data = '\0'; } /* Main loop. Loop while we need more data & it's not EOF. */ @@ -901,6 +941,7 @@ jb_err edit_read_line(FILE *fp, /* Trim leading spaces if we're at the start of the line */ linestart = linebuf; + assert(NULL != data); if (*data == '\0') { /* Trim leading spaces */ @@ -1314,6 +1355,30 @@ static void unload_re_filterfile(void *f) return; } +/********************************************************************* + * + * Function : unload_forward_spec + * + * Description : Unload the forward spec settings by freeing all + * memory referenced by members and the memory for + * the spec itself. + * + * Parameters : + * 1 : fwd = the forward spec. + * + * Returns : N/A + * + *********************************************************************/ +void unload_forward_spec(struct forward_spec *fwd) +{ + free_url_spec(fwd->url); + freez(fwd->gateway_host); + freez(fwd->forward_host); + free(fwd); + + return; +} + #ifdef FEATURE_GRACEFUL_TERMINATION /********************************************************************* @@ -1346,9 +1411,9 @@ void unload_current_re_filterfile(void) /********************************************************************* * - * Function : load_re_filterfile + * Function : load_re_filterfiles * - * Description : Load the re_filterfile. + * Description : Loads all the filterfiles. * Generate a chained list of re_filterfile_spec's from * the "FILTER: " blocks, compiling all their substitutions * into chained lists of pcrs_job structs. @@ -1359,7 +1424,7 @@ void unload_current_re_filterfile(void) * Returns : 0 => Ok, everything else is an error. * *********************************************************************/ -int load_re_filterfile(struct client_state *csp) +int load_re_filterfiles(struct client_state *csp) { int i; int result; @@ -1516,6 +1581,7 @@ int load_one_re_filterfile(struct client_state *csp, int fileid) } else { + assert(NULL != bl); bl->next = new_bl; } bl = new_bl; @@ -1579,7 +1645,7 @@ int load_one_re_filterfile(struct client_state *csp, int fileid) { bl->joblist = dummy; } - else + else if (NULL != lastjob) { lastjob->next = dummy; }