summaryrefslogtreecommitdiff
path: root/Zend/zend_alloc.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2006-12-18 11:39:19 +0000
committerDmitry Stogov <dmitry@php.net>2006-12-18 11:39:19 +0000
commit1763dc162d93999d2c3e108a21f0596ed61b89ab (patch)
tree63292bbbfa78cecbb61f1d352e98f853715ae0c8 /Zend/zend_alloc.c
parent5fc3e649b6463c58a9dafa61bf0c0d0c1e555efe (diff)
downloadphp-git-1763dc162d93999d2c3e108a21f0596ed61b89ab.tar.gz
Fixed random generation of cookies and canaries
Diffstat (limited to 'Zend/zend_alloc.c')
-rw-r--r--Zend/zend_alloc.c81
1 files changed, 57 insertions, 24 deletions
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c
index 23d57f4ee6..d21e2cba2f 100644
--- a/Zend/zend_alloc.c
+++ b/Zend/zend_alloc.c
@@ -32,6 +32,13 @@
# include <unistd.h>
#endif
+#ifdef ZEND_WIN32
+# define _WIN32_WINNT 0x0400
+# include <wincrypt.h>
+# include <process.h>
+#endif
+
+
#ifndef ZEND_USE_MALLOC_MM
# define ZEND_USE_MALLOC_MM ZEND_DEBUG
#endif
@@ -712,6 +719,53 @@ static void zend_mm_free_cache(zend_mm_heap *heap)
}
#endif
+static void zend_mm_random(unsigned char *buf, size_t size)
+{
+ size_t i = 0;
+ unsigned char t;
+
+#ifdef ZEND_WIN32
+ HCRYPTPROV hCryptProv;
+
+ if (CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0)) {
+ do {
+ BOOL ret = CryptGenRandom(hCryptProv, size, buf);
+ CryptReleaseContext(hCryptProv, 0);
+ if (ret) {
+ while (i < size && buf[i] != 0) {
+ i++;
+ }
+ if (i == size) {
+ return;
+ }
+ }
+ } while (0);
+ }
+#elif defined(HAVE_DEV_URANDOM)
+ int fd = open("/dev/urandom", 0);
+
+ if (fd >= 0) {
+ if (read(fd, buf, size) == size) {
+ while (i < size && buf[i] != 0) {
+ i++;
+ }
+ if (i == size) {
+ close(fd);
+ return;
+ }
+ }
+ close(fd);
+ }
+#endif
+ t = (unsigned char)getpid();
+ while (i < size) {
+ do {
+ buf[i] = ((unsigned char)rand()) ^ t;
+ } while (buf[i] == 0);
+ t = buf[i++] << 1;
+ }
+}
+
/* Notes:
* - This function may alter the block_sizes values to match platform alignment
* - This function does *not* perform sanity checks on the arguments
@@ -741,36 +795,15 @@ ZEND_API zend_mm_heap *zend_mm_startup_ex(const zend_mm_mem_handlers *handlers,
#if ZEND_MM_HEAP_PROTECTION
if (_mem_block_start_magic == 0) {
- int r;
- do {
- r = rand();
- } while (!(r&0xff000000) ||
- !(r&0x00ff0000) ||
- !(r&0x0000ff00) ||
- !(r&0x000000ff));
- _mem_block_start_magic = r;
+ zend_mm_random((unsigned char*)&_mem_block_start_magic, sizeof(_mem_block_start_magic));
}
if (_mem_block_end_magic == 0) {
- int r;
- do {
- r = rand();
- } while (!(r&0xff000000) ||
- !(r&0x00ff0000) ||
- !(r&0x0000ff00) ||
- !(r&0x000000ff));
- _mem_block_end_magic = r;
+ zend_mm_random((unsigned char*)&_mem_block_end_magic, sizeof(_mem_block_end_magic));
}
#endif
#if ZEND_MM_COOKIES
if (_zend_mm_cookie == 0) {
- int r;
- do {
- r = rand();
- } while (!(r&0xff000000) ||
- !(r&0x00ff0000) ||
- !(r&0x0000ff00) ||
- !(r&0x000000ff));
- _zend_mm_cookie = r;
+ zend_mm_random((unsigned char*)&_zend_mm_cookie, sizeof(_zend_mm_cookie));
}
#endif