• Willem de Bruijn's avatar
    ip: fix error queue empty skb handling · c247f053
    Willem de Bruijn authored
    When reading from the error queue, msg_name and msg_control are only
    populated for some errors. A new exception for empty timestamp skbs
    added a false positive on icmp errors without payload.
    
    `traceroute -M udpconn` only displayed gateways that return payload
    with the icmp error: the embedded network headers are pulled before
    sock_queue_err_skb, leaving an skb with skb->len == 0 otherwise.
    
    Fix this regression by refining when msg_name and msg_control
    branches are taken. The solutions for the two fields are independent.
    
    msg_name only makes sense for errors that configure serr->port and
    serr->addr_offset. Test the first instead of skb->len. This also fixes
    another issue. saddr could hold the wrong data, as serr->addr_offset
    is not initialized  in some code paths, pointing to the start of the
    network header. It is only valid when serr->port is set (non-zero).
    
    msg_control support differs between IPv4 and IPv6. IPv4 only honors
    requests for ICMP and timestamps with SOF_TIMESTAMPING_OPT_CMSG. The
    skb->len test can simply be removed, because skb->dev is also tested
    and never true for empty skbs. IPv6 honors requests for all errors
    aside from local errors and timestamps on empty skbs.
    
    In both cases, make the policy more explicit by moving this logic to
    a new function that decides whether to process msg_control and that
    optionally prepares the necessary fields in skb->cb[]. After this
    change, the IPv4 and IPv6 paths are more similar.
    
    The last case is rxrpc. Here, simply refine to only match timestamps.
    
    Fixes: 49ca0d8b ("net-timestamp: no-payload option")
    Reported-by: default avatarJan Niehusmann <jan@gondor.com>
    Signed-off-by: default avatarWillem de Bruijn <willemb@google.com>
    
    ----
    
    Changes
      v1->v2
      - fix local origin test inversion in ip6_datagram_support_cmsg
      - make v4 and v6 code paths more similar by introducing analogous
        ipv4_datagram_support_cmsg
      - fix compile bug in rxrpc
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    c247f053
ar-error.c 5.48 KB