s390/3270: fix use after free of tty3270_screen structure
authorMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 4 Dec 2013 13:29:11 +0000 (14:29 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 16 Dec 2013 13:37:45 +0000 (14:37 +0100)
The deactivation and freeing of the tty view of the 3270 device
can race with a tty3270_update invocation via the update timer.
To fix this move the del_timer_sync call for the update timer from
tty3270_free_view to tty3270_free prior to the tty3270_free_screen
call.

Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/char/tty3270.c

index 3f4ca4e09a4ccc4d49fba39d64094fafe1f1fdc7..07cf182c18f9afde067a08ca5a8f94bc6e4adc33 100644 (file)
@@ -125,10 +125,7 @@ static void tty3270_resize_work(struct work_struct *work);
  */
 static void tty3270_set_timer(struct tty3270 *tp, int expires)
 {
-       if (expires == 0)
-               del_timer(&tp->timer);
-       else
-               mod_timer(&tp->timer, jiffies + expires);
+       mod_timer(&tp->timer, jiffies + expires);
 }
 
 /*
@@ -744,7 +741,6 @@ tty3270_free_view(struct tty3270 *tp)
 {
        int pages;
 
-       del_timer_sync(&tp->timer);
        kbd_free(tp->kbd);
        raw3270_request_free(tp->kreset);
        raw3270_request_free(tp->read);
@@ -877,6 +873,7 @@ tty3270_free(struct raw3270_view *view)
 {
        struct tty3270 *tp = container_of(view, struct tty3270, view);
 
+       del_timer_sync(&tp->timer);
        tty3270_free_screen(tp->screen, tp->view.rows);
        tty3270_free_view(tp);
 }