From 9bd8044161dedd396e9a03baaf07db9b3c5695c8 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 22 Feb 2013 17:15:08 -0800 Subject: [PATCH] 3.0-stable patches added patches: tty-set_termios-set_termiox-should-not-return-eintr.patch --- queue-3.0/series | 1 + ...-set_termiox-should-not-return-eintr.patch | 77 +++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 queue-3.0/tty-set_termios-set_termiox-should-not-return-eintr.patch diff --git a/queue-3.0/series b/queue-3.0/series index a61b1d2bb8a..30027c835c8 100644 --- a/queue-3.0/series +++ b/queue-3.0/series @@ -6,3 +6,4 @@ posix-cpu-timers-fix-nanosleep-task_struct-leak.patch hrtimer-prevent-hrtimer_enqueue_reprogram-race.patch alsa-ali5451-remove-irq-enabling-in-pointer-callback.patch alsa-rme32.c-irq-enabling-after-spin_lock_irq.patch +tty-set_termios-set_termiox-should-not-return-eintr.patch diff --git a/queue-3.0/tty-set_termios-set_termiox-should-not-return-eintr.patch b/queue-3.0/tty-set_termios-set_termiox-should-not-return-eintr.patch new file mode 100644 index 00000000000..aaeef6669b0 --- /dev/null +++ b/queue-3.0/tty-set_termios-set_termiox-should-not-return-eintr.patch @@ -0,0 +1,77 @@ +From 183d95cdd834381c594d3aa801c1f9f9c0c54fa9 Mon Sep 17 00:00:00 2001 +From: Oleg Nesterov +Date: Tue, 29 Jan 2013 20:07:41 +0100 +Subject: tty: set_termios/set_termiox should not return -EINTR + +From: Oleg Nesterov + +commit 183d95cdd834381c594d3aa801c1f9f9c0c54fa9 upstream. + +See https://bugzilla.redhat.com/show_bug.cgi?id=904907 +read command causes bash to abort with double free or corruption (out). + +A simple test-case from Roman: + + // Compile the reproducer and send sigchld ti that process. + // EINTR occurs even if SA_RESTART flag is set. + + void handler(int sig) + { + } + + main() + { + struct sigaction act; + act.sa_handler = handler; + act.sa_flags = SA_RESTART; + sigaction (SIGCHLD, &act, 0); + struct termio ttp; + ioctl(0, TCGETA, &ttp); + while(1) + { + if (ioctl(0, TCSETAW, ttp) < 0) + { + if (errno == EINTR) + { + fprintf(stderr, "BUG!"); return(1); + } + } + } + } + +Change set_termios/set_termiox to return -ERESTARTSYS to fix this +particular problem. + +I didn't dare to change other EINTR's in drivers/tty/, but they look +equally wrong. + +Reported-by: Roman Rakus +Reported-by: Lingzhu Xiang +Signed-off-by: Oleg Nesterov +Cc: Jiri Slaby +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/tty/tty_ioctl.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/tty/tty_ioctl.c ++++ b/drivers/tty/tty_ioctl.c +@@ -617,7 +617,7 @@ static int set_termios(struct tty_struct + if (opt & TERMIOS_WAIT) { + tty_wait_until_sent(tty, 0); + if (signal_pending(current)) +- return -EINTR; ++ return -ERESTARTSYS; + } + + tty_set_termios(tty, &tmp_termios); +@@ -684,7 +684,7 @@ static int set_termiox(struct tty_struct + if (opt & TERMIOS_WAIT) { + tty_wait_until_sent(tty, 0); + if (signal_pending(current)) +- return -EINTR; ++ return -ERESTARTSYS; + } + + mutex_lock(&tty->termios_mutex); -- 2.47.3