• Desmond Cheong Zhi Xi's avatar
    Bluetooth: fix repeated calls to sco_sock_kill · e1dee2c1
    Desmond Cheong Zhi Xi authored
    In commit 4e1a720d ("Bluetooth: avoid killing an already killed
    socket"), a check was added to sco_sock_kill to skip killing a socket
    if the SOCK_DEAD flag was set.
    
    This was done after a trace for a use-after-free bug showed that the
    same sock pointer was being killed twice.
    
    Unfortunately, this check prevents sco_sock_kill from running on any
    socket. sco_sock_kill kills a socket only if it's zapped and orphaned,
    however sock_orphan announces that the socket is dead before detaching
    it. i.e., orphaned sockets have the SOCK_DEAD flag set.
    
    To fix this, we remove the check for SOCK_DEAD, and avoid repeated
    calls to sco_sock_kill by removing incorrect calls in:
    
    1. sco_sock_timeout. The socket should not be killed on timeout as
    further processing is expected to be done. For example,
    sco_sock_connect sets the timer then waits for the socket to be
    connected or for an error to be returned.
    
    2. sco_conn_del. This function should clean up resources for the
    connection, but the socket itself should be cleaned up in
    sco_sock_release.
    
    3. sco_sock_close. Calls to sco_sock_close in sco_sock_cleanup_listen
    and sco_sock_release are followed by sco_sock_kill. Hence the
    duplicated call should be removed.
    
    Fixes: 4e1a720d ("Bluetooth: avoid killing an already killed socket")
    Signed-off-by: default avatarDesmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
    Signed-off-by: default avatarLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
    e1dee2c1
sco.c 26.1 KB