openssh 7.2p2: tty sometimes left in raw mode after a connection timeout
Craig Leres
leres at ee.lbl.gov
Sat Apr 23 04:16:02 AEST 2016
I'm running FreeBSD 9 and openssh 7.2p2:
ice 1040 % uname -a
FreeBSD ice.ee.lbl.gov 9.3-RELEASE FreeBSD 9.3-RELEASE #1 r21: Fri
Mar 4 10:42:36 PST 2016 leres at fun.ee.lbl.gov:/sys/amd64/compile/LBL
amd64
ice 1041 % ssh -V
OpenSSH_7.2p2, OpenSSL 1.0.2g 1 Mar 2016
Occasionally when a connection times out, ssh leaves my shell in raw mode:
packet_write_wait: Connection to UNKNOWN port 0: Broken pipe
tcsetattr: Interrupted system call
I think the problem is that a signal can interrupt tcsetattr() in
leave_raw_mode() causing it to fail with EINTR. When this happens, the
terminal is left in raw mode.
The attached (untested) patch retries the tcsetattr() if it fails with
EINTR.
Craig
-------------- next part --------------
--- sshtty.c.orig 2016-04-22 11:02:05.000000000 -0700
+++ sshtty.c 2016-04-22 11:12:58.000000000 -0700
@@ -41,6 +41,7 @@
#include <stdio.h>
#include <termios.h>
#include <pwd.h>
+#include <errno.h>
#include "sshpty.h"
@@ -58,11 +59,14 @@
{
if (!_in_raw_mode)
return;
- if (tcsetattr(fileno(stdin), TCSADRAIN, &_saved_tio) == -1) {
+ while (tcsetattr(fileno(stdin), TCSADRAIN, &_saved_tio) == -1) {
if (!quiet)
perror("tcsetattr");
- } else
- _in_raw_mode = 0;
+ if (errno == EINTR)
+ continue;
+ return;
+ }
+ _in_raw_mode = 0;
}
void
More information about the openssh-unix-dev
mailing list