• David L Stevens's avatar
    [IPV4]: multicast API "join" issues · ca9b907d
    David L Stevens authored
            This patch corrects a few problems with the IP_ADD_MEMBERSHIP
    socket option:
    
    1) The existing code makes an attempt at reference counting joins when
       using the ip_mreqn/imr_ifindex interface. Joining the same group
       on the same socket is an error, whatever the API. This leads to
       unexpected results when mixing ip_mreqn by index with ip_mreqn by
       address, ip_mreq, or other API's. For example, ip_mreq followed by
       ip_mreqn of the same group will "work" while the same two reversed
       will not.
               Fixed to always return EADDRINUSE on a duplicate join and
       removed the (now unused) reference count in ip_mc_socklist.
    
    2) The group-search list in ip_mc_join_group() is comparing a full 
       ip_mreqn structure and all of it must match for it to find the
       group. This doesn't correctly match a group that was joined with
       ip_mreq or ip_mreqn with an address (with or without an index). It
       also doesn't match groups that are joined by different addresses on
       the same interface. All of these are the same multicast group,
       which is identified by group address and interface index.
               Fixed the check to correctly match groups so we don't get
       duplicate group entries on the ip_mc_socklist.
    
    3) The old code allocates a multicast address before searching for
       duplicates requiring it to free in various error cases. This
       patch moves the allocate until after the search and
       igmp_max_memberships check, so never a need to allocate, then free
       an entry.
    Signed-off-by: default avatarDavid L Stevens <dlstevens@us.ibm.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    ca9b907d
igmp.c 58.4 KB