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