$av_failed variable set when av_scanner deferred
authorPhil Pennock <pdp@exim.org>
Sat, 27 Aug 2011 23:01:01 +0000 (16:01 -0700)
committerPhil Pennock <pdp@exim.org>
Sat, 27 Aug 2011 23:01:01 +0000 (16:01 -0700)
Patch from John Horne.
Fixes bug 1078

doc/doc-docbook/spec.xfpt
doc/doc-txt/ChangeLog
doc/doc-txt/NewStuff
src/src/expand.c
src/src/globals.c
src/src/globals.h
src/src/malware.c

index 1092cab54d843f6f5ed3ad72e8291fe84f3dd825..aa4be53323c8739ff79748a663faf8c87cbfad01 100644 (file)
@@ -10610,6 +10610,15 @@ is empty and &$authentication_failed$& is set to &"1"&). Failure includes any
 negative response to an AUTH command, including (for example) an attempt to use
 an undefined mechanism.
 
+.new
+.vitem &$av_failed$&
+.cindex "content scanning" "AV scanner failure"
+This variable is available when Exim is compiled with the content-scanning
+extension. It is set to &"0"& by default, but will be set to &"1"& if any
+problem occurs with the virus scanner (specified by &%av_scanner%&) during
+the ACL malware condition.
+.wen
+
 .vitem &$body_linecount$&
 .cindex "message body" "line count"
 .cindex "body of message" "line count"
index bb182c9dd938723eff068b5ccd142c419154d0cf..6181dd2d296d5e0c8fe2474f484ba87f83389fbb 100644 (file)
@@ -97,6 +97,10 @@ PP/03 Implement SSL-on-connect outbound with protocol=smtps on smtp transport.
 
 PP/04 Use .dylib instead of .so for dynamic library loading on MacOS.
 
+PP/05 Variable $av_failed, true if the AV scanner deferred.
+      Patch from John Horne.
+      Bugzilla 1078.
+
 
 Exim version 4.76
 -----------------
index eb1e1397e604dfbde75ae1f94efb1a76fbb9a8d3..bf247e67edce2860117612729b1cff417d8c7a0b 100644 (file)
@@ -15,6 +15,9 @@ Version 4.77
  2. The SMTP transport's protocol option may now be set to "smtps", to
     use SSL-on-connect outbound.
 
+ 3. New variable $av_failed, set true if the AV scanner deferred; ie, when
+    there is a problem talking to the AV scanner, or the AV scanner running.
+
 
 Version 4.76
 ------------
index 8dfd7a8ad6048dd1100f5cf04e9fd83e71d635eb..fb6d6922b551b40bb095f0db678968807c445e38 100644 (file)
@@ -387,6 +387,9 @@ static var_entry var_table[] = {
   { "authenticated_id",    vtype_stringptr,   &authenticated_id },
   { "authenticated_sender",vtype_stringptr,   &authenticated_sender },
   { "authentication_failed",vtype_int,        &authentication_failed },
+#ifdef WITH_CONTENT_SCAN
+  { "av_failed",           vtype_int,         &av_failed },
+#endif
 #ifdef EXPERIMENTAL_BRIGHTMAIL
   { "bmi_alt_location",    vtype_stringptr,   &bmi_alt_location },
   { "bmi_base64_tracker_verdict", vtype_stringptr, &bmi_base64_tracker_verdict },
index 92525e8d8c7fb1903f4eee7d0c8e0e3442e4b541..a5516b91d88246d8c8ec7d0daa017e66ac534e63 100644 (file)
@@ -348,6 +348,7 @@ uschar *auth_defer_user_msg    = US"";
 uschar *auth_vars[AUTH_VARS];
 int     auto_thaw              = 0;
 #ifdef WITH_CONTENT_SCAN
+BOOL    av_failed              = FALSE;
 uschar *av_scanner             = US"sophie:/var/run/sophie";  /* AV scanner */
 #endif
 
index 4e395e81e4e4ed239e8cd7c1c69b650777b7ede4..4ed3950dfef60684b92031d810eb8e5deb0dda40 100644 (file)
@@ -184,6 +184,7 @@ extern uschar *auth_defer_user_msg;    /* Error message for user */
 extern uschar *auth_vars[];            /* $authn variables */
 extern int     auto_thaw;              /* Auto-thaw interval */
 #ifdef WITH_CONTENT_SCAN
+extern BOOL    av_failed;              /* TRUE if the AV process failed */
 extern uschar *av_scanner;             /* AntiVirus scanner to use for the malware condition */
 #endif
 
index c7cd0bcca8581c2f1c0307d59bfba3bdbc70cc35..864564ffc926edb4d2a563db6236897779e1e66f 100644 (file)
@@ -69,17 +69,22 @@ Returns:      Exim message processing code (OK, FAIL, DEFER, ...)
 int malware(uschar **listptr) {
   uschar scan_filename[1024];
   BOOL fits;
+  int ret;
 
   fits = string_format(scan_filename, sizeof(scan_filename),
       CS"%s/scan/%s/%s.eml", spool_directory, message_id, message_id);
   if (!fits)
     {
+    av_failed = TRUE;
     log_write(0, LOG_MAIN|LOG_PANIC,
         "malware filename does not fit in buffer [malware()]");
     return DEFER;
   }
 
-  return malware_internal(listptr, scan_filename, FALSE);
+  ret = malware_internal(listptr, scan_filename, FALSE);
+  if (ret == DEFER) av_failed = TRUE;
+
+  return ret;
 }