summaryrefslogtreecommitdiff
path: root/util/nvmutil/lib/num.c
diff options
context:
space:
mode:
Diffstat (limited to 'util/nvmutil/lib/num.c')
-rw-r--r--util/nvmutil/lib/num.c52
1 files changed, 28 insertions, 24 deletions
diff --git a/util/nvmutil/lib/num.c b/util/nvmutil/lib/num.c
index 99503e8c..bbb5a83e 100644
--- a/util/nvmutil/lib/num.c
+++ b/util/nvmutil/lib/num.c
@@ -227,40 +227,44 @@ rlong_next:
#if defined(HAVE_GETRANDOM) || \
defined(HAVE_GETRANDOM_SYSCALL)
int
-fallback_rand_getrandom(void *buf, size_t len)
+fallback_rand_getrandom(void *buf, unsigned long len)
{
- ssize_t rval = -1;
+ unsigned long off = 0;
+ long rval = -1;
- /* keep strict compiler
- * happy if unused
- */
- (void)rval;
- (void)buf;
- (void)len;
+ if (!len)
+ return -1;
-#if defined(HAVE_GETRANDOM)
- do {
- rval = getrandom(buf, len, 0);
- } while (rval < 0 && errno == EINTR);
+ if (buf == NULL)
+ return -1;
-#elif defined(HAVE_GETRANDOM_SYSCALL)
- do {
- rval = syscall(SYS_getrandom, buf, len, 0);
- } while (rval < 0 && errno == EINTR);
+#if defined(HAVE_GETRANDOM) || \
+ defined(HAVE_GETRANDOM_SYSCALL)
-#else
- return -1;
+ while (off < len) {
+
+#if defined(HAVE_GETRANDOM)
+ rval = (long)getrandom((char *)buf + off, len - off, 0);
+#elif defined(HAVE_GETRANDOM_SYSCALL)
+ rval = (long)syscall(SYS_getrandom,
+ (char *)buf + off, len - off, 0);
#endif
-#if defined(HAVE_GETRANDOM) || \
- defined(HAVE_GETRANDOM_SYSCALL)
+ if (rval < 0) {
+ if (errno == EINTR)
+ continue;
+
+ return -1; /* unsupported by kernel */
+ }
- if (rval == (ssize_t)len) {
- return 0;
+ off += (unsigned long)rval;
}
- if (rval < 0 && errno == ENOSYS)
- return -1; /* not supported by kernel */
+ return 0;
+
+#else
+ (void)buf;
+ (void)len;
return -1;
#endif