[Mimedefang] MIMEDefang 3.4.1 fixes

Marc Aurèle La France tsi at tuyoix.net
Mon Jun 3 22:34:47 EDT 2024


Hi.

- In both mimedefang and the multiplexor, fix use-after-free of lockfile
  name.
- In mimedefang, fix minor memory leak caused by specifying more than one
  -m option.
- Ensure mimedefang deletes its socket upon termination.

Lastly, in your release tarballs, please do NOT include files generated by 
your configure script.

Thanks and have a great day.

Marc.

diff -NRapruz -X /etc/diff.excludes mimedefang-3.4.1/mimedefang-multiplexor.c devel-3.4.1/mimedefang-multiplexor.c
--- mimedefang-3.4.1/mimedefang-multiplexor.c	2023-04-11 17:03:43.000000000 -0600
+++ devel-3.4.1/mimedefang-multiplexor.c	2024-05-28 21:01:47.605110408 -0600
@@ -1056,7 +1056,7 @@ main(int argc, char *argv[], char **env)

     /* Do the locking */
     if (pidfile || lockfile) {
-	if ( (lockfile_fd = write_and_lock_pidfile(pidfile, lockfile, pidfile_fd)) < 0) {
+	if ( (lockfile_fd = write_and_lock_pidfile(pidfile, &lockfile, pidfile_fd)) < 0) {
 	    REPORT_FAILURE("Cannot lock lockfile: Is another copy running?");
 	    exit(EXIT_FAILURE);
 	}
diff -NRapruz -X /etc/diff.excludes mimedefang-3.4.1/mimedefang.c devel-3.4.1/mimedefang.c
--- mimedefang-3.4.1/mimedefang.c	2023-04-11 17:03:43.000000000 -0600
+++ devel-3.4.1/mimedefang.c	2024-06-01 16:32:24.060072056 -0600
@@ -2267,6 +2267,7 @@ main(int argc, char **argv)
     int nodaemon = 0;
     char buf[SMALLBUF];
     int got_p_option = 0;
+    char *sockfile = NULL;
     int kidpipe[2];
     char kidmsg[256];
     int pidfile_fd = -1;
@@ -2499,6 +2500,7 @@ main(int argc, char **argv)
 	    break;
 	case 'm':
 	    /* Multiplexor */
+	    if (MultiplexorSocketName) free(MultiplexorSocketName);
 	    MultiplexorSocketName = strdup(optarg);
 	    if (!MultiplexorSocketName) {
 		fprintf(stderr, "%s: Out of memory\n", argv[0]);
@@ -2515,6 +2517,12 @@ main(int argc, char **argv)
 			argv[0], optarg);
 		exit(EXIT_FAILURE);
 	    }
+	    if (sockfile) free(sockfile);
+	    sockfile = strdup(optarg);
+	    if (!sockfile) {
+		fprintf(stderr, "%s: Out of memory\n", argv[0]);
+		exit(EXIT_FAILURE);
+	    }
 	    got_p_option = 1;
 	    /* Remove socket from file system if it's a local socket */
 	    (void) remove_local_socket(optarg);
@@ -2694,7 +2702,7 @@ main(int argc, char **argv)

     /* Do the locking */
     if (pidfile || lockfile) {
-	if ( (lockfile_fd = write_and_lock_pidfile(pidfile, lockfile, pidfile_fd)) < 0) {
+	if ( (lockfile_fd = write_and_lock_pidfile(pidfile, &lockfile, pidfile_fd)) < 0) {
 	    /* Signal the waiting parent */
 	    REPORT_FAILURE("Cannot lock lockfile: Is another copy running?");
 	    exit(EXIT_FAILURE);
@@ -2765,6 +2773,9 @@ main(int argc, char **argv)
     if (lockfile) {
 	unlink(lockfile);
     }
+    if (sockfile) {
+	remove(sockfile);
+    }
     return rc;
 }

diff -NRapruz -X /etc/diff.excludes mimedefang-3.4.1/mimedefang.h devel-3.4.1/mimedefang.h
--- mimedefang-3.4.1/mimedefang.h	2023-04-11 17:03:43.000000000 -0600
+++ devel-3.4.1/mimedefang.h	2024-05-28 15:18:36.377783713 -0600
@@ -69,7 +69,7 @@ extern int make_listening_socket(char const *str, int backlog, int must_be_unix);
 extern void do_delay(char const *sleepstr);
 extern int is_localhost(struct sockaddr *);
 extern int remove_local_socket(char const *str);
-extern int write_and_lock_pidfile(char const *pidfile, char *lockfile, int fd);
+extern int write_and_lock_pidfile(char const *pidfile, char **lockfile, int fd);
 #ifdef EMBED_PERL
 extern int make_embedded_interpreter(char const *progPath,
 				     char const *subFilter,
diff -NRapruz -X /etc/diff.excludes mimedefang-3.4.1/utils.c devel-3.4.1/utils.c
--- mimedefang-3.4.1/utils.c	2023-04-11 17:03:43.000000000 -0600
+++ devel-3.4.1/utils.c	2024-05-28 15:22:24.885037463 -0600
@@ -1305,30 +1305,31 @@ free_debug(void *ctx, void *x, char const *fname, int line)
 #endif

 int
-write_and_lock_pidfile(char const *pidfile, char *lockfile, int pidfile_fd)
+write_and_lock_pidfile(char const *pidfile, char **lockfile, int pidfile_fd)
 {
     struct flock fl;
     char buf[64];
     int lockfile_fd;
     size_t len;

-    if (!lockfile) {
+    if (!*lockfile) {
 	if (!pidfile) {
 	    return -1;
 	}
 	len = strlen(pidfile) + 6;
 	/* If no lockfile was supplied, construct one based on pidfile */
-	lockfile = malloc(len);
-	if (!lockfile) {
+	*lockfile = malloc(len);
+	if (!*lockfile) {
 	    return -1;
 	}

-	snprintf(lockfile, len, "%s.lock", pidfile);
+	snprintf(*lockfile, len, "%s.lock", pidfile);
     }

-    lockfile_fd = open(lockfile, O_RDWR|O_CREAT, 0666);
+    lockfile_fd = open(*lockfile, O_RDWR|O_CREAT, 0666);
     if (lockfile_fd < 0) {
-      free(lockfile);
+      free(*lockfile);
+      *lockfile = NULL;
       return -1;
     }

@@ -1338,8 +1339,7 @@ write_and_lock_pidfile(char const *pidfile, char *lockfile, int pidfile_fd)
     fl.l_len = 0;

     if (fcntl(lockfile_fd, F_SETLK, &fl) < 0) {
-      syslog(LOG_ERR, "Could not lock lockfile file %s: %m.  Is another copy running?", lockfile);
-      free(lockfile);
+      syslog(LOG_ERR, "Could not lock lockfile file %s: %m.  Is another copy running?", *lockfile);
       return -1;
     }
     if (pidfile_fd >= 0) {
@@ -1349,11 +1349,9 @@ write_and_lock_pidfile(char const *pidfile, char *lockfile, int pidfile_fd)

 	/* Close the pidfile fd; no longer needed */
 	if (close(pidfile_fd) < 0) {
-      free(lockfile);
 	    return -1;
 	}
     }
-    free(lockfile);

     /* Do NOT close lockfile_fd... it will close and lock will be released
        when we exit */



More information about the MIMEDefang mailing list