• P
    IPoIB: Fix use-after-free of multicast object · bea1e22d
    Patrick McHardy 提交于
    Fix a crash in ipoib_mcast_join_task().  (with help from Or Gerlitz)
    
    Commit c8c2afe3 ("IPoIB: Use rtnl lock/unlock when changing device
    flags") added a call to rtnl_lock() in ipoib_mcast_join_task(), which
    is run from the ipoib_workqueue, and hence the workqueue can't be
    flushed from the context of ipoib_stop().
    
    In the current code, ipoib_stop() (which doesn't flush the workqueue)
    calls ipoib_mcast_dev_flush(), which goes and deletes all the
    multicast entries.  This takes place without any synchronization with
    a possible running instance of ipoib_mcast_join_task() for the same
    ipoib device, leading to a crash due to NULL pointer dereference.
    
    Fix this by making sure that the workqueue is flushed before
    ipoib_mcast_dev_flush() is called.  To make that possible, we move the
    RTNL-lock wrapped code to ipoib_mcast_join_finish().
    Signed-off-by: NPatrick McHardy <kaber@trash.net>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: NRoland Dreier <roland@purestorage.com>
    bea1e22d
ipoib_multicast.c 24.7 KB