diff options
author | Petr Cech <pcech@redhat.com> | 2016-08-04 16:25:28 +0200 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2016-08-17 16:16:58 +0200 |
commit | 4313147ab4214037900cbb3ced8a03e492bff02c (patch) | |
tree | 207faf4ae372a01795831fa7cdf637ecd5bbce74 | |
parent | b72bf8cf70f8973d805c73a02ec681156ac9396d (diff) | |
download | sssd-4313147ab4214037900cbb3ced8a03e492bff02c.tar.gz sssd-4313147ab4214037900cbb3ced8a03e492bff02c.tar.xz sssd-4313147ab4214037900cbb3ced8a03e492bff02c.zip |
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
Reviewed-by: Pavel Březina <pbrezina@redhat.com>
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
-rw-r--r-- | src/providers/ldap/ldap_child.c | 29 | ||||
-rw-r--r-- | src/util/child_common.h | 2 |
2 files changed, 31 insertions, 0 deletions
diff --git a/src/providers/ldap/ldap_child.c b/src/providers/ldap/ldap_child.c index 52c271f36..ffcbc3985 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(CHILD_TIMEOUT_EXIT_CODE); +} + static krb5_context krb5_error_ctx; #define LDAP_CHILD_DEBUG(level, error) KRB5_DEBUG(level, krb5_error_ctx, error) @@ -405,6 +429,7 @@ static krb5_error_code ldap_child_get_tgt_sync(TALLOC_CTX *memctx, strerror(krberr), krberr); goto done; } + global_ccname_file_dummy = ccname_file_dummy; ret = sss_unique_filename(tmp_ctx, ccname_file_dummy); if (ret != EOK) { @@ -490,6 +515,7 @@ static krb5_error_code ldap_child_get_tgt_sync(TALLOC_CTX *memctx, "rename failed [%d][%s].\n", ret, strerror(ret)); goto done; } + 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); diff --git a/src/util/child_common.h b/src/util/child_common.h index 2a6286903..d843cc36d 100644 --- a/src/util/child_common.h +++ b/src/util/child_common.h @@ -35,6 +35,8 @@ #define IN_BUF_SIZE 512 #define CHILD_MSG_CHUNK 256 +#define CHILD_TIMEOUT_EXIT_CODE 7 + struct response { uint8_t *buf; size_t size; |