X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/1fe64dcc7107853e28d02700674b640ed24c0fea..f1e894f37fb99398f7447220925a915bd031491a:/src/src/malware.c diff --git a/src/src/malware.c b/src/src/malware.c index 53dcb3aec..c137d570f 100644 --- a/src/src/malware.c +++ b/src/src/malware.c @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/malware.c,v 1.9 2005/06/06 18:49:35 tom Exp $ */ +/* $Cambridge: exim/src/src/malware.c,v 1.10 2005/06/27 14:29:43 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -69,7 +69,7 @@ int malware(uschar **listptr) { }; /* none of our current scanners need the mbox file as a stream, so we can close it right away */ - fclose(mbox_file); + (void)fclose(mbox_file); /* extract the malware regex to match against from the option list */ if ((malware_regex = string_nextinlist(&list, &sep, @@ -189,7 +189,7 @@ int malware(uschar **listptr) { } if (ip_connect(sock, AF_INET, (uschar*)inet_ntoa(in), port, 5) < 0) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: drweb: connection to %s, port %u failed (%s)", inet_ntoa(in), port, strerror(errno)); @@ -205,7 +205,7 @@ int malware(uschar **listptr) { /* calc file size */ drweb_fd = open(CS scanrequest, O_RDONLY); if (drweb_fd == -1) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: drweb: can't open spool file %s: %s", scanrequest, strerror(errno)); @@ -213,8 +213,8 @@ int malware(uschar **listptr) { } fsize = lseek(drweb_fd, 0, SEEK_END); if (fsize == -1) { - close(sock); - close(drweb_fd); + (void)close(sock); + (void)close(drweb_fd); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: drweb: can't seek spool file %s: %s", scanrequest, strerror(errno)); @@ -228,8 +228,8 @@ int malware(uschar **listptr) { (send(sock, &drweb_flags, sizeof(drweb_flags), 0) < 0) || (send(sock, &drweb_fin, sizeof(drweb_fin), 0) < 0) || (send(sock, &drweb_slen, sizeof(drweb_slen), 0) < 0)) { - close(sock); - close(drweb_fd); + (void)close(sock); + (void)close(drweb_fd); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: drweb: unable to send commands to socket (%s)", drweb_options); return DEFER; @@ -237,8 +237,8 @@ int malware(uschar **listptr) { drweb_fbuf = (uschar *) malloc (fsize); if (!drweb_fbuf) { - close(sock); - close(drweb_fd); + (void)close(sock); + (void)close(drweb_fd); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: drweb: unable to allocate memory %u for file (%s)", fsize, scanrequest); @@ -247,25 +247,25 @@ int malware(uschar **listptr) { result = read (drweb_fd, drweb_fbuf, fsize); if (result == -1) { - close(sock); - close(drweb_fd); + (void)close(sock); + (void)close(drweb_fd); free(drweb_fbuf); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: drweb: can't read spool file %s: %s", scanrequest, strerror(errno)); return DEFER; } - close(drweb_fd); + (void)close(drweb_fd); /* send file body to socket */ if (send(sock, drweb_fbuf, fsize, 0) < 0) { - close(sock); + (void)close(sock); free(drweb_fbuf); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: drweb: unable to send file body to socket (%s)", drweb_options); return DEFER; } - close(drweb_fd); + (void)close(drweb_fd); } else { /* open the drwebd UNIX socket */ @@ -278,7 +278,7 @@ int malware(uschar **listptr) { server.sun_family = AF_UNIX; Ustrcpy(server.sun_path, drweb_options); if (connect(sock, (struct sockaddr *) &server, sizeof(struct sockaddr_un)) < 0) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: drweb: unable to connect to socket (%s). errno=%d", drweb_options, errno); return DEFER; @@ -296,7 +296,7 @@ int malware(uschar **listptr) { (send(sock, &drweb_slen, sizeof(drweb_slen), 0) < 0) || (send(sock, scanrequest, Ustrlen(scanrequest), 0) < 0) || (send(sock, &drweb_fin, sizeof(drweb_fin), 0) < 0)) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: drweb: unable to send commands to socket (%s)", drweb_options); return DEFER; @@ -305,7 +305,7 @@ int malware(uschar **listptr) { /* wait for result */ if ((bread = recv(sock, &drweb_rc, sizeof(drweb_rc), 0) != sizeof(drweb_rc))) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: drweb: unable to read return code"); return DEFER; @@ -313,7 +313,7 @@ int malware(uschar **listptr) { drweb_rc = ntohl(drweb_rc); if ((bread = recv(sock, &drweb_vnum, sizeof(drweb_vnum), 0) != sizeof(drweb_vnum))) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: drweb: unable to read the number of viruses"); return DEFER; @@ -336,7 +336,7 @@ int malware(uschar **listptr) { { /* read the size of report */ if ((bread = recv(sock, &drweb_slen, sizeof(drweb_slen), 0) != sizeof(drweb_slen))) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: drweb: cannot read report size"); return DEFER; @@ -345,7 +345,7 @@ int malware(uschar **listptr) { /* read report body */ if ((bread = recv(sock, tmpbuf, drweb_slen, 0)) != drweb_slen) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: drweb: cannot read report string"); return DEFER; @@ -393,13 +393,13 @@ int malware(uschar **listptr) { if (drweb_s) { log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: drweb: drweb daemon retcode 0x%x (%s)", drweb_rc, drweb_s); - close(sock); + (void)close(sock); return DEFER; } /* no virus found */ malware_name = NULL; }; - close(sock); + (void)close(sock); } /* ----------------------------------------------------------------------- */ else if (strcmpic(scanner_name,US"aveserver") == 0) { @@ -428,7 +428,7 @@ int malware(uschar **listptr) { server.sun_family = AF_UNIX; Ustrcpy(server.sun_path, kav_options); if (connect(sock, (struct sockaddr *) &server, sizeof(struct sockaddr_un)) < 0) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: unable to connect to aveserver UNIX socket (%s). errno=%d", kav_options, errno); return DEFER; @@ -439,7 +439,7 @@ int malware(uschar **listptr) { if (buf[0] != '2') { /* aveserver is having problems */ - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: aveserver is unavailable (Responded: %s).", ((buf[0] != 0) ? buf : (uschar *)"nothing") ); return DEFER; @@ -450,7 +450,7 @@ int malware(uschar **listptr) { /* and send it */ if (send(sock, buf, Ustrlen(buf), 0) < 0) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: unable to write to aveserver UNIX socket (%s)", kav_options); return DEFER; @@ -483,7 +483,7 @@ int malware(uschar **listptr) { /* and send it */ if (send(sock, buf, Ustrlen(buf), 0) < 0) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: unable to write to aveserver UNIX socket (%s)", kav_options); return DEFER; @@ -494,13 +494,13 @@ int malware(uschar **listptr) { if (buf[0] != '2') { /* aveserver is having problems */ - close(sock); + (void)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); + (void)close(sock); if (result == DEFER) return DEFER; } @@ -538,7 +538,7 @@ int malware(uschar **listptr) { server.sun_family = AF_UNIX; Ustrcpy(server.sun_path, fsecure_options); if (connect(sock, (struct sockaddr *) &server, sizeof(struct sockaddr_un)) < 0) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: unable to connect to fsecure socket %s (%s)", fsecure_options, strerror(errno)); @@ -550,7 +550,7 @@ int malware(uschar **listptr) { for (i=0; i != 4; i++) { /* debug_printf("send option \"%s\"",cmdoptions[i]); */ if (write(sock, cmdoptions[i], Ustrlen(cmdoptions[i])) < 0) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: unable to write fsecure option %d to %s (%s)", i, fsecure_options, strerror(errno)); @@ -560,7 +560,7 @@ int malware(uschar **listptr) { bread = read(sock, av_buffer, sizeof(av_buffer)); if (bread >0) av_buffer[bread]='\0'; if (bread < 0) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: unable to read fsecure answer %d (%s)", i, strerror(errno)); return DEFER; @@ -574,7 +574,7 @@ int malware(uschar **listptr) { snprintf(CS file_name,1024,"SCAN\t%s/scan/%s/%s.eml\n", spool_directory, message_id, message_id); /* debug_printf("send scan %s",file_name); */ if (write(sock, file_name, Ustrlen(file_name)) < 0) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: unable to write fsecure scan to %s (%s)", fsecure_options, strerror(errno)); @@ -593,7 +593,7 @@ int malware(uschar **listptr) { do { bread=read(sock, &av_buffer[i], 1); if (bread < 0) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: unable to read fsecure result (%s)", strerror(errno)); return DEFER; @@ -616,7 +616,7 @@ int malware(uschar **listptr) { }; } while (Ustrstr(av_buffer, "OK\tScan ok.") == NULL); - close(sock); + (void)close(sock); } /* ----------------------------------------------------------------------- */ @@ -652,7 +652,7 @@ int malware(uschar **listptr) { server.sun_family = AF_UNIX; Ustrcpy(server.sun_path, kav_options); if (connect(sock, (struct sockaddr *) &server, sizeof(struct sockaddr_un)) < 0) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: unable to connect to kavdaemon UNIX socket (%s). errno=%d", kav_options, errno); return DEFER; @@ -665,7 +665,7 @@ int malware(uschar **listptr) { /* send scan request */ if (send(sock, scanrequest, Ustrlen(scanrequest)+1, 0) < 0) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: unable to write to kavdaemon UNIX socket (%s)", kav_options); return DEFER; @@ -673,7 +673,7 @@ int malware(uschar **listptr) { /* wait for result */ if ((bread = recv(sock, tmpbuf, 2, 0) != 2)) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: unable to read 2 bytes from kavdaemon socket."); return DEFER; @@ -689,21 +689,21 @@ int malware(uschar **listptr) { /* improper kavdaemon configuration */ if ( (kav_rc == 5) || (kav_rc == 6) ) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: please reconfigure kavdaemon to NOT disinfect or remove infected files."); return DEFER; }; if (kav_rc == 1) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: kavdaemon reported 'scanning not completed' (code 1)."); return DEFER; }; if (kav_rc == 7) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: kavdaemon reported 'kavdaemon damaged' (code 7)."); return DEFER; @@ -731,7 +731,7 @@ int malware(uschar **listptr) { if( report_flag == 1 ) { /* read report size */ if ((bread = recv(sock, &kav_reportlen, 4, 0)) != 4) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: cannot read report size from kavdaemon"); return DEFER; @@ -781,7 +781,7 @@ int malware(uschar **listptr) { malware_name = NULL; }; - close(sock); + (void)close(sock); } /* ----------------------------------------------------------------------- */ @@ -900,7 +900,7 @@ int malware(uschar **listptr) { trigger = 1; }; - fclose(scanner_record); + (void)fclose(scanner_record); pclose(scanner_out); signal(SIGCHLD,eximsigchld); signal(SIGPIPE,eximsigpipe); @@ -919,7 +919,7 @@ int malware(uschar **listptr) { pcre_copy_substring(CS linebuffer, ovector, result, 1, CS malware_name_buffer, 255); }; }; - fclose(scanner_record); + (void)fclose(scanner_record); } else { /* no virus found */ @@ -957,7 +957,7 @@ int malware(uschar **listptr) { server.sun_family = AF_UNIX; Ustrcpy(server.sun_path, sophie_options); if (connect(sock, (struct sockaddr *) &server, sizeof(struct sockaddr_un)) < 0) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: unable to connect to sophie UNIX socket (%s). errno=%d", sophie_options, errno); return DEFER; @@ -966,24 +966,24 @@ int malware(uschar **listptr) { /* pass the scan directory to sophie */ snprintf(CS file_name,1024,"%s/scan/%s", spool_directory, message_id); if (write(sock, file_name, Ustrlen(file_name)) < 0) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: unable to write to sophie UNIX socket (%s)", sophie_options); return DEFER; }; - write(sock, "\n", 1); + (void)write(sock, "\n", 1); /* wait for result */ memset(av_buffer, 0, sizeof(av_buffer)); if ((!(bread = read(sock, av_buffer, sizeof(av_buffer))) > 0)) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: unable to read from sophie UNIX socket (%s)", sophie_options); return DEFER; }; - close(sock); + (void)close(sock); /* infected ? */ if (av_buffer[0] == '1') { @@ -1068,7 +1068,7 @@ int malware(uschar **listptr) { } if (ip_connect(sock, AF_INET, (uschar*)inet_ntoa(in), port, 5) < 0) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: clamd: connection to %s, port %u failed (%s)", inet_ntoa(in), port, strerror(errno)); @@ -1082,7 +1082,7 @@ int malware(uschar **listptr) { snprintf(CS file_name,1024,"SCAN %s/scan/%s\n", spool_directory, message_id); if (send(sock, file_name, Ustrlen(file_name), 0) < 0) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC,"malware acl condition: clamd: unable to write to socket (%s)", strerror(errno)); return DEFER; @@ -1092,7 +1092,7 @@ int malware(uschar **listptr) { /* Pass the string to ClamAV (7 = "STREAM\n") */ if (send(sock, "STREAM\n", 7, 0) < 0) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC,"malware acl condition: clamd: unable to write to socket (%s)", strerror(errno)); return DEFER; @@ -1134,7 +1134,7 @@ int malware(uschar **listptr) { } if (ip_connect(sockData, AF_INET, (uschar*)inet_ntoa(in), port, 5) < 0) { - close(sockData); + (void)close(sockData); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: clamd: connection to %s, port %u failed (%s)", inet_ntoa(in), port, strerror(errno)); @@ -1163,8 +1163,8 @@ int malware(uschar **listptr) { clamav_fbuf = (uschar *) malloc (fsize); if (!clamav_fbuf) { - close(sockData); - close(clam_fd); + (void)close(sockData); + (void)close(clam_fd); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: clamd: unable to allocate memory %u for file (%s)", fsize, scanrequest); @@ -1173,26 +1173,26 @@ int malware(uschar **listptr) { result = read (clam_fd, clamav_fbuf, fsize); if (result == -1) { - close(sockData); - close(clam_fd); + (void)close(sockData); + (void)close(clam_fd); free(clamav_fbuf); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: clamd: can't read spool file %s: %s", scanrequest, strerror(errno)); return DEFER; } - close(clam_fd); + (void)close(clam_fd); /* send file body to socket */ if (send(sockData, clamav_fbuf, fsize, 0) < 0) { - close(sockData); + (void)close(sockData); free(clamav_fbuf); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: clamd: unable to send file body to socket (%s:%u)", hostname, port); return DEFER; } free(clamav_fbuf); - close(sockData); + (void)close(sockData); } } else { @@ -1208,7 +1208,7 @@ int malware(uschar **listptr) { Ustrcpy(server.sun_path, clamd_options); if (connect(sock, (struct sockaddr *) &server, sizeof(struct sockaddr_un)) < 0) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: clamd: unable to connect to UNIX socket %s (%s)", clamd_options, strerror(errno) ); @@ -1221,7 +1221,7 @@ int malware(uschar **listptr) { snprintf(CS file_name,1024,"SCAN %s/scan/%s\n", spool_directory, message_id); if (send(sock, file_name, Ustrlen(file_name), 0) < 0) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC,"malware acl condition: clamd: unable to write to socket (%s)", strerror(errno)); return DEFER; @@ -1239,7 +1239,7 @@ int malware(uschar **listptr) { /* Read the result */ memset(av_buffer, 0, sizeof(av_buffer)); bread = read(sock, av_buffer, sizeof(av_buffer)); - close(sock); + (void)close(sock); if (!(bread > 0)) { log_write(0, LOG_MAIN|LOG_PANIC, @@ -1339,7 +1339,7 @@ int malware(uschar **listptr) { server.sun_family = AF_UNIX; Ustrcpy(server.sun_path, "/var/run/mksd/socket"); if (connect(sock, (struct sockaddr *) &server, sizeof(struct sockaddr_un)) < 0) { - close(sock); + (void)close(sock); log_write(0, LOG_MAIN|LOG_PANIC, "malware acl condition: unable to connect to mksd UNIX socket (/var/run/mksd/socket). errno=%d", errno); return DEFER;