]> granicus.if.org Git - php/commitdiff
Fixed bug #70641 (Random_* - Better compatibility on Linux distros)
authorScott <scott@paragonie.com>
Mon, 5 Oct 2015 15:39:55 +0000 (11:39 -0400)
committerBob Weinand <bobwei9@hotmail.com>
Mon, 5 Oct 2015 23:03:04 +0000 (01:03 +0200)
See:
* https://bugs.php.net/bug.php?id=70641
* https://github.com/php/php-src/pull/1513#issuecomment-145571829

ext/standard/random.c

index 6d3ec141bcc848574a7c26f92ca7c3f92039369e..f46c4e0a14cf0a76db05c72ff9a6457f8d4caf07 100644 (file)
@@ -31,7 +31,7 @@
 # include "win32/winutil.h"
 #endif
 #ifdef __linux__
-# include <linux/random.h>
+# include <sys/syscall.h>
 #endif
 
 #ifdef ZTS
@@ -107,7 +107,7 @@ static int php_random_bytes(void *bytes, size_t size)
                              amount_to_read
 
                */
-               n = getrandom(bytes + read_bytes, amount_to_read, 0);
+               n = syscall(SYS_getrandom, bytes + read_bytes, amount_to_read, 0);
 
                if (n == -1) {
                        if (errno == EINTR || errno == EAGAIN) {
@@ -140,7 +140,13 @@ static int php_random_bytes(void *bytes, size_t size)
                        return FAILURE;
                }
                /* Does the file exist and is it a character device? */
-               if (fstat(fd, &st) != 0 || !S_ISCHR(st.st_mode)) {
+               if (fstat(fd, &st) != 0 || 
+# ifdef S_IFNAM
+                !(S_IFNAM(st.st_mode) || S_ISCHR(st.st_mode))
+# else
+                !S_ISCHR(st.st_mode)
+# endif
+               ) {
                        close(fd);
                        zend_throw_exception(zend_ce_exception, "Error reading from source device", 0);
                        return FAILURE;