diff --git a/ext/standard/config.m4 b/ext/standard/config.m4 index f41df7e9861..c435f965540 100644 --- a/ext/standard/config.m4 +++ b/ext/standard/config.m4 @@ -592,6 +592,11 @@ dnl Check for atomic operation API availability in Solaris dnl AC_CHECK_HEADERS([atomic.h]) +dnl +dnl Check for arc4random on BSD systems +dnl +AC_CHECK_DECLS([arc4random_buf]) + dnl dnl Check for getrandom on newer Linux kernels dnl diff --git a/ext/standard/random.c b/ext/standard/random.c index d429cb4d0e3..bf3a2bc3219 100644 --- a/ext/standard/random.c +++ b/ext/standard/random.c @@ -33,6 +33,9 @@ #ifdef __linux__ # include #endif +#if defined(__OpenBSD__) || defined(__NetBSD__) +# include +#endif #ifdef ZTS int random_globals_id; @@ -87,6 +90,8 @@ static int php_random_bytes(void *bytes, size_t size) zend_throw_exception(zend_ce_exception, "Could not gather sufficient random data", 0); return FAILURE; } +#elif HAVE_DECL_ARC4RANDOM_BUF && ((defined(__OpenBSD__) && OpenBSD >= 201405) || (defined(__NetBSD__) && __NetBSD_Version__ >= 700000001)) + arc4random_buf(bytes, size); #elif HAVE_DECL_GETRANDOM /* Linux getrandom(2) syscall */ size_t read_bytes = 0;