Blob Blame History Raw
From 1ae96f0e2befb602a8e1b63f642e525df5b44bb8 Mon Sep 17 00:00:00 2001
From: Rob Crittenden <rcritten@redhat.com>
Date: Fri, 5 Aug 2016 18:22:00 -0400
Subject: [PATCH] Fix leaking semaphore on shutdown

When Apache kills its children it does so with a SIGTERM.
This wasn't being handled so the semaphore used to do locking
for the crlhelper wasn't being removed.

Add a signal handler to catch SIGTERM and perform cleanup.

Resolves: #1326840

---
 crlhelper.cpp | 43 ++++++++++++++++++++++++++++++++-----------
 1 file changed, 32 insertions(+), 11 deletions(-)

diff --git a/crlhelper.cpp b/crlhelper.cpp
index f0a5b8a..719f8ff 100644
--- a/crlhelper.cpp
+++ b/crlhelper.cpp
@@ -98,16 +98,41 @@ static void printList(Node *list)
 
 /* global variables */
 Node *urlcache = NULL;
+int semid = 0;
+PRFileDesc *in = NULL;
+PRFileDesc *out = NULL;
+
+void cleanup() {
+    union semun semarg;
+
+    freeList(urlcache);
+    if (in) {
+        PR_Close(in);
+        in = NULL;
+    }
+    if (NSS_IsInitialized()) {
+        NSS_Shutdown();
+    }
+
+    /* Remove the semaphore used for locking here. This is because this
+     * program only goes away when Apache shuts down so we don't have to
+     * worry about reloads.
+     */
+    semctl(semid, 0, IPC_RMID, semarg);
+}
+
+void signalhandler(int signo) {
+    if (signo == SIGTERM) {
+        cleanup();
+    }
+}
 
 int main(int argc, char ** argv)
 {
     SECStatus rv;
     PRInt32 numfds;
-    PRFileDesc *in;
-    PRFileDesc *out;
     PRPollDesc pd;
     PRIntervalTime timeout = PR_INTERVAL_NO_TIMEOUT;
-    int semid;
     pid_t parent_pid;
     union semun semarg;
     char buf[4096];
@@ -121,6 +146,8 @@ int main(int argc, char ** argv)
     PRInt32 len = 0;
     PRInt32 errnum = -1;
 
+    signal(SIGTERM, signalhandler);
+
     /* Close all fds but stdin, stdout and stderr */
     fd = 3;
     while (fd < fdlimit)
@@ -290,14 +317,8 @@ done:
             }
         } /* end POLL */
     } /* end while */
-    freeList(urlcache);
-    PR_Close(in);
-    NSS_Shutdown();
 
-    /* Remove the semaphore used for locking here. This is because this
-     * program only goes away when Apache shuts down so we don't have to
-     * worry about reloads.
-     */
-    semctl(semid, 0, IPC_RMID, semarg);
+    cleanup();
+
     return 0;
 }
-- 
1.8.3.1