Patch "rxrpc: Fix listen() setting the bar too high for the prealloc rings" has been added to the 5.18-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

    rxrpc: Fix listen() setting the bar too high for the prealloc rings

to the 5.18-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:
     rxrpc-fix-listen-setting-the-bar-too-high-for-the-pr.patch
and it can be found in the queue-5.18 subdirectory.

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



commit 9535bb23ac2e03b5f008b141d7261a3bcd1d684a
Author: David Howells <dhowells@xxxxxxxxxx>
Date:   Sat May 21 09:03:04 2022 +0100

    rxrpc: Fix listen() setting the bar too high for the prealloc rings
    
    [ Upstream commit 88e22159750b0d55793302eeed8ee603f5c1a95c ]
    
    AF_RXRPC's listen() handler lets you set the backlog up to 32 (if you bump
    up the sysctl), but whilst the preallocation circular buffers have 32 slots
    in them, one of them has to be a dead slot because we're using CIRC_CNT().
    
    This means that listen(rxrpc_sock, 32) will cause an oops when the socket
    is closed because rxrpc_service_prealloc_one() allocated one too many calls
    and rxrpc_discard_prealloc() won't then be able to get rid of them because
    it'll think the ring is empty.  rxrpc_release_calls_on_socket() then tries
    to abort them, but oopses because call->peer isn't yet set.
    
    Fix this by setting the maximum backlog to RXRPC_BACKLOG_MAX - 1 to match
    the ring capacity.
    
     BUG: kernel NULL pointer dereference, address: 0000000000000086
     ...
     RIP: 0010:rxrpc_send_abort_packet+0x73/0x240 [rxrpc]
     Call Trace:
      <TASK>
      ? __wake_up_common_lock+0x7a/0x90
      ? rxrpc_notify_socket+0x8e/0x140 [rxrpc]
      ? rxrpc_abort_call+0x4c/0x60 [rxrpc]
      rxrpc_release_calls_on_socket+0x107/0x1a0 [rxrpc]
      rxrpc_release+0xc9/0x1c0 [rxrpc]
      __sock_release+0x37/0xa0
      sock_close+0x11/0x20
      __fput+0x89/0x240
      task_work_run+0x59/0x90
      do_exit+0x319/0xaa0
    
    Fixes: 00e907127e6f ("rxrpc: Preallocate peers, conns and calls for incoming service requests")
    Reported-by: Marc Dionne <marc.dionne@xxxxxxxxxxxx>
    Signed-off-by: David Howells <dhowells@xxxxxxxxxx>
    cc: linux-afs@xxxxxxxxxxxxxxxxxxx
    Link: https://lists.infradead.org/pipermail/linux-afs/2022-March/005079.html
    Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/rxrpc/sysctl.c b/net/rxrpc/sysctl.c
index 540351d6a5f4..555e0910786b 100644
--- a/net/rxrpc/sysctl.c
+++ b/net/rxrpc/sysctl.c
@@ -12,7 +12,7 @@
 
 static struct ctl_table_header *rxrpc_sysctl_reg_table;
 static const unsigned int four = 4;
-static const unsigned int thirtytwo = 32;
+static const unsigned int max_backlog = RXRPC_BACKLOG_MAX - 1;
 static const unsigned int n_65535 = 65535;
 static const unsigned int n_max_acks = RXRPC_RXTX_BUFF_SIZE - 1;
 static const unsigned long one_jiffy = 1;
@@ -89,7 +89,7 @@ static struct ctl_table rxrpc_sysctl_table[] = {
 		.mode		= 0644,
 		.proc_handler	= proc_dointvec_minmax,
 		.extra1		= (void *)&four,
-		.extra2		= (void *)&thirtytwo,
+		.extra2		= (void *)&max_backlog,
 	},
 	{
 		.procname	= "rx_window_size",



[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