1 | // SPDX-License-Identifier: GPL-2.0-or-later |
2 | /* |
3 | * NET4: Sysctl interface to net af_unix subsystem. |
4 | * |
5 | * Authors: Mike Shaver. |
6 | */ |
7 | |
8 | #include <linux/mm.h> |
9 | #include <linux/slab.h> |
10 | #include <linux/sysctl.h> |
11 | |
12 | #include <net/af_unix.h> |
13 | |
14 | static struct ctl_table unix_table[] = { |
15 | { |
16 | .procname = "max_dgram_qlen" , |
17 | .data = &init_net.unx.sysctl_max_dgram_qlen, |
18 | .maxlen = sizeof(int), |
19 | .mode = 0644, |
20 | .proc_handler = proc_dointvec |
21 | }, |
22 | { } |
23 | }; |
24 | |
25 | int __net_init unix_sysctl_register(struct net *net) |
26 | { |
27 | struct ctl_table *table; |
28 | |
29 | if (net_eq(net1: net, net2: &init_net)) { |
30 | table = unix_table; |
31 | } else { |
32 | table = kmemdup(p: unix_table, size: sizeof(unix_table), GFP_KERNEL); |
33 | if (!table) |
34 | goto err_alloc; |
35 | |
36 | table[0].data = &net->unx.sysctl_max_dgram_qlen; |
37 | } |
38 | |
39 | net->unx.ctl = register_net_sysctl_sz(net, path: "net/unix" , table, |
40 | ARRAY_SIZE(unix_table)); |
41 | if (net->unx.ctl == NULL) |
42 | goto err_reg; |
43 | |
44 | return 0; |
45 | |
46 | err_reg: |
47 | if (!net_eq(net1: net, net2: &init_net)) |
48 | kfree(objp: table); |
49 | err_alloc: |
50 | return -ENOMEM; |
51 | } |
52 | |
53 | void unix_sysctl_unregister(struct net *net) |
54 | { |
55 | struct ctl_table *table; |
56 | |
57 | table = net->unx.ctl->ctl_table_arg; |
58 | unregister_net_sysctl_table(header: net->unx.ctl); |
59 | if (!net_eq(net1: net, net2: &init_net)) |
60 | kfree(objp: table); |
61 | } |
62 | |