aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Gardner <tim.gardner@canonical.com>2014-08-28 13:26:03 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2014-10-09 02:39:10 -0400
commitb8850d1fa8e2f6653e57daf6d08e58c5f5eb2c85 (patch)
tree5648df7e01da32afbbf962a8c73b54111fd50f5f
parent8ba7f6c2faada3ad553518b9febbdce7a988359b (diff)
fs: namespace: suppress 'may be used uninitialized' warnings
The gcc version 4.9.1 compiler complains Even though it isn't possible for these variables to not get initialized before they are used. fs/namespace.c: In function ‘SyS_mount’: fs/namespace.c:2720:8: warning: ‘kernel_dev’ may be used uninitialized in this function [-Wmaybe-uninitialized] ret = do_mount(kernel_dev, kernel_dir->name, kernel_type, flags, ^ fs/namespace.c:2699:8: note: ‘kernel_dev’ was declared here char *kernel_dev; ^ fs/namespace.c:2720:8: warning: ‘kernel_type’ may be used uninitialized in this function [-Wmaybe-uninitialized] ret = do_mount(kernel_dev, kernel_dir->name, kernel_type, flags, ^ fs/namespace.c:2697:8: note: ‘kernel_type’ was declared here char *kernel_type; ^ Fix the warnings by simplifying copy_mount_string() as suggested by Al Viro. Cc: Alexander Viro <viro@zeniv.linux.org.uk> Signed-off-by: Tim Gardner <tim.gardner@canonical.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--fs/compat.c10
-rw-r--r--fs/internal.h2
-rw-r--r--fs/namespace.c26
3 files changed, 15 insertions, 23 deletions
diff --git a/fs/compat.c b/fs/compat.c
index 66d3d3c6b4b2..6205c247a6e3 100644
--- a/fs/compat.c
+++ b/fs/compat.c
@@ -797,8 +797,9 @@ COMPAT_SYSCALL_DEFINE5(mount, const char __user *, dev_name,
797 struct filename *dir; 797 struct filename *dir;
798 int retval; 798 int retval;
799 799
800 retval = copy_mount_string(type, &kernel_type); 800 kernel_type = copy_mount_string(type);
801 if (retval < 0) 801 retval = PTR_ERR(kernel_type);
802 if (IS_ERR(kernel_type))
802 goto out; 803 goto out;
803 804
804 dir = getname(dir_name); 805 dir = getname(dir_name);
@@ -806,8 +807,9 @@ COMPAT_SYSCALL_DEFINE5(mount, const char __user *, dev_name,
806 if (IS_ERR(dir)) 807 if (IS_ERR(dir))
807 goto out1; 808 goto out1;
808 809
809 retval = copy_mount_string(dev_name, &kernel_dev); 810 kernel_dev = copy_mount_string(dev_name);
810 if (retval < 0) 811 retval = PTR_ERR(kernel_dev);
812 if (IS_ERR(kernel_dev))
811 goto out2; 813 goto out2;
812 814
813 retval = copy_mount_options(data, &data_page); 815 retval = copy_mount_options(data, &data_page);
diff --git a/fs/internal.h b/fs/internal.h
index e325b4f9c799..bd4ac19f4d8f 100644
--- a/fs/internal.h
+++ b/fs/internal.h
@@ -51,7 +51,7 @@ extern int vfs_path_lookup(struct dentry *, struct vfsmount *,
51 * namespace.c 51 * namespace.c
52 */ 52 */
53extern int copy_mount_options(const void __user *, unsigned long *); 53extern int copy_mount_options(const void __user *, unsigned long *);
54extern int copy_mount_string(const void __user *, char **); 54extern char *copy_mount_string(const void __user *);
55 55
56extern struct vfsmount *lookup_mnt(struct path *); 56extern struct vfsmount *lookup_mnt(struct path *);
57extern int finish_automount(struct vfsmount *, struct path *); 57extern int finish_automount(struct vfsmount *, struct path *);
diff --git a/fs/namespace.c b/fs/namespace.c
index 00e5b1efa591..abd3abb52616 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -2514,21 +2514,9 @@ int copy_mount_options(const void __user * data, unsigned long *where)
2514 return 0; 2514 return 0;
2515} 2515}
2516 2516
2517int copy_mount_string(const void __user *data, char **where) 2517char *copy_mount_string(const void __user *data)
2518{ 2518{
2519 char *tmp; 2519 return data ? strndup_user(data, PAGE_SIZE) : NULL;
2520
2521 if (!data) {
2522 *where = NULL;
2523 return 0;
2524 }
2525
2526 tmp = strndup_user(data, PAGE_SIZE);
2527 if (IS_ERR(tmp))
2528 return PTR_ERR(tmp);
2529
2530 *where = tmp;
2531 return 0;
2532} 2520}
2533 2521
2534/* 2522/*
@@ -2794,8 +2782,9 @@ SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name,
2794 char *kernel_dev; 2782 char *kernel_dev;
2795 unsigned long data_page; 2783 unsigned long data_page;
2796 2784
2797 ret = copy_mount_string(type, &kernel_type); 2785 kernel_type = copy_mount_string(type);
2798 if (ret < 0) 2786 ret = PTR_ERR(kernel_type);
2787 if (IS_ERR(kernel_type))
2799 goto out_type; 2788 goto out_type;
2800 2789
2801 kernel_dir = getname(dir_name); 2790 kernel_dir = getname(dir_name);
@@ -2804,8 +2793,9 @@ SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name,
2804 goto out_dir; 2793 goto out_dir;
2805 } 2794 }
2806 2795
2807 ret = copy_mount_string(dev_name, &kernel_dev); 2796 kernel_dev = copy_mount_string(dev_name);
2808 if (ret < 0) 2797 ret = PTR_ERR(kernel_dev);
2798 if (IS_ERR(kernel_dev))
2809 goto out_dev; 2799 goto out_dev;
2810 2800
2811 ret = copy_mount_options(data, &data_page); 2801 ret = copy_mount_options(data, &data_page);