Patch "bpf, sockmap: Fix repeated calls to sock_put() when msg has more_data" has been added to the 5.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    bpf, sockmap: Fix repeated calls to sock_put() when msg has more_data

to the 5.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     bpf-sockmap-fix-repeated-calls-to-sock_put-when-msg-.patch
and it can be found in the queue-5.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 58e8683162ad3130cf5e6fcccc47096127779b0f
Author: Pengcheng Yang <yangpc@xxxxxxxxxx>
Date:   Tue Nov 29 18:40:38 2022 +0800

    bpf, sockmap: Fix repeated calls to sock_put() when msg has more_data
    
    [ Upstream commit 7a9841ca025275b5b0edfb0b618934abb6ceec15 ]
    
    In tcp_bpf_send_verdict() redirection, the eval variable is assigned to
    __SK_REDIRECT after the apply_bytes data is sent, if msg has more_data,
    sock_put() will be called multiple times.
    
    We should reset the eval variable to __SK_NONE every time more_data
    starts.
    
    This causes:
    
    IPv4: Attempt to release TCP socket in state 1 00000000b4c925d7
    ------------[ cut here ]------------
    refcount_t: addition on 0; use-after-free.
    WARNING: CPU: 5 PID: 4482 at lib/refcount.c:25 refcount_warn_saturate+0x7d/0x110
    Modules linked in:
    CPU: 5 PID: 4482 Comm: sockhash_bypass Kdump: loaded Not tainted 6.0.0 #1
    Hardware name: Red Hat KVM, BIOS 1.11.0-2.el7 04/01/2014
    Call Trace:
     <TASK>
     __tcp_transmit_skb+0xa1b/0xb90
     ? __alloc_skb+0x8c/0x1a0
     ? __kmalloc_node_track_caller+0x184/0x320
     tcp_write_xmit+0x22a/0x1110
     __tcp_push_pending_frames+0x32/0xf0
     do_tcp_sendpages+0x62d/0x640
     tcp_bpf_push+0xae/0x2c0
     tcp_bpf_sendmsg_redir+0x260/0x410
     ? preempt_count_add+0x70/0xa0
     tcp_bpf_send_verdict+0x386/0x4b0
     tcp_bpf_sendmsg+0x21b/0x3b0
     sock_sendmsg+0x58/0x70
     __sys_sendto+0xfa/0x170
     ? xfd_validate_state+0x1d/0x80
     ? switch_fpu_return+0x59/0xe0
     __x64_sys_sendto+0x24/0x30
     do_syscall_64+0x37/0x90
     entry_SYSCALL_64_after_hwframe+0x63/0xcd
    
    Fixes: cd9733f5d75c ("tcp_bpf: Fix one concurrency problem in the tcp_bpf_send_verdict function")
    Signed-off-by: Pengcheng Yang <yangpc@xxxxxxxxxx>
    Signed-off-by: Daniel Borkmann <daniel@xxxxxxxxxxxxx>
    Acked-by: Jakub Sitnicki <jakub@xxxxxxxxxxxxxx>
    Link: https://lore.kernel.org/bpf/1669718441-2654-2-git-send-email-yangpc@xxxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/ipv4/tcp_bpf.c b/net/ipv4/tcp_bpf.c
index f69dcd3c7797..229fa1f2b381 100644
--- a/net/ipv4/tcp_bpf.c
+++ b/net/ipv4/tcp_bpf.c
@@ -312,7 +312,7 @@ static int tcp_bpf_send_verdict(struct sock *sk, struct sk_psock *psock,
 	bool cork = false, enospc = sk_msg_full(msg);
 	struct sock *sk_redir;
 	u32 tosend, origsize, sent, delta = 0;
-	u32 eval = __SK_NONE;
+	u32 eval;
 	int ret;
 
 more_data:
@@ -343,6 +343,7 @@ static int tcp_bpf_send_verdict(struct sock *sk, struct sk_psock *psock,
 	tosend = msg->sg.size;
 	if (psock->apply_bytes && psock->apply_bytes < tosend)
 		tosend = psock->apply_bytes;
+	eval = __SK_NONE;
 
 	switch (psock->eval) {
 	case __SK_PASS:



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux