From ee353847be7b98de6d2a989f3522b5bd989261e4 Mon Sep 17 00:00:00 2001 From: Matt Johnston <matt@ucc.asn.au> Date: Fri, 27 Nov 2015 21:26:43 +0800 Subject: [PATCH] Fix ses.channel_signal_pending race --- common-channel.c | 2 -- common-session.c | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/common-channel.c b/common-channel.c index 5f4e92de..8a101058 100644 --- a/common-channel.c +++ b/common-channel.c @@ -255,8 +255,6 @@ void channelio(fd_set *readfds, fd_set *writefds) { } } - ses.channel_signal_pending = 0; - #ifdef USING_LISTENERS handle_listeners(readfds); #endif diff --git a/common-session.c b/common-session.c index 96d747db..874d5396 100644 --- a/common-session.c +++ b/common-session.c @@ -162,6 +162,7 @@ void session_loop(void(*loophandler)()) { /* We get woken up when signal handlers write to this pipe. SIGCHLD in svr-chansession is the only one currently. */ FD_SET(ses.signal_pipe[0], &readfd); + ses.channel_signal_pending = 0; /* set up for channels which can be read/written */ setchannelfds(&readfd, &writefd, writequeue_has_space); @@ -211,7 +212,9 @@ void session_loop(void(*loophandler)()) { wake up the select() above. */ if (FD_ISSET(ses.signal_pipe[0], &readfd)) { char x; + TRACE(("signal pipe set")) while (read(ses.signal_pipe[0], &x, 1) > 0) {} + ses.channel_signal_pending = 1; } /* check for auth timeout, rekeying required etc */ -- GitLab