summaryrefslogtreecommitdiffstats
path: root/fs/namespace.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2015-12-14 18:44:44 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2016-01-04 10:28:32 -0500
commitb40ef8696fbbb1107fbe5f4afc21c357f16e5ffc (patch)
tree711f011eb2df41f6a83282fcb7b2561d672a252b /fs/namespace.c
parentcc4e719e83cd4149bc96b7e1d1a73fe61797df6e (diff)
saner calling conventions for copy_mount_options()
let it just return NULL, pointer to kernel copy or ERR_PTR(). Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/namespace.c')
-rw-r--r--fs/namespace.c35
1 files changed, 17 insertions, 18 deletions
diff --git a/fs/namespace.c b/fs/namespace.c
index b27156f2e68b..33a75c8e9fcb 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -2601,18 +2601,18 @@ static long exact_copy_from_user(void *to, const void __user * from,
2601 return n; 2601 return n;
2602} 2602}
2603 2603
2604int copy_mount_options(const void __user * data, unsigned long *where) 2604void *copy_mount_options(const void __user * data)
2605{ 2605{
2606 int i; 2606 int i;
2607 unsigned long page;
2608 unsigned long size; 2607 unsigned long size;
2608 char *copy;
2609 2609
2610 *where = 0;
2611 if (!data) 2610 if (!data)
2612 return 0; 2611 return NULL;
2613 2612
2614 if (!(page = __get_free_page(GFP_KERNEL))) 2613 copy = kmalloc(PAGE_SIZE, GFP_KERNEL);
2615 return -ENOMEM; 2614 if (!copy)
2615 return ERR_PTR(-ENOMEM);
2616 2616
2617 /* We only care that *some* data at the address the user 2617 /* We only care that *some* data at the address the user
2618 * gave us is valid. Just in case, we'll zero 2618 * gave us is valid. Just in case, we'll zero
@@ -2623,15 +2623,14 @@ int copy_mount_options(const void __user * data, unsigned long *where)
2623 if (size > PAGE_SIZE) 2623 if (size > PAGE_SIZE)
2624 size = PAGE_SIZE; 2624 size = PAGE_SIZE;
2625 2625
2626 i = size - exact_copy_from_user((void *)page, data, size); 2626 i = size - exact_copy_from_user(copy, data, size);
2627 if (!i) { 2627 if (!i) {
2628 free_page(page); 2628 kfree(copy);
2629 return -EFAULT; 2629 return ERR_PTR(-EFAULT);
2630 } 2630 }
2631 if (i != PAGE_SIZE) 2631 if (i != PAGE_SIZE)
2632 memset((char *)page + i, 0, PAGE_SIZE - i); 2632 memset(copy + i, 0, PAGE_SIZE - i);
2633 *where = page; 2633 return copy;
2634 return 0;
2635} 2634}
2636 2635
2637char *copy_mount_string(const void __user *data) 2636char *copy_mount_string(const void __user *data)
@@ -2896,7 +2895,7 @@ SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name,
2896 int ret; 2895 int ret;
2897 char *kernel_type; 2896 char *kernel_type;
2898 char *kernel_dev; 2897 char *kernel_dev;
2899 unsigned long data_page; 2898 void *options;
2900 2899
2901 kernel_type = copy_mount_string(type); 2900 kernel_type = copy_mount_string(type);
2902 ret = PTR_ERR(kernel_type); 2901 ret = PTR_ERR(kernel_type);
@@ -2908,14 +2907,14 @@ SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name,
2908 if (IS_ERR(kernel_dev)) 2907 if (IS_ERR(kernel_dev))
2909 goto out_dev; 2908 goto out_dev;
2910 2909
2911 ret = copy_mount_options(data, &data_page); 2910 options = copy_mount_options(data);
2912 if (ret < 0) 2911 ret = PTR_ERR(options);
2912 if (IS_ERR(options))
2913 goto out_data; 2913 goto out_data;
2914 2914
2915 ret = do_mount(kernel_dev, dir_name, kernel_type, flags, 2915 ret = do_mount(kernel_dev, dir_name, kernel_type, flags, options);
2916 (void *) data_page);
2917 2916
2918 free_page(data_page); 2917 kfree(options);
2919out_data: 2918out_data:
2920 kfree(kernel_dev); 2919 kfree(kernel_dev);
2921out_dev: 2920out_dev: