lkml.org 
[lkml]   [2014]   [Feb]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 05/24] Bluetooth: Fix racy acquire of rfcomm_dev reference
    Date
    rfcomm_dev_get() can return a rfcomm_dev reference for a
    device for which destruction may be commencing. This can happen
    on tty destruction, which calls rfcomm_tty_cleanup(), the last
    port reference may have been released but RFCOMM_TTY_RELEASED
    was not set. The following race is also possible:

    CPU 0 | CPU 1
    | rfcomm_release_dev
    rfcomm_dev_get | .
    spin_lock | .
    dev = __rfcomm_dev_get | .
    if dev | .
    if test_bit(TTY_RELEASED) | .
    | !test_and_set_bit(TTY_RELEASED)
    | tty_port_put <<<< last reference
    else |
    tty_port_get |

    The reference acquire is bogus because destruction will commence
    with the release of the last reference.

    Ignore the external state change of TTY_RELEASED and instead rely
    on the reference acquire itself to determine if the reference is
    valid.

    Cc: Jiri Slaby <jslaby@suse.cz>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
    ---
    net/bluetooth/rfcomm/tty.c | 8 ++------
    1 file changed, 2 insertions(+), 6 deletions(-)

    diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c
    index a535ef1..7cf193f 100644
    --- a/net/bluetooth/rfcomm/tty.c
    +++ b/net/bluetooth/rfcomm/tty.c
    @@ -157,12 +157,8 @@ static struct rfcomm_dev *rfcomm_dev_get(int id)

    dev = __rfcomm_dev_get(id);

    - if (dev) {
    - if (test_bit(RFCOMM_TTY_RELEASED, &dev->flags))
    - dev = NULL;
    - else
    - tty_port_get(&dev->port);
    - }
    + if (dev && !tty_port_get(&dev->port))
    + dev = NULL;

    spin_unlock(&rfcomm_dev_lock);

    --
    1.8.1.2


    \
     
     \ /
      Last update: 2014-02-10 04:01    [W:4.082 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site