mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
crypto: Do not fail for EINTR during qcrypto_random_bytes
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 <lvivier@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
14a356f475
commit
25fb26e4f4
1 changed files with 15 additions and 21 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue