mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
ipv6: defrag: orphan skb before queuing
IPv4 and nf_conntrack fragment queues orphan skbs before returning -EINPROGRESS, but ip6_frag_queue() leaves the socket association intact. Commit18685451fc("inet: inet_defrag: prevent sk release while still in use") moved skb_orphan() into ip_frag_queue() and nf_ct_frag6_queue(), but missed ip6_frag_queue(). Without orphaning, inet_frag_reasm_finish() clears fp->sk on frag_list skbs but leaves fp->destructor set to sock_pfree. Freeing the reassembled skb then calls sock_pfree() with a NULL socket. A socket using SOCK_RCU_FREE may also be released while its fragment is queued, leaving a stale socket pointer; this is a second consequence of the same missing orphan. Orphan the skb before returning -EINPROGRESS so the queued fragment no longer retains the socket association or destructor. Fixes:cf7fbe660f("bpf: Add socket assign support") Cc: stable@vger.kernel.org Reported-by: Vega <vega@nebusec.ai> Reviewed-by: Eric Dumazet <edumazet@kernel.org> Reviewed-by: Fernando Fernandez Mancera <fmancera@suse.de> Signed-off-by: Zixuan Chai <petalzu987@gmail.com> Signed-off-by: Ren Wei <weir@nebusec.ai> Link: https://patch.msgid.link/5c396b7011168cd98b9812df4d6bbd00a96048e7.1791008591.git.petalzu987@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
b2039a6dd3
commit
5dfa91a5ec
|
|
@ -232,6 +232,7 @@ static int ip6_frag_queue(struct net *net,
|
|||
}
|
||||
|
||||
skb_dst_drop(skb);
|
||||
skb_orphan(skb);
|
||||
return -EINPROGRESS;
|
||||
|
||||
insert_error:
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user