[PATCH] sanitize proc_sysctl
* keep references to ctl_table_head and ctl_table in /proc/sys inodes * grab the former during operations, use the latter for access to entry if that succeeds * have ->d_compare() check if table should be seen for one who does lookup; that allows us to avoid flipping inodes - if we have the same name resolve to different things, we'll just keep several dentries and ->d_compare() will reject the wrong ones. * have ->lookup() and ->readdir() scan the table of our inode first, then walk all ctl_table_header and scan ->attached_by for those that are attached to our directory. * implement ->getattr(). * get rid of insane amounts of tree-walking * get rid of the need to know dentry in ->permission() and of the contortions induced by that. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
@@ -1932,6 +1932,21 @@ void unregister_sysctl_table(struct ctl_table_header * header)
|
||||
spin_unlock(&sysctl_lock);
|
||||
}
|
||||
|
||||
int sysctl_is_seen(struct ctl_table_header *p)
|
||||
{
|
||||
struct ctl_table_set *set = p->set;
|
||||
int res;
|
||||
spin_lock(&sysctl_lock);
|
||||
if (p->unregistering)
|
||||
res = 0;
|
||||
else if (!set->is_seen)
|
||||
res = 1;
|
||||
else
|
||||
res = set->is_seen(set);
|
||||
spin_unlock(&sysctl_lock);
|
||||
return res;
|
||||
}
|
||||
|
||||
void setup_sysctl_set(struct ctl_table_set *p,
|
||||
struct ctl_table_set *parent,
|
||||
int (*is_seen)(struct ctl_table_set *))
|
||||
|
Reference in New Issue
Block a user