Skip to content
  • Eric Dumazet's avatar
    net: prevent dst uses after free · 222d7dbd
    Eric Dumazet authored
    In linux-4.13, Wei worked hard to convert dst to a traditional
    refcounted model, removing GC.
    
    We now want to make sure a dst refcount can not transition from 0 back
    to 1.
    
    The problem here is that input path attached a not refcounted dst to an
    skb. Then later, because packet is forwarded and hits skb_dst_force()
    before exiting RCU section, we might try to take a refcount on one dst
    that is about to be freed, if another cpu saw 1 -> 0 transition in
    dst_release() and queued the dst for freeing after one RCU grace period.
    
    Lets unify skb_dst_force() and skb_dst_force_safe(), since we should
    always perform the complete check against dst refcount, and not assume
    it is not zero.
    
    Bugzilla : https://bugzilla.kernel.org/show_bug.cgi?id=197005
    
    [  989.919496]  skb_dst_force+0x32/0x34
    [  989.919498]  __dev_queue_xmit+0x1ad/0x482
    [  989.919501]  ? eth_header+0x28/0xc6
    [  989.919502]  dev_queue_xmit+0xb/0xd
    [  989.919504]  neigh_connected_output+0x9b/0xb4
    [  989.919507]  ip_finish_ou...
    222d7dbd