Re: [PATCH v27 01/12] Linux Random Number Generator

kbuild test robot
2020-01-16T06:10:23Z

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]

url: https://github.com/0day-ci/linux/commits/Stephan-M-ller/dev-random-a-new-approach-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@intel.com>

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@lists.01.org Intel Corporation