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).
Also via indented variable definition in the Makefile.
(Debugging by Oliver Heesakkers).
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
-----------------
Exim version 4.74
-----------------
uschar prev_user_name[128] = "";
int spam_ok = 0;
int spam_rc = 0;
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;
int spam(uschar **listptr) {
int sep = 0;
+ /* 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)
/* if we scanned for this username last time, just return */
if ( spam_ok && ( Ustrcmp(prev_user_name, user_name) == 0 ) ) {
if (override)
- 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);
/* socket does not start with '/' -> network socket */
if (*spamd_address_work != '/') {
time_t now = time(NULL);
- /* 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 */
if (override) {
/* always return OK, no matter what the score */