Hi Roberto,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on linus/master]
[also build test WARNING on v5.1 next-20190517]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improve the system]

url:    
https://github.com/0day-ci/linux/commits/Roberto-Sassu/initramfs-set-extended-attributes/20190518-055846
reproduce:
        # apt-get install sparse
        make ARCH=x86_64 allmodconfig
        make C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__'

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <l...@intel.com>


sparse warnings: (new ones prefixed by >>)

   init/initramfs.c:24:45: sparse: sparse: incorrect type in argument 2 
(different address spaces) @@    expected char const [noderef] <asn:1> *buf @@  
  got f] <asn:1> *buf @@
   init/initramfs.c:24:45: sparse:    expected char const [noderef] <asn:1> *buf
   init/initramfs.c:24:45: sparse:    got char const *p
   init/initramfs.c:115:36: sparse: sparse: incorrect type in argument 2 
(different address spaces) @@    expected char const [noderef] <asn:1> 
*filename @@    got n:1> *filename @@
   init/initramfs.c:115:36: sparse:    expected char const [noderef] <asn:1> 
*filename
   init/initramfs.c:115:36: sparse:    got char *filename
   init/initramfs.c:303:24: sparse: sparse: incorrect type in argument 1 
(different address spaces) @@    expected char const [noderef] <asn:1> *name @@ 
   got n:1> *name @@
   init/initramfs.c:303:24: sparse:    expected char const [noderef] <asn:1> 
*name
   init/initramfs.c:303:24: sparse:    got char *path
   init/initramfs.c:305:36: sparse: sparse: incorrect type in argument 1 
(different address spaces) @@    expected char const [noderef] <asn:1> 
*pathname @@    got n:1> *pathname @@
   init/initramfs.c:305:36: sparse:    expected char const [noderef] <asn:1> 
*pathname
   init/initramfs.c:305:36: sparse:    got char *path
   init/initramfs.c:307:37: sparse: sparse: incorrect type in argument 1 
(different address spaces) @@    expected char const [noderef] <asn:1> 
*pathname @@    got n:1> *pathname @@
   init/initramfs.c:307:37: sparse:    expected char const [noderef] <asn:1> 
*pathname
   init/initramfs.c:307:37: sparse:    got char *path
   init/initramfs.c:317:43: sparse: sparse: incorrect type in argument 1 
(different address spaces) @@    expected char const [noderef] <asn:1> *oldname 
@@    got n:1> *oldname @@
   init/initramfs.c:317:43: sparse:    expected char const [noderef] <asn:1> 
*oldname
   init/initramfs.c:317:43: sparse:    got char *old
   init/initramfs.c:317:48: sparse: sparse: incorrect type in argument 2 
(different address spaces) @@    expected char const [noderef] <asn:1> *newname 
@@    got char char const [noderef] <asn:1> *newname @@
   init/initramfs.c:317:48: sparse:    expected char const [noderef] <asn:1> 
*newname
   init/initramfs.c:317:48: sparse:    got char *static [toplevel] [assigned] 
collected
   init/initramfs.c:404:25: sparse: sparse: incorrect type in argument 1 
(different address spaces) @@    expected char const [noderef] <asn:1> *name @@ 
   got n:1> *name @@
   init/initramfs.c:404:25: sparse:    expected char const [noderef] <asn:1> 
*name
   init/initramfs.c:404:25: sparse:    got char *
>> init/initramfs.c:490:32: sparse: sparse: incorrect type in argument 1 
>> (different address spaces) @@    expected char const [noderef] <asn:1> *name 
>> @@    got char char const [noderef] <asn:1> *name @@
   init/initramfs.c:490:32: sparse:    expected char const [noderef] <asn:1> 
*name
   init/initramfs.c:490:32: sparse:    got char *static [toplevel] [assigned] 
collected
   init/initramfs.c:500:41: sparse: sparse: incorrect type in argument 1 
