From: Lennart Poettering Date: Fri, 24 Nov 2023 09:58:00 +0000 (+0100) Subject: ptyfwd: don't reset TTY twice if stdin/stdout point to same TTY X-Git-Tag: v256-rc1~1580^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1b6983b3958b837592d8dc1916a891ba50b0bacd;p=thirdparty%2Fsystemd.git ptyfwd: don't reset TTY twice if stdin/stdout point to same TTY And in particular don't save/restore an already reset TTY state. --- diff --git a/src/shared/ptyfwd.c b/src/shared/ptyfwd.c index f72cac0a39c..4950932a967 100644 --- a/src/shared/ptyfwd.c +++ b/src/shared/ptyfwd.c @@ -22,6 +22,7 @@ #include "log.h" #include "macro.h" #include "ptyfwd.h" +#include "stat-util.h" #include "terminal-util.h" #include "time-util.h" @@ -477,8 +478,14 @@ int pty_forward_new( (void) ioctl(master, TIOCSWINSZ, &ws); if (!(flags & PTY_FORWARD_READ_ONLY)) { + int same; + assert(f->input_fd >= 0); + same = inode_same_at(f->input_fd, NULL, f->output_fd, NULL, AT_EMPTY_PATH); + if (same < 0) + return same; + if (tcgetattr(f->input_fd, &f->saved_stdin_attr) >= 0) { struct termios raw_stdin_attr; @@ -486,11 +493,14 @@ int pty_forward_new( raw_stdin_attr = f->saved_stdin_attr; cfmakeraw(&raw_stdin_attr); - raw_stdin_attr.c_oflag = f->saved_stdin_attr.c_oflag; - tcsetattr(f->input_fd, TCSANOW, &raw_stdin_attr); + + if (!same) + raw_stdin_attr.c_oflag = f->saved_stdin_attr.c_oflag; + + (void) tcsetattr(f->input_fd, TCSANOW, &raw_stdin_attr); } - if (tcgetattr(f->output_fd, &f->saved_stdout_attr) >= 0) { + if (!same && tcgetattr(f->output_fd, &f->saved_stdout_attr) >= 0) { struct termios raw_stdout_attr; f->saved_stdout = true; @@ -499,7 +509,7 @@ int pty_forward_new( cfmakeraw(&raw_stdout_attr); raw_stdout_attr.c_iflag = f->saved_stdout_attr.c_iflag; raw_stdout_attr.c_lflag = f->saved_stdout_attr.c_lflag; - tcsetattr(f->output_fd, TCSANOW, &raw_stdout_attr); + (void) tcsetattr(f->output_fd, TCSANOW, &raw_stdout_attr); } r = sd_event_add_io(f->event, &f->stdin_event_source, f->input_fd, EPOLLIN|EPOLLET, on_stdin_event, f);