• Marc Dionne's avatar
    afs: Fix afs_find_server lookups for ipv4 peers · 9bd0160d
    Marc Dionne authored
    afs_find_server tries to find a server that has an address that
    matches the transport address of an rxrpc peer.  The code assumes
    that the transport address is always ipv6, with ipv4 represented
    as ipv4 mapped addresses, but that's not the case.  If the transport
    family is AF_INET, srx->transport.sin6.sin6_addr.s6_addr32[] will
    be beyond the actual ipv4 address and will always be 0, and all
    ipv4 addresses will be seen as matching.
    
    As a result, the first ipv4 address seen on any server will be
    considered a match, and the server returned may be the wrong one.
    
    One of the consequences is that callbacks received over ipv4 will
    only be correctly applied for the server that happens to have the
    first ipv4 address on the fs_addresses4 list.  Callbacks over ipv4
    from all other servers are dropped, causing the client to serve stale
    data.
    
    This is fixed by looking at the transport family, and comparing ipv4
    addresses based on a sockaddr_in structure rather than a sockaddr_in6.
    
    Fixes: d2ddc776 ("afs: Overhaul volume and server record caching and fileserver rotation")
    Signed-off-by: default avatarMarc Dionne <marc.dionne@auristor.com>
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    9bd0160d
server.c 15.2 KB