mirror of
https://codeberg.org/libreboot/lbmk.git
synced 2026-07-19 19:23:24 +02:00
util/mkhtemp: use /dev/urandom *if enabled*
build-time option. do not allow fallback; on a system where getrandom is used, it should be used exclusively. on some systems, getrandom may not be available, even if they have a newer kernel. Signed-off-by: Leah Rowe <leah@libreboot.org>
This commit is contained in:
@@ -59,7 +59,6 @@ rlong(void)
|
|||||||
{
|
{
|
||||||
size_t rval;
|
size_t rval;
|
||||||
int saved_errno = errno;
|
int saved_errno = errno;
|
||||||
errno = 0;
|
|
||||||
|
|
||||||
#if (defined(__OpenBSD__) || defined(__FreeBSD__) || \
|
#if (defined(__OpenBSD__) || defined(__FreeBSD__) || \
|
||||||
defined(__NetBSD__) || defined(__APPLE__) || \
|
defined(__NetBSD__) || defined(__APPLE__) || \
|
||||||
@@ -68,12 +67,39 @@ rlong(void)
|
|||||||
arc4random_buf(&rval, sizeof(size_t));
|
arc4random_buf(&rval, sizeof(size_t));
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
#elif defined(USE_URANDOM) && \
|
||||||
|
((USE_URANDOM) > 0)
|
||||||
|
|
||||||
|
/* Use of /dev/urandom is ill advised, due
|
||||||
|
to FD exhaustion */
|
||||||
|
|
||||||
|
int fd = -1;
|
||||||
|
ssize_t rc = 0;
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
|
||||||
|
if ((fd = open("/dev/urandom", O_RDONLY)) < 0)
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
retry_rand:
|
||||||
|
|
||||||
|
if ((rc = read(fd, &rval, sizeof(rval))) < 0) {
|
||||||
|
if (errno == EINTR || errno == EAGAIN)
|
||||||
|
goto retry_rand;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((rval += (size_t)rc) < sizeof(rval))
|
||||||
|
goto retry_rand;
|
||||||
|
|
||||||
#elif defined(__linux__)
|
#elif defined(__linux__)
|
||||||
|
|
||||||
size_t off = 0;
|
size_t off = 0;
|
||||||
size_t len = sizeof(rval);
|
size_t len = sizeof(rval);
|
||||||
ssize_t rc;
|
ssize_t rc;
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
|
||||||
retry_rand:
|
retry_rand:
|
||||||
rc = (ssize_t)syscall(SYS_getrandom,
|
rc = (ssize_t)syscall(SYS_getrandom,
|
||||||
(char *)&rval + off, len - off, 0);
|
(char *)&rval + off, len - off, 0);
|
||||||
@@ -91,6 +117,13 @@ retry_rand:
|
|||||||
goto retry_rand;
|
goto retry_rand;
|
||||||
|
|
||||||
goto out;
|
goto out;
|
||||||
|
#else
|
||||||
|
#error Unsupported operating system (possibly unsecure randomisation)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
out:
|
||||||
|
errno = saved_errno;
|
||||||
|
return rval;
|
||||||
err:
|
err:
|
||||||
/*
|
/*
|
||||||
* getrandom can return with error, but arc4random
|
* getrandom can return with error, but arc4random
|
||||||
@@ -103,12 +136,6 @@ err:
|
|||||||
"Randomisation failure, possibly unsupported in your kernel.");
|
"Randomisation failure, possibly unsupported in your kernel.");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
|
||||||
#else
|
return 0;
|
||||||
#error Unsupported operating system (possibly unsecure randomisation)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
out:
|
|
||||||
errno = saved_errno;
|
|
||||||
return rval;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user