From 2cdaef7529601066e446164995ee42513170b28e Mon Sep 17 00:00:00 2001 From: Ben Kibbey Date: Sat, 10 Nov 2007 15:44:58 -0500 Subject: [PATCH] Fixed assuan_process_next() reading a not ready file descriptor after send_cache_status(). --- src/pwmd.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/pwmd.c b/src/pwmd.c index 9cddbc3b..e176eadd 100644 --- a/src/pwmd.c +++ b/src/pwmd.c @@ -287,6 +287,7 @@ static void *doit(void *data) pth_sigmask(SIG_BLOCK, &set, NULL); sigemptyset(&set); sigaddset(&set, SIGUSR2); + sigaddset(&set, SIGPIPE); cl->ctx = new_connection(fd); cl->fd = fd; @@ -316,7 +317,7 @@ static void *doit(void *data) switch (sig) { case SIGUSR2: send_cache_status(cl->ctx); - break; + continue; default: break; } @@ -1079,7 +1080,7 @@ static void server_loop(int sockfd) guint n, i; sigset_t set; gint n_clients = 0; - pth_attr_t attr; + pth_attr_t tattr, attr; pth_event_t timeout_event; gpointer value; @@ -1107,17 +1108,16 @@ static void server_loop(int sockfd) pth_attr_set(attr, PTH_ATTR_CANCEL_STATE, PTH_CANCEL_ASYNCHRONOUS); socket_tid = pth_spawn(attr, socket_thread, (void *)sockfd); cleanup_tid = pth_spawn(attr, cleanup_thread, NULL); - pth_attr_destroy(attr); /* * For the cache_timeout configuration parameter. This replaces the old * SIGALRM stuff and is safer. */ timeout_event = pth_event(PTH_EVENT_TIME, pth_timeout(1, 0)); - attr = pth_attr_new(); - pth_attr_init(attr); - pth_attr_set(attr, PTH_ATTR_JOINABLE, FALSE); - pth_attr_set(attr, PTH_ATTR_PRIO, PTH_PRIO_MIN); + tattr = pth_attr_new(); + pth_attr_init(tattr); + pth_attr_set(tattr, PTH_ATTR_JOINABLE, FALSE); + pth_attr_set(tattr, PTH_ATTR_PRIO, PTH_PRIO_MIN); do { gint sig = 0; @@ -1130,7 +1130,7 @@ static void server_loop(int sockfd) * cache mutex is locked and the timer expires again, the threads * will stack. */ - pth_spawn(attr, adjust_cache_time_thread, NULL); + pth_spawn(tattr, adjust_cache_time_thread, NULL); pth_event_free(timeout_event, PTH_FREE_THIS); timeout_event = pth_event(PTH_EVENT_TIME, pth_timeout(1, 0)); } @@ -1168,6 +1168,7 @@ static void server_loop(int sockfd) } while (!quit); pth_attr_destroy(attr); + pth_attr_destroy(tattr); /* * We're out of the main server loop. This happens when a signal was sent @@ -1237,6 +1238,7 @@ int main(int argc, char *argv[]) guint ptotal = 0; gint background = 0; sigset_t set; +#if 0 #ifndef DEBUG #ifdef HAVE_SETRLIMIT struct rlimit rl; @@ -1247,6 +1249,7 @@ int main(int argc, char *argv[]) err(EXIT_FAILURE, "setrlimit()"); #endif #endif +#endif #ifdef ENABLE_NLS setlocale(LC_ALL, ""); -- 2.11.4.GIT