• Julian Wiedmann's avatar
    s390/qeth: fix double-free on IP add/remove race · 14d066c3
    Julian Wiedmann authored
    Registering an IPv4 address with the HW takes quite a while, so we
    temporarily drop the ip_htable lock. Any concurrent add/remove of the
    same IP adjusts the IP's use count, and (on remove) is then blocked by
    addr->in_progress.
    After the register call has completed, we check the use count for
    concurrently attempted add/remove calls - and possibly straight-away
    deregister the IP again. This happens via l3_delete_ip(), which
    1) looks up the queried IP in the htable (getting a reference to the
       *same* queried object),
    2) deregisters the IP from the HW, and
    3) frees the IP object.
    
    The caller in l3_add_ip() then does a second free on the same object.
    
    For this case, skip all the extra checks and lookups in l3_delete_ip()
    and just deregister & free the IP object ourselves.
    
    Fixes: 5f78e29c ("qeth: optimize IP handling in rx_mode callback")
    Signed-off-by: default avatarJulian Wiedmann <jwi@linux.vnet.ibm.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    14d066c3
qeth_l3_main.c 82.8 KB