vrf: Fix use after free and double free in vrf_finish_output
authorDavid Ahern <dsahern@gmail.com>
Thu, 29 Mar 2018 19:49:52 +0000 (12:49 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 30 Mar 2018 18:20:23 +0000 (14:20 -0400)
Miguel reported an skb use after free / double free in vrf_finish_output
when neigh_output returns an error. The vrf driver should return after
the call to neigh_output as it takes over the skb on error path as well.

Patch is a simplified version of Miguel's patch which was written for 4.9,
and updated to top of tree.

Fixes: 8f58336d3f78a ("net: Add ethernet header for pass through VRF device")
Signed-off-by: Miguel Fadon Perlines <mfadon@teldat.com>
Signed-off-by: David Ahern <dsahern@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/vrf.c

index 139c61c8244ad9099ed8d6377b74eff446354e10..ac40924fe437d35226caeeb26aea1af3ef6d0fbb 100644 (file)
@@ -578,12 +578,13 @@ static int vrf_finish_output(struct net *net, struct sock *sk, struct sk_buff *s
        if (!IS_ERR(neigh)) {
                sock_confirm_neigh(skb, neigh);
                ret = neigh_output(neigh, skb);
+               rcu_read_unlock_bh();
+               return ret;
        }
 
        rcu_read_unlock_bh();
 err:
-       if (unlikely(ret < 0))
-               vrf_tx_error(skb->dev, skb);
+       vrf_tx_error(skb->dev, skb);
        return ret;
 }