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