diff options
| -rw-r--r-- | drivers/net/macvtap.c | 5 | ||||
| -rw-r--r-- | drivers/net/tun.c | 5 |
2 files changed, 8 insertions, 2 deletions
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index 22b4cf2fa108..ba1e5db2152e 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c | |||
| @@ -859,7 +859,10 @@ static ssize_t macvtap_do_read(struct macvtap_queue *q, | |||
| 859 | } | 859 | } |
| 860 | if (skb) { | 860 | if (skb) { |
| 861 | ret = macvtap_put_user(q, skb, to); | 861 | ret = macvtap_put_user(q, skb, to); |
| 862 | kfree_skb(skb); | 862 | if (unlikely(ret < 0)) |
| 863 | kfree_skb(skb); | ||
| 864 | else | ||
| 865 | consume_skb(skb); | ||
| 863 | } | 866 | } |
| 864 | if (!noblock) | 867 | if (!noblock) |
| 865 | finish_wait(sk_sleep(&q->sk), &wait); | 868 | finish_wait(sk_sleep(&q->sk), &wait); |
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 6d44da184594..9c58286b8a42 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
| @@ -1362,7 +1362,10 @@ static ssize_t tun_do_read(struct tun_struct *tun, struct tun_file *tfile, | |||
| 1362 | return 0; | 1362 | return 0; |
| 1363 | 1363 | ||
| 1364 | ret = tun_put_user(tun, tfile, skb, to); | 1364 | ret = tun_put_user(tun, tfile, skb, to); |
| 1365 | kfree_skb(skb); | 1365 | if (unlikely(ret < 0)) |
| 1366 | kfree_skb(skb); | ||
| 1367 | else | ||
| 1368 | consume_skb(skb); | ||
| 1366 | 1369 | ||
| 1367 | return ret; | 1370 | return ret; |
| 1368 | } | 1371 | } |
