X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=src%2Fsrc%2Fmalware.c;h=53dcb3aecfa5dec07d937eb5a2bd43d7fbeb2e89;hb=1ea70a03c5568925dcee1a35e6e6a879f2848b26;hp=153670d0e3a736a7ee93f5f03b3f5e2761beab64;hpb=384152a6b0cce686255894a502e4b88743abd356;p=exim.git diff --git a/src/src/malware.c b/src/src/malware.c index 153670d0e..53dcb3aec 100644 --- a/src/src/malware.c +++ b/src/src/malware.c @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/malware.c,v 1.8 2005/05/24 08:15:02 tom Exp $ */ +/* $Cambridge: exim/src/src/malware.c,v 1.9 2005/06/06 18:49:35 tom Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -409,6 +409,7 @@ int malware(uschar **listptr) { uschar buf[32768]; struct sockaddr_un server; int sock; + int result; if ((kav_options = string_nextinlist(&av_scanner_work, &sep, kav_options_buffer, @@ -456,19 +457,52 @@ int malware(uschar **listptr) { } malware_name = NULL; + result = 0; /* read response lines, find malware name and final response */ while (recv_line(sock, buf, 32768) > 0) { debug_printf("aveserver: %s\n", buf); - if (buf[0] == '2') break; - if (Ustrncmp(buf,"322",3) == 0) { + if (buf[0] == '2') { + break; + } else if (buf[0] == '5') { + /* aveserver is having problems */ + log_write(0, LOG_MAIN|LOG_PANIC, + "malware acl condition: unable to scan file %s/scan/%s/%s.eml (Responded: %s).", + spool_directory, message_id, message_id, buf); + result = DEFER; + break; + } else if (Ustrncmp(buf,"322",3) == 0) { uschar *p = Ustrchr(&buf[4],' '); *p = '\0'; Ustrcpy(malware_name_buffer,&buf[4]); malware_name = malware_name_buffer; - }; + }; } + /* prepare our command */ + snprintf(CS buf, 32768, "quit\r\n"); + + /* and send it */ + if (send(sock, buf, Ustrlen(buf), 0) < 0) { + close(sock); + log_write(0, LOG_MAIN|LOG_PANIC, + "malware acl condition: unable to write to aveserver UNIX socket (%s)", kav_options); + return DEFER; + } + + /* read aveserver's greeting and see if it is ready (2xx greeting) */ + recv_line(sock, buf, 32768); + + if (buf[0] != '2') { + /* aveserver is having problems */ + close(sock); + log_write(0, LOG_MAIN|LOG_PANIC, + "malware acl condition: unable to quit aveserver dialogue (Responded: %s).", ((buf[0] != 0) ? buf : (uschar *)"nothing") ); + return DEFER; + }; + close(sock); + + if (result == DEFER) return DEFER; } /* "fsecure" scanner type ------------------------------------------------- */ else if (strcmpic(scanner_name,US"fsecure") == 0) {