[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v6 04/25] crypto: Do not fail for EINTR during qcryp
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PATCH v6 04/25] crypto: Do not fail for EINTR during qcrypto_random_bytes |
Date: |
Fri, 10 May 2019 10:30:28 -0700 |
We can always get EINTR for read; /dev/urandom is no exception.
Rearrange the order of tests for likelihood; allow degenerate buflen==0
case to perform a no-op zero-length read. This means that the normal
success path is a straight line with a single test for success.
Reviewed-by: Laurent Vivier <address@hidden>
Reviewed-by: Daniel P. Berrangé <address@hidden>
Signed-off-by: Richard Henderson <address@hidden>
---
v3: Rearrage the read loop again.
---
crypto/random-platform.c | 36 +++++++++++++++---------------------
1 file changed, 15 insertions(+), 21 deletions(-)
diff --git a/crypto/random-platform.c b/crypto/random-platform.c
index f995fc0ef1..260b64564d 100644
--- a/crypto/random-platform.c
+++ b/crypto/random-platform.c
@@ -65,29 +65,23 @@ int qcrypto_random_bytes(uint8_t *buf G_GNUC_UNUSED,
"Unable to read random bytes");
return -1;
}
-
- return 0;
#else
- int ret = -1;
- int got;
-
- while (buflen > 0) {
- got = read(fd, buf, buflen);
- if (got < 0) {
- error_setg_errno(errp, errno,
- "Unable to read random bytes");
- goto cleanup;
- } else if (!got) {
- error_setg(errp,
- "Unexpected EOF reading random bytes");
- goto cleanup;
+ while (1) {
+ ssize_t got = read(fd, buf, buflen);
+ if (likely(got == buflen)) {
+ return 0;
+ }
+ if (got > 0) {
+ buflen -= got;
+ buf += got;
+ } else if (got == 0) {
+ error_setg(errp, "Unexpected EOF reading random bytes");
+ return -1;
+ } else if (errno != EINTR) {
+ error_setg_errno(errp, errno, "Unable to read random bytes");
+ return -1;
}
- buflen -= got;
- buf += got;
}
-
- ret = 0;
- cleanup:
- return ret;
#endif
+ return 0;
}
--
2.17.1
- [Qemu-devel] [PATCH v6 00/25] Add qemu_getrandom and ARMv8.5-RNG etc, Richard Henderson, 2019/05/10
- [Qemu-devel] [PATCH v6 01/25] configure: Link test before auto-enabling crypto libraries, Richard Henderson, 2019/05/10
- [Qemu-devel] [PATCH v6 03/25] crypto: Reverse code blocks in random-platform.c, Richard Henderson, 2019/05/10
- [Qemu-devel] [PATCH v6 02/25] crypto: Merge crypto-obj-y into libqemuutil.a, Richard Henderson, 2019/05/10
- [Qemu-devel] [PATCH v6 05/25] crypto: Use O_CLOEXEC in qcrypto_random_init, Richard Henderson, 2019/05/10
- [Qemu-devel] [PATCH v6 04/25] crypto: Do not fail for EINTR during qcrypto_random_bytes,
Richard Henderson <=
- [Qemu-devel] [PATCH v6 08/25] ui/vnc: Split out authentication_failed, Richard Henderson, 2019/05/10
- [Qemu-devel] [PATCH v6 10/25] util: Add qemu_guest_getrandom and associated routines, Richard Henderson, 2019/05/10
- [Qemu-devel] [PATCH v6 09/25] ui/vnc: Use gcrypto_random_bytes for start_auth_vnc, Richard Henderson, 2019/05/10
- [Qemu-devel] [PATCH v6 06/25] crypto: Use getrandom for qcrypto_random_bytes, Richard Henderson, 2019/05/10
- [Qemu-devel] [PATCH v6 07/25] crypto: Change the qcrypto_random_bytes buffer type to void*, Richard Henderson, 2019/05/10
- [Qemu-devel] [PATCH v6 11/25] cpus: Initialize pseudo-random seeds for all guest cpus, Richard Henderson, 2019/05/10
- [Qemu-devel] [PATCH v6 14/25] linux-user: Use qemu_guest_getrandom_nofail for AT_RANDOM, Richard Henderson, 2019/05/10
- [Qemu-devel] [PATCH v6 15/25] linux-user/aarch64: Use qemu_guest_getrandom for PAUTH keys, Richard Henderson, 2019/05/10
- [Qemu-devel] [PATCH v6 17/25] aspeed/scu: Use qemu_guest_getrandom_nofail, Richard Henderson, 2019/05/10
- [Qemu-devel] [PATCH v6 13/25] linux-user: Call qcrypto_init if not using -seed, Richard Henderson, 2019/05/10