Commit 0ffcf69c authored by Tim Gardner's avatar Tim Gardner Committed by Ben Hutchings

fs: namespace: suppress 'may be used uninitialized' warnings

commit b8850d1f upstream.

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: default avatarTim Gardner <tim.gardner@canonical.com>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
Cc: Arnd Bergmann <arnd@arndb.de>
parent 65be6fa1
...@@ -797,8 +797,9 @@ COMPAT_SYSCALL_DEFINE5(mount, const char __user *, dev_name, ...@@ -797,8 +797,9 @@ COMPAT_SYSCALL_DEFINE5(mount, const char __user *, dev_name,
struct filename *dir; struct filename *dir;
int retval; int retval;
retval = copy_mount_string(type, &kernel_type); kernel_type = copy_mount_string(type);
if (retval < 0) retval = PTR_ERR(kernel_type);
if (IS_ERR(kernel_type))
goto out; goto out;
dir = getname(dir_name); dir = getname(dir_name);
...@@ -806,8 +807,9 @@ COMPAT_SYSCALL_DEFINE5(mount, const char __user *, dev_name, ...@@ -806,8 +807,9 @@ COMPAT_SYSCALL_DEFINE5(mount, const char __user *, dev_name,
if (IS_ERR(dir)) if (IS_ERR(dir))
goto out1; goto out1;
retval = copy_mount_string(dev_name, &kernel_dev); kernel_dev = copy_mount_string(dev_name);
if (retval < 0) retval = PTR_ERR(kernel_dev);
if (IS_ERR(kernel_dev))
goto out2; goto out2;
retval = copy_mount_options(data, &data_page); retval = copy_mount_options(data, &data_page);
......
...@@ -51,7 +51,7 @@ extern int vfs_path_lookup(struct dentry *, struct vfsmount *, ...@@ -51,7 +51,7 @@ extern int vfs_path_lookup(struct dentry *, struct vfsmount *,
* namespace.c * namespace.c
*/ */
extern int copy_mount_options(const void __user *, unsigned long *); extern int copy_mount_options(const void __user *, unsigned long *);
extern int copy_mount_string(const void __user *, char **); extern char *copy_mount_string(const void __user *);
extern struct vfsmount *lookup_mnt(struct path *); extern struct vfsmount *lookup_mnt(struct path *);
extern int finish_automount(struct vfsmount *, struct path *); extern int finish_automount(struct vfsmount *, struct path *);
......
...@@ -2482,21 +2482,9 @@ int copy_mount_options(const void __user * data, unsigned long *where) ...@@ -2482,21 +2482,9 @@ int copy_mount_options(const void __user * data, unsigned long *where)
return 0; return 0;
} }
int copy_mount_string(const void __user *data, char **where) char *copy_mount_string(const void __user *data)
{ {
char *tmp; return data ? strndup_user(data, PAGE_SIZE) : NULL;
if (!data) {
*where = NULL;
return 0;
}
tmp = strndup_user(data, PAGE_SIZE);
if (IS_ERR(tmp))
return PTR_ERR(tmp);
*where = tmp;
return 0;
} }
/* /*
...@@ -2766,8 +2754,9 @@ SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name, ...@@ -2766,8 +2754,9 @@ SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name,
char *kernel_dev; char *kernel_dev;
unsigned long data_page; unsigned long data_page;
ret = copy_mount_string(type, &kernel_type); kernel_type = copy_mount_string(type);
if (ret < 0) ret = PTR_ERR(kernel_type);
if (IS_ERR(kernel_type))
goto out_type; goto out_type;
kernel_dir = getname(dir_name); kernel_dir = getname(dir_name);
...@@ -2776,8 +2765,9 @@ SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name, ...@@ -2776,8 +2765,9 @@ SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name,
goto out_dir; goto out_dir;
} }
ret = copy_mount_string(dev_name, &kernel_dev); kernel_dev = copy_mount_string(dev_name);
if (ret < 0) ret = PTR_ERR(kernel_dev);
if (IS_ERR(kernel_dev))
goto out_dev; goto out_dev;
ret = copy_mount_options(data, &data_page); ret = copy_mount_options(data, &data_page);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment