• Ben McKeegan's avatar
    ppp: fix BUG on non-linear SKB (multilink receive) · 82b3cc1a
    Ben McKeegan authored
    PPP does not correctly call pskb_may_pull() on all necessary receive paths
    before reading the PPP protocol, thus causing PPP to report seemingly
    random 'unsupported protocols' and eventually trigger BUG_ON(skb->len <
    skb->data_len) in skb_pull_rcsum() when receiving multilink protocol in
    non-linear skbs.
    
    ppp_receive_nonmp_frame() does not call pskb_may_pull() before reading the
    protocol number.  For the non-mp receive path this is not a problem, as
    this check is done in ppp_receive_frame().  For the mp receive path,
    ppp_mp_reconstruct() usually copies the data into a new linear skb.
    However, in the case where the frame is made up of a single mp fragment,
    the mp header is pulled and the existing skb used.  This skb was then
    passed to ppp_receive_nonmp_frame() without checking if the encapsulated
    protocol header could safely be read.
    Signed-off-by: default avatarBen McKeegan <ben@netservers.co.uk>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    82b3cc1a
ppp_generic.c 68 KB