um: fix oopsable race in line_close()
authorAl Viro <viro@ftp.linux.org.uk>
Wed, 14 Sep 2011 23:21:25 +0000 (16:21 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 15 Sep 2011 01:09:37 +0000 (18:09 -0700)
commitf71f94845e0126884eca8ce57a92e30b189c8e71
tree4284aa9143c6f1b5969da372a81bc75ba7ef4e3e
parentfbfe9c847edf57ac8232aeafb290f272289893a3
um: fix oopsable race in line_close()

tty->count is decremented only after ->close() had been called and
several tasks can hit it in parallel.  As the result, using tty->count
to check if you are the last one is broken.  We end up leaving line->tty
not reset to NULL and the next IRQ on that sucker will blow up trying to
dereference pointers from kfree'd struct tty.

Fix is obvious: we need to use a counter of our own.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Richard Weinberger <richard@nod.at>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
arch/um/drivers/line.c
arch/um/include/shared/line.h