Module Name: src Committed By: martin Date: Wed Oct 9 13:04:17 UTC 2024
Modified Files: src/sys/dev [netbsd-10]: random.c src/sys/kern [netbsd-10]: kern_entropy.c src/sys/sys [netbsd-10]: entropy.h Log Message: Pull up following revision(s) (requested by riastradh in ticket #937): sys/dev/random.c: revision 1.11 sys/kern/kern_entropy.c: revision 1.67 sys/kern/kern_entropy.c: revision 1.68 sys/kern/kern_entropy.c: revision 1.69 sys/sys/entropy.h: revision 1.5 entropy(9): New function entropy_consolidate_sig. This is the same as entropy_consolidate, but it returns EINTR if interrupted by a signal and 0 otherwise. (entropy_consolidate can already be interrupted by a signal -- it just doesn't tell you if it was.) Eventually these will be merged into a single entropy_consolidate that returns the error code, but adding a new symbol first makes it safe for pullup-10. PR kern/58646: /dev/random, kern.entropy.*: signal bugs /dev/random: Fix two signal bugs. 1. If a long write to /dev/random is interrupted by a signal, it may proceed to sleep on the entropy source lock instead of returning promptly. => Don't try to consolidate entropy if we've already been interrupted by a signal. 2. If a write to /dev/random is interrupted by a signal while sleeping on the entropy source lock, it may fail to report EINTR. => Pass through EINTR from entropy consolidation via new entropy_consolidate_sig function. PR kern/58646: /dev/random, kern.entropy.*: signal bugs kern.entropy.consolidate, ioctl(RNDCTL): Fail with EINTR on signal. This can happen if another thread is currently running consolidation and has the entropy source lock held. Use the new function entropy_consolidate_sig to get at EINTR. PR kern/58646: /dev/random, kern.entropy.*: signal bugs kern.entropy.gather: Fail with EINTR on signal. Just don't throw away the error code we already have! PR kern/58646: /dev/random, kern.entropy.*: signal bugs To generate a diff of this commit: cvs rdiff -u -r1.10 -r1.10.4.1 src/sys/dev/random.c cvs rdiff -u -r1.57.4.4 -r1.57.4.5 src/sys/kern/kern_entropy.c cvs rdiff -u -r1.4 -r1.4.20.1 src/sys/sys/entropy.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/random.c diff -u src/sys/dev/random.c:1.10 src/sys/dev/random.c:1.10.4.1 --- src/sys/dev/random.c:1.10 Tue Dec 28 13:22:43 2021 +++ src/sys/dev/random.c Wed Oct 9 13:04:16 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: random.c,v 1.10 2021/12/28 13:22:43 riastradh Exp $ */ +/* $NetBSD: random.c,v 1.10.4.1 2024/10/09 13:04:16 martin Exp $ */ /*- * Copyright (c) 2019 The NetBSD Foundation, Inc. @@ -47,7 +47,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: random.c,v 1.10 2021/12/28 13:22:43 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: random.c,v 1.10.4.1 2024/10/09 13:04:16 martin Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -298,8 +298,8 @@ random_write(dev_t dev, struct uio *uio, kmem_free(buf, RANDOM_BUFSIZE); /* If we added anything, consolidate entropy now. */ - if (any) - entropy_consolidate(); + if (any && error == 0) + error = entropy_consolidate_sig(); return error; } Index: src/sys/kern/kern_entropy.c diff -u src/sys/kern/kern_entropy.c:1.57.4.4 src/sys/kern/kern_entropy.c:1.57.4.5 --- src/sys/kern/kern_entropy.c:1.57.4.4 Fri Aug 11 14:35:25 2023 +++ src/sys/kern/kern_entropy.c Wed Oct 9 13:04:16 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_entropy.c,v 1.57.4.4 2023/08/11 14:35:25 martin Exp $ */ +/* $NetBSD: kern_entropy.c,v 1.57.4.5 2024/10/09 13:04:16 martin Exp $ */ /*- * Copyright (c) 2019 The NetBSD Foundation, Inc. @@ -77,7 +77,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_entropy.c,v 1.57.4.4 2023/08/11 14:35:25 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_entropy.c,v 1.57.4.5 2024/10/09 13:04:16 martin Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -1354,7 +1354,21 @@ entropy_notify(void) /* * entropy_consolidate() * - * Trigger entropy consolidation and wait for it to complete. + * Trigger entropy consolidation and wait for it to complete, or + * return early if interrupted by a signal. + */ +void +entropy_consolidate(void) +{ + + (void)entropy_consolidate_sig(); +} + +/* + * entropy_consolidate_sig() + * + * Trigger entropy consolidation and wait for it to complete, or + * return EINTR if interrupted by a signal. * * This should be used sparingly, not periodically -- requiring * conscious intervention by the operator or a clear policy @@ -1362,8 +1376,8 @@ entropy_notify(void) * when enough entropy has been gathered into per-CPU pools to * transition to full entropy. */ -void -entropy_consolidate(void) +int +entropy_consolidate_sig(void) { uint64_t ticket; int error; @@ -1381,6 +1395,8 @@ entropy_consolidate(void) break; } mutex_exit(&E->lock); + + return error; } /* @@ -1404,7 +1420,7 @@ sysctl_entropy_consolidate(SYSCTLFN_ARGS if (error || newp == NULL) return error; if (arg) - entropy_consolidate(); + error = entropy_consolidate_sig(); return error; } @@ -1434,7 +1450,7 @@ sysctl_entropy_gather(SYSCTLFN_ARGS) mutex_exit(&E->lock); } - return 0; + return error; } /* @@ -2777,7 +2793,7 @@ entropy_ioctl(unsigned long cmd, void *d /* Enter the data and consolidate entropy. */ rnd_add_data(&seed_rndsource, rdata->data, rdata->len, entropybits); - entropy_consolidate(); + error = entropy_consolidate_sig(); break; } default: Index: src/sys/sys/entropy.h diff -u src/sys/sys/entropy.h:1.4 src/sys/sys/entropy.h:1.4.20.1 --- src/sys/sys/entropy.h:1.4 Fri Aug 14 00:53:16 2020 +++ src/sys/sys/entropy.h Wed Oct 9 13:04:17 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: entropy.h,v 1.4 2020/08/14 00:53:16 riastradh Exp $ */ +/* $NetBSD: entropy.h,v 1.4.20.1 2024/10/09 13:04:17 martin Exp $ */ /*- * Copyright (c) 2019 The NetBSD Foundation, Inc. @@ -50,6 +50,7 @@ struct knote; void entropy_bootrequest(void); void entropy_consolidate(void); +int entropy_consolidate_sig(void); unsigned entropy_epoch(void); bool entropy_ready(void); int entropy_extract(void *, size_t, int);