Commit 6b8d9117ccb4f81b1244aafa7bc70ef8fa45fc49

Authored by Sasha Levin
Committed by David S. Miller
1 parent 6088beef3f

net: llc: use correct size for sysctl timeout entries

The timeout entries are sizeof(int) rather than sizeof(long), which
means that when they were getting read we'd also leak kernel memory
to userspace along with the timeout values.

Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 1 changed file with 4 additions and 4 deletions Inline Diff

net/llc/sysctl_net_llc.c
1 /* 1 /*
2 * sysctl_net_llc.c: sysctl interface to LLC net subsystem. 2 * sysctl_net_llc.c: sysctl interface to LLC net subsystem.
3 * 3 *
4 * Arnaldo Carvalho de Melo <acme@conectiva.com.br> 4 * Arnaldo Carvalho de Melo <acme@conectiva.com.br>
5 */ 5 */
6 6
7 #include <linux/mm.h> 7 #include <linux/mm.h>
8 #include <linux/init.h> 8 #include <linux/init.h>
9 #include <linux/sysctl.h> 9 #include <linux/sysctl.h>
10 #include <net/net_namespace.h> 10 #include <net/net_namespace.h>
11 #include <net/llc.h> 11 #include <net/llc.h>
12 12
13 #ifndef CONFIG_SYSCTL 13 #ifndef CONFIG_SYSCTL
14 #error This file should not be compiled without CONFIG_SYSCTL defined 14 #error This file should not be compiled without CONFIG_SYSCTL defined
15 #endif 15 #endif
16 16
17 static struct ctl_table llc2_timeout_table[] = { 17 static struct ctl_table llc2_timeout_table[] = {
18 { 18 {
19 .procname = "ack", 19 .procname = "ack",
20 .data = &sysctl_llc2_ack_timeout, 20 .data = &sysctl_llc2_ack_timeout,
21 .maxlen = sizeof(long), 21 .maxlen = sizeof(sysctl_llc2_ack_timeout),
22 .mode = 0644, 22 .mode = 0644,
23 .proc_handler = proc_dointvec_jiffies, 23 .proc_handler = proc_dointvec_jiffies,
24 }, 24 },
25 { 25 {
26 .procname = "busy", 26 .procname = "busy",
27 .data = &sysctl_llc2_busy_timeout, 27 .data = &sysctl_llc2_busy_timeout,
28 .maxlen = sizeof(long), 28 .maxlen = sizeof(sysctl_llc2_busy_timeout),
29 .mode = 0644, 29 .mode = 0644,
30 .proc_handler = proc_dointvec_jiffies, 30 .proc_handler = proc_dointvec_jiffies,
31 }, 31 },
32 { 32 {
33 .procname = "p", 33 .procname = "p",
34 .data = &sysctl_llc2_p_timeout, 34 .data = &sysctl_llc2_p_timeout,
35 .maxlen = sizeof(long), 35 .maxlen = sizeof(sysctl_llc2_p_timeout),
36 .mode = 0644, 36 .mode = 0644,
37 .proc_handler = proc_dointvec_jiffies, 37 .proc_handler = proc_dointvec_jiffies,
38 }, 38 },
39 { 39 {
40 .procname = "rej", 40 .procname = "rej",
41 .data = &sysctl_llc2_rej_timeout, 41 .data = &sysctl_llc2_rej_timeout,
42 .maxlen = sizeof(long), 42 .maxlen = sizeof(sysctl_llc2_rej_timeout),
43 .mode = 0644, 43 .mode = 0644,
44 .proc_handler = proc_dointvec_jiffies, 44 .proc_handler = proc_dointvec_jiffies,
45 }, 45 },
46 { }, 46 { },
47 }; 47 };
48 48
49 static struct ctl_table llc_station_table[] = { 49 static struct ctl_table llc_station_table[] = {
50 { }, 50 { },
51 }; 51 };
52 52
53 static struct ctl_table_header *llc2_timeout_header; 53 static struct ctl_table_header *llc2_timeout_header;
54 static struct ctl_table_header *llc_station_header; 54 static struct ctl_table_header *llc_station_header;
55 55
56 int __init llc_sysctl_init(void) 56 int __init llc_sysctl_init(void)
57 { 57 {
58 llc2_timeout_header = register_net_sysctl(&init_net, "net/llc/llc2/timeout", llc2_timeout_table); 58 llc2_timeout_header = register_net_sysctl(&init_net, "net/llc/llc2/timeout", llc2_timeout_table);
59 llc_station_header = register_net_sysctl(&init_net, "net/llc/station", llc_station_table); 59 llc_station_header = register_net_sysctl(&init_net, "net/llc/station", llc_station_table);
60 60
61 if (!llc2_timeout_header || !llc_station_header) { 61 if (!llc2_timeout_header || !llc_station_header) {
62 llc_sysctl_exit(); 62 llc_sysctl_exit();
63 return -ENOMEM; 63 return -ENOMEM;
64 } 64 }
65 return 0; 65 return 0;
66 } 66 }
67 67
68 void llc_sysctl_exit(void) 68 void llc_sysctl_exit(void)
69 { 69 {
70 if (llc2_timeout_header) { 70 if (llc2_timeout_header) {
71 unregister_net_sysctl_table(llc2_timeout_header); 71 unregister_net_sysctl_table(llc2_timeout_header);
72 llc2_timeout_header = NULL; 72 llc2_timeout_header = NULL;
73 } 73 }
74 if (llc_station_header) { 74 if (llc_station_header) {
75 unregister_net_sysctl_table(llc_station_header); 75 unregister_net_sysctl_table(llc_station_header);
76 llc_station_header = NULL; 76 llc_station_header = NULL;
77 } 77 }
78 } 78 }
79 79