Browse code

bb11496 - adding signal handling to clamav-milter to allow for socket removal and cleanup at close

Mickey Sola authored on 2016/02/20 06:16:39
Showing 1 changed files
... ...
@@ -29,6 +29,8 @@
29 29
 #include <pwd.h>
30 30
 #include <grp.h>
31 31
 #include <string.h>
32
+#include <signal.h>
33
+#include <pthread.h>
32 34
 #ifdef USE_SYSLOG
33 35
 #include <syslog.h>
34 36
 #endif
... ...
@@ -48,15 +50,57 @@
48 48
 #include "whitelist.h"
49 49
 
50 50
 struct smfiDesc descr;
51
+struct optstruct *opts;
52
+
53
+static void milter_exit(int sig) {
54
+    const struct optstruct *opt;
55
+
56
+    logg("*clamav-milter: milter_exit, signal %d\n", sig);
57
+
58
+#ifndef _WIN32
59
+    if((opt = optget(opts, "MilterSocket"))) {
60
+        if(unlink(opt->strarg) == -1)
61
+            logg("!Can't unlink the socket file %s\n", opt->strarg);
62
+        else
63
+            logg("Socket file removed.\n");
64
+    }
65
+#endif
66
+
67
+    logg("clamav-milter: stopped\n");
68
+
69
+    optfree(opts);
70
+
71
+    logg_close();
72
+    cpool_free();
73
+    localnets_free();
74
+    whitelist_free();
75
+}
51 76
 
52 77
 int main(int argc, char **argv) {
53 78
     char *my_socket, *pt;
54 79
     const struct optstruct *opt;
55
-    struct optstruct *opts;
56 80
     time_t currtime;
57 81
     mode_t umsk;
58 82
     int ret;
59 83
 
84
+    sigset_t sigset;
85
+    struct sigaction act;
86
+
87
+    sigfillset(&sigset);
88
+    sigdelset(&sigset, SIGUSR1);
89
+    sigdelset(&sigset, SIGFPE);
90
+    sigdelset(&sigset, SIGILL);
91
+    sigdelset(&sigset, SIGSEGV);
92
+#ifdef SIGBUS
93
+    sigdelset(&sigset, SIGBUS);
94
+#endif
95
+    pthread_sigmask(SIG_SETMASK, &sigset, NULL);
96
+    memset(&act, 0, sizeof(struct sigaction));
97
+    act.sa_handler = milter_exit;
98
+    sigfillset(&(act.sa_mask));
99
+    sigaction(SIGUSR1, &act, NULL);
100
+    sigaction(SIGSEGV, &act, NULL);
101
+
60 102
     cl_initialize_crypto();
61 103
 
62 104
     memset(&descr, 0, sizeof(struct smfiDesc));
... ...
@@ -403,16 +447,7 @@ int main(int argc, char **argv) {
403 403
 	umask(old_umask);
404 404
     }
405 405
 
406
-    ret = smfi_main();
407
-
408
-    optfree(opts);
409
-
410
-    logg_close();
411
-    cpool_free();
412
-    localnets_free();
413
-    whitelist_free();
414
-
415
-    return ret;
406
+    return smfi_main();
416 407
 }
417 408
 
418 409
 /*