Am Donnerstag, 16. Januar 2020, 07:09:51 CET schrieb kbuild test robot: Hi kbuild, > Hi "Stephan, > > Thank you for the patch! Perhaps something to improve: > > [auto build test WARNING on char-misc/char-misc-testing] > [also build test WARNING on cryptodev/master crypto/master v5.5-rc6 > next-20200110] [if your patch is applied to the wrong git tree, please drop > us a note to help improve the system. BTW, we also suggest to use '--base' > option to specify the base tree in git format-patch, please see > https://stackoverflow.com/a/37406982] This patch requires the presence of patch 75551dbf112c992bc6c99a972990b3f272247e23 from Ted Tso's kernel tree as documented in patch 0/12. I am not sure how to document it for the kbuild system. > > url: > https://github.com/0day-ci/linux/commits/Stephan-M-ller/dev-random-a-new-ap > proach-with-full-SP800-90B/20200110-084934 base: > https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git > 68faa679b8be1a74e6663c21c3a9d25d32f1c079 reproduce: > # apt-get install sparse > # sparse version: v0.6.1-130-g1a803e7a-dirty > 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@xxxxxxxxx> > > > sparse warnings: (new ones prefixed by >>) > > >> drivers/char/lrng/lrng_interfaces.c:455:16: sparse: sparse: incorrect > >> type in return expression (different base types) > >> drivers/char/lrng/lrng_interfaces.c:455:16: sparse: expected unsigned > >> int drivers/char/lrng/lrng_interfaces.c:455:16: sparse: got > >> restricted __poll_t [assigned] [usertype] mask > >> drivers/char/lrng/lrng_interfaces.c:586:18: sparse: sparse: incorrect > >> type in initializer (different base types) > >> drivers/char/lrng/lrng_interfaces.c:586:18: sparse: expected > >> restricted __poll_t ( *poll )( ... ) > >> drivers/char/lrng/lrng_interfaces.c:586:18: sparse: got unsigned int > >> ( * )( ... ) > drivers/char/lrng/lrng_interfaces.c:605:49: sparse: sparse: undefined > identifier 'GRND_INSECURE' drivers/char/lrng/lrng_interfaces.c:613:15: > sparse: sparse: undefined identifier 'GRND_INSECURE' > drivers/char/lrng/lrng_interfaces.c:613:47: sparse: sparse: undefined > identifier 'GRND_INSECURE' drivers/char/lrng/lrng_interfaces.c:619:21: > sparse: sparse: undefined identifier 'GRND_INSECURE' -- > drivers/char/lrng/lrng_drng.c:378:6: sparse: sparse: symbol 'lrng_reset' > was not declared. Should it be static? > >> drivers/char/lrng/lrng_internal.h:235:39: sparse: sparse: context > >> imbalance in 'lrng_drng_inject' - unexpected unlock > >> drivers/char/lrng/lrng_internal.h:235:39: sparse: sparse: context > >> imbalance in 'lrng_drng_seed' - unexpected unlock > >> drivers/char/lrng/lrng_internal.h:235:39: sparse: sparse: context > >> imbalance in 'lrng_drng_get' - unexpected unlock > >> drivers/char/lrng/lrng_internal.h:235:39: sparse: sparse: context > >> imbalance in 'lrng_drngs_init_cc20' - unexpected unlock > >> drivers/char/lrng/lrng_internal.h:235:39: sparse: sparse: context > >> imbalance in '_lrng_reset' - unexpected unlock > vim +455 drivers/char/lrng/lrng_interfaces.c > > 442 > 443 static unsigned int lrng_random_poll(struct file *file, poll_table > *wait) 444 { > 445 __poll_t mask; > 446 > 447 poll_wait(file, &lrng_init_wait, wait); > 448 poll_wait(file, &lrng_write_wait, wait); > 449 mask = 0; > 450 if (lrng_state_operational()) > 451 mask |= EPOLLIN | EPOLLRDNORM; > 452 if (lrng_need_entropy() || > 453 lrng_state_exseed_allow(lrng_noise_source_user)) > 454 mask |= EPOLLOUT | EPOLLWRNORM; > > > 455 return mask; > > 456 } > 457 > 458 static ssize_t lrng_drng_write_common(const char __user *buffer, > size_t count, 459 u32 entropy_bits) > 460 { > 461 ssize_t ret = 0; > 462 u8 buf[64] __aligned(LRNG_KCAPI_ALIGN); > 463 const char __user *p = buffer; > 464 u32 orig_entropy_bits = entropy_bits; > 465 > 466 if (!lrng_get_available()) > 467 return -EAGAIN; > 468 > 469 count = min_t(size_t, count, INT_MAX); > 470 while (count > 0) { > 471 size_t bytes = min_t(size_t, count, sizeof(buf)); > 472 u32 ent = min_t(u32, bytes<<3, entropy_bits); > 473 > 474 if (copy_from_user(&buf, p, bytes)) > 475 return -EFAULT; > 476 /* Inject data into entropy pool */ > 477 lrng_pool_lfsr(buf, bytes); > 478 lrng_pool_add_entropy(ent); > 479 > 480 count -= bytes; > 481 p += bytes; > 482 ret += bytes; > 483 entropy_bits -= ent; > 484 > 485 cond_resched(); > 486 } > 487 > 488 /* Force reseed of DRNG during next data request. */ > 489 if (!orig_entropy_bits) > 490 lrng_drng_force_reseed(); > 491 > 492 return ret; > 493 } > 494 > 495 static ssize_t lrng_drng_read(struct file *file, char __user *buf, > 496 size_t nbytes, loff_t *ppos) > 497 { > 498 if (!lrng_state_min_seeded()) > 499 pr_notice_ratelimited("%s - use of insufficiently seeded DRNG " > 500 "(%zu bytes read)\n", current- >comm, > 501 nbytes); > 502 else if (!lrng_state_operational()) > 503 pr_debug_ratelimited("%s - use of not fully seeded DRNG (%zu " > 504 "bytes read)\n", current->comm, nbytes); > 505 > 506 return lrng_read_common(buf, nbytes); > 507 } > 508 > 509 static ssize_t lrng_drng_write(struct file *file, const char __user > *buffer, 510 size_t count, loff_t *ppos) > 511 { > 512 return lrng_drng_write_common(buffer, count, 0); > 513 } > 514 > 515 static long lrng_ioctl(struct file *f, unsigned int cmd, unsigned > long arg) 516 { > 517 int size, ent_count_bits; > 518 int __user *p = (int __user *)arg; > 519 > 520 switch (cmd) { > 521 case RNDGETENTCNT: > 522 ent_count_bits = lrng_avail_entropy(); > 523 if (put_user(ent_count_bits, p)) > 524 return -EFAULT; > 525 return 0; > 526 case RNDADDTOENTCNT: > 527 if (!capable(CAP_SYS_ADMIN)) > 528 return -EPERM; > 529 if (get_user(ent_count_bits, p)) > 530 return -EFAULT; > 531 ent_count_bits = (int)lrng_avail_entropy() + ent_count_bits; > 532 if (ent_count_bits < 0) > 533 ent_count_bits = 0; > 534 if (ent_count_bits > LRNG_POOL_SIZE_BITS) > 535 ent_count_bits = LRNG_POOL_SIZE_BITS; > 536 lrng_pool_set_entropy(ent_count_bits); > 537 return 0; > 538 case RNDADDENTROPY: > 539 if (!capable(CAP_SYS_ADMIN)) > 540 return -EPERM; > 541 if (get_user(ent_count_bits, p++)) > 542 return -EFAULT; > 543 if (ent_count_bits < 0) > 544 return -EINVAL; > 545 if (get_user(size, p++)) > 546 return -EFAULT; > 547 if (size < 0) > 548 return -EINVAL; > 549 lrng_state_exseed_set(lrng_noise_source_user, false); > 550 /* there cannot be more entropy than data */ > 551 ent_count_bits = min(ent_count_bits, size<<3); > 552 return lrng_drng_write_common((const char __user *)p, size, > 553 ent_count_bits); > 554 case RNDZAPENTCNT: > 555 case RNDCLEARPOOL: > 556 /* Clear the entropy pool counter. */ > 557 if (!capable(CAP_SYS_ADMIN)) > 558 return -EPERM; > 559 lrng_pool_set_entropy(0); > 560 return 0; > 561 case RNDRESEEDCRNG: > 562 /* > 563 * We leave the capability check here since it is present > 564 * in the upstream's RNG implementation. Yet, user space > 565 * can trigger a reseed as easy as writing into /dev/ random > 566 * or /dev/urandom where no privilege is needed. > 567 */ > 568 if (!capable(CAP_SYS_ADMIN)) > 569 return -EPERM; > 570 /* Force a reseed of all DRNGs */ > 571 lrng_drng_force_reseed(); > 572 return 0; > 573 default: > 574 return -EINVAL; > 575 } > 576 } > 577 > 578 static int lrng_fasync(int fd, struct file *filp, int on) > 579 { > 580 return fasync_helper(fd, filp, on, &fasync); > 581 } > 582 > 583 const struct file_operations random_fops = { > 584 .read = lrng_drng_read_block, > 585 .write = lrng_drng_write, > > > 586 .poll = lrng_random_poll, > > 587 .unlocked_ioctl = lrng_ioctl, > 588 .compat_ioctl = compat_ptr_ioctl, > 589 .fasync = lrng_fasync, > 590 .llseek = noop_llseek, > 591 }; > 592 > > --- > 0-DAY kernel test infrastructure Open Source Technology > Center https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx Intel > Corporation Ciao Stephan