summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhil Pennock <pdp@exim.org>2011-01-27 19:08:45 -0500
committerPhil Pennock <pdp@exim.org>2011-01-27 19:08:45 -0500
commitf7274286b6f492600e811791733544345551eea8 (patch)
treef9af78e8e4d092efdeccd8f5b5cbac7baabf9d1c
parent0cc9542ab26b35cba3a5523acb8991eb18ce0656 (diff)
Pulled spamd_address-expanded caching fix.
Author: Wolfgang Breyha Bugzilla: 935 Attachment: 378 (looks like it could do with a strcmp check at the end before the extra string_copy, but that's a nicety and the author has presumably been running with this).
-rw-r--r--doc/doc-txt/ChangeLog3
-rw-r--r--src/src/spam.c39
2 files changed, 27 insertions, 15 deletions
diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog
index f196095ab..493157501 100644
--- a/doc/doc-txt/ChangeLog
+++ b/doc/doc-txt/ChangeLog
@@ -20,6 +20,9 @@ PP/01 Permit LOOKUP_foo enabling on the make command-line.
Also via indented variable definition in the Makefile.
(Debugging by Oliver Heesakkers).
+PP/02 Restore caching of spamd results with expanded spamd_address.
+ Patch from author of expandable spamd_address patch, Wolfgang Breyha.
+
Exim version 4.74
-----------------
diff --git a/src/src/spam.c b/src/src/spam.c
index f2ca92712..ac9642028 100644
--- a/src/src/spam.c
+++ b/src/src/spam.c
@@ -20,6 +20,7 @@ uschar spam_report_buffer[32600];
uschar prev_user_name[128] = "";
int spam_ok = 0;
int spam_rc = 0;
+uschar *prev_spamd_address_work = NULL;
int spam(uschar **listptr) {
int sep = 0;
@@ -71,6 +72,23 @@ int spam(uschar **listptr) {
override = 1;
};
+ /* expand spamd_address if needed */
+ if (*spamd_address == '$') {
+ spamd_address_work = expand_string(spamd_address);
+ if (spamd_address_work == NULL) {
+ log_write(0, LOG_MAIN|LOG_PANIC,
+ "spamassassin acl condition: spamd_address starts with $, but expansion failed: %s", expand_string_message);
+ return DEFER;
+ }
+ }
+ else
+ spamd_address_work = spamd_address;
+
+ /* check if previous spamd_address was expanded and has changed. dump cached results if so */
+ if ( spam_ok && ( prev_spamd_address_work != NULL) && (Ustrcmp(prev_spamd_address_work, spamd_address_work) != 0)) {
+ spam_ok = 0;
+ }
+
/* if we scanned for this username last time, just return */
if ( spam_ok && ( Ustrcmp(prev_user_name, user_name) == 0 ) ) {
if (override)
@@ -91,17 +109,6 @@ int spam(uschar **listptr) {
start = time(NULL);
- if (*spamd_address == '$') {
- spamd_address_work = expand_string(spamd_address);
- if (spamd_address_work == NULL) {
- log_write(0, LOG_MAIN|LOG_PANIC,
- "spamassassin acl condition: spamd_address starts with $, but expansion failed: %s", expand_string_message);
- return DEFER;
- }
- }
- else
- spamd_address_work = spamd_address;
-
/* socket does not start with '/' -> network socket */
if (*spamd_address_work != '/') {
time_t now = time(NULL);
@@ -405,11 +412,13 @@ again:
spam_rc = FAIL;
};
- /* remember user name and "been here" for it unless spamd_socket was expanded */
- if (spamd_address_work == spamd_address) {
- Ustrcpy(prev_user_name, user_name);
- spam_ok = 1;
+ /* remember expanded spamd_address if needed */
+ if (spamd_address_work != spamd_address) {
+ prev_spamd_address_work = string_copy(spamd_address_work);
}
+ /* remember user name and "been here" for it */
+ Ustrcpy(prev_user_name, user_name);
+ spam_ok = 1;
if (override) {
/* always return OK, no matter what the score */