[bug report] fuse: make args->in_args[0] to be always the header

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Bernd Schubert,

Commit e24b7a3b70ae ("fuse: make args->in_args[0] to be always the
header") from Jan 20, 2025 (linux-next), leads to the following
Smatch static checker warning:

	fs/fuse/dir.c:596 get_create_ext()
	error: buffer overflow 'args->in_args' 3 <= 3

fs/fuse/dax.c
   921  static int fuse_symlink(struct mnt_idmap *idmap, struct inode *dir,
   922                          struct dentry *entry, const char *link)
   923  {
   924          struct fuse_mount *fm = get_fuse_mount(dir);
   925          unsigned len = strlen(link) + 1;
   926          FUSE_ARGS(args);
   927  
   928          args.opcode = FUSE_SYMLINK;
   929          args.in_numargs = 3;

opcode is FUSE_SYMLINK.  in->in_numargs is 3.

   930          fuse_set_zero_arg0(&args);
   931          args.in_args[1].size = entry->d_name.len + 1;
   932          args.in_args[1].value = entry->d_name.name;
   933          args.in_args[2].size = len;
   934          args.in_args[2].value = link;
   935          return create_new_entry(idmap, fm, &args, dir, entry, S_IFLNK);
                                                   ^^^^^

   936  }

fs/fuse/dir.c
   782  static int create_new_entry(struct mnt_idmap *idmap, struct fuse_mount *fm,
   783                              struct fuse_args *args, struct inode *dir,
   784                              struct dentry *entry, umode_t mode)
   785  {
   786          struct fuse_entry_out outarg;
   787          struct inode *inode;
   788          struct dentry *d;
   789          int err;
   790          struct fuse_forget_link *forget;
   791  
   792          if (fuse_is_bad(dir))
   793                  return -EIO;
   794  
   795          forget = fuse_alloc_forget();
   796          if (!forget)
   797                  return -ENOMEM;
   798  
   799          memset(&outarg, 0, sizeof(outarg));
   800          args->nodeid = get_node_id(dir);
   801          args->out_numargs = 1;
   802          args->out_args[0].size = sizeof(outarg);
   803          args->out_args[0].value = &outarg;
   804  
   805          if (args->opcode != FUSE_LINK) {

FUSE_LINK is 13.  FUSE_SYMLINK is 6.

   806                  err = get_create_ext(idmap, args, dir, entry, mode);
                                                    ^^^^
   807                  if (err)
   808                          goto out_put_forget_req;
   809          }

fs/fuse/dir.c
    578 static int get_create_ext(struct mnt_idmap *idmap,
    579                           struct fuse_args *args,
    580                           struct inode *dir, struct dentry *dentry,
    581                           umode_t mode)
    582 {
    583         struct fuse_conn *fc = get_fuse_conn_super(dentry->d_sb);
    584         struct fuse_in_arg ext = { .size = 0, .value = NULL };
    585         int err = 0;
    586 
    587         if (fc->init_security)
    588                 err = get_security_context(dentry, mode, &ext);
    589         if (!err && fc->create_supp_group)
    590                 err = get_create_supp_group(idmap, dir, &ext);
    591 
    592         if (!err && ext.size) {
                            ^^^^^^^^
I don't know what ext.size is.  Maybe it's zero for symlinks?  In that
case just ignore this static checker warning.

    593                 WARN_ON(args->in_numargs >= ARRAY_SIZE(args->in_args));
    594                 args->is_ext = true;
    595                 args->ext_idx = args->in_numargs++;
--> 596                 args->in_args[args->ext_idx] = ext;
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
3 results an out of bounds warning here.

    597         } else {
    598                 kfree(ext.value);
    599         }
    600 
    601         return err;
    602 }

regards,
dan carpenter




[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [NTFS 3]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [NTFS 3]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux