• David Howells's avatar
    rxrpc: Fix local endpoint replacement · ce3f9e19
    David Howells authored
    [ Upstream commit b00df840 ]
    
    When a local endpoint (struct rxrpc_local) ceases to be in use by any
    AF_RXRPC sockets, it starts the process of being destroyed, but this
    doesn't cause it to be removed from the namespace endpoint list immediately
    as tearing it down isn't trivial and can't be done in softirq context, so
    it gets deferred.
    
    If a new socket comes along that wants to bind to the same endpoint, a new
    rxrpc_local object will be allocated and rxrpc_lookup_local() will use
    list_replace() to substitute the new one for the old.
    
    Then, when the dying object gets to rxrpc_local_destroyer(), it is removed
    unconditionally from whatever list it is on by calling list_del_init().
    
    However, list_replace() doesn't reset the pointers in the replaced
    list_head and so the list_del_init() will likely corrupt the local
    endpoints list.
    
    Fix this by using list_replace_init() instead.
    
    Fixes: 730c5fd4 ("rxrpc: Fix local endpoint refcounting")
    Reported-by: syzbot+193e29e9387ea5837f1d@syzkaller.appspotmail.com
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    ce3f9e19
local_object.c 12.6 KB