e30203e4f9
commit d3706566ae3d92677b932dd156157fd6c72534b1 upstream. Syzkaller report this: BUG: unable to handle kernel paging request at fffffbfff830524b PGD 237fe8067 P4D 237fe8067 PUD 237e64067 PMD 1c9716067 PTE 0 Oops: 0000 [#1] SMP KASAN PTI CPU: 1 PID: 4465 Comm: syz-executor.0 Not tainted 5.0.0+ #5 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1ubuntu1 04/01/2014 RIP: 0010:__list_add_valid+0x21/0xe0 lib/list_debug.c:23 Code: 8b 0c 24 e9 17 fd ff ff 90 55 48 89 fd 48 8d 7a 08 53 48 89 d3 48 b8 00 00 00 00 00 fc ff df 48 89 fa 48 c1 ea 03 48 83 ec 08 <80> 3c 02 00 0f 85 8b 00 00 00 48 8b 53 08 48 39 f2 75 35 48 89 f2 RSP: 0018:ffff8881ea2278d0 EFLAGS: 00010282 RAX: dffffc0000000000 RBX: ffffffffc1829250 RCX: 1ffff1103d444ef4 RDX: 1ffffffff830524b RSI: ffffffff85659300 RDI: ffffffffc1829258 RBP: ffffffffc1879250 R08: fffffbfff0acb269 R09: fffffbfff0acb269 R10: ffff8881ea2278f0 R11: fffffbfff0acb268 R12: ffffffffc1829250 R13: dffffc0000000000 R14: 0000000000000008 R15: ffffffffc187c830 FS: 00007fe0361df700(0000) GS:ffff8881f7300000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: fffffbfff830524b CR3: 00000001eb39a001 CR4: 00000000007606e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 PKRU: 55555554 Call Trace: __list_add include/linux/list.h:60 [inline] list_add include/linux/list.h:79 [inline] proto_register+0x444/0x8f0 net/core/sock.c:3375 nr_proto_init+0x73/0x4b3 [netrom] ? 0xffffffffc1628000 ? 0xffffffffc1628000 do_one_initcall+0xbc/0x47d init/main.c:887 do_init_module+0x1b5/0x547 kernel/module.c:3456 load_module+0x6405/0x8c10 kernel/module.c:3804 __do_sys_finit_module+0x162/0x190 kernel/module.c:3898 do_syscall_64+0x9f/0x450 arch/x86/entry/common.c:290 entry_SYSCALL_64_after_hwframe+0x49/0xbe RIP: 0033:0x462e99 Code: f7 d8 64 89 02 b8 ff ff ff ff c3 66 0f 1f 44 00 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 bc ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007fe0361dec58 EFLAGS: 00000246 ORIG_RAX: 0000000000000139 RAX: ffffffffffffffda RBX: 000000000073bf00 RCX: 0000000000462e99 RDX: 0000000000000000 RSI: 0000000020000100 RDI: 0000000000000003 RBP: 00007fe0361dec70 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000246 R12: 00007fe0361df6bc R13: 00000000004bcefa R14: 00000000006f6fb0 R15: 0000000000000004 Modules linked in: netrom(+) ax25 fcrypt pcbc af_alg arizona_ldo1 v4l2_common videodev media v4l2_dv_timings hdlc ide_cd_mod snd_soc_sigmadsp_regmap snd_soc_sigmadsp intel_spi_platform intel_spi mtd spi_nor snd_usbmidi_lib usbcore lcd ti_ads7950 hi6421_regulator snd_soc_kbl_rt5663_max98927 snd_soc_hdac_hdmi snd_hda_ext_core snd_hda_core snd_soc_rt5663 snd_soc_core snd_pcm_dmaengine snd_compress snd_soc_rl6231 mac80211 rtc_rc5t583 spi_slave_time leds_pwm hid_gt683r hid industrialio_triggered_buffer kfifo_buf industrialio ir_kbd_i2c rc_core led_class_flash dwc_xlgmac snd_ymfpci gameport snd_mpu401_uart snd_rawmidi snd_ac97_codec snd_pcm ac97_bus snd_opl3_lib snd_timer snd_seq_device snd_hwdep snd soundcore iptable_security iptable_raw iptable_mangle iptable_nat nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 iptable_filter bpfilter ip6_vti ip_vti ip_gre ipip sit tunnel4 ip_tunnel hsr veth netdevsim vxcan batman_adv cfg80211 rfkill chnl_net caif nlmon dummy team bonding vcan bridge stp llc ip6_gre gre ip6_tunnel tunnel6 tun joydev mousedev ppdev tpm kvm_intel kvm irqbypass crct10dif_pclmul crc32_pclmul crc32c_intel ghash_clmulni_intel ide_pci_generic piix aesni_intel aes_x86_64 crypto_simd cryptd glue_helper ide_core psmouse input_leds i2c_piix4 serio_raw intel_agp intel_gtt ata_generic agpgart pata_acpi parport_pc rtc_cmos parport floppy sch_fq_codel ip_tables x_tables sha1_ssse3 sha1_generic ipv6 [last unloaded: rxrpc] Dumping ftrace buffer: (ftrace buffer empty) CR2: fffffbfff830524b ---[ end trace 039ab24b305c4b19 ]--- If nr_proto_init failed, it may forget to call proto_unregister, tiggering this issue.This patch rearrange code of nr_proto_init to avoid such issues. Reported-by: Hulk Robot <hulkci@huawei.com> Signed-off-by: YueHaibing <yuehaibing@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
160 lines
4.2 KiB
C
160 lines
4.2 KiB
C
/*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* Copyright (C) 1996 Mike Shaver (shaver@zeroknowledge.com)
|
|
*/
|
|
#include <linux/mm.h>
|
|
#include <linux/sysctl.h>
|
|
#include <linux/init.h>
|
|
#include <net/ax25.h>
|
|
#include <net/netrom.h>
|
|
|
|
/*
|
|
* Values taken from NET/ROM documentation.
|
|
*/
|
|
static int min_quality[] = {0}, max_quality[] = {255};
|
|
static int min_obs[] = {0}, max_obs[] = {255};
|
|
static int min_ttl[] = {0}, max_ttl[] = {255};
|
|
static int min_t1[] = {5 * HZ};
|
|
static int max_t1[] = {600 * HZ};
|
|
static int min_n2[] = {2}, max_n2[] = {127};
|
|
static int min_t2[] = {1 * HZ};
|
|
static int max_t2[] = {60 * HZ};
|
|
static int min_t4[] = {1 * HZ};
|
|
static int max_t4[] = {1000 * HZ};
|
|
static int min_window[] = {1}, max_window[] = {127};
|
|
static int min_idle[] = {0 * HZ};
|
|
static int max_idle[] = {65535 * HZ};
|
|
static int min_route[] = {0}, max_route[] = {1};
|
|
static int min_fails[] = {1}, max_fails[] = {10};
|
|
static int min_reset[] = {0}, max_reset[] = {1};
|
|
|
|
static struct ctl_table_header *nr_table_header;
|
|
|
|
static struct ctl_table nr_table[] = {
|
|
{
|
|
.procname = "default_path_quality",
|
|
.data = &sysctl_netrom_default_path_quality,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &min_quality,
|
|
.extra2 = &max_quality
|
|
},
|
|
{
|
|
.procname = "obsolescence_count_initialiser",
|
|
.data = &sysctl_netrom_obsolescence_count_initialiser,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &min_obs,
|
|
.extra2 = &max_obs
|
|
},
|
|
{
|
|
.procname = "network_ttl_initialiser",
|
|
.data = &sysctl_netrom_network_ttl_initialiser,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &min_ttl,
|
|
.extra2 = &max_ttl
|
|
},
|
|
{
|
|
.procname = "transport_timeout",
|
|
.data = &sysctl_netrom_transport_timeout,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &min_t1,
|
|
.extra2 = &max_t1
|
|
},
|
|
{
|
|
.procname = "transport_maximum_tries",
|
|
.data = &sysctl_netrom_transport_maximum_tries,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &min_n2,
|
|
.extra2 = &max_n2
|
|
},
|
|
{
|
|
.procname = "transport_acknowledge_delay",
|
|
.data = &sysctl_netrom_transport_acknowledge_delay,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &min_t2,
|
|
.extra2 = &max_t2
|
|
},
|
|
{
|
|
.procname = "transport_busy_delay",
|
|
.data = &sysctl_netrom_transport_busy_delay,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &min_t4,
|
|
.extra2 = &max_t4
|
|
},
|
|
{
|
|
.procname = "transport_requested_window_size",
|
|
.data = &sysctl_netrom_transport_requested_window_size,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &min_window,
|
|
.extra2 = &max_window
|
|
},
|
|
{
|
|
.procname = "transport_no_activity_timeout",
|
|
.data = &sysctl_netrom_transport_no_activity_timeout,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &min_idle,
|
|
.extra2 = &max_idle
|
|
},
|
|
{
|
|
.procname = "routing_control",
|
|
.data = &sysctl_netrom_routing_control,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &min_route,
|
|
.extra2 = &max_route
|
|
},
|
|
{
|
|
.procname = "link_fails_count",
|
|
.data = &sysctl_netrom_link_fails_count,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &min_fails,
|
|
.extra2 = &max_fails
|
|
},
|
|
{
|
|
.procname = "reset",
|
|
.data = &sysctl_netrom_reset_circuit,
|
|
.maxlen = sizeof(int),
|
|
.mode = 0644,
|
|
.proc_handler = proc_dointvec_minmax,
|
|
.extra1 = &min_reset,
|
|
.extra2 = &max_reset
|
|
},
|
|
{ }
|
|
};
|
|
|
|
int __init nr_register_sysctl(void)
|
|
{
|
|
nr_table_header = register_net_sysctl(&init_net, "net/netrom", nr_table);
|
|
if (!nr_table_header)
|
|
return -ENOMEM;
|
|
return 0;
|
|
}
|
|
|
|
void nr_unregister_sysctl(void)
|
|
{
|
|
unregister_net_sysctl_table(nr_table_header);
|
|
}
|