pajoye Thu, 16 Jun 2011 01:31:10 +0000
Revision: http://svn.php.net/viewvc?view=revision&revision=312201
Log:
- init win32 rng context once per process
Changed paths:
U php/php-src/branches/PHP_5_3/main/main.c
U php/php-src/branches/PHP_5_3/win32/winutil.c
U php/php-src/branches/PHP_5_3/win32/winutil.h
U php/php-src/branches/PHP_5_4/main/main.c
U php/php-src/branches/PHP_5_4/win32/winutil.c
U php/php-src/branches/PHP_5_4/win32/winutil.h
U php/php-src/trunk/main/main.c
U php/php-src/trunk/win32/winutil.c
U php/php-src/trunk/win32/winutil.h
Modified: php/php-src/branches/PHP_5_3/main/main.c
===================================================================
--- php/php-src/branches/PHP_5_3/main/main.c 2011-06-16 01:21:01 UTC (rev 312200)
+++ php/php-src/branches/PHP_5_3/main/main.c 2011-06-16 01:31:10 UTC (rev 312201)
@@ -32,6 +32,7 @@
#include "win32/time.h"
#include "win32/signal.h"
#include "win32/php_win32_globals.h"
+#include "win32/winutil.h"
#include <process.h>
#elif defined(NETWARE)
#include <sys/timeval.h>
@@ -1829,6 +1830,10 @@
tsrm_ls = ts_resource(0);
#endif
+#ifdef PHP_WIN32
+ php_win32_init_rng_lock();
+#endif
+
module_shutdown = 0;
module_startup = 1;
sapi_initialize_empty_request(TSRMLS_C);
@@ -2148,6 +2153,10 @@
WSACleanup();
#endif
+#ifdef PHP_WIN32
+ php_win32_free_rng_lock();
+#endif
+
sapi_flush(TSRMLS_C);
zend_shutdown(TSRMLS_C);
Modified: php/php-src/branches/PHP_5_3/win32/winutil.c
===================================================================
--- php/php-src/branches/PHP_5_3/win32/winutil.c 2011-06-16 01:21:01 UTC (rev 312200)
+++ php/php-src/branches/PHP_5_3/win32/winutil.c 2011-06-16 01:31:10 UTC (rev 312201)
@@ -49,26 +49,61 @@
}
}
+HCRYPTPROV hCryptProv;
+unsigned int has_crypto_ctx = 0;
+
+#ifdef ZTS
+MUTEX_T php_lock_win32_cryptoctx;
+void php_win32_init_rng_lock()
+{
+ php_lock_win32_cryptoctx = tsrm_mutex_alloc();
+}
+
+void php_win32_free_rng_lock()
+{
+ tsrm_mutex_lock(php_lock_win32_cryptoctx);
+ CryptReleaseContext(hCryptProv, 0);
+ has_crypto_ctx = 0;
+ tsrm_mutex_unlock(php_lock_win32_cryptoctx);
+ tsrm_mutex_free(php_lock_win32_cryptoctx);
+
+}
+#else
+#define php_win32_init_rng_lock();
+#define php_win32_free_rng_lock();
+#endif
+
+
+
PHPAPI int php_win32_get_random_bytes(unsigned char *buf, size_t size) { /* {{{ */
- HCRYPTPROV hCryptProv;
- int has_context = 0;
+
+ unsigned int has_contextg = 0;
+
BOOL ret;
size_t i = 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 {
- return FAILURE;
+ tsrm_mutex_lock(php_lock_win32_cryptoctx);
+ if (has_crypto_ctx == 0) {
+ if (!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET)) {
+ /* 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_crypto_ctx = 1;
+ } else {
+ has_crypto_ctx = 0;
+ }
}
}
}
+ tsrm_mutex_unlock(php_lock_win32_cryptoctx);
+ if (has_crypto_ctx == 0) {
+ return FAILURE;
+ }
+
ret = CryptGenRandom(hCryptProv, size, buf);
- CryptReleaseContext(hCryptProv, 0);
+
if (ret) {
return SUCCESS;
} else {
Modified: php/php-src/branches/PHP_5_3/win32/winutil.h
===================================================================
--- php/php-src/branches/PHP_5_3/win32/winutil.h 2011-06-16 01:21:01 UTC (rev 312200)
+++ php/php-src/branches/PHP_5_3/win32/winutil.h 2011-06-16 01:31:10 UTC (rev 312201)
@@ -21,3 +21,11 @@
#define php_win_err() php_win_err(GetLastError())
int php_win32_check_trailing_space(const char * path, const int path_len);
PHPAPI php_win32_get_random_bytes(unsigned char *buf, size_t size);
+
+#ifdef ZTS
+void php_win32_init_rng_lock();
+void php_win32_free_rng_lock();
+#else
+#define php_win32_init_rng_lock();
+#define php_win32_free_rng_lock();
+#endif
Modified: php/php-src/branches/PHP_5_4/main/main.c
===================================================================
--- php/php-src/branches/PHP_5_4/main/main.c 2011-06-16 01:21:01 UTC (rev 312200)
+++ php/php-src/branches/PHP_5_4/main/main.c 2011-06-16 01:31:10 UTC (rev 312201)
@@ -1871,6 +1871,10 @@
tsrm_ls = ts_resource(0);
#endif
+#ifdef PHP_WIN32
+ php_win32_init_rng_lock();
+#endif
+
module_shutdown = 0;
module_startup = 1;
sapi_initialize_empty_request(TSRMLS_C);
@@ -2220,6 +2224,10 @@
WSACleanup();
#endif
+#ifdef PHP_WIN32
+ php_win32_free_rng_lock();
+#endif
+
sapi_flush(TSRMLS_C);
zend_shutdown(TSRMLS_C);
Modified: php/php-src/branches/PHP_5_4/win32/winutil.c
===================================================================
--- php/php-src/branches/PHP_5_4/win32/winutil.c 2011-06-16 01:21:01 UTC (rev 312200)
+++ php/php-src/branches/PHP_5_4/win32/winutil.c 2011-06-16 01:31:10 UTC (rev 312201)
@@ -49,30 +49,66 @@
}
}
+HCRYPTPROV hCryptProv;
+unsigned int has_crypto_ctx = 0;
+
+#ifdef ZTS
+MUTEX_T php_lock_win32_cryptoctx;
+void php_win32_init_rng_lock()
+{
+ php_lock_win32_cryptoctx = tsrm_mutex_alloc();
+}
+
+void php_win32_free_rng_lock()
+{
+ tsrm_mutex_lock(php_lock_win32_cryptoctx);
+ CryptReleaseContext(hCryptProv, 0);
+ has_crypto_ctx = 0;
+ tsrm_mutex_unlock(php_lock_win32_cryptoctx);
+ tsrm_mutex_free(php_lock_win32_cryptoctx);
+
+}
+#else
+#define php_win32_init_rng_lock();
+#define php_win32_free_rng_lock();
+#endif
+
+
+
PHPAPI int php_win32_get_random_bytes(unsigned char *buf, size_t size) { /* {{{ */
- HCRYPTPROV hCryptProv;
- int has_context = 0;
+
+ unsigned int has_contextg = 0;
+
BOOL ret;
size_t i = 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 {
- return FAILURE;
+ tsrm_mutex_lock(php_lock_win32_cryptoctx);
+ if (has_crypto_ctx == 0) {
+ if (!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET)) {
+ /* 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_crypto_ctx = 1;
+ } else {
+ has_crypto_ctx = 0;
+ }
}
}
}
+ tsrm_mutex_unlock(php_lock_win32_cryptoctx);
+ if (has_crypto_ctx == 0) {
+ return FAILURE;
+ }
+
ret = CryptGenRandom(hCryptProv, size, buf);
- CryptReleaseContext(hCryptProv, 0);
+
if (ret) {
return SUCCESS;
+ } else {
+ return FAILURE;
}
- return FAILURE;
}
/* }}} */
Modified: php/php-src/branches/PHP_5_4/win32/winutil.h
===================================================================
--- php/php-src/branches/PHP_5_4/win32/winutil.h 2011-06-16 01:21:01 UTC (rev 312200)
+++ php/php-src/branches/PHP_5_4/win32/winutil.h 2011-06-16 01:31:10 UTC (rev 312201)
@@ -21,3 +21,11 @@
#define php_win_err() php_win32_error_to_msg(GetLastError())
int php_win32_check_trailing_space(const char * path, const int path_len);
PHPAPI php_win32_get_random_bytes(unsigned char *buf, size_t size);
+
+#ifdef ZTS
+void php_win32_init_rng_lock();
+void php_win32_free_rng_lock();
+#else
+#define php_win32_init_rng_lock();
+#define php_win32_free_rng_lock();
+#endif
Modified: php/php-src/trunk/main/main.c
===================================================================
--- php/php-src/trunk/main/main.c 2011-06-16 01:21:01 UTC (rev 312200)
+++ php/php-src/trunk/main/main.c 2011-06-16 01:31:10 UTC (rev 312201)
@@ -1885,11 +1885,21 @@
#else
php_os=PHP_OS;
#endif
-
+ {
+ char dll_dir[MAX_PATH];
+ sprintf(dll_dir, "%s\\%s", module_path, "..\\..\\deps\\bin");
+ SetDllDirectory(dll_dir);
+ }
+// GetModuleFileName (NULL, module_path, MAX_PATH);
+//__debugbreak();
#ifdef ZTS
tsrm_ls = ts_resource(0);
#endif
+#ifdef PHP_WIN32
+ php_win32_init_rng_lock();
+#endif
+
module_shutdown = 0;
module_startup = 1;
sapi_initialize_empty_request(TSRMLS_C);
@@ -2241,6 +2251,10 @@
WSACleanup();
#endif
+#ifdef PHP_WIN32
+ php_win32_free_rng_lock();
+#endif
+
sapi_flush(TSRMLS_C);
zend_shutdown(TSRMLS_C);
Modified: php/php-src/trunk/win32/winutil.c
===================================================================
--- php/php-src/trunk/win32/winutil.c 2011-06-16 01:21:01 UTC (rev 312200)
+++ php/php-src/trunk/win32/winutil.c 2011-06-16 01:31:10 UTC (rev 312201)
@@ -49,30 +49,66 @@
}
}
+HCRYPTPROV hCryptProv;
+unsigned int has_crypto_ctx = 0;
+
+#ifdef ZTS
+MUTEX_T php_lock_win32_cryptoctx;
+void php_win32_init_rng_lock()
+{
+ php_lock_win32_cryptoctx = tsrm_mutex_alloc();
+}
+
+void php_win32_free_rng_lock()
+{
+ tsrm_mutex_lock(php_lock_win32_cryptoctx);
+ CryptReleaseContext(hCryptProv, 0);
+ has_crypto_ctx = 0;
+ tsrm_mutex_unlock(php_lock_win32_cryptoctx);
+ tsrm_mutex_free(php_lock_win32_cryptoctx);
+
+}
+#else
+#define php_win32_init_rng_lock();
+#define php_win32_free_rng_lock();
+#endif
+
+
+
PHPAPI int php_win32_get_random_bytes(unsigned char *buf, size_t size) { /* {{{ */
- HCRYPTPROV hCryptProv;
- int has_context = 0;
+
+ unsigned int has_contextg = 0;
+
BOOL ret;
size_t i = 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 {
- return FAILURE;
+ tsrm_mutex_lock(php_lock_win32_cryptoctx);
+ if (has_crypto_ctx == 0) {
+ if (!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET)) {
+ /* 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_crypto_ctx = 1;
+ } else {
+ has_crypto_ctx = 0;
+ }
}
}
}
+ tsrm_mutex_unlock(php_lock_win32_cryptoctx);
+ if (has_crypto_ctx == 0) {
+ return FAILURE;
+ }
+
ret = CryptGenRandom(hCryptProv, size, buf);
- CryptReleaseContext(hCryptProv, 0);
+
if (ret) {
return SUCCESS;
+ } else {
+ return FAILURE;
}
- return FAILURE;
}
/* }}} */
Modified: php/php-src/trunk/win32/winutil.h
===================================================================
--- php/php-src/trunk/win32/winutil.h 2011-06-16 01:21:01 UTC (rev 312200)
+++ php/php-src/trunk/win32/winutil.h 2011-06-16 01:31:10 UTC (rev 312201)
@@ -21,3 +21,11 @@
#define php_win_err() php_win32_error_to_msg(GetLastError())
int php_win32_check_trailing_space(const char * path, const int path_len);
PHPAPI php_win32_get_random_bytes(unsigned char *buf, size_t size);
+
+#ifdef ZTS
+void php_win32_init_rng_lock();
+void php_win32_free_rng_lock();
+#else
+#define php_win32_init_rng_lock();
+#define php_win32_free_rng_lock();
+#endif
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php