Blame SOURCES/mod_revocator-clean-semaphore.patch

e7e179
From 1ae96f0e2befb602a8e1b63f642e525df5b44bb8 Mon Sep 17 00:00:00 2001
e7e179
From: Rob Crittenden <rcritten@redhat.com>
e7e179
Date: Fri, 5 Aug 2016 18:22:00 -0400
e7e179
Subject: [PATCH] Fix leaking semaphore on shutdown
e7e179
e7e179
When Apache kills its children it does so with a SIGTERM.
e7e179
This wasn't being handled so the semaphore used to do locking
e7e179
for the crlhelper wasn't being removed.
e7e179
e7e179
Add a signal handler to catch SIGTERM and perform cleanup.
e7e179
e7e179
Resolves: #1326840
e7e179
e7e179
---
e7e179
 crlhelper.cpp | 43 ++++++++++++++++++++++++++++++++-----------
e7e179
 1 file changed, 32 insertions(+), 11 deletions(-)
e7e179
e7e179
diff --git a/crlhelper.cpp b/crlhelper.cpp
e7e179
index f0a5b8a..719f8ff 100644
e7e179
--- a/crlhelper.cpp
e7e179
+++ b/crlhelper.cpp
e7e179
@@ -98,16 +98,41 @@ static void printList(Node *list)
e7e179
 
e7e179
 /* global variables */
e7e179
 Node *urlcache = NULL;
e7e179
+int semid = 0;
e7e179
+PRFileDesc *in = NULL;
e7e179
+PRFileDesc *out = NULL;
e7e179
+
e7e179
+void cleanup() {
e7e179
+    union semun semarg;
e7e179
+
e7e179
+    freeList(urlcache);
e7e179
+    if (in) {
e7e179
+        PR_Close(in);
e7e179
+        in = NULL;
e7e179
+    }
e7e179
+    if (NSS_IsInitialized()) {
e7e179
+        NSS_Shutdown();
e7e179
+    }
e7e179
+
e7e179
+    /* Remove the semaphore used for locking here. This is because this
e7e179
+     * program only goes away when Apache shuts down so we don't have to
e7e179
+     * worry about reloads.
e7e179
+     */
e7e179
+    semctl(semid, 0, IPC_RMID, semarg);
e7e179
+}
e7e179
+
e7e179
+void signalhandler(int signo) {
e7e179
+    if (signo == SIGTERM) {
e7e179
+        cleanup();
e7e179
+    }
e7e179
+}
e7e179
 
e7e179
 int main(int argc, char ** argv)
e7e179
 {
e7e179
     SECStatus rv;
e7e179
     PRInt32 numfds;
e7e179
-    PRFileDesc *in;
e7e179
-    PRFileDesc *out;
e7e179
     PRPollDesc pd;
e7e179
     PRIntervalTime timeout = PR_INTERVAL_NO_TIMEOUT;
e7e179
-    int semid;
e7e179
     pid_t parent_pid;
e7e179
     union semun semarg;
e7e179
     char buf[4096];
e7e179
@@ -121,6 +146,8 @@ int main(int argc, char ** argv)
e7e179
     PRInt32 len = 0;
e7e179
     PRInt32 errnum = -1;
e7e179
 
e7e179
+    signal(SIGTERM, signalhandler);
e7e179
+
e7e179
     /* Close all fds but stdin, stdout and stderr */
e7e179
     fd = 3;
e7e179
     while (fd < fdlimit)
e7e179
@@ -290,14 +317,8 @@ done:
e7e179
             }
e7e179
         } /* end POLL */
e7e179
     } /* end while */
e7e179
-    freeList(urlcache);
e7e179
-    PR_Close(in);
e7e179
-    NSS_Shutdown();
e7e179
 
e7e179
-    /* Remove the semaphore used for locking here. This is because this
e7e179
-     * program only goes away when Apache shuts down so we don't have to
e7e179
-     * worry about reloads.
e7e179
-     */
e7e179
-    semctl(semid, 0, IPC_RMID, semarg);
e7e179
+    cleanup();
e7e179
+
e7e179
     return 0;
e7e179
 }
e7e179
-- 
e7e179
1.8.3.1
e7e179