Skip to content
This repository was archived by the owner on Dec 20, 2023. It is now read-only.

Commit c48cf4f

Browse files
akodanevsashalevin
authored andcommitted
net: sysctl_net_core: check SNDBUF and RCVBUF for min length
[ Upstream commit b1cb59c ] sysctl has sysctl.net.core.rmem_*/wmem_* parameters which can be set to incorrect values. Given that 'struct sk_buff' allocates from rcvbuf, incorrectly set buffer length could result to memory allocation failures. For example, set them as follows: # sysctl net.core.rmem_default=64 net.core.wmem_default = 64 # sysctl net.core.wmem_default=64 net.core.wmem_default = 64 # ping localhost -s 1024 -i 0 > /dev/null This could result to the following failure: skbuff: skb_over_panic: text:ffffffff81628db4 len:-32 put:-32 head:ffff88003a1cc200 data:ffff88003a1cc200 tail:0xffffffe0 end:0xc0 dev:<NULL> kernel BUG at net/core/skbuff.c:102! invalid opcode: 0000 [#1] SMP ... task: ffff88003b7f5550 ti: ffff88003ae88000 task.ti: ffff88003ae88000 RIP: 0010:[<ffffffff8155fbd1>] [<ffffffff8155fbd1>] skb_put+0xa1/0xb0 RSP: 0018:ffff88003ae8bc68 EFLAGS: 00010296 RAX: 000000000000008d RBX: 00000000ffffffe0 RCX: 0000000000000000 RDX: ffff88003fdcf598 RSI: ffff88003fdcd9c8 RDI: ffff88003fdcd9c8 RBP: ffff88003ae8bc88 R08: 0000000000000001 R09: 0000000000000000 R10: 0000000000000001 R11: 00000000000002b2 R12: 0000000000000000 R13: 0000000000000000 R14: ffff88003d3f7300 R15: ffff88000012a900 FS: 00007fa0e2b4a840(0000) GS:ffff88003fc00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000d0f7e0 CR3: 000000003b8fb000 CR4: 00000000000006f0 Stack: ffff88003a1cc200 00000000ffffffe0 00000000000000c0 ffffffff818cab1d ffff88003ae8bd68 ffffffff81628db4 ffff88003ae8bd48 ffff88003b7f5550 ffff880031a09408 ffff88003b7f5550 ffff88000012aa48 ffff88000012ab00 Call Trace: [<ffffffff81628db4>] unix_stream_sendmsg+0x2c4/0x470 [<ffffffff81556f56>] sock_write_iter+0x146/0x160 [<ffffffff811d9612>] new_sync_write+0x92/0xd0 [<ffffffff811d9cd6>] vfs_write+0xd6/0x180 [<ffffffff811da499>] SyS_write+0x59/0xd0 [<ffffffff81651532>] system_call_fastpath+0x12/0x17 Code: 00 00 48 89 44 24 10 8b 87 c8 00 00 00 48 89 44 24 08 48 8b 87 d8 00 00 00 48 c7 c7 30 db 91 81 48 89 04 24 31 c0 e8 4f a8 0e 00 <0f> 0b eb fe 66 66 2e 0f 1f 84 00 00 00 00 00 55 48 89 e5 48 83 RIP [<ffffffff8155fbd1>] skb_put+0xa1/0xb0 RSP <ffff88003ae8bc68> Kernel panic - not syncing: Fatal exception Moreover, the possible minimum is 1, so we can get another kernel panic: ... BUG: unable to handle kernel paging request at ffff88013caee5c0 IP: [<ffffffff815604cf>] __alloc_skb+0x12f/0x1f0 ... Signed-off-by: Alexey Kodanev <[email protected]> Signed-off-by: David S. Miller <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent 563d919 commit c48cf4f

File tree

1 file changed

+6
-4
lines changed

1 file changed

+6
-4
lines changed

net/core/sysctl_net_core.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
static int zero = 0;
2626
static int one = 1;
2727
static int ushort_max = USHRT_MAX;
28+
static int min_sndbuf = SOCK_MIN_SNDBUF;
29+
static int min_rcvbuf = SOCK_MIN_RCVBUF;
2830

2931
#ifdef CONFIG_RPS
3032
static int rps_sock_flow_sysctl(struct ctl_table *table, int write,
@@ -223,31 +225,31 @@ static struct ctl_table net_core_table[] = {
223225
.maxlen = sizeof(int),
224226
.mode = 0644,
225227
.proc_handler = proc_dointvec_minmax,
226-
.extra1 = &one,
228+
.extra1 = &min_sndbuf,
227229
},
228230
{
229231
.procname = "rmem_max",
230232
.data = &sysctl_rmem_max,
231233
.maxlen = sizeof(int),
232234
.mode = 0644,
233235
.proc_handler = proc_dointvec_minmax,
234-
.extra1 = &one,
236+
.extra1 = &min_rcvbuf,
235237
},
236238
{
237239
.procname = "wmem_default",
238240
.data = &sysctl_wmem_default,
239241
.maxlen = sizeof(int),
240242
.mode = 0644,
241243
.proc_handler = proc_dointvec_minmax,
242-
.extra1 = &one,
244+
.extra1 = &min_sndbuf,
243245
},
244246
{
245247
.procname = "rmem_default",
246248
.data = &sysctl_rmem_default,
247249
.maxlen = sizeof(int),
248250
.mode = 0644,
249251
.proc_handler = proc_dointvec_minmax,
250-
.extra1 = &one,
252+
.extra1 = &min_rcvbuf,
251253
},
252254
{
253255
.procname = "dev_weight",

0 commit comments

Comments
 (0)