pajoye Mon, 01 Feb 2010 14:56:51 +
Revision: http://svn.php.net/viewvc?view=revisionrevision=294307
Log:
- try again to get a crypto context when the key container did not exist (which
is likely to be the case, on a 1st call)
Changed paths:
U php/php-src/branches/PHP_5_3/Zend/zend_alloc.c
U php/php-src/trunk/Zend/zend_alloc.c
Modified: php/php-src/branches/PHP_5_3/Zend/zend_alloc.c
===
--- php/php-src/branches/PHP_5_3/Zend/zend_alloc.c 2010-02-01 14:09:23 UTC
(rev 294306)
+++ php/php-src/branches/PHP_5_3/Zend/zend_alloc.c 2010-02-01 14:56:51 UTC
(rev 294307)
@@ -944,15 +944,27 @@
#endif
#if ZEND_MM_HEAP_PROTECTION || ZEND_MM_COOKIES
-static void zend_mm_random(unsigned char *buf, size_t size)
+static void zend_mm_random(unsigned char *buf, size_t size) /* {{{ */
{
size_t i = 0;
unsigned char t;
#ifdef ZEND_WIN32
HCRYPTPROV hCryptProv;
+ int has_context = 0;
- if (CryptAcquireContext(hCryptProv, NULL, NULL, PROV_RSA_FULL, 0)) {
+ if (!CryptAcquireContext(hCryptProv, NULL, NULL, PROV_RSA_FULL, 0)) {
+ /* Could mean that the key container does not exist, let try
+ again by asking for a new one */
+ if (GetLastError() == NTE_BAD_KEYSET) {
+ if (CryptAcquireContext(hCryptProv, NULL, NULL,
PROV_RSA_FULL, CRYPT_NEWKEYSET)) {
+ has_context = 1;
+ }
+ }
+ } else {
+ has_context = 1;
+ }
+ if (has_context) {
do {
BOOL ret = CryptGenRandom(hCryptProv, size, buf);
CryptReleaseContext(hCryptProv, 0);
@@ -961,7 +973,7 @@
i++;
}
if (i == size) {
- return;
+ return;
}
}
} while (0);
@@ -990,6 +1002,7 @@
t = buf[i++] 1;
}
}
+/* }}} */
#endif
/* Notes:
Modified: php/php-src/trunk/Zend/zend_alloc.c
===
--- php/php-src/trunk/Zend/zend_alloc.c 2010-02-01 14:09:23 UTC (rev 294306)
+++ php/php-src/trunk/Zend/zend_alloc.c 2010-02-01 14:56:51 UTC (rev 294307)
@@ -979,8 +979,20 @@
#ifdef ZEND_WIN32
HCRYPTPROV hCryptProv;
+ int has_context = 0;
- if (CryptAcquireContext(hCryptProv, NULL, NULL, PROV_RSA_FULL, 0)) {
+ if (!CryptAcquireContext(hCryptProv, NULL, NULL, PROV_RSA_FULL, 0)) {
+ /* Could mean that the key container does not exist, let try
+ again by asking for a new one */
+ if (GetLastError() == NTE_BAD_KEYSET) {
+ if (CryptAcquireContext(hCryptProv, NULL, NULL,
PROV_RSA_FULL, CRYPT_NEWKEYSET)) {
+ has_context = 1;
+ }
+ }
+ } else {
+ has_context = 1;
+ }
+ if (has_context) {
do {
BOOL ret = CryptGenRandom(hCryptProv, size, buf);
CryptReleaseContext(hCryptProv, 0);
@@ -989,7 +1001,7 @@
i++;
}
if (i == size) {
- return;
+ return;
}
}
} while (0);
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php