(different address spaces) @@    expected char const [noderef] <asn:1> 
*filename @@    got char char const [noderef] <asn:1> *filename @@
   init/initramfs.c:500:41: sparse:    expected char const [noderef] <asn:1> 
*filename
   init/initramfs.c:500:41: sparse:    got char *static [toplevel] [assigned] 
collected
   init/initramfs.c:512:28: sparse: sparse: incorrect type in argument 1 
(different address spaces) @@    expected char const [noderef] <asn:1> 
*pathname @@    got char char const [noderef] <asn:1> *pathname @@
   init/initramfs.c:512:28: sparse:    expected char const [noderef] <asn:1> 
*pathname
   init/initramfs.c:512:28: sparse:    got char *static [toplevel] [assigned] 
collected
   init/initramfs.c:513:28: sparse: sparse: incorrect type in argument 1 
(different address spaces) @@    expected char const [noderef] <asn:1> 
*filename @@    got char char const [noderef] <asn:1> *filename @@
   init/initramfs.c:513:28: sparse:    expected char const [noderef] <asn:1> 
*filename
   init/initramfs.c:513:28: sparse:    got char *static [toplevel] [assigned] 
collected
   init/initramfs.c:514:28: sparse: sparse: incorrect type in argument 1 
(different address spaces) @@    expected char const [noderef] <asn:1> 
*filename @@    got char char const [noderef] <asn:1> *filename @@
   init/initramfs.c:514:28: sparse:    expected char const [noderef] <asn:1> 
*filename
   init/initramfs.c:514:28: sparse:    got char *static [toplevel] [assigned] 
collected
   init/initramfs.c:519:36: sparse: sparse: incorrect type in argument 1 
(different address spaces) @@    expected char const [noderef] <asn:1> 
*filename @@    got char char const [noderef] <asn:1> *filename @@
   init/initramfs.c:519:36: sparse:    expected char const [noderef] <asn:1> 
*filename
   init/initramfs.c:519:36: sparse:    got char *static [toplevel] [assigned] 
collected
   init/initramfs.c:520:36: sparse: sparse: incorrect type in argument 1 
(different address spaces) @@    expected char const [noderef] <asn:1> 
*filename @@    got char char const [noderef] <asn:1> *filename @@
   init/initramfs.c:520:36: sparse:    expected char const [noderef] <asn:1> 
*filename
   init/initramfs.c:520:36: sparse:    got char *static [toplevel] [assigned] 
collected
   init/initramfs.c:521:36: sparse: sparse: incorrect type in argument 1 
(different address spaces) @@    expected char const [noderef] <asn:1> 
*filename @@    got char char const [noderef] <asn:1> *filename @@
   init/initramfs.c:521:36: sparse:    expected char const [noderef] <asn:1> 
*filename
   init/initramfs.c:521:36: sparse:    got char *static [toplevel] [assigned] 
collected
   init/initramfs.c:552:32: sparse: sparse: incorrect type in argument 1 
(different address spaces) @@    expected char const [noderef] <asn:1> *oldname 
@@    got n:1> *oldname @@
   init/initramfs.c:552:32: sparse:    expected char const [noderef] <asn:1> 
*oldname
   init/initramfs.c:552:32: sparse:    got char *
   init/initramfs.c:552:53: sparse: sparse: incorrect type in argument 2 
(different address spaces) @@    expected char const [noderef] <asn:1> *newname 
@@    got char char const [noderef] <asn:1> *newname @@
   init/initramfs.c:552:53: sparse:    expected char const [noderef] <asn:1> 
*newname
   init/initramfs.c:552:53: sparse:    got char *static [toplevel] [assigned] 
collected
   init/initramfs.c:553:21: sparse: sparse: incorrect type in argument 1 
(different address spaces) @@    expected char const [noderef] <asn:1> 
*filename @@    got char char const [noderef] <asn:1> *filename @@
   init/initramfs.c:553:21: sparse:    expected char const [noderef] <asn:1> 
