diff options
author | Leigh <leigh@php.net> | 2015-03-27 14:33:30 +0100 |
---|---|---|
committer | Julien Pauli <jpauli@php.net> | 2015-05-13 14:18:32 +0200 |
commit | c02c4aca007199057201b855f674b6baa9be4c6e (patch) | |
tree | a74b3d60ff32e974e2e150635d2c0d766b101420 | |
parent | 43c24da166b090d4745293042ee995a0361c7ff0 (diff) | |
download | php-git-c02c4aca007199057201b855f674b6baa9be4c6e.tar.gz |
Add file descriptor caching to mcrypt_create_iv()
This improves performance for applications that make repeated calls to
mcrypt_create_iv()
-rw-r--r-- | ext/mcrypt/mcrypt.c | 36 | ||||
-rw-r--r-- | ext/mcrypt/php_mcrypt.h | 1 |
2 files changed, 22 insertions, 15 deletions
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 |