]>
Commit | Line | Data |
---|---|---|
4d9b939b AM |
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 | |
4 | @@ -104,10 +104,8 @@ | |
5 | ||
6 | /* socket does not start with '/' -> network socket */ | |
7 | if (*spamd_address_work != '/') { | |
8 | - time_t now = time(NULL); | |
9 | int num_servers = 0; | |
10 | - int current_server = 0; | |
11 | - int start_server = 0; | |
12 | + int current_server; | |
13 | uschar *address = NULL; | |
14 | uschar *spamd_address_list_ptr = spamd_address_work; | |
15 | uschar address_buffer[256]; | |
16 | @@ -119,6 +117,7 @@ | |
17 | address_buffer, | |
18 | sizeof(address_buffer))) != NULL) { | |
19 | ||
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)); | |
23 | ||
24 | @@ -143,9 +142,10 @@ | |
25 | return DEFER; | |
26 | }; | |
27 | ||
28 | - current_server = start_server = (int)now % num_servers; | |
29 | + while ( num_servers > 0 ) { | |
30 | ||
31 | - while (1) { | |
32 | + /* Randomly pick a server to try */ | |
33 | + current_server = random_number( num_servers ); | |
34 | ||
35 | debug_printf("trying server %s, port %u\n", | |
36 | spamd_address_vector[current_server]->tcp_addr, | |
37 | @@ -173,16 +173,21 @@ | |
38 | spamd_address_vector[current_server]->tcp_addr, | |
39 | spamd_address_vector[current_server]->tcp_port, | |
40 | strerror(errno)); | |
41 | - current_server++; | |
42 | - if (current_server >= num_servers) | |
43 | - current_server = 0; | |
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); | |
48 | - return DEFER; | |
49 | - }; | |
50 | - }; | |
51 | + | |
52 | + (void)close(spamd_sock); | |
53 | + | |
54 | + /* Remove the server from the list. XXX We should free the memory */ | |
55 | + num_servers--; | |
56 | + int i; | |
57 | + for( i = current_server; i < num_servers; i++ ) | |
58 | + spamd_address_vector[i] = spamd_address_vector[i+1]; | |
59 | + } | |
60 | + | |
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); | |
64 | + return DEFER; | |
65 | + } | |
66 | ||
67 | } | |
68 | else { |