• David L Stevens's avatar
    [IPV6]: multicast join and misc · c9e3e8b6
    David L Stevens authored
    Here is a simplified version of the patch to fix a bug in IPv6
    multicasting. It:
    
    1) adds existence check & EADDRINUSE error for regular joins
    2) adds an exception for EADDRINUSE in the source-specific multicast
            join (where a prior join is ok)
    3) adds a missing/needed read_lock on sock_mc_list; would've raced
            with destroying the socket on interface down without
    4) adds a "leave group" in the (INCLUDE, empty) source filter case.
            This frees unneeded socket buffer memory, but also prevents
            an inappropriate interaction among the 8 socket options that
            mess with this. Some would fail as if in the group when you
            aren't really.
    
    Item #4 had a locking bug in the last version of this patch; rather than
    removing the idev->lock read lock only, I've simplified it to remove
    all lock state in the path and treat it as a direct "leave group" call for
    the (INCLUDE,empty) case it covers. Tested on an MP machine. :-)
    
    Much thanks to HoerdtMickael <hoerdt@clarinet.u-strasbg.fr> who
    reported the original bug.
    Signed-off-by: default avatarDavid L Stevens <dlstevens@us.ibm.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    c9e3e8b6
ipv6_sockglue.c 14.7 KB