From 7d299ecbb3a56f1633f17f746f864c02cd344c85 Mon Sep 17 00:00:00 2001 From: Petr Rockai Date: Wed, 9 Oct 2013 22:20:36 +0200 Subject: [PATCH] libdaemon: Fix a subtle race in worker thread creation. --- libdaemon/server/daemon-server.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libdaemon/server/daemon-server.c b/libdaemon/server/daemon-server.c index df2c852ff..b114b9f30 100644 --- a/libdaemon/server/daemon-server.c +++ b/libdaemon/server/daemon-server.c @@ -381,6 +381,7 @@ static void *client_thread(void *baton) request req; response res; + b->client.thread_id = pthread_self(); buffer_init(&req.buffer); while (1) { @@ -431,6 +432,7 @@ static int handle_connect(daemon_state s) struct sockaddr_un sockaddr; client_handle client = { .thread_id = 0 }; socklen_t sl = sizeof(sockaddr); + pthread_t tid; client.socket_fd = accept(s.socket_fd, (struct sockaddr *) &sockaddr, &sl); if (client.socket_fd < 0) @@ -446,10 +448,10 @@ static int handle_connect(daemon_state s) baton->s = s; baton->client = client; - if (pthread_create(&baton->client.thread_id, NULL, client_thread, baton)) + if (pthread_create(&tid, NULL, client_thread, baton)) return 0; - pthread_detach(baton->client.thread_id); + pthread_detach(tid); return 1; }