]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-5.6'
authorJulien Pauli <jpauli@php.net>
Wed, 13 May 2015 12:21:19 +0000 (14:21 +0200)
committerJulien Pauli <jpauli@php.net>
Wed, 13 May 2015 12:21:19 +0000 (14:21 +0200)
* PHP-5.6:
  Close fd at the end, otherwise people complain
  Add file descriptor caching to mcrypt_create_iv()

Conflicts:
ext/mcrypt/mcrypt.c

1  2 
ext/mcrypt/mcrypt.c
ext/mcrypt/php_mcrypt.h

index 1cdedd596a163052f409d7956c02afa4c4f5ff59,8eeb86dcc1d3d0d596f5af9eef81756b2259d0dd..f6d8c912340a7a6e0b05bf643232db5394e43615
@@@ -400,18 -441,29 +406,29 @@@ static PHP_MINIT_FUNCTION(mcrypt) /* {{
        MCRYPT_ENTRY2_2_4(MODE_STREAM, "stream");
        REGISTER_INI_ENTRIES();
  
 -      php_stream_filter_register_factory("mcrypt.*", &php_mcrypt_filter_factory TSRMLS_CC);
 -      php_stream_filter_register_factory("mdecrypt.*", &php_mcrypt_filter_factory TSRMLS_CC);
 +      php_stream_filter_register_factory("mcrypt.*", &php_mcrypt_filter_factory);
 +      php_stream_filter_register_factory("mdecrypt.*", &php_mcrypt_filter_factory);
  
+       MCG(fd[RANDOM]) = -1;
+       MCG(fd[URANDOM]) = -1;
        return SUCCESS;
  }
  /* }}} */
  
  static PHP_MSHUTDOWN_FUNCTION(mcrypt) /* {{{ */
  {
 -      php_stream_filter_unregister_factory("mcrypt.*" TSRMLS_CC);
 -      php_stream_filter_unregister_factory("mdecrypt.*" TSRMLS_CC);
 +      php_stream_filter_unregister_factory("mcrypt.*");
 +      php_stream_filter_unregister_factory("mdecrypt.*");
  
+       if (MCG(fd[RANDOM]) > 0) {
+               close(MCG(fd[RANDOM]));
+       }
+       if (MCG(fd[URANDOM]) > 0) {
+               close(MCG(fd[URANDOM]));
+       }
        UNREGISTER_INI_ENTRIES();
        return SUCCESS;
  }
@@@ -1332,32 -1435,35 +1349,35 @@@ PHP_FUNCTION(mcrypt_create_iv
                BYTE *iv_b = (BYTE *) iv;
                if (php_win32_get_random_bytes(iv_b, (size_t) size) == FAILURE){
                        efree(iv);
 -                      php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not gather sufficient random data");
 +                      php_error_docref(NULL, E_WARNING, "Could not gather sufficient random data");
                        RETURN_FALSE;
                }
 -              n = size;
 +              n = (int)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, 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");
++                              php_error_docref(NULL, 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");
 +                      php_error_docref(NULL, E_WARNING, "Could not gather sufficient random data");
                        RETURN_FALSE;
                }
  #endif
Simple merge