[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <e17fe23a0a5f652866ec623ef0cde1e6ef5dbcf5.1585213585.git.lucien.xin@gmail.com>
Date: Thu, 26 Mar 2020 17:06:25 +0800
From: Xin Long <lucien.xin@...il.com>
To: network dev <netdev@...r.kernel.org>
Cc: davem@...emloft.net, Paolo Abeni <pabeni@...hat.com>
Subject: [PATCH net] udp: fix a skb extensions leak
On udp rx path udp_rcv_segment() may do segment where the frag skbs
will get the header copied from the head skb in skb_segment_list()
by calling __copy_skb_header(), which could overwrite the frag skbs'
extensions by __skb_ext_copy() and cause a leak.
This issue was found after loading esp_offload where a sec path ext
is set in the skb.
On udp tx gso path, it works well as the frag skbs' extensions are
not set. So this issue should be fixed on udp's rx path only and
release the frag skbs' extensions before going to do segment.
Reported-by: Xiumei Mu <xmu@...hat.com>
Fixes: cf329aa42b66 ("udp: cope with UDP GRO packet misdirection")
Signed-off-by: Xin Long <lucien.xin@...il.com>
---
include/net/udp.h | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/include/net/udp.h b/include/net/udp.h
index e55d5f7..7bf0ca5 100644
--- a/include/net/udp.h
+++ b/include/net/udp.h
@@ -486,6 +486,10 @@ static inline struct sk_buff *udp_rcv_segment(struct sock *sk,
if (skb->pkt_type == PACKET_LOOPBACK)
skb->ip_summed = CHECKSUM_PARTIAL;
+ if (skb_has_frag_list(skb) && skb_has_extensions(skb))
+ skb_walk_frags(skb, segs)
+ skb_ext_put(segs);
+
/* the GSO CB lays after the UDP one, no need to save and restore any
* CB fragment
*/
--
2.1.0
Powered by blists - more mailing lists