mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
Merge branch 'PHP-7.0' into PHP-7.1
This commit is contained in:
commit
c240feb7f4
2 changed files with 57 additions and 51 deletions
2
NEWS
2
NEWS
|
@ -49,6 +49,8 @@ PHP NEWS
|
|||
. Fixed bug #74041 (substr_count with length=0 broken). (Nikita)
|
||||
. Fixed bug #73118 (is_callable callable name reports misleading value for
|
||||
anonymous classes). (Adam Saponara)
|
||||
. Fixed bug #74105 (PHP on Linux should use /dev/urandom when getrandom is
|
||||
not available). (Benjamin Robin)
|
||||
|
||||
- Streams:
|
||||
. Fixed bug #73496 (Invalid memory access in zend_inline_hash_func).
|
||||
|
|
|
@ -93,14 +93,13 @@ PHPAPI int php_random_bytes(void *bytes, size_t size, zend_bool should_throw)
|
|||
}
|
||||
#elif HAVE_DECL_ARC4RANDOM_BUF && ((defined(__OpenBSD__) && OpenBSD >= 201405) || (defined(__NetBSD__) && __NetBSD_Version__ >= 700000001))
|
||||
arc4random_buf(bytes, size);
|
||||
#elif defined(__linux__) && defined(SYS_getrandom)
|
||||
/* Linux getrandom(2) syscall */
|
||||
#else
|
||||
size_t read_bytes = 0;
|
||||
size_t amount_to_read = 0;
|
||||
ssize_t n;
|
||||
|
||||
#if defined(__linux__) && defined(SYS_getrandom)
|
||||
/* Linux getrandom(2) syscall */
|
||||
/* Keep reading until we get enough entropy */
|
||||
do {
|
||||
while (read_bytes < size) {
|
||||
/* Below, (bytes + read_bytes) is pointer arithmetic.
|
||||
|
||||
bytes read_bytes size
|
||||
|
@ -110,11 +109,17 @@ PHPAPI int php_random_bytes(void *bytes, size_t size, zend_bool should_throw)
|
|||
amount_to_read
|
||||
|
||||
*/
|
||||
amount_to_read = size - read_bytes;
|
||||
size_t amount_to_read = size - read_bytes;
|
||||
n = syscall(SYS_getrandom, bytes + read_bytes, amount_to_read, 0);
|
||||
|
||||
if (n == -1) {
|
||||
if (errno == EINTR || errno == EAGAIN) {
|
||||
if (errno == ENOSYS) {
|
||||
/* This can happen if PHP was compiled against a newer kernel where getrandom()
|
||||
* is available, but then runs on an older kernel without getrandom(). If this
|
||||
* happens we simply fall back to reading from /dev/urandom. */
|
||||
ZEND_ASSERT(read_bytes == 0);
|
||||
break;
|
||||
} else if (errno == EINTR || errno == EAGAIN) {
|
||||
/* Try again */
|
||||
continue;
|
||||
}
|
||||
|
@ -130,12 +135,11 @@ PHPAPI int php_random_bytes(void *bytes, size_t size, zend_bool should_throw)
|
|||
}
|
||||
|
||||
read_bytes += (size_t) n;
|
||||
} while (read_bytes < size);
|
||||
#else
|
||||
}
|
||||
#endif
|
||||
if (read_bytes < size) {
|
||||
int fd = RANDOM_G(fd);
|
||||
struct stat st;
|
||||
size_t read_bytes = 0;
|
||||
ssize_t n;
|
||||
|
||||
if (fd < 0) {
|
||||
#if HAVE_DEV_URANDOM
|
||||
|
@ -164,12 +168,11 @@ PHPAPI int php_random_bytes(void *bytes, size_t size, zend_bool should_throw)
|
|||
RANDOM_G(fd) = fd;
|
||||
}
|
||||
|
||||
while (read_bytes < size) {
|
||||
for (read_bytes = 0; read_bytes < size; read_bytes += (size_t) n) {
|
||||
n = read(fd, bytes + read_bytes, size - read_bytes);
|
||||
if (n <= 0) {
|
||||
break;
|
||||
}
|
||||
read_bytes += n;
|
||||
}
|
||||
|
||||
if (read_bytes < size) {
|
||||
|
@ -178,6 +181,7 @@ PHPAPI int php_random_bytes(void *bytes, size_t size, zend_bool should_throw)
|
|||
}
|
||||
return FAILURE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return SUCCESS;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue