• J
    TTY: make tty_add_file non-failing · fa90e1c9
    Jiri Slaby 提交于
    If tty_add_file fails at the point it is now, we have to revert all
    the changes we did to the tty. It means either decrease all refcounts
    if this was a tty reopen or delete the tty if it was newly allocated.
    
    There was a try to fix this in v3.0-rc2 using tty_release in 0259894c
    (TTY: fix fail path in tty_open). But instead it introduced a NULL
    dereference. It's because tty_release dereferences
    filp->private_data, but that one is set even in our tty_add_file. And
    when tty_add_file fails, it's still NULL/garbage. Hence tty_release
    cannot be called there.
    
    To circumvent the original leak (and the current NULL deref) we split
    tty_add_file into two functions, making the latter non-failing. In
    that case we may do the former early in open, where handling failures
    is easy. The latter stays as it is now. So there is no change in
    functionality.
    
    The original bug (leak) was introduced by f573bd17 (tty: Remove
    __GFP_NOFAIL from tty_add_file()). Thanks Dan for reporting this.
    
    Later, we may split tty_release into more functions and call only some
    of them in this fail path instead. (If at all possible.)
    
    Introduced-in: v2.6.37-rc2
    Signed-off-by: NJiri Slaby <jslaby@suse.cz>
    Reported-by: NDan Carpenter <dan.carpenter@oracle.com>
    Cc: stable <stable@vger.kernel.org>
    Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
    Cc: Pekka Enberg <penberg@kernel.org>
    Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
    fa90e1c9
tty.h 23.7 KB