| From 75fa42fac3944f16b9f687ca3d0193ab9b644eff Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 14 Apr 2022 16:49:25 +0800 |
| Subject: net/packet: fix packet_sock xmit return value checking |
| |
| From: Hangbin Liu <liuhangbin@gmail.com> |
| |
| [ Upstream commit 29e8e659f984be00d75ec5fef4e37c88def72712 ] |
| |
| packet_sock xmit could be dev_queue_xmit, which also returns negative |
| errors. So only checking positive errors is not enough, or userspace |
| sendmsg may return success while packet is not send out. |
| |
| Move the net_xmit_errno() assignment in the braces as checkpatch.pl said |
| do not use assignment in if condition. |
| |
| Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") |
| Reported-by: Flavio Leitner <fbl@redhat.com> |
| Signed-off-by: Hangbin Liu <liuhangbin@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| net/packet/af_packet.c | 13 +++++++++---- |
| 1 file changed, 9 insertions(+), 4 deletions(-) |
| |
| diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c |
| index 70c102359bfe..a2696acbcd9d 100644 |
| --- a/net/packet/af_packet.c |
| +++ b/net/packet/af_packet.c |
| @@ -2791,8 +2791,9 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg) |
| |
| status = TP_STATUS_SEND_REQUEST; |
| err = po->xmit(skb); |
| - if (unlikely(err > 0)) { |
| - err = net_xmit_errno(err); |
| + if (unlikely(err != 0)) { |
| + if (err > 0) |
| + err = net_xmit_errno(err); |
| if (err && __packet_get_status(po, ph) == |
| TP_STATUS_AVAILABLE) { |
| /* skb was destructed already */ |
| @@ -2993,8 +2994,12 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) |
| skb->no_fcs = 1; |
| |
| err = po->xmit(skb); |
| - if (err > 0 && (err = net_xmit_errno(err)) != 0) |
| - goto out_unlock; |
| + if (unlikely(err != 0)) { |
| + if (err > 0) |
| + err = net_xmit_errno(err); |
| + if (err) |
| + goto out_unlock; |
| + } |
| |
| dev_put(dev); |
| |
| -- |
| 2.35.1 |
| |