1
0
mirror of https://github.com/php/php-src.git synced 2026-04-25 17:08:14 +02:00

Add file descriptor caching to mcrypt_create_iv()

This improves performance for applications that make repeated calls to
mcrypt_create_iv()
This commit is contained in:
Leigh
2015-03-27 14:33:30 +01:00
committed by Julien Pauli
parent 43c24da166
commit c02c4aca00
2 changed files with 22 additions and 15 deletions
+21 -15
View File
@@ -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");
+1
View File
@@ -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