commit cfbc5326c788b9ef2f647a1ce9c73d0fc7d503e7
parent a90ee41a414c8e2c9e550ab325f1db5906c81f41
Author: Christian Grothoff <christian@grothoff.org>
Date: Fri, 9 May 2025 20:57:46 +0200
fix unclean pthread destruction
Diffstat:
1 file changed, 36 insertions(+), 23 deletions(-)
diff --git a/src/util/secmod_common.c b/src/util/secmod_common.c
@@ -365,26 +365,6 @@ TES_await_ready (struct TES_Client *client)
}
-void
-TES_free_client (struct TES_Client *client)
-{
- GNUNET_assert (0 == pthread_mutex_lock (&TES_clients_lock));
- GNUNET_CONTAINER_DLL_remove (TES_clients_head,
- TES_clients_tail,
- client);
- GNUNET_assert (0 == pthread_mutex_unlock (&TES_clients_lock));
- GNUNET_break (0 == close (client->csock));
-#ifdef __linux__
- GNUNET_break (0 == close (client->esock));
-#else
- GNUNET_break (0 == close (client->esock_in));
- GNUNET_break (0 == close (client->esock_out));
-#endif
- pthread_detach (client->worker);
- GNUNET_free (client);
-}
-
-
/**
* Main function of a worker thread that signs.
*
@@ -400,7 +380,6 @@ sign_worker (void *cls)
client->cb.init (client))
{
GNUNET_break (0);
- TES_free_client (client);
return NULL;
}
while (! in_shutdown)
@@ -416,7 +395,6 @@ sign_worker (void *cls)
client->cb.dispatch))
break;
}
- TES_free_client (client);
return NULL;
}
@@ -496,7 +474,19 @@ listen_job (void *cls)
{
GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
"pthread_create");
- TES_free_client (client);
+ GNUNET_assert (0 == pthread_mutex_lock (&TES_clients_lock));
+ GNUNET_CONTAINER_DLL_remove (TES_clients_head,
+ TES_clients_tail,
+ client);
+ GNUNET_assert (0 == pthread_mutex_unlock (&TES_clients_lock));
+ GNUNET_break (0 == close (client->csock));
+#ifdef __linux__
+ GNUNET_break (0 == close (client->esock));
+#else
+ GNUNET_break (0 == close (client->esock_in));
+ GNUNET_break (0 == close (client->esock_out));
+#endif
+ GNUNET_free (client);
}
}
}
@@ -570,6 +560,8 @@ TES_listen_start (const struct GNUNET_CONFIGURATION_Handle *cfg,
void
TES_listen_stop (void)
{
+ struct TES_Client *client;
+
if (NULL != listen_task)
{
GNUNET_SCHEDULER_cancel (listen_task);
@@ -590,4 +582,25 @@ TES_listen_stop (void)
GNUNET_free (unixpath);
in_shutdown = true;
TES_wake_clients ();
+ GNUNET_assert (0 == pthread_mutex_lock (&TES_clients_lock));
+ while (NULL != (client = TES_clients_head))
+ {
+ void *rval;
+
+ GNUNET_CONTAINER_DLL_remove (TES_clients_head,
+ TES_clients_tail,
+ client);
+ GNUNET_break (0 ==
+ pthread_join (client->worker,
+ &rval));
+ GNUNET_break (0 == close (client->csock));
+#ifdef __linux__
+ GNUNET_break (0 == close (client->esock));
+#else
+ GNUNET_break (0 == close (client->esock_in));
+ GNUNET_break (0 == close (client->esock_out));
+#endif
+ GNUNET_free (client);
+ }
+ GNUNET_assert (0 == pthread_mutex_unlock (&TES_clients_lock));
}