[brauner-vfs:vfs.mount 14/14] fs/namespace.c:4896:6: warning: variable 'ret' is used uninitialized whenever 'if' condition is false

kernel test robot
2023-11-20T01:10:03Z

tree: https://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git vfs.mount
head: bbaba842df6d93fa0fbcf8bc8341a352f6189c6c
commit: bbaba842df6d93fa0fbcf8bc8341a352f6189c6c [14/14] statmount: simplify string option retrieval
config: i386-buildonly-randconfig-002-20231120 (https://download.01.org/0day-ci/archive/20231120/202311200943.kXUP5jUl-lkp@intel.com/config)
compiler: clang version 16.0.4 (https://github.com/llvm/llvm-project.git ae42196bc493ffe877a7e3dff8be32035dea4d07)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231120/202311200943.kXUP5jUl-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202311200943.kXUP5jUl-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> fs/namespace.c:4896:6: warning: variable 'ret' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized]
if (sm->mask & STMT_FS_TYPE) {
^~~~~~~~~~~~~~~~~~~~~~~
fs/namespace.c:4902:7: note: uninitialized use occurs here
if (!ret && sm->mask & STMT_MNT_ROOT) {
^~~
fs/namespace.c:4896:2: note: remove the 'if' if its condition is always true
if (sm->mask & STMT_FS_TYPE) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fs/namespace.c:4894:9: note: initialize the variable 'ret' to silence this warning
int ret;
^
= 0
>> fs/namespace.c:4969:1: warning: stack frame size (1036) exceeds limit (1024) in '__ia32_sys_statmount' [-Wframe-larger-than]
SYSCALL_DEFINE4(statmount, const struct mnt_id_req __user *, req,
^
include/linux/syscalls.h:224:36: note: expanded from macro 'SYSCALL_DEFINE4'
#define SYSCALL_DEFINE4(name, ...) SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
^
include/linux/syscalls.h:232:2: note: expanded from macro 'SYSCALL_DEFINEx'
__SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
^
arch/x86/include/asm/syscall_wrapper.h:232:2: note: expanded from macro '__SYSCALL_DEFINEx'
__IA32_SYS_STUBx(x, name, __VA_ARGS__) \
^
arch/x86/include/asm/syscall_wrapper.h:117:2: note: expanded from macro '__IA32_SYS_STUBx'
__SYS_STUBx(ia32, sys##name, \
^
arch/x86/include/asm/syscall_wrapper.h:77:7: note: expanded from macro '__SYS_STUBx'
long __##abi##_##name(const struct pt_regs *regs) \
^
<scratch space>:78:1: note: expanded from here
__ia32_sys_statmount
^
36/1036 (3.47%) spills, 1000/1036 (96.53%) variables
2 warnings generated.

vim +4896 fs/namespace.c

4888
4889 static int copy_statmount_to_user(struct kstatmount *s)
4890 {
4891 struct statmount *sm = &s->sm;
4892 struct seq_file *seq;
4893 size_t copysize = min_t(size_t, s->bufsize, sizeof(*sm));
4894 int ret;
4895
> 4896 if (sm->mask & STMT_FS_TYPE) {
4897 seq = &s->fs_type;
4898 ret = copy_to_user(s->buf->str + sm->fs_type,
4899 seq->buf, seq->count);
4900 }
4901
4902 if (!ret && sm->mask & STMT_MNT_ROOT) {
4903 seq = &s->mnt_root;
4904 ret = copy_to_user(s->buf->str + sm->mnt_root,
4905 seq->buf, seq->count);
4906 }
4907
4908 if (!ret && sm->mask & STMT_MNT_POINT) {
4909 seq = &s->mnt_point;
4910 ret = copy_to_user(s->buf->str + sm->mnt_point,
4911 seq->buf, seq->count);
4912 }
4913
4914 if (ret)
4915 return -EFAULT;
4916
4917 /* Return the number of bytes copied to the buffer */
4918 sm->size = copysize + s->pos;
4919 if (copy_to_user(s->buf, sm, copysize))
4920 return -EFAULT;
4921
4922 return 0;
4923 }
4924
4925 static int do_statmount(struct kstatmount *s)
4926 {
4927 struct mount *m = real_mount(s->mnt);
4928 int err;
4929
4930 if (!capable(CAP_SYS_ADMIN) &&
4931 !is_path_reachable(m, m->mnt.mnt_root, &s->root))
4932 return -EPERM;
4933
4934 err = security_sb_statfs(s->mnt->mnt_root);
4935 if (err)
4936 return err;
4937
4938 if (s->mask & STMT_SB_BASIC)
4939 stmt_sb_basic(s);
4940
4941 if (s->mask & STMT_MNT_BASIC)
4942 stmt_mnt_basic(s);
4943
4944 if (s->mask & STMT_PROPAGATE_FROM)
4945 stmt_propagate_from(s);
4946
4947 if (s->mask & STMT_FS_TYPE)
4948 err = stmt_string(s, STMT_FS_TYPE);
4949
4950 if (!err && s->mask & STMT_MNT_ROOT)
4951 err = stmt_string(s, STMT_MNT_ROOT);
4952
4953 if (!err && s->mask & STMT_MNT_POINT)
4954 err = stmt_string(s, STMT_MNT_POINT);
4955
4956 if (err)
4957 return err;
4958
4959 return 0;
4960 }
4961
4962 static inline void drop_kstatmount(struct kstatmount *ks)
4963 {
4964 __putname(ks->fs_type.buf);
4965 __putname(ks->mnt_root.buf);
4966 __putname(ks->mnt_point.buf);
4967 }
4968
> 4969 SYSCALL_DEFINE4(statmount, const struct mnt_id_req __user *, req,
4970 struct statmount __user *, buf, size_t, bufsize,
4971 unsigned int, flags)
4972 {
4973 struct vfsmount *mnt;
4974 struct mnt_id_req kreq;
4975 struct kstatmount *ks;
4976 int ret;
4977
4978 if (flags)
4979 return -EINVAL;
4980
4981 if (copy_from_user(&kreq, req, sizeof(kreq)))
4982 return -EFAULT;
4983
4984 down_read(&namespace_sem);
4985 mnt = lookup_mnt_in_ns(kreq.mnt_id, current->nsproxy->mnt_ns);
4986 if (!mnt) {
4987 up_read(&namespace_sem);
4988 return -ENOENT;
4989 }
4990
4991 ks = &(struct kstatmount){
4992 .mask = kreq.request_mask,
4993 .buf = buf,
4994 .bufsize = bufsize,
4995 .mnt = mnt,
4996 };
4997
4998 get_fs_root(current->fs, &ks->root);
4999 ret = do_statmount(ks);
5000 path_put(&ks->root);
5001 up_read(&namespace_sem);
5002
5003 if (!ret)
5004 ret = copy_statmount_to_user(ks);
5005 drop_kstatmount(ks);
5006 return ret;
5007 }
5008

--
0-DAY CI Kernel Test Service