*filename
   init/initramfs.c:553:21: sparse:    got char *static [toplevel] [assigned] 
collected

vim +490 init/initramfs.c

   310  
   311  static int __init maybe_link(void)
   312  {
   313          if (nlink >= 2) {
   314                  char *old = find_link(major, minor, ino, mode, 
collected);
   315                  if (old) {
   316                          clean_path(collected, 0);
 > 317                          return (ksys_link(old, collected) < 0) ? -1 : 1;
   318                  }
   319          }
   320          return 0;
   321  }
   322  
   323  struct xattr_hdr {
   324          char c_size[8]; /* total size including c_size field */
   325          char c_data[];  /* <name>\0<value> */
   326  };
   327  
   328  static int __init __maybe_unused do_setxattrs(char *pathname)
   329  {
   330          char *buf = xattr_buf;
   331          char *bufend = buf + xattr_len;
   332          struct xattr_hdr *hdr;
   333          char str[sizeof(hdr->c_size) + 1];
   334          struct path path;
   335  
   336          if (!xattr_len)
   337                  return 0;
   338  
   339          str[sizeof(hdr->c_size)] = 0;
   340  
   341          while (buf < bufend) {
   342                  char *xattr_name, *xattr_value;
   343                  unsigned long xattr_entry_size;
   344                  unsigned long xattr_name_size, xattr_value_size;
   345                  int ret;
   346  
   347                  if (buf + sizeof(hdr->c_size) > bufend) {
   348                          error("malformed xattrs");
   349                          break;
   350                  }
   351  
   352                  hdr = (struct xattr_hdr *)buf;
   353                  memcpy(str, hdr->c_size, sizeof(hdr->c_size));
   354                  ret = kstrtoul(str, 16, &xattr_entry_size);
   355                  buf += xattr_entry_size;
   356                  if (ret || buf > bufend || !xattr_entry_size) {
   357                          error("malformed xattrs");
   358                          break;
   359                  }
   360  
   361                  xattr_name = hdr->c_data;
   362                  xattr_name_size = strnlen(xattr_name,
   363                                          xattr_entry_size - 
sizeof(hdr->c_size));
   364                  if (xattr_name_size == xattr_entry_size - 
sizeof(hdr->c_size)) {
   365                          error("malformed xattrs");
   366                          break;
   367                  }
   368  
   369                  xattr_value = xattr_name + xattr_name_size + 1;
   370                  xattr_value_size = buf - xattr_value;
   371  
   372                  ret = kern_path(pathname, 0, &path);
   373                  if (!ret) {
   374                          ret = vfs_setxattr(path.dentry, xattr_name, 
xattr_value,
   375                                             xattr_value_size, 0);
   376  
   377                          path_put(&path);
   378                  }
   379  
   380                  pr_debug("%s: %s size: %lu val: %s (ret: %d)\n", 
pathname,
   381                           xattr_name, xattr_value_size, xattr_value, 
ret);
   382          }
   383  
   384          return 0;
   385  }
   386  
   387  struct path_hdr {
   388          char p_size[10]; /* total size including p_size field */
   389          char p_data[];   /* <path>\0<xattrs> */
   390  };
   391  
   392  static int __init do_readxattrs(void)
   393  {
   394          struct path_hdr hdr;
   395          char *path = NULL;
   396          char str[sizeof(hdr.p_size) + 1];
   397          unsigned long file_entry_size;
   398          size_t size, path_size, total_size;
   399          struct kstat st;
   400          struct file *file;
   401          loff_t pos;
   402          int ret;
   403  
   404          ret = vfs_lstat(XATTR_LIST_FILENAME, &st);
   405          if (ret < 0)
   406                  return ret;
   407  
   408          total_size = st.size;
   409  
   410          file = filp_open(XATTR_LIST_FILENAME, O_RDONLY, 0);
   411          if (IS_ERR(file))
   412                  return PTR_ERR(file);
   413  
   414          pos = file->f_pos;
   415  
   416          while (total_size) {
   417                  size = kernel_read(file, (char *)&hdr, sizeof(hdr), 
&pos);
   418                  if (size != sizeof(hdr)) {
   419                          ret = -EIO;
   420                          goto out;
   421                  }
   422  
   423                  total_size -= size;
   424  
   425                  str[sizeof(hdr.p_size)] = 0;
   426                  memcpy(str, hdr.p_size, sizeof(hdr.p_size));
   427                  ret = kstrtoul(str, 16, &file_entry_size);
   428                  if (ret < 0)
   429                          goto out;
   430  
   431                  file_entry_size -= sizeof(sizeof(hdr.p_size));
   432                  if (file_entry_size > total_size) {
   433                          ret = -EINVAL;
   434                          goto out;
   435                  }
   436  
   437                  path = vmalloc(file_entry_size);
   438                  if (!path) {
   439                          ret = -ENOMEM;
   440                          goto out;
   441                  }
   442  
   443                  size = kernel_read(file, path, file_entry_size, &pos);
   444                  if (size != file_entry_size) {
   445                          ret = -EIO;
   446                          goto out_free;
   447                  }
   448  
   449                  total_size -= size;
   450  
   451                  path_size = strnlen(path, file_entry_size);
   452                  if (path_size == file_entry_size) {
   453                          ret = -EINVAL;
   454                          goto out_free;
   455                  }
   456  
   457                  xattr_buf = path + path_size + 1;
   458                  xattr_len = file_entry_size - path_size - 1;
   459  
   460                  ret = do_setxattrs(path);
   461                  vfree(path);
   462                  path = NULL;
   463  
   464                  if (ret < 0)
   465                          break;
   466          }
   467  out_free:
   468          vfree(path);
   469  out:
   470          fput(file);
   471  
   472          if (ret < 0)
   473                  error("Unable to parse xattrs");
   474  
   475          return ret;
   476  }
   477  
   478  static __initdata int wfd;
   479  
   480  static int __init do_name(void)
   481  {
   482          state = SkipIt;
   483          next_state = Reset;
   484          if (strcmp(collected, "TRAILER!!!") == 0) {
   485                  free_hash();
   486                  return 0;
   487          } else if (strcmp(collected, XATTR_LIST_FILENAME) == 0) {
   488                  struct kstat st;
   489  
 > 490                  if (!vfs_lstat(collected, &st))
   491                          do_readxattrs();
   492          }
   493          clean_path(collected, mode);
   494          if (S_ISREG(mode)) {
   495                  int ml = maybe_link();
   496                  if (ml >= 0) {
   497                          int openflags = O_WRONLY|O_CREAT;
   498                          if (ml != 1)
   499                                  openflags |= O_TRUNC;
   500                          wfd = ksys_open(collected, openflags, mode);
   501  
   502                          if (wfd >= 0) {
   503                                  ksys_fchown(wfd, uid, gid);
   504                                  ksys_fchmod(wfd, mode);
   505                                  if (body_len)
   506                                          ksys_ftruncate(wfd, body_len);
   507                                  vcollected = kstrdup(collected, 
GFP_KERNEL);
   508                                  state = CopyFile;
   509                          }
   510                  }
   511          } else if (S_ISDIR(mode)) {
   512                  ksys_mkdir(collected, mode);
   513                  ksys_chown(collected, uid, gid);
   514                  ksys_chmod(collected, mode);
   515                  dir_add(collected, mtime);
   516          } else if (S_ISBLK(mode) || S_ISCHR(mode) ||
   517                     S_ISFIFO(mode) || S_ISSOCK(mode)) {
   518                  if (maybe_link() == 0) {
   519                          ksys_mknod(collected, mode, rdev);
   520                          ksys_chown(collected, uid, gid);
   521                          ksys_chmod(collected, mode);
   522                          do_utime(collected, mtime);
   523                  }
   524          }
   525          return 0;
   526  }
   527  

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

Reply via email to