diff options
author | dtucker@openbsd.org <dtucker@openbsd.org> | 2019-03-06 21:06:59 +0000 |
---|---|---|
committer | Darren Tucker <dtucker@dtucker.net> | 2019-03-08 14:58:30 +1100 |
commit | ab5fee8eb6a011002fd9e32b1597f02aa8804a25 (patch) | |
tree | 84295cd323a031c35062427702bda864bbe25a92 | |
parent | c13b74530f9f1d9df7aeae012004b31b2de4438e (diff) |
upstream: Reset last-seen time when sending a keepalive. Prevents
sending two keepalives successively and prematurely terminating connection
when ClientAliveCount=1. While there, collapse two similar tests into one.
ok markus@
OpenBSD-Commit-ID: 043670d201dfe222537a2a4bed16ce1087de5ddd
-rw-r--r-- | serverloop.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/serverloop.c b/serverloop.c index 9602e050..f86f832b 100644 --- a/serverloop.c +++ b/serverloop.c @@ -1,4 +1,4 @@ -/* $OpenBSD: serverloop.c,v 1.213 2019/01/19 22:30:52 djm Exp $ */ +/* $OpenBSD: serverloop.c,v 1.214 2019/03/06 21:06:59 dtucker Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -225,6 +225,7 @@ wait_until_can_do_something(struct ssh *ssh, int ret; time_t minwait_secs = 0; int client_alive_scheduled = 0; + /* time we last heard from the client OR sent a keepalive */ static time_t last_client_time; /* Allocate and update select() masks for channel descriptors. */ @@ -293,13 +294,15 @@ wait_until_can_do_something(struct ssh *ssh, } else if (client_alive_scheduled) { time_t now = monotime(); - if (ret == 0) { /* timeout */ + /* + * If the select timed out, or returned for some other reason + * but we haven't heard from the client in time, send keepalive. + */ + if (ret == 0 || (last_client_time != 0 && last_client_time + + options.client_alive_interval <= now)) { client_alive_check(ssh); - } else if (FD_ISSET(connection_in, *readsetp)) { last_client_time = now; - } else if (last_client_time != 0 && last_client_time + - options.client_alive_interval <= now) { - client_alive_check(ssh); + } else if (FD_ISSET(connection_in, *readsetp)) { last_client_time = now; } } |