From: Leigh Date: Fri, 27 Mar 2015 13:33:30 +0000 (+0100) Subject: Add file descriptor caching to mcrypt_create_iv() X-Git-Tag: php-5.5.26RC1~23 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c02c4aca007199057201b855f674b6baa9be4c6e;p=php Add file descriptor caching to mcrypt_create_iv() This improves performance for applications that make repeated calls to mcrypt_create_iv() --- diff --git a/ext/mcrypt/mcrypt.c b/ext/mcrypt/mcrypt.c index 5c9f9fc501..5f14a9274d 100644 --- a/ext/mcrypt/mcrypt.c +++ b/ext/mcrypt/mcrypt.c @@ -415,7 +415,13 @@ static void php_mcrypt_module_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) /* {{{ } } /* }}} */ - + +typedef enum { + RANDOM = 0, + URANDOM, + RAND +} iv_source; + static PHP_MINIT_FUNCTION(mcrypt) /* {{{ */ { le_mcrypt = zend_register_list_destructors_ex(php_mcrypt_module_dtor, NULL, "mcrypt", module_number); @@ -473,6 +479,9 @@ static PHP_MINIT_FUNCTION(mcrypt) /* {{{ */ php_stream_filter_register_factory("mcrypt.*", &php_mcrypt_filter_factory TSRMLS_CC); php_stream_filter_register_factory("mdecrypt.*", &php_mcrypt_filter_factory TSRMLS_CC); + MCG(fd[RANDOM]) = -1; + MCG(fd[URANDOM]) = -1; + return SUCCESS; } /* }}} */ @@ -536,12 +545,6 @@ PHP_MINFO_FUNCTION(mcrypt) /* {{{ */ } /* }}} */ -typedef enum { - RANDOM = 0, - URANDOM, - RAND -} iv_source; - /* {{{ proto resource mcrypt_module_open(string cipher, string cipher_directory, string mode, string mode_directory) Opens the module of the algorithm and the mode to be used */ PHP_FUNCTION(mcrypt_module_open) @@ -1403,24 +1406,27 @@ PHP_FUNCTION(mcrypt_create_iv) } n = size; #else - int fd; + int *fd = &MCG(fd[source]); size_t read_bytes = 0; - fd = open(source == RANDOM ? "/dev/random" : "/dev/urandom", O_RDONLY); - if (fd < 0) { - efree(iv); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot open source device"); - RETURN_FALSE; + if (*fd < 0) { + *fd = open(source == RANDOM ? "/dev/random" : "/dev/urandom", O_RDONLY); + if (*fd < 0) { + efree(iv); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot open source device"); + RETURN_FALSE; + } } + while (read_bytes < size) { - n = read(fd, iv + read_bytes, size - read_bytes); + n = read(*fd, iv + read_bytes, size - read_bytes); if (n < 0) { break; } read_bytes += n; } n = read_bytes; - close(fd); + if (n < size) { efree(iv); php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not gather sufficient random data"); diff --git a/ext/mcrypt/php_mcrypt.h b/ext/mcrypt/php_mcrypt.h index 4bc226110b..9bfad99e9b 100644 --- a/ext/mcrypt/php_mcrypt.h +++ b/ext/mcrypt/php_mcrypt.h @@ -77,6 +77,7 @@ ZEND_BEGIN_MODULE_GLOBALS(mcrypt) int le_h; char *modes_dir; char *algorithms_dir; + int fd[2]; // RANDOM = 0, URANDOM = 1 ZEND_END_MODULE_GLOBALS(mcrypt) #ifdef ZTS