aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2012-11-15 22:02:58 -0500
committerDavid S. Miller <davem@davemloft.net>2012-11-18 20:30:55 -0500
commit73f7ef435934e952c1d70d83d69921ea5d1f6bd4 (patch)
treea5d0bbe5e1154eaec96f859507e90bae4b34d0b9 /fs
parentd328b836823cd4a76611a45f52e208f8ce3d75d7 (diff)
sysctl: Pass useful parameters to sysctl permissions
- Current is implicitly avaiable so passing current->nsproxy isn't useful. - The ctl_table_header is needed to find how the sysctl table is connected to the rest of sysctl. - ctl_table_root is avaiable in the ctl_table_header so no need to it. With these changes it becomes possible to write a version of net_sysctl_permission that takes into account the network namespace of the sysctl table, an important feature in extending the user namespace. Acked-by: Serge Hallyn <serge.hallyn@canonical.com> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'fs')
-rw-r--r--fs/proc/proc_sysctl.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c
index a781bdf06694..701580ddfcc3 100644
--- a/fs/proc/proc_sysctl.c
+++ b/fs/proc/proc_sysctl.c
@@ -378,12 +378,13 @@ static int test_perm(int mode, int op)
378 return -EACCES; 378 return -EACCES;
379} 379}
380 380
381static int sysctl_perm(struct ctl_table_root *root, struct ctl_table *table, int op) 381static int sysctl_perm(struct ctl_table_header *head, struct ctl_table *table, int op)
382{ 382{
383 struct ctl_table_root *root = head->root;
383 int mode; 384 int mode;
384 385
385 if (root->permissions) 386 if (root->permissions)
386 mode = root->permissions(root, current->nsproxy, table); 387 mode = root->permissions(head, table);
387 else 388 else
388 mode = table->mode; 389 mode = table->mode;
389 390
@@ -491,7 +492,7 @@ static ssize_t proc_sys_call_handler(struct file *filp, void __user *buf,
491 * and won't be until we finish. 492 * and won't be until we finish.
492 */ 493 */
493 error = -EPERM; 494 error = -EPERM;
494 if (sysctl_perm(head->root, table, write ? MAY_WRITE : MAY_READ)) 495 if (sysctl_perm(head, table, write ? MAY_WRITE : MAY_READ))
495 goto out; 496 goto out;
496 497
497 /* if that can happen at all, it should be -EINVAL, not -EISDIR */ 498 /* if that can happen at all, it should be -EINVAL, not -EISDIR */
@@ -717,7 +718,7 @@ static int proc_sys_permission(struct inode *inode, int mask)
717 if (!table) /* global root - r-xr-xr-x */ 718 if (!table) /* global root - r-xr-xr-x */
718 error = mask & MAY_WRITE ? -EACCES : 0; 719 error = mask & MAY_WRITE ? -EACCES : 0;
719 else /* Use the permissions on the sysctl table entry */ 720 else /* Use the permissions on the sysctl table entry */
720 error = sysctl_perm(head->root, table, mask & ~MAY_NOT_BLOCK); 721 error = sysctl_perm(head, table, mask & ~MAY_NOT_BLOCK);
721 722
722 sysctl_head_finish(head); 723 sysctl_head_finish(head);
723 return error; 724 return error;