|
@@ -375,7 +375,7 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length,
|
|
|
err = NF_HOOK(PF_INET, NF_INET_LOCAL_OUT, skb, NULL, rt->u.dst.dev,
|
|
|
dst_output);
|
|
|
if (err > 0)
|
|
|
- err = inet->recverr ? net_xmit_errno(err) : 0;
|
|
|
+ err = net_xmit_errno(err);
|
|
|
if (err)
|
|
|
goto error;
|
|
|
out:
|
|
@@ -386,6 +386,8 @@ error_fault:
|
|
|
kfree_skb(skb);
|
|
|
error:
|
|
|
IP_INC_STATS(net, IPSTATS_MIB_OUTDISCARDS);
|
|
|
+ if (err == -ENOBUFS && !inet->recverr)
|
|
|
+ err = 0;
|
|
|
return err;
|
|
|
}
|
|
|
|
|
@@ -576,8 +578,11 @@ back_from_confirm:
|
|
|
&ipc, &rt, msg->msg_flags);
|
|
|
if (err)
|
|
|
ip_flush_pending_frames(sk);
|
|
|
- else if (!(msg->msg_flags & MSG_MORE))
|
|
|
+ else if (!(msg->msg_flags & MSG_MORE)) {
|
|
|
err = ip_push_pending_frames(sk);
|
|
|
+ if (err == -ENOBUFS && !inet->recverr)
|
|
|
+ err = 0;
|
|
|
+ }
|
|
|
release_sock(sk);
|
|
|
}
|
|
|
done:
|