summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2021-08-23 23:41:45 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2021-11-06 17:39:37 +0900
commit66b0847602ffa47575371f4d5a9a04dc6013ba49 (patch)
tree4b816342c9bbccbd80f39ab89e6b25a4364c8a3a
parente5792e7d552235e17a93d50a26c375db1974148f (diff)
Check the reading size range
-rw-r--r--random.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/random.c b/random.c
index a474e8aa05..b873d0593e 100644
--- a/random.c
+++ b/random.c
@@ -538,6 +538,11 @@ fill_random_bytes_syscall(void *buf, size_t size, int unused)
#endif
}
#elif defined(_WIN32)
+
+#ifndef DWORD_MAX
+# define DWORD_MAX (~(DWORD)0UL)
+#endif
+
# if defined(CRYPT_VERIFYCONTEXT)
STATIC_ASSERT(sizeof_HCRYPTPROV, sizeof(HCRYPTPROV) == sizeof(size_t));
@@ -580,7 +585,12 @@ fill_random_bytes_crypt(void *seed, size_t size)
}
}
if (prov == INVALID_HCRYPTPROV) return -1;
- CryptGenRandom(prov, size, seed);
+ while (size > 0) {
+ DWORD n = (size > (size_t)DWORD_MAX) ? DWORD_MAX : (DWORD)size;
+ if (!CryptGenRandom(prov, n, seed)) return -1;
+ seed = (char *)seed + n;
+ size -= n;
+ }
return 0;
}
# else
@@ -590,9 +600,14 @@ fill_random_bytes_crypt(void *seed, size_t size)
static int
fill_random_bytes_bcrypt(void *seed, size_t size)
{
- if (!BCryptGenRandom(NULL, seed, size, BCRYPT_USE_SYSTEM_PREFERRED_RNG))
- return 0;
- return -1;
+ while (size > 0) {
+ ULONG n = (size > (size_t)ULONG_MAX) ? LONG_MAX : (ULONG)size;
+ if (BCryptGenRandom(NULL, seed, n, BCRYPT_USE_SYSTEM_PREFERRED_RNG))
+ return -1;
+ seed = (char *)seed + n;
+ size -= n;
+ }
+ return 0;
}
static int