From: kbuild test robot <lkp@intel.com>
To: Roberto Sassu <roberto.sassu@huawei.com>
Cc: kbuild-all@01.org, viro@zeniv.linux.org.uk,
linux-security-module@vger.kernel.org,
linux-integrity@vger.kernel.org, initramfs@vger.kernel.org,
linux-api@vger.kernel.org, linux-fsdevel@vger.kernel.org,
linux-kernel@vger.kernel.org, zohar@linux.vnet.ibm.com,
silviu.vlasceanu@huawei.com, dmitry.kasatkin@huawei.com,
takondra@cisco.com, kamensky@cisco.com, hpa@zytor.com,
arnd@arndb.de, rob@landley.net, james.w.mcmechan@gmail.com,
niveditas98@gmail.com, Roberto Sassu <roberto.sassu@huawei.com>
Subject: Re: [PATCH v3 2/2] initramfs: introduce do_readxattrs()
Date: Sat, 18 May 2019 13:49:34 +0800 [thread overview]
Message-ID: <201905181320.40kqTTSD%lkp@intel.com> (raw)
In-Reply-To: <20190517165519.11507-3-roberto.sassu@huawei.com>
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 <lkp@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
prev parent reply other threads:[~2019-05-18 5:50 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-17 16:55 [PATCH v3 0/2] initramfs: add support for xattrs in the initial ram disk Roberto Sassu
2019-05-17 16:55 ` [PATCH v3 1/2] initramfs: set extended attributes Roberto Sassu
2019-05-17 16:55 ` [PATCH v3 2/2] initramfs: introduce do_readxattrs() Roberto Sassu
2019-05-17 20:18 ` hpa
2019-05-17 21:02 ` Arvind Sankar
2019-05-17 21:10 ` Arvind Sankar
2019-05-20 8:16 ` Roberto Sassu
2019-05-17 21:47 ` H. Peter Anvin
2019-05-17 22:17 ` Arvind Sankar
2019-05-20 9:39 ` Roberto Sassu
2019-05-22 16:17 ` hpa
2019-05-22 17:22 ` Roberto Sassu
2019-05-22 19:26 ` Rob Landley
2019-05-22 20:21 ` Taras Kondratiuk
2019-05-17 21:17 ` Rob Landley
2019-05-17 21:41 ` H. Peter Anvin
2019-05-18 2:16 ` Rob Landley
2019-05-22 16:18 ` hpa
2019-05-20 8:47 ` Roberto Sassu
2019-05-17 23:09 ` kbuild test robot
2019-05-18 1:02 ` kbuild test robot
2019-05-18 5:49 ` kbuild test robot [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201905181320.40kqTTSD%lkp@intel.com \
--to=lkp@intel.com \
--cc=arnd@arndb.de \
--cc=dmitry.kasatkin@huawei.com \
--cc=hpa@zytor.com \
--cc=initramfs@vger.kernel.org \
--cc=james.w.mcmechan@gmail.com \
--cc=kamensky@cisco.com \
--cc=kbuild-all@01.org \
--cc=linux-api@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-integrity@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-security-module@vger.kernel.org \
--cc=niveditas98@gmail.com \
--cc=rob@landley.net \
--cc=roberto.sassu@huawei.com \
--cc=silviu.vlasceanu@huawei.com \
--cc=takondra@cisco.com \
--cc=viro@zeniv.linux.org.uk \
--cc=zohar@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).