xref: /linux/fs/proc/proc_sysctl.c (revision d3d90cc2891c9cf4ecba7b85c0af716ab755c7e5)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * /proc/sys support
4  */
5 #include <linux/init.h>
6 #include <linux/sysctl.h>
7 #include <linux/poll.h>
8 #include <linux/proc_fs.h>
9 #include <linux/printk.h>
10 #include <linux/security.h>
11 #include <linux/sched.h>
12 #include <linux/cred.h>
13 #include <linux/namei.h>
14 #include <linux/mm.h>
15 #include <linux/uio.h>
16 #include <linux/module.h>
17 #include <linux/bpf-cgroup.h>
18 #include <linux/mount.h>
19 #include <linux/kmemleak.h>
20 #include <linux/lockdep.h>
21 #include "internal.h"
22 
23 #define list_for_each_table_entry(entry, header)	\
24 	entry = header->ctl_table;			\
25 	for (size_t i = 0 ; i < header->ctl_table_size; ++i, entry++)
26 
27 static const struct dentry_operations proc_sys_dentry_operations;
28 static const struct file_operations proc_sys_file_operations;
29 static const struct inode_operations proc_sys_inode_operations;
30 static const struct file_operations proc_sys_dir_file_operations;
31 static const struct inode_operations proc_sys_dir_operations;
32 
33 /*
34  * Support for permanently empty directories.
35  * Must be non-empty to avoid sharing an address with other tables.
36  */
37 static const struct ctl_table sysctl_mount_point[] = {
38 	{ }
39 };
40 
41 /**
42  * register_sysctl_mount_point() - registers a sysctl mount point
43  * @path: path for the mount point
44  *
45  * Used to create a permanently empty directory to serve as mount point.
46  * There are some subtle but important permission checks this allows in the
47  * case of unprivileged mounts.
48  */
register_sysctl_mount_point(const char * path)49 struct ctl_table_header *register_sysctl_mount_point(const char *path)
50 {
51 	return register_sysctl_sz(path, sysctl_mount_point, 0);
52 }
53 EXPORT_SYMBOL(register_sysctl_mount_point);
54 
55 #define sysctl_is_perm_empty_ctl_header(hptr)		\
56 	(hptr->type == SYSCTL_TABLE_TYPE_PERMANENTLY_EMPTY)
57 #define sysctl_set_perm_empty_ctl_header(hptr)		\
58 	(hptr->type = SYSCTL_TABLE_TYPE_PERMANENTLY_EMPTY)
59 #define sysctl_clear_perm_empty_ctl_header(hptr)	\
60 	(hptr->type = SYSCTL_TABLE_TYPE_DEFAULT)
61 
proc_sys_poll_notify(struct ctl_table_poll * poll)62 void proc_sys_poll_notify(struct ctl_table_poll *poll)
63 {
64 	if (!poll)
65 		return;
66 
67 	atomic_inc(&poll->event);
68 	wake_up_interruptible(&poll->wait);
69 }
70 
71 static const struct ctl_table root_table[] = {
72 	{
73 		.procname = "",
74 		.mode = S_IFDIR|S_IRUGO|S_IXUGO,
75 	},
76 };
77 static struct ctl_table_root sysctl_table_root = {
78 	.default_set.dir.header = {
79 		{{.count = 1,
80 		  .nreg = 1,
81 		  .ctl_table = root_table }},
82 		.ctl_table_arg = root_table,
83 		.root = &sysctl_table_root,
84 		.set = &sysctl_table_root.default_set,
85 	},
86 };
87 
88 static DEFINE_SPINLOCK(sysctl_lock);
89 
90 static void drop_sysctl_table(struct ctl_table_header *header);
91 static int sysctl_follow_link(struct ctl_table_header **phead,
92 	const struct ctl_table **pentry);
93 static int insert_links(struct ctl_table_header *head);
94 static void put_links(struct ctl_table_header *header);
95 
sysctl_print_dir(struct ctl_dir * dir)96 static void sysctl_print_dir(struct ctl_dir *dir)
97 {
98 	if (dir->header.parent)
99 		sysctl_print_dir(dir->header.parent);
100 	pr_cont("%s/", dir->header.ctl_table[0].procname);
101 }
102 
namecmp(const char * name1,int len1,const char * name2,int len2)103 static int namecmp(const char *name1, int len1, const char *name2, int len2)
104 {
105 	int cmp;
106 
107 	cmp = memcmp(name1, name2, min(len1, len2));
108 	if (cmp == 0)
109 		cmp = len1 - len2;
110 	return cmp;
111 }
112 
find_entry(struct ctl_table_header ** phead,struct ctl_dir * dir,const char * name,int namelen)113 static const struct ctl_table *find_entry(struct ctl_table_header **phead,
114 	struct ctl_dir *dir, const char *name, int namelen)
115 {
116 	struct ctl_table_header *head;
117 	const struct ctl_table *entry;
118 	struct rb_node *node = dir->root.rb_node;
119 
120 	lockdep_assert_held(&sysctl_lock);
121 
122 	while (node)
123 	{
124 		struct ctl_node *ctl_node;
125 		const char *procname;
126 		int cmp;
127 
128 		ctl_node = rb_entry(node, struct ctl_node, node);
129 		head = ctl_node->header;
130 		entry = &head->ctl_table[ctl_node - head->node];
131 		procname = entry->procname;
132 
133 		cmp = namecmp(name, namelen, procname, strlen(procname));
134 		if (cmp < 0)
135 			node = node->rb_left;
136 		else if (cmp > 0)
137 			node = node->rb_right;
138 		else {
139 			*phead = head;
140 			return entry;
141 		}
142 	}
143 	return NULL;
144 }
145 
insert_entry(struct ctl_table_header * head,const struct ctl_table * entry)146 static int insert_entry(struct ctl_table_header *head, const struct ctl_table *entry)
147 {
148 	struct rb_node *node = &head->node[entry - head->ctl_table].node;
149 	struct rb_node **p = &head->parent->root.rb_node;
150 	struct rb_node *parent = NULL;
151 	const char *name = entry->procname;
152 	int namelen = strlen(name);
153 
154 	while (*p) {
155 		struct ctl_table_header *parent_head;
156 		const struct ctl_table *parent_entry;
157 		struct ctl_node *parent_node;
158 		const char *parent_name;
159 		int cmp;
160 
161 		parent = *p;
162 		parent_node = rb_entry(parent, struct ctl_node, node);
163 		parent_head = parent_node->header;
164 		parent_entry = &parent_head->ctl_table[parent_node - parent_head->node];
165 		parent_name = parent_entry->procname;
166 
167 		cmp = namecmp(name, namelen, parent_name, strlen(parent_name));
168 		if (cmp < 0)
169 			p = &(*p)->rb_left;
170 		else if (cmp > 0)
171 			p = &(*p)->rb_right;
172 		else {
173 			pr_err("sysctl duplicate entry: ");
174 			sysctl_print_dir(head->parent);
175 			pr_cont("%s\n", entry->procname);
176 			return -EEXIST;
177 		}
178 	}
179 
180 	rb_link_node(node, parent, p);
181 	rb_insert_color(node, &head->parent->root);
182 	return 0;
183 }
184 
erase_entry(struct ctl_table_header * head,const struct ctl_table * entry)185 static void erase_entry(struct ctl_table_header *head, const struct ctl_table *entry)
186 {
187 	struct rb_node *node = &head->node[entry - head->ctl_table].node;
188 
189 	rb_erase(node, &head->parent->root);
190 }
191 
init_header(struct ctl_table_header * head,struct ctl_table_root * root,struct ctl_table_set * set,struct ctl_node * node,const struct ctl_table * table,size_t table_size)192 static void init_header(struct ctl_table_header *head,
193 	struct ctl_table_root *root, struct ctl_table_set *set,
194 	struct ctl_node *node, const struct ctl_table *table, size_t table_size)
195 {
196 	head->ctl_table = table;
197 	head->ctl_table_size = table_size;
198 	head->ctl_table_arg = table;
199 	head->used = 0;
200 	head->count = 1;
201 	head->nreg = 1;
202 	head->unregistering = NULL;
203 	head->root = root;
204 	head->set = set;
205 	head->parent = NULL;
206 	head->node = node;
207 	INIT_HLIST_HEAD(&head->inodes);
208 	if (node) {
209 		const struct ctl_table *entry;
210 
211 		list_for_each_table_entry(entry, head) {
212 			node->header = head;
213 			node++;
214 		}
215 	}
216 	if (table == sysctl_mount_point)
217 		sysctl_set_perm_empty_ctl_header(head);
218 }
219 
erase_header(struct ctl_table_header * head)220 static void erase_header(struct ctl_table_header *head)
221 {
222 	const struct ctl_table *entry;
223 
224 	list_for_each_table_entry(entry, head)
225 		erase_entry(head, entry);
226 }
227 
insert_header(struct ctl_dir * dir,struct ctl_table_header * header)228 static int insert_header(struct ctl_dir *dir, struct ctl_table_header *header)
229 {
230 	const struct ctl_table *entry;
231 	struct ctl_table_header *dir_h = &dir->header;
232 	int err;
233 
234 
235 	/* Is this a permanently empty directory? */
236 	if (sysctl_is_perm_empty_ctl_header(dir_h))
237 		return -EROFS;
238 
239 	/* Am I creating a permanently empty directory? */
240 	if (sysctl_is_perm_empty_ctl_header(header)) {
241 		if (!RB_EMPTY_ROOT(&dir->root))
242 			return -EINVAL;
243 		sysctl_set_perm_empty_ctl_header(dir_h);
244 	}
245 
246 	dir_h->nreg++;
247 	header->parent = dir;
248 	err = insert_links(header);
249 	if (err)
250 		goto fail_links;
251 	list_for_each_table_entry(entry, header) {
252 		err = insert_entry(header, entry);
253 		if (err)
254 			goto fail;
255 	}
256 	return 0;
257 fail:
258 	erase_header(header);
259 	put_links(header);
260 fail_links:
261 	if (header->ctl_table == sysctl_mount_point)
262 		sysctl_clear_perm_empty_ctl_header(dir_h);
263 	header->parent = NULL;
264 	drop_sysctl_table(dir_h);
265 	return err;
266 }
267 
use_table(struct ctl_table_header * p)268 static int use_table(struct ctl_table_header *p)
269 {
270 	lockdep_assert_held(&sysctl_lock);
271 
272 	if (unlikely(p->unregistering))
273 		return 0;
274 	p->used++;
275 	return 1;
276 }
277 
unuse_table(struct ctl_table_header * p)278 static void unuse_table(struct ctl_table_header *p)
279 {
280 	lockdep_assert_held(&sysctl_lock);
281 
282 	if (!--p->used)
283 		if (unlikely(p->unregistering))
284 			complete(p->unregistering);
285 }
286 
proc_sys_invalidate_dcache(struct ctl_table_header * head)287 static void proc_sys_invalidate_dcache(struct ctl_table_header *head)
288 {
289 	proc_invalidate_siblings_dcache(&head->inodes, &sysctl_lock);
290 }
291 
start_unregistering(struct ctl_table_header * p)292 static void start_unregistering(struct ctl_table_header *p)
293 {
294 	/* will reacquire if has to wait */
295 	lockdep_assert_held(&sysctl_lock);
296 
297 	/*
298 	 * if p->used is 0, nobody will ever touch that entry again;
299 	 * we'll eliminate all paths to it before dropping sysctl_lock
300 	 */
301 	if (unlikely(p->used)) {
302 		struct completion wait;
303 		init_completion(&wait);
304 		p->unregistering = &wait;
305 		spin_unlock(&sysctl_lock);
306 		wait_for_completion(&wait);
307 	} else {
308 		/* anything non-NULL; we'll never dereference it */
309 		p->unregistering = ERR_PTR(-EINVAL);
310 		spin_unlock(&sysctl_lock);
311 	}
312 	/*
313 	 * Invalidate dentries for unregistered sysctls: namespaced sysctls
314 	 * can have duplicate names and contaminate dcache very badly.
315 	 */
316 	proc_sys_invalidate_dcache(p);
317 	/*
318 	 * do not remove from the list until nobody holds it; walking the
319 	 * list in do_sysctl() relies on that.
320 	 */
321 	spin_lock(&sysctl_lock);
322 	erase_header(p);
323 }
324 
sysctl_head_grab(struct ctl_table_header * head)325 static struct ctl_table_header *sysctl_head_grab(struct ctl_table_header *head)
326 {
327 	BUG_ON(!head);
328 	spin_lock(&sysctl_lock);
329 	if (!use_table(head))
330 		head = ERR_PTR(-ENOENT);
331 	spin_unlock(&sysctl_lock);
332 	return head;
333 }
334 
sysctl_head_finish(struct ctl_table_header * head)335 static void sysctl_head_finish(struct ctl_table_header *head)
336 {
337 	if (!head)
338 		return;
339 	spin_lock(&sysctl_lock);
340 	unuse_table(head);
341 	spin_unlock(&sysctl_lock);
342 }
343 
344 static struct ctl_table_set *
lookup_header_set(struct ctl_table_root * root)345 lookup_header_set(struct ctl_table_root *root)
346 {
347 	struct ctl_table_set *set = &root->default_set;
348 	if (root->lookup)
349 		set = root->lookup(root);
350 	return set;
351 }
352 
lookup_entry(struct ctl_table_header ** phead,struct ctl_dir * dir,const char * name,int namelen)353 static const struct ctl_table *lookup_entry(struct ctl_table_header **phead,
354 					    struct ctl_dir *dir,
355 					    const char *name, int namelen)
356 {
357 	struct ctl_table_header *head;
358 	const struct ctl_table *entry;
359 
360 	spin_lock(&sysctl_lock);
361 	entry = find_entry(&head, dir, name, namelen);
362 	if (entry && use_table(head))
363 		*phead = head;
364 	else
365 		entry = NULL;
366 	spin_unlock(&sysctl_lock);
367 	return entry;
368 }
369 
first_usable_entry(struct rb_node * node)370 static struct ctl_node *first_usable_entry(struct rb_node *node)
371 {
372 	struct ctl_node *ctl_node;
373 
374 	for (;node; node = rb_next(node)) {
375 		ctl_node = rb_entry(node, struct ctl_node, node);
376 		if (use_table(ctl_node->header))
377 			return ctl_node;
378 	}
379 	return NULL;
380 }
381 
first_entry(struct ctl_dir * dir,struct ctl_table_header ** phead,const struct ctl_table ** pentry)382 static void first_entry(struct ctl_dir *dir,
383 	struct ctl_table_header **phead, const struct ctl_table **pentry)
384 {
385 	struct ctl_table_header *head = NULL;
386 	const struct ctl_table *entry = NULL;
387 	struct ctl_node *ctl_node;
388 
389 	spin_lock(&sysctl_lock);
390 	ctl_node = first_usable_entry(rb_first(&dir->root));
391 	spin_unlock(&sysctl_lock);
392 	if (ctl_node) {
393 		head = ctl_node->header;
394 		entry = &head->ctl_table[ctl_node - head->node];
395 	}
396 	*phead = head;
397 	*pentry = entry;
398 }
399 
next_entry(struct ctl_table_header ** phead,const struct ctl_table ** pentry)400 static void next_entry(struct ctl_table_header **phead, const struct ctl_table **pentry)
401 {
402 	struct ctl_table_header *head = *phead;
403 	const struct ctl_table *entry = *pentry;
404 	struct ctl_node *ctl_node = &head->node[entry - head->ctl_table];
405 
406 	spin_lock(&sysctl_lock);
407 	unuse_table(head);
408 
409 	ctl_node = first_usable_entry(rb_next(&ctl_node->node));
410 	spin_unlock(&sysctl_lock);
411 	head = NULL;
412 	if (ctl_node) {
413 		head = ctl_node->header;
414 		entry = &head->ctl_table[ctl_node - head->node];
415 	}
416 	*phead = head;
417 	*pentry = entry;
418 }
419 
420 /*
421  * sysctl_perm does NOT grant the superuser all rights automatically, because
422  * some sysctl variables are readonly even to root.
423  */
424 
test_perm(int mode,int op)425 static int test_perm(int mode, int op)
426 {
427 	if (uid_eq(current_euid(), GLOBAL_ROOT_UID))
428 		mode >>= 6;
429 	else if (in_egroup_p(GLOBAL_ROOT_GID))
430 		mode >>= 3;
431 	if ((op & ~mode & (MAY_READ|MAY_WRITE|MAY_EXEC)) == 0)
432 		return 0;
433 	return -EACCES;
434 }
435 
sysctl_perm(struct ctl_table_header * head,const struct ctl_table * table,int op)436 static int sysctl_perm(struct ctl_table_header *head, const struct ctl_table *table, int op)
437 {
438 	struct ctl_table_root *root = head->root;
439 	int mode;
440 
441 	if (root->permissions)
442 		mode = root->permissions(head, table);
443 	else
444 		mode = table->mode;
445 
446 	return test_perm(mode, op);
447 }
448 
proc_sys_make_inode(struct super_block * sb,struct ctl_table_header * head,const struct ctl_table * table)449 static struct inode *proc_sys_make_inode(struct super_block *sb,
450 		struct ctl_table_header *head, const struct ctl_table *table)
451 {
452 	struct ctl_table_root *root = head->root;
453 	struct inode *inode;
454 	struct proc_inode *ei;
455 
456 	inode = new_inode(sb);
457 	if (!inode)
458 		return ERR_PTR(-ENOMEM);
459 
460 	inode->i_ino = get_next_ino();
461 
462 	ei = PROC_I(inode);
463 
464 	spin_lock(&sysctl_lock);
465 	if (unlikely(head->unregistering)) {
466 		spin_unlock(&sysctl_lock);
467 		iput(inode);
468 		return ERR_PTR(-ENOENT);
469 	}
470 	ei->sysctl = head;
471 	ei->sysctl_entry = table;
472 	hlist_add_head_rcu(&ei->sibling_inodes, &head->inodes);
473 	head->count++;
474 	spin_unlock(&sysctl_lock);
475 
476 	simple_inode_init_ts(inode);
477 	inode->i_mode = table->mode;
478 	if (!S_ISDIR(table->mode)) {
479 		inode->i_mode |= S_IFREG;
480 		inode->i_op = &proc_sys_inode_operations;
481 		inode->i_fop = &proc_sys_file_operations;
482 	} else {
483 		inode->i_mode |= S_IFDIR;
484 		inode->i_op = &proc_sys_dir_operations;
485 		inode->i_fop = &proc_sys_dir_file_operations;
486 		if (sysctl_is_perm_empty_ctl_header(head))
487 			make_empty_dir_inode(inode);
488 	}
489 
490 	inode->i_uid = GLOBAL_ROOT_UID;
491 	inode->i_gid = GLOBAL_ROOT_GID;
492 	if (root->set_ownership)
493 		root->set_ownership(head, &inode->i_uid, &inode->i_gid);
494 
495 	return inode;
496 }
497 
proc_sys_evict_inode(struct inode * inode,struct ctl_table_header * head)498 void proc_sys_evict_inode(struct inode *inode, struct ctl_table_header *head)
499 {
500 	spin_lock(&sysctl_lock);
501 	hlist_del_init_rcu(&PROC_I(inode)->sibling_inodes);
502 	if (!--head->count)
503 		kfree_rcu(head, rcu);
504 	spin_unlock(&sysctl_lock);
505 }
506 
grab_header(struct inode * inode)507 static struct ctl_table_header *grab_header(struct inode *inode)
508 {
509 	struct ctl_table_header *head = PROC_I(inode)->sysctl;
510 	if (!head)
511 		head = &sysctl_table_root.default_set.dir.header;
512 	return sysctl_head_grab(head);
513 }
514 
proc_sys_lookup(struct inode * dir,struct dentry * dentry,unsigned int flags)515 static struct dentry *proc_sys_lookup(struct inode *dir, struct dentry *dentry,
516 					unsigned int flags)
517 {
518 	struct ctl_table_header *head = grab_header(dir);
519 	struct ctl_table_header *h = NULL;
520 	const struct qstr *name = &dentry->d_name;
521 	const struct ctl_table *p;
522 	struct inode *inode;
523 	struct dentry *err = ERR_PTR(-ENOENT);
524 	struct ctl_dir *ctl_dir;
525 	int ret;
526 
527 	if (IS_ERR(head))
528 		return ERR_CAST(head);
529 
530 	ctl_dir = container_of(head, struct ctl_dir, header);
531 
532 	p = lookup_entry(&h, ctl_dir, name->name, name->len);
533 	if (!p)
534 		goto out;
535 
536 	if (S_ISLNK(p->mode)) {
537 		ret = sysctl_follow_link(&h, &p);
538 		err = ERR_PTR(ret);
539 		if (ret)
540 			goto out;
541 	}
542 
543 	d_set_d_op(dentry, &proc_sys_dentry_operations);
544 	inode = proc_sys_make_inode(dir->i_sb, h ? h : head, p);
545 	err = d_splice_alias(inode, dentry);
546 
547 out:
548 	if (h)
549 		sysctl_head_finish(h);
550 	sysctl_head_finish(head);
551 	return err;
552 }
553 
proc_sys_call_handler(struct kiocb * iocb,struct iov_iter * iter,int write)554 static ssize_t proc_sys_call_handler(struct kiocb *iocb, struct iov_iter *iter,
555 		int write)
556 {
557 	struct inode *inode = file_inode(iocb->ki_filp);
558 	struct ctl_table_header *head = grab_header(inode);
559 	const struct ctl_table *table = PROC_I(inode)->sysctl_entry;
560 	size_t count = iov_iter_count(iter);
561 	char *kbuf;
562 	ssize_t error;
563 
564 	if (IS_ERR(head))
565 		return PTR_ERR(head);
566 
567 	/*
568 	 * At this point we know that the sysctl was not unregistered
569 	 * and won't be until we finish.
570 	 */
571 	error = -EPERM;
572 	if (sysctl_perm(head, table, write ? MAY_WRITE : MAY_READ))
573 		goto out;
574 
575 	/* if that can happen at all, it should be -EINVAL, not -EISDIR */
576 	error = -EINVAL;
577 	if (!table->proc_handler)
578 		goto out;
579 
580 	/* don't even try if the size is too large */
581 	error = -ENOMEM;
582 	if (count >= KMALLOC_MAX_SIZE)
583 		goto out;
584 	kbuf = kvzalloc(count + 1, GFP_KERNEL);
585 	if (!kbuf)
586 		goto out;
587 
588 	if (write) {
589 		error = -EFAULT;
590 		if (!copy_from_iter_full(kbuf, count, iter))
591 			goto out_free_buf;
592 		kbuf[count] = '\0';
593 	}
594 
595 	error = BPF_CGROUP_RUN_PROG_SYSCTL(head, table, write, &kbuf, &count,
596 					   &iocb->ki_pos);
597 	if (error)
598 		goto out_free_buf;
599 
600 	/* careful: calling conventions are nasty here */
601 	error = table->proc_handler(table, write, kbuf, &count, &iocb->ki_pos);
602 	if (error)
603 		goto out_free_buf;
604 
605 	if (!write) {
606 		error = -EFAULT;
607 		if (copy_to_iter(kbuf, count, iter) < count)
608 			goto out_free_buf;
609 	}
610 
611 	error = count;
612 out_free_buf:
613 	kvfree(kbuf);
614 out:
615 	sysctl_head_finish(head);
616 
617 	return error;
618 }
619 
proc_sys_read(struct kiocb * iocb,struct iov_iter * iter)620 static ssize_t proc_sys_read(struct kiocb *iocb, struct iov_iter *iter)
621 {
622 	return proc_sys_call_handler(iocb, iter, 0);
623 }
624 
proc_sys_write(struct kiocb * iocb,struct iov_iter * iter)625 static ssize_t proc_sys_write(struct kiocb *iocb, struct iov_iter *iter)
626 {
627 	return proc_sys_call_handler(iocb, iter, 1);
628 }
629 
proc_sys_open(struct inode * inode,struct file * filp)630 static int proc_sys_open(struct inode *inode, struct file *filp)
631 {
632 	struct ctl_table_header *head = grab_header(inode);
633 	const struct ctl_table *table = PROC_I(inode)->sysctl_entry;
634 
635 	/* sysctl was unregistered */
636 	if (IS_ERR(head))
637 		return PTR_ERR(head);
638 
639 	if (table->poll)
640 		filp->private_data = proc_sys_poll_event(table->poll);
641 
642 	sysctl_head_finish(head);
643 
644 	return 0;
645 }
646 
proc_sys_poll(struct file * filp,poll_table * wait)647 static __poll_t proc_sys_poll(struct file *filp, poll_table *wait)
648 {
649 	struct inode *inode = file_inode(filp);
650 	struct ctl_table_header *head = grab_header(inode);
651 	const struct ctl_table *table = PROC_I(inode)->sysctl_entry;
652 	__poll_t ret = DEFAULT_POLLMASK;
653 	unsigned long event;
654 
655 	/* sysctl was unregistered */
656 	if (IS_ERR(head))
657 		return EPOLLERR | EPOLLHUP;
658 
659 	if (!table->proc_handler)
660 		goto out;
661 
662 	if (!table->poll)
663 		goto out;
664 
665 	event = (unsigned long)filp->private_data;
666 	poll_wait(filp, &table->poll->wait, wait);
667 
668 	if (event != atomic_read(&table->poll->event)) {
669 		filp->private_data = proc_sys_poll_event(table->poll);
670 		ret = EPOLLIN | EPOLLRDNORM | EPOLLERR | EPOLLPRI;
671 	}
672 
673 out:
674 	sysctl_head_finish(head);
675 
676 	return ret;
677 }
678 
proc_sys_fill_cache(struct file * file,struct dir_context * ctx,struct ctl_table_header * head,const struct ctl_table * table)679 static bool proc_sys_fill_cache(struct file *file,
680 				struct dir_context *ctx,
681 				struct ctl_table_header *head,
682 				const struct ctl_table *table)
683 {
684 	struct dentry *child, *dir = file->f_path.dentry;
685 	struct inode *inode;
686 	struct qstr qname;
687 	ino_t ino = 0;
688 	unsigned type = DT_UNKNOWN;
689 
690 	qname.name = table->procname;
691 	qname.len  = strlen(table->procname);
692 	qname.hash = full_name_hash(dir, qname.name, qname.len);
693 
694 	child = d_lookup(dir, &qname);
695 	if (!child) {
696 		DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);
697 		child = d_alloc_parallel(dir, &qname, &wq);
698 		if (IS_ERR(child))
699 			return false;
700 		if (d_in_lookup(child)) {
701 			struct dentry *res;
702 			d_set_d_op(child, &proc_sys_dentry_operations);
703 			inode = proc_sys_make_inode(dir->d_sb, head, table);
704 			res = d_splice_alias(inode, child);
705 			d_lookup_done(child);
706 			if (unlikely(res)) {
707 				dput(child);
708 
709 				if (IS_ERR(res))
710 					return false;
711 
712 				child = res;
713 			}
714 		}
715 	}
716 	inode = d_inode(child);
717 	ino  = inode->i_ino;
718 	type = inode->i_mode >> 12;
719 	dput(child);
720 	return dir_emit(ctx, qname.name, qname.len, ino, type);
721 }
722 
proc_sys_link_fill_cache(struct file * file,struct dir_context * ctx,struct ctl_table_header * head,const struct ctl_table * table)723 static bool proc_sys_link_fill_cache(struct file *file,
724 				    struct dir_context *ctx,
725 				    struct ctl_table_header *head,
726 				    const struct ctl_table *table)
727 {
728 	bool ret = true;
729 
730 	head = sysctl_head_grab(head);
731 	if (IS_ERR(head))
732 		return false;
733 
734 	/* It is not an error if we can not follow the link ignore it */
735 	if (sysctl_follow_link(&head, &table))
736 		goto out;
737 
738 	ret = proc_sys_fill_cache(file, ctx, head, table);
739 out:
740 	sysctl_head_finish(head);
741 	return ret;
742 }
743 
scan(struct ctl_table_header * head,const struct ctl_table * table,unsigned long * pos,struct file * file,struct dir_context * ctx)744 static int scan(struct ctl_table_header *head, const struct ctl_table *table,
745 		unsigned long *pos, struct file *file,
746 		struct dir_context *ctx)
747 {
748 	bool res;
749 
750 	if ((*pos)++ < ctx->pos)
751 		return true;
752 
753 	if (unlikely(S_ISLNK(table->mode)))
754 		res = proc_sys_link_fill_cache(file, ctx, head, table);
755 	else
756 		res = proc_sys_fill_cache(file, ctx, head, table);
757 
758 	if (res)
759 		ctx->pos = *pos;
760 
761 	return res;
762 }
763 
proc_sys_readdir(struct file * file,struct dir_context * ctx)764 static int proc_sys_readdir(struct file *file, struct dir_context *ctx)
765 {
766 	struct ctl_table_header *head = grab_header(file_inode(file));
767 	struct ctl_table_header *h = NULL;
768 	const struct ctl_table *entry;
769 	struct ctl_dir *ctl_dir;
770 	unsigned long pos;
771 
772 	if (IS_ERR(head))
773 		return PTR_ERR(head);
774 
775 	ctl_dir = container_of(head, struct ctl_dir, header);
776 
777 	if (!dir_emit_dots(file, ctx))
778 		goto out;
779 
780 	pos = 2;
781 
782 	for (first_entry(ctl_dir, &h, &entry); h; next_entry(&h, &entry)) {
783 		if (!scan(h, entry, &pos, file, ctx)) {
784 			sysctl_head_finish(h);
785 			break;
786 		}
787 	}
788 out:
789 	sysctl_head_finish(head);
790 	return 0;
791 }
792 
proc_sys_permission(struct mnt_idmap * idmap,struct inode * inode,int mask)793 static int proc_sys_permission(struct mnt_idmap *idmap,
794 			       struct inode *inode, int mask)
795 {
796 	/*
797 	 * sysctl entries that are not writeable,
798 	 * are _NOT_ writeable, capabilities or not.
799 	 */
800 	struct ctl_table_header *head;
801 	const struct ctl_table *table;
802 	int error;
803 
804 	/* Executable files are not allowed under /proc/sys/ */
805 	if ((mask & MAY_EXEC) && S_ISREG(inode->i_mode))
806 		return -EACCES;
807 
808 	head = grab_header(inode);
809 	if (IS_ERR(head))
810 		return PTR_ERR(head);
811 
812 	table = PROC_I(inode)->sysctl_entry;
813 	if (!table) /* global root - r-xr-xr-x */
814 		error = mask & MAY_WRITE ? -EACCES : 0;
815 	else /* Use the permissions on the sysctl table entry */
816 		error = sysctl_perm(head, table, mask & ~MAY_NOT_BLOCK);
817 
818 	sysctl_head_finish(head);
819 	return error;
820 }
821 
proc_sys_setattr(struct mnt_idmap * idmap,struct dentry * dentry,struct iattr * attr)822 static int proc_sys_setattr(struct mnt_idmap *idmap,
823 			    struct dentry *dentry, struct iattr *attr)
824 {
825 	struct inode *inode = d_inode(dentry);
826 	int error;
827 
828 	if (attr->ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID))
829 		return -EPERM;
830 
831 	error = setattr_prepare(&nop_mnt_idmap, dentry, attr);
832 	if (error)
833 		return error;
834 
835 	setattr_copy(&nop_mnt_idmap, inode, attr);
836 	return 0;
837 }
838 
proc_sys_getattr(struct mnt_idmap * idmap,const struct path * path,struct kstat * stat,u32 request_mask,unsigned int query_flags)839 static int proc_sys_getattr(struct mnt_idmap *idmap,
840 			    const struct path *path, struct kstat *stat,
841 			    u32 request_mask, unsigned int query_flags)
842 {
843 	struct inode *inode = d_inode(path->dentry);
844 	struct ctl_table_header *head = grab_header(inode);
845 	const struct ctl_table *table = PROC_I(inode)->sysctl_entry;
846 
847 	if (IS_ERR(head))
848 		return PTR_ERR(head);
849 
850 	generic_fillattr(&nop_mnt_idmap, request_mask, inode, stat);
851 	if (table)
852 		stat->mode = (stat->mode & S_IFMT) | table->mode;
853 
854 	sysctl_head_finish(head);
855 	return 0;
856 }
857 
858 static const struct file_operations proc_sys_file_operations = {
859 	.open		= proc_sys_open,
860 	.poll		= proc_sys_poll,
861 	.read_iter	= proc_sys_read,
862 	.write_iter	= proc_sys_write,
863 	.splice_read	= copy_splice_read,
864 	.splice_write	= iter_file_splice_write,
865 	.llseek		= default_llseek,
866 };
867 
868 static const struct file_operations proc_sys_dir_file_operations = {
869 	.read		= generic_read_dir,
870 	.iterate_shared	= proc_sys_readdir,
871 	.llseek		= generic_file_llseek,
872 };
873 
874 static const struct inode_operations proc_sys_inode_operations = {
875 	.permission	= proc_sys_permission,
876 	.setattr	= proc_sys_setattr,
877 	.getattr	= proc_sys_getattr,
878 };
879 
880 static const struct inode_operations proc_sys_dir_operations = {
881 	.lookup		= proc_sys_lookup,
882 	.permission	= proc_sys_permission,
883 	.setattr	= proc_sys_setattr,
884 	.getattr	= proc_sys_getattr,
885 };
886 
proc_sys_revalidate(struct inode * dir,const struct qstr * name,struct dentry * dentry,unsigned int flags)887 static int proc_sys_revalidate(struct inode *dir, const struct qstr *name,
888 			       struct dentry *dentry, unsigned int flags)
889 {
890 	if (flags & LOOKUP_RCU)
891 		return -ECHILD;
892 	return !PROC_I(d_inode(dentry))->sysctl->unregistering;
893 }
894 
proc_sys_delete(const struct dentry * dentry)895 static int proc_sys_delete(const struct dentry *dentry)
896 {
897 	return !!PROC_I(d_inode(dentry))->sysctl->unregistering;
898 }
899 
sysctl_is_seen(struct ctl_table_header * p)900 static int sysctl_is_seen(struct ctl_table_header *p)
901 {
902 	struct ctl_table_set *set = p->set;
903 	int res;
904 	spin_lock(&sysctl_lock);
905 	if (p->unregistering)
906 		res = 0;
907 	else if (!set->is_seen)
908 		res = 1;
909 	else
910 		res = set->is_seen(set);
911 	spin_unlock(&sysctl_lock);
912 	return res;
913 }
914 
proc_sys_compare(const struct dentry * dentry,unsigned int len,const char * str,const struct qstr * name)915 static int proc_sys_compare(const struct dentry *dentry,
916 		unsigned int len, const char *str, const struct qstr *name)
917 {
918 	struct ctl_table_header *head;
919 	struct inode *inode;
920 
921 	/* Although proc doesn't have negative dentries, rcu-walk means
922 	 * that inode here can be NULL */
923 	/* AV: can it, indeed? */
924 	inode = d_inode_rcu(dentry);
925 	if (!inode)
926 		return 1;
927 	if (name->len != len)
928 		return 1;
929 	if (memcmp(name->name, str, len))
930 		return 1;
931 	head = rcu_dereference(PROC_I(inode)->sysctl);
932 	return !head || !sysctl_is_seen(head);
933 }
934 
935 static const struct dentry_operations proc_sys_dentry_operations = {
936 	.d_revalidate	= proc_sys_revalidate,
937 	.d_delete	= proc_sys_delete,
938 	.d_compare	= proc_sys_compare,
939 };
940 
find_subdir(struct ctl_dir * dir,const char * name,int namelen)941 static struct ctl_dir *find_subdir(struct ctl_dir *dir,
942 				   const char *name, int namelen)
943 {
944 	struct ctl_table_header *head;
945 	const struct ctl_table *entry;
946 
947 	entry = find_entry(&head, dir, name, namelen);
948 	if (!entry)
949 		return ERR_PTR(-ENOENT);
950 	if (!S_ISDIR(entry->mode))
951 		return ERR_PTR(-ENOTDIR);
952 	return container_of(head, struct ctl_dir, header);
953 }
954 
new_dir(struct ctl_table_set * set,const char * name,int namelen)955 static struct ctl_dir *new_dir(struct ctl_table_set *set,
956 			       const char *name, int namelen)
957 {
958 	struct ctl_table *table;
959 	struct ctl_dir *new;
960 	struct ctl_node *node;
961 	char *new_name;
962 
963 	new = kzalloc(sizeof(*new) + sizeof(struct ctl_node) +
964 		      sizeof(struct ctl_table) +  namelen + 1,
965 		      GFP_KERNEL);
966 	if (!new)
967 		return NULL;
968 
969 	node = (struct ctl_node *)(new + 1);
970 	table = (struct ctl_table *)(node + 1);
971 	new_name = (char *)(table + 1);
972 	memcpy(new_name, name, namelen);
973 	table[0].procname = new_name;
974 	table[0].mode = S_IFDIR|S_IRUGO|S_IXUGO;
975 	init_header(&new->header, set->dir.header.root, set, node, table, 1);
976 
977 	return new;
978 }
979 
980 /**
981  * get_subdir - find or create a subdir with the specified name.
982  * @dir:  Directory to create the subdirectory in
983  * @name: The name of the subdirectory to find or create
984  * @namelen: The length of name
985  *
986  * Takes a directory with an elevated reference count so we know that
987  * if we drop the lock the directory will not go away.  Upon success
988  * the reference is moved from @dir to the returned subdirectory.
989  * Upon error an error code is returned and the reference on @dir is
990  * simply dropped.
991  */
get_subdir(struct ctl_dir * dir,const char * name,int namelen)992 static struct ctl_dir *get_subdir(struct ctl_dir *dir,
993 				  const char *name, int namelen)
994 {
995 	struct ctl_table_set *set = dir->header.set;
996 	struct ctl_dir *subdir, *new = NULL;
997 	int err;
998 
999 	spin_lock(&sysctl_lock);
1000 	subdir = find_subdir(dir, name, namelen);
1001 	if (!IS_ERR(subdir))
1002 		goto found;
1003 	if (PTR_ERR(subdir) != -ENOENT)
1004 		goto failed;
1005 
1006 	spin_unlock(&sysctl_lock);
1007 	new = new_dir(set, name, namelen);
1008 	spin_lock(&sysctl_lock);
1009 	subdir = ERR_PTR(-ENOMEM);
1010 	if (!new)
1011 		goto failed;
1012 
1013 	/* Was the subdir added while we dropped the lock? */
1014 	subdir = find_subdir(dir, name, namelen);
1015 	if (!IS_ERR(subdir))
1016 		goto found;
1017 	if (PTR_ERR(subdir) != -ENOENT)
1018 		goto failed;
1019 
1020 	/* Nope.  Use the our freshly made directory entry. */
1021 	err = insert_header(dir, &new->header);
1022 	subdir = ERR_PTR(err);
1023 	if (err)
1024 		goto failed;
1025 	subdir = new;
1026 found:
1027 	subdir->header.nreg++;
1028 failed:
1029 	if (IS_ERR(subdir)) {
1030 		pr_err("sysctl could not get directory: ");
1031 		sysctl_print_dir(dir);
1032 		pr_cont("%*.*s %ld\n", namelen, namelen, name,
1033 			PTR_ERR(subdir));
1034 	}
1035 	drop_sysctl_table(&dir->header);
1036 	if (new)
1037 		drop_sysctl_table(&new->header);
1038 	spin_unlock(&sysctl_lock);
1039 	return subdir;
1040 }
1041 
xlate_dir(struct ctl_table_set * set,struct ctl_dir * dir)1042 static struct ctl_dir *xlate_dir(struct ctl_table_set *set, struct ctl_dir *dir)
1043 {
1044 	struct ctl_dir *parent;
1045 	const char *procname;
1046 	if (!dir->header.parent)
1047 		return &set->dir;
1048 	parent = xlate_dir(set, dir->header.parent);
1049 	if (IS_ERR(parent))
1050 		return parent;
1051 	procname = dir->header.ctl_table[0].procname;
1052 	return find_subdir(parent, procname, strlen(procname));
1053 }
1054 
sysctl_follow_link(struct ctl_table_header ** phead,const struct ctl_table ** pentry)1055 static int sysctl_follow_link(struct ctl_table_header **phead,
1056 	const struct ctl_table **pentry)
1057 {
1058 	struct ctl_table_header *head;
1059 	const struct ctl_table *entry;
1060 	struct ctl_table_root *root;
1061 	struct ctl_table_set *set;
1062 	struct ctl_dir *dir;
1063 	int ret;
1064 
1065 	spin_lock(&sysctl_lock);
1066 	root = (*pentry)->data;
1067 	set = lookup_header_set(root);
1068 	dir = xlate_dir(set, (*phead)->parent);
1069 	if (IS_ERR(dir))
1070 		ret = PTR_ERR(dir);
1071 	else {
1072 		const char *procname = (*pentry)->procname;
1073 		head = NULL;
1074 		entry = find_entry(&head, dir, procname, strlen(procname));
1075 		ret = -ENOENT;
1076 		if (entry && use_table(head)) {
1077 			unuse_table(*phead);
1078 			*phead = head;
1079 			*pentry = entry;
1080 			ret = 0;
1081 		}
1082 	}
1083 
1084 	spin_unlock(&sysctl_lock);
1085 	return ret;
1086 }
1087 
sysctl_err(const char * path,const struct ctl_table * table,char * fmt,...)1088 static int sysctl_err(const char *path, const struct ctl_table *table, char *fmt, ...)
1089 {
1090 	struct va_format vaf;
1091 	va_list args;
1092 
1093 	va_start(args, fmt);
1094 	vaf.fmt = fmt;
1095 	vaf.va = &args;
1096 
1097 	pr_err("sysctl table check failed: %s/%s %pV\n",
1098 	       path, table->procname, &vaf);
1099 
1100 	va_end(args);
1101 	return -EINVAL;
1102 }
1103 
sysctl_check_table_array(const char * path,const struct ctl_table * table)1104 static int sysctl_check_table_array(const char *path, const struct ctl_table *table)
1105 {
1106 	unsigned int extra;
1107 	int err = 0;
1108 
1109 	if ((table->proc_handler == proc_douintvec) ||
1110 	    (table->proc_handler == proc_douintvec_minmax)) {
1111 		if (table->maxlen != sizeof(unsigned int))
1112 			err |= sysctl_err(path, table, "array not allowed");
1113 	}
1114 
1115 	if (table->proc_handler == proc_dou8vec_minmax) {
1116 		if (table->maxlen != sizeof(u8))
1117 			err |= sysctl_err(path, table, "array not allowed");
1118 
1119 		if (table->extra1) {
1120 			extra = *(unsigned int *) table->extra1;
1121 			if (extra > 255U)
1122 				err |= sysctl_err(path, table,
1123 						"range value too large for proc_dou8vec_minmax");
1124 		}
1125 		if (table->extra2) {
1126 			extra = *(unsigned int *) table->extra2;
1127 			if (extra > 255U)
1128 				err |= sysctl_err(path, table,
1129 						"range value too large for proc_dou8vec_minmax");
1130 		}
1131 	}
1132 
1133 	if (table->proc_handler == proc_dobool) {
1134 		if (table->maxlen != sizeof(bool))
1135 			err |= sysctl_err(path, table, "array not allowed");
1136 	}
1137 
1138 	return err;
1139 }
1140 
sysctl_check_table(const char * path,struct ctl_table_header * header)1141 static int sysctl_check_table(const char *path, struct ctl_table_header *header)
1142 {
1143 	const struct ctl_table *entry;
1144 	int err = 0;
1145 	list_for_each_table_entry(entry, header) {
1146 		if (!entry->procname)
1147 			err |= sysctl_err(path, entry, "procname is null");
1148 		if ((entry->proc_handler == proc_dostring) ||
1149 		    (entry->proc_handler == proc_dobool) ||
1150 		    (entry->proc_handler == proc_dointvec) ||
1151 		    (entry->proc_handler == proc_douintvec) ||
1152 		    (entry->proc_handler == proc_douintvec_minmax) ||
1153 		    (entry->proc_handler == proc_dointvec_minmax) ||
1154 		    (entry->proc_handler == proc_dou8vec_minmax) ||
1155 		    (entry->proc_handler == proc_dointvec_jiffies) ||
1156 		    (entry->proc_handler == proc_dointvec_userhz_jiffies) ||
1157 		    (entry->proc_handler == proc_dointvec_ms_jiffies) ||
1158 		    (entry->proc_handler == proc_doulongvec_minmax) ||
1159 		    (entry->proc_handler == proc_doulongvec_ms_jiffies_minmax)) {
1160 			if (!entry->data)
1161 				err |= sysctl_err(path, entry, "No data");
1162 			if (!entry->maxlen)
1163 				err |= sysctl_err(path, entry, "No maxlen");
1164 			else
1165 				err |= sysctl_check_table_array(path, entry);
1166 		}
1167 		if (!entry->proc_handler)
1168 			err |= sysctl_err(path, entry, "No proc_handler");
1169 
1170 		if ((entry->mode & (S_IRUGO|S_IWUGO)) != entry->mode)
1171 			err |= sysctl_err(path, entry, "bogus .mode 0%o",
1172 				entry->mode);
1173 	}
1174 	return err;
1175 }
1176 
new_links(struct ctl_dir * dir,struct ctl_table_header * head)1177 static struct ctl_table_header *new_links(struct ctl_dir *dir, struct ctl_table_header *head)
1178 {
1179 	struct ctl_table *link_table, *link;
1180 	struct ctl_table_header *links;
1181 	const struct ctl_table *entry;
1182 	struct ctl_node *node;
1183 	char *link_name;
1184 	int name_bytes;
1185 
1186 	name_bytes = 0;
1187 	list_for_each_table_entry(entry, head) {
1188 		name_bytes += strlen(entry->procname) + 1;
1189 	}
1190 
1191 	links = kzalloc(sizeof(struct ctl_table_header) +
1192 			sizeof(struct ctl_node)*head->ctl_table_size +
1193 			sizeof(struct ctl_table)*head->ctl_table_size +
1194 			name_bytes,
1195 			GFP_KERNEL);
1196 
1197 	if (!links)
1198 		return NULL;
1199 
1200 	node = (struct ctl_node *)(links + 1);
1201 	link_table = (struct ctl_table *)(node + head->ctl_table_size);
1202 	link_name = (char *)(link_table + head->ctl_table_size);
1203 	link = link_table;
1204 
1205 	list_for_each_table_entry(entry, head) {
1206 		int len = strlen(entry->procname) + 1;
1207 		memcpy(link_name, entry->procname, len);
1208 		link->procname = link_name;
1209 		link->mode = S_IFLNK|S_IRWXUGO;
1210 		link->data = head->root;
1211 		link_name += len;
1212 		link++;
1213 	}
1214 	init_header(links, dir->header.root, dir->header.set, node, link_table,
1215 		    head->ctl_table_size);
1216 	links->nreg = head->ctl_table_size;
1217 
1218 	return links;
1219 }
1220 
get_links(struct ctl_dir * dir,struct ctl_table_header * header,struct ctl_table_root * link_root)1221 static bool get_links(struct ctl_dir *dir,
1222 		      struct ctl_table_header *header,
1223 		      struct ctl_table_root *link_root)
1224 {
1225 	struct ctl_table_header *tmp_head;
1226 	const struct ctl_table *entry, *link;
1227 
1228 	if (header->ctl_table_size == 0 ||
1229 	    sysctl_is_perm_empty_ctl_header(header))
1230 		return true;
1231 
1232 	/* Are there links available for every entry in table? */
1233 	list_for_each_table_entry(entry, header) {
1234 		const char *procname = entry->procname;
1235 		link = find_entry(&tmp_head, dir, procname, strlen(procname));
1236 		if (!link)
1237 			return false;
1238 		if (S_ISDIR(link->mode) && S_ISDIR(entry->mode))
1239 			continue;
1240 		if (S_ISLNK(link->mode) && (link->data == link_root))
1241 			continue;
1242 		return false;
1243 	}
1244 
1245 	/* The checks passed.  Increase the registration count on the links */
1246 	list_for_each_table_entry(entry, header) {
1247 		const char *procname = entry->procname;
1248 		link = find_entry(&tmp_head, dir, procname, strlen(procname));
1249 		tmp_head->nreg++;
1250 	}
1251 	return true;
1252 }
1253 
insert_links(struct ctl_table_header * head)1254 static int insert_links(struct ctl_table_header *head)
1255 {
1256 	struct ctl_table_set *root_set = &sysctl_table_root.default_set;
1257 	struct ctl_dir *core_parent;
1258 	struct ctl_table_header *links;
1259 	int err;
1260 
1261 	if (head->set == root_set)
1262 		return 0;
1263 
1264 	core_parent = xlate_dir(root_set, head->parent);
1265 	if (IS_ERR(core_parent))
1266 		return 0;
1267 
1268 	if (get_links(core_parent, head, head->root))
1269 		return 0;
1270 
1271 	core_parent->header.nreg++;
1272 	spin_unlock(&sysctl_lock);
1273 
1274 	links = new_links(core_parent, head);
1275 
1276 	spin_lock(&sysctl_lock);
1277 	err = -ENOMEM;
1278 	if (!links)
1279 		goto out;
1280 
1281 	err = 0;
1282 	if (get_links(core_parent, head, head->root)) {
1283 		kfree(links);
1284 		goto out;
1285 	}
1286 
1287 	err = insert_header(core_parent, links);
1288 	if (err)
1289 		kfree(links);
1290 out:
1291 	drop_sysctl_table(&core_parent->header);
1292 	return err;
1293 }
1294 
1295 /* Find the directory for the ctl_table. If one is not found create it. */
sysctl_mkdir_p(struct ctl_dir * dir,const char * path)1296 static struct ctl_dir *sysctl_mkdir_p(struct ctl_dir *dir, const char *path)
1297 {
1298 	const char *name, *nextname;
1299 
1300 	for (name = path; name; name = nextname) {
1301 		int namelen;
1302 		nextname = strchr(name, '/');
1303 		if (nextname) {
1304 			namelen = nextname - name;
1305 			nextname++;
1306 		} else {
1307 			namelen = strlen(name);
1308 		}
1309 		if (namelen == 0)
1310 			continue;
1311 
1312 		/*
1313 		 * namelen ensures if name is "foo/bar/yay" only foo is
1314 		 * registered first. We traverse as if using mkdir -p and
1315 		 * return a ctl_dir for the last directory entry.
1316 		 */
1317 		dir = get_subdir(dir, name, namelen);
1318 		if (IS_ERR(dir))
1319 			break;
1320 	}
1321 	return dir;
1322 }
1323 
1324 /**
1325  * __register_sysctl_table - register a leaf sysctl table
1326  * @set: Sysctl tree to register on
1327  * @path: The path to the directory the sysctl table is in.
1328  *
1329  * @table: the top-level table structure. This table should not be free'd
1330  *         after registration. So it should not be used on stack. It can either
1331  *         be a global or dynamically allocated by the caller and free'd later
1332  *         after sysctl unregistration.
1333  * @table_size : The number of elements in table
1334  *
1335  * Register a sysctl table hierarchy. @table should be a filled in ctl_table
1336  * array.
1337  *
1338  * The members of the &struct ctl_table structure are used as follows:
1339  * procname - the name of the sysctl file under /proc/sys. Set to %NULL to not
1340  *            enter a sysctl file
1341  * data     - a pointer to data for use by proc_handler
1342  * maxlen   - the maximum size in bytes of the data
1343  * mode     - the file permissions for the /proc/sys file
1344  * type     - Defines the target type (described in struct definition)
1345  * proc_handler - the text handler routine (described below)
1346  *
1347  * extra1, extra2 - extra pointers usable by the proc handler routines
1348  * XXX: we should eventually modify these to use long min / max [0]
1349  * [0] https://lkml.kernel.org/87zgpte9o4.fsf@email.froward.int.ebiederm.org
1350  *
1351  * Leaf nodes in the sysctl tree will be represented by a single file
1352  * under /proc; non-leaf nodes are not allowed.
1353  *
1354  * There must be a proc_handler routine for any terminal nodes.
1355  * Several default handlers are available to cover common cases -
1356  *
1357  * proc_dostring(), proc_dointvec(), proc_dointvec_jiffies(),
1358  * proc_dointvec_userhz_jiffies(), proc_dointvec_minmax(),
1359  * proc_doulongvec_ms_jiffies_minmax(), proc_doulongvec_minmax()
1360  *
1361  * It is the handler's job to read the input buffer from user memory
1362  * and process it. The handler should return 0 on success.
1363  *
1364  * This routine returns %NULL on a failure to register, and a pointer
1365  * to the table header on success.
1366  */
__register_sysctl_table(struct ctl_table_set * set,const char * path,const struct ctl_table * table,size_t table_size)1367 struct ctl_table_header *__register_sysctl_table(
1368 	struct ctl_table_set *set,
1369 	const char *path, const struct ctl_table *table, size_t table_size)
1370 {
1371 	struct ctl_table_root *root = set->dir.header.root;
1372 	struct ctl_table_header *header;
1373 	struct ctl_dir *dir;
1374 	struct ctl_node *node;
1375 
1376 	header = kzalloc(sizeof(struct ctl_table_header) +
1377 			 sizeof(struct ctl_node)*table_size, GFP_KERNEL_ACCOUNT);
1378 	if (!header)
1379 		return NULL;
1380 
1381 	node = (struct ctl_node *)(header + 1);
1382 	init_header(header, root, set, node, table, table_size);
1383 	if (sysctl_check_table(path, header))
1384 		goto fail;
1385 
1386 	spin_lock(&sysctl_lock);
1387 	dir = &set->dir;
1388 	/* Reference moved down the directory tree get_subdir */
1389 	dir->header.nreg++;
1390 	spin_unlock(&sysctl_lock);
1391 
1392 	dir = sysctl_mkdir_p(dir, path);
1393 	if (IS_ERR(dir))
1394 		goto fail;
1395 	spin_lock(&sysctl_lock);
1396 	if (insert_header(dir, header))
1397 		goto fail_put_dir_locked;
1398 
1399 	drop_sysctl_table(&dir->header);
1400 	spin_unlock(&sysctl_lock);
1401 
1402 	return header;
1403 
1404 fail_put_dir_locked:
1405 	drop_sysctl_table(&dir->header);
1406 	spin_unlock(&sysctl_lock);
1407 fail:
1408 	kfree(header);
1409 	return NULL;
1410 }
1411 
1412 /**
1413  * register_sysctl_sz - register a sysctl table
1414  * @path: The path to the directory the sysctl table is in. If the path
1415  * 	doesn't exist we will create it for you.
1416  * @table: the table structure. The calller must ensure the life of the @table
1417  * 	will be kept during the lifetime use of the syctl. It must not be freed
1418  * 	until unregister_sysctl_table() is called with the given returned table
1419  * 	with this registration. If your code is non modular then you don't need
1420  * 	to call unregister_sysctl_table() and can instead use something like
1421  * 	register_sysctl_init() which does not care for the result of the syctl
1422  * 	registration.
1423  * @table_size: The number of elements in table.
1424  *
1425  * Register a sysctl table. @table should be a filled in ctl_table
1426  * array. A completely 0 filled entry terminates the table.
1427  *
1428  * See __register_sysctl_table for more details.
1429  */
register_sysctl_sz(const char * path,const struct ctl_table * table,size_t table_size)1430 struct ctl_table_header *register_sysctl_sz(const char *path, const struct ctl_table *table,
1431 					    size_t table_size)
1432 {
1433 	return __register_sysctl_table(&sysctl_table_root.default_set,
1434 					path, table, table_size);
1435 }
1436 EXPORT_SYMBOL(register_sysctl_sz);
1437 
1438 /**
1439  * __register_sysctl_init() - register sysctl table to path
1440  * @path: path name for sysctl base. If that path doesn't exist we will create
1441  * 	it for you.
1442  * @table: This is the sysctl table that needs to be registered to the path.
1443  * 	The caller must ensure the life of the @table will be kept during the
1444  * 	lifetime use of the sysctl.
1445  * @table_name: The name of sysctl table, only used for log printing when
1446  *              registration fails
1447  * @table_size: The number of elements in table
1448  *
1449  * The sysctl interface is used by userspace to query or modify at runtime
1450  * a predefined value set on a variable. These variables however have default
1451  * values pre-set. Code which depends on these variables will always work even
1452  * if register_sysctl() fails. If register_sysctl() fails you'd just loose the
1453  * ability to query or modify the sysctls dynamically at run time. Chances of
1454  * register_sysctl() failing on init are extremely low, and so for both reasons
1455  * this function does not return any error as it is used by initialization code.
1456  *
1457  * Context: if your base directory does not exist it will be created for you.
1458  */
__register_sysctl_init(const char * path,const struct ctl_table * table,const char * table_name,size_t table_size)1459 void __init __register_sysctl_init(const char *path, const struct ctl_table *table,
1460 				 const char *table_name, size_t table_size)
1461 {
1462 	struct ctl_table_header *hdr = register_sysctl_sz(path, table, table_size);
1463 
1464 	if (unlikely(!hdr)) {
1465 		pr_err("failed when register_sysctl_sz %s to %s\n", table_name, path);
1466 		return;
1467 	}
1468 	kmemleak_not_leak(hdr);
1469 }
1470 
put_links(struct ctl_table_header * header)1471 static void put_links(struct ctl_table_header *header)
1472 {
1473 	struct ctl_table_set *root_set = &sysctl_table_root.default_set;
1474 	struct ctl_table_root *root = header->root;
1475 	struct ctl_dir *parent = header->parent;
1476 	struct ctl_dir *core_parent;
1477 	const struct ctl_table *entry;
1478 
1479 	if (header->set == root_set)
1480 		return;
1481 
1482 	core_parent = xlate_dir(root_set, parent);
1483 	if (IS_ERR(core_parent))
1484 		return;
1485 
1486 	list_for_each_table_entry(entry, header) {
1487 		struct ctl_table_header *link_head;
1488 		const struct ctl_table *link;
1489 		const char *name = entry->procname;
1490 
1491 		link = find_entry(&link_head, core_parent, name, strlen(name));
1492 		if (link &&
1493 		    ((S_ISDIR(link->mode) && S_ISDIR(entry->mode)) ||
1494 		     (S_ISLNK(link->mode) && (link->data == root)))) {
1495 			drop_sysctl_table(link_head);
1496 		}
1497 		else {
1498 			pr_err("sysctl link missing during unregister: ");
1499 			sysctl_print_dir(parent);
1500 			pr_cont("%s\n", name);
1501 		}
1502 	}
1503 }
1504 
drop_sysctl_table(struct ctl_table_header * header)1505 static void drop_sysctl_table(struct ctl_table_header *header)
1506 {
1507 	struct ctl_dir *parent = header->parent;
1508 
1509 	if (--header->nreg)
1510 		return;
1511 
1512 	if (parent) {
1513 		put_links(header);
1514 		start_unregistering(header);
1515 	}
1516 
1517 	if (!--header->count)
1518 		kfree_rcu(header, rcu);
1519 
1520 	if (parent)
1521 		drop_sysctl_table(&parent->header);
1522 }
1523 
1524 /**
1525  * unregister_sysctl_table - unregister a sysctl table hierarchy
1526  * @header: the header returned from register_sysctl or __register_sysctl_table
1527  *
1528  * Unregisters the sysctl table and all children. proc entries may not
1529  * actually be removed until they are no longer used by anyone.
1530  */
unregister_sysctl_table(struct ctl_table_header * header)1531 void unregister_sysctl_table(struct ctl_table_header * header)
1532 {
1533 	might_sleep();
1534 
1535 	if (header == NULL)
1536 		return;
1537 
1538 	spin_lock(&sysctl_lock);
1539 	drop_sysctl_table(header);
1540 	spin_unlock(&sysctl_lock);
1541 }
1542 EXPORT_SYMBOL(unregister_sysctl_table);
1543 
setup_sysctl_set(struct ctl_table_set * set,struct ctl_table_root * root,int (* is_seen)(struct ctl_table_set *))1544 void setup_sysctl_set(struct ctl_table_set *set,
1545 	struct ctl_table_root *root,
1546 	int (*is_seen)(struct ctl_table_set *))
1547 {
1548 	memset(set, 0, sizeof(*set));
1549 	set->is_seen = is_seen;
1550 	init_header(&set->dir.header, root, set, NULL, root_table, 1);
1551 }
1552 
retire_sysctl_set(struct ctl_table_set * set)1553 void retire_sysctl_set(struct ctl_table_set *set)
1554 {
1555 	WARN_ON(!RB_EMPTY_ROOT(&set->dir.root));
1556 }
1557 
proc_sys_init(void)1558 int __init proc_sys_init(void)
1559 {
1560 	struct proc_dir_entry *proc_sys_root;
1561 
1562 	proc_sys_root = proc_mkdir("sys", NULL);
1563 	proc_sys_root->proc_iops = &proc_sys_dir_operations;
1564 	proc_sys_root->proc_dir_ops = &proc_sys_dir_file_operations;
1565 	proc_sys_root->nlink = 0;
1566 
1567 	return sysctl_init_bases();
1568 }
1569 
1570 struct sysctl_alias {
1571 	const char *kernel_param;
1572 	const char *sysctl_param;
1573 };
1574 
1575 /*
1576  * Historically some settings had both sysctl and a command line parameter.
1577  * With the generic sysctl. parameter support, we can handle them at a single
1578  * place and only keep the historical name for compatibility. This is not meant
1579  * to add brand new aliases. When adding existing aliases, consider whether
1580  * the possibly different moment of changing the value (e.g. from early_param
1581  * to the moment do_sysctl_args() is called) is an issue for the specific
1582  * parameter.
1583  */
1584 static const struct sysctl_alias sysctl_aliases[] = {
1585 	{"hardlockup_all_cpu_backtrace",	"kernel.hardlockup_all_cpu_backtrace" },
1586 	{"hung_task_panic",			"kernel.hung_task_panic" },
1587 	{"numa_zonelist_order",			"vm.numa_zonelist_order" },
1588 	{"softlockup_all_cpu_backtrace",	"kernel.softlockup_all_cpu_backtrace" },
1589 	{ }
1590 };
1591 
sysctl_find_alias(char * param)1592 static const char *sysctl_find_alias(char *param)
1593 {
1594 	const struct sysctl_alias *alias;
1595 
1596 	for (alias = &sysctl_aliases[0]; alias->kernel_param != NULL; alias++) {
1597 		if (strcmp(alias->kernel_param, param) == 0)
1598 			return alias->sysctl_param;
1599 	}
1600 
1601 	return NULL;
1602 }
1603 
sysctl_is_alias(char * param)1604 bool sysctl_is_alias(char *param)
1605 {
1606 	const char *alias = sysctl_find_alias(param);
1607 
1608 	return alias != NULL;
1609 }
1610 
1611 /* Set sysctl value passed on kernel command line. */
process_sysctl_arg(char * param,char * val,const char * unused,void * arg)1612 static int process_sysctl_arg(char *param, char *val,
1613 			       const char *unused, void *arg)
1614 {
1615 	char *path;
1616 	struct vfsmount **proc_mnt = arg;
1617 	struct file_system_type *proc_fs_type;
1618 	struct file *file;
1619 	int len;
1620 	int err;
1621 	loff_t pos = 0;
1622 	ssize_t wret;
1623 
1624 	if (strncmp(param, "sysctl", sizeof("sysctl") - 1) == 0) {
1625 		param += sizeof("sysctl") - 1;
1626 
1627 		if (param[0] != '/' && param[0] != '.')
1628 			return 0;
1629 
1630 		param++;
1631 	} else {
1632 		param = (char *) sysctl_find_alias(param);
1633 		if (!param)
1634 			return 0;
1635 	}
1636 
1637 	if (!val)
1638 		return -EINVAL;
1639 	len = strlen(val);
1640 	if (len == 0)
1641 		return -EINVAL;
1642 
1643 	/*
1644 	 * To set sysctl options, we use a temporary mount of proc, look up the
1645 	 * respective sys/ file and write to it. To avoid mounting it when no
1646 	 * options were given, we mount it only when the first sysctl option is
1647 	 * found. Why not a persistent mount? There are problems with a
1648 	 * persistent mount of proc in that it forces userspace not to use any
1649 	 * proc mount options.
1650 	 */
1651 	if (!*proc_mnt) {
1652 		proc_fs_type = get_fs_type("proc");
1653 		if (!proc_fs_type) {
1654 			pr_err("Failed to find procfs to set sysctl from command line\n");
1655 			return 0;
1656 		}
1657 		*proc_mnt = kern_mount(proc_fs_type);
1658 		put_filesystem(proc_fs_type);
1659 		if (IS_ERR(*proc_mnt)) {
1660 			pr_err("Failed to mount procfs to set sysctl from command line\n");
1661 			return 0;
1662 		}
1663 	}
1664 
1665 	path = kasprintf(GFP_KERNEL, "sys/%s", param);
1666 	if (!path)
1667 		panic("%s: Failed to allocate path for %s\n", __func__, param);
1668 	strreplace(path, '.', '/');
1669 
1670 	file = file_open_root_mnt(*proc_mnt, path, O_WRONLY, 0);
1671 	if (IS_ERR(file)) {
1672 		err = PTR_ERR(file);
1673 		if (err == -ENOENT)
1674 			pr_err("Failed to set sysctl parameter '%s=%s': parameter not found\n",
1675 				param, val);
1676 		else if (err == -EACCES)
1677 			pr_err("Failed to set sysctl parameter '%s=%s': permission denied (read-only?)\n",
1678 				param, val);
1679 		else
1680 			pr_err("Error %pe opening proc file to set sysctl parameter '%s=%s'\n",
1681 				file, param, val);
1682 		goto out;
1683 	}
1684 	wret = kernel_write(file, val, len, &pos);
1685 	if (wret < 0) {
1686 		err = wret;
1687 		if (err == -EINVAL)
1688 			pr_err("Failed to set sysctl parameter '%s=%s': invalid value\n",
1689 				param, val);
1690 		else
1691 			pr_err("Error %pe writing to proc file to set sysctl parameter '%s=%s'\n",
1692 				ERR_PTR(err), param, val);
1693 	} else if (wret != len) {
1694 		pr_err("Wrote only %zd bytes of %d writing to proc file %s to set sysctl parameter '%s=%s\n",
1695 			wret, len, path, param, val);
1696 	}
1697 
1698 	err = filp_close(file, NULL);
1699 	if (err)
1700 		pr_err("Error %pe closing proc file to set sysctl parameter '%s=%s\n",
1701 			ERR_PTR(err), param, val);
1702 out:
1703 	kfree(path);
1704 	return 0;
1705 }
1706 
do_sysctl_args(void)1707 void do_sysctl_args(void)
1708 {
1709 	char *command_line;
1710 	struct vfsmount *proc_mnt = NULL;
1711 
1712 	command_line = kstrdup(saved_command_line, GFP_KERNEL);
1713 	if (!command_line)
1714 		panic("%s: Failed to allocate copy of command line\n", __func__);
1715 
1716 	parse_args("Setting sysctl args", command_line,
1717 		   NULL, 0, -1, -1, &proc_mnt, process_sysctl_arg);
1718 
1719 	if (proc_mnt)
1720 		kern_unmount(proc_mnt);
1721 
1722 	kfree(command_line);
1723 }
1724