]> granicus.if.org Git - sudo/commitdiff
Clear input, output, control and local flags before copying them
authorTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 12 Jul 2017 11:47:28 +0000 (05:47 -0600)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 12 Jul 2017 11:47:28 +0000 (05:47 -0600)
from the source terminal.  Otherwise, flags that are disabled
in the source terminal may still be enabled in the destination.

lib/util/term.c

index 0fb2eb2053d93d26bd8f8dfb9d49544ca6d02fc9..d6fc8fee61236fe5a2f63ca5e49f91cd7baaaf7b 100644 (file)
@@ -262,11 +262,17 @@ sudo_term_copy_v1(int src, int dst)
     if (tcgetattr(src, &tt_src) != 0 || tcgetattr(dst, &tt_dst) != 0)
        debug_return_bool(false);
 
+    /* Clear select input, output, control and local flags. */
+    CLR(tt_dst.c_iflag, INPUT_FLAGS);
+    CLR(tt_dst.c_oflag, OUTPUT_FLAGS);
+    CLR(tt_dst.c_cflag, CONTROL_FLAGS);
+    CLR(tt_dst.c_lflag, LOCAL_FLAGS);
+
     /* Copy select input, output, control and local flags. */
-    tt_dst.c_iflag |= (tt_src.c_iflag & INPUT_FLAGS);
-    tt_dst.c_oflag |= (tt_src.c_oflag & OUTPUT_FLAGS);
-    tt_dst.c_cflag |= (tt_src.c_cflag & CONTROL_FLAGS);
-    tt_dst.c_lflag |= (tt_src.c_lflag & LOCAL_FLAGS);
+    SET(tt_dst.c_iflag, (tt_src.c_iflag & INPUT_FLAGS));
+    SET(tt_dst.c_oflag, (tt_src.c_oflag & OUTPUT_FLAGS));
+    SET(tt_dst.c_cflag, (tt_src.c_cflag & CONTROL_FLAGS));
+    SET(tt_dst.c_lflag, (tt_src.c_lflag & LOCAL_FLAGS));
 
     /* Copy special chars from src verbatim. */
     for (i = 0; i < NCCS; i++)