diff --git a/win32/winutil.c b/win32/winutil.c index 8e47d487606..40a87006470 100644 --- a/win32/winutil.c +++ b/win32/winutil.c @@ -84,7 +84,6 @@ BOOL php_win32_init_random_bytes(void) PHP_WINUTIL_API int php_win32_get_random_bytes(unsigned char *buf, size_t size) { /* {{{ */ BOOL ret; - size_t got = 0; #if 0 /* Currently we fail on startup, with CNG API it shows no regressions so far and is secure. @@ -96,18 +95,21 @@ PHP_WINUTIL_API int php_win32_get_random_bytes(unsigned char *buf, size_t size) #endif #if ZEND_ENABLE_ZVAL_LONG64 + BOOL call_ret; + size_t got = 0; + do { ULONG to_read = (ULONG)(size - got); - ret = ret && NT_SUCCESS(BCryptGenRandom(bcrypt_algo, buf, to_read, 0)); - if (ret) { + call_ret = NT_SUCCESS(BCryptGenRandom(bcrypt_algo, buf, to_read, 0)); + if (call_ret) { got += to_read; buf += to_read; } - } while (ret && got < size); + } while (call_ret && got < size); + ret = (got == size); #else ret = NT_SUCCESS(BCryptGenRandom(bcrypt_algo, buf, size, 0)); #endif - assert(got == size); return ret ? SUCCESS : FAILURE; }