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
WARNING: multiple messages have this Message-ID (diff)
From: kbuild test robot <lkp@intel.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
next prev parent reply other threads:[~2019-05-18 5:50 UTC|newest]
Thread overview: 36+ 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 ` Roberto Sassu
2019-05-17 16:55 ` Roberto Sassu
2019-05-17 16:55 ` [PATCH v3 1/2] initramfs: set extended attributes Roberto Sassu
2019-05-17 16:55 ` Roberto Sassu
2019-05-17 16:55 ` [PATCH v3 2/2] initramfs: introduce do_readxattrs() Roberto Sassu
2019-05-17 16:55 ` 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-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-20 9:39 ` Roberto Sassu
2019-05-22 16:17 ` hpa
2019-05-22 17:22 ` Roberto Sassu
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:17 ` Rob Landley
2019-05-17 21:41 ` H. Peter Anvin
2019-05-17 21:41 ` H. Peter Anvin
2019-05-18 2:16 ` Rob Landley
2019-05-18 2:16 ` Rob Landley
2019-05-22 16:18 ` hpa
2019-05-20 8:47 ` Roberto Sassu
2019-05-20 8:47 ` Roberto Sassu
2019-05-17 23:09 ` kbuild test robot
2019-05-17 23:09 ` kbuild test robot
2019-05-18 1:02 ` kbuild test robot
2019-05-18 1:02 ` kbuild test robot
2019-05-18 5:49 ` kbuild test robot [this message]
2019-05-18 5:49 ` kbuild test robot
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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.