xref: /openbmc/linux/net/unix/sysctl_net_unix.c (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
12874c5fdSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * NET4:	Sysctl interface to net af_unix subsystem.
41da177e4SLinus Torvalds  *
51da177e4SLinus Torvalds  * Authors:	Mike Shaver.
61da177e4SLinus Torvalds  */
71da177e4SLinus Torvalds 
81da177e4SLinus Torvalds #include <linux/mm.h>
95a0e3ad6STejun Heo #include <linux/slab.h>
101da177e4SLinus Torvalds #include <linux/sysctl.h>
111da177e4SLinus Torvalds 
1220380731SArnaldo Carvalho de Melo #include <net/af_unix.h>
131da177e4SLinus Torvalds 
14fe2c6338SJoe Perches static struct ctl_table unix_table[] = {
151da177e4SLinus Torvalds 	{
161da177e4SLinus Torvalds 		.procname	= "max_dgram_qlen",
17a0a53c8bSDenis V. Lunev 		.data		= &init_net.unx.sysctl_max_dgram_qlen,
181da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
191da177e4SLinus Torvalds 		.mode		= 0644,
206d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec
211da177e4SLinus Torvalds 	},
22f8572d8fSEric W. Biederman 	{ }
231da177e4SLinus Torvalds };
241da177e4SLinus Torvalds 
unix_sysctl_register(struct net * net)252c8c1e72SAlexey Dobriyan int __net_init unix_sysctl_register(struct net *net)
261da177e4SLinus Torvalds {
271597fbc0SPavel Emelyanov 	struct ctl_table *table;
281597fbc0SPavel Emelyanov 
29849d5aa3SKuniyuki Iwashima 	if (net_eq(net, &init_net)) {
30849d5aa3SKuniyuki Iwashima 		table = unix_table;
31849d5aa3SKuniyuki Iwashima 	} else {
321597fbc0SPavel Emelyanov 		table = kmemdup(unix_table, sizeof(unix_table), GFP_KERNEL);
33849d5aa3SKuniyuki Iwashima 		if (!table)
341597fbc0SPavel Emelyanov 			goto err_alloc;
351597fbc0SPavel Emelyanov 
36a0a53c8bSDenis V. Lunev 		table[0].data = &net->unx.sysctl_max_dgram_qlen;
37849d5aa3SKuniyuki Iwashima 	}
38849d5aa3SKuniyuki Iwashima 
39*c899710fSJoel Granados 	net->unx.ctl = register_net_sysctl_sz(net, "net/unix", table,
40*c899710fSJoel Granados 					      ARRAY_SIZE(unix_table));
41a0a53c8bSDenis V. Lunev 	if (net->unx.ctl == NULL)
421597fbc0SPavel Emelyanov 		goto err_reg;
431597fbc0SPavel Emelyanov 
441597fbc0SPavel Emelyanov 	return 0;
451597fbc0SPavel Emelyanov 
461597fbc0SPavel Emelyanov err_reg:
4744ac441aSEric Dumazet 	if (!net_eq(net, &init_net))
481597fbc0SPavel Emelyanov 		kfree(table);
491597fbc0SPavel Emelyanov err_alloc:
501597fbc0SPavel Emelyanov 	return -ENOMEM;
511da177e4SLinus Torvalds }
521da177e4SLinus Torvalds 
unix_sysctl_unregister(struct net * net)5397577e38SPavel Emelyanov void unix_sysctl_unregister(struct net *net)
541da177e4SLinus Torvalds {
551597fbc0SPavel Emelyanov 	struct ctl_table *table;
561597fbc0SPavel Emelyanov 
57a0a53c8bSDenis V. Lunev 	table = net->unx.ctl->ctl_table_arg;
585dd3df10SEric W. Biederman 	unregister_net_sysctl_table(net->unx.ctl);
59849d5aa3SKuniyuki Iwashima 	if (!net_eq(net, &init_net))
601597fbc0SPavel Emelyanov 		kfree(table);
611da177e4SLinus Torvalds }
62