• David Howells's avatar
    af_rxrpc: Fix UDP MTU calculation from ICMP_FRAG_NEEDED · 6c9a2d32
    David Howells authored
    AF_RXRPC sends UDP packets with the "Don't Fragment" bit set in an attempt to
    determine the maximum packet size between the local socket and the peer by
    invoking the generation of ICMP_FRAG_NEEDED packets.
    
    Once a packet is sent with the "Don't Fragment" bit set, it is then
    inconvenient to break it up as that requires recalculating all the rxrpc serial
    and sequence numbers and reencrypting all the fragments, so we switch off the
    "Don't Fragment" service temporarily and send the bounced packet again.  Future
    packets then use the new MTU.
    
    That's all fine.  The problem lies in rxrpc_UDP_error_report() where the code
    that deals with ICMP_FRAG_NEEDED packets lives.  Packets of this type have a
    field (ee_info) to indicate the maximum packet size at the reporting node - but
    sometimes ee_info isn't filled in and is just left as 0 and the code must allow
    for this.
    
    When ee_info is 0, the code should take the MTU size we're currently using and
    reduce it for the next packet we want to send.  However, it takes ee_info
    (which is known to be 0) and tries to reduce that instead.
    
    This was discovered by Coverity.
    Reported-by: default avatarDave Jones <davej@redhat.com>
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    6c9a2d32
ar-error.c 5.68 KB