diff options
Diffstat (limited to 'net/ipv4/raw.c')
-rw-r--r-- | net/ipv4/raw.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index 2979f14bb188..ebb1e5848bc6 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c | |||
@@ -375,7 +375,7 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length, | |||
375 | err = NF_HOOK(PF_INET, NF_INET_LOCAL_OUT, skb, NULL, rt->u.dst.dev, | 375 | err = NF_HOOK(PF_INET, NF_INET_LOCAL_OUT, skb, NULL, rt->u.dst.dev, |
376 | dst_output); | 376 | dst_output); |
377 | if (err > 0) | 377 | if (err > 0) |
378 | err = inet->recverr ? net_xmit_errno(err) : 0; | 378 | err = net_xmit_errno(err); |
379 | if (err) | 379 | if (err) |
380 | goto error; | 380 | goto error; |
381 | out: | 381 | out: |
@@ -386,6 +386,8 @@ error_fault: | |||
386 | kfree_skb(skb); | 386 | kfree_skb(skb); |
387 | error: | 387 | error: |
388 | IP_INC_STATS(net, IPSTATS_MIB_OUTDISCARDS); | 388 | IP_INC_STATS(net, IPSTATS_MIB_OUTDISCARDS); |
389 | if (err == -ENOBUFS && !inet->recverr) | ||
390 | err = 0; | ||
389 | return err; | 391 | return err; |
390 | } | 392 | } |
391 | 393 | ||
@@ -576,8 +578,11 @@ back_from_confirm: | |||
576 | &ipc, &rt, msg->msg_flags); | 578 | &ipc, &rt, msg->msg_flags); |
577 | if (err) | 579 | if (err) |
578 | ip_flush_pending_frames(sk); | 580 | ip_flush_pending_frames(sk); |
579 | else if (!(msg->msg_flags & MSG_MORE)) | 581 | else if (!(msg->msg_flags & MSG_MORE)) { |
580 | err = ip_push_pending_frames(sk); | 582 | err = ip_push_pending_frames(sk); |
583 | if (err == -ENOBUFS && !inet->recverr) | ||
584 | err = 0; | ||
585 | } | ||
581 | release_sock(sk); | 586 | release_sock(sk); |
582 | } | 587 | } |
583 | done: | 588 | done: |