Commit daa3766e705c2605bd7f63b80c7742014ef9e04e
1 parent
f3d3f616e3
Exists in
master
and in
39 other branches
Revert "netlink: netlink_recvmsg() fix"
This reverts commit 1235f504aaba2ebeabc863fdb3ceac764a317d47. It causes regressions worse than the problem it was trying to fix. Eric will try to solve the problem another way. Signed-off-by: David S. Miller <davem@davemloft.net>
Showing 1 changed file with 6 additions and 16 deletions Side-by-side Diff
net/netlink/af_netlink.c
... | ... | @@ -1406,7 +1406,7 @@ |
1406 | 1406 | struct netlink_sock *nlk = nlk_sk(sk); |
1407 | 1407 | int noblock = flags&MSG_DONTWAIT; |
1408 | 1408 | size_t copied; |
1409 | - struct sk_buff *skb; | |
1409 | + struct sk_buff *skb, *frag __maybe_unused = NULL; | |
1410 | 1410 | int err; |
1411 | 1411 | |
1412 | 1412 | if (flags&MSG_OOB) |
... | ... | @@ -1441,21 +1441,7 @@ |
1441 | 1441 | kfree_skb(skb); |
1442 | 1442 | skb = compskb; |
1443 | 1443 | } else { |
1444 | - /* | |
1445 | - * Before setting frag_list to NULL, we must get a | |
1446 | - * private copy of skb if shared (because of MSG_PEEK) | |
1447 | - */ | |
1448 | - if (skb_shared(skb)) { | |
1449 | - struct sk_buff *nskb; | |
1450 | - | |
1451 | - nskb = pskb_copy(skb, GFP_KERNEL); | |
1452 | - kfree_skb(skb); | |
1453 | - skb = nskb; | |
1454 | - err = -ENOMEM; | |
1455 | - if (!skb) | |
1456 | - goto out; | |
1457 | - } | |
1458 | - kfree_skb(skb_shinfo(skb)->frag_list); | |
1444 | + frag = skb_shinfo(skb)->frag_list; | |
1459 | 1445 | skb_shinfo(skb)->frag_list = NULL; |
1460 | 1446 | } |
1461 | 1447 | } |
... | ... | @@ -1491,6 +1477,10 @@ |
1491 | 1477 | siocb->scm->creds = *NETLINK_CREDS(skb); |
1492 | 1478 | if (flags & MSG_TRUNC) |
1493 | 1479 | copied = skb->len; |
1480 | + | |
1481 | +#ifdef CONFIG_COMPAT_NETLINK_MESSAGES | |
1482 | + skb_shinfo(skb)->frag_list = frag; | |
1483 | +#endif | |
1494 | 1484 | |
1495 | 1485 | skb_free_datagram(sk, skb); |
1496 | 1486 |