summaryrefslogtreecommitdiffstats
path: root/net/qrtr
diff options
context:
space:
mode:
authorYoussef Samir <quic_yabdulra@quicinc.com>2024-09-16 19:08:58 +0200
committerPaolo Abeni <pabeni@redhat.com>2024-09-24 10:48:16 +0200
commitf011b313e8ebd5b7abd8521b5119aecef403de45 (patch)
tree85937ef892a4792db825bc59587ae57e259370ed /net/qrtr
parentc8770db2d54437a5f49417ae7b46f7de23d14db6 (diff)
downloadlinux-stable-f011b313e8ebd5b7abd8521b5119aecef403de45.tar.gz
linux-stable-f011b313e8ebd5b7abd8521b5119aecef403de45.tar.bz2
linux-stable-f011b313e8ebd5b7abd8521b5119aecef403de45.zip
net: qrtr: Update packets cloning when broadcasting
When broadcasting data to multiple nodes via MHI, using skb_clone() causes all nodes to receive the same header data. This can result in packets being discarded by endpoints, leading to lost data. This issue occurs when a socket is closed, and a QRTR_TYPE_DEL_CLIENT packet is broadcasted. All nodes receive the same destination node ID, causing the node connected to the client to discard the packet and remain unaware of the client's deletion. Replace skb_clone() with pskb_copy(), to create a separate copy of the header for each sk_buff. Fixes: bdabad3e363d ("net: Add Qualcomm IPC router") Signed-off-by: Youssef Samir <quic_yabdulra@quicinc.com> Reviewed-by: Jeffery Hugo <quic_jhugo@quicinc.com> Reviewed-by: Carl Vanderlip <quic_carlv@quicinc.com> Reviewed-by: Chris Lew <quic_clew@quicinc.com> Link: https://patch.msgid.link/20240916170858.2382247-1-quic_yabdulra@quicinc.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Diffstat (limited to 'net/qrtr')
-rw-r--r--net/qrtr/af_qrtr.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/net/qrtr/af_qrtr.c b/net/qrtr/af_qrtr.c
index 41ece61eb57a..00c51cf693f3 100644
--- a/net/qrtr/af_qrtr.c
+++ b/net/qrtr/af_qrtr.c
@@ -884,7 +884,7 @@ static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb,
mutex_lock(&qrtr_node_lock);
list_for_each_entry(node, &qrtr_all_nodes, item) {
- skbn = skb_clone(skb, GFP_KERNEL);
+ skbn = pskb_copy(skb, GFP_KERNEL);
if (!skbn)
break;
skb_set_owner_w(skbn, skb->sk);