From 50d83072b48b198284871a5c950982dfbeeab974 Mon Sep 17 00:00:00 2001
From: Petr Cech <pcech@redhat.com>
Date: Thu, 4 Aug 2016 16:25:28 +0200
Subject: [PATCH 1/2] LDAP: Adding support for SIGTERM signal

We add support for handling SIGTERM signal. If ldap_child receives
SIGTERM signal it removes temporary file.

Resolves:
https://fedorahosted.org/sssd/ticket/3106
---
 src/providers/ldap/ldap_child.c | 45 +++++++++++++++++++++++++++++++++--------
 1 file changed, 37 insertions(+), 8 deletions(-)

diff --git a/src/providers/ldap/ldap_child.c b/src/providers/ldap/ldap_child.c
index 52c271f36cb57b774e6091e7322e4b1394c78969..69595db159b0f784b067135f9384e6ca15359540 100644
--- a/src/providers/ldap/ldap_child.c
+++ b/src/providers/ldap/ldap_child.c
@@ -33,6 +33,30 @@
 #include "providers/backend.h"
 #include "providers/krb5/krb5_common.h"
 
+char *global_ccname_file_dummy = NULL;
+
+static void sig_term_handler(int sig)
+{
+    int ret;
+
+    DEBUG(SSSDBG_FATAL_FAILURE, "Received signal [%s] [%i], shutting down\n",
+                                strsignal(sig), sig);
+
+    if (global_ccname_file_dummy != NULL) {
+        ret = unlink(global_ccname_file_dummy);
+        if (ret != 0) {
+            DEBUG(SSSDBG_FATAL_FAILURE, "Unlink file [%s] failed [%i][%s]\n",
+                                        global_ccname_file_dummy,
+                                        errno, strerror(errno));
+        } else {
+            DEBUG(SSSDBG_FATAL_FAILURE, "Unlink file [%s]\n",
+                                        global_ccname_file_dummy);
+        }
+    }
+
+    _exit(0);
+}
+
 static krb5_context krb5_error_ctx;
 #define LDAP_CHILD_DEBUG(level, error) KRB5_DEBUG(level, krb5_error_ctx, error)
 
@@ -271,7 +295,6 @@ static krb5_error_code ldap_child_get_tgt_sync(TALLOC_CTX *memctx,
     int kdc_time_offset_usec;
     int ret;
     TALLOC_CTX *tmp_ctx;
-    char *ccname_file_dummy = NULL;
     char *ccname_file;
 
     tmp_ctx = talloc_new(memctx);
@@ -396,9 +419,9 @@ static krb5_error_code ldap_child_get_tgt_sync(TALLOC_CTX *memctx,
         goto done;
     }
 
-    ccname_file_dummy = talloc_asprintf(tmp_ctx, "%s/ccache_%s_XXXXXX",
-                                        DB_PATH, realm_name);
-    if (ccname_file_dummy == NULL) {
+    global_ccname_file_dummy = talloc_asprintf(tmp_ctx, "%s/ccache_%s_XXXXXX",
+                                               DB_PATH, realm_name);
+    if (global_ccname_file_dummy == NULL) {
         krberr = ENOMEM;
         DEBUG(SSSDBG_CRIT_FAILURE,
               "talloc_asprintf failed: %s:[%d].\n",
@@ -406,7 +429,7 @@ static krb5_error_code ldap_child_get_tgt_sync(TALLOC_CTX *memctx,
         goto done;
     }
 
-    ret = sss_unique_filename(tmp_ctx, ccname_file_dummy);
+    ret = sss_unique_filename(tmp_ctx, global_ccname_file_dummy);
     if (ret != EOK) {
         DEBUG(SSSDBG_CRIT_FAILURE,
               "sss_unique_filename failed: %s:[%d].\n",
@@ -432,7 +455,8 @@ static krb5_error_code ldap_child_get_tgt_sync(TALLOC_CTX *memctx,
     }
     DEBUG(SSSDBG_TRACE_INTERNAL, "credentials initialized\n");
 
-    ccname_dummy = talloc_asprintf(tmp_ctx, "FILE:%s", ccname_file_dummy);
+    ccname_dummy = talloc_asprintf(tmp_ctx, "FILE:%s",
+                                   global_ccname_file_dummy);
     ccname = talloc_asprintf(tmp_ctx, "FILE:%s", ccname_file);
     if (ccname_dummy == NULL || ccname == NULL) {
         krberr = ENOMEM;
@@ -482,14 +506,16 @@ static krb5_error_code ldap_child_get_tgt_sync(TALLOC_CTX *memctx,
 #endif
 
     DEBUG(SSSDBG_TRACE_INTERNAL,
-          "Renaming [%s] to [%s]\n", ccname_file_dummy, ccname_file);
-    ret = rename(ccname_file_dummy, ccname_file);
+          "Renaming [%s] to [%s]\n", global_ccname_file_dummy, ccname_file);
+    ret = rename(global_ccname_file_dummy, ccname_file);
     if (ret == -1) {
         ret = errno;
         DEBUG(SSSDBG_CRIT_FAILURE,
               "rename failed [%d][%s].\n", ret, strerror(ret));
         goto done;
     }
+    talloc_free(global_ccname_file_dummy);
+    global_ccname_file_dummy = NULL;
 
     krberr = 0;
     *ccname_out = talloc_steal(memctx, ccname);
@@ -631,6 +657,9 @@ int main(int argc, const char *argv[])
         }
     }
 
+    BlockSignals(false, SIGTERM);
+    CatchSignal(SIGTERM, sig_term_handler);
+
     DEBUG(SSSDBG_TRACE_FUNC, "ldap_child started.\n");
 
     main_ctx = talloc_new(NULL);
-- 
2.7.4

