X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fsrc%2Fspam.c;h=8e08a40b7416519d4948f5a8c38975ce29c32fab;hb=3d0a6e0fcf175e8416f344939b60c918c0f0f418;hp=ac25a881fb7679db1a425f8485bf5898bdaa0086;hpb=4c04137d73637107669e02b21f890387aaa2ef34;p=exim.git diff --git a/src/src/spam.c b/src/src/spam.c index ac25a881f..8e08a40b7 100644 --- a/src/src/spam.c +++ b/src/src/spam.c @@ -4,7 +4,7 @@ /* Copyright (c) Tom Kistner 2003 - 2015 * License: GPL - * Copyright (c) The Exim Maintainers 2016 + * Copyright (c) The Exim Maintainers 2016 - 2018 */ /* Code for calling spamassassin's spamd. Called from acl.c. */ @@ -251,7 +251,7 @@ if (*spamd_address == '$') else spamd_address_work = spamd_address; -DEBUG(D_acl) debug_printf("spamd: addrlist '%s'\n", spamd_address_work); +DEBUG(D_acl) debug_printf_indent("spamd: addrlist '%s'\n", spamd_address_work); /* check if previous spamd_address was expanded and has changed. dump cached results if so */ if ( spam_ok @@ -265,11 +265,9 @@ if (spam_ok && Ustrcmp(prev_user_name, user_name) == 0) return override ? OK : spam_rc; /* make sure the eml mbox file is spooled up */ -mbox_file = spool_mbox(&mbox_size, NULL); -if (mbox_file == NULL) - { - /* error while spooling */ +if (!(mbox_file = spool_mbox(&mbox_size, NULL, NULL))) + { /* error while spooling */ log_write(0, LOG_MAIN|LOG_PANIC, "%s error while creating mbox spool file", loglabel); return DEFER; @@ -287,15 +285,14 @@ start = time(NULL); /* Check how many spamd servers we have and register their addresses */ sep = 0; /* default colon-sep */ - while ((address = string_nextinlist(&spamd_address_list_ptr, &sep, - NULL, 0)) != NULL) + while ((address = string_nextinlist(&spamd_address_list_ptr, &sep, NULL, 0))) { const uschar * sublist; int sublist_sep = -(int)' '; /* default space-sep */ unsigned args; uschar * s; - DEBUG(D_acl) debug_printf("spamd: addr entry '%s'\n", address); + DEBUG(D_acl) debug_printf_indent("spamd: addr entry '%s'\n", address); sd = (spamd_address_container *)store_get(sizeof(spamd_address_container)); for (sublist = address, args = 0, spamd_param_init(sd); @@ -303,7 +300,7 @@ start = time(NULL); args++ ) { - DEBUG(D_acl) debug_printf("spamd: addr parm '%s'\n", s); + DEBUG(D_acl) debug_printf_indent("spamd: addr parm '%s'\n", s); switch (args) { case 0: sd->hostspec = s; @@ -342,15 +339,16 @@ start = time(NULL); { uschar * errstr; - DEBUG(D_acl) debug_printf("spamd: trying server %s\n", sd->hostspec); + DEBUG(D_acl) debug_printf_indent("spamd: trying server %s\n", sd->hostspec); for (;;) { + /*XXX could potentially use TFO early-data here */ if ( (spamd_sock = ip_streamsocket(sd->hostspec, &errstr, 5)) >= 0 || sd->retry <= 0 ) break; - DEBUG(D_acl) debug_printf("spamd: server %s: retry conn\n", sd->hostspec); + DEBUG(D_acl) debug_printf_indent("spamd: server %s: retry conn\n", sd->hostspec); while (sd->retry > 0) sd->retry = sleep(sd->retry); } if (spamd_sock >= 0) @@ -372,27 +370,29 @@ start = time(NULL); (void)fcntl(spamd_sock, F_SETFL, O_NONBLOCK); /* now we are connected to spamd on spamd_sock */ if (sd->is_rspamd) - { /* rspamd variant */ - uschar *req_str; - const uschar * helo; - const uschar * fcrdns; - const uschar * authid; - - req_str = string_sprintf("CHECK RSPAMC/1.3\r\nContent-length: %lu\r\n" - "Queue-Id: %s\r\nFrom: <%s>\r\nRecipient-Number: %d\r\n", - mbox_size, message_id, sender_address, recipients_count); + { + gstring * req_str; + const uschar * s; + + req_str = string_append(NULL, 8, + "CHECK RSPAMC/1.3\r\nContent-length: ", string_sprintf("%lu\r\n", mbox_size), + "Queue-Id: ", message_id, + "\r\nFrom: <", sender_address, + ">\r\nRecipient-Number: ", string_sprintf("%d\r\n", recipients_count)); + for (i = 0; i < recipients_count; i ++) - req_str = string_sprintf("%sRcpt: <%s>\r\n", req_str, recipients_list[i].address); - if ((helo = expand_string(US"$sender_helo_name")) != NULL && *helo != '\0') - req_str = string_sprintf("%sHelo: %s\r\n", req_str, helo); - if ((fcrdns = expand_string(US"$sender_host_name")) != NULL && *fcrdns != '\0') - req_str = string_sprintf("%sHostname: %s\r\n", req_str, fcrdns); - if (sender_host_address != NULL) - req_str = string_sprintf("%sIP: %s\r\n", req_str, sender_host_address); - if ((authid = expand_string(US"$authenticated_id")) != NULL && *authid != '\0') - req_str = string_sprintf("%sUser: %s\r\n", req_str, authid); - req_str = string_sprintf("%s\r\n", req_str); - wrote = send(spamd_sock, req_str, Ustrlen(req_str), 0); + req_str = string_append(req_str, 3, + "Rcpt: <", recipients_list[i].address, ">\r\n"); + if ((s = expand_string(US"$sender_helo_name")) && *s) + req_str = string_append(req_str, 3, "Helo: ", s, "\r\n"); + if ((s = expand_string(US"$sender_host_name")) && *s) + req_str = string_append(req_str, 3, "Hostname: ", s, "\r\n"); + if (sender_host_address) + req_str = string_append(req_str, 3, "IP: ", sender_host_address, "\r\n"); + if ((s = expand_string(US"$authenticated_id")) && *s) + req_str = string_append(req_str, 3, "User: ", s, "\r\n"); + req_str = string_catn(req_str, US"\r\n", 2); + wrote = send(spamd_sock, req_str->s, req_str->ptr, 0); } else { /* spamassassin variant */