1 diff -urN exim-4.71/src/spam.c exim-4.71-new/src/spam.c
2 --- exim-4.71/src/spam.c 2008-07-18 18:55:42.000000000 +0100
3 +++ exim-4.71-new/src/spam.c 2009-12-17 12:37:14.000000000 +0000
6 /* socket does not start with '/' -> network socket */
7 if (*spamd_address_work != '/') {
8 - time_t now = time(NULL);
10 - int current_server = 0;
11 - int start_server = 0;
13 uschar *address = NULL;
14 uschar *spamd_address_list_ptr = spamd_address_work;
15 uschar address_buffer[256];
18 sizeof(address_buffer))) != NULL) {
20 + /* Potential memory leak as we never free the store. */
21 spamd_address_container *this_spamd =
22 (spamd_address_container *)store_get(sizeof(spamd_address_container));
28 - current_server = start_server = (int)now % num_servers;
29 + while ( num_servers > 0 ) {
32 + /* Randomly pick a server to try */
33 + current_server = random_number( num_servers );
35 debug_printf("trying server %s, port %u\n",
36 spamd_address_vector[current_server]->tcp_addr,
38 spamd_address_vector[current_server]->tcp_addr,
39 spamd_address_vector[current_server]->tcp_port,
42 - if (current_server >= num_servers)
44 - if (current_server == start_server) {
45 - log_write(0, LOG_MAIN|LOG_PANIC, "spam acl condition: all spamd servers failed");
46 - (void)fclose(mbox_file);
47 - (void)close(spamd_sock);
52 + (void)close(spamd_sock);
54 + /* Remove the server from the list. XXX We should free the memory */
57 + for( i = current_server; i < num_servers; i++ )
58 + spamd_address_vector[i] = spamd_address_vector[i+1];
61 + if ( num_servers == 0 ) {
62 + log_write(0, LOG_MAIN|LOG_PANIC, "spam acl condition: all spamd servers failed");
63 + (void)fclose(mbox_file);