Blame SOURCES/0003-SSS_CLIENT-delete-key-in-lib-destructor.patch

bc6a8a
From 45a5630e0cfe95ab90bf4a7dd1b32f418c4c759e Mon Sep 17 00:00:00 2001
bc6a8a
From: Alexey Tikhonov <atikhono@redhat.com>
bc6a8a
Date: Fri, 23 Dec 2022 16:36:58 +0100
bc6a8a
Subject: [PATCH] SSS_CLIENT: delete key in lib destructor
bc6a8a
bc6a8a
pthread_key_delete() disables thread at-exit destructors.
bc6a8a
Otherwise an attempt to execute already unloaded `sss_at_thread_exit()`
bc6a8a
would trigger segfault.
bc6a8a
bc6a8a
This doesn't solve an issue with leaking on `dlclose()` FDs initialized in
bc6a8a
multiple threads, but better than crash.
bc6a8a
bc6a8a
Resolves: https://github.com/SSSD/sssd/issues/6505
bc6a8a
bc6a8a
Reviewed-by: Iker Pedrosa <ipedrosa@redhat.com>
bc6a8a
Reviewed-by: Sumit Bose <sbose@redhat.com>
bc6a8a
(cherry picked from commit 08ccd23fb2c831d6ea918a59b777a0073d414858)
bc6a8a
---
bc6a8a
 src/sss_client/common.c | 24 +++++++++++++++++++-----
bc6a8a
 1 file changed, 19 insertions(+), 5 deletions(-)
bc6a8a
bc6a8a
diff --git a/src/sss_client/common.c b/src/sss_client/common.c
bc6a8a
index d762dff49..2c888faa9 100644
bc6a8a
--- a/src/sss_client/common.c
bc6a8a
+++ b/src/sss_client/common.c
bc6a8a
@@ -27,6 +27,7 @@
bc6a8a
 #include <nss.h>
bc6a8a
 #include <security/pam_modules.h>
bc6a8a
 #include <errno.h>
bc6a8a
+#include <stdatomic.h>
bc6a8a
 #include <sys/types.h>
bc6a8a
 #include <sys/socket.h>
bc6a8a
 #include <sys/un.h>
bc6a8a
@@ -63,7 +64,8 @@
bc6a8a
 
bc6a8a
 #ifdef HAVE_PTHREAD_EXT
bc6a8a
 static pthread_key_t sss_sd_key;
bc6a8a
-static pthread_once_t sss_sd_key_initialized = PTHREAD_ONCE_INIT;
bc6a8a
+static pthread_once_t sss_sd_key_init = PTHREAD_ONCE_INIT;
bc6a8a
+static atomic_bool sss_sd_key_initialized = false;
bc6a8a
 static __thread int sss_cli_sd = -1; /* the sss client socket descriptor */
bc6a8a
 static __thread struct stat sss_cli_sb; /* the sss client stat buffer */
bc6a8a
 #else
bc6a8a
@@ -71,9 +73,6 @@ static int sss_cli_sd = -1; /* the sss client socket descriptor */
bc6a8a
 static struct stat sss_cli_sb; /* the sss client stat buffer */
bc6a8a
 #endif
bc6a8a
 
bc6a8a
-#if HAVE_FUNCTION_ATTRIBUTE_DESTRUCTOR
bc6a8a
-__attribute__((destructor))
bc6a8a
-#endif
bc6a8a
 void sss_cli_close_socket(void)
bc6a8a
 {
bc6a8a
     if (sss_cli_sd != -1) {
bc6a8a
@@ -91,9 +90,24 @@ static void sss_at_thread_exit(void *v)
bc6a8a
 static void init_sd_key(void)
bc6a8a
 {
bc6a8a
     pthread_key_create(&sss_sd_key, sss_at_thread_exit);
bc6a8a
+    sss_sd_key_initialized = true;
bc6a8a
+}
bc6a8a
+#endif
bc6a8a
+
bc6a8a
+#if HAVE_FUNCTION_ATTRIBUTE_DESTRUCTOR
bc6a8a
+__attribute__((destructor)) void sss_at_lib_unload(void)
bc6a8a
+{
bc6a8a
+#ifdef HAVE_PTHREAD_EXT
bc6a8a
+    if (sss_sd_key_initialized) {
bc6a8a
+        sss_sd_key_initialized = false;
bc6a8a
+        pthread_key_delete(sss_sd_key);
bc6a8a
+    }
bc6a8a
+#endif
bc6a8a
+    sss_cli_close_socket();
bc6a8a
 }
bc6a8a
 #endif
bc6a8a
 
bc6a8a
+
bc6a8a
 /* Requests:
bc6a8a
  *
bc6a8a
  * byte 0-3: 32bit unsigned with length (the complete packet length: 0 to X)
bc6a8a
@@ -572,7 +586,7 @@ static int sss_cli_open_socket(int *errnop, const char *socket_name, int timeout
bc6a8a
     }
bc6a8a
 
bc6a8a
 #ifdef HAVE_PTHREAD_EXT
bc6a8a
-    pthread_once(&sss_sd_key_initialized, init_sd_key); /* once for all threads */
bc6a8a
+    pthread_once(&sss_sd_key_init, init_sd_key); /* once for all threads */
bc6a8a
 
bc6a8a
     /* It actually doesn't matter what value to set for a key.
bc6a8a
      * The only important thing: key must be non-NULL to ensure
bc6a8a
-- 
bc6a8a
2.37.3
bc6a8a