diff options
author | Julien Pauli <jpauli@php.net> | 2015-05-13 14:19:04 +0200 |
---|---|---|
committer | Julien Pauli <jpauli@php.net> | 2015-05-13 14:19:04 +0200 |
commit | c09fad97d68d07d6b528d56d5cef1f8cbb9fc5ec (patch) | |
tree | 191306091ef0e8ffc66cf432cca8577a71156bfc /ext/mcrypt/mcrypt.c | |
parent | 1b12982d39361a0b3a5b6621fa4ad3af58003857 (diff) | |
parent | f7952b90cad735e2a588c305d425c24550b3775d (diff) | |
download | php-git-c09fad97d68d07d6b528d56d5cef1f8cbb9fc5ec.tar.gz |
Merge branch 'PHP-5.5' into PHP-5.6
* PHP-5.5:
Close fd at the end, otherwise people complain
Add file descriptor caching to mcrypt_create_iv()
Diffstat (limited to 'ext/mcrypt/mcrypt.c')
-rw-r--r-- | ext/mcrypt/mcrypt.c | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/ext/mcrypt/mcrypt.c b/ext/mcrypt/mcrypt.c index 8612cba0ed..8eeb86dcc1 100644 --- a/ext/mcrypt/mcrypt.c +++ b/ext/mcrypt/mcrypt.c @@ -380,7 +380,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); @@ -438,6 +444,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; } /* }}} */ @@ -447,6 +456,14 @@ static PHP_MSHUTDOWN_FUNCTION(mcrypt) /* {{{ */ php_stream_filter_unregister_factory("mcrypt.*" TSRMLS_CC); php_stream_filter_unregister_factory("mdecrypt.*" TSRMLS_CC); + if (MCG(fd[RANDOM]) > 0) { + close(MCG(fd[RANDOM])); + } + + if (MCG(fd[URANDOM]) > 0) { + close(MCG(fd[URANDOM])); + } + UNREGISTER_INI_ENTRIES(); return SUCCESS; } @@ -1423,24 +1440,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"); |