Fix local delivery delay when combined with remote callout/hold. Bug 2599
[exim.git] / src / src / malware.c
index ec2f7c1cfc7681eac5e9a1d34acbb15895bde805..03bb832fc0131795bb1cb6858162ba0ba28f5507 100644 (file)
@@ -4,7 +4,7 @@
 
 /* Copyright (c) Tom Kistner <tom@duncanthrax.net> 2003 - 2015
  * License: GPL
- * Copyright (c) The Exim Maintainers 2015 - 2018
+ * Copyright (c) The Exim Maintainers 2015 - 2020
  */
 
 /* Code for calling virus (malware) scanners. Called from acl.c. */
@@ -220,6 +220,7 @@ extern uschar spooled_message_id[MESSAGE_ID_LENGTH+1];
 /* Some (currently avast only) use backslash escaped whitespace,
 this function undoes these escapes */
 
+#ifndef DISABLE_MAL_AVAST
 static inline void
 unescape(uschar *p)
 {
@@ -228,6 +229,7 @@ for (; *p; ++p)
   if (*p == '\\' && (isspace(p[1]) || p[1] == '\\'))
     for (p0 = p; *p0; ++p0) *p0 = p0[1];
 }
+#endif
 
 /* --- malware_*_defer --- */
 static inline int
@@ -250,18 +252,12 @@ m_panic_defer(struct scan * scanent, const uschar * hostport,
 return malware_panic_defer(string_sprintf("%s %s : %s",
   scanent->name, hostport ? hostport : CUS"", str));
 }
-static inline int
-m_log_defer(struct scan * scanent, const uschar * hostport,
-  const uschar * str)
-{
-return malware_log_defer(string_sprintf("%s %s : %s",
-  scanent->name, hostport ? hostport : CUS"", str));
-}
 /* --- m_*_defer_3 */
 static inline int
 m_panic_defer_3(struct scan * scanent, const uschar * hostport,
   const uschar * str, int fd_to_close)
 {
+DEBUG(D_acl) debug_print_socket(fd_to_close);
 (void) close(fd_to_close);
 return m_panic_defer(scanent, hostport, str);
 }
@@ -338,6 +334,7 @@ else
 return cre;
 }
 
+
 /*
  Simple though inefficient wrapper for reading a line.  Drop CRs and the
  trailing newline. Can return early on buffer full. Null-terminate.
@@ -369,8 +366,12 @@ while ((rcv = read(fd, p, 1)) > 0)
   }
 if (!ok)
   {
-  DEBUG(D_acl) debug_printf_indent("Malware scan: read %s (%s)\n",
+  DEBUG(D_acl)
+    {
+    debug_printf_indent("Malware scan: read %s (%s)\n",
                rcv==0 ? "EOF" : "error", strerror(errno));
+    debug_print_socket(fd);
+    }
   return rcv==0 ? -1 : -2;
   }
 *p = '\0';
@@ -380,6 +381,7 @@ return p - buffer;
 }
 
 /* return TRUE iff size as requested */
+#ifndef DISABLE_MAL_DRWEB
 static BOOL
 recv_len(int sock, void * buf, int size, time_t tmo)
 {
@@ -387,6 +389,7 @@ return fd_ready(sock, tmo)
   ? recv(sock, buf, size, 0) == size
   : FALSE;
 }
+#endif
 
 
 
@@ -654,11 +657,11 @@ if (!malware_ok)
     switch(scanent->conn)
     {
     case MC_TCP:
-      malware_daemon_ctx.sock = ip_tcpsocket(scanner_options, &errstr, 5);     break;
+      malware_daemon_ctx.sock = ip_tcpsocket(scanner_options, &errstr, 5, NULL); break;
     case MC_UNIX:
       malware_daemon_ctx.sock = ip_unixsocket(scanner_options, &errstr);       break;
     case MC_STRM:
-      malware_daemon_ctx.sock = ip_streamsocket(scanner_options, &errstr, 5);  break;
+      malware_daemon_ctx.sock = ip_streamsocket(scanner_options, &errstr, 5, NULL); break;
     default:
       /* compiler quietening */ break;
     }
@@ -791,7 +794,7 @@ if (!malware_ok)
       if (*scanner_options != '/')
        {
        /* calc file size */
-       if ((drweb_fd = exim_open(CCS eml_filename, O_RDONLY)) == -1)
+       if ((drweb_fd = exim_open2(CCS eml_filename, O_RDONLY)) == -1)
          return m_panic_defer_3(scanent, NULL,
            string_sprintf("can't open spool file %s: %s",
              eml_filename, strerror(errno)),
@@ -2276,12 +2279,13 @@ if (!fprot6d_re_virus)
 }
 
 
-void
-malware_show_supported(FILE * f)
+gstring *
+malware_show_supported(gstring * g)
 {
-fprintf(f, "Malware:");
-for (struct scan * sc = m_scans; sc->scancode != (scanner_t)-1; sc++) fprintf(f, " %s", sc->name);
-fprintf(f, "\n");
+g = string_cat(g, US"Malware:");
+for (struct scan * sc = m_scans; sc->scancode != (scanner_t)-1; sc++)
+  g = string_fmt_append(g, " %s", sc->name);
+return string_cat(g, US"\n");
 }