BSD: fix resource leak
authorJeremy Harris <jgh146exb@wizmail.org>
Tue, 11 Jan 2022 11:21:45 +0000 (11:21 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Tue, 11 Jan 2022 11:21:45 +0000 (11:21 +0000)
doc/doc-txt/ChangeLog
src/src/tls.c
test/runtest

index e7c7085f81aaa578904dc104c38268f09e47c5b7..56739948318f7d761fbe5a13f8e656bf29854f80 100644 (file)
@@ -65,6 +65,10 @@ JH/13 Bug 2845: Fix handling of tls_require_ciphers for OpenSSL when a value
 
 JH/14 Bug 1895: TLS: Deprecate RFC 5114 Diffie-Hellman parameters.
 
+JH/15 Fix a resource leak in *BSD.  An off-by-one error resulted in the daemon
+      failing to close the certificates directory, every hour or any time it
+      was touched.
+
 
 Exim version 4.95
 -----------------
index d5d11bcea874cc58a0b76c621fc1b2192a6d75ec..e6b1bf7a70aa8595afa7b5a2d8b088046031a42a 100644 (file)
@@ -185,8 +185,8 @@ for (;;)
     {
     if ((fd1 = open(CCS filename, O_RDONLY | O_NOFOLLOW)) < 0)
       { s = US"open file"; goto bad; }
-    DEBUG(D_tls) debug_printf("watch file '%s'\n", filename);
-    EV_SET(&kev[++kev_used],
+    DEBUG(D_tls) debug_printf("watch file '%s':\t%d\n", filename, fd1);
+    EV_SET(&kev[kev_used++],
        (uintptr_t)fd1,
        EVFILT_VNODE,
        EV_ADD | EV_ENABLE | EV_ONESHOT,
@@ -196,8 +196,8 @@ for (;;)
        NULL);
     cnt++;
     }
-  DEBUG(D_tls) debug_printf("watch dir  '%s'\n", s);
-  EV_SET(&kev[++kev_used],
+  DEBUG(D_tls) debug_printf("watch dir  '%s':\t%d\n", s, fd2);
+  EV_SET(&kev[kev_used++],
        (uintptr_t)fd2,
        EVFILT_VNODE,
        EV_ADD | EV_ENABLE | EV_ONESHOT,
@@ -320,6 +320,7 @@ if (tls_watch_fd < 0) return;
 /* Close the files we had open for kevent */
 for (int i = 0; i < kev_used; i++)
   {
+  DEBUG(D_tls) debug_printf("closing watch fd: %d\n", (int) kev[i].ident);
   (void) close((int) kev[i].ident);
   kev[i].ident = (uintptr_t)-1;
   }
index 0f883e8fc1bff48d247d06f54c958b9ffa8b8ebd..3d5a975ff61419120442d1ab1b3df50e9ec5e625 100755 (executable)
@@ -1108,6 +1108,7 @@ RESET_AFTER_EXTRA_LINE_READ:
     next if /^watch dir/;
     next if /^watch file .*\/usr\/local/;
     next if /^watch file .*\/etc\/ssl/;
+    next if /^closing watch fd:/;
 
     # TLS preload
     # there happen in different orders for OpenSSL/GnuTLS/noTLS