]> granicus.if.org Git - php/commitdiff
Add file descriptor caching to mcrypt_create_iv()
authorLeigh <leigh@php.net>
Fri, 27 Mar 2015 13:33:30 +0000 (14:33 +0100)
committerJulien Pauli <jpauli@php.net>
Wed, 13 May 2015 12:18:32 +0000 (14:18 +0200)
This improves performance for applications that make repeated calls to
mcrypt_create_iv()

ext/mcrypt/mcrypt.c
ext/mcrypt/php_mcrypt.h

index 5c9f9fc501f6a6b3cf55f174b826ff48e74ce72c..5f14a9274d0dace76ec1deb795a96c7b102a0097 100644 (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");
index 4bc226110b0ff09e68a0d25b867fb10e820a2afe..9bfad99e9b149913f793ddf134de4c140a6d36aa 100644 (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