s/EXTRA_LIBS/EXTRALIBS/ in EDITME
[exim.git] / src / src / malware.c
index ca9c3dfebd5390d46fa112e3155a35f531c03781..fddb19add4d8c53f0dfdb1ceb1597336a487850e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/malware.c,v 1.12 2005/08/01 14:41:25 ph10 Exp $ */
+/* $Cambridge: exim/src/src/malware.c,v 1.15 2006/07/06 14:19:50 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -20,6 +20,10 @@ int mksd_scan_packed(int sock);
 #define SHUT_WR 1
 #endif
 
+
+#define        MALWARE_TIMEOUT             120
+
+
 #define DRWEBD_SCAN_CMD             (1)     /* scan file, buffer or diskfile */
 #define DRWEBD_RETURN_VIRUSES       (1<<0)   /* ask daemon return to us viruses names from report */
 #define DRWEBD_IS_MAIL              (1<<19)  /* say to daemon that format is "archive MAIL" */
@@ -557,7 +561,7 @@ int malware(uschar **listptr) {
           return DEFER;
         };
 
-        bread = read(sock, av_buffer, sizeof(av_buffer));
+        bread = ip_recv(sock, av_buffer, sizeof(av_buffer), MALWARE_TIMEOUT);
         if (bread >0) av_buffer[bread]='\0';
         if (bread < 0) {
           (void)close(sock);
@@ -591,7 +595,7 @@ int malware(uschar **listptr) {
         i = 0;
         memset(av_buffer, 0, sizeof(av_buffer));
         do {
-          bread=read(sock, &av_buffer[i], 1);
+          bread=ip_recv(sock, &av_buffer[i], 1, MALWARE_TIMEOUT);
           if (bread < 0) {
             (void)close(sock);
             log_write(0, LOG_MAIN|LOG_PANIC,
@@ -873,7 +877,7 @@ int malware(uschar **listptr) {
       };
 
       (void)string_format(file_name,1024,"%s/scan/%s/%s_scanner_output", spool_directory, message_id, message_id);
-      scanner_record = fopen(CS file_name,"wb");
+      scanner_record = modefopen(file_name,"wb",SPOOL_MODE);
 
       if (scanner_record == NULL) {
         log_write(0, LOG_MAIN|LOG_PANIC,
@@ -976,7 +980,7 @@ int malware(uschar **listptr) {
 
       /* wait for result */
       memset(av_buffer, 0, sizeof(av_buffer));
-      if ((!(bread = read(sock, av_buffer, sizeof(av_buffer))) > 0)) {
+      if ((!(bread = ip_recv(sock, av_buffer, sizeof(av_buffer), MALWARE_TIMEOUT)) > 0)) {
         (void)close(sock);
         log_write(0, LOG_MAIN|LOG_PANIC,
              "malware acl condition: unable to read from sophie UNIX socket (%s)", sophie_options);
@@ -1098,7 +1102,7 @@ int malware(uschar **listptr) {
             return DEFER;
           }
           memset(av_buffer2, 0, sizeof(av_buffer2));
-          bread = read(sock, av_buffer2, sizeof(av_buffer2));
+          bread = ip_recv(sock, av_buffer2, sizeof(av_buffer2), MALWARE_TIMEOUT);
 
           if (bread < 0) {
             log_write(0, LOG_MAIN|LOG_PANIC,
@@ -1238,7 +1242,7 @@ int malware(uschar **listptr) {
 
       /* Read the result */
       memset(av_buffer, 0, sizeof(av_buffer));
-      bread = read(sock, av_buffer, sizeof(av_buffer));
+      bread = ip_recv(sock, av_buffer, sizeof(av_buffer), MALWARE_TIMEOUT);
       (void)close(sock);
 
       if (!(bread  > 0)) {
@@ -1265,6 +1269,10 @@ int malware(uschar **listptr) {
         return DEFER;
       }
 
+      /* strip newline at the end */
+      p = av_buffer + Ustrlen(av_buffer) - 1;
+      if( *p == '\n' ) *p = '\0';
+
       /* colon in returned output? */
       if((p = Ustrrchr(av_buffer,':')) == NULL) {
         log_write(0, LOG_MAIN|LOG_PANIC,
@@ -1273,13 +1281,10 @@ int malware(uschar **listptr) {
         return DEFER;
       }
 
-      /* strip filename strip CR at the end */
+      /* strip filename */
       ++p;
       while (*p == ' ') ++p;
       vname = p;
-      p = vname + Ustrlen(vname) - 1;
-      if( *p == '\n' ) *p = '\0';
-
       if ((p = Ustrstr(vname, "FOUND"))!=NULL) {
            *p=0;
            for (--p;p>vname && *p<=32;p--) *p=0;