summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gdbinit4
-rw-r--r--NEWS8490
-rwxr-xr-xUPGRADING420
-rw-r--r--UPGRADING.INTERNALS113
-rw-r--r--Zend/tests/bug30820.phpt1
-rw-r--r--Zend/tests/zend_signed_multiply-32bit.phpt14
-rw-r--r--Zend/tests/zend_signed_multiply-64bit.phpt14
-rw-r--r--Zend/zend.h2
-rw-r--r--Zend/zend_execute.c19
-rw-r--r--Zend/zend_hash.c45
-rw-r--r--Zend/zend_ini_scanner_defs.h26
-rw-r--r--Zend/zend_object_handlers.c2
-rw-r--r--Zend/zend_object_handlers.h5
-rw-r--r--Zend/zend_operators.c207
-rw-r--r--Zend/zend_operators.h18
-rw-r--r--Zend/zend_vm_def.h151
-rw-r--r--Zend/zend_vm_execute.h1540
-rw-r--r--Zend/zend_vm_gen.php37
-rw-r--r--configure.in4
-rw-r--r--ext/curl/interface.c2
-rw-r--r--ext/gd/gd.c12
-rw-r--r--ext/gd/libgd/gd.h3
-rw-r--r--ext/gd/libgd/gd_interpolation.c11
-rw-r--r--ext/gmp/gmp.c1275
-rw-r--r--ext/gmp/tests/004.phpt4
-rw-r--r--ext/gmp/tests/005.phpt2
-rw-r--r--ext/gmp/tests/006.phpt10
-rw-r--r--ext/gmp/tests/007.phpt142
-rw-r--r--ext/gmp/tests/008.phpt62
-rw-r--r--ext/gmp/tests/009.phpt82
-rw-r--r--ext/gmp/tests/010.phpt15
-rw-r--r--ext/gmp/tests/014.phpt7
-rw-r--r--ext/gmp/tests/016.phpt5
-rw-r--r--ext/gmp/tests/033.phpt6
-rw-r--r--ext/gmp/tests/034.phpt2
-rw-r--r--ext/gmp/tests/040.phpt5
-rw-r--r--ext/gmp/tests/cast.phpt22
-rw-r--r--ext/gmp/tests/clone.phpt22
-rw-r--r--ext/gmp/tests/comparison.phpt37
-rw-r--r--ext/gmp/tests/overloading.phpt259
-rw-r--r--ext/gmp/tests/serialize.phpt22
-rw-r--r--ext/hash/tests/hash_file_basic.phpt4
-rw-r--r--ext/hash/tests/hash_file_error.phpt4
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf8.c184
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf8.h1
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c185
-rw-r--r--ext/mbstring/tests/bug65045.phpt29
-rw-r--r--ext/opcache/Optimizer/compact_literals.c481
-rw-r--r--ext/opcache/Optimizer/optimize_func_calls.c138
-rw-r--r--ext/opcache/Optimizer/pass1_5.c82
-rw-r--r--ext/opcache/Optimizer/zend_optimizer.c193
-rw-r--r--ext/opcache/Optimizer/zend_optimizer.h6
-rw-r--r--ext/opcache/ZendAccelerator.c19
-rw-r--r--ext/opcache/ZendAccelerator.h1
-rw-r--r--ext/opcache/tests/compact_literals.phpt215
-rw-r--r--ext/opcache/tests/optimize_func_calls.phpt130
-rw-r--r--ext/openssl/openssl.c299
-rw-r--r--ext/openssl/php_openssl.h5
-rw-r--r--ext/openssl/tests/openssl_spki_export.phpt62
-rw-r--r--ext/openssl/tests/openssl_spki_export_challenge.phpt105
-rw-r--r--ext/openssl/tests/openssl_spki_new.phpt77
-rw-r--r--ext/openssl/tests/openssl_spki_verify.phpt105
-rw-r--r--ext/pdo/Makefile.frag3
-rw-r--r--ext/pdo/pdo_dbh.c2
-rw-r--r--ext/pdo/php_pdo_error.h47
-rw-r--r--ext/pdo/php_pdo_int.h15
-rw-r--r--ext/pdo_pgsql/pgsql_driver.c186
-rw-r--r--ext/pdo_pgsql/php_pdo_pgsql_int.h8
-rw-r--r--ext/pdo_pgsql/tests/copy_from.phpt31
-rw-r--r--ext/pdo_pgsql/tests/copy_to.phpt30
-rw-r--r--ext/pdo_pgsql/tests/getnotify.phpt109
-rw-r--r--ext/sockets/tests/ipv4loop.phpt13
-rw-r--r--ext/sockets/tests/ipv6loop.phpt13
-rw-r--r--ext/sockets/tests/socket_getpeername_ipv4loop.phpt24
-rw-r--r--ext/sockets/tests/socket_getpeername_ipv6loop.phpt24
-rw-r--r--ext/standard/basic_functions.c1
-rw-r--r--ext/standard/credits_ext.h4
-rw-r--r--ext/standard/dir.c4
-rw-r--r--ext/standard/tests/serialize/serialization_error_001.phpt6
-rw-r--r--ext/standard/tests/serialize/unserialize_consumed.phpt27
-rw-r--r--ext/standard/tests/url/parse_url_basic_001.phpt11
-rw-r--r--ext/standard/tests/url/parse_url_basic_002.phpt4
-rw-r--r--ext/standard/tests/url/parse_url_basic_003.phpt4
-rw-r--r--ext/standard/tests/url/parse_url_basic_004.phpt4
-rw-r--r--ext/standard/tests/url/parse_url_basic_005.phpt4
-rw-r--r--ext/standard/tests/url/parse_url_basic_006.phpt4
-rw-r--r--ext/standard/tests/url/parse_url_basic_007.phpt4
-rw-r--r--ext/standard/tests/url/parse_url_basic_008.phpt4
-rw-r--r--ext/standard/tests/url/parse_url_basic_009.phpt4
-rw-r--r--ext/standard/tests/url/urls.inc4
-rw-r--r--ext/standard/var.c10
-rw-r--r--ext/zip/php_zip.c2
-rw-r--r--ext/zlib/tests/gzseek_basic2.phpt4
-rw-r--r--ext/zlib/tests/gzseek_variation1.phpt4
-rw-r--r--ext/zlib/tests/gzseek_variation4.phpt4
-rw-r--r--ext/zlib/tests/gzseek_variation5.phpt4
-rw-r--r--ext/zlib/tests/gzseek_variation7.phpt4
-rw-r--r--main/main.c4
-rw-r--r--main/php_version.h8
-rw-r--r--php.ini-development52
-rw-r--r--php.ini-production53
-rw-r--r--win32/time.h2
102 files changed, 5187 insertions, 11002 deletions
diff --git a/.gdbinit b/.gdbinit
index e7a565dfa9..b14b03da9f 100644
--- a/.gdbinit
+++ b/.gdbinit
@@ -106,7 +106,7 @@ define dump_bt
printf "%ld", $zvalue->value.lval
end
if $type == 2
- printf "%lf", $zvalue->value.dval
+ printf "%f", $zvalue->value.dval
end
if $type == 3
if $zvalue->value.lval
@@ -185,7 +185,7 @@ define ____printzv_contents
printf "long: %ld", $zvalue->value.lval
end
if $type == 2
- printf "double: %lf", $zvalue->value.dval
+ printf "double: %f", $zvalue->value.dval
end
if $type == 3
printf "bool: "
diff --git a/NEWS b/NEWS
index 5422b0bd06..076a0c1819 100644
--- a/NEWS
+++ b/NEWS
@@ -1,8481 +1,27 @@
PHP NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-?? ??? 2013, PHP 5.5.1
+?? ??? 201?, PHP 5.6.0
- Core:
- . Fixed bug #65254 (Exception not catchable when exception thrown in autoload
- with a namespace). (Laruence)
- . Fixed bug #65088 (Generated configure script is malformed on OpenBSD).
- (Adam)
- . Fixed bug #65108 (is_callable() triggers Fatal Error).
- (David Soria Parra, Laruence)
- . Fixed bug #65035 (yield / exit segfault). (Nikita)
- . Fixed bug #65161 (Generator + autoload + syntax error = segfault). (Nikita)
- . hex2bin() raises E_WARNING for invalid hex string. (Yasuo)
- . Fixed bug #65226 (chroot() does not get enabled). (Anatol)
+ . Improved IS_VAR operands fetching. (Laruence, Dmitry)
+ . Implemented internal operator overloading
+ (RFC: https://wiki.php.net/rfc/operator_overloading_gmp). (Nikita)
-- OPcache
- . Fixed bug #64827 (Segfault in zval_mark_grey (zend_gc.c)). (Laruence)
- . OPcache must be compatible with LiteSpeed SAPI (Dmitry)
-
-- CGI:
- . Fixed Bug #65143 (Missing php-cgi man page). (Remi)
-
-- CLI server:
- . Fixed bug #65066 (Cli server not responsive when responding with 422 http
- status code). (Adam)
-
-- DateTime
- . Fixed fug #65184 (strftime() returns insufficient-length string under
- multibyte locales). (Anatol)
-
-- GD
- . Fixed #65070 (bgcolor does not use the same format as the input image with
- imagerotate). (Pierre)
- . Fixed Bug #65060 (imagecreatefrom... crashes with user streams). (Remi)
- . Fixed Bug #65084 (imagecreatefromjpeg fails with URL). (Remi)
- . Fix gdImageCreateFromWebpCtx and use same logic to load WebP image
- that other formats. (Remi)
-
-- Intl:
- . Add IntlCalendar::setMinimalDaysInFirstWeek()/
- intlcal_set_minimal_days_in_first_week().
- . Fixed trailing space in the name of constant IntlCalendar::FIELD_FIELD_COUNT.
- . Fixed bug #62759 (Buggy grapheme_substr() on edge case). (Stas)
- . Fixed bug #61860 (Offsets may be wrong for grapheme_stri* functions).
- (Stas)
-
-- OCI8:
- . Bump PECL package info version check to allow PECL installs with PHP 5.5+
-
-- PDO:
- . Allowed PDO_OCI to compile with Oracle Database 12c client libraries.
- (Chris Jones)
-
-- Pgsql
- . pg_unescape_bytea() raises E_WARNING for invalid inputs. (Yasuo)
-
-- Phar:
- . Fixed Bug #65142 (Missing phar man page). (Remi)
-
-- Session:
- . Added optional create_sid() argument to session_set_save_handler(),
- SessionHandler and new SessionIdInterface. (Leigh, Arpad)
-
-- Sockets:
- . Implemented FR #63472 (Setting SO_BINDTODEVICE with socket_set_option).
- (Damjan Cvetko)
-
-- SPL:
- . Fixed bug #65136 (RecursiveDirectoryIterator segfault). (Laruence)
- . Fixed bug #61828 (Memleak when calling Directory(Recursive)Iterator
- /Spl(Temp)FileObject ctor twice). (Laruence)
-
-- CGI/FastCGI SAPI:
- . Added PHP_FCGI_BACKLOG, overrides the default listen backlog. (Arnaud Le
- Blanc)
-
-20 Jun 2013, PHP 5.5.0
-
-- Core:
- . Added Zend Opcache extension and enable building it by default.
- More details here: https://wiki.php.net/rfc/optimizerplus. (Dmitry)
- . Added generators and coroutines (https://wiki.php.net/rfc/generators).
- (Nikita Popov)
- . Added "finally" keyword (https://wiki.php.net/rfc/finally). (Laruence)
- . Added simplified password hashing API
- (https://wiki.php.net/rfc/password_hash). (Anthony Ferrara)
- . Added support for constant array/string dereferencing. (Laruence)
- . Added array_column function which returns a column in a multidimensional
- array. https://wiki.php.net/rfc/array_column. (Ben Ramsey)
- . Added boolval(). (Jille Timmermans)
- . Added "Z" option to pack/unpack. (Gustavo)
- . Added Generator::throw() method. (Nikita Popov)
- . Added Class Name Resolution As Scalar Via "class" Keyword.
- (Ralph Schindler, Nikita Popov, Lars)
- . Added optional second argument for assert() to specify custom message. Patch
- by Lonny Kapelushnik (lonny@lonnylot.com). (Lars)
- . Added support for using empty() on the result of function calls and
- other expressions (https://wiki.php.net/rfc/empty_isset_exprs).
- (Nikita Popov)
- . Added support for non-scalar Iterator keys in foreach
- (https://wiki.php.net/rfc/foreach-non-scalar-keys). (Nikita Popov)
- . Added support for list in foreach (https://wiki.php.net/rfc/foreachlist).
- (Laruence)
- . Added support for changing the process's title in CLI/CLI-Server SAPIs.
- The implementation is more robust that the proctitle PECL module. More
- details here: https://wiki.php.net/rfc/cli_process_title. (Keyur)
- . Added ARMv7/v8 versions of various Zend arithmetic functions that are
- implemented using inline assembler (Ard Biesheuvel)
- . Added systemtap support by enabling systemtap compatible dtrace probes on
- linux. (David Soria Parra)
- . Optimized access to temporary and compiled VM variables. 8% less memory
- reads. (Dmitry)
- . The VM stacks for passing function arguments and syntaticaly nested calls
- were merged into a single stack. The stack size needed for op_array
- execution is calculated at compile time and preallocated at once. As result
- all the stack push operatins don't require checks for stack overflow
- any more. (Dmitry)
- . Improve set_exception_handler while doing reset. (Laruence)
- . Return previous handler when passing NULL to set_error_handler and
- set_exception_handler. (Nikita Popov)
- . Remove php_logo_guid(), php_egg_logo_guid(), php_real_logo_guid(),
- zend_logo_guid(). (Adnrew Faulds)
- . Drop Windows XP and 2003 support. (Pierre)
- . Implemented FR #64175 (Added HTTP codes as of RFC 6585). (Jonh Wendell)
- . Implemented FR #60738 (Allow 'set_error_handler' to handle NULL).
- (Laruence, Nikita Popov)
- . Implemented FR #60524 (specify temp dir by php.ini). (ALeX Kazik).
- . Implemented FR #46487 (Dereferencing process-handles no longer waits on
- those processes). (Jille Timmermans)
- . Fixed bug #65051 (count() off by one inside unset()). (Nikita)
- . Fixed bug #64988 (Class loading order affects E_STRICT warning). (Laruence)
- . Fixed bug #64966 (segfault in zend_do_fcall_common_helper_SPEC). (Laruence)
- . Fixed bug #64960 (Segfault in gc_zval_possible_root). (Laruence)
- . Fixed bug #64936 (doc comments picked up from previous scanner run). (Stas,
- Jonathan Oddy)
- . Fixed bug #64934 (Apache2 TS crash with get_browser()). (Anatol)
- . Fixed bug #64879 (Heap based buffer overflow in quoted_printable_encode,
- CVE 2013-2110). (Stas)
- . Fixed bug #64853 (Use of no longer available ini directives causes crash
- on TS build). (Anatol)
- . Fixed bug #64821 (Custom Exceptions crash when internal properties overridden).
- (Anatol)
- . Fixed bug #64720 (SegFault on zend_deactivate). (Dmitry)
- . Fixed bug #64677 (execution operator `` stealing surrounding arguments).
- . Fixed bug #64660 (Segfault on memory exhaustion within function definition).
- (Stas, reported by Juha Kylmänen)
- . Fixed bug #64578 (debug_backtrace in set_error_handler corrupts zend heap:
- segfault). (Laruence)
- . Fixed bug #64565 (copy doesn't report failure on partial copy). (Remi)
- . Fixed bug #64555 (foreach no longer copies keys if they are interned).
- (Nikita Popov)
- . Fixed bugs #47675 and #64577 (fd leak on Solaris)
- . Fixed bug #64544 (Valgrind warnings after using putenv). (Laruence)
- . Fixed bug #64515 (Memoryleak when using the same variablename 2times in
- function declaration). (Laruence)
- . Fixed bug #64503 (Compilation fails with error: conflicting types for
- 'zendparse'). (Laruence)
- . Fixed bug #64239 (Debug backtrace changed behavior since 5.4.10 or 5.4.11).
- (Dmitry, Laruence)
- . Fixed bug #64523, allow XOR in php.ini. (Dejan Marjanovic, Lars)
- . Fixed bug #64354 (Unserialize array of objects whose class can't
- be autoloaded fail). (Laruence)
- . Fixed bug #64370 (microtime(true) less than $_SERVER['REQUEST_TIME_FLOAT']).
- (Anatol)
- . Fixed bug #64166 (quoted-printable-encode stream filter incorrectly
- discarding whitespace). (Michael M Slusarz)
- (Laruence)
- . Fixed bug #64142 (dval to lval different behavior on ppc64). (Remi)
- . Fixed bug #64135 (Exceptions from set_error_handler are not always
- propagated). (Laruence)
- . Fixed bug #63980 (object members get trimmed by zero bytes). (Laruence)
- . Fixed bug #63874 (Segfault if php_strip_whitespace has heredoc). (Pierrick)
- . Fixed bug #63830 (Segfault on undefined function call in nested generator).
- (Nikita Popov)
- . Fixed bug #63822 (Crash when using closures with ArrayAccess).
- (Nikita Popov)
- . Fixed bug #61681 (Malformed grammar). (Nikita Popov, Etienne, Laruence)
- . Fixed bug #61038 (unpack("a5", "str\0\0") does not work as expected).
- (srgoogleguy, Gustavo)
- . Fixed bug #61025 (__invoke() visibility not honored). (Laruence)
- . Fixed bug #60833 (self, parent, static behave inconsistently
- case-sensitive). (Stas, mario at include-once dot org)
- . Fixed Bug #52126: timestamp for mail.log (Martin Jansen, Lars)
- . Fixed bug #49348 (Uninitialized ++$foo->bar; does not cause a notice).
- (Stas)
- . Fixed Bug #23955: allow specifying Max-Age attribute in setcookie() (narfbg, Lars)
- . Fixed bug #18556 (Engine uses locale rules to handle class names). (Stas)
- . Fix undefined behavior when converting double variables to integers.
- The double is now always rounded towards zero, the remainder of its division
- by 2^32 or 2^64 (depending on sizeof(long)) is calculated and it's made
- signed assuming a two's complement representation. (Gustavo)
- . Drop support for bison < 2.4 when building PHP from GIT source.
- (Laruence)
-
-- Apache2 Handler SAPI:
- . Enabled Apache 2.4 configure option for Windows (Pierre, Anatoliy)
-
-- Calendar:
- . Fixed bug #64895 (Integer overflow in SndToJewish). (Remi)
- . Fixed bug #54254 (cal_from_jd returns month = 6 when there is only one Adar)
- (Stas, Eitan Mosenkis)
-
-- CLI server:
- . Fixed bug #64128 (buit-in web server is broken on ppc64). (Remi)
-
-- CURL:
- . Remove curl stream wrappers. (Pierrick)
- . Implemented FR #46439 - added CURLFile for safer file uploads.
- (Stas)
- . Added support for CURLOPT_FTP_RESPONSE_TIMEOUT, CURLOPT_APPEND,
- CURLOPT_DIRLISTONLY, CURLOPT_NEW_DIRECTORY_PERMS, CURLOPT_NEW_FILE_PERMS,
- CURLOPT_NETRC_FILE, CURLOPT_PREQUOTE, CURLOPT_KRBLEVEL, CURLOPT_MAXFILESIZE,
- CURLOPT_FTP_ACCOUNT, CURLOPT_COOKIELIST, CURLOPT_IGNORE_CONTENT_LENGTH,
- CURLOPT_CONNECT_ONLY, CURLOPT_LOCALPORT, CURLOPT_LOCALPORTRANGE,
- CURLOPT_FTP_ALTERNATIVE_TO_USER, CURLOPT_SSL_SESSIONID_CACHE,
- CURLOPT_FTP_SSL_CCC, CURLOPT_HTTP_CONTENT_DECODING,
- CURLOPT_HTTP_TRANSFER_DECODING, CURLOPT_PROXY_TRANSFER_MODE,
- CURLOPT_ADDRESS_SCOPE, CURLOPT_CRLFILE, CURLOPT_ISSUERCERT,
- CURLOPT_USERNAME, CURLOPT_PASSWORD, CURLOPT_PROXYUSERNAME,
- CURLOPT_PROXYPASSWORD, CURLOPT_NOPROXY, CURLOPT_SOCKS5_GSSAPI_NEC,
- CURLOPT_SOCKS5_GSSAPI_SERVICE, CURLOPT_TFTP_BLKSIZE,
- CURLOPT_SSH_KNOWNHOSTS, CURLOPT_FTP_USE_PRET, CURLOPT_MAIL_FROM,
- CURLOPT_MAIL_RCPT, CURLOPT_RTSP_CLIENT_CSEQ, CURLOPT_RTSP_SERVER_CSEQ,
- CURLOPT_RTSP_SESSION_ID, CURLOPT_RTSP_STREAM_URI, CURLOPT_RTSP_TRANSPORT,
- CURLOPT_RTSP_REQUEST, CURLOPT_RESOLVE, CURLOPT_ACCEPT_ENCODING,
- CURLOPT_TRANSFER_ENCODING, CURLOPT_DNS_SERVERS and CURLOPT_USE_SSL.
- (Pierrick)
- . Fixed bug #55635 (CURLOPT_BINARYTRANSFER no longer used. The constant
- still exists for backward compatibility but is doing nothing). (Pierrick)
- . Fixed bug #54995 (Missing CURLINFO_RESPONSE_CODE support). (Pierrick)
-
-- DateTime
- . Added DateTimeImmutable - a variant of DateTime that only returns the
- modified state instead of changing itself. (Derick)
- . Added new functions curl_escape, curl_multi_setopt, curl_multi_strerror
- curl_pause, curl_reset, curl_share_close, curl_share_init,
- curl_share_setopt curl_strerror and curl_unescape. (Pierrick)
- . Addes new curl options CURLOPT_TELNETOPTIONS, CURLOPT_GSSAPI_DELEGATION,
- CURLOPT_ACCEPTTIMEOUT_MS, CURLOPT_SSL_OPTIONS, CURLOPT_TCP_KEEPALIVE,
- CURLOPT_TCP_KEEPIDLE and CURLOPT_TCP_KEEPINTVL. (Pierrick)
- . Fixed bug #64825 (Invalid free when unserializing DateTimeZone).
- (Anatol)
- . Fixed bug #64359 (strftime crash with VS2012). (Anatol)
- . Fixed bug #62852 (Unserialize Invalid Date causes crash). (Anatol)
- . Fixed bug #61642 (modify("+5 weekdays") returns Sunday).
- (Dmitri Iouchtchenko)
- . Fixed bug #60774 (DateInterval::format("%a") is always zero when an
- interval is created using the createFromDateString method) (Lonny
- Kapelushnik, Derick)
- . Fixed bug #54567 (DateTimeZone serialize/unserialize) (Lonny
- Kapelushnik, Derick)
- . Fixed bug #53437 (Crash when using unserialized DatePeriod instance).
- (Gustavo, Derick, Anatol)
-
-- dba:
- . Bug #62489: dba_insert not working as expected.
- (marc-bennewitz at arcor dot de, Lars)
-
-- Filter:
- . Implemented FR #49180 - added MAC address validation. (Martin)
-
-- Fileinfo:
- . Upgraded libmagic to 5.14. (Anatol)
- . Fixed bug #64830 (mimetype detection segfaults on mp3 file). (Anatol)
- . Fixed bug #63590 (Different results in TS and NTS under Windows).
- (Anatoliy)
- . Fixed bug #63248 (Load multiple magic files from a directory under Windows).
- (Anatoliy)
-
-- FPM:
- . Add --with-fpm-systemd option to report health to systemd, and
- systemd_interval option to configure this. The service can now use
- Type=notify in the systemd unit file. (Remi)
- . Ignore QUERY_STRING when sent in SCRIPT_FILENAME. (Remi)
- . Log a warning when a syscall fails. (Remi)
- . Implemented FR #64764 (add support for FPM init.d script). (Lior Kaplan)
- . Fixed Bug #64915 (error_log ignored when daemonize=0). (Remi)
- . Fixed bug #63999 (php with fpm fails to build on Solaris 10 or 11). (Adam)
- . Fixed some possible memory or resource leaks and possible null dereference
- detected by code coverity scan. (Remi)
-
-- GD:
- . Fixed Bug #64962 (imagerotate produces corrupted image). (Remi)
- . Fixed Bug #64961 (segfault in imagesetinterpolation). (Remi)
- . Fix build with system libgd >= 2.1 which is now the minimal
- version required (as build with previous version is broken).
- No change when bundled libgd is used. (Ondrej Sury, Remi)
-
-- Hash:
- . Added support for PBKDF2 via hash_pbkdf2(). (Anthony Ferrara)
- . Fixed Bug #64745 (hash_pbkdf2() truncates data when using default length
- and hex output). (Anthony Ferrara)
-
-- Intl:
- . Added UConverter wrapper.
- . The intl extension now requires ICU 4.0+.
- . Added intl.use_exceptions INI directive, which controls what happens when
- global errors are set together with intl.error_level. (Gustavo)
- . MessageFormatter::format() and related functions now accepted named
- arguments and mixed numeric/named arguments in ICU 4.8+. (Gustavo)
- . MessageFormatter::format() and related functions now don't error out when
- an insufficient argument count is provided. Instead, the placeholders will
- remain unsubstituted. (Gustavo)
- . MessageFormatter::parse() and MessageFormat::format() (and their static
- equivalents) don't throw away better than second precision in the arguments.
- (Gustavo)
- . IntlDateFormatter::__construct and datefmt_create() now accept for the
- $timezone argument time zone identifiers, IntlTimeZone objects, DateTimeZone
- objects and NULL. (Gustavo)
- . IntlDateFormatter::__construct and datefmt_create() no longer accept invalid
- timezone identifiers or empty strings. (Gustavo)
- . The default time zone used in IntlDateFormatter::__construct and
- datefmt_create() (when the corresponding argument is not passed or NULL is
- passed) is now the one given by date_default_timezone_get(), not the
- default ICU time zone. (Gustavo)
- . The time zone passed to the IntlDateFormatter is ignored if it is NULL and
- if the calendar passed is an IntlCalendar object -- in this case, the
- IntlCalendar's time zone will be used instead. Otherwise, the time zone
- specified in the $timezone argument is used instead. This does not affect
- old code, as IntlCalendar was introduced in this version. (Gustavo)
- . IntlDateFormatter::__construct and datefmt_create() now accept for the
- $calendar argument also IntlCalendar objects. (Gustavo)
- . IntlDateFormatter::getCalendar() and datefmt_get_calendar() return false
- if the IntlDateFormatter was set up with an IntlCalendar instead of the
- constants IntlDateFormatter::GREGORIAN/TRADITIONAL. IntlCalendar did not
- exist before this version. (Gustavo)
- . IntlDateFormatter::setCalendar() and datefmt_set_calendar() now also accept
- an IntlCalendar object, in which case its time zone is taken. Passing a
- constant is still allowed, and still keeps the time zone. (Gustavo)
- . IntlDateFormatter::setTimeZoneID() and datefmt_set_timezone_id() are
- deprecated. Use IntlDateFormatter::setTimeZone() or datefmt_set_timezone()
- instead. (Gustavo)
- . IntlDateFormatter::format() and datefmt_format() now also accept an
- IntlCalendar object for formatting. (Gustavo)
- . Added the classes: IntlCalendar, IntlGregorianCalendar, IntlTimeZone,
- IntlBreakIterator, IntlRuleBasedBreakIterator and
- IntlCodePointBreakIterator. (Gustavo)
- . Added the functions: intlcal_get_keyword_values_for_locale(),
- intlcal_get_now(), intlcal_get_available_locales(), intlcal_get(),
- intlcal_get_time(), intlcal_set_time(), intlcal_add(),
- intlcal_set_time_zone(), intlcal_after(), intlcal_before(), intlcal_set(),
- intlcal_roll(), intlcal_clear(), intlcal_field_difference(),
- intlcal_get_actual_maximum(), intlcal_get_actual_minimum(),
- intlcal_get_day_of_week_type(), intlcal_get_first_day_of_week(),
- intlcal_get_greatest_minimum(), intlcal_get_least_maximum(),
- intlcal_get_locale(), intlcal_get_maximum(),
- intlcal_get_minimal_days_in_first_week(), intlcal_get_minimum(),
- intlcal_get_time_zone(), intlcal_get_type(),
- intlcal_get_weekend_transition(), intlcal_in_daylight_time(),
- intlcal_is_equivalent_to(), intlcal_is_lenient(), intlcal_is_set(),
- intlcal_is_weekend(), intlcal_set_first_day_of_week(),
- intlcal_set_lenient(), intlcal_equals(),
- intlcal_get_repeated_wall_time_option(),
- intlcal_get_skipped_wall_time_option(),
- intlcal_set_repeated_wall_time_option(),
- intlcal_set_skipped_wall_time_option(), intlcal_from_date_time(),
- intlcal_to_date_time(), intlcal_get_error_code(),
- intlcal_get_error_message(), intlgregcal_create_instance(),
- intlgregcal_set_gregorian_change(), intlgregcal_get_gregorian_change() and
- intlgregcal_is_leap_year(). (Gustavo)
- . Added the functions: intltz_create_time_zone(), intltz_create_default(),
- intltz_get_id(), intltz_get_gmt(), intltz_get_unknown(),
- intltz_create_enumeration(), intltz_count_equivalent_ids(),
- intltz_create_time_zone_id_enumeration(), intltz_get_canonical_id(),
- intltz_get_region(), intltz_get_tz_data_version(),
- intltz_get_equivalent_id(), intltz_use_daylight_time(), intltz_get_offset(),
- intltz_get_raw_offset(), intltz_has_same_rules(), intltz_get_display_name(),
- intltz_get_dst_savings(), intltz_from_date_time_zone(),
- intltz_to_date_time_zone(), intltz_get_error_code(),
- intltz_get_error_message(). (Gustavo)
- . Added the methods: IntlDateFormatter::formatObject(),
- IntlDateFormatter::getCalendarObject(), IntlDateFormatter::getTimeZone(),
- IntlDateFormatter::setTimeZone(). (Gustavo)
- . Added the functions: datefmt_format_object(), datefmt_get_calendar_object(),
- datefmt_get_timezone(), datefmt_set_timezone(),
- datefmt_get_calendar_object(), intlcal_create_instance(). (Gustavo)
-
-- mbstring:
- . Fixed bug #64769 (mbstring PHPTs crash on Windows x64). (Anatol)
-
-- MCrypt
- . mcrypt_ecb(), mcrypt_cbc(), mcrypt_cfb() and mcrypt_ofb() now throw
- E_DEPRECATED. (GoogleGuy)
-
-- mysql
- . This extension is now deprecated, and deprecation warnings will be generated
- when connections are established to databases via mysql_connect(),
- mysql_pconnect(), or through implicit connection: use MySQLi or PDO_MySQL
- instead (https://wiki.php.net/rfc/mysql_deprecation). (Adam)
- . Dropped support for LOAD DATA LOCAL INFILE handlers when using libmysql.
- Known for stability problems. (Andrey)
- . Added support for SHA256 authentication available with MySQL 5.6.6+.
- (Andrey)
-
-- mysqli:
- . Added mysqli_begin_transaction()/mysqli::begin_transaction(). Implemented
- all options, per MySQL 5.6, which can be used with START TRANSACTION, COMMIT
- and ROLLBACK through options to mysqli_commit()/mysqli_rollback() and their
- respective OO counterparts. They work in libmysql and mysqlnd mode. (Andrey)
- . Added mysqli_savepoint(), mysqli_release_savepoint(). (Andrey)
- . Fixed bug #64726 (Segfault when calling fetch_object on a use_result and DB
- pointer has closed). (Laruence)
- . Fixed bug #64394 (MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS undeclared when
- using Connector/C). (Andrey)
-
-- mysqlnd
- . Add new begin_transaction() call to the connection object. Implemented all
- options, per MySQL 5.6, which can be used with START TRANSACTION, COMMIT
- and ROLLBACK. (Andrey)
- . Added mysqlnd_savepoint(), mysqlnd_release_savepoint(). (Andrey)
- . Fixed bug #63530 (mysqlnd_stmt::bind_one_parameter crashes, uses wrong alloc
- for stmt->param_bind). (Andrey)
- . Fixed return value of mysqli_stmt_affected_rows() in the time after
- prepare() and before execute(). (Andrey)
-
-- PCRE:
- . Merged PCRE 8.32. (Anatol)
- . Deprecated the /e modifier
- (https://wiki.php.net/rfc/remove_preg_replace_eval_modifier). (Nikita Popov)
- . Fixed bug #63284 (Upgrade PCRE to 8.31). (Anatoliy)
-
-- PDO:
- . Fixed bug #63176 (Segmentation fault when instantiate 2 persistent PDO to
- the same db server). (Laruence)
-
-- PDO_DBlib:
- . Fixed bug #63638 (Cannot connect to SQL Server 2008 with PDO dblib).
- (Stanley Sufficool)
- . Fixed bug #64338 (pdo_dblib can't connect to Azure SQL). (Stanley
- Sufficool)
- . Fixed bug #64808 (FreeTDS PDO getColumnMeta on a prepared but not executed
- statement crashes). (Stanley Sufficool)
+- OPcache:
+ . Added an optimization pass to convert FCALL_BY_NAME into DO_FCALL.
+ (Laruence, Dmitry)
+ . Added an optimization pass to merged identical constants (and related
+ cache_slots) in op_array->literals table. (Laruence, Dmitry)
+ . Added script level constant replacement optimization pass. (Dmitry)
- PDO_pgsql:
- . Fixed Bug #64949 (Buffer overflow in _pdo_pgsql_error). (Remi)
-
-- PDO_mysql:
- . Fixed bug #48724 (getColumnMeta() doesn't return native_type for BIT,
- TINYINT and YEAR). (Antony, Daniel Beardsley)
-
-- pgsql:
- . Added pg_escape_literal() and pg_escape_identifier() (Yasuo)
- . Bug #46408: Locale number format settings can cause pg_query_params to
- break with numerics. (asmecher, Lars)
-
-- Phar:
- . Fixed timestamp update on Phar contents modification. (Dmitry)
-
-- Readline:
- . Implement FR #55694 (Expose additional readline variable to prevent
- default filename completion). (Hartmel)
-
-- Reflection:
- . Fixed bug #64007 (There is an ability to create instance of Generator by
- hand). (Laruence)
-
-- Sockets:
- . Added recvmsg() and sendmsg() wrappers. (Gustavo)
- See https://wiki.php.net/rfc/sendrecvmsg
- . Fixed bug #64508 (Fails to build with --disable-ipv6). (Gustavo)
- . Fixed bug #64287 (sendmsg/recvmsg shutdown handler causes segfault).
- (Gustavo)
-
-- SPL:
- . Fixed bug #64997 (Segfault while using RecursiveIteratorIterator on
- 64-bits systems). (Laruence)
- . Fixed bug #64264 (SPLFixedArray toArray problem). (Laruence)
- . Fixed bug #64228 (RecursiveDirectoryIterator always assumes SKIP_DOTS).
- (patch by kriss@krizalys.com, Laruence)
- . Fixed bug #64106 (Segfault on SplFixedArray[][x] = y when extended).
- (Nikita Popov)
- . Fix bug #60560 (SplFixedArray un-/serialize, getSize(), count() return 0,
- keys are strings). (Adam)
- . Fixed bug #52861 (unset fails with ArrayObject and deep arrays).
- (Mike Willbanks)
- . Implement FR #48358 (Add SplDoublyLinkedList::add() to insert an element
- at a given offset). (Mark Baker, David Soria Parra)
-
-- SNMP:
- . Fixed bug #64765 (Some IPv6 addresses get interpreted wrong).
- (Boris Lytochkin)
- . Fixed bug #64159 (Truncated snmpget). (Boris Lytochkin)
- . Fixed bug #64124 (IPv6 malformed). (Boris Lytochkin)
- . Fixed bug #61981 (OO API, walk: $suffix_as_key is not working correctly).
- (Boris Lytochkin)
-
-- SOAP:
- . Added SoapClient constructor option 'ssl_method' to specify ssl method.
- (Eric Iversen)
-
-- Streams:
- . Fixed bug #64770 (stream_select() fails with pipes returned by proc_open()
- on Windows x64). (Anatol)
- . Fixed Windows x64 version of stream_socket_pair() and improved error
- handling. (Anatol Belski)
-
-- Tokenizer:
- . Fixed bug #60097 (token_get_all fails to lex nested heredoc). (Nikita Popov)
-
-- Zip:
- . Upgraded libzip to 0.10.1 (Anatoliy)
- . Bug #64452 (Zip crash intermittently). (Anatol)
- . Fixed bug #64342 (ZipArchive::addFile() has to check for file existence).
- (Anatol)
-
-06 Jun 2013, PHP 5.4.16
-
-- Core:
- . Fixed bug #64879 (Heap based buffer overflow in quoted_printable_encode,
- CVE 2013-2110). (Stas)
- . Fixed bug #64853 (Use of no longer available ini directives causes crash on
- TS build). (Anatol)
- . Fixed bug #64729 (compilation failure on x32). (Gustavo)
- . Fixed bug #64720 (SegFault on zend_deactivate). (Dmitry)
- . Fixed bug #64660 (Segfault on memory exhaustion within function definition).
- (Stas, reported by Juha Kylmänen)
-
-- Calendar:
- . Fixed bug #64895 (Integer overflow in SndToJewish). (Remi)
-
-- Fileinfo:
- . Fixed bug #64830 (mimetype detection segfaults on mp3 file). (Anatol)
-
-- FPM:
- . Ignore QUERY_STRING when sent in SCRIPT_FILENAME. (Remi)
- . Fixed some possible memory or resource leaks and possible null dereference
- detected by code coverity scan. (Remi)
- . Log a warning when a syscall fails. (Remi)
- . Add --with-fpm-systemd option to report health to systemd, and
- systemd_interval option to configure this. The service can now use
- Type=notify in the systemd unit file. (Remi)
-
-- MySQLi
- . Fixed bug #64726 (Segfault when calling fetch_object on a use_result and DB
- pointer has closed). (Laruence)
-
-- Phar
- . Fixed bug #64214 (PHAR PHPTs intermittently crash when run on DFS, SMB or
- with non std tmp dir). (Pierre)
-
-- SNMP:
- . Fixed bug #64765 (Some IPv6 addresses get interpreted wrong).
- (Boris Lytochkin)
- . Fixed bug #64159 (Truncated snmpget). (Boris Lytochkin)
-
-- Streams:
- . Fixed bug #64770 (stream_select() fails with pipes returned by proc_open()
- on Windows x64). (Anatol)
-
-- Zend Engine:
- . Fixed bug #64821 (Custom Exceptions crash when internal properties
- overridden). (Anatol)
-
-09 May 2013, PHP 5.4.15
-- Core:
- . Fixed bug #64578 (debug_backtrace in set_error_handler corrupts zend heap:
- segfault). (Laruence)
- . Fixed bug #64458 (dns_get_record result with string of length -1). (Stas)
- . Fixed bug #64433 (follow_location parameter of context is ignored for most
- response codes). (Sergey Akbarov)
- . Fixed bugs #47675 and #64577 (fd leak on Solaris)
-
-- Fileinfo:
- . Upgraded libmagic to 5.14. (Anatol)
-
-- MySQLi:
- . Fixed bug #64726 (Segfault when calling fetch_object on a use_result and DB
- pointer has closed). (Laruence)
-
-- Zip:
- . Fixed bug #64342 (ZipArchive::addFile() has to check for file existence).
- (Anatol)
-
-- Streams:
- . Fixed Windows x64 version of stream_socket_pair() and improved error
- handling. (Anatol Belski)
- . Fixed bug #64770 (stream_select() fails with pipes returned by proc_open()
- on Windows x64). (Anatol)
-
-11 Apr 2013, PHP 5.4.14
-
-- Core:
- . Fixed bug #64529 (Ran out of opcode space). (Dmitry)
- . Fixed bug #64515 (Memoryleak when using the same variablename two times in
- function declaration). (Laruence)
- . Fixed bug #64432 (more empty delimiter warning in strX methods). (Laruence)
- . Fixed bug #64417 (ArrayAccess::&offsetGet() in a trait causes fatal error).
- (Dmitry)
- . Fixed bug #64370 (microtime(true) less than $_SERVER['REQUEST_TIME_FLOAT']).
- (Anatol)
- . Fixed bug #64239 (Debug backtrace changed behavior since 5.4.10 or 5.4.11).
- (Dmitry, Laruence)
- . Fixed bug #63976 (Parent class incorrectly using child constant in class
- property). (Dmitry)
- . Fixed bug #63914 (zend_do_fcall_common_helper_SPEC does not handle
- exceptions properly). (Jeff Welch)
- . Fixed bug #62343 (Show class_alias In get_declared_classes()) (Dmitry)
-
-- PCRE:
- . Merged PCRE 8.32. (Anatol)
-
-- SNMP:
- . Fixed bug #61981 (OO API, walk: $suffix_as_key is not working correctly).
- (Boris Lytochkin)
-
-- Zip:
- . Bug #64452 (Zip crash intermittently). (Anatol)
-
-14 Mar 2013, PHP 5.4.13
-
-- Core:
- . Fixed bug #64354 (Unserialize array of objects whose class can't
- be autoloaded fail). (Laruence)
- . Fixed bug #64235 (Insteadof not work for class method in 5.4.11).
- (Laruence)
- . Fixed bug #64197 (_Offsetof() macro used but not defined on ARM/Clang).
- (Ard Biesheuvel)
- . Implemented FR #64175 (Added HTTP codes as of RFC 6585). (Jonh Wendell)
- . Fixed bug #64142 (dval to lval different behavior on ppc64). (Remi)
- . Fixed bug #64070 (Inheritance with Traits failed with error). (Dmitry)
-
-- CLI server:
- . Fixed bug #64128 (buit-in web server is broken on ppc64). (Remi)
-
-- Mbstring:
- . mb_split() can now handle empty matches like preg_split() does. (Moriyoshi)
-
-- mysqlnd
- . Fixed bug #63530 (mysqlnd_stmt::bind_one_parameter crashes, uses wrong alloc
- for stmt->param_bind). (Andrey)
-
-- OpenSSL:
- . New SSL stream context option to prevent CRIME attack vector. (Daniel Lowrey,
- Lars)
- . Fixed bug #61930 (openssl corrupts ssl key resource when using
- openssl_get_publickey()). (Stas)
-
-- PDO_mysql:
- . Fixed bug #60840 (undefined symbol: mysqlnd_debug_std_no_trace_funcs).
- (Johannes)
-
-- Phar:
- . Fixed timestamp update on Phar contents modification. (Dmitry)
-
-- SOAP
- . Added check that soap.wsdl_cache_dir conforms to open_basedir
- (CVE-2013-1635). (Dmitry)
- . Disabled external entities loading (CVE-2013-1643, CVE-2013-1824).
- (Dmitry)
-
-- Phar:
- . Fixed timestamp update on Phar contents modification. (Dmitry)
-
-- SPL:
- . Fixed bug #64264 (SPLFixedArray toArray problem). (Laruence)
- . Fixed bug #64228 (RecursiveDirectoryIterator always assumes SKIP_DOTS).
- (patch by kriss@krizalys.com, Laruence)
- . Fixed bug #64106 (Segfault on SplFixedArray[][x] = y when extended).
- (Nikita Popov)
- . Fixed bug #52861 (unset fails with ArrayObject and deep arrays).
- (Mike Willbanks)
-
-- SNMP:
- . Fixed bug #64124 (IPv6 malformed). (Boris Lytochkin)
-
-21 Feb 2013, PHP 5.4.12
-
-- Core:
- . Fixed bug #64099 (Wrong TSRM usage in zend_Register_class alias). (Johannes)
- . Fixed bug #64011 (get_html_translation_table() output incomplete with
- HTML_ENTITIES and ISO-8859-1). (Gustavo)
- . Fixed bug #63982 (isset() inconsistently produces a fatal error on
- protected property). (Stas)
- . Fixed bug #63943 (Bad warning text from strpos() on empty needle).
- (Laruence)
- . Fixed bug #63899 (Use after scope error in zend_compile). (Laruence)
- . Fixed bug #63893 (Poor efficiency of strtr() using array with keys of very
- different length). (Gustavo)
- . Fixed bug #63882 (zend_std_compare_objects crash on recursion). (Dmitry)
- . Fixed bug #63462 (Magic methods called twice for unset protected
- properties). (Stas)
- . Fixed bug #62524 (fopen follows redirects for non-3xx statuses).
- (Wes Mason)
- . Support BITMAPV5HEADER in getimagesize(). (AsamK, Lars)
-
-- Date:
- . Fixed bug #63699 (Performance improvements for various ext/date functions).
- (Lars, original patch by njaguar at gmail dot com)
- . Fixed bug #55397: Comparsion of incomplete DateTime causes SIGSEGV.
- (Derick)
-
-- FPM:
- . Fixed bug #63999 (php with fpm fails to build on Solaris 10 or 11). (Adam)
-
-- Litespeed:
- . Fixed bug #63228 (-Werror=format-security error in lsapi code). (George)
-
-- ext/sqlite3:
- . Fixed bug #63921 (sqlite3::bindvalue and relative PHP functions aren't
- using sqlite3_*_int64 API). (srgoogleguy, Lars)
-
-- PDO_OCI
- . Fixed bug #57702 (Multi-row BLOB fetches). (hswong3i, Laruence)
- . Fixed bug #52958 (Segfault in PDO_OCI on cleanup after running a long
- testsuite). (hswong3i, Lars)
-
-- PDO_sqlite:
- . Fixed bug #63916 (PDO::PARAM_INT casts to 32bit int internally even
- on 64bit builds in pdo_sqlite). (srgoogleguy, Lars)
-
-17 Jan 2013, PHP 5.4.11
-
-- Core:
- . Fixed bug #63762 (Sigsegv when Exception::$trace is changed by user).
- (Johannes)
- . Fixed bug #43177 (Errors in eval()'ed code produce status code 500).
- (Todd Ruth, Stas).
-
-- Filter:
- . Fixed bug #63757 (getenv() produces memory leak with CGI SAPI). (Dmitry)
- . Fixed bug #54096 (FILTER_VALIDATE_INT does not accept +0 and -0).
- (martin at divbyzero dot net, Lars)
-
-- JSON:
- . Fixed bug #63737 (json_decode does not properly decode with options
- parameter). (Adam)
-
-- CLI server
- . Update list of common mime types. Added webm, ogv, ogg. (Lars,
- pascalc at gmail dot com)
-
-- cURL extension:
- . Fixed bug (segfault due to libcurl connection caching). (Pierrick)
- . Fixed bug #63859 (Memory leak when reusing curl-handle). (Pierrick)
- . Fixed bug #63795 (CURL >= 7.28.0 no longer support value 1 for
- CURLOPT_SSL_VERIFYHOST). (Pierrick)
- . Fixed bug #63352 (Can't enable hostname validation when using curl stream
- wrappers). (Pierrick)
- . Fixed bug #55438 (Curlwapper is not sending http header randomly).
- (phpnet@lostreality.org, Pierrick)
-
-20 Dec 2012, PHP 5.4.10
-
-- Core:
- . Fixed bug #63726 (Memleak with static properties and internal/user
- classes). (Laruence)
- . Fixed bug #63635 (Segfault in gc_collect_cycles). (Dmitry)
- . Fixed bug #63512 (parse_ini_file() with INI_SCANNER_RAW removes quotes
- from value). (Pierrick)
- . Fixed bug #63468 (wrong called method as callback with inheritance).
- (Laruence)
- . Fixed bug #63451 (config.guess file does not have AIX 7 defined,
- shared objects are not created). (kemcline at au1 dot ibm dot com)
- . Fixed bug #61557 (Crasher in tt-rss backend.php).
- (i dot am dot jack dot mail at gmail dot com)
- . Fixed bug #61272 (ob_start callback gets passed empty string).
- (Mike, casper at langemeijer dot eu)
-
-- Date:
- . Fixed bug #63666 (Poor date() performance). (Paul Taulborg).
- . Fixed bug #63435 (Datetime::format('u') sometimes wrong by 1 microsecond).
- (Remi)
-
-- Imap:
- . Fixed bug #63126 (DISABLE_AUTHENTICATOR ignores array). (Remi)
-
-- Json:
- . Fixed bug #63588 (use php_next_utf8_char and remove duplicate
- implementation). (Remi)
-
-- MySQLi:
- . Fixed bug #63361 (missing header). (Remi)
-
-- MySQLnd:
- . Fixed bug #63398 (Segfault when polling closed link). (Laruence)
-
-- Fileinfo:
- . Fixed bug #63590 (Different results in TS and NTS under Windows).
- (Anatoliy)
-
-- FPM:
- . Fixed bug #63581 Possible null dereference and buffer overflow (Remi)
-
-- Pdo_sqlite:
- . Fixed Bug #63149 getColumnMeta should return the table name
- when system SQLite used. (Remi)
-
-- Apache2 Handler SAPI:
- . Enabled Apache 2.4 configure option for Windows (Pierre, Anatoliy)
-
-- Reflection:
- . Fixed Bug #63614 (Fatal error on Reflection). (Laruence)
-
-- SOAP
- . Fixed bug #63271 (SOAP wsdl cache is not enabled after initial requests).
- (John Jawed, Dmitry)
-
-- Sockets
- . Fixed bug #49341 (Add SO_REUSEPORT support for socket_set_option()).
- (Igor Wiedler, Lars)
-
-- SPL
- . Fixed bug #63680 (Memleak in splfixedarray with cycle reference). (Laruence)
-
-22 Nov 2012, PHP 5.4.9
-
-- Core:
- . Fixed bug #63305 (zend_mm_heap corrupted with traits). (Dmitry, Laruence)
- . Fixed bug #63369 ((un)serialize() leaves dangling pointers, causes crashes).
- (Tony, Andrew Sitnikov)
- . Fixed bug #63241 (PHP fails to open Windows deduplicated files).
- (daniel dot stelter-gliese at innogames dot de)
- . Fixed bug #62444 (Handle leak in is_readable on windows).
- (krazyest at seznam dot cz)
-
-- Curl:
- . Fixed bug #63363 (Curl silently accepts boolean true for SSL_VERIFYHOST).
- Patch by John Jawed GitHub PR #221 (Anthony)
-
-- Fileinfo:
- . Fixed bug #63248 (Load multiple magic files from a directory under Windows).
- (Anatoliy)
-
-- Libxml
- . Fixed bug #63389 (Missing context check on libxml_set_streams_context()
- causes memleak). (Laruence)
-
-- Mbstring:
- . Fixed bug #63447 (max_input_vars doesn't filter variables when
- mbstring.encoding_translation = On). (Laruence)
-
-- OCI8:
- . Fixed bug #63265 (Add ORA-00028 to the PHP_OCI_HANDLE_ERROR macro)
- (Chris Jones)
-
-- PCRE:
- . Fixed bug #63180 (Corruption of hash tables). (Dmitry)
- . Fixed bug #63055 (Segfault in zend_gc with SF2 testsuite).
- (Dmitry, Laruence)
- . Fixed bug #63284 (Upgrade PCRE to 8.31). (Anatoliy)
-
-- PDO:
- . Fixed bug #63235 (buffer overflow in use of SQLGetDiagRec).
- (Martin Osvald, Remi)
-
-- PDO_pgsql:
- . Fixed bug #62593 (Emulate prepares behave strangely with PARAM_BOOL).
- (Will Fitch)
-
-- Phar:
- . Fixed bug #63297 (Phar fails to write an openssl based signature).
- (Anatoliy)
-
-- Streams:
- . Fixed bug #63240 (stream_get_line() return contains delimiter string).
- (Tjerk, Gustavo)
-
-- Reflection:
- . Fixed bug #63399 (ReflectionClass::getTraitAliases() incorrectly resolves
- traitnames). (Laruence)
-
-18 Oct 2012, PHP 5.4.8
-
-- CLI server:
- . Implemented FR #63242 (Default error page in PHP built-in web server uses
- outdated html/css). (pascal.chevrel@free.fr)
- . Changed response to unknown HTTP method to 501 according to RFC.
- (Niklas Lindgren).
- . Support HTTP PATCH method. Patch by Niklas Lindgren, GitHub PR #190.
- (Lars)
-
-- Core:
- . Fixed bug #63219 (Segfault when aliasing trait method when autoloader
- throws excpetion). (Laruence)
- . Added optional second argument for assert() to specify custom message. Patch
- by Lonny Kapelushnik (lonny@lonnylot.com). (Lars)
- . Support building PHP with the native client toolchain. (Stuart Langley)
- . Added --offline option for tests. (Remi)
- . Fixed bug #63162 (parse_url does not match password component). (husman)
- . Fixed bug #63111 (is_callable() lies for abstract static method). (Dmitry)
- . Fixed bug #63093 (Segfault while load extension failed in zts-build).
- (Laruence)
- . Fixed bug #62976 (Notice: could not be converted to int when comparing
- some builtin classes). (Laruence)
- . Fixed bug #62955 (Only one directive is loaded from "Per Directory Values"
- Windows registry). (aserbulov at parallels dot com)
- . Fixed bug #62907 (Double free when use traits). (Dmitry)
- . Fixed bug #61767 (Shutdown functions not called in certain error
- situation). (Dmitry)
- . Fixed bug #60909 (custom error handler throwing Exception + fatal error
- = no shutdown function). (Dmitry)
- . Fixed bug #60723 (error_log error time has changed to UTC ignoring default
- timezone). (Laruence)
-
-- cURL:
- . Fixed bug #62085 (file_get_contents a remote file by Curl wrapper will
- cause cpu Soaring). (Pierrick)
-
-- Date:
- . Fixed bug #62896 ("DateTime->modify('+0 days')" modifies DateTime object)
- (Lonny Kapelushnik)
- . Fixed bug #62561 (DateTime add 'P1D' adds 25 hours). (Lonny Kapelushnik)
-
-- DOM:
- . Fixed bug #63015 (Incorrect arginfo for DOMErrorHandler). (Rob)
-
-- FPM:
- . Fixed bug #62954 (startup problems fpm / php-fpm). (fat)
- . Fixed bug #62886 (PHP-FPM may segfault/hang on startup). (fat)
- . Fixed bug #63085 (Systemd integration and daemonize). (remi, fat)
- . Fixed bug #62947 (Unneccesary warnings on FPM). (fat)
- . Fixed bug #62887 (Only /status?plain&full gives "last request cpu"). (fat)
- . Fixed bug #62216 (Add PID to php-fpm init.d script). (fat)
-
-- OCI8:
- . Fixed bug #60901 (Improve "tail" syntax for AIX installation) (Chris Jones)
-
-- OpenSSL:
- . Implemented FR #61421 (OpenSSL signature verification missing RMD160,
- SHA224, SHA256, SHA384, SHA512). (Mark Jones)
-
-- PDO:
- . Fixed bug #63258 (seg fault with PDO and dblib using DBSETOPT(H->link,
- DBQUOTEDIDENT, 1)). (Laruence)
- . Fixed bug #63235 (buffer overflow in use of SQLGetDiagRec).
- (Martin Osvald, Remi)
-
-- PDO Firebird:
- . Fixed bug #63214 (Large PDO Firebird Queries).
- (james at kenjim dot com)
-
-- SOAP
- . Fixed bug #50997 (SOAP Error when trying to submit 2nd Element of a choice).
- (Dmitry)
-
-- SPL:
- . Bug #62987 (Assigning to ArrayObject[null][something] overrides all
- undefined variables). (Laruence)
-
-- mbstring:
- . Allow passing null as a default value to mb_substr() and mb_strcut(). Patch
- by Alexander Moskaliov via GitHub PR #133. (Lars)
-
-- Filter extension:
- . Bug #49510: Boolean validation fails with FILTER_NULL_ON_FAILURE with empty
- string or false. (Lars)
-
-- Sockets
- . Fixed bug #63000 (MCAST_JOIN_GROUP on OSX is broken, merge of PR 185 by
- Igor Wiedler). (Lars)
-
-13 Sep 2012, PHP 5.4.7
-
-- Core:
- . Fixed bug (segfault while build with zts and GOTO vm-kind). (Laruence)
- . Fixed bug #62844 (parse_url() does not recognize //). (Andrew Faulds).
- . Fixed bug #62829 (stdint.h included on platform where HAVE_STDINT_H is not
- set). (Felipe)
- . Fixed bug #62763 (register_shutdown_function and extending class).
- (Laruence)
- . Fixed bug #62725 (Calling exit() in a shutdown function does not return
- the exit value). (Laruence)
- . Fixed bug #62744 (dangling pointers made by zend_disable_class). (Laruence)
- . Fixed bug #62716 (munmap() is called with the incorrect length).
- (slangley@google.com)
- . Fixed bug #62358 (Segfault when using traits a lot). (Laruence)
- . Fixed bug #62328 (implementing __toString and a cast to string fails)
- (Laruence)
- . Fixed bug #51363 (Fatal error raised by var_export() not caught by error
- handler). (Lonny Kapelushnik)
- . Fixed bug #40459 (Stat and Dir stream wrapper methods do not call
- constructor). (Stas)
-
-- CURL:
- . Fixed bug #62912 (CURLINFO_PRIMARY_* AND CURLINFO_LOCAL_* not exposed).
- (Pierrick)
- . Fixed bug #62839 (curl_copy_handle segfault with CURLOPT_FILE). (Pierrick)
-
-- Intl:
- . Fixed Spoofchecker not being registered on ICU 49.1. (Gustavo)
- . Fix bug #62933 (ext/intl compilation error on icu 3.4.1). (Gustavo)
- . Fix bug #62915 (defective cloning in several intl classes). (Gustavo)
-
-- Installation:
- . Fixed bug #62460 (php binaries installed as binary.dSYM). (Reeze Xia)
-
-- PCRE:
- . Fixed bug #55856 (preg_replace should fail on trailing garbage).
- (reg dot php at alf dot nu)
-
-- PDO:
- . Fixed bug #62685 (Wrong return datatype in PDO::inTransaction()). (Laruence)
-
-- Reflection:
- . Fixed bug #62892 (ReflectionClass::getTraitAliases crashes on importing
- trait methods as private). (Felipe)
- . Fixed bug #62715 (ReflectionParameter::isDefaultValueAvailable() wrong
- result). (Laruence)
-
-- Session:
- . Fixed bug (segfault due to retval is not initialized). (Laruence)
- . Fixed bug (segfault due to PS(mod_user_implemented) not be reseted
- when close handler call exit). (Laruence)
-
-- SOAP
- . Fixed bug #50997 (SOAP Error when trying to submit 2nd Element of a choice).
- (Dmitry)
-
-- SPL:
- . Fixed bug #62904 (Crash when cloning an object which inherits SplFixedArray)
- (Laruence)
- . Implemented FR #62840 (Add sort flag to ArrayObject::ksort). (Laruence)
-
-- Standard:
- . Fixed bug #62836 (Seg fault or broken object references on unserialize()).
- (Laruence)
-
-- FPM:
- . Merged PR 121 by minitux to add support for slow request counting on PHP
- FPM status page. (Lars)
-
-16 Aug 2012, PHP 5.4.6
-
-- CLI Server:
- . Implemented FR #62700 (have the console output 'Listening on
- http://localhost:8000'). (pascal.chevrel@free.fr)
-
-- Core:
- . Fixed bug #62661 (Interactive php-cli crashes if include() is used in
- auto_prepend_file). (Laruence)
- . Fixed bug #62653: (unset($array[$float]) causes a crash). (Nikita Popov,
- Laruence)
- . Fixed bug #62565 (Crashes due non-initialized internal properties_table).
- (Felipe)
- . Fixed bug #60194 (--with-zend-multibyte and --enable-debug reports LEAK
- with run-test.php). (Laruence)
-
-- CURL:
- . Fixed bug #62499 (curl_setopt($ch, CURLOPT_COOKIEFILE, "") returns false).
- (r.hampartsumyan@gmail.com, Laruence)
-
-- DateTime:
- . Fixed Bug #62500 (Segfault in DateInterval class when extended). (Laruence)
-
-- Fileinfo:
- . Fixed bug #61964 (finfo_open with directory causes invalid free).
- (reeze.xia@gmail.com)
-
-- Intl:
- . Fixed bug #62564 (Extending MessageFormatter and adding property causes
- crash). (Felipe)
-
-- MySQLnd:
- . Fixed bug #62594 (segfault in mysqlnd_res_meta::set_mode). (Laruence)
-
-- readline:
- . Fixed bug #62612 (readline extension compilation fails with
- sapi/cli/cli.h: No such file). (Johannes)
-
-- Reflection:
- . Implemented FR #61602 (Allow access to name of constant used as default
- value). (reeze.xia@gmail.com)
-
-- SimpleXML:
- . Implemented FR #55218 Get namespaces from current node. (Lonny)
-
-- SPL:
- . Fixed bug #62616 (ArrayIterator::count() from IteratorIterator instance
- gives Segmentation fault). (Laruence, Gustavo)
- . Fixed bug #61527 (ArrayIterator gives misleading notice on next() when
- moved to the end). (reeze.xia@gmail.com)
-
-- Streams:
- . Fixed bug #62597 (segfault in php_stream_wrapper_log_error with ZTS build).
- (Laruence)
-
-- Zlib:
- . Fixed bug #55544 (ob_gzhandler always conflicts with
- zlib.output_compression). (Laruence)
-
-19 Jul 2012, PHP 5.4.5
-
-- Core:
- . Fixed bug #62443 (Crypt SHA256/512 Segfaults With Malformed
- Salt). (Anthony Ferrara)
- . Fixed bug #62432 (ReflectionMethod random corrupt memory on high
- concurrent). (Johannes)
- . Fixed bug #62373 (serialize() generates wrong reference to the object).
- (Moriyoshi)
- . Fixed bug #62357 (compile failure: (S) Arguments missing for built-in
- function __memcmp). (Laruence)
- . Fixed bug #61998 (Using traits with method aliases appears to result in
- crash during execution). (Dmitry)
- . Fixed bug #51094 (parse_ini_file() with INI_SCANNER_RAW cuts a value that
- includes a semi-colon). (Pierrick)
- . Fixed potential overflow in _php_stream_scandir (CVE-2012-2688).
- (Jason Powell, Stas)
-
-- EXIF:
- . Fixed information leak in ext exif (discovered by Martin Noga,
- Matthew "j00ru" Jurczyk, Gynvael Coldwind)
-
-- FPM:
- . Fixed bug #62205 (php-fpm segfaults (null passed to strstr)). (fat)
- . Fixed bug #62160 (Add process.priority to set nice(2) priorities). (fat)
- . Fixed bug #62153 (when using unix sockets, multiples FPM instances
- . Fixed bug #62033 (php-fpm exits with status 0 on some failures to start).
- (fat)
- . Fixed bug #61839 (Unable to cross-compile PHP with --enable-fpm). (fat)
- . Fixed bug #61835 (php-fpm is not allowed to run as root). (fat)
- . Fixed bug #61295 (php-fpm should not fail with commented 'user'
- . Fixed bug #61218 (FPM drops connection while receiving some binary values
- in FastCGI requests). (fat)
- . Fixed bug #61045 (fpm don't send error log to fastcgi clients). (fat)
- for non-root start). (fat)
- . Fixed bug #61026 (FPM pools can listen on the same address). (fat)
- can be launched without errors). (fat)
-
-- Iconv:
- . Fix bug #55042 (Erealloc in iconv.c unsafe). (Stas)
-
-- Intl:
- . Fixed bug #62083 (grapheme_extract() memory leaks). (Gustavo)
- . ResourceBundle constructor now accepts NULL for the first two arguments.
- (Gustavo)
- . Fixed bug #62081 (IntlDateFormatter constructor leaks memory when called
- twice). (Gustavo)
- . Fixed bug #62070 (Collator::getSortKey() returns garbage). (Gustavo)
- . Fixed bug #62017 (datefmt_create with incorrectly encoded timezone leaks
- pattern). (Gustavo)
- . Fixed bug #60785 (memory leak in IntlDateFormatter constructor). (Gustavo)
-
-- JSON:
- . Fixed bug #61359 (json_encode() calls too many reallocs). (Stas)
-
-- libxml:
- . Fixed bug #62266 (Custom extension segfaults during xmlParseFile with FPM
- SAPI). (Gustavo)
-
-- Phar:
- . Fixed bug #62227 (Invalid phar stream path causes crash). (Felipe)
-
-- Readline:
- . Fixed bug #62186 (readline fails to compile - void function should not
- return a value). (Johannes)
-
-- Reflection:
- . Fixed bug #62384 (Attempting to invoke a Closure more than once causes
- segfault). (Felipe)
- . Fixed bug #62202 (ReflectionParameter::getDefaultValue() memory leaks
- with constant). (Laruence)
-
-- Sockets:
- . Fixed bug #62025 (__ss_family was changed on AIX 5.3). (Felipe)
-
-- SPL:
- . Fixed bug #62433 (Inconsistent behavior of RecursiveDirectoryIterator to
- dot files). (Laruence)
- . Fixed bug #62262 (RecursiveArrayIterator does not implement Countable).
- (Nikita Popov)
-
-- XML Writer:
- . Fixed bug #62064 (memory leak in the XML Writer module).
- (jean-pierre dot lozi at lip6 dot fr)
-
-- Zip:
- . Upgraded libzip to 0.10.1 (Anatoliy)
-
-14 Jun 2012, PHP 5.4.4
-
-- COM:
- . Fixed bug #62146 com_dotnet cannot be built shared. (Johannes)
-
-- CLI Server:
- . Implemented FR #61977 (Need CLI web-server support for files with .htm &
- svg extensions). (Sixd, Laruence)
- . Improved performance while sending error page, this also fixed
- bug #61785 (Memory leak when access a non-exists file without router).
- (Laruence)
- . Fixed bug #61546 (functions related to current script failed when chdir()
- in cli sapi). (Laruence, reeze.xia@gmail.com)
-
-- Core:
- . Fixed missing bound check in iptcparse(). (chris at chiappa.net)
- . Fixed CVE-2012-2143. (Solar Designer)
- . Fixed bug #62097 (fix for for bug #54547). (Gustavo)
- . Fixed bug #62005 (unexpected behavior when incrementally assigning to a
- member of a null object). (Laruence)
- . Fixed bug #61978 (Object recursion not detected for classes that implement
- JsonSerializable). (Felipe)
- . Fixed bug #61991 (long overflow in realpath_cache_get()). (Anatoliy)
- . Fixed bug #61922 (ZTS build doesn't accept zend.script_encoding config).
- (Laruence)
- . Fixed bug #61827 (incorrect \e processing on Windows) (Anatoliy)
- . Fixed bug #61782 (__clone/__destruct do not match other methods when checking
- access controls). (Stas)
- . Fixed bug #61764 ('I' unpacks n as signed if n > 2^31-1 on LP64). (Gustavo)
- . Fixed bug #61761 ('Overriding' a private static method with a different
- signature causes crash). (Laruence)
- . Fixed bug #61730 (Segfault from array_walk modifying an array passed by
- reference). (Laruence)
- . Fixed bug #61728 (PHP crash when calling ob_start in request_shutdown
- phase). (Laruence)
- . Fixed bug #61713 (Logic error in charset detection for htmlentities).
- (Anatoliy)
- . Fixed bug #61660 (bin2hex(hex2bin($data)) != $data). (Nikita Popov)
- . Fixed bug #61650 (ini parser crashes when using ${xxxx} ini variables
- (without apache2)). (Laruence)
- . Fixed bug #61605 (header_remove() does not remove all headers). (Laruence)
- . Fixed bug #54547 (wrong equality of string numbers). (Gustavo)
- . Fixed bug #54197 ([PATH=] sections incompatibility with user_ini.filename
- set to null). (Anatoliy)
- . Changed php://fd to be available only for CLI.
-
-- CURL:
- . Fixed bug #61948 (CURLOPT_COOKIEFILE '' raises open_basedir restriction).
- (Laruence)
-
-- Fileinfo
- . Fixed bug #61812 (Uninitialised value used in libmagic).
- (Laruence, Gustavo)
- . Fixed bug #61566 failure caused by the posix lseek and read versions
- under windows in cdf_read(). (Anatoliy)
- . Fixed bug #61565 where php_stream_open_wrapper_ex tries to open a
- directory descriptor under windows. (Anatoliy)
-
-- Intl
- . Fixed bug #62082 (Memory corruption in internal function
- get_icu_disp_value_src_php()). (Gustavo)
-
-- Libxml:
- . Fixed bug #61617 (Libxml tests failed(ht is already destroyed)).
- (Laruence)
-
-- PDO:
- . Fixed bug #61755 (A parsing bug in the prepared statements can lead to
- access violations). (Johannes)
-
-- Phar:
- . Fixed bug #61065 (Secunia SA44335, CVE-2012-2386). (Rasmus)
-
-- Pgsql:
- . Added pg_escape_identifier/pg_escape_literal. (Yasuo Ohgaki)
-
-- Streams:
- . Fixed bug #61961 (file_get_contents leaks when access empty file with
- maxlen set). (Reeze)
-
-- Zlib:
- . Fixed bug #61820 (using ob_gzhandler will complain about headers already
- sent when no compression). (Mike)
- . Fixed bug #61443 (can't change zlib.output_compression on the fly). (Mike)
- . Fixed bug #60761 (zlib.output_compression fails on refresh). (Mike)
-
-08 May 2012, PHP 5.4.3
-
-- CGI
- . Re-Fix PHP-CGI query string parameter vulnerability, CVE-2012-1823.
- (Stas)
- . Fix bug #61807 - Buffer Overflow in apache_request_headers.
- (nyt-php at countercultured dot net).
-
-03 May 2012, PHP 5.4.2
-
-- Fix PHP-CGI query string parameter vulnerability, CVE-2012-1823. (Rasmus)
-
-26 Apr 2012, PHP 5.4.1
-
-- CLI Server:
- . Fixed bug #61461 (missing checks around malloc() calls). (Ilia)
- . Implemented FR #60850 (Built in web server does not set
- $_SERVER['SCRIPT_FILENAME'] when using router). (Laruence)
- . "Connection: close" instead of "Connection: closed" (Gustavo)
-
-- Core:
- . Fixed crash in ZTS using same class in many threads. (Johannes)
- . Fixed bug #61374 (html_entity_decode tries to decode code points that don't
- exist in ISO-8859-1). (Gustavo)
- . Fixed bug #61273 (call_user_func_array with more than 16333 arguments
- leaks / crashes). (Laruence)
- . Fixed bug #61225 (Incorrect lexing of 0b00*+<NUM>). (Pierrick)
- . Fixed bug #61165 (Segfault - strip_tags()). (Laruence)
- . Fixed bug #61106 (Segfault when using header_register_callback). (Nikita
- Popov)
- . Fixed bug #61087 (Memory leak in parse_ini_file when specifying
- invalid scanner mode). (Nikic, Laruence)
- . Fixed bug #61072 (Memory leak when restoring an exception handler).
- (Nikic, Laruence)
- . Fixed bug #61058 (array_fill leaks if start index is PHP_INT_MAX).
- (Laruence)
- . Fixed bug #61052 (Missing error check in trait 'insteadof' clause). (Stefan)
- . Fixed bug #61011 (Crash when an exception is thrown by __autoload
- accessing a static property). (Laruence)
- . Fixed bug #61000 (Exceeding max nesting level doesn't delete numerical
- vars). (Laruence)
- . Fixed bug #60978 (exit code incorrect). (Laruence)
- . Fixed bug #60911 (Confusing error message when extending traits). (Stefan)
- . Fixed bug #60801 (strpbrk() mishandles NUL byte). (Adam)
- . Fixed bug #60717 (Order of traits in use statement can cause a fatal
- error). (Stefan)
- . Fixed bug #60573 (type hinting with "self" keyword causes weird errors).
- (Laruence)
- . Fixed bug #60569 (Nullbyte truncates Exception $message). (Ilia)
- . Fixed bug #52719 (array_walk_recursive crashes if third param of the
- function is by reference). (Nikita Popov)
- . Improve performance of set_exception_handler while doing reset (Laruence)
-
-- fileinfo:
- . Fix fileinfo test problems. (Anatoliy Belsky)
-
-- FPM
- . Fixed bug #61430 (Transposed memset() params in sapi/fpm/fpm/fpm_shm.c).
- (michaelhood at gmail dot com, Ilia)
-
-- Ibase
- . Fixed bug #60947 (Segmentation fault while executing ibase_db_info).
- (Ilia)
-
-- Installation
- . Fixed bug #61172 (Add Apache 2.4 support). (Chris Jones)
-
-- Intl:
- . Fixed bug #61487 (Incorrent bounds checking in grapheme_strpos).
- (Stas)
-
-- mbstring:
- . MFH mb_ereg_replace_callback() for security enhancements. (Rui)
-
-- mysqli
- . Fixed bug #61003 (mysql_stat() require a valid connection). (Johannes).
-
-- mysqlnd
- . Fixed bug #61704 (Crash apache, phpinfo() threading issue). (Johannes)
- . Fixed bug #60948 (mysqlnd FTBFS when -Wformat-security is enabled).
- (Johannes)
-
-- PDO
- . Fixed bug #61292 (Segfault while calling a method on an overloaded PDO
- object). (Laruence)
-
-- PDO_mysql
- . Fixed bug #61207 (PDO::nextRowset() after a multi-statement query doesn't
- always work). (Johannes)
- . Fixed bug #61194 (PDO should export compression flag with myslqnd).
- (Johannes)
-
-- PDO_odbc
- . Fixed bug #61212 (PDO ODBC Segfaults on SQL_SUCESS_WITH_INFO). (Ilia)
-
-- Phar
- . Fixed bug #61184 (Phar::webPhar() generates headers with trailing NUL
- bytes). (Nikita Popov)
-
-- Readline:
- . Fixed bug #61088 (Memory leak in readline_callback_handler_install).
- (Nikic, Laruence)
-
-- Reflection:
- . Implemented FR #61602 (Allow access to the name of constant
- used as function/method parameter's default value). (reeze.xia@gmail.com)
- . Fixed bug #60968 (Late static binding doesn't work with
- ReflectionMethod::invokeArgs()). (Laruence)
-
-- Session
- . Fixed bug #60634 (Segmentation fault when trying to die() in
- SessionHandler::write()). (Ilia)
-
-- SOAP
- . Fixed bug #61423 (gzip compression fails). (Ilia)
- . Fixed bug #60887 (SoapClient ignores user_agent option and sends no
- User-Agent header). (carloschilazo at gmail dot com)
- . Fixed bug #60842, #51775 (Chunked response parsing error when
- chunksize length line is > 10 bytes). (Ilia)
- . Fixed bug #49853 (Soap Client stream context header option ignored).
- (Dmitry)
-
-- SPL:
- . Fixed bug #61453 (SplObjectStorage does not identify objects correctly).
- (Gustavo)
- . Fixed bug #61347 (inconsistent isset behavior of Arrayobject). (Laruence)
-
-- Standard:
- . Fixed memory leak in substr_replace. (Pierrick)
- . Make max_file_uploads ini directive settable outside of php.ini (Rasmus)
- . Fixed bug #61409 (Bad formatting on phpinfo()). (Jakub Vrana)
- . Fixed bug #60222 (time_nanosleep() does validate input params). (Ilia)
- . Fixed bug #60106 (stream_socket_server silently truncates long unix socket
- paths). (Ilia)
-
-- XMLRPC:
- . Fixed bug #61264 (xmlrpc_parse_method_descriptions leaks temporary
- variable). (Nikita Popov)
- . Fixed bug #61097 (Memory leak in xmlrpc functions copying zvals). (Nikita
- Popov)
-
-- Zlib:
- . Fixed bug #61306 (initialization of global inappropriate for ZTS). (Gustavo)
- . Fixed bug #61287 (A particular string fails to decompress). (Mike)
- . Fixed bug #61139 (gzopen leaks when specifying invalid mode). (Nikita Popov)
-
-01 Mar 2012, PHP 5.4.0
-
-- Installation:
- . autoconf 2.59+ is now supported (and required) for generating the
- configure script with ./buildconf. Autoconf 2.60+ is desirable
- otherwise the configure help order may be incorrect. (Rasmus, Chris Jones)
-
-- Removed legacy features:
- . break/continue $var syntax. (Dmitry)
- . Safe mode and all related php.ini options. (Kalle)
- . register_globals and register_long_arrays php.ini options. (Kalle)
- . import_request_variables(). (Kalle)
- . allow_call_time_pass_reference. (Pierrick)
- . define_syslog_variables php.ini option and its associated function. (Kalle)
- . highlight.bg php.ini option. (Kalle)
- . safe_mode, safe_mode_gid, safe_mode_include_dir,
- safe_mode_exec_dir, safe_mode_allowed_env_vars and
- safe_mode_protected_env_vars php.ini options.
- . zend.ze1_compatibility_mode php.ini option.
- . Session bug compatibility mode (session.bug_compat_42 and
- session.bug_compat_warn php.ini options). (Kalle)
- . session_is_registered(), session_register() and session_unregister()
- functions. (Kalle)
- . y2k_compliance php.ini option. (Kalle)
- . magic_quotes_gpc, magic_quotes_runtime and magic_quotes_sybase
- php.ini options. get_magic_quotes_gpc, get_magic_quotes_runtime are kept
- but always return false, set_magic_quotes_runtime raises an
- E_CORE_ERROR. (Pierrick, Pierre)
- . Removed support for putenv("TZ=..") for setting the timezone. (Derick)
- . Removed the timezone guessing algorithm in case the timezone isn't set with
- date.timezone or date_default_timezone_set(). Instead of a guessed
- timezone, "UTC" is now used instead. (Derick)
-
-- Moved extensions to PECL:
- . ext/sqlite. (Note: the ext/sqlite3 and ext/pdo_sqlite extensions are
- not affected) (Johannes)
-
-- General improvements:
- . Added short array syntax support ([1,2,3]), see UPGRADING guide for full
- details. (rsky0711 at gmail . com, sebastian.deutsch at 9elements . com,
- Pierre)
- . Added binary number format (0b001010). (Jonah dot Harris at gmail dot com)
- . Added support for Class::{expr}() syntax (Pierrick)
- . Added multibyte support by default. Previously PHP had to be compiled
- with --enable-zend-multibyte. Now it can be enabled or disabled through
- the zend.multibyte directive in php.ini. (Dmitry)
- . Removed compile time dependency from ext/mbstring (Dmitry)
- . Added support for Traits. (Stefan, with fixes by Dmitry and Laruence)
- . Added closure $this support back. (Stas)
- . Added array dereferencing support. (Felipe)
- . Added callable typehint. (Hannes)
- . Added indirect method call through array. FR #47160. (Felipe)
- . Added DTrace support. (David Soria Parra)
- . Added class member access on instantiation (e.g. (new foo)->bar()) support.
- (Felipe)
- . <?= is now always available regardless of the short_open_tag setting. (Rasmus)
- . Implemented Zend Signal Handling (configurable option --enable-zend-signals,
- off by default). (Lucas Nealan, Arnaud Le Blanc, Brian Shire, Ilia)
- . Improved output layer, see README.NEW-OUTPUT-API for internals. (Mike)
- . Improved UNIX build system to allow building multiple PHP binary SAPIs and
- one SAPI module the same time. FR #53271, FR #52419. (Jani)
- . Implemented closure rebinding as parameter to bindTo. (Gustavo Lopes)
- . Improved the warning message of incompatible arguments. (Laruence)
- . Improved ternary operator performance when returning arrays. (Arnaud, Dmitry)
- . Changed error handlers to only generate docref links when the docref_root
- php.ini setting is not empty. (Derick)
- . Changed silent conversion of array to string to produce a notice. (Patrick)
- . Changed default encoding from ISO-8859-1 to UTF-8 when not specified in
- htmlspecialchars and htmlentities. (Rasmus)
- . Changed casting of null/''/false into an Object when adding a property
- from E_STRICT into a warning. (Scott)
- . Changed E_ALL to include E_STRICT. (Stas)
- . Disabled Windows CRT warning by default, can be enabled again using the
- php.ini directive windows_show_crt_warnings. (Pierre)
- . Fixed bug #55378: Binary number literal returns float number though its
- value is small enough. (Derick)
-
-- Improved Zend Engine memory usage: (Dmitry)
- . Improved parse error messages. (Felipe)
- . Replaced zend_function.pass_rest_by_reference by
- ZEND_ACC_PASS_REST_BY_REFERENCE in zend_function.fn_flags.
- . Replaced zend_function.return_reference by ZEND_ACC_RETURN_REFERENCE
- in zend_function.fn_flags.
- . Removed zend_arg_info.required_num_args as it was only needed for internal
- functions. Now the first arg_info for internal functions (which has special
- meaning) is represented by the zend_internal_function_info structure.
- . Moved zend_op_array.size, size_var, size_literal, current_brk_cont,
- backpatch_count into CG(context) as they are used only during compilation.
- . Moved zend_op_array.start_op into EG(start_op) as it's used only for
- 'interactive' execution of a single top-level op-array.
- . Replaced zend_op_array.done_pass_two by ZEND_ACC_DONE_PASS_TWO in
- zend_op_array.fn_flags.
- . op_array.vars array is trimmed (reallocated) during pass_two.
- . Replaced zend_class_entry.constants_updated by ZEND_ACC_CONSTANTS_UPDATED
- in zend_class_entry.ce_flags.
- . Reduced the size of zend_class_entry by sharing the same memory space
- by different information for internal and user classes.
- See zend_class_entry.info union.
- . Reduced size of temp_variable.
-
-- Improved Zend Engine - performance tweaks and optimizations: (Dmitry)
- . Inlined most probable code-paths for arithmetic operations directly into
- executor.
- . Eliminated unnecessary iterations during request startup/shutdown.
- . Changed $GLOBALS into a JIT autoglobal, so it's initialized only if used.
- (this may affect opcode caches!)
- . Improved performance of @ (silence) operator.
- . Simplified string offset reading. Given $str="abc" then $str[1][0] is now
- a legal construct.
- . Added caches to eliminate repeatable run-time bindings of functions,
- classes, constants, methods and properties.
- . Added concept of interned strings. All strings constants known at compile
- time are allocated in a single copy and never changed.
- . ZEND_RECV now always has IS_CV as its result.
- . ZEND_CATCH now has to be used only with constant class names.
- . ZEND_FETCH_DIM_? may fetch array and dimension operands in different order.
- . Simplified ZEND_FETCH_*_R operations. They can't be used with the
- EXT_TYPE_UNUSED flag any more. This is a very rare and useless case.
- ZEND_FREE might be required after them instead.
- . Split ZEND_RETURN into two new instructions ZEND_RETURN and
- ZEND_RETURN_BY_REF.
- . Optimized access to global constants using values with pre-calculated
- hash_values from the literals table.
- . Optimized access to static properties using executor specialization.
- A constant class name may be used as a direct operand of ZEND_FETCH_*
- instruction without previous ZEND_FETCH_CLASS.
- . zend_stack and zend_ptr_stack allocation is delayed until actual usage.
-
-- Other improvements to Zend Engine:
- . Added an optimization which saves memory and emalloc/efree calls for empty
- HashTables. (Stas, Dmitry)
- . Added ability to reset user opcode handlers (Yoram).
- . Changed the structure of op_array.opcodes. The constant values are moved from
- opcode operands into a separate literal table. (Dmitry)
- . Fixed (disabled) inline-caching for ZEND_OVERLOADED_FUNCTION methods.
- (Dmitry)
-
-- Improved core functions:
- . Enforce an extended class' __construct arguments to match the
- abstract constructor in the base class.
- . Disallow reusing superglobal names as parameter names.
- . Added optional argument to debug_backtrace() and debug_print_backtrace()
- to limit the amount of stack frames returned. (Sebastian, Patrick)
- . Added hex2bin() function. (Scott)
- . number_format() no longer truncates multibyte decimal points and thousand
- separators to the first byte. FR #53457. (Adam)
- . Added support for object references in recursive serialize() calls.
- FR #36424. (Mike)
- . Added support for SORT_NATURAL and SORT_FLAG_CASE in array
- sort functions (sort, rsort, ksort, krsort, asort, arsort and
- array_multisort). FR#55158 (Arpad)
- . Added stream metadata API support and stream_metadata() stream class
- handler. (Stas)
- . User wrappers can now define a stream_truncate() method that responds
- to truncation, e.g. through ftruncate(). FR #53888. (Gustavo)
- . Improved unserialize() performance.
- (galaxy dot mipt at gmail dot com, Kalle)
- . Changed array_combine() to return empty array instead of FALSE when both
- parameter arrays are empty. FR #34857. (joel.perras@gmail.com)
- . Fixed bug #61095 (Incorect lexing of 0x00*+<NUM>). (Etienne)
- . Fixed bug #60965 (Buffer overflow on htmlspecialchars/entities with
- $double=false). (Gustavo)
- . Fixed bug #60895 (Possible invalid handler usage in windows random
- functions). (Pierre)
- . Fixed bug #60879 (unserialize() Does not invoke __wakeup() on object).
- (Pierre, Steve)
- . Fixed bug #60825 (Segfault when running symfony 2 tests).
- (Dmitry, Laruence)
- . Fixed bug #60627 (httpd.worker segfault on startup with php_value).
- . Fixed bug #60613 (Segmentation fault with $cls->{expr}() syntax). (Dmitry)
- . Fixed bug #60611 (Segmentation fault with Cls::{expr}() syntax). (Laruence)
- (Laruence)
- . Fixed bug #60558 (Invalid read and writes). (Laruence)
- . Fixed bug #60444 (Segmentation fault with include & class extending).
- (Laruence, Dmitry).
- . Fixed bug #60362 (non-existent sub-sub keys should not have values).
- (Laruence, alan_k, Stas)
- . Fixed bug #60350 (No string escape code for ESC (ascii 27), normally \e).
- (php at mickweiss dot com)
- . Fixed bug #60321 (ob_get_status(true) no longer returns an array when
- buffer is empty). (Pierrick)
- . Fixed bug #60282 (Segfault when using ob_gzhandler() with open buffers).
- (Laruence)
- . Fixed bug #60240 (invalid read/writes when unserializing specially crafted
- strings). (Mike)
- . Fixed bug #60227 (header() cannot detect the multi-line header with
- CR(0x0D)). (rui)
- . Fixed bug #60174 (Notice when array in method prototype error).
- (Laruence)
- . Fixed bug #60169 (Conjunction of ternary and list crashes PHP).
- (Laruence)
- . Fixed bug #60038 (SIGALRM cause segfault in php_error_cb). (Laruence)
- (klightspeed at netspace dot net dot au)
- . Fixed bug #55871 (Interruption in substr_replace()). (Stas)
- . Fixed bug #55801 (Behavior of unserialize has changed). (Mike)
- . Fixed bug #55758 (Digest Authenticate missed in 5.4) . (Laruence)
- . Fixed bug #55748 (multiple NULL Pointer Dereference with zend_strndup())
- (CVE-2011-4153). (Stas)
- . Fixed bug #55124 (recursive mkdir fails with current (dot) directory in path).
- (Pierre)
- . Fixed bug #55084 (Function registered by header_register_callback is
- called only once per process). (Hannes)
- . Implement FR #54514 (Get php binary path during script execution).
- (Laruence)
- . Fixed bug #52211 (iconv() returns part of string on error). (Felipe)
- . Fixed bug #51860 (Include fails with toplevel symlink to /). (Dmitry)
-
-- Improved generic SAPI support:
- . Added $_SERVER['REQUEST_TIME_FLOAT'] to include microsecond precision.
- (Patrick)
- . Added header_register_callback() which is invoked immediately
- prior to the sending of headers and after default headers have
- been added. (Scott)
- . Added http_response_code() function. FR #52555. (Paul Dragoonis, Kalle)
- . Fixed bug #55500 (Corrupted $_FILES indices lead to security concern).
- (CVE-2012-1172). (Stas)
- . Fixed bug #54374 (Insufficient validating of upload name leading to
- corrupted $_FILES indices). (CVE-2012-1172). (Stas, lekensteyn at gmail dot com)
-
-- Improved CLI SAPI:
- . Added built-in web server that is intended for testing purpose.
- (Moriyoshi, Laruence, and fixes by Pierre, Derick, Arpad,
- chobieee at gmail dot com)
- . Added command line option --rz <name> which shows information of the
- named Zend extension. (Johannes)
- . Interactive readline shell improvements: (Johannes)
- . Added "cli.pager" php.ini setting to set a pager for output.
- . Added "cli.prompt" php.ini setting to configure the shell prompt.
- . Added shortcut #inisetting=value to change php.ini settings at run-time.
- . Changed shell not to terminate on fatal errors.
- . Interactive shell works with shared readline extension. FR #53878.
-
-- Improved CGI/FastCGI SAPI: (Dmitry)
- . Added apache compatible functions: apache_child_terminate(),
- getallheaders(), apache_request_headers() and apache_response_headers()
- . Improved performance of FastCGI request parsing.
- . Fixed reinitialization of SAPI callbacks after php_module_startup().
- (Dmitry)
-
-- Improved PHP-FPM SAPI:
- . Removed EXPERIMENTAL flag. (fat)
- . Fixed bug #60659 (FPM does not clear auth_user on request accept).
- (bonbons at linux-vserver dot org)
-
-- Improved Litespeed SAPI:
- . Fixed bug #55769 (Make Fails with "Missing Separator" error). (Adam)
-
-- Improved Date extension:
- . Added the + modifier to parseFromFormat to allow trailing text in the
- string to parse without throwing an error. (Stas, Derick)
-
-- Improved DBA extension:
- . Added Tokyo Cabinet abstract DB support. (Michael Maclean)
- . Added Berkeley DB 5 support. (Johannes, Chris Jones)
-
-- Improved DOM extension:
- . Added the ability to pass options to loadHTML (Chregu, fxmulder at gmail dot com)
-
-- Improved filesystem functions:
- . scandir() now accepts SCANDIR_SORT_NONE as a possible sorting_order value.
- FR #53407. (Adam)
-
-- Improved HASH extension:
- . Added Jenkins's one-at-a-time hash support. (Martin Jansen)
- . Added FNV-1 hash support. (Michael Maclean)
- . Made Adler32 algorithm faster. FR #53213. (zavasek at yandex dot ru)
- . Removed Salsa10/Salsa20, which are actually stream ciphers (Mike)
- . Fixed bug #60221 (Tiger hash output byte order) (Mike)
-
-- Improved intl extension:
- . Added Spoofchecker class, allows checking for visibly confusable characters and
- other security issues. (Scott)
- . Added Transliterator class, allowing transliteration of strings.
- (Gustavo)
- . Added support for UTS #46. (Gustavo)
- . Fixed build on Fedora 15 / Ubuntu 11. (Hannes)
- . Fixed bug #55562 (grapheme_substr() returns false on big length). (Stas)
-
-- Improved JSON extension:
- . Added new json_encode() option JSON_UNESCAPED_UNICODE. FR #53946.
- (Alexander, Gwynne)
- . Added JsonSerializable interface. (Sara)
- . Added JSON_BIGINT_AS_STRING, extended json_decode() sig with $options.
- (Sara)
- . Added support for JSON_NUMERIC_CHECK option in json_encode() that converts
- numeric strings to integers. (Ilia)
- . Added new json_encode() option JSON_UNESCAPED_SLASHES. FR #49366. (Adam)
- . Added new json_encode() option JSON_PRETTY_PRINT. FR #44331. (Adam)
-
-- Improved LDAP extension:
- . Added paged results support. FR #42060. (ando@OpenLDAP.org,
- iarenuno@eteo.mondragon.edu, jeanseb@au-fil-du.net, remy.saissy@gmail.com)
-
-- Improved mbstring extension:
- . Added Shift_JIS/UTF-8 Emoji (pictograms) support. (Rui)
- . Added JIS X0213:2004 (Shift_JIS-2004, EUC-JP-2004, ISO-2022-JP-2004)
- support. (Rui)
- . Ill-formed UTF-8 check for security enhancements. (Rui)
- . Added MacJapanese (Shift_JIS) and gb18030 encoding support. (Rui)
- . Added encode/decode in hex format to mb_[en|de]code_numericentity(). (Rui)
- . Added user JIS X0213:2004 (Shift_JIS-2004, EUC-JP-2004, ISO-2022-JP-2004)
- support. (Rui)
- . Added the user defined area for CP936 and CP950 (Rui).
- . Fixed bug #60306 (Characters lost while converting from cp936 to utf8).
- (Laruence)
-
-- Improved MySQL extensions:
- . MySQL: Deprecated mysql_list_dbs(). FR #50667. (Andrey)
- . mysqlnd: Added named pipes support. FR #48082. (Andrey)
- . MySQLi: Added iterator support in MySQLi. mysqli_result implements
- Traversable. (Andrey, Johannes)
- . PDO_mysql: Removed support for linking with MySQL client libraries older
- than 4.1. (Johannes)
- . ext/mysql, mysqli and pdo_mysql now use mysqlnd by default. (Johannes)
- . Fixed bug #55473 (mysql_pconnect leaks file descriptors on reconnect).
- (Andrey, Laruence)
- . Fixed bug #55653 (PS crash with libmysql when binding same variable as
- param and out). (Laruence)
-
-- Improved OpenSSL extension:
- . Added AES support. FR #48632. (yonas dot y at gmail dot com, Pierre)
- . Added no padding option to openssl_encrypt()/openssl_decrypt(). (Scott)
- . Use php's implementation for Windows Crypto API in
- openssl_random_pseudo_bytes. (Pierre)
- . On error in openssl_random_pseudo_bytes() made sure we set strong result
- to false. (Scott)
- . Fixed possible attack in SSL sockets with SSL 3.0 / TLS 1.0.
- CVE-2011-3389. (Scott)
- . Fixed bug #61124 (Crash when decoding an invalid base64 encoded string).
- (me at ktamura dot com, Scott)
-
-- Improved PDO:
- . Fixed PDO objects binary incompatibility. (Dmitry)
-
-- PDO DBlib driver:
- . Added nextRowset support.
- . Fixed bug #50755 (PDO DBLIB Fails with OOM).
-
-- Improved PostgreSQL extension:
- . Added support for "extra" parameter for PGNotify().
- (r dot i dot k at free dot fr, Ilia)
-
-- Improved PCRE extension:
- . Changed third parameter of preg_match_all() to optional. FR #53238. (Adam)
-
-- Improved Readline extension:
- . Fixed bug #54450 (Enable callback support when built against libedit).
- (fedora at famillecollet dot com, Hannes)
-
-- Improved Reflection extension:
- . Added ReflectionClass::newInstanceWithoutConstructor() to create a new
- instance of a class without invoking its constructor. FR #55490.
- (Sebastian)
- . Added ReflectionExtension::isTemporary() and
- ReflectionExtension::isPersistent() methods. (Johannes)
- . Added ReflectionZendExtension class. (Johannes)
- . Added ReflectionClass::isCloneable(). (Felipe)
-
-- Improved Session extension:
- . Expose session status via new function, session_status (FR #52982) (Arpad)
- . Added support for object-oriented session handlers. (Arpad)
- . Added support for storing upload progress feedback in session data. (Arnaud)
- . Changed session.entropy_file to default to /dev/urandom or /dev/arandom if
- either is present at compile time. (Rasmus)
- . Fixed bug #60860 (session.save_handler=user without defined function core
- dumps). (Felipe)
- . Implement FR #60551 (session_set_save_handler should support a core's
- session handler interface). (Arpad)
- . Fixed bug #60640 (invalid return values). (Arpad)
-
-- Improved SNMP extension (Boris Lytochkin):
- . Added OO API. FR #53594 (php-snmp rewrite).
- . Sanitized return values of existing functions. Now it returns FALSE on
- failure.
- . Allow ~infinite OIDs in GET/GETNEXT/SET queries. Autochunk them to max_oids
- upon request.
- . Introducing unit tests for extension with ~full coverage.
- . IPv6 support. (FR #42918)
- . Way of representing OID value can now be changed when SNMP_VALUE_OBJECT
- is used for value output mode. Use or'ed SNMP_VALUE_LIBRARY(default if
- not specified) or SNMP_VALUE_PLAIN. (FR #54502)
- . Fixed bug #60749 (SNMP module should not strip non-standard SNMP port
- from hostname). (Boris Lytochkin)
- . Fixed bug #60585 (php build fails with USE flag snmp when IPv6 support
- is disabled). (Boris Lytochkin)
- . Fixed bug #53862 (snmp_set_oid_output_format does not allow returning to default)
- . Fixed bug #46065 (snmp_set_quick_print() persists between requests)
- . Fixed bug #45893 (Snmp buffer limited to 2048 char)
- . Fixed bug #44193 (snmp v3 noAuthNoPriv doesn't work)
-
-- Improved SOAP extension:
- . Added new SoapClient option "keep_alive". FR #60329. (Pierrick)
- . Fixed basic HTTP authentication for WSDL sub requests. (Dmitry)
-
-- Improved SPL extension:
- . Added RegexIterator::getRegex() method. (Joshua Thijssen)
- . Added SplObjectStorage::getHash() hook. (Etienne)
- . Added CallbackFilterIterator and RecursiveCallbackFilterIterator. (Arnaud)
- . Added missing class_uses(..) as pointed out by #55266 (Stefan)
- . Immediately reject wrong usages of directories under Spl(Temp)FileObject
- and friends. (Etienne, Pierre)
- . FilesystemIterator, GlobIterator and (Recursive)DirectoryIterator now use
- the default stream context. (Hannes)
- . Fixed bug #60201 (SplFileObject::setCsvControl does not expose third
- argument via Reflection). (Peter)
- . Fixed bug #55287 (spl_classes() not includes CallbackFilter classes)
- (sasezaki at gmail dot com, salathe)
-
-- Improved Sysvshm extension:
- . Fixed bug #55750 (memory copy issue in sysvshm extension).
- (Ilia, jeffhuang9999 at gmail dot com)
-
-- Improved Tidy extension:
- . Fixed bug #54682 (Tidy::diagnose() NULL pointer dereference).
- (Maksymilian Arciemowicz, Felipe)
-
-- Improved Tokenizer extension:
- . Fixed bug #54089 (token_get_all with regards to __halt_compiler is
- not binary safe). (Nikita Popov)
-
-- Improved XSL extension:
- . Added XsltProcessor::setSecurityPrefs($options) and getSecurityPrefs() to
- define forbidden operations within XSLT stylesheets, default is not to
- enable write operations from XSLT. Bug #54446 (Chregu, Nicolas Gregoire)
- . XSL doesn't stop transformation anymore, if a PHP function can't be called
- (Christian)
-
-- Improved ZLIB extension:
- . Re-implemented non-file related functionality. (Mike)
- . Fixed bug #55544 (ob_gzhandler always conflicts with zlib.output_compression).
- (Mike)
-
-14 Jun 2012, PHP 5.3.14
-
-- CLI SAPI:
- . Fixed bug #61546 (functions related to current script failed when chdir()
- in cli sapi). (Laruence, reeze.xia@gmail.com)
-
-- CURL:
- . Fixed bug #61948 (CURLOPT_COOKIEFILE '' raises open_basedir restriction).
- (Laruence)
-
-- COM:
- . Fixed bug #62146 com_dotnet cannot be built shared. (Johannes)
-
-- Core:
- . Fixed CVE-2012-2143. (Solar Designer)
- . Fixed missing bound check in iptcparse(). (chris at chiappa.net)
- . Fixed bug #62373 (serialize() generates wrong reference to the object).
- (Moriyoshi)
- . Fixed bug #62005 (unexpected behavior when incrementally assigning to a
- member of a null object). (Laruence)
- . Fixed bug #61991 (long overflow in realpath_cache_get()). (Anatoliy)
- . Fixed bug #61764 ('I' unpacks n as signed if n > 2^31-1 on LP64). (Gustavo)
- . Fixed bug #61730 (Segfault from array_walk modifying an array passed by
- reference). (Laruence)
- . Fixed bug #61713 (Logic error in charset detection for htmlentities).
- (Anatoliy)
- . Fixed bug #54197 ([PATH=] sections incompatibility with user_ini.filename
- set to null). (Anatoliy)
- . Changed php://fd to be available only for CLI.
-
-- Fileinfo:
- . Fixed bug #61812 (Uninitialised value used in libmagic).
- (Laruence, Gustavo)
-
-- Iconv extension:
- . Fixed a bug that iconv extension fails to link to the correct library
- when another extension makes use of a library that links to the iconv
- library. See https://bugs.gentoo.org/show_bug.cgi?id=364139 for detail.
- (Moriyoshi)
-
-- Intl:
- . Fixed bug #62082 (Memory corruption in internal function
- get_icu_disp_value_src_php()). (Gustavo)
-
-- JSON
- . Fixed bug #61537 (json_encode() incorrectly truncates/discards
- information). (Adam)
-
-- PDO:
- . Fixed bug #61755 (A parsing bug in the prepared statements can lead to
- access violations). (Johannes)
-
-- Phar:
- . Fix bug #61065 (Secunia SA44335). (Rasmus)
-
-- Streams:
- . Fixed bug #61961 (file_get_contents leaks when access empty file with
- maxlen set). (Reeze)
-
-08 May 2012, PHP 5.3.13
-- CGI
- . Improve fix for PHP-CGI query string parameter vulnerability, CVE-2012-2311.
- (Stas)
-
-03 May 2012, PHP 5.3.12
-- Fix PHP-CGI query string parameter vulnerability, CVE-2012-1823. (Rasmus)
-
-26 Apr 2012, PHP 5.3.11
-
-- Core:
- . Fixed bug #61605 (header_remove() does not remove all headers).
- (Laruence)
- . Fixed bug #61541 (Segfault when using ob_* in output_callback).
- (reeze.xia@gmail.com)
- . Fixed bug #61273 (call_user_func_array with more than 16333 arguments
- leaks / crashes). (Laruence)
- . Fixed bug #61165 (Segfault - strip_tags()). (Laruence)
- . Improved max_input_vars directive to check nested variables (Dmitry).
- . Fixed bug #61095 (Incorect lexing of 0x00*+<NUM>). (Etienne)
- . Fixed bug #61087 (Memory leak in parse_ini_file when specifying
- invalid scanner mode). (Nikic, Laruence)
- . Fixed bug #61072 (Memory leak when restoring an exception handler).
- (Nikic, Laruence)
- . Fixed bug #61058 (array_fill leaks if start index is PHP_INT_MAX).
- (Laruence)
- . Fixed bug #61043 (Regression in magic_quotes_gpc fix for CVE-2012-0831).
- (Ondřej Surý)
- . Fixed bug #61000 (Exceeding max nesting level doesn't delete numerical
- vars). (Laruence)
- . Fixed bug #60895 (Possible invalid handler usage in windows random
- functions). (Pierre)
- . Fixed bug #60825 (Segfault when running symfony 2 tests).
- (Dmitry, Laruence)
- . Fixed bug #60801 (strpbrk() mishandles NUL byte). (Adam)
- . Fixed bug #60569 (Nullbyte truncates Exception $message). (Ilia)
- . Fixed bug #60227 (header() cannot detect the multi-line header with CR).
- (rui, Gustavo)
- . Fixed bug #60222 (time_nanosleep() does validate input params). (Ilia)
- . Fixed bug #54374 (Insufficient validating of upload name leading to
- corrupted $_FILES indices). (CVE-2012-1172). (Stas, lekensteyn at
- gmail dot com, Pierre)
- . Fixed bug #52719 (array_walk_recursive crashes if third param of the
- function is by reference). (Nikita Popov)
- . Fixed bug #51860 (Include fails with toplevel symlink to /). (Dmitry)
-
-- DOM
- . Added debug info handler to DOM objects. (Gustavo, Joey Smith)
-
-- FPM
- . Fixed bug #61430 (Transposed memset() params in sapi/fpm/fpm/fpm_shm.c).
- (michaelhood at gmail dot com, Ilia)
-
-- Ibase
- . Fixed bug #60947 (Segmentation fault while executing ibase_db_info).
- (Ilia)
-
-- Installation
- . Fixed bug #61172 (Add Apache 2.4 support). (Chris Jones)
-
-- Fileinfo
- . Fixed bug #61173 (Unable to detect error from finfo constructor). (Gustavo)
-
-- Firebird Database extension (ibase):
- . Fixed bug #60802 (ibase_trans() gives segfault when passing params).
-
-- Libxml:
- . Fixed bug #61617 (Libxml tests failed(ht is already destroyed)).
- (Laruence)
- . Fixed bug #61367 (open_basedir bypass using libxml RSHUTDOWN).
- (Tim Starling)
-
-- mysqli
- . Fixed bug #61003 (mysql_stat() require a valid connection). (Johannes).
-
-- PDO_mysql
- . Fixed bug #61207 (PDO::nextRowset() after a multi-statement query doesn't
- always work). (Johannes)
- . Fixed bug #61194 (PDO should export compression flag with myslqnd).
- (Johannes)
-
-- PDO_odbc
- . Fixed bug #61212 (PDO ODBC Segfaults on SQL_SUCESS_WITH_INFO). (Ilia)
-
-- PDO_pgsql
- . Fixed bug #61267 (pdo_pgsql's PDO::exec() returns the number of SELECTed
- rows on postgresql >= 9). (ben dot pineau at gmail dot com)
-
-- PDO_Sqlite extension:
- . Add createCollation support. (Damien)
-
-- Phar:
- . Fixed bug #61184 (Phar::webPhar() generates headers with trailing NUL
- bytes). (Nikic)
-
-- PHP-FPM SAPI:
- . Fixed bug #60811 (php-fpm compilation problem). (rasmus)
-
-- Readline:
- . Fixed bug #61088 (Memory leak in readline_callback_handler_install).
- (Nikic, Laruence)
- . Add open_basedir checks to readline_write_history and readline_read_history.
- (Rasmus, reported by Mateusz Goik)
-
-- Reflection:
- . Fixed bug #61388 (ReflectionObject:getProperties() issues invalid reads
- when get_properties returns a hash table with (inaccessible) dynamic
- numeric properties). (Gustavo)
- . Fixed bug #60968 (Late static binding doesn't work with
- ReflectionMethod::invokeArgs()). (Laruence)
-
-- SOAP
- . Fixed basic HTTP authentication for WSDL sub requests. (Dmitry)
- . Fixed bug #60887 (SoapClient ignores user_agent option and sends no
- User-Agent header). (carloschilazo at gmail dot com)
- . Fixed bug #60842, #51775 (Chunked response parsing error when
- chunksize length line is > 10 bytes). (Ilia)
- . Fixed bug #49853 (Soap Client stream context header option ignored).
- (Dmitry)
-
-- SPL
- . Fixed memory leak when calling SplFileInfo's constructor twice. (Felipe)
- . Fixed bug #61418 (Segmentation fault when DirectoryIterator's or
- FilesystemIterator's iterators are requested more than once without
- having had its dtor callback called in between). (Gustavo)
- . Fixed bug #61347 (inconsistent isset behavior of Arrayobject). (Laruence)
- . Fixed bug #61326 (ArrayObject comparison). (Gustavo)
-
-- SQLite3 extension:
- . Add createCollation() method. (Brad Dewar)
-
-- Session:
- . Fixed bug #60860 (session.save_handler=user without defined function core
- dumps). (Felipe)
- . Fixed bug #60634 (Segmentation fault when trying to die() in
- SessionHandler::write()). (Ilia)
-
-- Streams:
- . Fixed bug #61371 (stream_context_create() causes memory leaks on use
- streams_socket_create). (Gustavo)
- . Fixed bug #61253 (Wrappers opened with errors concurrency problem on ZTS).
- (Gustavo)
- . Fixed bug #61115 (stream related segfault on fatal error in
- php_stream_context_link). (Gustavo)
- . Fixed bug #60817 (stream_get_line() reads from stream even when there is
- already sufficient data buffered). stream_get_line() now behaves more like
- fgets(), as is documented. (Gustavo)
- . Further fix for bug #60455 (stream_get_line misbehaves if EOF is not
- detected together with the last read). (Gustavo)
- . Fixed bug #60106 (stream_socket_server silently truncates long unix
- socket paths). (Ilia)
-
-- Tidy:
- . Fixed bug #54682 (tidy null pointer dereference). (Tony, David Soria Parra)
-
-- XMLRPC:
- . Fixed bug #61264 (xmlrpc_parse_method_descriptions leaks temporary
- variable). (Nikita Popov)
- . Fixed bug #61097 (Memory leak in xmlrpc functions copying zvals). (Nikic)
-
-- Zlib:
- . Fixed bug #61139 (gzopen leaks when specifying invalid mode). (Nikic)
-
-02 Feb 2012, PHP 5.3.10
-
-- Core:
- . Fixed arbitrary remote code execution vulnerability reported by Stefan
- Esser, CVE-2012-0830. (Stas, Dmitry)
-
-10 Jan 2012, PHP 5.3.9
-
-- Core:
- . Added max_input_vars directive to prevent attacks based on hash collisions
- (CVE-2011-4885) (Dmitry).
- . Fixed bug #60205 (possible integer overflow in content_length). (Laruence)
- . Fixed bug #60139 (Anonymous functions create cycles not detected by the
- GC). (Dmitry)
- . Fixed bug #60138 (GC crash with referenced array in RecursiveArrayIterator)
- (Dmitry).
- . Fixed bug #60120 (proc_open's streams may hang with stdin/out/err when
- the data exceeds or is equal to 2048 bytes). (Pierre, Pascal Borreli)
- . Fixed bug #60099 (__halt_compiler() works in braced namespaces). (Felipe)
- . Fixed bug #60019 (Function time_nanosleep() is undefined on OS X). (Ilia)
- . Fixed bug #55874 (GCC does not provide __sync_fetch_and_add on some archs).
- (klightspeed at netspace dot net dot au)
- . Fixed bug #55798 (serialize followed by unserialize with numeric object
- prop. gives integer prop). (Gustavo)
- . Fixed bug #55749 (TOCTOU issue in getenv() on Windows builds). (Pierre)
- . Fixed bug #55707 (undefined reference to `__sync_fetch_and_add_4' on Linux
- parisc). (Felipe)
- . Fixed bug #55674 (fgetcsv & str_getcsv skip empty fields in some
- tab-separated records). (Laruence)
- . Fixed bug #55649 (Undefined function Bug()). (Laruence)
- . Fixed bug #55622 (memory corruption in parse_ini_string). (Pierre)
- . Fixed bug #55576 (Cannot conditionally move uploaded file without race
- condition). (Gustavo)
- . Fixed bug #55510: $_FILES 'name' missing first character after upload.
- (Arpad)
- . Fixed bug #55509 (segfault on x86_64 using more than 2G memory). (Laruence)
- . Fixed bug #55504 (Content-Type header is not parsed correctly on
- HTTP POST request). (Hannes)
- . Fixed bug #55475 (is_a() triggers autoloader, new optional 3rd argument to
- is_a and is_subclass_of). (alan_k)
- . Fixed bug #52461 (Incomplete doctype and missing xmlns).
- (virsacer at web dot de, Pierre)
- . Fixed bug #55366 (keys lost when using substr_replace an array). (Arpad)
- . Fixed bug #55273 (base64_decode() with strict rejects whitespace after
- pad). (Ilia)
- . Fixed bug #52624 (tempnam() by-pass open_basedir with nonnexistent
- directory). (Felipe)
- . Fixed bug #50982 (incorrect assumption of PAGE_SIZE size). (Dmitry)
- . Fixed invalid free in call_user_method() function. (Felipe)
- . Fixed bug #43200 (Interface implementation / inheritence not possible in
- abstract classes). (Felipe)
-
-
-- BCmath:
- . Fixed bug #60377 (bcscale related crashes on 64bits platforms). (shm)
-
-- Calendar:
- . Fixed bug #55797 (Integer overflow in SdnToGregorian leads to segfault (in
- optimized builds). (Gustavo)
-
-- cURL:
- . Fixed bug #60439 (curl_copy_handle segfault when used with
- CURLOPT_PROGRESSFUNCTION). (Pierrick)
- . Fixed bug #54798 (Segfault when CURLOPT_STDERR file pointer is closed
- before calling curl_exec). (Hannes)
- . Fixed issues were curl_copy_handle() would sometimes lose copied
- preferences. (Hannes)
-
-- DateTime:
- . Fixed bug #60373 (Startup errors with log_errors on cause segfault).
- (Derick)
- . Fixed bug #60236 (TLA timezone dates are not converted properly from
- timestamp). (Derick)
- . Fixed bug #55253 (DateTime::add() and sub() result -1 hour on objects with
- time zone type 2). (Derick)
- . Fixed bug #54851 (DateTime::createFromFormat() doesn't interpret "D").
- (Derick)
- . Fixed bug #53502 (strtotime with timezone memory leak). (Derick)
- . Fixed bug #52062 (large timestamps with DateTime::getTimestamp and
- DateTime::setTimestamp). (Derick)
- . Fixed bug #51994 (date_parse_from_format is parsing invalid date using 'yz'
- format). (Derick)
- . Fixed bug #52113 (Seg fault while creating (by unserialization)
- DatePeriod). (Derick)
- . Fixed bug #48476 (cloning extended DateTime class without calling
- parent::__constr crashed PHP). (Hannes)
-
-- EXIF:
- . Fixed bug #60150 (Integer overflow during the parsing of invalid exif
- header). (CVE-2011-4566) (Stas, flolechaud at gmail dot com)
-
-- Fileinfo:
- . Fixed bug #60094 (C++ comment fails in c89). (Laruence)
- . Fixed possible memory leak in finfo_open(). (Felipe)
- . Fixed memory leak when calling the Finfo constructor twice. (Felipe)
-
-- Filter:
- . Fixed Bug #55478 (FILTER_VALIDATE_EMAIL fails with internationalized
- domain name addresses containing >1 -). (Ilia)
-
-- FTP:
- . Fixed bug #60183 (out of sync ftp responses). (bram at ebskamp dot me,
- rasmus)
-
-- Gd:
- . Fixed bug #60160 (imagefill() doesn't work correctly
- for small images). (Florian)
- . Fixed potential memory leak on a png error (Rasmus, Paul Saab)
-
-- Intl:
- . Fixed bug #60192 (SegFault when Collator not constructed
- properly). (Florian)
- . Fixed memory leak in several Intl locale functions. (Felipe)
-
-- Json:
- . Fixed bug #55543 (json_encode() with JSON_NUMERIC_CHECK fails on objects
- with numeric string properties). (Ilia, dchurch at sciencelogic dot com)
-
-- Mbstring:
- . Fixed possible crash in mb_ereg_search_init() using empty pattern. (Felipe)
-
-- MS SQL:
- . Fixed bug #60267 (Compile failure with freetds 0.91). (Felipe)
-
-- MySQL:
- . Fixed bug #55550 (mysql.trace_mode miscounts result sets). (Johannes)
-
-- MySQLi extension:
- . Fixed bug #55859 (mysqli->stat property access gives error). (Andrey)
- . Fixed bug #55582 (mysqli_num_rows() returns always 0 for unbuffered, when
- mysqlnd is used). (Andrey)
- . Fixed bug #55703 (PHP crash when calling mysqli_fetch_fields).
- (eran at zend dot com, Laruence)
-
-- mysqlnd
- . Fixed bug #55609 (mysqlnd cannot be built shared). (Johannes)
- . Fixed bug #55067 (MySQL doesn't support compression - wrong config option).
- (Andrey)
-
-- NSAPI SAPI:
- . Don't set $_SERVER['HTTPS'] on unsecure connection (bug #55403). (Uwe
- Schindler)
-
-- OpenSSL:
- . Fixed bug #60279 (Fixed NULL pointer dereference in
- stream_socket_enable_crypto, case when ssl_handle of session_stream is not
- initialized.) (shm)
- . Fix segfault with older versions of OpenSSL. (Scott)
-
-- Oracle Database extension (OCI8):
- . Fixed bug #59985 (show normal warning text for OCI_NO_DATA).
- (Chris Jones)
- . Increased maximum Oracle error message buffer length for new 11.2.0.3 size.
- (Chris Jones)
- . Improve internal initalization failure error messages. (Chris Jones)
-
-- PDO
- . Fixed bug #55776 (PDORow to session bug). (Johannes)
-
-- PDO Firebird:
- . Fixed bug #48877 ("bindValue" and "bindParam" do not work for PDO Firebird).
- (Mariuz)
- . Fixed bug #47415 (PDO_Firebird segfaults when passing lowercased column name to bindColumn).
- . Fixed bug #53280 (PDO_Firebird segfaults if query column count less than param count).
- (Mariuz)
-
-- PDO MySQL driver:
- . Fixed bug #60155 (pdo_mysql.default_socket ignored). (Johannes)
- . Fixed bug #55870 (PDO ignores all SSL parameters when used with mysql
- native driver). (Pierre)
- . Fixed bug #54158 (MYSQLND+PDO MySQL requires #define
- MYSQL_OPT_LOCAL_INFILE). (Andrey)
-
-- PDO OCI driver:
- . Fixed bug #55768 (PDO_OCI can't resume Oracle session after it's been
- killed). (mikhail dot v dot gavrilov at gmail dot com, Chris Jones, Tony)
-
-- Phar:
- . Fixed bug #60261 (NULL pointer dereference in phar). (Felipe)
- . Fixed bug #60164 (Stubs of a specific length break phar_open_from_fp
- scanning for __HALT_COMPILER). (Ralph Schindler)
- . Fixed bug #53872 (internal corruption of phar). (Hannes)
- . Fixed bug #52013 (Unable to decompress files in a compressed phar). (Hannes)
-
-- PHP-FPM SAPI:
- . Dropped restriction of not setting the same value multiple times, the last
- one holds. (giovanni at giacobbi dot net, fat)
- . Added .phar to default authorized extensions. (fat)
- . Fixed bug #60659 (FPM does not clear auth_user on request accept).
- (bonbons at linux-vserver dot org)
- . Fixed bug #60629 (memory corruption when web server closed the fcgi fd).
- (fat)
- . Enhance error log when the primary script can't be open. FR #60199. (fat)
- . Fixed bug #60179 (php_flag and php_value does not work properly). (fat)
- . Fixed bug #55577 (status.html does not install). (fat)
- . Fixed bug #55533 (The -d parameter doesn't work). (fat)
- . Fixed bug #55526 (Heartbeat causes a lot of unnecessary events). (fat)
- . Fixed bug #55486 (status show BIG processes number). (fat)
- . Enhanced security by limiting access to user defined extensions.
- FR #55181. (fat)
- . Added process.max to control the number of process FPM can fork. FR #55166.
- (fat)
- . Implemented FR #54577 (Enhanced status page with full status and details
- about each processes. Also provide a web page (status.html) for
- real-time FPM status. (fat)
- . Lowered default value for Process Manager. FR #54098. (fat)
- . Implemented FR #52569 (Add the "ondemand" process-manager
- to allow zero children). (fat)
- . Added partial syslog support (on error_log only). FR #52052. (fat)
-
-- Postgres:
- . Fixed bug #60244 (pg_fetch_* functions do not validate that row param
- is >0). (Ilia)
- . Added PGSQL_LIBPQ_VERSION/PGSQL_LIBPQ_VERSION_STR constants. (Yasuo)
-
-- Reflection:
- . Fixed bug #60367 (Reflection and Late Static Binding). (Laruence)
-
-- Session:
- . Fixed bug #55267 (session_regenerate_id fails after header sent). (Hannes)
-
-- SimpleXML:
- . Reverted the SimpleXML->query() behaviour to returning empty arrays
- instead of false when no nodes are found as it was since 5.3.3
- (bug #48601). (chregu, rrichards)
-
-- SOAP
- . Fixed bug #54911 (Access to a undefined member in inherit SoapClient may
- cause Segmentation Fault). (Dmitry)
- . Fixed bug #48216 (PHP Fatal error: SOAP-ERROR: Parsing WSDL:
- Extra content at the end of the doc, when server uses chunked transfer
- encoding with spaces after chunk size). (Dmitry)
- . Fixed bug #44686 (SOAP-ERROR: Parsing WSDL with references). (Dmitry)
-
-- Sockets:
- . Fixed bug #60048 (sa_len a #define on IRIX). (china at thewrittenword dot
- com)
-
-- SPL:
- . Fixed bug #60082 (Crash in ArrayObject() when using recursive references).
- (Tony)
- . Fixed bug #55807 (Wrong value for splFileObject::SKIP_EMPTY).
- (jgotti at modedemploi dot fr, Hannes)
- . Fixed bug #54304 (RegexIterator::accept() doesn't work with scalar values).
- (Hannes)
-
-- Streams:
- . Fixed bug #60455 (stream_get_line misbehaves if EOF is not detected together
- with the last read). (Gustavo)
-
-- Tidy:
- . Fixed bug #54682 (Tidy::diagnose() NULL pointer dereference).
- (Maksymilian Arciemowicz, Felipe)
-
-- XSL:
- . Added xsl.security_prefs ini option to define forbidden operations within
- XSLT stylesheets, default is not to enable write operations. This option
- won't be in 5.4, since there's a new method. Fixes Bug #54446. (Chregu,
- Nicolas Gregoire)
-
-23 Aug 2011, PHP 5.3.8
-
-- Core:
- . Fixed bug #55439 (crypt() returns only the salt for MD5). (Stas)
-
-- OpenSSL:
- . Reverted a change in timeout handling restoring PHP 5.3.6 behavior,
- as the new behavior caused mysqlnd SSL connections to hang (#55283).
- (Pierre, Andrey, Johannes)
-
-18 Aug 2011, PHP 5.3.7
-- Upgraded bundled SQLite to version 3.7.7.1. (Scott)
-- Upgraded bundled PCRE to version 8.12. (Scott)
-
-- Zend Engine:
- . Fixed bug #55156 (ReflectionClass::getDocComment() returns comment even
- though the class has none). (Felipe)
- . Fixed bug #55007 (compiler fail after previous fail). (Felipe)
- . Fixed bug #54910 (Crash when calling call_user_func with unknown function
- name). (Dmitry)
- . Fixed bug #54804 (__halt_compiler and imported namespaces).
- (Pierrick, Felipe)
- . Fixed bug #54624 (class_alias and type hint). (Felipe)
- . Fixed bug #54585 (track_errors causes segfault). (Dmitry)
- . Fixed bug #54423 (classes from dl()'ed extensions are not destroyed).
- (Tony, Dmitry)
- . Fixed bug #54372 (Crash accessing global object itself returned from its
- __get() handle). (Dmitry)
- . Fixed bug #54367 (Use of closure causes problem in ArrayAccess). (Dmitry)
- . Fixed bug #54358 (Closure, use and reference). (Dmitry)
- . Fixed bug #54262 (Crash when assigning value to a dimension in a non-array).
- (Dmitry)
- . Fixed bug #54039 (use() of static variables in lambda functions can break
- staticness). (Dmitry)
-
-- Core
- . Updated crypt_blowfish to 1.2. ((CVE-2011-2483) (Solar Designer)
- . Removed warning when argument of is_a() or is_subclass_of() is not
- a known class. (Stas)
- . Fixed crash in error_log(). (Felipe) Reported by Mateusz Kocielski.
- . Added PHP_MANDIR constant telling where the manpages were installed into,
- and an --man-dir argument to php-config. (Hannes)
- . Fixed a crash inside dtor for error handling. (Ilia)
- . Fixed buffer overflow on overlog salt in crypt(). (Clément LECIGNE, Stas)
- . Implemented FR #54459 (Range function accuracy). (Adam)
-
- . Fixed bug #55399 (parse_url() incorrectly treats ':' as a valid path).
- (Ilia)
- . Fixed bug #55339 (Segfault with allow_call_time_pass_reference = Off).
- (Dmitry)
- . Fixed bug #55295 [NEW]: popen_ex on windows, fixed possible heap overflow
- (Pierre)
- . Fixed bug #55258 (Windows Version Detecting Error).
- ( xiaomao5 at live dot com, Pierre)
- . Fixed bug #55187 (readlink returns weird characters when false result).
- (Pierre)
- . Fixed bug #55082 (var_export() doesn't escape properties properly).
- (Gustavo)
- . Fixed bug #55014 (Compile failure due to improper use of ctime_r()). (Ilia)
- . Fixed bug #54939 (File path injection vulnerability in RFC1867 File upload
- filename). (Felipe) Reported by Krzysztof Kotowicz. (CVE-2011-2202)
- . Fixed bug #54935 php_win_err can lead to crash. (Pierre)
- . Fixed bug #54924 (assert.* is not being reset upon request shutdown). (Ilia)
- . Fixed bug #54895 (Fix compiling with older gcc version without need for
- membar_producer macro). (mhei at heimpold dot de)
- . Fixed bug #54866 (incorrect accounting for realpath_cache_size).
- (Dustin Ward)
- . Fixed bug #54723 (getimagesize() doesn't check the full ico signature).
- (Scott)
- . Fixed bug #54721 (Different Hashes on Windows, BSD and Linux on wrong Salt
- size). (Pierre, os at irj dot ru)
- . Fixed bug #54580 (get_browser() segmentation fault when browscap ini
- directive is set through php_admin_value). (Gustavo)
- . Fixed bug #54332 (Crash in zend_mm_check_ptr // Heap corruption). (Dmitry)
- . Fixed bug #54305 (Crash in gc_remove_zval_from_buffer). (Dmitry)
- . Fixed bug #54238 (use-after-free in substr_replace()). (Stas)
- (CVE-2011-1148)
- . Fixed bug #54204 (Can't set a value with a PATH section in php.ini).
- (Pierre)
- . Fixed bug #54180 (parse_url() incorrectly parses path when ? in fragment).
- (tomas dot brastavicius at quantum dot lt, Pierrick)
- . Fixed bug #54137 (file_get_contents POST request sends additional line
- break). (maurice-php at mertinkat dot net, Ilia)
- . Fixed bug #53848 (fgetcsv() ignores spaces at beginnings of fields). (Ilia)
- . Alternative fix for bug #52550, as applied to the round() function (signed
- overflow), as the old fix impacted the algorithm for numbers with magnitude
- smaller than 0. (Gustavo)
- . Fixed bug #53727 (Inconsistent behavior of is_subclass_of with interfaces)
- (Ralph Schindler, Dmitry)
- . Fixed bug #52935 (call exit in user_error_handler cause stream relate
- core). (Gustavo)
- . Fixed bug #51997 (SEEK_CUR with 0 value, returns a warning). (Ilia)
- . Fixed bug #50816 (Using class constants in array definition fails).
- (Pierrick, Dmitry)
- . Fixed bug #50363 (Invalid parsing in convert.quoted-printable-decode
- filter). (slusarz at curecanti dot org)
- . Fixed bug #48465 (sys_get_temp_dir() possibly inconsistent when using
- TMPDIR on Windows). (Pierre)
-
-- Apache2 Handler SAPI:
- . Fixed bug #54529 (SAPI crashes on apache_config.c:197).
- (hebergement at riastudio dot fr)
-
-- CLI SAPI:
- . Fixed bug #52496 (Zero exit code on option parsing failure). (Ilia)
-
-- cURL extension:
- . Added ini option curl.cainfo (support for custom cert db). (Pierre)
- . Added CURLINFO_REDIRECT_URL support. (Daniel Stenberg, Pierre)
- . Added support for CURLOPT_MAX_RECV_SPEED_LARGE and
- CURLOPT_MAX_SEND_SPEED_LARGE. FR #51815. (Pierrick)
-
-- DateTime extension:
- . Fixed bug where the DateTime object got changed while using date_diff().
- (Derick)
- . Fixed bug #54340 (DateTime::add() method bug). (Adam)
- . Fixed bug #54316 (DateTime::createFromFormat does not handle trailing '|'
- correctly). (Adam)
- . Fixed bug #54283 (new DatePeriod(NULL) causes crash). (Felipe)
- . Fixed bug #51819 (Case discrepancy in timezone names cause Uncaught
- exception and fatal error). (Hannes)
-
-- DBA extension:
- . Supress warning on non-existent file open with Berkeley DB 5.2. (Chris Jones)
- . Fixed bug #54242 (dba_insert returns true if key already exists). (Felipe)
-
-- Exif extesion:
- . Fixed bug #54121 (error message format string typo). (Ilia)
-
-- Fileinfo extension:
- . Fixed bug #54934 (Unresolved symbol strtoull in HP-UX 11.11). (Felipe)
-
-- Filter extension:
- . Added 3rd parameter to filter_var_array() and filter_input_array()
- functions that allows disabling addition of empty elements. (Ilia)
- . Fixed bug #53037 (FILTER_FLAG_EMPTY_STRING_NULL is not implemented). (Ilia)
-
-- Interbase extension:
- . Fixed bug #54269 (Short exception message buffer causes crash). (Felipe)
-
-- intl extension:
- . Implemented FR #54561 (Expose ICU version info). (David Zuelke, Ilia)
- . Implemented FR #54540 (Allow loading of arbitrary resource bundles when
- fallback is disabled). (David Zuelke, Stas)
-
-- Imap extension:
- . Fixed bug #55313 (Number of retries not set when params specified).
- (kevin at kevinlocke dot name)
-
-- json extension:
- . Fixed bug #54484 (Empty string in json_decode doesn't reset
- json_last_error()). (Ilia)
-
-- LDAP extension:
- . Fixed bug #53339 (Fails to build when compilng with gcc 4.5 and DSO
- libraries). (Clint Byrum, Raphael)
-
-- libxml extension:
- . Fixed bug #54601 (Removing the doctype node segfaults). (Hannes)
- . Fixed bug #54440 (libxml extension ignores default context). (Gustavo)
-
-- mbstring extension:
- . Fixed bug #54494 (mb_substr() mishandles UTF-32LE and UCS-2LE). (Gustavo)
-
-- MCrypt extension:
- . Change E_ERROR to E_WARNING in mcrypt_create_iv when not enough data
- has been fetched (Windows). (Pierre)
- . Fixed bug #55169 (mcrypt_create_iv always fails to gather sufficient random
- data on Windows). (Pierre)
-
-- mysqlnd
- . Fixed crash when using more than 28,000 bound parameters. Workaround is to
- set mysqlnd.net_cmd_buffer_size to at least 9000. (Andrey)
- . Fixed bug #54674 mysqlnd valid_sjis_(head|tail) is using invalid operator
- and range). (nihen at megabbs dot com, Andrey)
-
-- MySQLi extension:
- . Fixed bug #55283 (SSL options set by mysqli_ssl_set ignored for MySQLi
- persistent connections). (Andrey)
- . Fixed Bug #54221 (mysqli::get_warnings segfault when used in multi queries).
- (Andrey)
-
-- OpenSSL extension:
- . openssl_encrypt()/openssl_decrypt() truncated keys of variable length
- ciphers to the OpenSSL default for the algorithm. (Scott)
- . On blocking SSL sockets respect the timeout option where possible.
- (Scott)
- . Fixed bug #54992 (Stream not closed and error not returned when SSL
- CN_match fails). (Gustavo, laird_ngrps at dodo dot com dot au)
-
-- Oracle Database extension (OCI8):
- . Added oci_client_version() returning the runtime Oracle client library
- version. (Chris Jones)
-
-. PCRE extension:
- . Increased the backtrack limit from 100000 to 1000000 (Rasmus)
-
-- PDO extension:
- . Fixed bug #54929 (Parse error with single quote in sql comment). (Felipe)
- . Fixed bug #52104 (bindColumn creates Warning regardless of ATTR_ERRMODE
- settings). (Ilia)
-
-- PDO DBlib driver:
- . Fixed bug #54329 (MSSql extension memory leak).
- (dotslashpok at gmail dot com)
- . Fixed bug #54167 (PDO_DBLIB returns null on SQLUNIQUE field).
- (mjh at hodginsmedia dot com, Felipe)
-
-- PDO ODBC driver:
- . Fixed data type usage in 64bit. (leocsilva at gmail dot com)
-
-- PDO MySQL driver:
- . Fixed bug #54644 (wrong pathes in php_pdo_mysql_int.h). (Tony, Johannes)
- . Fixed bug #53782 (foreach throws irrelevant exception). (Johannes, Andrey)
- . Implemented FR #48587 (MySQL PDO driver doesn't support SSL connections).
- (Rob)
-
-- PDO PostgreSQL driver:
- . Fixed bug #54318 (Non-portable grep option used in PDO pgsql
- configuration). (bwalton at artsci dot utoronto dot ca)
-
-- PDO Oracle driver:
- . Fixed bug #44989 (64bit Oracle RPMs still not supported by pdo-oci).
- (jbnance at tresgeek dot net)
-
-- Phar extension:
- . Fixed bug #54395 (Phar::mount() crashes when calling with wrong parameters).
- (Felipe)
-
-- PHP-FPM SAPI:
- . Implemented FR #54499 (FPM ping and status_path should handle HEAD request). (fat)
- . Implemented FR #54172 (Overriding the pid file location of php-fpm). (fat)
- . Fixed missing Expires and Cache-Control headers for ping and status pages.
- (fat)
- . Fixed memory leak. (fat) Reported and fixed by Giovanni Giacobbi.
- . Fixed wrong value of log_level when invoking fpm with -tt. (fat)
- . Added xml format to the status page. (fat)
- . Removed timestamp in logs written by children processes. (fat)
- . Fixed exit at FPM startup on fpm_resources_prepare() errors. (fat)
- . Added master rlimit_files and rlimit_core in the global configuration
- settings. (fat)
- . Removed pid in debug logs written by chrildren processes. (fat)
- . Added custom access log (also added per request %CPU and memory
- mesurement). (fat)
- . Added a real scoreboard and several improvements to the status page. (fat)
-
-- Reflection extension:
- . Fixed bug #54347 (reflection_extension does not lowercase module function
- name). (Felipe, laruence at yahoo dot com dot cn)
-
-- SOAP extension:
- . Fixed bug #55323 (SoapClient segmentation fault when XSD_TYPEKIND_EXTENSION
- contains itself). (Dmitry)
- . Fixed bug #54312 (soap_version logic bug). (tom at samplonius dot org)
-
-- Sockets extension:
- . Fixed stack buffer overflow in socket_connect(). (CVE-2011-1938)
- Found by Mateusz Kocielski, Marek Kroemeke and Filip Palian. (Felipe)
- . Changed socket_set_block() and socket_set_nonblock() so they emit warnings
- on error. (Gustavo)
- . Fixed bug #51958 (socket_accept() fails on IPv6 server sockets). (Gustavo)
-
-- SPL extension:
- . Fixed bug #54971 (Wrong result when using iterator_to_array with use_keys
- on true). (Pierrick)
- . Fixed bug #54970 (SplFixedArray::setSize() isn't resizing). (Felipe)
- . Fixed bug #54609 (Certain implementation(s) of SplFixedArray cause hard
- crash). (Felipe)
- . Fixed bug #54384 (Dual iterators, GlobIterator, SplFileObject and
- SplTempFileObject crash when user-space classes don't call the paren
- constructor). (Gustavo)
- . Fixed bug #54292 (Wrong parameter causes crash in
- SplFileObject::__construct()). (Felipe)
- . Fixed bug #54291 (Crash iterating DirectoryIterator for dir name starting
- with \0). (Gustavo)
- . Fixed bug #54281 (Crash in non-initialized RecursiveIteratorIterator).
- (Felipe)
-
-- Streams:
- . Fixed bug #54946 (stream_get_contents infinite loop). (Hannes)
- . Fixed bug #54623 (Segfault when writing to a persistent socket after
- closing a copy of the socket). (Gustavo)
- . Fixed bug #54681 (addGlob() crashes on invalid flags). (Felipe)
-
-
-17 Mar 2011, PHP 5.3.6
-- Upgraded bundled Sqlite3 to version 3.7.4. (Ilia)
-- Upgraded bundled PCRE to version 8.11. (Ilia)
-
-- Zend Engine:
- . Indirect reference to $this fails to resolve if direct $this is never used
- in method. (Scott)
- . Added options to debug backtrace functions. (Stas)
- . Fixed bug numerous crashes due to setlocale (crash on error, pcre, mysql
- etc.) on Windows in thread safe mode. (Pierre)
- . Fixed Bug #53971 (isset() and empty() produce apparently spurious runtime
- error). (Dmitry)
- . Fixed Bug #53958 (Closures can't 'use' shared variables by value and by
- reference). (Dmitry)
- . Fixed Bug #53629 (memory leak inside highlight_string()). (Hannes, Ilia)
- . Fixed Bug #51458 (Lack of error context with nested exceptions). (Stas)
- . Fixed Bug #47143 (Throwing an exception in a destructor causes a fatal
- error). (Stas)
- . Fixed bug #43512 (same parameter name can be used multiple times in
- method/function definition). (Felipe)
-
-- Core:
- . Added ability to connect to HTTPS sites through proxy with basic
- authentication using stream_context/http/header/Proxy-Authorization (Dmitry)
- . Changed default value of ini directive serialize_precision from 100 to 17.
- (Gustavo)
- . Fixed bug #54055 (buffer overrun with high values for precision ini
- setting). (Gustavo)
- . Fixed bug #53959 (reflection data for fgetcsv out-of-date). (Richard)
- . Fixed bug #53577 (Regression introduced in 5.3.4 in open_basedir with a
- trailing forward slash). (lekensteyn at gmail dot com, Pierre)
- . Fixed bug #53682 (Fix compile on the VAX). (Rasmus, jklos)
- . Fixed bug #48484 (array_product() always returns 0 for an empty array).
- (Ilia)
- . Fixed bug #48607 (fwrite() doesn't check reply from ftp server before
- exiting). (Ilia)
-
-
-- Calendar extension:
- . Fixed bug #53574 (Integer overflow in SdnToJulian, sometimes leading to
- segfault). (Gustavo)
-
-- DOM extension:
- . Implemented FR #39771 (Made DOMDocument::saveHTML accept an optional DOMNode
- like DOMDocument::saveXML). (Gustavo)
-
-- DateTime extension:
- . Fixed a bug in DateTime->modify() where absolute date/time statements had
- no effect. (Derick)
- . Fixed bug #53729 (DatePeriod fails to initialize recurrences on 64bit
- big-endian systems). (Derick, rein@basefarm.no)
- . Fixed bug #52808 (Segfault when specifying interval as two dates). (Stas)
- . Fixed bug #52738 (Can't use new properties in class extended from
- DateInterval). (Stas)
- . Fixed bug #52290 (setDate, setISODate, setTime works wrong when DateTime
- created from timestamp). (Stas)
- . Fixed bug #52063 (DateTime constructor's second argument doesn't have a
- null default value). (Gustavo, Stas)
-
-- Exif extension:
- . Fixed bug #54002 (crash on crafted tag, reported by Luca Carettoni).
- (Pierre) (CVE-2011-0708)
-
-- Filter extension:
- . Fixed bug #53924 (FILTER_VALIDATE_URL doesn't validate port number).
- (Ilia, Gustavo)
- . Fixed bug #53150 (FILTER_FLAG_NO_RES_RANGE is missing some IP ranges).
- (Ilia)
- . Fixed bug #52209 (INPUT_ENV returns NULL for set variables (CLI)). (Ilia)
- . Fixed bug #47435 (FILTER_FLAG_NO_RES_RANGE don't work with ipv6).
- (Ilia, valli at icsurselva dot ch)
-
-- Fileinfo extension:
- . Fixed bug #54016 (finfo_file() Cannot determine filetype in archives).
- (Hannes)
-
-- Gettext
- . Fixed bug #53837 (_() crashes on Windows when no LANG or LANGUAGE
- environment variable are set). (Pierre)
-
-- IMAP extension:
- . Implemented FR #53812 (get MIME headers of the part of the email). (Stas)
- . Fixed bug #53377 (imap_mime_header_decode() doesn't ignore \t during long
- MIME header unfolding). (Adam)
-
-- Intl extension:
- . Fixed bug #53612 (Segmentation fault when using cloned several intl
- objects). (Gustavo)
- . Fixed bug #53512 (NumberFormatter::setSymbol crash on bogus $attr values).
- (Felipe)
- . Implemented clone functionality for number, date & message formatters.
- (Stas).
-
-- JSON extension:
- . Fixed bug #53963 (Ensure error_code is always set during some failed
- decodings). (Scott)
-
-- mysqlnd
- . Fixed problem with always returning 0 as num_rows for unbuffered sets.
- (Andrey, Ulf)
-
-- MySQL Improved extension:
- . Added 'db' and 'catalog' keys to the field fetching functions (FR #39847).
- (Kalle)
- . Fixed buggy counting of affected rows when using the text protocol. The
- collected statistics were wrong when multi_query was used with mysqlnd
- (Andrey)
- . Fixed bug #53795 (Connect Error from MySqli (mysqlnd) when using SSL).
- (Kalle)
- . Fixed bug #53503 (mysqli::query returns false after successful LOAD DATA
- query). (Kalle, Andrey)
- . Fixed bug #53425 (mysqli_real_connect() ignores client flags when built to
- call libmysql). (Kalle, tre-php-net at crushedhat dot com)
-
-- OpenSSL extension:
- . Fixed stream_socket_enable_crypto() not honoring the socket timeout in
- server mode. (Gustavo)
- . Fixed bug #54060 (Memory leaks when openssl_encrypt). (Pierre)
- . Fixed bug #54061 (Memory leaks when openssl_decrypt). (Pierre)
- . Fixed bug #53592 (stream_socket_enable_crypto() busy-waits in client mode).
- (Gustavo)
- . Implemented FR #53447 (Cannot disable SessionTicket extension for servers
- that do not support it) by adding a no_ticket SSL context option. (Adam,
- Tony)
-
-- PDO MySQL driver:
- . Fixed bug #53551 (PDOStatement execute segfaults for pdo_mysql driver).
- (Johannes)
- . Implemented FR #47802 (Support for setting character sets in DSN strings).
- (Kalle)
-
-- PDO Oracle driver:
- . Fixed bug #39199 (Cannot load Lob data with more than 4000 bytes on
- ORACLE 10). (spatar at mail dot nnov dot ru)
-
-- PDO PostgreSQL driver:
- . Fixed bug #53517 (segfault in pgsql_stmt_execute() when postgres is down).
- (gyp at balabit dot hu)
-
-- Phar extension:
- . Fixed bug #54247 (format-string vulnerability on Phar). (Felipe)
- (CVE-2011-1153)
- . Fixed bug #53541 (format string bug in ext/phar).
- (crrodriguez at opensuse dot org, Ilia)
- . Fixed bug #53898 (PHAR reports invalid error message, when the directory
- does not exist). (Ilia)
-
-- PHP-FPM SAPI:
- . Enforce security in the fastcgi protocol parsing.
- (ef-lists at email dotde)
- . Fixed bug #53777 (php-fpm log format now match php_error log format). (fat)
- . Fixed bug #53527 (php-fpm --test doesn't set a valuable return value). (fat)
- . Fixed bug #53434 (php-fpm slowlog now also logs the original request). (fat)
-
-- Readline extension:
- . Fixed bug #53630 (Fixed parameter handling inside readline() function).
- (jo at feuersee dot de, Ilia)
-
-- Reflection extension:
- . Fixed bug #53915 (ReflectionClass::getConstant(s) emits fatal error on
- constants with self::). (Gustavo)
-
-- Shmop extension:
- . Fixed bug #54193 (Integer overflow in shmop_read()). (Felipe)
- Reported by Jose Carlos Norte <jose at eyeos dot org> (CVE-2011-1092)
-
-- SNMP extension:
- . Fixed bug #51336 (snmprealwalk (snmp v1) does not handle end of OID tree
- correctly). (Boris Lytochkin)
-
-- SOAP extension:
- . Fixed possible crash introduced by the NULL poisoning patch.
- (Mateusz Kocielski, Pierre)
-
-- SPL extension:
- . Fixed memory leak in DirectoryIterator::getExtension() and
- SplFileInfo::getExtension(). (Felipe)
- . Fixed bug #53914 (SPL assumes HAVE_GLOB is defined). (Chris Jones)
- . Fixed bug #53515 (property_exists incorrect on ArrayObject null and 0
- values). (Felipe)
- . Fixed bug #49608 (Using CachingIterator on DirectoryIterator instance
- segfaults). (Felipe)
-
- . Added SplFileInfo::getExtension(). FR #48767. (Peter Cowburn)
-
-- SQLite3 extension:
- . Fixed memory leaked introduced by the NULL poisoning patch.
- (Mateusz Kocielski, Pierre)
- . Fixed memory leak on SQLite3Result and SQLite3Stmt when assigning to a
- reference. (Felipe)
- . Add SQlite3_Stmt::readonly() for checking if a statement is read only.
- (Scott)
- . Implemented FR #53466 (SQLite3Result::columnType() should return false after
- all of the rows have been fetched). (Scott)
-
-- Streams:
- . Fixed bug #54092 (Segmentation fault when using HTTP proxy with the FTP
- wrapper). (Gustavo)
- . Fixed bug #53913 (Streams functions assume HAVE_GLOB is defined). (Chris
- Jones)
- . Fixed bug #53903 (userspace stream stat callback does not separate the
- elements of the returned array before converting them). (Gustavo)
- . Implemented FR #26158 (open arbitrary file descriptor with fopen). (Gustavo)
-
-- Tokenizer Extension
- . Fixed bug #54089 (token_get_all() does not stop after __halt_compiler).
- (Nikita Popov, Ilia)
-
-- XSL extension:
- . Fixed memory leaked introduced by the NULL poisoning patch.
- (Mateusz Kocielski, Pierre)
-
-- Zip extension:
- . Added the filename into the return value of stream_get_meta_data(). (Hannes)
- . Fixed bug #53923 (Zip functions assume HAVE_GLOB is defined). (Adam)
- . Fixed bug #53893 (Wrong return value for ZipArchive::extractTo()). (Pierre)
- . Fixed bug #53885 (ZipArchive segfault with FL_UNCHANGED on empty archive).
- (Stas, Maksymilian Arciemowicz). (CVE-2011-0421)
- . Fixed bug #53854 (Missing constants for compression type). (Richard, Adam)
- . Fixed bug #53603 (ZipArchive should quiet stat errors). (brad dot froehle at
- gmail dot com, Gustavo)
- . Fixed bug #53579 (stream_get_contents() segfaults on ziparchive streams).
- (Hannes)
- . Fixed bug #53568 (swapped memset arguments in struct initialization).
- (crrodriguez at opensuse dot org)
- . Fixed bug #53166 (Missing parameters in docs and reflection definition).
- (Richard)
- . Fixed bug #49072 (feof never returns true for damaged file in zip).
- (Gustavo, Richard Quadling)
-
-06 Jan 2011, PHP 5.3.5
-- Fixed Bug #53632 (infinite loop with x87 fpu). (CVE-2010-4645) (Scott,
- Rasmus)
-
-09 Dec 2010, PHP 5.3.4
-- Upgraded bundled Sqlite3 to version 3.7.3. (Ilia)
-- Upgraded bundled PCRE to version 8.10. (Ilia)
-
-- Security enhancements:
- . Fixed crash in zip extract method (possible CWE-170).
- (Maksymilian Arciemowicz, Pierre)
- . Paths with NULL in them (foo\0bar.txt) are now considered as invalid.
- (Rasmus)
- . Fixed a possible double free in imap extension (Identified by Mateusz
- Kocielski). (CVE-2010-4150). (Ilia)
- . Fixed NULL pointer dereference in ZipArchive::getArchiveComment.
- (CVE-2010-3709). (Maksymilian Arciemowicz)
- . Fixed possible flaw in open_basedir (CVE-2010-3436). (Pierre)
- . Fixed MOPS-2010-24, fix string validation. (CVE-2010-2950). (Pierre)
- . Fixed symbolic resolution support when the target is a DFS share. (Pierre)
- . Fixed bug #52929 (Segfault in filter_var with FILTER_VALIDATE_EMAIL with
- large amount of data) (CVE-2010-3710). (Adam)
-
-- General improvements:
- . Added stat support for zip stream. (Pierre)
- . Added follow_location (enabled by default) option for the http stream
- support. (Pierre)
- . Improved support for is_link and related functions on Windows. (Pierre)
- . Added a 3rd parameter to get_html_translation_table. It now takes a charset
- hint, like htmlentities et al. (Gustavo)
-
-- Implemented feature requests:
- . Implemented FR #52348, added new constant ZEND_MULTIBYTE to detect
- zend multibyte at runtime. (Kalle)
- . Implemented FR #52173, added functions pcntl_get_last_error() and
- pcntl_strerror(). (nick dot telford at gmail dot com, Arnaud)
- . Implemented symbolic links support for open_basedir checks. (Pierre)
- . Implemented FR #51804, SplFileInfo::getLinkTarget on Windows. (Pierre)
- . Implemented FR #50692, not uploaded files don't count towards
- max_file_uploads limit. As a side improvement, temporary files are not
- opened for empty uploads and, in debug mode, 0-length uploads. (Gustavo)
-
-- Improved MySQLnd:
- . Added new character sets to mysqlnd, which are available in MySQL 5.5
- (Andrey)
-
-- Improved PHP-FPM SAPI:
- . Added '-p/--prefix' to php-fpm to use a custom prefix and run multiple
- instances. (fat)
- . Added custom process title for FPM. (fat)
- . Added '-t/--test' to php-fpm to check and validate FPM conf file. (fat)
- . Added statistics about listening socket queue length for FPM.
- (andrei dot nigmatulin at gmail dot com, fat)
-
-- Core:
- . Fixed extract() to do not overwrite $GLOBALS and $this when using
- EXTR_OVERWRITE. (jorto at redhat dot com)
- . Fixed bug in the Windows implementation of dns_get_record, where the two
- last parameters wouldn't be filled unless the type were DNS_ANY (Gustavo).
- . Changed the $context parameter on copy() to actually have an effect. (Kalle)
- . Fixed htmlentities/htmlspecialchars accepting certain ill-formed UTF-8
- sequences. (Gustavo)
- . Fixed bug #53409 (sleep() returns NULL on Windows). (Pierre)
- . Fixed bug #53319 (strip_tags() may strip '<br />' incorrectly). (Felipe)
- . Fixed bug #53304 (quot_print_decode does not handle lower-case hex digits).
- (Ilia, daniel dot mueller at inexio dot net)
- . Fixed bug #53248 (rawurlencode RFC 3986 EBCDIC support misses tilde char).
- (Justin Martin)
- . Fixed bug #53226 (file_exists fails on big filenames). (Adam)
- . Fixed bug #53198 (changing INI setting "from" with ini_set did not have any
- effect). (Gustavo)
- . Fixed bug #53180 (post_max_size=0 not disabling the limit when the content
- type is application/x-www-form-urlencoded or is not registered with PHP).
- (gm at tlink dot de, Gustavo)
- . Fixed bug #53141 (autoload misbehaves if called from closing session).
- (ladislav at marek dot su)
- . Fixed bug #53021 (In html_entity_decode, failure to convert numeric entities
- with ENT_NOQUOTES and ISO-8859-1). Fixed and extended the fix of
- ENT_NOQUOTES in html_entity_decode that had introduced the bug (rev
- #185591) to other encodings. Additionaly, html_entity_decode() now doesn't
- decode &#34; if ENT_NOQUOTES is given. (Gustavo)
- . Fixed bug #52931 (strripos not overloaded with function overloading
- enabled). (Felipe)
- . Fixed bug #52772 (var_dump() doesn't check for the existence of
- get_class_name before calling it). (Kalle, Gustavo)
- . Fixed bug #52534 (var_export array with negative key). (Felipe)
- . Fixed bug #52327 (base64_decode() improper handling of leading padding in
- strict mode). (Ilia)
- . Fixed bug #52260 (dns_get_record fails with non-existing domain on Windows).
- (a_jelly_doughnut at phpbb dot com, Pierre)
- . Fixed bug #50953 (socket will not connect to IPv4 address when the host has
- both IPv4 and IPv6 addresses, on Windows). (Gustavo, Pierre)
- . Fixed bug #50524 (proc_open on Windows does not respect cwd as it does on
- other platforms). (Pierre)
- . Fixed bug #49687 (utf8_decode vulnerabilities and deficiencies in the number
- of reported malformed sequences). (CVE-2010-3870) (Gustavo)
- . Fixed bug #49407 (get_html_translation_table doesn't handle UTF-8).
- (Gustavo)
- . Fixed bug #48831 (php -i has different output to php --ini). (Richard,
- Pierre)
- . Fixed bug #47643 (array_diff() takes over 3000 times longer than php 5.2.4).
- (Felipe)
- . Fixed bug #47168 (printf of floating point variable prints maximum of 40
- decimal places). (Ilia)
- . Fixed bug #46587 (mt_rand() does not check that max is greater than min).
- (Ilia)
- . Fixed bug #29085 (bad default include_path on Windows). (Pierre)
- . Fixed bug #25927 (get_html_translation_table calls the ' &#39; instead of
- &#039;). (Gustavo)
-
-- Zend engine:
- . Reverted fix for bug #51176 (Static calling in non-static method behaves
- like $this->). (Felipe)
- . Changed deprecated ini options on startup from E_WARNING to E_DEPRECATED.
- (Kalle)
- . Fixed NULL dereference in lex_scan on zend multibyte builds where the script
- had a flex incompatible encoding and there was no converter. (Gustavo)
- . Fixed covariance of return-by-ref constraints. (Etienne)
- . Fixed bug #53305 (E_NOTICE when defining a constant starts with
- __COMPILER_HALT_OFFSET__). (Felipe)
- . Fixed bug #52939 (zend_call_function does not respect ZEND_SEND_PREFER_REF).
- (Dmitry)
- . Fixed bug #52879 (Objects unreferenced in __get, __set, __isset or __unset
- can be freed too early). (mail_ben_schmidt at yahoo dot com dot au, Dmitry)
- . Fixed bug #52786 (PHP should reset section to [PHP] after ini sections).
- (Fedora at famillecollet dot com)
- . Fixed bug #52508 (newline problem with parse_ini_file+INI_SCANNER_RAW).
- (Felipe)
- . Fixed bug #52484 (__set() ignores setting properties with empty names).
- (Felipe)
- . Fixed bug #52361 (Throwing an exception in a destructor causes invalid
- catching). (Dmitry)
- . Fixed bug #51008 (Zend/tests/bug45877.phpt fails). (Dmitry)
-
-- Build issues:
- . Fixed bug #52436 (Compile error if systems do not have stdint.h)
- (Sriram Natarajan)
- . Fixed bug #50345 (nanosleep not detected properly on some solaris versions).
- (Ulf, Tony)
- . Fixed bug #49215 (make fails on glob_wrapper). (Felipe)
-
-- Calendar extension:
- . Fixed bug #52744 (cal_days_in_month incorrect for December 1 BCE).
- (gpap at internet dot gr, Adam)
-
-- cURL extension:
- . Fixed bug #52828 (curl_setopt does not accept persistent streams).
- (Gustavo, Ilia)
- . Fixed bug #52827 (cURL leaks handle and causes assertion error
- (CURLOPT_STDERR)). (Gustavo)
- . Fixed bug #52202 (CURLOPT_PRIVATE gets corrupted). (Ilia)
- . Fixed bug #50410 (curl extension slows down PHP on Windows). (Pierre)
-
-- DateTime extension:
- . Fixed bug #53297 (gettimeofday implementation in php/win32/time.c can return
- 1 million microsecs). (ped at 7gods dot org)
- . Fixed bug #52668 (Iterating over a dateperiod twice is broken). (Derick)
- . Fixed bug #52454 (Relative dates and getTimestamp increments by one day).
- (Derick)
- . Fixed bug #52430 (date_parse parse 24:xx:xx as valid time). (Derick)
- . Added support for the ( and ) delimiters/separators to
- DateTime::createFromFormat(). (Derick)
-
-- DBA extension:
- . Added Berkeley DB 5.1 support to the DBA extension. (Oracle Corp.)
-
-- DOM extension:
- . Fixed bug #52656 (DOMCdataSection does not work with splitText). (Ilia)
-
-- Filter extension:
- . Fixed the filter extension accepting IPv4 octets with a leading 0 as that
- belongs to the unsupported "dotted octal" representation. (Gustavo)
- . Fixed bug #53236 (problems in the validation of IPv6 addresses with leading
- and trailing :: in the filter extension). (Gustavo)
- . Fixed bug #50117 (problems in the validation of IPv6 addresses with IPv4
- addresses and ::). (Gustavo)
-
-- GD extension:
- . Fixed bug #53492 (fix crash if anti-aliasing steps are invalid). (Pierre)
-
-- GMP extension:
- . Fixed bug #52906 (gmp_mod returns negative result when non-negative is
- expected). (Stas)
- . Fixed bug #52849 (GNU MP invalid version match). (Adam)
-
-- Hash extension:
- . Fixed bug #51003 (unaligned memory access in ext/hash/hash_tiger.c).
- (Mike, Ilia)
-
-- Iconv extension:
- . Fixed bug #52941 (The 'iconv_mime_decode_headers' function is skipping
- headers). (Adam)
- . Fixed bug #52599 (iconv output handler outputs incorrect content type
- when flags are used). (Ilia)
- . Fixed bug #51250 (iconv_mime_decode() does not ignore malformed Q-encoded
- words). (Ilia)
-
-- Intl extension:
- . Fixed crashes on invalid parameters in intl extension. (CVE-2010-4409).
- (Stas, Maksymilian Arciemowicz)
- . Added support for formatting the timestamp stored in a DateTime object.
- (Stas)
- . Fixed bug #50590 (IntlDateFormatter::parse result is limited to the integer
- range). (Stas)
-
-- Mbstring extension:
- . Fixed bug #53273 (mb_strcut() returns garbage with the excessive length
- parameter). (CVE-2010-4156) (Mateusz Kocielski, Pierre, Moriyoshi)
- . Fixed bug #52981 (Unicode casing table was out-of-date. Updated with
- UnicodeData-6.0.0d7.txt and included the source of the generator program
- with the distribution) (Gustavo).
- . Fixed bug #52681 (mb_send_mail() appends an extra MIME-Version header).
- (Adam)
-
-- MSSQL extension:
- . Fixed possible crash in mssql_fetch_batch(). (Kalle)
- . Fixed bug #52843 (Segfault when optional parameters are not passed in to
- mssql_connect). (Felipe)
-
-- MySQL extension:
- . Fixed bug #52636 (php_mysql_fetch_hash writes long value into int).
- (Kalle, rein at basefarm dot no)
-
-- MySQLi extension:
- . Fixed bug #52891 (Wrong data inserted with mysqli/mysqlnd when using
- mysqli_stmt_bind_param and value> PHP_INT_MAX). (Andrey)
- . Fixed bug #52686 (mysql_stmt_attr_[gs]et argument points to incorrect type).
- (rein at basefarm dot no)
- . Fixed bug #52654 (mysqli doesn't install headers with structures it uses).
- (Andrey)
- . Fixed bug #52433 (Call to undefined method mysqli::poll() - must be static).
- (Andrey)
- . Fixed bug #52417 (MySQLi build failure with mysqlnd on MacOS X). (Andrey)
- . Fixed bug #52413 (MySQLi/libmysql build failure on OS X, FreeBSD). (Andrey)
- . Fixed bug #52390 (mysqli_report() should be per-request setting). (Kalle)
- . Fixed bug #52302 (mysqli_fetch_all does not work with MYSQLI_USE_RESULT).
- (Andrey)
- . Fixed bug #52221 (Misbehaviour of magic_quotes_runtime (get/set)). (Andrey)
- . Fixed bug #45921 (Can't initialize character set hebrew). (Andrey)
-
-- MySQLnd:
- . Fixed bug #52613 (crash in mysqlnd after hitting memory limit). (Andrey)
-
-- ODBC extension:
- - Fixed bug #52512 (Broken error handling in odbc_execute).
- (mkoegler at auto dot tuwien dot ac dot at)
-
-- Openssl extension:
- . Fixed possible blocking behavior in openssl_random_pseudo_bytes on Windows.
- (Pierre)
- . Fixed bug #53136 (Invalid read on openssl_csr_new()). (Felipe)
- . Fixed bug #52947 (segfault when ssl stream option capture_peer_cert_chain
- used). (Felipe)
-
-- Oracle Database extension (OCI8):
- . Fixed bug #53284 (Valgrind warnings in oci_set_* functions) (Oracle Corp.)
- . Fixed bug #51610 (Using oci_connect causes PHP to take a long time to
- exit). Requires Oracle 11.2.0.2 client libraries (or Oracle bug fix
- 9891199) for this patch to have an effect. (Oracle Corp.)
-
-- PCNTL extension:
- . Fixed bug #52784 (Race condition when handling many concurrent signals).
- (nick dot telford at gmail dot com, Arnaud)
-
-- PCRE extension:
- . Fixed bug #52971 (PCRE-Meta-Characters not working with utf-8). (Felipe)
- . Fixed bug #52732 (Docs say preg_match() returns FALSE on error, but it
- returns int(0)). (slugonamission at gmail dot com)
-
-- PHAR extension:
- . Fixed bug #50987 (unaligned memory access in phar.c).
- (geissert at debian dot org, Ilia)
-
-- PHP-FPM SAPI:
- . Fixed bug #53412 (segfault when using -y). (fat)
- . Fixed inconsistent backlog default value (-1) in FPM on many systems. (fat)
- . Fixed bug #52501 (libevent made FPM crashed when forking -- libevent has
- been removed). (fat)
- . Fixed bug #52725 (gcc builtin atomic functions were sometimes used when they
- were not available). (fat)
- . Fixed bug #52693 (configuration file errors are not logged to stderr). (fat)
- . Fixed bug #52674 (FPM Status page returns inconsistent Content-Type
- headers). (fat)
- . Fixed bug #52498 (libevent was not only linked to php-fpm). (fat)
-
-- PDO:
- . Fixed bug #52699 (PDO bindValue writes long int 32bit enum).
- (rein at basefarm dot no)
- . Fixed bug #52487 (PDO::FETCH_INTO leaks memory). (Felipe)
-
-- PDO DBLib driver:
- . Fixed bug #52546 (pdo_dblib segmentation fault when iterating MONEY values).
- (Felipe)
-
-- PDO Firebird driver:
- . Restored firebird support (VC9 builds only). (Pierre)
- . Fixed bug #53335 (pdo_firebird did not implement rowCount()).
- (preeves at ibphoenix dot com)
- . Fixed bug #53323 (pdo_firebird getAttribute() crash).
- (preeves at ibphoenix dot com)
-
-- PDO MySQL driver:
- . Fixed bug #52745 (Binding params doesn't work when selecting a date inside a
- CASE-WHEN). (Andrey)
-
-- PostgreSQL extension:
- . Fixed bug #47199 (pg_delete() fails on NULL). (ewgraf at gmail dot com)
-
-- Reflection extension:
- . Fixed ReflectionProperty::isDefault() giving a wrong result for properties
- obtained with ReflectionClass::getProperties(). (Gustavo)
-- Reflection extension:
- . Fixed bug #53366 (Reflection doesnt get dynamic property value from
- getProperty()). (Felipe)
- . Fixed bug #52854 (ReflectionClass::newInstanceArgs does not work for classes
- without constructors). (Johannes)
-
-- SOAP extension:
- . Fixed bug #44248 (RFC2616 transgression while HTTPS request through proxy
- with SoapClient object). (Dmitry)
-
-- SPL extension:
- . Fixed bug #53362 (Segmentation fault when extending SplFixedArray). (Felipe)
- . Fixed bug #53279 (SplFileObject doesn't initialise default CSV escape
- character). (Adam)
- . Fixed bug #53144 (Segfault in SplObjectStorage::removeAll()). (Felipe)
- . Fixed bug #53071 (SPLObjectStorage defeats gc_collect_cycles). (Gustavo)
- . Fixed bug #52573 (SplFileObject::fscanf Segmentation fault). (Felipe)
- . Fixed bug #51763 (SplFileInfo::getType() does not work symbolic link
- and directory). (Pierre)
- . Fixed bug #50481 (Storing many SPLFixedArray in an array crashes). (Felipe)
- . Fixed bug #50579 (RegexIterator::REPLACE doesn't work). (Felipe)
-
-- SQLite3 extension:
- . Fixed bug #53463 (sqlite3 columnName() segfaults on bad column_number).
- (Felipe)
-
-- Streams:
- . Fixed forward stream seeking emulation in streams that don't support seeking
- in situations where the read operation gives back less data than requested
- and when there was data in the buffer before the emulation started. Also
- made more consistent its behavior -- should return failure every time less
- data than was requested was skipped. (Gustavo)
- . Fixed bug #53241 (stream casting that relies on fdopen/fopencookie fails
- with streams opened with, inter alia, the 'xb' mode). (Gustavo)
- . Fixed bug #53006 (stream_get_contents has an unpredictable behavior when the
- underlying stream does not support seeking). (Gustavo)
- . Fixed bug #52944 (Invalid write on second and subsequent reads with an
- inflate filter fed invalid data). (Gustavo)
- . Fixed bug #52820 (writes to fopencookie FILE* not commited when seeking the
- stream). (Gustavo)
-
-- WDDX extension:
- . Fixed bug #52468 (wddx_deserialize corrupts integer field value when left
- empty). (Felipe)
-
-- Zlib extension:
- . Fixed bug #52926 (zlib fopen wrapper does not use context). (Gustavo)
-
-22 Jul 2010, PHP 5.3.3
-- Upgraded bundled sqlite to version 3.6.23.1. (Ilia)
-- Upgraded bundled PCRE to version 8.02. (Ilia)
-
-- Added support for JSON_NUMERIC_CHECK option in json_encode() that converts
- numeric strings to integers. (Ilia)
-- Added stream_set_read_buffer, allows to set the buffer for read operation.
- (Pierre)
-- Added stream filter support to mcrypt extension (ported from
- mcrypt_filter). (Stas)
-- Added full_special_chars filter to ext/filter. (Rasmus)
-- Added backlog socket context option for stream_socket_server(). (Mike)
-- Added fifth parameter to openssl_encrypt()/openssl_decrypt()
- (string $iv) to use non-NULL IV.
- Made implicit use of NULL IV a warning. (Sara)
-- Added openssl_cipher_iv_length(). (Sara)
-- Added FastCGI Process Manager (FPM) SAPI. (Tony)
-- Added recent Windows versions to php_uname and fix undefined windows
- version support. (Pierre)
-- Added Berkeley DB 5 support to the DBA extension. (Johannes, Chris Jones)
-- Added support for copy to/from array/file for pdo_pgsql extension.
- (Denis Gasparin, Ilia)
-- Added inTransaction() method to PDO, with specialized support for Postgres.
- (Ilia, Denis Gasparin)
-
-- Changed namespaced classes so that the ctor can only be named
- __construct now. (Stas)
-- Reset error state in PDO::beginTransaction() reset error state. (Ilia)
-
-- Implemented FR#51295 (SQLite3::busyTimeout not existing). (Mark)
-- Implemented FR#35638 (Adding udate to imap_fetch_overview results).
- (Charles_Duffy at dell dot com )
-- Rewrote var_export() to use smart_str rather than output buffering, prevents
- data disclosure if a fatal error occurs (CVE-2010-2531). (Scott)
-- Fixed possible buffer overflows in mysqlnd_list_fields, mysqlnd_change_user.
- (Andrey)
-- Fixed possible buffer overflows when handling error packets in mysqlnd.
- Reported by Stefan Esser. (Andrey)
-- Fixed very rare memory leak in mysqlnd, when binding thousands of columns.
- (Andrey)
-- Fixed a crash when calling an inexistent method of a class that inherits
- PDOStatement if instantiated directly instead of doing by the PDO methods.
- (Felipe)
-
-- Fixed memory leak on error in mcrypt_create_iv on Windows. (Pierre)
-- Fixed a possible crash because of recursive GC invocation. (Dmitry)
-- Fixed a possible resource destruction issues in shm_put_var().
- Reported by Stefan Esser. (Dmitry)
-- Fixed a possible information leak because of interruption of XOR operator.
- Reported by Stefan Esser. (Dmitry)
-- Fixed a possible memory corruption because of unexpected call-time pass by
- refernce and following memory clobbering through callbacks.
- Reported by Stefan Esser. (Dmitry)
-- Fixed a possible memory corruption in ArrayObject::uasort(). Reported by
- Stefan Esser. (Dmitry)
-- Fixed a possible memory corruption in parse_str(). Reported by Stefan Esser.
- (Dmitry)
-- Fixed a possible memory corruption in pack(). Reported by Stefan Esser.
- (Dmitry)
-- Fixed a possible memory corruption in substr_replace(). Reported by Stefan
- Esser. (Dmitry)
-- Fixed a possible memory corruption in addcslashes(). Reported by Stefan
- Esser. (Dmitry)
-- Fixed a possible stack exhaustion inside fnmatch(). Reported by Stefan
- Esser. (Ilia)
-- Fixed a possible dechunking filter buffer overflow. Reported by Stefan Esser.
- (Pierre)
-- Fixed a possible arbitrary memory access inside sqlite extension. Reported
- by Mateusz Kocielski. (Ilia)
-- Fixed string format validation inside phar extension. Reported by Stefan
- Esser. (Ilia)
-- Fixed handling of session variable serialization on certain prefix
- characters. Reported by Stefan Esser. (Ilia)
-- Fixed a NULL pointer dereference when processing invalid XML-RPC
- requests (Fixes CVE-2010-0397, bug #51288). (Raphael Geissert)
-- Fixed 64-bit integer overflow in mhash_keygen_s2k(). (Clément LECIGNE, Stas)
-- Fixed SplObjectStorage unserialization problems (CVE-2010-2225). (Stas)
-- Fixed the mail.log ini setting when no filename was given. (Johannes)
-
-- Fixed bug #52317 (Segmentation fault when using mail() on a rhel 4.x (only 64
- bit)). (Adam)
-- Fixed bug #52262 (json_decode() shows no errors on invalid UTF-8).
- (Scott)
-- Fixed bug #52240 (hash_copy() does not copy the HMAC key, causes wrong
- results and PHP crashes). (Felipe)
-- Fixed bug #52238 (Crash when an Exception occured in iterator_to_array).
- (Johannes)
-- Fixed bug #52193 (converting closure to array yields empty array). (Felipe)
-- Fixed bug #52183 (Reflectionfunction reports invalid number of arguments for
- function aliases). (Felipe)
-- Fixed bug #52162 (custom request header variables with numbers are removed).
- (Sriram Natarajan)
-- Fixed bug #52160 (Invalid E_STRICT redefined constructor error). (Felipe)
-- Fixed bug #52138 (Constants are parsed into the ini file for section names).
- (Felipe)
-- Fixed bug #52115 (mysqli_result::fetch_all returns null, not an empty array).
- (Andrey)
-- Fixed bug #52101 (dns_get_record() garbage in 'ipv6' field on Windows).
- (Pierre)
-- Fixed bug #52082 (character_set_client & character_set_connection reset after
- mysqli_change_user()). (Andrey)
-- Fixed bug #52043 (GD doesn't recognize latest libJPEG versions).
- (php at group dot apple dot com, Pierre)
-- Fixed bug #52041 (Memory leak when writing on uninitialized variable returned
- from function). (Dmitry)
-- Fixed bug #52060 (Memory leak when passing a closure to method_exists()).
- (Felipe)
-- Fixed bug #52057 (ReflectionClass fails on Closure class). (Felipe)
-- Fixed bug #52051 (handling of case sensitivity of old-style constructors
- changed in 5.3+). (Felipe)
-- Fixed bug #52037 (Concurrent builds fail in install-programs). (seanius at
- debian dot org, Kalle)
-- Fixed bug #52019 (make lcov doesn't support TESTS variable anymore). (Patrick)
-- Fixed bug #52010 (open_basedir restrictions mismatch on vacuum command).
- (Ilia)
-- Fixed bug #52001 (Memory allocation problems after using variable variables).
- (Dmitry)
-- Fixed bug #51991 (spl_autoload and *nix support with namespace). (Felipe)
-- Fixed bug #51943 (AIX: Several files are out of ANSI spec). (Kalle,
- coreystup at gmail dot com)
-- Fixed bug #51911 (ReflectionParameter::getDefaultValue() memory leaks with
- constant array). (Felipe)
-- Fixed bug #51905 (ReflectionParameter fails if default value is an array
- with an access to self::). (Felipe)
-- Fixed bug #51899 (Parse error in parse_ini_file() function when empy value
- followed by no newline). (Felipe)
-- Fixed bug #51844 (checkdnsrr does not support types other than MX). (Pierre)
-- Fixed bug #51827 (Bad warning when register_shutdown_function called with
- wrong num of parameters). (Felipe)
-- Fixed bug #51822 (Segfault with strange __destruct() for static class
- variables). (Dmitry)
-- Fixed bug #51791 (constant() aborts execution when fail to check undefined
- constant). (Felipe)
-- Fixed bug #51732 (Fileinfo __construct or open does not work with NULL).
- (Pierre)
-- Fixed bug #51725 (xmlrpc_get_type() returns true on invalid dates). (Mike)
-- Fixed bug #51723 (Content-length header is limited to 32bit integer with
- Apache2 on Windows). (Pierre)
-- Fixed bug #51721 (mark DOMNodeList and DOMNamedNodeMap as Traversable).
- (David Zuelke)
-- Fixed bug #51712 (Test mysql_mysqlnd_read_timeout_long must fail on MySQL4).
- (Andrey)
-- Fixed bug #51697 (Unsafe operations in free_storage of SPL iterators,
- causes crash during shutdown). (Etienne)
-- Fixed bug #51690 (Phar::setStub looks for case-sensitive
- __HALT_COMPILER()). (Ilia)
-- Fixed bug #51688 (ini per dir crashes when invalid document root are given).
- (Pierre)
-- Fixed bug #51671 (imagefill does not work correctly for small images).
- (Pierre)
-- Fixed bug #51670 (getColumnMeta causes segfault when re-executing query
- after calling nextRowset). (Pierrick)
-- Fixed bug #51647 Certificate file without private key (pk in another file)
- doesn't work. (Andrey)
-- Fixed bug #51629 (CURLOPT_FOLLOWLOCATION error message is misleading).
- (Pierre)
-- Fixed bug #51627 (script path not correctly evaluated).
- (russell dot tempero at rightnow dot com)
-- Fixed bug #51624 (Crash when calling mysqli_options()). (Felipe)
-- Fixed bug #51615 (PHP crash with wrong HTML in SimpleXML). (Felipe)
-- Fixed bug #51609 (pg_copy_to: Invalid results when using fourth parameter).
- (Felipe)
-- Fixed bug #51608 (pg_copy_to: WARNING: nonstandard use of \\ in a string
- literal). (cbandy at jbandy dot com)
-- Fixed bug #51607 (pg_copy_from does not allow schema in the tablename
- argument). (cbandy at jbandy dot com)
-- Fixed bug #51605 (Mysqli - zombie links). (Andrey)
-- Fixed bug #51604 (newline in end of header is shown in start of message).
- (Daniel Egeberg)
-- Fixed bug #51590 (JSON_ERROR_UTF8 is undefined). (Felipe)
-- Fixed bug #51583 (Bus error due to wrong alignment in mysqlnd). (Rainer Jung)
-- Fixed bug #51582 (Don't assume UINT64_C it's ever available).
- (reidrac at usebox dot net, Pierre)
-- Fixed bug #51577 (Uninitialized memory reference with oci_bind_array_by_name)
- (Oracle Corp.)
-- Fixed bug #51562 (query timeout in mssql can not be changed per query).
- (ejsmont dot artur at gmail dot com)
-- Fixed bug #51552 (debug_backtrace() causes segmentation fault and/or memory
- issues). (Dmitry)
-- Fixed bug #51445 (var_dump() invalid/slow *RECURSION* detection). (Felipe)
-- Fixed bug #51435 (Missing ifdefs / logic bug in crypt code cause compile
- errors). (Felipe)
-- Fixed bug #51424 (crypt() function hangs after 3rd call). (Pierre, Sriram)
-- Fixed bug #51394 (Error line reported incorrectly if error handler throws an
- exception). (Stas)
-- Fixed bug #51393 (DateTime::createFromFormat() fails if format string contains
- timezone). (Adam)
-- Fixed bug #51347 (mysqli_close / connection memory leak). (Andrey, Johannes)
-- Fixed bug #51338 (URL-Rewriter is still enabled if use_only_cookies is
- on). (Ilia, j dot jeising at gmail dot com)
-- Fixed bug #51291 (oci_error doesn't report last error when called two times)
- (Oracle Corp.)
-- Fixed bug #51276 (php_load_extension() is missing when HAVE_LIBDL is
- undefined). (Tony)
-- Fixed bug #51273 (Faultstring property does not exist when the faultstring is
- empty) (Ilia, dennis at transip dot nl)
-- Fixed bug #51269 (zlib.output_compression Overwrites Vary Header). (Adam)
-- Fixed bug #51257 (CURL_VERSION_LARGEFILE incorrectly used after libcurl
- version 7.10.1). (aron dot ujvari at microsec dot hu)
-- Fixed bug #51242 (Empty mysql.default_port does not default to 3306 anymore,
- but 0). (Adam)
-- Fixed bug #51237 (milter SAPI crash on startup). (igmar at palsenberg dot com)
-- Fixed bug #51213 (pdo_mssql is trimming value of the money column). (Ilia,
- alexr at oplot dot com)
-- Fixed bug #51190 (ftp_put() returns false when transfer was successful).
- (Ilia)
-- Fixed bug #51183 (ext/date/php_date.c fails to compile with Sun Studio).
- (Sriram Natarajan)
-- Fixed bug #51176 (Static calling in non-static method behaves like $this->).
- (Felipe)
-- Fixed bug #51171 (curl_setopt() doesn't output any errors or warnings when
- an invalid option is provided). (Ilia)
-- Fixed bug #51128 (imagefill() doesn't work with large images). (Pierre)
-- Fixed bug #51096 ('last day' and 'first day' are handled incorrectly when
- parsing date strings). (Derick)
-- Fixed bug #51086 (DBA DB4 doesn't work with Berkeley DB 4.8). (Chris Jones)
-- Fixed bug #51062 (DBA DB4 uses mismatched headers and libraries). (Chris
- Jones)
-- Fixed bug #51026 (mysqli_ssl_set not working). (Andrey)
-- Fixed bug #51023 (filter doesn't detect int overflows with GCC 4.4).
- (Raphael Geissert)
-- Fixed bug #50999 (unaligned memory access in dba_fetch()). (Felipe)
-- Fixed bug #50976 (Soap headers Authorization not allowed).
- (Brain France, Dmitry)
-- Fixed bug #50828 (DOMNotation is not subclass of DOMNode). (Rob)
-- Fixed bug #50810 (property_exists does not work for private). (Felipe)
-- Fixed bug #50762 (in WSDL mode Soap Header handler function only being called
- if defined in WSDL). (mephius at gmail dot com)
-- Fixed bug #50731 (Inconsistent namespaces sent to functions registered with
- spl_autoload_register). (Felipe)
-- Fixed bug #50563 (removing E_WARNING from parse_url). (ralph at smashlabs dot
- com, Pierre)
-- Fixed bug #50578 (incorrect shebang in phar.phar). (Fedora at FamilleCollet
- dot com)
-- Fixed bug #50392 (date_create_from_format enforces 6 digits for 'u' format
- character). (Derick)
-- Fixed bug #50383 (Exceptions thrown in __call / __callStatic do not include
- file and line in trace). (Felipe)
-- Fixed bug #50358 (Compile failure compiling ext/phar/util.lo). (Felipe)
-- Fixed bug #50101 (name clash between global and local variable).
- (patch by yoarvi at gmail dot com)
-- Fixed bug #50055 (DateTime::sub() allows 'relative' time modifications).
- (Derick)
-- Fixed bug #51002 (fix possible memory corruption with very long names).
- (Pierre)
-- Fixed bug #49893 (Crash while creating an instance of Zend_Mail_Storage_Pop3).
- (Dmitry)
-- Fixed bug #49819 (STDOUT losing data with posix_isatty()). (Mike)
-- Fixed bug #49778 (DateInterval::format("%a") is always zero when an interval
- is created from an ISO string). (Derick)
-- Fixed bug #49700 (memory leaks in php_date.c if garbage collector is
- enabled). (Dmitry)
-- Fixed bug #49576 (FILTER_VALIDATE_EMAIL filter needs updating) (Rasmus)
-- Fixed bug #49490 (XPath namespace prefix conflict). (Rob)
-- Fixed bug #49429 (odbc_autocommit doesn't work). (Felipe)
-- Fixed bug #49320 (PDO returns null when SQLite connection fails). (Felipe)
-- Fixed bug #49234 (mysqli_ssl_set not found). (Andrey)
-- Fixed bug #49216 (Reflection doesn't seem to work properly on MySqli).
- (Andrey)
-- Fixed bug #49192 (PHP crashes when GC invoked on COM object). (Stas)
-- Fixed bug #49081 (DateTime::diff() mistake if start in January and interval >
- 28 days). (Derick)
-- Fixed bug #49059 (DateTime::diff() repeats previous sub() operation).
- (yoarvi@gmail.com, Derick)
-- Fixed bug #48983 (DomDocument : saveHTMLFile wrong charset). (Rob)
-- Fixed bug #48930 (__COMPILER_HALT_OFFSET__ incorrect in PHP >= 5.3). (Felipe)
-- Fixed bug #48902 (Timezone database fallback map is outdated). (Derick)
-- Fixed bug #48781 (Cyclical garbage collector memory leak). (Dmitry)
-- Fixed bug #48601 (xpath() returns FALSE for legitimate query). (Rob)
-- Fixed bug #48361 (SplFileInfo::getPathInfo should return the
- parent dir). (Etienne)
-- Fixed bug #48289 (iconv_mime_encode() quoted-printable scheme is broken).
- (Adam, patch from hiroaki dot kawai at gmail dot com).
-- Fixed bug #47842 (sscanf() does not support 64-bit values). (Mike)
-- Fixed bug #46111 (Some timezone identifiers can not be parsed). (Derick)
-- Fixed bug #45808 (stream_socket_enable_crypto() blocks and eats CPU).
- (vincent at optilian dot com)
-- Fixed bug #43233 (sasl support for ldap on Windows). (Pierre)
-- Fixed bug #35673 (formatOutput does not work with saveHTML). (Rob)
-- Fixed bug #33210 (getimagesize() fails to detect width/height on certain
- JPEGs). (Ilia)
-
-04 Mar 2010, PHP 5.3.2
-
-- Upgraded bundled sqlite to version 3.6.22. (Ilia)
-- Upgraded bundled libmagic to version 5.03. (Mikko)
-- Upgraded bundled PCRE to version 8.00. (Scott)
-- Updated timezone database to version 2010.3. (Derick)
-
-- Improved LCG entropy. (Rasmus, Samy Kamkar)
-- Improved crypt support for edge cases (UFC compatibility). (Solar Designer,
- Joey, Pierre)
-
-- Reverted fix for bug #49521 (PDO fetchObject sets values before calling
- constructor). (Pierrick, Johannes)
-
-- Changed gmp_strval() to use full range from 2 to 62, and -2 to -36. FR #50283
- (David Soria Parra)
-- Changed "post_max_size" php.ini directive to allow unlimited post size by
- setting it to 0. (Rasmus)
-- Changed tidyNode class to disallow manual node creation. (Pierrick)
-
-- Removed automatic file descriptor unlocking happening on shutdown and/or
- stream close (on all OSes). (Tony, Ilia)
-
-- Added libpng 1.4.0 support. (Pierre)
-- Added support for DISABLE_AUTHENTICATOR for imap_open. (Pierre)
-- Added missing host validation for HTTP urls inside FILTER_VALIDATE_URL.
- (Ilia)
-- Added stream_resolve_include_path(). (Mikko)
-- Added INTERNALDATE support to imap_append. (nick at mailtrust dot com)
-- Added support for SHA-256 and SHA-512 to php's crypt. (Pierre)
-- Added realpath_cache_size() and realpath_cache_get() functions. (Stas)
-- Added FILTER_FLAG_STRIP_BACKTICK option to the filter extension. (Ilia)
-- Added protection for $_SESSION from interrupt corruption and improved
- "session.save_path" check. (Stas)
-- Added LIBXML_PARSEHUGE constant to override the maximum text size of a
- single text node when using libxml2.7.3+. (Kalle)
-- Added ReflectionMethod::setAccessible() for invoking non-public methods
- through the Reflection API. (Sebastian)
-- Added Collator::getSortKey for intl extension. (Stas)
-- Added support for CURLOPT_POSTREDIR. FR #49571. (Sriram Natarajan)
-- Added support for CURLOPT_CERTINFO. FR #49253.
- (Linus Nielsen Feltzing <linus@haxx.se>)
-- Added client-side server name indication support in openssl. (Arnaud)
-
-- Improved fix for bug #50006 (Segfault caused by uksort()). (Stas)
-
-- Fixed mysqlnd hang when queries exactly 16777214 bytes long are sent. (Andrey)
-- Fixed incorrect decoding of 5-byte BIT sequences in mysqlnd. (Andrey)
-- Fixed error_log() to be binary safe when using message_type 3. (Jani)
-- Fixed unnecessary invocation of setitimer when timeouts have been disabled.
- (Arvind Srinivasan)
-- Fixed memory leak in extension loading when an error occurs on Windows.
- (Pierre)
-- Fixed safe_mode validation inside tempnam() when the directory path does
- not end with a /). (Martin Jansen)
-- Fixed a possible open_basedir/safe_mode bypass in session extension
- identified by Grzegorz Stachowiak. (Ilia)
-- Fixed possible crash when a error/warning is raised during php startup.
- (Pierre)
-- Fixed possible bad behavior of rename on windows when used with symbolic
- links or invalid paths. (Pierre)
-- Fixed error output to stderr on Windows. (Pierre)
-- Fixed memory leaks in is_writable/readable/etc on Windows. (Pierre)
-- Fixed memory leaks in the ACL function on Windows. (Pierre)
-- Fixed memory leak in the realpath cache on Windows. (Pierre)
-- Fixed memory leak in zip_close. (Pierre)
-- Fixed crypt's blowfish sanity check of the "setting" string, to reject
- iteration counts encoded as 36 through 39. (Solar Designer, Joey, Pierre)
-
-- Fixed bug #51059 (crypt crashes when invalid salt are given). (Pierre)
-- Fixed bug #50952 (allow underscore _ in constants parsed in php.ini files).
- (Jani)
-- Fixed bug #50940 (Custom content-length set incorrectly in Apache SAPIs).
- (Brian France, Rasmus)
-- Fixed bug #50930 (Wrong date by php_date.c patch with ancient gcc/glibc
- versions). (Derick)
-- Fixed bug #50907 (X-PHP-Originating-Script adding two new lines in *NIX).
- (Ilia)
-- Fixed bug #50859 (build fails with openssl 1.0 due to md2 deprecation).
- (Ilia, hanno at hboeck dot de)
-- Fixed bug #50847 (strip_tags() removes all tags greater then 1023 bytes
- long). (Ilia)
-- Fixed bug #50829 (php.ini directive pdo_mysql.default_socket is ignored).
- (Ilia)
-- Fixed bug #50832 (HTTP fopen wrapper does not support passwordless HTTP
- authentication). (Jani)
-- Fixed bug #50787 (stream_set_write_buffer() has no effect on socket streams).
- (vnegrier at optilian dot com, Ilia)
-- Fixed bug #50761 (system.multiCall crashes in xmlrpc extension).
- (hiroaki dot kawai at gmail dot com, Ilia)
-- Fixed bug #50756 (CURLOPT_FTP_SKIP_PASV_IP does not exist). (Sriram)
-- Fixed bug #50732 (exec() adds single byte twice to $output array). (Ilia)
-- Fixed bug #50728 (All PDOExceptions hardcode 'code' property to 0).
- (Joey, Ilia)
-- Fixed bug #50723 (Bug in garbage collector causes crash). (Dmitry)
-- Fixed bug #50690 (putenv does not set ENV when the value is only one char).
- (Pierre)
-- Fixed bug #50680 (strtotime() does not support eighth ordinal number). (Ilia)
-- Fixed bug #50661 (DOMDocument::loadXML does not allow UTF-16). (Rob)
-- Fixed bug #50657 (copy() with an empty (zero-byte) HTTP source succeeds but
- returns false). (Ilia)
-- Fixed bug #50636 (MySQLi_Result sets values before calling constructor).
- (Pierrick)
-- Fixed bug #50632 (filter_input() does not return default value if the
- variable does not exist). (Ilia)
-- Fixed bug #50576 (XML_OPTION_SKIP_TAGSTART option has no effect). (Pierrick)
-- Fixed bug #50558 (Broken object model when extending tidy). (Pierrick)
-- Fixed bug #50540 (Crash while running ldap_next_reference test cases).
- (Sriram)
-- Fixed bug #50519 (segfault in garbage collection when using set_error_handler
- and DomDocument). (Dmitry)
-- Fixed bug #50508 (compile failure: Conflicting HEADER type declarations).
- (Jani)
-- Fixed bug #50496 (Use of <stdbool.h> is valid only in a c99 compilation
- environment. (Sriram)
-- Fixed bug #50464 (declare encoding doesn't work within an included file).
- (Felipe)
-- Fixed bug #50458 (PDO::FETCH_FUNC fails with Closures). (Felipe, Pierrick)
-- Fixed bug #50445 (PDO-ODBC stored procedure call from Solaris 64-bit causes
- seg fault). (davbrown4 at yahoo dot com, Felipe)
-- Fixed bug #50416 (PROCEDURE db.myproc can't return a result set in the given
- context). (Andrey)
-- Fixed bug #50394 (Reference argument converted to value in __call). (Stas)
-- Fixed bug #50351 (performance regression handling objects, ten times slower
- in 5.3 than in 5.2). (Dmitry)
-- Fixed bug #50392 (date_create_from_format() enforces 6 digits for 'u'
- format character). (Ilia)
-- Fixed bug #50345 (nanosleep not detected properly on some solaris versions).
- (Jani)
-- Fixed bug #50340 (php.ini parser does not allow spaces in ini keys). (Jani)
-- Fixed bug #50334 (crypt ignores sha512 prefix). (Pierre)
-- Fixed bug #50323 (Allow use of ; in values via ;; in PDO DSN).
- (Ilia, Pierrick)
-- Fixed bug #50285 (xmlrpc does not preserve keys in encoded indexed arrays).
- (Felipe)
-- Fixed bug #50282 (xmlrpc_encode_request() changes object into array in
- calling function). (Felipe)
-- Fixed bug #50267 (get_browser(null) does not use HTTP_USER_AGENT). (Jani)
-- Fixed bug #50266 (conflicting types for llabs). (Jani)
-- Fixed bug #50261 (Crash When Calling Parent Constructor with
- call_user_func()). (Dmitry)
-- Fixed bug #50255 (isset() and empty() silently casts array to object).
- (Felipe)
-- Fixed bug #50240 (pdo_mysql.default_socket in php.ini shouldn't used
- if it is empty). (foutrelis at gmail dot com, Ilia)
-- Fixed bug #50231 (Socket path passed using --with-mysql-sock is ignored when
- mysqlnd is enabled). (Jani)
-- Fixed bug #50219 (soap call Segmentation fault on a redirected url).
- (Pierrick)
-- Fixed bug #50212 (crash by ldap_get_option() with LDAP_OPT_NETWORK_TIMEOUT).
- (Ilia, shigeru_kitazaki at cybozu dot co dot jp)
-- Fixed bug #50209 (Compiling with libedit cannot find readline.h).
- (tcallawa at redhat dot com)
-- Fixed bug #50207 (segmentation fault when concatenating very large strings on
- 64bit linux). (Ilia)
-- Fixed bug #50196 (stream_copy_to_stream() produces warning when source is
- not file). (Stas)
-- Fixed bug #50195 (pg_copy_to() fails when table name contains schema. (Ilia)
-- Fixed bug #50185 (ldap_get_entries() return false instead of an empty array
- when there is no error). (Jani)
-- Fixed bug #50174 (Incorrectly matched docComment). (Felipe)
-- Fixed bug #50168 (FastCGI fails with wrong error on HEAD request to
- non-existant file). (Dmitry)
-- Fixed bug #50162 (Memory leak when fetching timestamp column from Oracle
- database). (Felipe)
-- Fixed bug #50159 (wrong working directory in symlinked files). (Dmitry)
-- Fixed bug #50158 (FILTER_VALIDATE_EMAIL fails with valid addresses
- containing = or ?). (Pierrick)
-- Fixed bug #50152 (ReflectionClass::hasProperty behaves like isset() not
- property_exists). (Felipe)
-- Fixed bug #50146 (property_exists: Closure object cannot have properties).
- (Felipe)
-- Fixed bug #50145 (crash while running bug35634.phpt). (Felipe)
-- Fixed bug #50140 (With default compilation option, php symbols are unresolved
- for nsapi). (Uwe Schindler)
-- Fixed bug #50087 (NSAPI performance improvements). (Uwe Schindler)
-- Fixed bug #50073 (parse_url() incorrect when ? in fragment). (Ilia)
-- Fixed bug #50023 (pdo_mysql doesn't use PHP_MYSQL_UNIX_SOCK_ADDR). (Ilia)
-- Fixed bug #50005 (Throwing through Reflection modified Exception object
- makes segmentation fault). (Felipe)
-- Fixed bug #49990 (SNMP3 warning message about security level printed twice).
- (Jani)
-- Fixed bug #49985 (pdo_pgsql prepare() re-use previous aborted
- transaction). (ben dot pineau at gmail dot com, Ilia, Matteo)
-- Fixed bug #49938 (Phar::isBuffering() returns inverted value). (Greg)
-- Fixed bug #49936 (crash with ftp stream in php_stream_context_get_option()).
- (Pierrick)
-- Fixed bug #49921 (Curl post upload functions changed). (Ilia)
-- Fixed bug #49866 (Making reference on string offsets crashes PHP). (Dmitry)
-- Fixed bug #49855 (import_request_variables() always returns NULL). (Ilia,
- sjoerd at php dot net)
-- Fixed bug #49851, #50451 (http wrapper breaks on 1024 char long headers).
- (Ilia)
-- Fixed bug #49800 (SimpleXML allow (un)serialize() calls without warning).
- (Ilia, wmeler at wp-sa dot pl)
-- Fixed bug #49719 (ReflectionClass::hasProperty returns true for a private
- property in base class). (Felipe)
-- Fixed bug #49677 (ini parser crashes with apache2 and using ${something}
- ini variables). (Jani)
-- Fixed bug #49660 (libxml 2.7.3+ limits text nodes to 10MB). (Felipe)
-- Fixed bug #49647 (DOMUserData does not exist). (Rob)
-- Fixed bug #49600 (imageTTFText text shifted right). (Takeshi Abe)
-- Fixed bug #49585 (date_format buffer not long enough for >4 digit years).
- (Derick, Adam)
-- Fixed bug #49560 (oci8: using LOBs causes slow PHP shutdown). (Oracle Corp.)
-- Fixed bug #49521 (PDO fetchObject sets values before calling constructor).
- (Pierrick)
-- Fixed bug #49472 (Constants defined in Interfaces can be overridden).
- (Felipe)
-- Fixed bug #49463 (setAttributeNS fails setting default namespace). (Rob)
-- Fixed bug #49244 (Floating point NaN cause garbage characters). (Sjoerd)
-- Fixed bug #49224 (Compile error due to old DNS functions on AIX systems).
- (Scott)
-- Fixed bug #49174 (crash when extending PDOStatement and trying to set
- queryString property). (Felipe)
-- Fixed bug #48811 (Directives in PATH section do not get applied to
- subdirectories). (Patch by: ct at swin dot edu dot au)
-- Fixed bug #48590 (SoapClient does not honor max_redirects). (Sriram)
-- Fixed bug #48190 (Content-type parameter "boundary" is not case-insensitive
- in HTTP uploads). (Ilia)
-- Fixed bug #47848 (importNode doesn't preserve attribute namespaces). (Rob)
-- Fixed bug #47409 (extract() problem with array containing word "this").
- (Ilia, chrisstocktonaz at gmail dot com)
-- Fixed bug #47281 ($php_errormsg is limited in size of characters)
- (Oracle Corp.)
-- Fixed bug #46478 (htmlentities() uses obsolete mapping table for character
- entity references). (Moriyoshi)
-- Fixed bug #45599 (strip_tags() truncates rest of string with invalid
- attribute). (Ilia, hradtke)
-- Fixed bug #45120 (PDOStatement->execute() returns true then false for same
- statement). (Pierrick)
-- Fixed bug #44827 (define() allows :: in constant names). (Ilia)
-- Fixed bug #44098 (imap_utf8() returns only capital letters).
- (steffen at dislabs dot de, Pierre)
-- Fixed bug #34852 (Failure in odbc_exec() using oracle-supplied odbc
- driver). (tim dot tassonis at trivadis dot com)
-
-19 Nov 2009, PHP 5.3.1
-- Upgraded bundled sqlite to version 3.6.19. (Scott)
-- Updated timezone database to version 2009.17 (2009q). (Derick)
-
-- Changed ini file directives [PATH=](on Win32) and [HOST=](on all) to be case
- insensitive. (garretts)
-
-- Restored shebang line check to CGI sapi (not checked by scanner anymore).
- (Jani)
-
-- Added "max_file_uploads" INI directive, which can be set to limit the
- number of file uploads per-request to 20 by default, to prevent possible
- DOS via temporary file exhaustion. (Ilia)
-- Added missing sanity checks around exif processing. (Ilia)
-- Added error constant when json_encode() detects an invalid UTF-8 sequence.
- (Scott)
-- Added support for ACL on Windows for thread safe SAPI (Apache2 for example)
- and fix its support on NTS. (Pierre)
-
-- Improved symbolic, mounted volume and junctions support for realpath on
- Windows. (Pierre)
-- Improved readlink on Windows, suppress \??\ and use the drive syntax only.
- (Pierre)
-- Improved dns_get_record() AAAA support on windows. Always available when
- IPv6 is support is installed, format is now the same than on unix. (Pierre)
-- Improved the DNS functions on OSX to use newer APIs, also use Bind 9 API
- where available on other platforms. (Scott)
-- Improved shared extension loading on OSX to use the standard Unix dlopen()
- API. (Scott)
-
-- Fixed crash in com_print_typeinfo when an invalid typelib is given. (Pierre)
-- Fixed a safe_mode bypass in tempnam() identified by Grzegorz Stachowiak.
- (Rasmus)
-- Fixed a open_basedir bypass in posix_mkfifo() identified by Grzegorz
- Stachowiak. (Rasmus)
-- Fixed certificate validation inside php_openssl_apply_verification_policy
- (Ryan Sleevi, Ilia)
-- Fixed crash in SQLiteDatabase::ArrayQuery() and SQLiteDatabase::SingleQuery()
- when calling using Reflection. (Felipe)
-- Fixed crash when instantiating PDORow and PDOStatement through Reflection.
- (Felipe)
-- Fixed sanity check for the color index in imagecolortransparent. (Pierre)
-- Fixed scandir/readdir when used mounted points on Windows. (Pierre)
-- Fixed zlib.deflate compress filter to actually accept level parameter. (Jani)
-- Fixed leak on error in popen/exec (and related functions) on Windows.
- (Pierre)
-- Fixed possible bad caching of symlinked directories in the realpath cache
- on Windows. (Pierre)
-- Fixed atime and mtime in stat related functions on Windows. (Pierre)
-- Fixed spl_autoload_unregister/spl_autoload_functions wrt. Closures and
- Functors. (Christian Seiler)
-- Fixed open_basedir circumvention for "mail.log" ini directive.
- (Maksymilian Arciemowicz, Stas)
-- Fixed signature generation/validation for zip archives in ext/phar. (Greg)
-- Fixed memory leak in stream_is_local(). (Felipe, Tony)
-- Fixed BC break in mime_content_type(), removes the content encoding. (Scott)
-
-- Fixed PECL bug #16842 (oci_error return false when NO_DATA_FOUND is raised).
- (Chris Jones)
-
-- Fixed bug #50063 (safe_mode_include_dir fails). (Johannes, christian at
- elmerot dot se)
-- Fixed bug #50052 (Different Hashes on Windows and Linux on wrong Salt size).
- (Pierre)
-- Fixed bug #49986 (Missing ICU DLLs on windows package). (Pierre)
-- Fixed bug #49910 (no support for ././@LongLink for long filenames in phar
- tar support). (Greg)
-- Fixed bug #49908 (throwing exception in __autoload crashes when interface
- is not defined). (Felipe)
-- Fixed bug #49847 (exec() fails to return data inside 2nd parameter, given
- output lines >4095 bytes). (Ilia)
-- Fixed bug #49809 (time_sleep_until() is not available on OpenSolaris). (Jani)
-- Fixed bug #49757 (long2ip() can return wrong value in a multi-threaded
- applications). (Ilia, Florian Anderiasch)
-- Fixed bug #49738 (calling mcrypt after mcrypt_generic_deinit crashes).
- (Sriram Natarajan)
-- Fixed bug #49732 (crashes when using fileinfo when timestamp conversion
- fails). (Pierre)
-- Fixed bug #49698 (Unexpected change in strnatcasecmp()). (Rasmus)
-- Fixed bug #49630 (imap_listscan function missing). (Felipe)
-- Fixed bug #49572 (use of C++ style comments causes build failure).
- (Sriram Natarajan)
-- Fixed bug #49531 (CURLOPT_INFILESIZE sometimes causes warning "CURLPROTO_FILE
- cannot be set"). (Felipe)
-- Fixed bug #49517 (cURL's CURLOPT_FILE prevents file from being deleted after
- fclose). (Ilia)
-- Fixed bug #49470 (FILTER_SANITIZE_EMAIL allows disallowed characters).
- (Ilia)
-- Fixed bug #49447 (php engine need to correctly check for socket API
- return status on windows). (Sriram Natarajan)
-- Fixed bug #49391 (ldap.c utilizing deprecated ldap_modify_s). (Ilia)
-- Fixed bug #49372 (segfault in php_curl_option_curl). (Pierre)
-- Fixed bug #49361 (wordwrap() wraps incorrectly on end of line boundaries).
- (Ilia, code-it at mail dot ru)
-- Fixed bug #49306 (inside pdo_mysql default socket settings are ignored).
- (Ilia)
-- Fixed bug #49289 (bcmath module doesn't compile with phpize configure).
- (Jani)
-- Fixed bug #49286 (php://input (php_stream_input_read) is broken). (Jani)
-- Fixed bug #49269 (Ternary operator fails on Iterator object when used inside
- foreach declaration). (Etienne, Dmitry)
-- Fixed bug #49236 (Missing PHP_SUBST(PDO_MYSQL_SHARED_LIBADD)). (Jani)
-- Fixed bug #49223 (Inconsistency using get_defined_constants). (Garrett)
-- Fixed bug #49193 (gdJpegGetVersionString() inside gd_compact identifies
- wrong type in declaration). (Ilia)
-- Fixed bug #49183 (dns_get_record does not return NAPTR records). (Pierre)
-- Fixed bug #49144 (Import of schema from different host transmits original
- authentication details). (Dmitry)
-- Fixed bug #49142 (crash when exception thrown from __tostring()).
- (David Soria Parra)
-- Fixed bug #49132 (posix_times returns false without error).
- (phpbugs at gunnu dot us)
-- Fixed bug #49125 (Error in dba_exists C code). (jdornan at stanford dot edu)
-- Fixed bug #49122 (undefined reference to mysqlnd_stmt_next_result on compile
- with --with-mysqli and MySQL 6.0). (Jani)
-- Fixed bug #49108 (2nd scan_dir produces segfault). (Felipe)
-- Fixed bug #49098 (mysqli segfault on error). (Rasmus)
-- Fixed bug #49095 (proc_get_status['exitcode'] fails on win32). (Felipe)
-- Fixed bug #49092 (ReflectionFunction fails to work with functions in fully
- qualified namespaces). (Kalle, Jani)
-- Fixed bug #49074 (private class static fields can be modified by using
- reflection). (Jani)
-- Fixed bug #49072 (feof never returns true for damaged file in zip). (Pierre)
-- Fixed bug #49065 ("disable_functions" php.ini option does not work on
- Zend extensions). (Stas)
-- Fixed bug #49064 (--enable-session=shared does not work: undefined symbol:
- php_url_scanner_reset_vars). (Jani)
-- Fixed bug #49056 (parse_ini_file() regression in 5.3.0 when using non-ASCII
- strings as option keys). (Jani)
-- Fixed bug #49052 (context option headers freed too early when using
- --with-curlwrappers). (Jani)
-- Fixed bug #49047 (The function touch() fails on directories on Windows).
- (Pierre)
-- Fixed bug #49032 (SplFileObject::fscanf() variables passed by reference).
- (Jani)
-- Fixed bug #49027 (mysqli_options() doesn't work when using mysqlnd). (Andrey)
-- Fixed bug #49026 (proc_open() can bypass safe_mode_protected_env_vars
- restrictions). (Ilia)
-- Fixed bug #49020 (phar misinterprets ustar long filename standard).
- (Greg)
-- Fixed bug #49018 (phar tar stores long filenames wit prefix/name reversed).
- (Greg)
-- Fixed bug #49014 (dechunked filter broken when serving more than 8192 bytes
- in a chunk). (andreas dot streichardt at globalpark dot com, Ilia)
-- Fixed bug #49012 (phar tar signature algorithm reports as Unknown (0) in
- getSignature() call). (Greg)
-- Fixed bug #49000 (PHP CLI in Interactive mode (php -a) crashes
- when including files from function). (Stas)
-- Fixed bug #48994 (zlib.output_compression does not output HTTP headers when
- set to a string value). (Jani)
-- Fixed bug #48980 (Crash when compiling with pdo_firebird). (Felipe)
-- Fixed bug #48962 (cURL does not upload files with specified filename).
- (Ilia)
-- Fixed bug #48929 (Double \r\n after HTTP headers when "header" context
- option is an array). (David Zülke)
-- Fixed bug #48913 (Too long error code strings in pdo_odbc driver).
- (naf at altlinux dot ru, Felipe)
-- Fixed bug #48912 (Namespace causes unexpected strict behaviour with
- extract()). (Dmitry)
-- Fixed bug #48909 (Segmentation fault in mysqli_stmt_execute()). (Andrey)
-- Fixed bug #48899 (is_callable returns true even if method does not exist in
- parent class). (Felipe)
-- Fixed bug #48893 (Problems compiling with Curl). (Felipe)
-- Fixed bug #48880 (Random Appearing open_basedir problem). (Rasmus, Gwynne)
-- Fixed bug #48872 (string.c: errors: duplicate case values). (Kalle)
-- Fixed bug #48854 (array_merge_recursive modifies arrays after first one).
- (Felipe)
-- Fixed bug #48805 (IPv6 socket transport is not working). (Ilia)
-- Fixed bug #48802 (printf() returns incorrect outputted length). (Jani)
-- Fixed bug #48791 (open office files always reported as corrupted). (Greg)
-- Fixed bug #48788 (RecursiveDirectoryIterator doesn't descend into symlinked
- directories). (Ilia)
-- Fixed bug #48783 (make install will fail saying phar file exists). (Greg)
-- Fixed bug #48774 (SIGSEGVs when using curl_copy_handle()).
- (Sriram Natarajan)
-- Fixed bug #48771 (rename() between volumes fails and reports no error on
- Windows). (Pierre)
-- Fixed bug #48768 (parse_ini_*() crash with INI_SCANNER_RAW). (Jani)
-- Fixed bug #48763 (ZipArchive produces corrupt archive). (dani dot church at
- gmail dot com, Pierre)
-- Fixed bug #48762 (IPv6 address filter still rejects valid address). (Felipe)
-- Fixed bug #48757 (ReflectionFunction::invoke() parameter issues). (Kalle)
-- Fixed bug #48754 (mysql_close() crash php when no handle specified).
- (Johannes, Andrey)
-- Fixed bug #48752 (Crash during date parsing with invalid date). (Pierre)
-- Fixed bug #48746 (Unable to browse directories within Junction Points).
- (Pierre, Kanwaljeet Singla)
-- Fixed bug #48745 (mysqlnd: mysql_num_fields returns wrong column count for
- mysql_list_fields). (Andrey)
-- Fixed bug #48740 (PHAR install fails when INSTALL_ROOT is not the final
- install location). (james dot cohen at digitalwindow dot com, Greg)
-- Fixed bug #48733 (CURLOPT_WRITEHEADER|CURLOPT_FILE|CURLOPT_STDERR warns on
- files that have been opened with r+). (Ilia)
-- Fixed bug #48719 (parse_ini_*(): scanner_mode parameter is not checked for
- sanity). (Jani)
-- Fixed bug #48718 (FILTER_VALIDATE_EMAIL does not allow numbers in domain
- components). (Ilia)
-- Fixed bug #48681 (openssl signature verification for tar archives broken).
- (Greg)
-- Fixed bug #48660 (parse_ini_*(): dollar sign as last character of value
- fails). (Jani)
-- Fixed bug #48645 (mb_convert_encoding() doesn't understand hexadecimal
- html-entities). (Moriyoshi)
-- Fixed bug #48637 ("file" fopen wrapper is overwritten when using
- --with-curlwrappers). (Jani)
-- Fixed bug #48608 (Invalid libreadline version not detected during configure).
- (Jani)
-- Fixed bug #48400 (imap crashes when closing stream opened with
- OP_PROTOTYPE flag). (Jani)
-- Fixed bug #48377 (error message unclear on converting phar with existing
- file). (Greg)
-- Fixed bug #48247 (Infinite loop and possible crash during startup with
- errors when errors are logged). (Jani)
-- Fixed bug #48198 error: 'MYSQLND_LLU_SPEC' undeclared. Cause for #48780 and
- #46952 - both fixed too. (Andrey)
-- Fixed bug #48189 (ibase_execute error in return param). (Kalle)
-- Fixed bug #48182 (ssl handshake fails during asynchronous socket connection).
- (Sriram Natarajan)
-- Fixed bug #48116 (Fixed build with Openssl 1.0). (Pierre,
- Al dot Smith at aeschi dot ch dot eu dot org)
-- Fixed bug #48057 (Only the date fields of the first row are fetched, others
- are empty). (info at programmiernutte dot net)
-- Fixed bug #47481 (natcasesort() does not sort extended ASCII characters
- correctly). (Herman Radtke)
-- Fixed bug #47351 (Memory leak in DateTime). (Derick, Tobias John)
-- Fixed bug #47273 (Encoding bug in SoapServer->fault). (Dmitry)
-- Fixed bug #46682 (touch() afield returns different values on windows).
- (Pierre)
-- Fixed bug #46614 (Extended MySQLi class gives incorrect empty() result).
- (Andrey)
-- Fixed bug #46020 (with Sun Java System Web Server 7.0 on HPUX, #define HPUX).
- (Uwe Schindler)
-- Fixed bug #45905 (imagefilledrectangle() clipping error).
- (markril at hotmail dot com, Pierre)
-- Fixed bug #45554 (Inconsistent behavior of the u format char). (Derick)
-- Fixed bug #45141 (setcookie will output expires years of >4 digits). (Ilia)
-- Fixed bug #44683 (popen crashes when an invalid mode is passed). (Pierre)
-- Fixed bug #43510 (stream_get_meta_data() does not return same mode as used
- in fopen). (Jani)
-- Fixed bug #42434 (ImageLine w/ antialias = 1px shorter). (wojjie at gmail dot
- com, Kalle)
-- Fixed bug #40013 (php_uname() does not return nodename on Netware (Guenter
- Knauf)
-- Fixed bug #38091 (Mail() does not use FQDN when sending SMTP helo).
- (Kalle, Rick Yorgason)
-- Fixed bug #28038 (Sent incorrect RCPT TO commands to SMTP server) (Garrett)
-- Fixed bug #27051 (Impersonation with FastCGI does not exec process as
- impersonated user). (Pierre)
-
-
-30 Jun 2009, PHP 5.3.0
-- Upgraded bundled PCRE to version 7.9. (Nuno)
-- Upgraded bundled sqlite to version 3.6.15. (Scott)
-
-- Moved extensions to PECL (Derick, Lukas, Pierre, Scott):
- . ext/dbase
- . ext/fbsql
- . ext/fdf
- . ext/ncurses
- . ext/mhash (BC layer is now entirely within ext/hash)
- . ext/ming
- . ext/msql
- . ext/sybase (not maintained anymore, sybase_ct has to be used instead)
-
-- Removed the experimental RPL (master/slave) functions from mysqli. (Andrey)
-- Removed zend.ze1_compatibility_mode. (Dmitry)
-- Removed all zend_extension_* php.ini directives. Zend extensions are now
- always loaded using zend_extension directive. (Derick)
-- Removed special treatment of "/tmp" in sessions for open_basedir.
- Note: This undocumented behaviour was introduced in 5.2.2. (Alexey)
-- Removed shebang line check from CGI sapi (checked by scanner). (Dmitry)
-
-- Changed PCRE, Reflection and SPL extensions to be always enabled. (Marcus)
-- Changed md5() to use improved implementation. (Solar Designer, Dmitry)
-- Changed HTTP stream wrapper to accept any code between and including
- 200 to 399 as successful. (Mike, Noah Fontes)
-- Changed __call() to be invoked on private/protected method access, similar to
- properties and __get(). (Andrei)
-- Changed dl() to be disabled by default. Enabled only when explicitly
- registered by the SAPI. Currently enabled with cli, cgi and embed SAPIs.
- (Dmitry)
-- Changed opendir(), dir() and scandir() to use default context when no context
- argument is passed. (Sara)
-- Changed open_basedir to allow tightening in runtime contexts. (Sara)
-- Changed PHP/Zend extensions to use flexible build IDs. (Stas)
-- Changed error level E_ERROR into E_WARNING in Soap extension methods
- parameter validation. (Felipe)
-- Changed openssl info to show the shared library version number. (Scott)
-- Changed floating point behaviour to consistently use double precision on all
- platforms and with all compilers. (Christian Seiler)
-- Changed round() to act more intuitively when rounding to a certain precision
- and round very large and very small exponents correctly. (Christian Seiler)
-- Changed session_start() to return false when session startup fails. (Jani)
-- Changed property_exists() to check the existence of a property independent of
- accessibility (like method_exists()). (Felipe)
-- Changed array_reduce() to allow mixed $initial (Christian Seiler)
-
-- Improved PHP syntax and semantics:
- . Added lambda functions and closures. (Christian Seiler, Dmitry)
- . Added "jump label" operator (limited "goto"). (Dmitry, Sara)
- . Added NOWDOC syntax. (Gwynne Raskind, Stas, Dmitry)
- . Added HEREDOC syntax with double quotes. (Lars Strojny, Felipe)
- . Added support for using static HEREDOCs to initialize static variables and
- class members or constants. (Matt)
- . Improved syntax highlighting and consistency for variables in double-quoted
- strings and literal text in HEREDOCs and backticks. (Matt)
- . Added "?:" operator. (Marcus)
- . Added support for namespaces. (Dmitry, Stas, Gregory, Marcus)
- . Added support for Late Static Binding. (Dmitry, Etienne Kneuss)
- . Added support for __callStatic() magic method. (Sara)
- . Added forward_static_call(_array) to complete LSB. (Mike Lively)
- . Added support for dynamic access of static members using $foo::myFunc().
- (Etienne Kneuss)
- . Improved checks for callbacks. (Marcus)
- . Added __DIR__ constant. (Lars Strojny)
- . Added new error modes E_USER_DEPRECATED and E_DEPRECATED.
- E_DEPRECATED is used to inform about stuff being scheduled for removal
- in future PHP versions. (Lars Strojny, Felipe, Marcus)
- . Added "request_order" INI variable to control specifically $_REQUEST
- behavior. (Stas)
- . Added support for exception linking. (Marcus)
- . Added ability to handle exceptions in destructors. (Marcus)
-
-- Improved PHP runtime speed and memory usage:
- . Substitute global-scope, persistent constants with their values at compile
- time. (Matt)
- . Optimized ZEND_SIGNED_MULTIPLY_LONG(). (Matt)
- . Removed direct executor recursion. (Dmitry)
- . Use fastcall calling convention in executor on x86. (Dmitry)
- . Use IS_CV for direct access to $this variable. (Dmitry)
- . Use ZEND_FREE() opcode instead of ZEND_SWITCH_FREE(IS_TMP_VAR). (Dmitry)
- . Lazy EG(active_symbol_table) initialization. (Dmitry)
- . Optimized ZEND_RETURN opcode to not allocate and copy return value if it is
- not used. (Dmitry)
- . Replaced all flex based scanners with re2c based scanners.
- (Marcus, Nuno, Scott)
- . Added garbage collector. (David Wang, Dmitry).
- . Improved PHP binary size and startup speed with GCC4 visibility control.
- (Nuno)
- . Improved engine stack implementation for better performance and stability.
- (Dmitry)
- . Improved memory usage by moving constants to read only memory.
- (Dmitry, Pierre)
- . Changed exception handling. Now each op_array doesn't contain
- ZEND_HANDLE_EXCEPTION opcode in the end. (Dmitry)
- . Optimized require_once() and include_once() by eliminating fopen(3) on
- second usage. (Dmitry)
- . Optimized ZEND_FETCH_CLASS + ZEND_ADD_INTERFACE into single
- ZEND_ADD_INTERFACE opcode. (Dmitry)
- . Optimized string searching for a single character.
- (Michal Dziemianko, Scott)
- . Optimized interpolated strings to use one less opcode. (Matt)
-
-- Improved php.ini handling: (Jani)
- . Added ".htaccess" style user-defined php.ini files support for CGI/FastCGI.
- . Added support for special [PATH=/opt/httpd/www.example.com/] and
- [HOST=www.example.com] sections. Directives set in these sections can
- not be overridden by user-defined ini-files or during runtime.
- . Added better error reporting for php.ini syntax errors.
- . Allowed using full path to load modules using "extension" directive.
- . Allowed "ini-variables" to be used almost everywhere ini php.ini files.
- . Allowed using alphanumeric/variable indexes in "array" ini options.
- . Added 3rd optional parameter to parse_ini_file() to specify the scanning
- mode of INI_SCANNER_NORMAL or INI_SCANNER_RAW. In raw mode option values
- and section values are treated as-is.
- . Fixed get_cfg_var() to be able to return "array" ini options.
- . Added optional parameter to ini_get_all() to only retrieve the current
- value. (Hannes)
-
-- Improved Windows support:
- . Update all libraries to their latest stable version. (Pierre, Rob, Liz,
- Garrett).
- . Added Windows support for stat(), touch(), filemtime(), filesize() and
- related functions. (Pierre)
- . Re-added socket_create_pair() for Windows in sockets extension. (Kalle)
- . Added inet_pton() and inet_ntop() also for Windows platforms.
- (Kalle, Pierre)
- . Added mcrypt_create_iv() for Windows platforms. (Pierre)
- . Added ACL Cache support on Windows.
- (Kanwaljeet Singla, Pierre, Venkat Raman Don)
- . Added constants based on Windows' GetVersionEx information.
- PHP_WINDOWS_VERSION_* and PHP_WINDOWS_NT_*. (Pierre)
- . Added support for ACL (is_writable, is_readable, reports now correct
- results) on Windows. (Pierre, Venkat Raman Don, Kanwaljeet Singla)
- . Added support for fnmatch() on Windows. (Pierre)
- . Added support for time_nanosleep() and time_sleep_until() on Windows.
- (Pierre)
- . Added support for symlink(), readlink(), linkinfo() and link() on Windows.
- They are available only when the running platform supports them. (Pierre)
- . the GMP extension now relies on MPIR instead of the GMP library. (Pierre)
- . Added Windows support for stream_socket_pair(). (Kalle)
- . Drop all external dependencies for the core features. (Pierre)
- . Drastically improve the build procedure (Pierre, Kalle, Rob):
- . VC9 (Visual C++ 2008) or later support
- . Initial experimental x64 support
- . MSI installer now supports all recent Windows versions, including
- Windows 7. (John, Kanwaljeet Singla)
-
-- Improved and cleaned CGI code:
- . FastCGI is now always enabled and cannot be disabled.
- See sapi/cgi/CHANGES for more details. (Dmitry)
- . Added CGI SAPI -T option which can be used to measure execution
- time of script repeated several times. (Dmitry)
-
-- Improved streams:
- . Fixed confusing error message on failure when no errors are logged. (Greg)
- . Added stream_supports_lock() function. (Benjamin Schulz)
- . Added context parameter for copy() function. (Sara)
- . Added "glob://" stream wrapper. (Marcus)
- . Added "params" as optional parameter for stream_context_create(). (Sara)
- . Added ability to use stream wrappers in include_path. (Gregory, Dmitry)
-
-- Improved DNS API
- . Added Windows support for dns_check_record(), dns_get_mx(), checkdnsrr() and
- getmxrr(). (Pierre)
- . Added support for old style DNS functions (supports OSX and FBSD). (Scott)
- . Added a new "entries" array in dns_check_record() containing the TXT
- elements. (Felipe, Pierre)
-
-- Improved hash extension:
- . Changed mhash to be a wrapper layer around the hash extension. (Scott)
- . Added hash_copy() function. (Tony)
- . Added sha224 hash algorithm to the hash extension. (Scott)
-
-- Improved IMAP support (Pierre):
- . Added imap_gc() to clear the imap cache
- . Added imap_utf8_to_mutf7() and imap_mutf7_to_utf8()
-
-- Improved mbstring extension:
- . Added "mbstring.http_output_conv_mimetypes" INI directive that allows
- common non-text types such as "application/xhtml+xml" to be converted
- by mb_output_handler(). (Moriyoshi)
-
-- Improved OCI8 extension (Chris Jones/Oracle Corp.):
- . Added Database Resident Connection Pooling (DRCP) and Fast
- Application Notification (FAN) support.
- . Added support for Oracle External Authentication (not supported
- on Windows).
- . Improve persistent connection handling of restarted DBs.
- . Added SQLT_AFC (aka CHAR datatype) support to oci_bind_by_name.
- . Fixed bug #45458 (Numeric keys for associative arrays are not
- handled properly)
- . Fixed bug #41069 (Segmentation fault with query over DB link).
- . Fixed define of SQLT_BDOUBLE and SQLT_BFLOAT constants with Oracle
- 10g ORACLE_HOME builds.
- . Changed default value of oci8.default_prefetch from 10 to 100.
- . Fixed PECL Bug #16035 (OCI8: oci_connect without ORACLE_HOME defined causes
- segfault) (Chris Jones/Oracle Corp.)
- . Fixed PECL Bug #15988 (OCI8: sqlnet.ora isn't read with older Oracle
- libraries) (Chris Jones/Oracle Corp.)
- . Fixed PECL Bug #14268 (Allow "pecl install oci8" command to "autodetect" an
- Instant Client RPM install) (Chris Jones/Oracle Corp.)
- . Fixed PECL bug #12431 (OCI8 ping functionality is broken).
- . Allow building (e.g from PECL) the PHP 5.3-based OCI8 code with
- PHP 4.3.9 onwards.
- . Provide separate extensions for Oracle 11g and 10g on Windows.
- (Pierre, Chris)
-
-- Improved OpenSSL extension:
- . Added support for OpenSSL digest and cipher functions. (Dmitry)
- . Added access to internal values of DSA, RSA and DH keys. (Dmitry)
- . Fixed a memory leak on openssl_decrypt(). (Henrique)
- . Fixed segfault caused by openssl_pkey_new(). (Henrique)
- . Fixed bug caused by uninitilized variables in openssl_pkcs7_encrypt() and
- openssl_pkcs7_sign(). (Henrique)
- . Fixed error message in openssl_seal(). (Henrique)
-
-- Improved pcntl extension: (Arnaud)
- . Added pcntl_signal_dispatch().
- . Added pcntl_sigprocmask().
- . Added pcntl_sigwaitinfo().
- . Added pcntl_sigtimedwait().
-
-- Improved SOAP extension:
- . Added support for element names in context of XMLSchema's <any>. (Dmitry)
- . Added ability to use Traversable objects instead of plain arrays.
- (Joshua Reese, Dmitry)
- . Fixed possible crash bug caused by an uninitialized value. (Zdash Urf)
-
-- Improved SPL extension:
- . Added SPL to list of standard extensions that cannot be disabled. (Marcus)
- . Added ability to store associative information with objects in
- SplObjectStorage. (Marcus)
- . Added ArrayAccess support to SplObjectStorage. (Marcus)
- . Added SplDoublyLinkedList, SplStack, SplQueue classes. (Etienne)
- . Added FilesystemIterator. (Marcus)
- . Added GlobIterator. (Marcus)
- . Added SplHeap, SplMinHeap, SplMaxHeap, SplPriorityQueue classes. (Etienne)
- . Added new parameter $prepend to spl_autoload_register(). (Etienne)
- . Added SplFixedArray. (Etienne, Tony)
- . Added delaying exceptions in SPL's autoload mechanism. (Marcus)
- . Added RecursiveTreeIterator. (Arnaud, Marcus)
- . Added MultipleIterator. (Arnaud, Marcus, Johannes)
-
-- Improved Zend Engine:
- . Added "compact" handler for Zend MM storage. (Dmitry)
- . Added "+" and "*" specifiers to zend_parse_parameters(). (Andrei)
- . Added concept of "delayed early binding" that allows opcode caches to
- perform class declaration (early and/or run-time binding) in exactly
- the same order as vanilla PHP. (Dmitry)
-
-- Improved crypt() function: (Pierre)
- . Added Blowfish and extended DES support. (Using Blowfish implementation
- from Solar Designer).
- . Made crypt features portable by providing our own implementations
- for crypt_r and the algorithms which are used when OS does not provide
- them. PHP implementations are always used for Windows builds.
-
-- Deprecated session_register(), session_unregister() and
- session_is_registered(). (Hannes)
-- Deprecated define_syslog_variables(). (Kalle)
-- Deprecated ereg extension. (Felipe)
-
-- Added new extensions:
- . Added Enchant extension as a way to access spell checkers. (Pierre)
- . Added fileinfo extension as replacement for mime_magic extension. (Derick)
- . Added intl extension for Internationalization. (Ed B., Vladimir I.,
- Dmitry L., Stanislav M., Vadim S., Kirti V.)
- . Added mysqlnd extension as replacement for libmysql for ext/mysql, mysqli
- and PDO_mysql. (Andrey, Johannes, Ulf)
- . Added phar extension for handling PHP Archives. (Greg, Marcus, Steph)
- . Added SQLite3 extension. (Scott)
-
-- Added new date/time functionality: (Derick)
- . date_parse_from_format(): Parse date/time strings according to a format.
- . date_create_from_format()/DateTime::createFromFormat(): Create a date/time
- object by parsing a date/time string according to a given format.
- . date_get_last_errors()/DateTime::getLastErrors(): Return a list of warnings
- and errors that were found while parsing a date/time string through:
- . strtotime() / new DateTime
- . date_create_from_format() / DateTime::createFromFormat()
- . date_parse_from_format().
- . support for abbreviation and offset based timezone specifiers for
- the 'e' format specifier, DateTime::__construct(), DateTime::getTimeZone()
- and DateTimeZone::getName().
- . support for selectively listing timezone identifiers by continent or
- country code through timezone_identifiers_list() /
- DateTimezone::listIdentifiers().
- . timezone_location_get() / DateTimezone::getLocation() for retrieving
- location information from timezones.
- . date_timestamp_set() / DateTime::setTimestamp() to set a Unix timestamp
- without invoking the date parser. (Scott, Derick)
- . date_timestamp_get() / DateTime::getTimestamp() to retrieve the Unix
- timestamp belonging to a date object.
- . two optional parameters to timezone_transitions_get() /
- DateTimeZone::getTranstions() to limit the range of transitions being
- returned.
- . support for "first/last day of <month>" style texts.
- . support for date/time strings returned by MS SQL.
- . support for serialization and unserialization of DateTime objects.
- . support for diffing date/times through date_diff() / DateTime::diff().
- . support for adding/subtracting weekdays with strtotime() and
- DateTime::modify().
- . DateInterval class to represent the difference between two date/times.
- . support for parsing ISO intervals for use with DateInterval.
- . date_add() / DateTime::add(), date_sub() / DateTime::sub() for applying an
- interval to an existing date/time.
- . proper support for "this week", "previous week"/"last week" and "next week"
- phrases so that they actually mean the week and not a seven day period
- around the current day.
- . support for "<xth> <weekday> of" and "last <weekday> of" phrases to be used
- with months - like in "last saturday of februari 2008".
- . support for "back of <hour>" and "front of <hour>" phrases that are used in
- Scotland.
- . DatePeriod class which supports iterating over a DateTime object applying
- DateInterval on each iteration, up to an end date or limited by maximum
- number of occurences.
-
-- Added compatibility mode in GD, imagerotate, image(filled)ellipse
- imagefilter, imageconvolution and imagecolormatch are now always enabled.
- (Pierre)
-- Added array_replace() and array_replace_recursive() functions. (Matt)
-- Added ReflectionProperty::setAccessible() method that allows non-public
- property's values to be read through ::getValue() and set through
- ::setValue(). (Derick, Sebastian)
-- Added msg_queue_exists() function to sysvmsg extension. (Benjamin Schulz)
-- Added Firebird specific attributes that can be set via PDO::setAttribute()
- to control formatting of date/timestamp columns: PDO::FB_ATTR_DATE_FORMAT,
- PDO::FB_ATTR_TIME_FORMAT and PDO::FB_ATTR_TIMESTAMP_FORMAT. (Lars W)
-- Added gmp_testbit() function. (Stas)
-- Added icon format support to getimagesize(). (Scott)
-- Added LDAP_OPT_NETWORK_TIMEOUT option for ldap_set_option() to allow
- setting network timeout (FR #42837). (Jani)
-- Added optional escape character parameter to fgetcsv(). (David Soria Parra)
-- Added an optional parameter to strstr() and stristr() for retrieval of either
- the part of haystack before or after first occurrence of needle.
- (Johannes, Felipe)
-- Added xsl->setProfiling() for profiling stylesheets. (Christian)
-- Added long-option feature to getopt() and made getopt() available also on
- win32 systems by adding a common getopt implementation into core.
- (David Soria Parra, Jani)
-- Added support for optional values, and = as separator, in getopt(). (Hannes)
-- Added lcfirst() function. (David C)
-- Added PREG_BAD_UTF8_OFFSET_ERROR constant. (Nuno)
-- Added native support for asinh(), acosh(), atanh(), log1p() and expm1().
- (Kalle)
-- Added LIBXML_LOADED_VERSION constant (libxml2 version currently used). (Rob)
-- Added JSON_FORCE_OBJECT flag to json_encode(). (Scott, Richard Quadling)
-- Added timezone_version_get() to retrieve the version of the used timezone
- database. (Derick)
-- Added 'n' flag to fopen to allow passing O_NONBLOCK to the underlying
- open(2) system call. (Mikko)
-- Added "dechunk" filter which can decode HTTP responses with chunked
- transfer-encoding. HTTP streams use this filter automatically in case
- "Transfer-Encoding: chunked" header is present in response. It's possible to
- disable this behaviour using "http"=>array("auto_decode"=>0) in stream
- context. (Dmitry)
-- Added support for CP850 encoding in mbstring extension.
- (Denis Giffeler, Moriyoshi)
-- Added stream_cast() and stream_set_options() to user-space stream wrappers,
- allowing stream_select(), stream_set_blocking(), stream_set_timeout() and
- stream_set_write_buffer() to work with user-space stream wrappers. (Arnaud)
-- Added header_remove() function. (chsc at peytz dot dk, Arnaud)
-- Added stream_context_get_params() function. (Arnaud)
-- Added optional parameter "new" to sybase_connect(). (Timm)
-- Added parse_ini_string() function. (grange at lemonde dot fr, Arnaud)
-- Added str_getcsv() function. (Sara)
-- Added openssl_random_pseudo_bytes() function. (Scott)
-- Added ability to send user defined HTTP headers with SOAP request.
- (Brian J.France, Dmitry)
-- Added concatenation option to bz2.decompress stream filter.
- (Keisial at gmail dot com, Greg)
-- Added support for using compressed connections with PDO_mysql. (Johannes)
-- Added the ability for json_decode() to take a user specified depth. (Scott)
-- Added support for the mysql_stmt_next_result() function from libmysql.
- (Andrey)
-- Added function preg_filter() that does grep and replace in one go. (Marcus)
-- Added system independent realpath() implementation which caches intermediate
- directories in realpath-cache. (Dmitry)
-- Added optional clear_realpath_cache and filename parameters to
- clearstatcache(). (Jani, Arnaud)
-- Added litespeed SAPI module. (George Wang)
-- Added ext/hash support to ext/session's ID generator. (Sara)
-- Added quoted_printable_encode() function. (Tony)
-- Added stream_context_set_default() function. (Davey Shafik)
-- Added optional "is_xhtml" parameter to nl2br() which makes the function
- output <br> when false and <br /> when true (FR #34381). (Kalle)
-- Added PHP_MAXPATHLEN constant (maximum length of a path). (Pierre)
-- Added support for SSH via libssh2 in cURL. (Pierre)
-- Added support for gray levels PNG image with alpha in GD extension. (Pierre)
-- Added support for salsa hashing functions in HASH extension. (Scott)
-- Added DOMNode::getLineNo to get line number of parsed node. (Rob)
-- Added table info to PDO::getColumnMeta() with SQLite. (Martin Jansen, Scott)
-- Added mail logging functionality that allows logging of mail sent via
- mail() function. (Ilia)
-- Added json_last_error() to return any error information from json_decode().
- (Scott)
-- Added gethostname() to return the current system host name. (Ilia)
-- Added shm_has_var() function. (Mike)
-- Added depth parameter to json_decode() to lower the nesting depth from the
- maximum if required. (Scott)
-- Added pixelation support in imagefilter(). (Takeshi Abe, Kalle)
-- Added SplObjectStorage::addAll/removeAll. (Etienne)
-
-- Implemented FR #41712 (curl progress callback: CURLOPT_PROGRESSFUNCTION).
- (sdteffen[at]gmail[dot].com, Pierre)
-- Implemented FR #47739 (Missing cURL option do disable IPv6). (Pierre)
-- Implemented FR #39637 (Missing cURL option CURLOPT_FTP_FILEMETHOD). (Pierre)
-
-- Fixed an issue with ReflectionProperty::setAccessible().
- (Sebastian, Roman Borschel)
-- Fixed html_entity_decode() incorrectly converting numeric html entities
- to different characters with cp1251 and cp866. (Scott)
-- Fixed an issue in date() where a : was printed for the O modifier after a P
- modifier was used. (Derick)
-- Fixed exec() on Windows to not eat the first and last double quotes. (Scott)
-- Fixed readlink on Windows in thread safe SAPI (apache2.x etc.). (Pierre)
-- Fixed a bug causing miscalculations with the "last <weekday> of <n> month"
- relative time string. (Derick)
-- Fixed bug causing the algorithm parameter of mhash() to be modified. (Scott)
-- Fixed invalid calls to free when internal fileinfo magic file is used. (Scott)
-- Fixed memory leak inside wddx_add_vars() function. (Felipe)
-- Fixed check in recode extension to allow builing of recode and mysql
- extensions when using a recent libmysql. (Johannes)
-
-- Fixed PECL bug #12794 (PDOStatement->nextRowset() doesn't work). (Johannes)
-- Fixed PECL bug #12401 (Add support for ATTR_FETCH_TABLE_NAMES). (Johannes)
-
-- Fixed bug #48696 (ldap_read() segfaults with invalid parameters). (Felipe)
-- Fixed bug #48643 (String functions memory issue). (Dmitry)
-- Fixed bug #48641 (tmpfile() uses old parameter parsing).
- (crrodriguez at opensuse dot org)
-- Fixed bug #48624 (.user.ini never gets parsed). (Pierre)
-- Fixed bug #48620 (X-PHP-Originating-Script assumes no trailing CRLF in
- existing headers). (Ilia)
-- Fixed bug #48578 (Can't build 5.3 on FBSD 4.11). (Rasmus)
-- Fixed bug #48535 (file_exists returns false when impersonate is used).
- (Kanwaljeet Singla, Venkat Raman Don)
-- Fixed bug #48493 (spl_autoload_register() doesn't work correctly when
- prepending functions). (Scott)
-- Fixed bug #48215 (Calling a method with the same name as the parent class
- calls the constructor). (Scott)
-- Fixed bug #48200 (compile failure with mbstring.c when
- --enable-zend-multibyte is used). (Jani)
-- Fixed bug #48188 (Cannot execute a scrollable cursors twice with PDO_PGSQL).
- (Matteo)
-- Fixed bug #48185 (warning: value computed is not used in
- pdo_sqlite_stmt_get_col line 271). (Matteo)
-- Fixed bug #48087 (call_user_method() invalid free of arguments). (Felipe)
-- Fixed bug #48060 (pdo_pgsql - large objects are returned as empty). (Matteo)
-- Fixed bug #48034 (PHP crashes when script is 8192 (8KB) bytes long). (Dmitry)
-- Fixed bug #48004 (Error handler prevents creation of default object). (Dmitry)
-- Fixed bug #47880 (crashes in call_user_func_array()). (Dmitry)
-- Fixed bug #47856 (stristr() converts needle to lower-case). (Ilia)
-- Fixed bug #47851 (is_callable throws fatal error). (Dmitry)
-- Fixed bug #47816 (pcntl tests failing on NetBSD). (Matteo)
-- Fixed bug #47779 (Wrong value for SIG_UNBLOCK and SIG_SETMASK constants).
- (Matteo)
-- Fixed bug #47771 (Exception during object construction from arg call calls
- object's destructor). (Dmitry)
-- Fixed bug #47767 (include_once does not resolve windows symlinks or junctions)
- (Kanwaljeet Singla, Venkat Raman Don)
-- Fixed bug #47757 (rename JPG to JPEG in phpinfo). (Pierre)
-- Fixed bug #47745 (FILTER_VALIDATE_INT doesn't allow minimum integer). (Dmitry)
-- Fixed bug #47714 (autoloading classes inside exception_handler leads to
- crashes). (Dmitry)
-- Fixed bug #47671 (Cloning SplObjectStorage instances). (Etienne)
-- Fixed bug #47664 (get_class returns NULL instead of FALSE). (Dmitry)
-- Fixed bug #47662 (Support more than 127 subpatterns in preg_match). (Nuno)
-- Fixed bug #47596 (Bus error on parsing file). (Dmitry)
-- Fixed bug #47572 (Undefined constant causes segmentation fault). (Felipe)
-- Fixed bug #47560 (explode()'s limit parameter odd behaviour). (Matt)
-- Fixed bug #47549 (get_defined_constants() return array with broken array
- categories). (Ilia)
-- Fixed bug #47535 (Compilation failure in ps_fetch_from_1_to_8_bytes()).
- (Johannes)
-- Fixed bug #47534 (RecursiveDiteratoryIterator::getChildren ignoring
- CURRENT_AS_PATHNAME). (Etienne)
-- Fixed bug #47443 (metaphone('scratch') returns wrong result). (Felipe)
-- Fixed bug #47438 (mysql_fetch_field ignores zero offset). (Johannes)
-- Fixed bug #47398 (PDO_Firebird doesn't implements quoter correctly). (Felipe)
-- Fixed bug #47390 (odbc_fetch_into - BC in php 5.3.0). (Felipe)
-- Fixed bug #47359 (Use the expected unofficial mimetype for bmp files). (Scott)
-- Fixed bug #47343 (gc_collect_cycles causes a segfault when called within a
- destructor in one case). (Dmitry)
-- Fixed bug #47320 ($php_errormsg out of scope in functions). (Dmitry)
-- Fixed bug #47318 (UMR when trying to activate user config). (Pierre)
-- Fixed bug #47243 (OCI8: Crash at shutdown on Windows) (Chris Jones/Oracle
- Corp.)
-- Fixed bug #47231 (offsetGet error using incorrect offset). (Etienne)
-- Fixed bug #47229 (preg_quote() should escape the '-' char). (Nuno)
-- Fixed bug #47165 (Possible memory corruption when passing return value by
- reference). (Dmitry)
-- Fixed bug #47087 (Second parameter of mssql_fetch_array()). (Felipe)
-- Fixed bug #47085 (rename() returns true even if the file in PHAR does not
- exist). (Greg)
-- Fixed bug #47050 (mysqli_poll() modifies improper variables). (Johannes)
-- Fixed bug #47045 (SplObjectStorage instances compared with ==). (Etienne)
-- Fixed bug #47038 (Memory leak in include). (Dmitry)
-- Fixed bug #47031 (Fix constants in DualIterator example). (Etienne)
-- Fixed bug #47021 (SoapClient stumbles over WSDL delivered with
- "Transfer-Encoding: chunked"). (Dmitry)
-- Fixed bug #46994 (OCI8: CLOB size does not update when using CLOB IN OUT param
- in stored procedure) (Chris Jones/Oracle Corp.)
-- Fixed bug #46979 (use with non-compound name *has* effect). (Dmitry)
-- Fixed bug #46957 (The tokenizer returns deprecated values). (Felipe)
-- Fixed bug #46944 (UTF-8 characters outside the BMP aren't encoded correctly).
- (Scott)
-- Fixed bug #46897 (ob_flush() should fail to flush unerasable buffers).
- (David C.)
-- Fixed bug #46849 (Cloning DOMDocument doesn't clone the properties). (Rob)
-- Fixed bug #46847 (phpinfo() is missing some settings). (Hannes)
-- Fixed bug #46844 (php scripts or included files with first line starting
- with # have the 1st line missed from the output). (Ilia)
-- Fixed bug #46817 (tokenizer misses last single-line comment (PHP 5.3+, with
- re2c lexer)). (Matt, Shire)
-- Fixed bug #46811 (ini_set() doesn't return false on failure). (Hannes)
-- Fixed bug #46763 (mb_stristr() wrong output when needle does not exist).
- (Henrique M. Decaria)
-- Fixed bug #46755 (warning: use statement with non-compound name). (Dmitry)
-- Fixed bug #46746 (xmlrpc_decode_request outputs non-suppressable error when
- given bad data). (Ilia)
-- Fixed bug #46738 (Segfault when mb_detect_encoding() fails). (Scott)
-- Fixed bug #46731 (Missing validation for the options parameter of the
- imap_fetch_overview() function). (Ilia)
-- Fixed bug #46711 (cURL curl_setopt leaks memory in foreach loops). (magicaltux
- [at] php [dot] net)
-- Fixed bug #46701 (Creating associative array with long values in the key fails
- on 32bit linux). (Shire)
-- Fixed bug #46681 (mkdir() fails silently on PHP 5.3). (Hannes)
-- Fixed bug #46653 (can't extend mysqli). (Johannes)
-- Fixed bug #46646 (Restrict serialization on some internal classes like Closure
- and SplFileInfo using exceptions). (Etienne)
-- Fixed bug #46623 (OCI8: phpinfo doesn't show compile time ORACLE_HOME with
- phpize) (Chris Jones/Oracle Corp.)
-- Fixed bug #46578 (strip_tags() does not honor end-of-comment when it
- encounters a single quote). (Felipe)
-- Fixed bug #46546 (Segmentation fault when using declare statement with
- non-string value). (Felipe)
-- Fixed bug #46542 (Extending PDO class with a __call() function doesn't work as
- expected). (Johannes)
-- Fixed bug #46421 (SplFileInfo not correctly handling /). (Etienne)
-- Fixed bug #46347 (parse_ini_file() doesn't support * in keys). (Nuno)
-- Fixed bug #46268 (DateTime::modify() does not reset relative time values).
- (Derick)
-- Fixed bug #46241 (stacked error handlers, internal error handling in general).
- (Etienne)
-- Fixed bug #46238 (Segmentation fault on static call with empty string method).
- (Felipe)
-- Fixed bug #46192 (ArrayObject with objects as storage serialization).
- (Etienne)
-- Fixed bug #46185 (importNode changes the namespace of an XML element). (Rob)
-- Fixed bug #46178 (memory leak in ext/phar). (Greg)
-- Fixed bug #46160 (SPL - Memory leak when exception is thrown in offsetSet).
- (Felipe)
-- Fixed Bug #46147 (after stream seek, appending stream filter reads incorrect
- data). (Greg)
-- Fixed bug #46127 (php_openssl_tcp_sockop_accept forgets to set context on
- accepted stream) (Mark Karpeles, Pierre)
-- Fixed bug #46115 (Memory leak when calling a method using Reflection).
- (Dmitry)
-- Fixed bug #46110 (XMLWriter - openmemory() and openuri() leak memory on
- multiple calls). (Ilia)
-- Fixed bug #46108 (DateTime - Memory leak when unserializing). (Felipe)
-- Fixed bug #46106 (Memory leaks when using global statement). (Dmitry)
-- Fixed bug #46099 (Xsltprocessor::setProfiling - memory leak). (Felipe, Rob).
-- Fixed bug #46087 (DOMXPath - segfault on destruction of a cloned object).
- (Ilia)
-- Fixed bug #46048 (SimpleXML top-level @attributes not part of iterator).
- (David C.)
-- Fixed bug #46044 (Mysqli - wrong error message). (Johannes)
-- Fixed bug #46042 (memory leaks with reflection of mb_convert_encoding()).
- (Ilia)
-- Fixed bug #46039 (ArrayObject iteration is slow). (Arnaud)
-- Fixed bug #46033 (Direct instantiation of SQLite3stmt and SQLite3result cause
- a segfault.) (Scott)
-- Fixed bug #45991 (Ini files with the UTF-8 BOM are treated as invalid).
- (Scott)
-- Fixed bug #45989 (json_decode() doesn't return NULL on certain invalid
- strings). (magicaltux, Scott)
-- Fixed bug #45976 (Moved SXE from SPL to SimpleXML). (Etienne)
-- Fixed bug #45928 (large scripts from stdin are stripped at 16K border).
- (Christian Schneider, Arnaud)
-- Fixed bug #45911 (Cannot disable ext/hash). (Arnaud)
-- Fixed bug #45907 (undefined reference to 'PHP_SHA512Init'). (Greg)
-- Fixed bug #45826 (custom ArrayObject serialization). (Etienne)
-- Fixed bug #45820 (Allow empty keys in ArrayObject). (Etienne)
-- Fixed bug #45791 (json_decode() doesn't convert 0e0 to a double). (Scott)
-- Fixed bug #45786 (FastCGI process exited unexpectedly). (Dmitry)
-- Fixed bug #45757 (FreeBSD4.11 build failure: failed include; stdint.h).
- (Hannes)
-- Fixed bug #45743 (property_exists fails to find static protected member in
- child class). (Felipe)
-- Fixed bug #45717 (Fileinfo/libmagic build fails, missing err.h and getopt.h).
- (Derick)
-- Fixed bug #45706 (Unserialization of classes derived from ArrayIterator
- fails). (Etienne, Dmitry)
-- Fixed bug #45696 (Not all DateTime methods allow method chaining). (Derick)
-- Fixed bug #45682 (Unable to var_dump(DateInterval)). (Derick)
-- Fixed bug #45447 (Filesystem time functions on Vista and server 2008).
- (Pierre)
-- Fixed bug #45432 (PDO: persistent connection leak). (Felipe)
-- Fixed bug #45392 (ob_start()/ob_end_clean() and memory_limit). (Ilia)
-- Fixed bug #45384 (parse_ini_file will result in parse error with no trailing
- newline). (Arnaud)
-- Fixed bug #45382 (timeout bug in stream_socket_enable_crypto). (vnegrier at
- optilian dot com, Ilia)
-- Fixed bug #45044 (relative paths not resolved correctly). (Dmitry)
-- Fixed bug #44861 (scrollable cursor don't work with pgsql). (Matteo)
-- Fixed bug #44842 (parse_ini_file keys that start/end with underscore).
- (Arnaud)
-- Fixed bug #44575 (parse_ini_file comment # line problems). (Arnaud)
-- Fixed bug #44409 (PDO::FETCH_SERIALIZE calls __construct()). (Matteo)
-- Fixed bug #44173 (PDO->query() parameter parsing/checking needs an update).
- (Matteo)
-- Fixed bug #44154 (pdo->errorInfo() always have three elements in the returned
- array). (David C.)
-- Fixed bug #44153 (pdo->errorCode() returns NULL when there are no errors).
- (David C.)
-- Fixed bug #44135 (PDO MySQL does not support CLIENT_FOUND_ROWS). (Johannes,
- chx1975 at gmail dot com)
-- Fixed bug #44100 (Inconsistent handling of static array declarations with
- duplicate keys). (Dmitry)
-- Fixed bug #43831 ($this gets mangled when extending PDO with persistent
- connection). (Felipe)
-- Fixed bug #43817 (opendir() fails on Windows directories with parent directory
- unaccessible). (Dmitry)
-- Fixed bug #43069 (SoapClient causes 505 HTTP Version not supported error
- message). (Dmitry)
-- Fixed bug #43008 (php://filter uris ignore url encoded filternames and can't
- handle slashes). (Arnaud)
-- Fixed bug #42362 (HTTP status codes 204 and 304 should not be gzipped).
- (Scott, Edward Z. Yang)
-- Fixed bug #41874 (separate STDOUT and STDERR in exec functions). (Kanwaljeet
- Singla, Venkat Raman Don, Pierre)
-- Fixed bug #41534 (SoapClient over HTTPS fails to reestablish connection).
- (Dmitry)
-- Fixed bug #38802 (max_redirects and ignore_errors). (patch by
- datibbaw@php.net)
-- Fixed bug #35980 (touch() works on files but not on directories). (Pierre)
-
-17 Jun 2009, PHP 5.2.10
-- Updated timezone database to version 2009.9 (2009i) (Derick)
-
-- Added "ignore_errors" option to http fopen wrapper. (David Zulke, Sara)
-- Added new CURL options CURLOPT_REDIR_PROTOCOLS, CURLOPT_PROTOCOLS,
- and CURLPROTO_* for redirect fixes in CURL 7.19.4. (Yoram Bar Haim, Stas)
-- Added support for Sun CC (FR #46595 and FR #46513). (David Soria Parra)
-
-- Changed default value of array_unique()'s optional sorting type parameter
- back to SORT_STRING to fix backwards compatibility breakage introduced in
- PHP 5.2.9. (Moriyoshi)
-
-- Fixed memory corruptions while reading properties of zip files. (Ilia)
-- Fixed memory leak in ob_get_clean/ob_get_flush. (Christian)
-- Fixed segfault on invalid session.save_path. (Hannes)
-- Fixed leaks in imap when a mail_criteria is used. (Pierre)
-- Fixed missing erealloc() in fix for Bug #40091 in spl_autoload_register. (Greg)
-
-- Fixed bug #48562 (Reference recursion causes segfault when used in
- wddx_serialize_vars()). (Felipe)
-- Fixed bug #48557 (Numeric string keys in Apache Hashmaps are not cast to
- integers). (David Zuelke)
-- Fixed bug #48518 (curl crashes when writing into invalid file handle). (Tony)
-- Fixed bug #48514 (cURL extension uses same resource name for simple and
- multi APIs). (Felipe)
-- Fixed bug #48469 (ldap_get_entries() leaks memory on empty search
- results). (Patrick)
-- Fixed bug #48456 (CPPFLAGS not restored properly in phpize.m4). (Jani,
- spisek at kerio dot com)
-- Fixed bug #48448 (Compile failure under IRIX 6.5.30 building cast.c).
- (Kalle)
-- Fixed bug #48441 (ldap_search() sizelimit, timelimit and deref options
- persist). (Patrick)
-- Fixed bug #48434 (Improve memory_get_usage() accuracy). (Arnaud)
-- Fixed bug #48416 (Force a cache limit in ereg() to stop excessive memory
- usage). (Scott)
-- Fixed bug #48409 (Crash when exception is thrown while passing function
- arguments). (Arnaud)
-- Fixed bug #48378 (exif_read_data() segfaults on certain corrupted .jpeg
- files). (Pierre)
-- Fixed bug #48359 (Script hangs on snmprealwalk if OID is not increasing).
- (Ilia, simonov at gmail dot com)
-- Fixed bug #48336 (ReflectionProperty::getDeclaringClass() does not work
- with redeclared property).
- (patch by Markus dot Lidel at shadowconnect dot com)
-- Fixed bug #48326 (constant MSG_DONTWAIT not defined). (Arnaud)
-- Fixed bug #48313 (fgetcsv() does not return null for empty rows). (Ilia)
-- Fixed bug #48309 (stream_copy_to_stream() and fpasstru() do not update
- stream position of plain files). (Arnaud)
-- Fixed bug #48307 (stream_copy_to_stream() copies 0 bytes when $source is a
- socket). (Arnaud)
-- Fixed bug #48273 (snmp*_real_walk() returns SNMP errors as values).
- (Ilia, lytboris at gmail dot com)
-- Fixed bug #48256 (Crash due to double-linking of history.o).
- (tstarling at wikimedia dot org)
-- Fixed bug #48248 (SIGSEGV when access to private property via &__get).
- (Felipe)
-- Fixed bug #48247 (Crash on errors during startup). (Stas)
-- Fixed bug #48240 (DBA Segmentation fault dba_nextkey). (Felipe)
-- Fixed bug #48224 (Incorrect shuffle in array_rand). (Etienne)
-- Fixed bug #48221 (memory leak when passing invalid xslt parameter).
- (Felipe)
-- Fixed bug #48207 (CURLOPT_(FILE|WRITEHEADER options do not error out when
- working with a non-writable stream). (Ilia)
-- Fixed bug #48206 (Iterating over an invalid data structure with
- RecursiveIteratorIterator leads to a segfault). (Scott)
-- Fixed bug #48204 (xmlwriter_open_uri() does not emit warnings on invalid
- paths). (Ilia)
-- Fixed bug #48203 (Crash when CURLOPT_STDERR is set to regular file). (Jani)
-- Fixed bug #48202 (Out of Memory error message when passing invalid file
- path) (Pierre)
-- Fixed bug #48156 (Added support for lcov v1.7). (Ilia)
-- Fixed bug #48132 (configure check for curl ssl support fails with
- --disable-rpath). (Jani)
-- Fixed bug #48131 (Don't try to bind ipv4 addresses to ipv6 ips via bindto).
- (Ilia)
-- Fixed bug #48070 (PDO_OCI: Segfault when using persistent connection).
- (Pierre, Matteo, jarismar dot php at gmail dot com)
-- Fixed bug #48058 (Year formatter goes wrong with out-of-int range). (Derick)
-- Fixed bug #48038 (odbc_execute changes variables used to form params array).
- (Felipe)
-- Fixed bug #47997 (stream_copy_to_stream returns 1 on empty streams). (Arnaud)
-- Fixed bug #47991 (SSL streams fail if error stack contains items). (Mikko)
-- Fixed bug #47981 (error handler not called regardless). (Hannes)
-- Fixed bug #47969 (ezmlm_hash() returns different values depend on OS). (Ilia)
-- Fixed bug #47946 (ImageConvolution overwrites background). (Ilia)
-- Fixed bug #47940 (memory leaks in imap_body). (Pierre, Jake Levitt)
-- Fixed bug #47937 (system() calls sapi_flush() regardless of output
- buffering). (Ilia)
-- Fixed bug #47903 ("@" operator does not work with string offsets). (Felipe)
-- Fixed bug #47893 (CLI aborts on non blocking stdout). (Arnaud)
-- Fixed bug #47849 (Non-deep import loses the namespace). (Rob)
-- Fixed bug #47845 (PDO_Firebird omits first row from query). (Lars W)
-- Fixed bug #47836 (array operator [] inconsistency when the array has
- PHP_INT_MAX index value). (Matt)
-- Fixed bug #47831 (Compile warning for strnlen() in main/spprintf.c).
- (Ilia, rainer dot jung at kippdata dot de)
-- Fixed bug #47828 (openssl_x509_parse() segfaults when a UTF-8 conversion
- fails). (Scott, Kees Cook, Pierre)
-- Fixed bug #47818 (Segfault due to bound callback param). (Felipe)
-- Fixed bug #47801 (__call() accessed via parent:: operator is provided
- incorrect method name). (Felipe)
-- Fixed bug #47769 (Strange extends PDO). (Felipe)
-- Fixed bug #47745 (FILTER_VALIDATE_INT doesn't allow minimum integer).
- (Dmitry)
-- Fixed bug #47721 (Alignment issues in mbstring and sysvshm extension).
- (crrodriguez at opensuse dot org, Ilia)
-- Fixed bug #47704 (PHP crashes on some "bad" operations with string
- offsets). (Dmitry)
-- Fixed bug #47695 (build error when xmlrpc and iconv are compiled against
- different iconv versions). (Scott)
-- Fixed bug #47667 (ZipArchive::OVERWRITE seems to have no effect).
- (Mikko, Pierre)
-- Fixed bug #47644 (Valid integers are truncated with json_decode()). (Scott)
-- Fixed bug #47639 (pg_copy_from() WARNING: nonstandard use of \\ in a
- string literal). (Ilia)
-- Fixed bug #47616 (curl keeps crashing). (Felipe)
-- Fixed bug #47598 (FILTER_VALIDATE_EMAIL is locale aware). (Ilia)
-- Fixed bug #47566 (pcntl_wexitstatus() returns signed status).
- (patch by james at jamesreno dot com)
-- Fixed bug #47564 (unpacking unsigned long 32bit bit endian returns wrong
- result). (Ilia)
-- Fixed bug #47487 (performance degraded when reading large chunks after
- fix of bug #44607). (Arnaud)
-- Fixed bug #47468 (enable cli|cgi-only extensions for embed sapi). (Jani)
-- Fixed bug #47435 (FILTER_FLAG_NO_PRIV_RANGE does not work with ipv6
- addresses in the filter extension). (Ilia)
-- Fixed bug #47430 (Errors after writing to nodeValue parameter of an absent
- previousSibling). (Rob)
-- Fixed bug #47365 (ip2long() may allow some invalid values on certain 64bit
- systems). (Ilia)
-- Fixed bug #47254 (Wrong Reflection for extends class). (Felipe)
-- Fixed bug #47042 (cgi sapi is incorrectly removing SCRIPT_FILENAME).
- (Sriram Natarajan, David Soria Parra)
-- Fixed bug #46882 (Serialize / Unserialize misbehaviour under OS with
- different bit numbers). (Matt)
-- Fixed bug #46812 (get_class_vars() does not include visible private variable
- looking at subclass). (Arnaud)
-- Fixed bug #46386 (Digest authentication with SOAP module fails against MSSQL
- SOAP services). (Ilia, lordelph at gmail dot com)
-- Fixed bug #46109 (Memory leak when mysqli::init() is called multiple times).
- (Andrey)
-- Fixed bug #45997 (safe_mode bypass with exec/system/passthru (windows only)).
- (Pierre)
-- Fixed bug #45877 (Array key '2147483647' left as string). (Matt)
-- Fixed bug #45822 (Near infinite-loops while parsing huge relative offsets).
- (Derick, Mike Sullivan)
-- Fixed bug #45799 (imagepng() crashes on empty image).
- (Martin McNickle, Takeshi Abe)
-- Fixed bug #45622 (isset($arrayObject->p) misbehaves with
- ArrayObject::ARRAY_AS_PROPS set). (robin_fernandes at uk dot ibm dot com, Arnaud)
-- Fixed bug #45614 (ArrayIterator::current(), ::key() can show 1st private prop
- of wrapped object). (robin_fernandes at uk dot ibm dot com, Arnaud)
-- Fixed bug #45540 (stream_context_create creates bad http request). (Arnaud)
-- Fixed bug #45202 (zlib.output_compression can not be set with ini_set()).
- (Jani)
-- Fixed bug #45191 (error_log ignores date.timezone php.ini val when setting
- logging timestamps). (Derick)
-- Fixed bug #45092 (header HTTP context option not being used when compiled
- using --with-curlwrappers). (Jani)
-- Fixed bug #44996 (xmlrpc_decode() ignores time zone on iso8601.datetime).
- (Ilia, kawai at apache dot org)
-- Fixed bug #44827 (define() is missing error checks for class constants).
- (Ilia)
-- Fixed bug #44214 (Crash using preg_replace_callback() and global variables).
- (Nuno, Scott)
-- Fixed bug #43073 (TrueType bounding box is wrong for angle<>0).
- (Martin McNickle)
-- Fixed bug #42663 (gzinflate() try to allocate all memory with truncated
- data). (Arnaud)
-- Fixed bug #42414 (some odbc_*() functions incompatible with Oracle ODBC
- driver). (jhml at gmx dot net)
-- Fixed bug #42362 (HTTP status codes 204 and 304 should not be gzipped).
- (Scott, Edward Z. Yang)
-- Fixed bug #42143 (The constant NAN is reported as 0 on Windows)
- (Kanwaljeet Singla, Venkat Raman Don)
-- Fixed bug #38805 (PDO truncates text from SQL Server text data type field).
- (Steph)
-
-26 Feb 2009, PHP 5.2.9
-- Changed __call() to be invoked on private/protected method access, similar to
- properties and __get(). (Andrei)
-
-- Added optional sorting type flag parameter to array_unique(). Default is
- SORT_REGULAR. (Andrei)
-
-- Fixed a crash on extract in zip when files or directories entry names contain
- a relative path. (Pierre)
-- Fixed error conditions handling in stream_filter_append(). (Arnaud)
-- Fixed zip filename property read. (Pierre)
-- Fixed explode() behavior with empty string to respect negative limit. (Shire)
-- Fixed security issue in imagerotate(), background colour isn't validated
- correctly with a non truecolour image. Reported by Hamid Ebadi,
- APA Laboratory (Fixes CVE-2008-5498). (Scott)
-- Fixed a segfault when malformed string is passed to json_decode(). (Scott)
-- Fixed bug in xml_error_string() which resulted in messages being
- off by one. (Scott)
-
-- Fixed bug #47422 (modulus operator returns incorrect results on 64 bit
- linux). (Matt)
-- Fixed bug #47399 (mb_check_encoding() returns true for some illegal SJIS
- characters). (for-bugs at hnw dot jp, Moriyoshi)
-- Fixed bug #47353 (crash when creating a lot of objects in object
- destructor). (Tony)
-- Fixed bug #47322 (sscanf %d doesn't work). (Felipe)
-- Fixed bug #47282 (FILTER_VALIDATE_EMAIL is marking valid email addresses
- as invalid). (Ilia)
-- Fixed bug #47220 (segfault in dom_document_parser in recovery mode). (Rob)
-- Fixed bug #47217 (content-type is not set properly for file uploads). (Ilia)
-- Fixed bug #47174 (base64_decode() interprets pad char in mid string as
- terminator). (Ilia)
-- Fixed bug #47165 (Possible memory corruption when passing return value by
- reference). (Dmitry)
-- Fixed bug #47152 (gzseek/fseek using SEEK_END produces strange results).
- (Felipe)
-- Fixed bug #47131 (SOAP Extension ignores "user_agent" ini setting). (Ilia)
-- Fixed bug #47109 (Memory leak on $a->{"a"."b"} when $a is not an object).
- (Etienne, Dmitry)
-- Fixed bug #47104 (Linking shared extensions fails with icc). (Jani)
-- Fixed bug #47049 (SoapClient::__soapCall causes a segmentation fault).
- (Dmitry)
-- Fixed bug #47048 (Segfault with new pg_meta_data). (Felipe)
-- Fixed bug #47042 (PHP cgi sapi is removing SCRIPT_FILENAME for non
- apache). (Sriram Natarajan)
-- Fixed bug #47037 (No error when using fopen with empty string). (Cristian
- Rodriguez R., Felipe)
-- Fixed bug #47035 (dns_get_record returns a garbage byte at the end of a
- TXT record). (Felipe)
-- Fixed bug #47027 (var_export doesn't show numeric indices on ArrayObject).
- (Derick)
-- Fixed bug #46985 (OVERWRITE and binary mode does not work, regression
- introduced in 5.2.8). (Pierre)
-- Fixed bug #46973 (IPv6 address filter rejects valid address). (Felipe)
-- Fixed bug #46964 (Fixed pdo_mysql build with older version of MySQL). (Ilia)
-- Fixed bug #46959 (Unable to disable PCRE). (Scott)
-- Fixed bug #46918 (imap_rfc822_parse_adrlist host part not filled in
- correctly). (Felipe)
-- Fixed bug #46889 (Memory leak in strtotime()). (Derick)
-- Fixed bug #46887 (Invalid calls to php_error_docref()). (oeriksson at
- mandriva dot com, Ilia)
-- Fixed bug #46873 (extract($foo) crashes if $foo['foo'] exists). (Arnaud)
-- Fixed bug #46843 (CP936 euro symbol is not converted properly). (ty_c at
- cybozuy dot co dot jp, Moriyoshi)
-- Fixed bug #46798 (Crash in mssql extension when retrieving a NULL value
- inside a binary or image column type). (Ilia)
-- Fixed bug #46782 (fastcgi.c parse error). (Matt)
-- Fixed bug #46760 (SoapClient doRequest fails when proxy is used). (Felipe)
-- Fixed bug #46748 (Segfault when an SSL error has more than one error).
- (Scott)
-- Fixed bug #46739 (array returned by curl_getinfo should contain
- content_type key). (Mikko)
-- Fixed bug #46699 (xml_parse crash when parser is namespace aware). (Rob)
-- Fixed bug #46419 (Elements of associative arrays with NULL value are
- lost). (Dmitry)
-- Fixed bug #46282 (Corrupt DBF When Using DATE). (arne at bukkie dot nl)
-- Fixed bug #46026 (bz2.decompress/zlib.inflate filter tries to decompress
- after end of stream). (Greg)
-- Fixed bug #46005 (User not consistently logged under Apache2). (admorten
- at umich dot edu, Stas)
-- Fixed bug #45996 (libxml2 2.7 causes breakage with character data in
- xml_parse()). (Rob)
-- Fixed bug #45940 (MySQLI OO does not populate connect_error property on
- failed connect). (Johannes)
-- Fixed bug #45923 (mb_st[r]ripos() offset not handled correctly). (Moriyoshi)
-- Fixed bug #45327 (memory leak if offsetGet throws exception). (Greg)
-- Fixed bug #45239 (Encoding detector hangs with mbstring.strict_detection
- enabled). (Moriyoshi)
-- Fixed bug #45161 (Reusing a curl handle leaks memory). (Mark Karpeles, Jani)
-- Fixed bug #44336 (Improve pcre UTF-8 string matching performance). (frode
- at coretrek dot com, Nuno)
-- Fixed bug #43841 (mb_strrpos() offset is byte count for negative values).
- (Moriyoshi)
-- Fixed bug #37209 (mssql_execute with non fatal errors). (Kalle)
-- Fixed bug #35975 (Session cookie expires date format isn't the most
- compatible. Now matches that of setcookie()). (Scott)
-
-
-08 Dec 2008, PHP 5.2.8
-- Reverted bug fix #42718 that broke magic_quotes_gpc (Scott)
-
-04 Dec 2008, PHP 5.2.7
-- Upgraded PCRE to version 7.8 (Fixes CVE-2008-2371). (Ilia)
-- Updated timezone database to version 2008.9. (Derick)
-- Upgraded bundled libzip to 0.9.0. (Pierre)
-
-- Added logging option for error_log to send directly to SAPI. (Stas)
-- Added PHP_MAJOR_VERSION, PHP_MINOR_VERSION, PHP_RELEASE_VERSION,
- PHP_EXTRA_VERSION, PHP_VERSION_ID, PHP_ZTS and PHP_DEBUG constants. (Pierre)
-- Added "PHP_INI_SCAN_DIR" environment variable which can be used to
- either disable or change the compile time ini scan directory (FR #45114).
- (Jani)
-
-- Fixed missing initialization of BG(page_uid) and BG(page_gid),
- reported by Maksymilian Arciemowicz. (Stas)
-- Fixed memory leak inside sqlite_create_aggregate(). (Felipe)
-- Fixed memory leak inside PDO sqlite's sqliteCreateAggregate() method.
- (Felipe)
-- Fixed a crash inside gd with invalid fonts (Fixes CVE-2008-3658). (Pierre)
-- Fixed a possible overflow inside memnstr (Fixes CVE-2008-3659).
- (LaurentGaffie)
-- Fixed incorrect php_value order for Apache configuration, reported by
- Maksymilian Arciemowicz. (Stas)
-- Fixed memory leak inside readline_callback_handler_remove() function.
- (Felipe)
-- Fixed sybase_fetch_*() to continue reading after CS_ROW_FAIL status (Timm)
-- Fixed a bug inside dba_replace() that could cause file truncation
- withinvalid keys. (Ilia)
-- Fixed memory leak inside readline_callback_handler_install() function.(Ilia)
-- Fixed memory leak inside readline_completion_function() function. (Felipe)
-- Fixed stream_get_contents() when using $maxlength and socket is notclosed.
- indeyets [at] php [dot] net on #46049. (Arnaud)
-- Fixed stream_get_line() to behave as documented on non-blocking streams.
- (Arnaud)
-- Fixed endless loop in PDOStatement::debugDumpParams().
- (jonah.harris at gmail dot com)
-- Fixed ability to use "internal" heaps in extensions. (Arnaud, Dmitry)
-- Fixed weekdays adding/subtracting algorithm. (Derick)
-- Fixed some ambiguities in the date parser. (Derick)
-- Fixed a bug with the YYYY-MM format not resetting the day correctly.
- (Derick)
-- Fixed a bug in the DateTime->modify() methods, it would not use the advanced
- relative time strings. (Derick)
-- Fixed extraction of zip files or directories when the entry name is a
- relative path. (Pierre)
-- Fixed read or write errors for large zip archives. (Pierre)
-- Fixed security issues detailed in CVE-2008-2665 and CVE-2008-2666.
- (Christian Hoffmann)
-- Fixed simplexml asXML() not to lose encoding when dumping entire
- document to file. (Ilia)
-- Fixed a crash inside PDO when trying instantiate PDORow manually.
- (Felipe)
-- Fixed build failure of ext/mysqli with libmysql 6.0 - missing
- rplfunctions. (Andrey)
-- Fixed a regression when using strip_tags() and < is within an
- attribute.(Scott)
-- Fixed a crash on invalid method in ReflectionParameter constructor.
- (Christian Seiler)
-- Reverted fix for bug #44197 due to behaviour change in minor version.
- (Felipe)
-
-- Fixed bug #46732 (mktime.year description is wrong). (Derick)
-- Fixed bug #46696 (cURL fails in upload files with specified content-type).
- (Ilia)
-- Fixed bug #46673 (stream_lock call with wrong parameter). (Arnaud)
-- Fixed bug #46649 (Setting array element with that same array produces
- inconsistent results). (Arnaud)
-- Fixed bug #46626 (mb_convert_case does not handle apostrophe correctly).
- (Ilia)
-- Fixed bug #46543 (ibase_trans() memory leaks when using wrong parameters).
- (Felipe)
-- Fixed bug #46521 (Curl ZTS OpenSSL, error in config.m4 fragment).
- (jd at cpanel dot net)
-- Fixed bug #46496 (wddx_serialize treats input as ISO-8859-1). (Mark Karpeles)
-- Fixed bug #46427 (SoapClient() stumbles over its "stream_context" parameter).
- (Dmitry, Herman Radtke)
-- Fixed bug #46426 (offset parameter of stream_get_contents() does not
- workfor "0"). (Felipe)
-- Fixed bug #46406 (Unregistering nodeclass throws E_FATAL). (Rob)
-- Fixed bug #46389 (NetWare needs small patch for _timezone).
- (patch by guenter@php.net)
-- Fixed bug #46388 (stream_notification_callback inside of object destroys
- object variables). (Felipe)
-- Fixed bug #46381 (wrong $this passed to internal methods causes segfault).
- (Tony)
-- Fixed bug #46379 (Infinite loop when parsing '#' in one line file). (Arnaud)
-- Fixed bug #46366 (bad cwd with / as pathinfo). (Dmitry)
-- Fixed bug #46360 (TCP_NODELAY constant for socket_{get,set}_option).
- (bugs at trick dot vanstaveren dot us)
-- Fixed bug #46343 (IPv6 address filter accepts invalid address). (Ilia)
-- Fixed bug #46335 (DOMText::splitText doesn't handle multibyte characters).
- (Rob)
-- Fixed bug #46323 (compilation of simplexml for NetWare breaks).
- (Patch by guenter [at] php [dot] net)
-- Fixed bug #46319 (PHP sets default Content-Type header for HTTP 304
- response code, in cgi sapi). (Ilia)
-- Fixed bug #46313 (Magic quotes broke $_FILES). (Arnaud)
-- Fixed bug #46308 (Invalid write when changing property from inside getter).
- (Dmitry)
-- Fixed bug #46292 (PDO::setFetchMode() shouldn't requires the 2nd arg when
- using FETCH_CLASSTYPE). (Felipe)
-- Fixed bug #46274, #46249 (pdo_pgsql always fill in NULL for empty BLOB and
- segfaults when returned by SELECT). (Felipe)
-- Fixed bug #46271 (local_cert option is not resolved to full path). (Ilia)
-- Fixed bug #46247 (ibase_set_event_handler() is allowing to pass callback
- without event). (Felipe)
-- Fixed bug #46246 (difference between call_user_func(array($this, $method))
- and $this->$method()). (Dmitry)
-- Fixed bug #46222 (ArrayObject EG(uninitialized_var_ptr) overwrite).
- (Etienne)
-- Fixed bug #46215 (json_encode mutates its parameter and has some
- class-specific state). (Felipe)
-- Fixed bug #46206 (pg_query_params/pg_execute convert passed values to
- strings). (Ilia)
-- Fixed bug #46191 (BC break: DOMDocument saveXML() doesn't accept null).
- (Rob)
-- Fixed bug #46164 (stream_filter_remove() closes the stream). (Arnaud)
-- Fixed bug #46157 (PDOStatement::fetchObject prototype error). (Felipe)
-- Fixed bug #46147 (after stream seek, appending stream filter reads
- incorrect data). (Greg)
-- Fixed bug #46139 (PDOStatement->setFetchMode() forgets FETCH_PROPS_LATE).
- (chsc at peytz dot dk, Felipe)
-- Fixed bug #46127 (php_openssl_tcp_sockop_accept forgets to set context
- on accepted stream) (Mark Karpeles, Pierre)
-- Fixed bug #46110 (XMLWriter - openmemory() and openuri() leak memory on
- multiple calls). (Ilia)
-- Fixed bug #46088 (RegexIterator::accept - segfault). (Felipe)
-- Fixed bug #46082 (stream_set_blocking() can cause a crash in some
- circumstances). (Felipe)
-- Fixed bug #46064 (Exception when creating ReflectionProperty object
- on dynamicly created property). (Felipe)
-- Fixed bug #46059 (Compile failure under IRIX 6.5.30 building posix.c).
- (Arnaud)
-- Fixed bug #46053 (SplFileObject::seek - Endless loop). (Arnaud)
-- Fixed bug #46051 (SplFileInfo::openFile - memory overlap). (Arnaud)
-- Fixed bug #46047 (SimpleXML converts empty nodes into object with
- nested array). (Rob)
-- Fixed bug #46031 (Segfault in AppendIterator::next). (Arnaud)
-- Fixed bug #46029 (Segfault in DOMText when using with Reflection). (Rob)
-- Fixed bug #46026 (bzip2.decompress/zlib.inflate filter tries to decompress
- after end of stream). (Keisial at gmail dot com, Greg)
-- Fixed bug #46024 (stream_select() doesn't return the correct number).
- (Arnaud)
-- Fixed bug #46010 (warnings incorrectly generated for iv in ecb mode).
- (Felipe)
-- Fixed bug #46003 (isset on nonexisting node return unexpected results). (Rob)
-- Fixed bug #45956 (parse_ini_file() does not return false with syntax errors
- in parsed file). (Jani)
-- Fixed bug #45901 (wddx_serialize_value crash with SimpleXMLElement object).
- (Rob)
-- Fixed bug #45862 (get_class_vars is inconsistent with 'protected' and
- 'private' variables). (ilewis at uk dot ibm dot com, Felipe)
-- Fixed bug #45860 (header() function fails to correctly replace all Status
- lines). (Dmitry)
-- Fixed bug #45805 (Crash on throwing exception from error handler). (Dmitry)
-- Fixed bug #45765 (ReflectionObject with default parameters of self::xxx cause
- an error). (Felipe)
-- Fixed bug #45751 (Using auto_prepend_file crashes (out of scope stack address
- use)). (basant dot kukreja at sun dot com)
-- Fixed bug #45722 (mb_check_encoding() crashes). (Moriyoshi)
-- Fixed bug #45705 (rfc822_parse_adrlist() modifies passed address parameter).
- (Jani)
-- Fixed bug #45691 (Some per-dir or runtime settings may leak into other
- requests). (Moriyoshi)
-- Fixed bug #45581 (htmlspecialchars() double encoding &#x hex items). (Arnaud)
-- Fixed bug #45580 (levenshtein() crashes with invalid argument). (Ilia)
-- Fixed bug #45575 (Segfault with invalid non-string as event handler callback).
- (Christian Seiler)
-- Fixed bug #45568 (ISAPI doesn't properly clear auth_digest in header).
- (Patch by: navara at emclient dot com)
-- Fixed bug #45556 (Return value from callback isn't freed). (Felipe)
-- Fixed bug #45555 (Segfault with invalid non-string as
- register_introspection_callback). (Christian Seiler)
-- Fixed bug #45553 (Using XPath to return values for attributes with a
- namespace does not work). (Rob)
-- Fixed bug #45529 (new DateTimeZone() and date_create()->getTimezone() behave
- different). (Derick)
-- Fixed bug #45522 (FCGI_GET_VALUES request does not return supplied values).
- (Arnaud)
-- Fixed bug #45486 (mb_send_mail(); header 'Content-Type: text/plain; charset='
- parsing incorrect). (Felipe)
-- Fixed bug #45485 (strip_tags and <?XML tag). (Felipe)
-- Fixed bug #45460 (imap patch for fromlength fix in imap_headerinfo doesn't
- accept lengths of 1024). (Felipe, andrew at lifescale dot com)
-- Fixed bug #45449 (filesize() regression using ftp wrapper).
- (crrodriguez at suse dot de)
-- Fixed bug #45423 (fastcgi parent process doesn't invoke php_module_shutdown
- before shutdown) (basant dot kukreja at sun dot com)
-- Fixed bug #45406 (session.serialize_handler declared by shared extension fails).
- (Kalle, oleg dot grenrus at dynamoid dot com)
-- Fixed bug #45405 (snmp extension memory leak).
- (Federico Cuello, Rodrigo Campos)
-- Fixed bug #45382 (timeout bug in stream_socket_enable_crypto). (Ilia)
-- Fixed bug #45373 (php crash on query with errors in params). (Felipe)
-- Fixed bug #45352 (Segmentation fault because of tick function on second
- request). (Dmitry)
-- Fixed bug #45312 (Segmentation fault on second request for array functions).
- (Dmitry)
-- Fixed bug #45303 (Opening php:// wrapper in append mode results in a warning).
- (Arnaud)
-- Fixed bug #45251 (double free or corruption with setAttributeNode()). (Rob)
-- Fixed bug #45226 and #18916 (xmlrpc_set_type() segfaults and wrong behavior
- with valid ISO8601 date string). (Jeff Lawsons)
-- Fixed bug #45220 (curl_read callback returns -1 when needs to return
- size_t (unsigned)). (Felipe)
-- Fixed bug #45181 (chdir() should clear relative entries in stat cache).
- (Arnaud)
-- Fixed bug #45178 (memory corruption on assignment result of "new" by
- reference). (Dmitry)
-- Fixed bug #45166 (substr() overflow changes). (Felipe)
-- Fixed bug #45151 (Crash with URI/file..php (filename contains 2 dots)).
- (Fixes CVE-2008-3660) (Dmitry)
-- Fixed bug #45139 (ReflectionProperty returns incorrect declaring class).
- (Felipe)
-- Fixed bug #45124 ($_FILES['upload']['size'] sometimes return zero and some
- times the filesize). (Arnaud)
-- Fixed bug #45028 (CRC32 output endianness is different between crc32() and
- hash()). (Tony)
-- Fixed bug #45004 (pg_insert() does not accept 4 digit timezone format).
- (Ilia)
-- Fixed bug #44991 (Compile Failure With freetds0.82).
- (jklowden at freetds dot org, matthias at dsx dot at)
-- Fixed bug #44938 (gettext functions crash with overly long domain).
- (Christian Schneider, Ilia)
-- Fixed bug #44925 (preg_grep() modifies input array). (Nuno)
-- Fixed bug #44900 (OpenSSL extension fails to link with OpenSSL 0.9.6).
- (jd at cpanel dot net, Pierre)
-- Fixed bug #44891 Memory leak using registerPHPFunctions and XSLT Variable
- as function parameter. (Rob)
-- Fixed bug #44882 (SOAP extension object decoding bug). (Dmitry)
-- Fixed bug #44830 (Very minor issue with backslash in heredoc). (Matt)
-- Fixed bug #44818 (php://memory writeable when opened read only). (Arnaud)
-- Fixed bug #44811 (Improve error message when creating a new SoapClient
- that contains invalid data). (Markus Fischer, David C)
-- Fixed bug #44798 (Memory leak assigning value to attribute). (Ilia)
-- Fixed bug #44716 (Progress notifications incorrect). (Hannes)
-- Fixed bug #44712 (stream_context_set_params segfaults on invalid arguments).
- (Hannes)
-- Fixed bug #44617 (wrong HTML entity output when substitute_character=entity).
- (Moriyoshi)
-- Fixed bug #44607 (stream_get_line unable to correctly identify the "ending"
- in the stream content). (Arnaud)
-- Fixed bug #44425 (Extending PDO/MySQL class with a __call() function doesn't
- work). (Johannes)
-- Fixed bug #44327 (PDORow::queryString property & numeric offsets / Crash).
- (Felipe)
-- Fixed bug #44251, #41125 (PDO + quote() + prepare() can result in segfault).
- (tsteiner at nerdclub dot net)
-- Fixed bug #44246 (closedir() accepts a file resource opened by fopen()).
- (Dmitry, Tony)
-- Fixed bug #44182 (extract($a, EXTR_REFS) can fail to split copy-on-write
- references). (robin_fernandes at uk dot ibm dot com)
-- Fixed bug #44181 (extract($a, EXTR_OVERWRITE|EXTR_REFS) can fail to create
- references to $a). (robin_fernandes at uk dot ibm dot com)
-- Fixed bug #44127 (UNIX abstract namespace socket connect does not work).
- (Jani)
-- Fixed bug #43993 (mb_substr_count() behaves differently to substr_count()
- with overlapping needles). (Moriyoshi)
-- Fixed Bug #43958 (class name added into the error message). (Dmitry)
-- Fixed bug #43941 (json_encode silently cuts non-UTF8 strings). (Stas)
-- Fixed bug #43925 (Incorrect argument counter in prepared statements with
- pgsql). (Felipe)
-- Fixed bug #43731 (socket_getpeername: cannot use on stdin with inetd).
- (Arnaud)
-- Fixed bug #43723 (SOAP not sent properly from client for <choice>). (Dmitry)
-- Fixed bug #43668 (Added odbc.default_cursortype to control the ODBCcursor
- model). (Patrick)
-- Fixed bug #43666 (Fixed code to use ODBC 3.52 datatypes for 64bit
- systems). (Patrick)
-- Fixed bug #43540 (rfc1867 handler newlength problem). (Arnaud)
-- Fixed bug #43452 (strings containing a weekday, or a number plus weekday
- behaved incorrect of the current day-of-week was the same as the one in the
- phrase). (Derick)
-- Fixed bug #43353 (wrong detection of 'data' wrapper causes notice).
- (gk at gknw dot de, Arnaud)
-- Fixed bug #43053 (Regression: some numbers shown in scientific notation).
- (int-e at gmx dot de)
-- Fixed bug #43045 (SOAP encoding violation on "INF" for type double/float).
- (Dmitry)
-- Fixed bug #42862 (IMAP toolkit crash: rfc822.c legacy routine buffer
- overflow). (Fixes CVE-2008-2829) (Dmitry)
-- Fixed bug #42855 (dns_get_record() doesn't return all text from TXT record).
- (a dot u dot savchuk at gmail dot com)
-- Fixed bug #42737 (preg_split('//u') triggers a E_NOTICE with newlines).
- (Nuno)
-- Fixed bug #42718 (FILTER_UNSAFE_RAW not applied when configured as default
- filter). (Arnaud)
-- Fixed bug #42604 ("make test" fails with --with-config-file-scan-dir=path).
- (Jani)
-- Fixed bug #42473 (ob_start php://output and headers). (Arnaud)
-- Fixed bug #42318 (problem with nm on AIX, not finding object files).
- (Dmitry)
-- Fixed bug #42294 (Unified solution for round() based on C99 round). (Ilia)
-- Fixed bug #42078 (pg_meta_data mix tables metadata from different schemas).
- (Felipe)
-- Fixed bug #41348 (OCI8: allow compilation with Oracle 8.1). (Chris Jones)
-- Fixed bug #41033 (enable signing with DSA keys.
- (gordyf at google dot com, Pierre)
-- Fixed bug #37100 (data is returned truncated with BINARY CURSOR). (Tony)
-- Fixed bug #30312 (crash in sybase_unbuffered_query() function). (Timm)
-- Fixed bug #24679 (pg_* functions doesn't work using schema). (Felipe)
-- Fixed bug #14962 (PECL) (::extractTo 2nd argument is not really optional)
- (Mark van Der Velden)
-- Fixed bug #14032 (Mail() always returns false but mail is sent). (Mikko)
-
-
-01 May 2008, PHP 5.2.6
-- Fixed two possible crashes inside posix extension (Tony)
-- Fixed incorrect heredoc handling when label is used within the block.
- (Matt)
-- Fixed possible stack buffer overflow in FastCGI SAPI. (Andrei Nigmatulin)
-- Fixed sending of uninitialized paddings which may contain some information. (Andrei Nigmatulin)
-- Fixed a bug in formatting timestamps when DST is active in the default timezone (Derick)
-- Properly address incomplete multibyte chars inside escapeshellcmd() (Ilia, Stefan Esser)
-- Fix integer overflow in printf(). (Stas, Maksymilian Aciemowicz)
-- Fixed security issue detailed in CVE-2008-0599. (Rasmus)
-- Fixed potential memleak in stream filter parameter for zlib filter. (Greg)
-- Added Reflection API metadata for the methods of the DOM classes. (Sebastian)
-- Fixed weird behavior in CGI parameter parsing. (Dmitry, Hannes Magnusson)
-- Fixed a safe_mode bypass in cURL identified by Maksymilian Arciemowicz.
- (Ilia)
-- Fixed a bug with PDO::FETCH_COLUMN|PDO::FETCH_GROUP mode when a column # by
- which to group by data is specified. (Ilia)
-- Fixed segfault in filter extension when using callbacks. (Arnar Mar Sig,
- Felipe)
-- Fixed faulty fix for bug #40189 (endless loop in zlib.inflate stream filter). (Greg)
-- Upgraded PCRE to version 7.6 (Nuno)
-
-- Fixed bug #44742 (timezone_offset_get() causes segmentation faults). (Derick)
-- Fixed bug #44720 (Prevent crash within session_register()). (Scott)
-- Fixed bug #44703 (htmlspecialchars() does not detect bad character set argument). (Andy Wharmby)
-- Fixed bug #44673 (With CGI argv/argc starts from arguments, not from script) (Dmitry)
-- Fixed bug #44667 (proc_open() does not handle pipes with the mode 'wb' correctly). (Jani)
-- Fixed bug #44663 (Crash in imap_mail_compose if "body" parameter invalid). (Ilia)
-- Fixed bug #44650 (escaepshellscmd() does not check arg count). (Ilia)
-- Fixed bug #44613 (Crash inside imap_headerinfo()). (Ilia, jmessa)
-- Fixed bug #44603 (Order issues with Content-Type/Length headers on POST). (Ilia)
-- Fixed bug #44594 (imap_open() does not validate # of retries parameter). (Ilia)
-- Fixed bug #44591 (imagegif's filename parameter). (Felipe)
-- Fixed bug #44557 (Crash in imap_setacl when supplied integer as username) (Thomas Jarosch)
-- Fixed bug #44487 (call_user_method_array issues a warning when throwing an exception). (David Soria Parra)
-- Fixed bug #44478 (Inconsistent behaviour when assigning new nodes). (Rob, Felipe)
-- Fixed bug #44445 (email validator does not handle domains starting/ending with a -). (Ilia)
-- Fixed bug #44440 (st_blocks undefined under BeOS). (Felipe)
-- Fixed bug #44394 (Last two bytes missing from output). (Felipe)
-- Fixed bug #44388 (Crash inside exif_read_data() on invalid images) (Ilia)
-- Fixed bug #44373 (PDO_OCI extension compile failed). (Felipe)
-- Fixed bug #44333 (SEGFAULT when using mysql_pconnect() with client_flags). (Felipe)
-- Fixed bug #44306 (Better detection of MIPS processors on Windows). (Ilia)
-- Fixed bug #44242 (metaphone('CMXFXM') crashes PHP). (Felipe)
-- Fixed bug #44233 (MSG_PEEK undefined under BeOS R5). (jonathonfreeman at gmail dot com, Ilia)
-- Fixed bug #44216 (strftime segfaults on large negative value). (Derick)
-- Fixed bug #44209 (strtotime() doesn't support 64 bit timestamps on 64 bit platforms). (Derick)
-- Fixed bug #44206 (OCI8 selecting ref cursors leads to ORA-1000 maximum open cursors reached). (Oracle Corp.)
-- Fixed bug #44200 (A crash in PDO when no bound targets exists and yet bound parameters are present). (Ilia)
-- Fixed bug #44197 (socket array keys lost on socket_select). (Felipe)
-- Fixed bug #44191 (preg_grep messes up array index). (Felipe)
-- Fixed bug #44189 (PDO setAttribute() does not properly validate values for native numeric options). (Ilia)
-- Fixed bug #44184 (Double free of loop-variable on exception). (Dmitry)
-- Fixed bug #44171 (Invalid FETCH_COLUMN index does not raise an error). (Ilia)
-- Fixed bug #44166 (Parameter handling flaw in PDO::getAvailableDrivers()). (Ilia)
-- Fixed bug #44159 (Crash: $pdo->setAttribute(PDO::STATEMENT_ATTR_CLASS, NULL)). (Felipe)
-- Fixed bug #44152 (Possible crash with syslog logging on ZTS builds). (Ilia)
-- Fixed bug #44141 (private parent constructor callable through static function). (Dmitry)
-- Fixed bug #44113 (OCI8 new collection creation can fail with OCI-22303). (Oracle Corp.)
-- Fixed bug #44069 (Huge memory usage with concatenation using . instead of .=). (Dmitry)
-- Fixed bug #44046 (crash inside array_slice() function with an invalid by-ref offset). (Ilia)
-- Fixed bug #44028 (crash inside stream_socket_enable_crypto() when enabling encryption without crypto type). (Ilia)
-- Fixed bug #44018 (RecursiveDirectoryIterator options inconsistancy). (Marcus)
-- Fixed bug #44008 (OCI8 incorrect usage of OCI-Lob->close crashes PHP). (Oracle Corp.)
-- Fixed bug #43998 (Two error messages returned for incorrect encoding for mb_strto[upper|lower]). (Rui)
-- Fixed bug #43994 (mb_ereg 'successfully' matching incorrect). (Rui)
-- Fixed bug #43954 (Memory leak when sending the same HTTP status code multiple times). (Scott)
-- Fixed bug #43927 (koi8r is missing from html_entity_decode()). (andy at demos dot su, Tony)
-- Fixed bug #43912 (Interbase column names are truncated to 31 characters). (Ilia)
-- Fixed bug #43875 (Two error messages returned for $new and $flag argument in mysql_connect()). (Hannes)
-- Fixed bug #43863 (str_word_count() breaks on cyrillic "ya" in locale cp1251). (phprus at gmail dot com, Tony)
-- Fixed bug #43841 (mb_strrpos offset is byte count for negative values). (Rui)
-- Fixed bug #43840 (mb_strpos bounds check is byte count rather than a character count). (Rui)
-- Fixed bug #43808 (date_create never fails (even when it should)). (Derick)
-- Fixed bug #43793 (zlib filter is unable to auto-detect gzip/zlib file headers). (Greg)
-- Fixed bug #43703 (Signature compatibility check broken). (Dmitry)
-- Fixed bug #43677 (Inconsistent behaviour of include_path set with php_value). (manuel at mausz dot at)
-- Fixed bug #43663 (Extending PDO class with a __call() function doesn't work). (David Soria Parra)
-- Fixed bug #43647 (Make FindFile use PATH_SEPARATOR instead of ";"). (Ilia)
-- Fixed bug #43635 (mysql extension ingores INI settings on NULL values passed to mysql_connect()). (Ilia)
-- Fixed bug #43620 (Workaround for a bug inside libcurl 7.16.2 that can result in a crash). (Ilia)
-- Fixed bug #43614 (incorrect processing of numerical string keys of array in arbitrary serialized data). (Dmitriy Buldakov, Felipe)
-- Fixed bug #43606 (define missing depencies of the exif extension). (crrodriguez at suse dot de)
-- Fixed bug #43589 (a possible infinite loop in bz2_filter.c). (Greg)
-- Fixed bug #43580 (removed bogus declaration of a non-existent php_is_url() function). (Ilia)
-- Fixed bug #43559 (array_merge_recursive() doesn't behave as expected with duplicate NULL values). (Felipe, Tony)
-- Fixed bug #43533 (escapeshellarg('') returns null). (Ilia)
-- Fixed bug #43527 (DateTime created from a timestamp reports environment timezone). (Derick)
-- Fixed bug #43522 (stream_get_line() eats additional characters). (Felipe, Ilia, Tony)
-- Fixed bug #43507 (SOAPFault HTTP Status 500 - would like to be able to set the HTTP Status). (Dmitry)
-- Fixed bug #43505 (Assign by reference bug). (Dmitry)
-- Fixed bug #43498 (file_exists() on a proftpd server got SIZE not allowed in ASCII mode). (Ilia, crrodriguez at suse dot de)
-- Fixed bug #43497 (OCI8 XML/getClobVal aka temporary LOBs leak UGA memory). (Chris)
-- Fixed bug #43495 (array_merge_recursive() crashes with recursive arrays). (Ilia)
-- Fixed bug #43493 (pdo_pgsql does not send username on connect when password is not available). (Ilia)
-- Fixed bug #43491 (Under certain conditions, file_exists() never returns). (Dmitry)
-- Fixed bug #43483 (get_class_methods() does not list all visible methods). (Dmitry)
-- Fixed bug #43482 (array_pad() does not warn on very small pad numbers). (Ilia)
-- Fixed bug #43457 (Prepared statement with incorrect parms doesn't throw exception with pdo_pgsql driver). (Ilia)
-- Fixed bug #43450 (Memory leak on some functions with implicit object __toString() call). (David C.)
-- Fixed bug #43386 (array_globals not reset to 0 properly on init). (Ilia)
-- Fixed bug #43377 (PHP crashes with invalid argument for DateTimeZone). (Ilia)
-- Fixed bug #43373 (pcntl_fork() should not raise E_ERROR on error). (Ilia)
-- Fixed bug #43364 (recursive xincludes don't remove internal xml nodes properly). (Rob, patch from ddb@bitxtender.de)
-- Fixed bug #43301 (mb_ereg*_replace() crashes when replacement string is invalid PHP expression and 'e' option is used). (Jani)
-- Fixed bug #43295 (crash because of uninitialized SG(sapi_headers).mimetype). (Dmitry)
-- Fixed bug #43293 (Multiple segfaults in getopt()). (Hannes)
-- Fixed bug #43279 (pg_send_query_params() converts all elements in 'params' to strings). (Ilia)
-- Fixed bug #43276 (Incomplete fix for bug #42739, mkdir() under safe_mode). (Ilia)
-- Fixed bug #43248 (backward compatibility break in realpath()). (Dmitry)
-- Fixed bug #43221 (SimpleXML adding default namespace in addAttribute). (Rob)
-- Fixed bug #43216 (stream_is_local() returns false on "file://"). (Dmitry)
-- Fixed bug #43201 (Crash on using uninitialized vals and __get/__set). (Dmitry)
-- Fixed bug #43182 (file_put_contents() LOCK_EX does not work properly on file truncation). (Ilia)
-- Fixed bug #43175 (__destruct() throwing an exception with __call() causes segfault). (Dmitry)
-- Fixed bug #43128 (Very long class name causes segfault). (Dmitry)
-- Fixed bug #43105 (PHP seems to fail to close open files). (Hannes)
-- Fixed bug #43092 (curl_copy_handle() crashes with > 32 chars long URL). (Jani)
-- Fixed bug #43003 (Invalid timezone reported for DateTime objects constructed using a timestamp). (Derick)
-- Fixed bug #42978 (mismatch between number of bound params and values causes a crash in pdo_pgsql). (Ilia)
-- Fixed bug #42945 (preg_split() swallows part of the string). (Nuno)
-- Fixed bug #42937 (__call() method not invoked when methods are called on parent from child class). (Dmitry)
-- Fixed bug #42841 (REF CURSOR and oci_new_cursor() crash PHP). (Chris)
-- Fixed bug #42838 (Wrong results in array_diff_uassoc) (Felipe)
-- Fixed bug #42779 (Incorrect forcing from HTTP/1.0 request to HTTP/1.1 response). (Ilia)
-- Fixed bug #42736 (xmlrpc_server_call_method() crashes). (Tony)
-- Fixed bug #42692 (Procedure 'int1' not present with doc/lit SoapServer). (Dmitry)
-- Fixed bug #42548 (mysqli PROCEDURE calls can't return result sets). (Hartmut)
-- Fixed bug #42505 (new sendmail default breaks on Netware platform) (Guenter Knauf)
-- Fixed bug #42369 (Implicit conversion to string leaks memory). (David C., Rob).
-- Fixed bug #42272 (var_export() incorrectly escapes char(0)). (Derick)
-- Fixed bug #42261 (Incorrect lengths for date and boolean data types). (Ilia)
-- Fixed bug #42190 (Constructing DateTime with TimeZone Indicator invalidates DateTimeZone). (Derick)
-- Fixed bug #42177 (Warning "array_merge_recursive(): recursion detected" comes again...). (Felipe)
-- Fixed bug #41941 (oci8 extension not lib64 savvy). (Chris)
-- Fixed bug #41828 (Failing to call RecursiveIteratorIterator::__construct() causes a sefault). (Etienne)
-- Fixed bug #41599 (setTime() fails after modify() is used). (Derick)
-- Fixed bug #41562 (SimpleXML memory issue). (Rob)
-- Fixed bug #40013 (php_uname() does not return nodename on Netware (Guenter Knauf)
-- Fixed bug #38468 (Unexpected creation of cycle). (Dmitry)
-- Fixed bug #32979 (OpenSSL stream->fd casts broken in 64-bit build) (stotty at tvnet dot hu)
-
-08 Nov 2007, PHP 5.2.5
-- Upgraded PCRE to version 7.3 (Nuno)
-- Added optional parameter $provide_object to debug_backtrace(). (Sebastian)
-- Added alpha support for imagefilter() IMG_FILTER_COLORIZE. (Pierre)
-- Added ability to control memory consumption between request using
- ZEND_MM_COMPACT environment variable. (Dmitry)
-
-- Improved speed of array_intersect_key(), array_intersect_assoc(),
- array_uintersect_assoc(), array_diff_key(), array_diff_assoc() and
- array_udiff_assoc(). (Dmitry)
-
-- Fixed move_uploaded_file() to always set file permissions of resulting file
- according to UMASK. (Andrew Sitnikov)
-- Fixed possible crash in ext/soap because of uninitialized value. (Zdash Urf)
-- Fixed regression in glob() when enforcing safe_mode/open_basedir checks on
- paths containing '*'. (Ilia)
-- Fixed "mail.force_extra_parameters" php.ini directive not to be modifiable
- in .htaccess due to the security implications - reported by SecurityReason.
- (Stas)
-- Fixed PDO crash when driver returns empty LOB stream. (Stas)
-- Fixed dl() to only accept filenames - reported by Laurent Gaffie. (Stas)
-- Fixed dl() to limit argument size to MAXPATHLEN (CVE-2007-4887).
- (Christian Hoffmann)
-- Fixed iconv_*() functions to limit argument sizes as workaround to libc
- bug (CVE-2007-4783, CVE-2007-4840 by Laurent Gaffie).
- (Christian Hoffmann, Stas)
-- Fixed missing brackets leading to build warning and error in the log.
- Win32 code. (Andrey)
-- Fixed leaks with multiple connects on one mysqli object. (Andrey)
-- Fixed endianness detection on MacOS when building universal binary.
- (Uwe Schindler, Christian Speich, Tony)
-- Fixed possible triggering of buffer overflows inside glibc
- implementations of the fnmatch(), setlocale() and glob() functions.
- Reported by Laurent Gaffie. (Ilia)
-- Fixed imagerectangle regression with 1x1 rectangle (libgd #106). (Pierre)
-- Fixed htmlentities/htmlspecialchars not to accept partial multibyte
- sequences. (Stas)
-
-- Fixed bug #43196 (array_intersect_assoc() crashes with non-array input).
- (Jani)
-- Fixed bug #43139 (PDO ignores ATTR_DEFAULT_FETCH_MODE in some cases with
- fetchAll()). (Ilia)
-- Fixed bug #43137 (rmdir() and rename() do not clear statcache). (Jani)
-- Fixed bug #43130 (Bound parameters cannot have - in their name). (Ilia)
-- Fixed bug #43099 (XMLWriter::endElement() does not check # of params).
- (Ilia)
-- Fixed bug #43020 (Warning message is missing with shuffle() and more
- than one argument). (Scott)
-- Fixed bug #42976 (Crash when constructor for newInstance() or
- newInstanceArgs() fails) (Ilia)
-- Fixed bug #42943 (ext/mssql: Move *timeout initialization from RINIT
- to connect time). (Ilia)
-- Fixed bug #42917 (PDO::FETCH_KEY_PAIR doesn't work with setFetchMode).
- (Ilia)
-- Fixed bug #42890 (Constant "LIST" defined by mysqlclient and c-client).
- (Andrey)
-- Fixed bug #42869 (automatic session id insertion adds sessions id to
- non-local forms). (Ilia)
-- Fixed bug #42818 ($foo = clone(array()); leaks memory). (Dmitry)
-- Fixed bug #42817 (clone() on a non-object does not result in a fatal
- error). (Ilia)
-- Fixed bug #42785 (json_encode() formats doubles according to locale rather
- then following standard syntax). (Ilia)
-- Fixed bug #42783 (pg_insert() does not accept an empty list for
- insertion). (Ilia)
-- Fixed bug #42773 (WSDL error causes HTTP 500 Response). (Dmitry)
-- Fixed bug #42772 (Storing $this in a static var fails while handling a cast
- to string). (Dmitry)
-- Fixed bug #42767 (highlight_string() truncates trailing comment). (Ilia)
-- Fixed bug #42739 (mkdir() doesn't like a trailing slash when safe_mode is
- enabled). (Ilia)
-- Fixed bug #42703 (Exception raised in an iterator::current() causes segfault
- in FilterIterator) (Marcus)
-- Fixed bug #42699 (PHP_SELF duplicates path). (Dmitry)
-- Fixed bug #42654 (RecursiveIteratorIterator modifies only part of leaves)
- (Marcus)
-- Fixed bug #42643 (CLI segfaults if using ATTR_PERSISTENT). (Ilia)
-- Fixed bug #42637 (SoapFault : Only http and https are allowed). (Bill Moran)
-- Fixed bug #42629 (Dynamically loaded PHP extensions need symbols exported
- on MacOSX). (jdolecek at NetBSD dot org)
-- Fixed bug #42627 (bz2 extension fails to build with -fno-common).
- (dolecek at netbsd dot org)
-- Fixed Bug #42596 (session.save_path MODE option does not work). (Ilia)
-- Fixed bug #42590 (Make the engine recognize \v and \f escape sequences).
- (Ilia)
-- Fixed bug #42587 (behavior change regarding symlinked .php files). (Dmitry)
-- Fixed bug #42579 (apache_reset_timeout() does not exist). (Jani)
-- Fixed bug #42549 (ext/mysql failed to compile with libmysql 3.23). (Scott)
-- Fixed bug #42523 (PHP_SELF duplicates path). (Dmitry)
-- Fixed bug #42512 (ip2long('255.255.255.255') should return 4294967295 on
- 64-bit PHP). (Derick)
-- Fixed bug #42506 (php_pgsql_convert() timezone parse bug) (nonunnet at
- gmail dot com, Ilia)
-- Fixed bug #42496 (OCI8 cursor is not closed when using 2 clobs in a select
- query). (Oracle Corp.)
-- Fixed bug #42462 (Segmentation when trying to set an attribute in a
- DOMElement). (Rob)
-- Fixed bug #42453 (CGI SAPI does not shut down cleanly with -i/-m/-v cmdline
- options). (Dmitry)
-- Fixed bug #42452 (PDO classes do not expose Reflection API information).
- (Hannes)
-- Fixed bug #42468 (Write lock on file_get_contents fails when using a
- compression stream). (Ilia)
-- Fixed bug #42488 (SoapServer reports an encoding error and the error itself
- breaks). (Dmitry)
-- Fixed bug #42378 (mysqli_stmt_bind_result memory exhaustion). (Andrey)
-- Fixed bug #42359 (xsd:list type not parsed). (Dmitry)
-- Fixed bug #42326 (SoapServer crash). (Dmitry)
-- Fixed bug #42214 (SoapServer sends clients internal PHP errors). (Dmitry)
-- Fixed bug #42189 (xmlrpc_set_type() crashes php on invalid datetime
- values). (Ilia)
-- Fixed bug #42139 (XMLReader option constants are broken using XML()). (Rob)
-- Fixed bug #42086 (SoapServer return Procedure '' not present for WSIBasic
- compliant wsdl). (Dmitry)
-- Fixed bug #41822 (Relative includes broken when getcwd() fails). (Ab5602,
- Jani)
-- Fixed bug #41561 (Values set with php_admin_* in httpd.conf can be overwritten
- with ini_set()). (Stas, Jani)
-- Fixed bug #39651 (proc_open() append mode doesn't work on windows). (Nuno)
-
-30 Aug 2007, PHP 5.2.4
-- Removed --enable-versioning configure option. (Jani)
-
-- Upgraded PCRE to version 7.2 (Nuno)
-- Updated timezone database to version 2007.6. (Derick)
-
-- Improved openssl_x509_parse() to return extensions in readable form. (Dmitry)
-
-- Enabled changing the size of statement cache for non-persistent OCI8
- connections. (Chris Jones, Tony)
-
-- Changed "display_errors" php.ini option to accept "stderr" as value which
- makes the error messages to be outputted to STDERR instead of STDOUT with
- CGI and CLI SAPIs (FR #22839). (Jani)
-- Changed error handler to send HTTP 500 instead of blank page on PHP errors.
- (Dmitry, Andrei Nigmatulin)
-- Changed mail() function to be always available. (Johannes)
-
-- Added check for unknown options passed to configure. (Jani)
-- Added persistent connection status checker to pdo_pgsql.
- (Elvis Pranskevichus, Ilia)
-- Added support for ATTR_TIMEOUT inside pdo_pgsql driver. (Ilia)
-- Added php_ini_loaded_file() function which returns the path to the actual
- php.ini in use. (Jani)
-- Added GD version constants GD_MAJOR_VERSION, GD_MINOR_VERSION,
- GD_RELEASE_VERSION, GD_EXTRA_VERSION and GD_VERSION_STRING. (Pierre)
-- Added missing open_basedir checks to CGI.
- (anight at eyelinkmedia dot com, Tony)
-- Added missing format validator to unpack() function. (Ilia)
-- Added missing error check inside bcpowmod(). (Ilia)
-- Added CURLOPT_PRIVATE & CURLINFO_PRIVATE constants.
- (Andrey A. Belashkov, Tony)
-- Added missing MSG_EOR and MSG_EOF constants to sockets extension. (Jani)
-- Added PCRE_VERSION constant. (Tony)
-- Added ReflectionExtension::info() function to print the phpinfo()
- block for an extension. (Johannes)
-
-- Implemented FR #41884 (ReflectionClass::getDefaultProperties() does not
- handle static attributes). (Tony)
-
-- Fixed "Floating point exception" inside wordwrap().
- (Mattias Bengtsson, Ilia)
-- Fixed several integer overflows in ImageCreate(), ImageCreateTrueColor(),
- ImageCopyResampled() and ImageFilledPolygon() reported by Mattias Bengtsson.
- (Tony)
-- Fixed size calculation in chunk_split(). (Stas)
-- Fixed integer overflow in str[c]spn(). (Stas)
-- Fixed money_format() not to accept multiple %i or %n tokens.
- (Stas, Ilia)
-- Fixed zend_alter_ini_entry() memory_limit interruption
- vulnerability. (Ilia)
-- Fixed INFILE LOCAL option handling with MySQL extensions not to be
- allowed when open_basedir or safe_mode is active. (Stas)
-- Fixed session.save_path and error_log values to be checked against
- open_basedir and safe_mode (CVE-2007-3378) (Stas, Maksymilian Arciemowicz)
-- Fixed possible invalid read in glob() win32 implementation (CVE-2007-3806).
- (Tony)
-- Improved fix for MOPB-03-2007. (Ilia)
-- Corrected fix for CVE-2007-2872. (Ilia)
-
-- Fixed possible crash in imagepsloadfont(), work around a bug in the pslib on
- Windows. (Pierre)
-- Fixed oci8 and PDO_OCI extensions to allow configuring with Oracle 11g
- client libraries. (Chris Jones)
-- Fixed EOF handling in case of reading from file opened in write only mode.
- (Dmitry)
-- Fixed var_export() to use the new H modifier so that it can generate
- parseable PHP code for floats, independent of the locale. (Derick)
-- Fixed regression introduced by the fix for the libgd bug #74. (Pierre)
-- Fixed SimpleXML's behavior when used with empty(). (Sara)
-- Fixed crash in OpenSSL extension because of non-string passphrase. (Dmitry)
-
-- Fixed PECL Bug #11345 (PDO_OCI crash after National language Support "NLS"
- environment initialization error). (Chris Jones)
-- Fixed PECL bug #11216 (crash in ZipArchive::addEmptyDir when a directory
- already exists). (Pierre)
-
-- Fixed bug #43926 (isInstance() isn't equivalent to instanceof operator). (Marcus)
-- Fixed bug #42368 (Incorrect error message displayed by pg_escape_string).
- (Ilia)
-- Fixed bug #42365 (glob() crashes and/or accepts way too many flags).
- (Jani)
-- Fixed Bug #42364 (Crash when using getRealPath with DirectoryIterator).
- (Johannes)
-- Fixed bug #42292 ($PHP_CONFIG not set for phpized builds). (Jani)
-- Fixed bug #42261 (header wrong for date field).
- (roberto at spadim dot com dot br, Ilia)
-- Fixed bug #42259 (SimpleXMLIterator loses ancestry). (Rob)
-- Fixed bug #42247 (ldap_parse_result() not defined under win32). (Jani)
-- Fixed bug #42243 (copy() does not output an error when the first arg is a
- dir). (Ilia)
-- Fixed bug #42242 (sybase_connect() crashes). (Ilia)
-- Fixed bug #42237 (stream_copy_to_stream returns invalid values for mmaped
- streams). (andrew dot minerd at sellingsource dot com, Ilia)
-- Fixed bug #42233 (Problems with æøå in extract()). (Jani)
-- Fixed bug #42222 (possible buffer overflow in php_openssl_make_REQ). (Pierre)
-- Fixed bug #42211 (property_exists() fails to find protected properties
- from a parent class). (Dmitry)
-- Fixed bug #42208 (substr_replace() crashes when the same array is passed
- more than once). (crrodriguez at suse dot de, Ilia)
-- Fixed bug #42198 (SCRIPT_NAME and PHP_SELF truncated when inside a userdir
- and using PATH_INFO). (Dmitry)
-- Fixed bug #42195 (C++ compiler required always). (Jani)
-- Fixed bug #42183 (classmap causes crash in non-wsdl mode). (Dmitry)
-- Fixed bug #42173 (oci8 INTERVAL and TIMESTAMP type fixes). (Chris)
-- Fixed bug #42151 (__destruct functions not called after catching a SoapFault
- exception). (Dmitry)
-- Fixed bug #42142 (substr_replace() returns FALSE when length > string length).
- (Ilia)
-- Fixed bug #42135 (Second call of session_start() causes creation of SID).
- (Ilia)
-- Fixed bug #42134 (oci_error() returns false after oci_new_collection() fails).
- (Tony)
-- Fixed bug #42119 (array_push($arr,&$obj) doesn't work with
- zend.ze1_compatibility_mode On). (Dmitry)
-- Fixed bug #42117 (bzip2.compress loses data in internal buffer).
- (Philip, Ilia)
-- Fixed bug #42112 (deleting a node produces memory corruption). (Rob)
-- Fixed bug #42107 (sscanf broken when using %2$s format parameters). (Jani)
-- Fixed bug #42090 (json_decode causes segmentation fault). (Hannes)
-- Fixed bug #42082 (NodeList length zero should be empty). (Hannes)
-- Fixed bug #42072 (No warning message for clearstatcache() with arguments).
- (Ilia)
-- Fixed bug #42071 (ini scanner allows using NULL as option name). (Jani)
-- Fixed bug #42027 (is_file() / is_dir() matches file/dirnames with wildcard char
- or trailing slash in Windows). (Dmitry)
-- Fixed bug #42019 (configure option --with-adabas=DIR does not work). (Jani)
-- Fixed bug #42015 (ldap_rename(): server error "DSA is unwilling to perform").
- (bob at mroczka dot com, Jani)
-- Fixed bug #42009 (is_a() and is_subclass_of() should NOT call autoload, in the
- same way as "instanceof" operator). (Dmitry)
-- Fixed bug #41989 (move_uploaded_file() & relative path in ZTS mode). (Tony)
-- Fixed bug #41984 (Hangs on large SoapClient requests). (Dmitry)
-- Fixed bug #41983 (Error Fetching http headers terminated by '\n'). (Dmitry)
-- Fixed bug #41973 (--with-ldap=shared fails with LDFLAGS="-Wl,--as-needed"). (Nuno)
-- Fixed bug #41971 (PDOStatement::fetch and PDOStatement::setFetchMode causes
- unexpected behavior). (Ilia)
-- Fixed bug #41964 (strtotime returns a timestamp for non-time string of
- pattern '(A|a) .+'). (Derick)
-- Fixed bug #41961 (Ensure search for hidden private methods does not stray from
- class hierarchy). (robin_fernandes at uk dot ibm dot com)
-- Fixed bug #41947 (SimpleXML incorrectly registers empty strings asnamespaces).
- (Rob)
-- Fixed bug #41929 (Foreach on object does not iterate over all visible properties).
- (Dmitry)
-- Fixed bug #41919 (crash in string to array conversion).
- (judas dot iscariote at gmail dot com, Ilia)
-- Fixed bug #41909 (var_export() is locale sensitive when exporting float
- values). (Derick)
-- Fixed bug #41908 (CFLAGS="-Os" ./configure --enable-debug fails).
- (christian at hoffie dot info, Tony)
-- Fixed bug #41904 (proc_open(): empty env array should cause empty environment
- to be passed to process). (Jani)
-- Fixed bug #41867 (SimpleXML: getName is broken). (Rob)
-- Fixed bug #41865 (fputcsv(): 2nd parameter is not optional). (Jani)
-- Fixed bug #41861 (SimpleXML: getNamespaces() returns the namespaces of a node's
- siblings). (Rob)
-- Fixed bug #41845 (pgsql extension does not compile with PostgreSQL <7.4). (Ilia)
-- Fixed bug #41844 (Format returns incorrect number of digits for negative years
- -0001 to -0999). (Derick)
-- Fixed bug #41842 (Cannot create years < 0100 & negative years with date_create
- or new DateTime). (Derick)
-- Fixed bug #41833 (addChild() on a non-existent node, no node created,
- getName() segfaults). (Rob)
-- Fixed bug #41831 (pdo_sqlite prepared statements convert resources to
- strings). (Ilia)
-- Fixed bug #41815 (Concurrent read/write fails when EOF is reached). (Sascha)
-- Fixed bug #41813 (segmentation fault when using string offset as an object).
- (judas dot iscariote at gmail dot com, Tony)
-- Fixed bug #41795 (checkdnsrr does not support DNS_TXT type).
- (lucas at facebook dot com, Tony)
-- Fixed bug #41773 (php_strip_whitespace() sends headers with errors
- suppressed). (Tony)
-- Fixed bug #41770 (SSL: fatal protocol error due to buffer issues). (Ilia)
-- Fixed bug #41765 (Recode crashes/does not work on amd64).
- (nexus at smoula dot net, Stas)
-- Fixed bug #41724 (libxml_get_last_error() - errors service request scope).
- (thekid at php dot net, Ilia)
-- Fixed bug #41717 (imagepolygon does not respect thickness). (Pierre)
-- Fixed bug #41713 (Persistent memory consumption on win32 since 5.2). (Dmitry)
-- Fixed bug #41711 (NULL temporary lobs not supported in OCI8).
- (Chris Jones, Tony)
-- Fixed bug #41709 (strtotime() does not handle 00.00.0000). (Derick)
-- Fixed bug #41698 (float parameters truncated to integer in prepared
- statements). (Ilia)
-- Fixed bug #41692 (ArrayObject shows weird behavior in respect to
- inheritance). (Tony)
-- Fixed bug #41691 (ArrayObject::exchangeArray hangs Apache). (Tony)
-- Fixed bug #41686 (Omitting length param in array_slice not possible). (Ilia)
-- Fixed bug #41685 (array_push() fails to warn when next index is
- already occupied). (Ilia)
-- Fixed bug #41655 (open_basedir bypass via glob()). (Ilia)
-- Fixed bug #41640 (get_class_vars produces error on class constants).
- (Johannes)
-- Fixed bug #41635 (SoapServer and zlib.output_compression with FastCGI
- result in major slowdown). (Dmitry)
-- Fixed bug #41633 (Crash instantiating classes with self-referencing
- constants). (Dmitry)
-- Fixed bug #41630 (segfault when an invalid color index is present in the
- image data). (Reported by Elliot <wccoder@gmail dot com>) (Pierre)
-- Fixed bug #41628 (PHP settings leak between Virtual Hosts in Apache 1.3).
- (Scott, manuel at mausz dot at)
-- Fixed bug #41608 (segfault on a weird code with objects and switch()).
- (Tony)
-- Fixed bug #41600 (url rewriter tags doesn't work with namespaced tags).
- (Ilia)
-- Fixed bug #41596 (Fixed a crash inside pdo_pgsql on some non-well-formed
- SQL queries). (Ilia)
-- Fixed bug #41594 (OCI8 statement cache is flushed too frequently). (Tony)
-- Fixed bug #41582 (SimpleXML crashes when accessing newly created element).
- (Tony)
-- Fixed bug #41576 (configure failure when using --without-apxs or some other
- SAPIs disabling options). (Jani)
-- Fixed bug #41567 (json_encode() double conversion is inconsistent with PHP).
- (Lucas, Ilia)
-- Fixed bug #41566 (SOAP Server not properly generating href attributes).
- (Dmitry)
-- Fixed bug #41555 (configure failure: regression caused by fix for #41265).
- (Jani)
-- Fixed bug #41527 (WDDX deserialize numeric string array key).
- (Matt, Ilia)
-- Fixed bug #41523 (strtotime('0000-00-00 00:00:00') is parsed as 1999-11-30).
- (Derick)
-- Fixed bug #41518 (file_exists() warns of open_basedir restriction on
- non-existent file). (Tony)
-- Fixed bug #41445 (parse_ini_file() has a problem with certain types of
- integer as sections). (Tony)
-- Fixed bug #41433 (DBA: configure fails to include correct db.h for db4).
- (Jani)
-- Fixed bug #41372 (Internal pointer of source array resets during array
- copying). (Dmitry)
-- Fixed bug #41350 (my_thread_global_end() error during request shutdown on
- Windows). (Scott, Andrey)
-- Fixed bug #41278 (get_loaded_extensions() should list Zend extensions).
- (Johannes)
-- Fixed bug #41127 (Memory leak in ldap_{first|next}_attribute functions).
- (Jani)
-- Fixed bug #40757 (get_object_vars get nothing in child class). (Dmitry)
-- Fixed bug #40705 (Iterating within function moves original array pointer).
- (Dmitry)
-- Fixed bug #40509 (key() function changed behaviour if global array is used
- within function). (Dmitry)
-- Fixed bug #40419 (Trailing slash in CGI request does not work). (Dmitry)
-- Fixed bug #39330 (apache2handler does not call shutdown actions before
- apache child die). (isk at ecommerce dot com, Gopal, Tony)
-- Fixed bug #39291 (ldap_sasl_bind() misses the sasl_authc_id parameter).
- (diafour at gmail dot com, Jani)
-- Fixed bug #37715 (array pointers resetting on copy). (Dmitry)
-- Fixed bug #37273 (Symlinks and mod_files session handler allow open_basedir
- bypass). (Ilia)
-- Fixed bug #36492 (Userfilters can leak buckets). (Sara)
-- Fixed bugs #36796, #36918, #41371 (stream_set_blocking() does not work).
- (Jani)
-- Fixed bug #35981 (pdo-pgsql should not use pkg-config when not present).
- (Jani)
-- Fixed bug #31892 (PHP_SELF incorrect without cgi.fix_pathinfo, but turning on
- screws up PATH_INFO). (Dmitry)
-- Fixed bug #21197 (socket_read() outputs error with PHP_NORMAL_READ).
- (Nuno, Jani)
-
-31 May 2007, PHP 5.2.3
-- Changed CGI install target to php-cgi and 'make install' to install CLI
- when CGI is selected. (Jani)
-- Changed JSON maximum nesting depth from 20 to 128. (Rasmus)
-
-- Improved compilation of heredocs and interpolated strings. (Matt, Dmitry)
-- Optimized out a couple of per-request syscalls. (Rasmus)
-- Optimized digest generation in md5() and sha1() functions. (Ilia)
-- Upgraded bundled SQLite 3 to version 3.3.17. (Ilia)
-
-- Added "max_input_nesting_level" php.ini option to limit nesting level of
- input variables. Fix for MOPB-03-2007. (Stas)
-- Added a 4th parameter flag to htmlspecialchars() and htmlentities() that
- makes the function not encode existing html entities. (Ilia)
-- Added PDO::FETCH_KEY_PAIR mode that will fetch a 2 column result set into
- an associated array. (Ilia)
-- Added CURLOPT_TIMEOUT_MS and CURLOPT_CONNECTTIMEOUT_MS cURL constants. (Sara)
-- Added --ini switch to CLI that prints out configuration file names. (Marcus)
-- Added mysql_set_charset() to allow runtime altering of connection encoding.
- (Scott)
-
-- Implemented FR #41416 (getColumnMeta() should also return table name). (Tony)
-
-- Fixed an integer overflow inside chunk_split(). Identified by Gerhard Wagner.
- (Ilia)
-- Fixed SOAP extension's handler() to work even when
- "always_populate_raw_post_data" is off. (Ilia)
-- Fixed possible infinite loop in imagecreatefrompng. (libgd #86)
- (by Xavier Roche, CVE-2007-2756). (Pierre)
-- Fixed ext/filter Email Validation Vulnerability (MOPB-45 by Stefan Esser).
- (Ilia)
-- Fixed altering $this via argument named "this". (Dmitry)
-- Fixed PHP CLI usage of php.ini from the binary location. (Hannes)
-- Fixed segfault in strripos(). (Tony, Joxean Koret)
-- Fixed bug #41693 (scandir() allows empty directory names). (Ilia)
-- Fixed bug #41673 (json_encode breaks large numbers in arrays). (Ilia)
-- Fixed bug #41525 (ReflectionParameter::getPosition() not available). (Marcus)
-- Fixed bug #41511 (Compile failure under IRIX 6.5.30 building md5.c). (Jani)
-- Fixed bug #41504 (json_decode() incorrectly decodes JSON arrays with empty
- string keys). (Ilia)
-- Fixed bug #41492 (open_basedir/safe_mode bypass inside realpath()). (Ilia)
-- Fixed bug #41477 (no arginfo about SoapClient::__soapCall()). (Ilia)
-- Fixed bug #41455 (ext/dba/config.m4 pollutes global $LIBS and $LDFLAGS).
- (mmarek at suse dot cz, Tony)
-- Fixed bug #41442 (imagegd2() under output control). (Tony)
-- Fixed bug #41430 (Fatal error with negative values of maxlen parameter of
- file_get_contents()). (Tony)
-- Fixed bug #41423 (PHP assumes wrongly that certain ciphers are enabled in
- OpenSSL). (Pierre)
-- Fixed bug #41421 (Uncaught exception from a stream wrapper segfaults).
- (Tony, Dmitry)
-- Fixed bug #41403 (json_decode cannot decode floats if localeconv
- decimal_point is not '.'). (Tony)
-- Fixed bug #41401 (wrong unary operator precedence). (Stas)
-- Fixed bug #41394 (dbase_create creates file with corrupted header). (Tony)
-- Fixed bug #41390 (Clarify error message with invalid protocol scheme).
- (Scott)
-- Fixed bug #41378 (fastcgi protocol lacks support for Reason-Phrase in
- "Status:" header). (anight at eyelinkmedia dot com, Dmitry)
-- Fixed bug #41374 (whole text concats values of wrong nodes). (Rob)
-- Fixed bug #41358 (configure cannot determine SSL lib with libcurl >= 7.16.2).
- (Mike)
-- Fixed bug #41353 (crash in openssl_pkcs12_read() on invalid input). (Ilia)
-- Fixed bug #41351 (Invalid opcode with foreach ($a[] as $b)). (Dmitry, Tony)
-- Fixed bug #41347 (checkdnsrr() segfaults on empty hostname). (Scott)
-- Fixed bug #41337 (WSDL parsing doesn't ignore non soap bindings). (Dmitry)
-- Fixed bug #41326 (Writing empty tags with Xmlwriter::WriteElement[ns])
- (Pierre)
-- Fixed bug #41321 (downgrade read errors in getimagesize() to E_NOTICE).
- (Ilia)
-- Fixed bug #41304 (compress.zlib temp files left). (Dmitry)
-- Fixed bug #41293 (Fixed creation of HTTP_RAW_POST_DATA when there is no
- default post handler). (Ilia)
-- Fixed bug #41291 (FastCGI does not set SO_REUSEADDR).
- (fmajid at kefta dot com, Dmitry)
-- Fixed gd build when used with freetype 1.x (Pierre, Tony)
-- Fixed bug #41287 (Namespace functions don't allow xmlns definition to be
- optional). (Rob)
-- Fixed bug #41285 (Improved fix for CVE-2007-1887 to work with non-bundled
- sqlite2 lib). (Ilia)
-- Fixed bug #41283 (Bug with deserializing array key that are doubles or
- floats in wddx). (Ilia)
-- Fixed bug #41257 (lookupNamespaceURI does not work as expected). (Rob)
-- Fixed bug #41236 (Regression in timeout handling of non-blocking SSL
- connections during reads and writes). (Ilia)
-- Fixed bug #41134 (zend_ts_hash_clean not thread-safe).
- (marco dot cova at gmail dot com, Tony)
-- Fixed bug #41097 (ext/soap returning associative array as indexed without
- using WSDL). (Dmitry)
-- Fixed bug #41004 (minOccurs="0" and null class member variable). (Dmitry)
-- Fixed bug #39542 (Behavior of require/include different to < 5.2.0).
- (Dmitry)
-
-03 May 2007, PHP 5.2.2
-- Improved bundled GD
- . Sync to 2.0.35
- . Added imagegrabwindow and imagegrabscreen, capture a screen or a
- window using its handle (Pierre)
- . colors allocated henceforth from the resulting image overwrite the palette
- colors (Rob Leslie)
- . Improved thread safety of the gif support (Roman Nemecek, Nuno, Pierre)
- . Use the dimension of the GIF frame to create the destination image (Pierre)
- . Load only once the local color map from a GIF data (Pierre)
- . Improved thread safety of the freetype cache (Scott MacVicar, Nuno, Pierre)
- . imagearc huge CPU usage with large angles, libgd bug #74 (Pierre)
-- Improved FastCGI SAPI to support external pipe and socket servers on win32.
- (Dmitry)
-- Improved Zend Memory Manager
- . guarantee of reasonable time for worst cases of best-fit free block
- searching algorithm. (Dmitry)
- . better cache usage and less fragmentation on erealloc() (Tony, Dmitry)
-- Improved SPL (Marcus)
- . Added SplFileInfo::getBasename(), DirectoryIterator::getBasename().
- . Added SplFileInfo::getLinkTarget(), SplFileInfo::getRealPath().
- . Made RecursiveFilterIterator::accept() abstract as stated in documentation.
-- Improved SOAP
- . Added ability to encode arrays with "SOAP-ENC:Array" type instead of WSDL
- type. To activate the ability use "feature"=>SOAP_USE_XSI_ARRAY_TYPE
- option in SoapClient/SoapServer constructors. (Rob, Dmitry)
-
-- Added GMP_VERSION constant. (Tony)
-- Added --ri switch to CLI which allows to check extension information. (Marcus)
-- Added tidyNode::getParent() method (John, Nuno)
-- Added openbasedir and safemode checks in zip:// stream wrapper and
- ZipArchive::open (Pierre)
-- Added php_pdo_sqlite_external.dll, a version of the PDO SQLite driver that
- links against an external sqlite3.dll. This provides Windows users to upgrade
- their sqlite3 version outside of the PHP release cycle. (Wez, Edin)
-- Added linenumbers to array returned by token_get_all(). (Johannes)
-
-- Upgraded SQLite 3 to version 3.3.16 (Ilia)
-- Upgraded libraries bundled in the Windows distribution. (Edin)
- . c-client (imap) to version 2006e
- . libpq (PostgreSQL) to version 8.2.3
- . libmysql (MySQL) to version 5.0.37
- . openssl to version 0.9.8e
-- Upgraded PCRE to version 7.0 (Nuno)
-
-- Updated timezone database to version 2007.5. (Derick)
-
-- Fixed commandline handling for CLI and CGI. (Marcus, Johannes)
-- Fixed iterator_apply() with a callback using __call(). (Johannes)
-- Fixed possible multi bytes issues in openssl csr parser (Pierre)
-- Fixed shmop_open() with IPC_CREAT|IPC_EXCL flags on Windows.
- (Vladimir Kamaev, Tony).
-- Fixed possible leak in ZipArchive::extractTo when safemode checks fails (Ilia)
-- Fixed possible relative path issues in zip_open and TS mode (old API) (Pierre)
-- Fixed zend_llist_remove_tail (Michael Wallner, Dmitry)
-- Fixed a thread safety issue in gd gif read code (Nuno, Roman Nemecek)
-- Fixed CVE-2007-1001, GD wbmp used with invalid image size (Pierre)
-- Fixed unallocated memory access/double free in in array_user_key_compare()
- (MOPB-24 by Stefan Esser) (Stas)
-- Fixed wrong length calculation in unserialize S type
- (MOPB-29 by Stefan Esser) (Stas)
-
-- Fixed bug #41215 (setAttribute return code reversed). (Ilia)
-- Fixed bug #41192 (Per Directory Values only work for one key). (Dmitry)
-- Fixed bug #41175 (addAttribute() fails to add an attribute with an empty
- value). (Ilia)
-- Fixed bug #41159 (mysql_pconnect() hash does not account for connect
- flags). (Ilia)
-- Fixed bug #41121 (range() overflow handling for large numbers on 32bit
- machines). (Ilia)
-- Fixed bug #41118 (PHP does not handle overflow of octal integers). (Tony)
-- Fixed bug #41109 (recursiveiterator.inc says "implements" Iterator instead of
- "extends"). (Marcus)
-- Fixed bug #40130 (TTF usage doesn't work properly under Netware). (Scott,
- gk at gknw dot de)
-- Fixed bug #41093 (magic_quotes_gpc ignores first arrays keys). (Arpad, Ilia)
-- Fixed bug #41075 (memleak when creating default object caused exception).
- (Dmitry)
-- Fixed bug #41067 (json_encode() problem with UTF-16 input). (jp at df5ea
- dot net. Ilia)
-- Fixed bug #41063 (chdir doesn't like root paths). (Dmitry)
-- Fixed bug #41061 ("visibility error" in ReflectionFunction::export()).
- (Johannes)
-- Fixed bug #41043 (pdo_oci crash when freeing error text with persistent
- connection). (Tony)
-- Fixed bug #41037 (unregister_tick_function() inside the tick function crash PHP).
- (Tony)
-- Fixed bug #41034 (json_encode() ignores null byte started keys in arrays).
- (Ilia)
-- Fixed bug #41026 (segfault when calling "self::method()" in shutdown functions).
- (Tony)
-- Fixed bug #40999 (mcrypt_create_iv() not using random seed). (Ilia)
-- Fixed bug #40998 (long session array keys are truncated). (Tony)
-- Implement feature request #40947, allow a single filter as argument
- for filter_var_array (Pierre)
-- Fixed bug #40935 (pdo_mysql does not raise an exception on empty
- fetchAll()). (Ilia)
-- Fixed bug #40931 (open_basedir bypass via symlink and move_uploaded_file()).
- (Tony)
-- Fixed bug #40921 (php_default_post_reader crashes when post_max_size is
- exceeded). (trickie at gmail dot com, Ilia)
-- Fixed bug #40915 (addcslashes unexpected behavior with binary input). (Tony)
-- Fixed bug #40899 (memory leak when nesting list()). (Dmitry)
-- Fixed bug #40897 (error_log file not locked). (Ilia)
-- Fixed bug #40883 (mysql_query() is allocating memory incorrectly). (Tony)
-- Fixed bug #40872 (inconsistency in offsetSet, offsetExists treatment of
- string enclosed integers). (Marcus)
-- Fixed bug #40861 (strtotime() doesn't handle double negative relative time
- units correctly). (Derick, Ilia)
-- Fixed bug #40854 (imap_mail_compose() creates an invalid terminator for
- multipart e-mails). (Ilia)
-- Fixed bug #40848 (sorting issue on 64-bit Solaris). (Wez)
-- Fixed bug #40836 (Segfault in ext/dom). (Rob)
-- Fixed bug #40833 (Crash when using unset() on an ArrayAccess object retrieved
- via __get()). (Dmitry)
-- Fixed bug #40822 (pdo_mysql does not return rowCount() on select). (Ilia)
-- Fixed bug #40815 (using strings like "class::func" and static methods in
- set_exception_handler() might result in crash). (Tony)
-- Fixed bug #40809 (Poor performance of ".="). (Dmitry)
-- Fixed bug #40805 (Failure executing function ibase_execute()). (Tony)
-- Fixed bug #40800 (cannot disable memory_limit with -1). (Dmitry, Tony)
-- Fixed bug #40794 (ReflectionObject::getValues() may crash when used with
- dynamic properties). (Tony)
-- Fixed bug #40784 (Case sensitivity in constructor's fallback). (Tony)
-- Fixed bug #40770 (Apache child exits when PHP memory limit reached). (Dmitry)
-- Fixed bug #40764 (line thickness not respected for horizontal and vertical
- lines). (Pierre)
-- Fixed bug #40758 (Test fcgi_is_fastcgi() is wrong on windows). (Dmitry)
-- Fixed bug #40754 (added substr() & substr_replace() overflow checks). (Ilia)
-- Fixed bug #40752 (parse_ini_file() segfaults when a scalar setting is
- redeclared as an array). (Tony)
-- Fixed bug #40750 (openssl stream wrapper ignores default_stream_timeout).
- (Tony)
-- Fixed bug #40727 (segfault in PDO when failed to bind parameters). (Tony)
-- Fixed bug #40709 (array_reduce() behaves strange with one item stored arrays).
- (Ilia)
-- Fixed bug #40703 (Resolved a possible namespace conflict between libxmlrpc
- and MySQL's NDB table handler). (Ilia)
-- Fixed bug #40961 (Incorrect results of DateTime equality check). (Mike)
-- Fixed bug #40678 (Cross compilation fails). (Tony)
-- Fixed bug #40621 (Crash when constructor called inappropriately). (Tony)
-- Fixed bug #40609 (Segfaults when using more than one SoapVar in a request).
- (Rob, Dmitry)
-- Fixed bug #40606 (umask is not being restored when request is finished).
- (Tony)
-- Fixed bug #40598 (libxml segfault). (Rob)
-- Fixed bug #40591 (list()="string"; gives invalid opcode). (Dmitry)
-- Fixed bug #40578 (imagettftext() multithreading issue). (Tony, Pierre)
-- Fixed bug #40576 (double values are truncated to 6 decimal digits when
- encoding). (Tony)
-- Fixed bug #40560 (DIR functions do not work on root UNC path). (Dmitry)
-- Fixed bug #40548 (SplFileInfo::getOwner/getGroup give a warning on broken
- symlink). (Marcus)
-- Fixed bug #40546 (SplFileInfo::getPathInfo() throws an exception if directory
- is in root dir). (Marcus)
-- Fixed bug #40545 (multithreading issue in zend_strtod()). (Tony)
-- Fixed bug #40503 (json_encode() value corruption on 32bit systems with
- overflown values). (Ilia)
-- Fixed bug #40467 (Partial SOAP request sent when XSD sequence or choice
- include minOccurs=0). (Dmitry)
-- Fixed bug #40465 (Ensure that all PHP elements are printed by var_dump).
- (wharmby at uk dot ibm dot com, Ilia)
-- Fixed bug #40464 (session.save_path wont use default-value when safe_mode
- or open_basedir is enabled). (Ilia)
-- Fixed bug #40455 (proc_open() uses wrong command line when safe_mode_exec_dir
- is set). (Tony)
-- Fixed bug #40432 (strip_tags() fails with greater than in attribute). (Ilia)
-- Fixed bug #40431 (dynamic properties may cause crash in ReflectionProperty
- methods). (Tony)
-- Fixed bug #40451 (addAttribute() may crash when used with non-existent child
- node). (Tony)
-- Fixed bug #40442 (ArrayObject::offsetExists broke in 5.2.1, works in 5.2.0).
- (olivier at elma dot fr, Marcus)
-- Fixed bug #40428 (imagepstext() doesn't accept optional parameter). (Pierre)
-- Fixed bug #40417 (Allow multiple instances of the same named PDO token in
- prepared statement emulation code). (Ilia)
-- Fixed bug #40414 (possible endless fork() loop when running fastcgi).
- (Dmitry)
-- Fixed bug #40410 (ext/posix does not compile on MacOS 10.3.9). (Tony)
-- Fixed bug #40392 (memory leaks in PHP milter SAPI).
- (tuxracer69 at gmail dot com, Tony)
-- Fixed bug #40371 (pg_client_encoding() not working on Windows). (Edin)
-- Fixed bug #40352 (FCGI_WEB_SERVER_ADDRS function get lost). (Dmitry)
-- Fixed bug #40290 (strtotime() returns unexpected result with particular
- timezone offset). (Derick)
-- Fixed bug #40286 (PHP fastcgi with PHP_FCGI_CHILDREN don't kill children when
- parent is killed). (Dmitry)
-- Fixed bug #40261 (Extremely slow data handling due to memory fragmentation).
- (Dmitry)
-- Fixed bug #40236 (php -a function allocation eats memory). (Dmitry)
-- Fixed bug #40109 (iptcembed fails on non-jfif jpegs). (Tony)
-- Fixed bug #39965 (Latitude and longitude are backwards in date_sun_info()).
- (Derick)
-- Implement #39867 (openssl PKCS#12 support) (Marc Delling, Pierre)
-- Fixed bug #39836 (SplObjectStorage empty after unserialize). (Marcus)
-- Fixed bug #39416 (Milliseconds in date()). (Derick)
-- Fixed bug #39396 (stream_set_blocking crashes on Win32). (Ilia, maurice at
- iceblog dot de)
-- Fixed bug #39351 (relative include fails on Solaris). (Dmitry, Tony)
-- Fixed bug #39322 (proc_terminate() destroys process resource). (Nuno)
-- Fixed bug #38406 (crash when assigning objects to SimpleXML attributes). (Tony)
-- Fixed bug #37799 (ftp_ssl_connect() falls back to non-ssl connection). (Nuno)
-- Fixed bug #36496 (SSL support in imap_open() not working on Windows). (Edin)
-- Fixed bug #36226 (Inconsistent handling when passing nillable arrays).
- (Dmitry)
-- Fixed bug #35872 (Avoid crash caused by object store being referenced during
- RSHUTDOWN). (Andy)
-- Fixed bug #34794 (proc_close() hangs when used with two processes).
- (jdolecek at netbsd dot org, Nuno)
-- Fixed PECL bug #10194 (crash in Oracle client when memory limit reached in
- the callback). (Tony)
-- Fixed substr_compare and substr_count information leak (MOPB-14) (Stas, Ilia)
-- Fixed crash on op-assign where argument is string offset (Brian, Stas)
-- Fixed bug #38710 (data leakage because of nonexisting boundary checking in
- statements in mysqli) (Stas)
-- Fixed bug #37386 (autocreating element doesn't assign value to first node).
- (Rob)
-- Fixed bug #37013 (server hangs when returning circular object references).
- (Dmitry)
-- Fixed bug #33664 Console window appears when using exec()
- (Richard Quadling, Stas)
-
-
-08 Feb 2007, PHP 5.2.1
-- Added read-timeout context option "timeout" for HTTP streams. (Hannes, Ilia).
-- Added CURLOPT_TCP_NODELAY constant to Curl extension. (Sara)
-- Added support for hex numbers of any size. (Matt)
-- Added function stream_socket_shutdown(). It is a wrapper for system
- shutdown() function, that shut downs part of a full-duplex connection.
- (Dmitry)
-- Added internal heap protection (Dmitry)
- . memory-limit is always enabled (--enable-memory-limit removed)
- . default value if memory-limit is set to 128M
- . safe unlinking
- . cookies
- . canary protection (debug build only)
- . random generation of cookies and canaries
-- Added forward support for 'b' prefix in front of string literals. (Andrei)
-- Added three new functions to ext/xmlwriter (Rob, Ilia)
- . xmlwriter_start_dtd_entity()
- . xmlwriter_end_dtd_entity()
- . xmlwriter_write_dtd_entity()
-- Added a meta tag to phpinfo() output to prevent search engines from indexing
- the page. (Ilia)
-- Added new function, sys_get_temp_dir(). (Hartmut)
-- Added missing object support to file_put_contents(). (Ilia)
-- Added support for md2, ripemd256 and ripemd320 algos to hash(). (Sara)
-- Added forward support for (binary) cast. (Derick)
-- Added optimization for imageline with horizontal and vertical lines (Pierre)
-
-- Removed dependency from SHELL32.DLL. (Dmitry)
-- Removed double "wrong parameter count" warnings in various functions.
- (Hannes)
-- Moved extensions to PECL:
- . ext/informix (Derick, Tony)
-
-- Changed double-to-string utilities to use BSD implementation. (Dmitry, Tony)
-- Updated bundled libcURL to version 7.16.0 in the Windows distro. (Edin)
-- Updated timezone database to version 2006.16. (Derick)
-- cgi.* and fastcgi.* directives are moved to INI subsystem. The new directive
- cgi.check_shebang_line can be used to omitting check for "#! /usr/bin/php"
- line. (Dmitry).
-- Improved proc_open(). Now on Windows it can run external commands not
- through CMD.EXE. (Dmitry)
-- VCWD_REALPATH() is improved to use realpath cache without VIRTUAL_DIR.
- (Dmitry)
-- ext/bcmath initialization code is moved from request startup to module
- startup. (Dmitry)
-- Zend Memory Manager Improvements (Dmitry)
- . use HeapAlloc() instead of VirtualAlloc()
- . use "win32" storage manager (instead of "malloc") on Windows by default
-- Zip Extension Improvements (Pierre)
- . Fixed leak in statName and stateIndex
- . Fixed return setComment (Hannes)
- . Added addEmptyDir method
-- Filter Extension Improvements (Ilia, Pierre)
- . Fixed a bug when callback function returns a non-modified value.
- . Added filter support for $_SERVER in cgi/apache2 sapis.
- . Make sure PHP_SELF is filtered in Apache 1 sapi.
- . Fixed bug #39358 (INSTALL_HEADERS contains incorrect reference to
- php_filter.h).
- . Added "default" option that allows a default value to be set for an
- invalid or missing value.
- . Invalid filters fails instead of returning unsafe value
- . Fixed possible double encoding problem with sanitizing filters
- . Make use of space-strict strip_tags() function
- . Fixed whitespace trimming
- . Added support for FastCGI environment variables. (Dmitry)
-- PDO_MySQL Extension Improvements (Ilia)
- . Enabled buffered queries by default.
- . Enabled prepared statement emulation by default.
-
-- Small optimization of the date() function. (Matt,Ilia)
-- Optimized the internal is_numeric_string() function. (Matt,Ilia)
-- Optimized array functions utilizing php_splice(). (Ilia)
-- Windows related optimizations (Dmitry, Stas)
- . COM initialization/deinitialization are done only if necessary
- . removed unnecessary checks for ISREG file and corresponding stat() calls
- . opendir() is reimplementation using GetFistFile/GetNextFile those are
- faster then _findfirst/_findnext
- . implemented registry cache that prevent registry lookup on each request.
- In case of modification of corresponding registry-tree PHP will reload it
- automatic
- . start timeout thread only if necessary
- . stat() is reimplementation using GetFileAttributesEx(). The new
- implementation is faster then implementation in MS VC CRT, but it doesn't
- support Windows 95.
-- Streams optimization (Dmitry)
- . removed unnecessary ftell() calls (one call for each included PHP file)
- . disabled calls to read() after EOF
-
-- Fixed incorrect function names on FreeBSD where inet_pton() was named
- __inet_pton() and inet_ntop() was named __inet_ntop(). (Hannes)
-- Fixed FastCGI impersonation for persistent connections on Windows. (Dmitry)
-- Fixed wrong signature initialization in imagepng (Takeshi Abe)
-- Fixed ftruncate() with negative size on FreeBSD. (Hannes)
-- Fixed segfault in RegexIterator when given invalid regex. (Hannes)
-- Fixed segfault in SplFileObject->openFile()->getPathname(). (Hannes)
-- Fixed segfault in ZTS mode when OCI8 statements containing sub-statements
- are destroyed in wrong order. (Tony)
-- Fixed the validate email filter so that the letter "v" can also be used in
- the user part of the email address. (Derick)
-- Fixed bug #40297 (compile failure in ZTS mode when collections support is
- missing). (Tony)
-- Fixed bug #40285 (The PDO prepare parser goes into an infinite loop in
- some instances). (Ilia)
-- Fixed bug #40274 (Sessions fail with numeric root keys). (Ilia)
-- Fixed bug #40259 (ob_start call many times - memory error). (Dmitry)
-- Fixed bug #40231 (file_exists incorrectly reports false). (Dmitry)
-- Fixed bug #40228 (ZipArchive::extractTo does create empty directories
- recursively). (Pierre)
-- Fixed bug #40200 (The FastCgi version has different realpath results than
- thread safe version). (Dmitry)
-- Fixed bug #40191 (use of array_unique() with objects triggers segfault).
- (Tony)
-- Fixed bug #40189 (possible endless loop in zlib.inflate stream filter).
- (Greg, Tony)
-- Fixed bug #40169 (CURLOPT_TCP_NODELAY only available in curl >= 7.11.2).
- (Tony)
-- Fixed bug #40129 (iconv extension doesn't compile with CodeWarrior on
- Netware). (gk at gknw dot de, Tony)
-- Fixed bug #40127 (apache2handler doesn't compile on Netware).
- (gk at gknw dot de)
-- Fixed bug #40121 (PDO_DBLIB driver wont free statements). (Ilia)
-- Fixed bug #40098 (php_fopen_primary_script() not thread safe). (Ilia)
-- Fixed bug #40092 (chroot() doesn't clear realpath cache). (Dmitry)
-- Fixed bug #40091 (spl_autoload_register with 2 instances of the same class).
- (Ilia)
-- Fixed bug #40083 (milter SAPI functions always return false/null). (Tony)
-- Fixed bug #40079 (php_get_current_user() not thread safe).
- (Ilia, wharmby at uk dot ibm dot com)
-- Fixed bug #40078 (ORA-01405 when fetching NULL values using
- oci_bind_array_by_name()). (Tony)
-- Fixed bug #40076 (zend_alloc.c: Value of enumeration constant must be in
- range of signed integer). (Dmitry)
-- Fixed bug #40073 (exif_read_data dies on certain images). (Tony, Marcus)
-- Fixed bug #40036 (empty() does not work correctly with ArrayObject when
- using ARRAY_AS_PROPS). (Ilia)
-- Fixed bug #40012 (php_date.c doesn't compile on Netware).
- (gk at gknw dot de, Derick)
-- Fixed bug #40009 (http_build_query(array()) returns NULL). (Ilia)
-- Fixed bug #40002 (Try/Catch performs poorly). (Dmitry)
-- Fixed bug #39993 (tr_TR.UTF-8 locale has problems with PHP). (Ilia)
-- Fixed bug #39990 (Cannot "foreach" over overloaded properties). (Dmitry)
-- Fixed bug #39988 (type argument of oci_define_by_name() is ignored).
- (Chris Jones, Tony)
-- Fixed bug #39984 (redirect response code in header() could be ignored
- in CGI sapi). (Ilia)
-- Fixed bug #39979 (PGSQL_CONNECT_FORCE_NEW will causes next connect to
- establish a new connection). (Ilia)
-- Fixed bug #39971 (pg_insert/pg_update do not allow now() to be used
- for timestamp fields). (Ilia)
-- Fixed bug #39969 (ini setting short_open_tag has no effect when using
- --enable-maintainer-zts). (Dmitry)
-- Fixed bug #39952 (zip ignoring --with-libdir on zlib checks)
- (judas dot iscariote at gmail dot com)
-- Fixed bug #39944 (References broken). (Dmitry)
-- Fixed bug #39935 (Extensions tidy,mcrypt,mhash,pdo_sqlite ignores
- --with-libdir). (judas dot iscariote at gmail dot com, Derick)
-- Fixed bug #39903 (Notice message when executing __halt_compiler() more than
- once). (Tony)
-- Fixed bug #39898 (FILTER_VALIDATE_URL validates \r\n\t etc). (Ilia)
-- Fixed bug #39890 (using autoconf 2.6x and --with-layout=GNU breaks PEAR
- install path). (Tony)
-- Fixed bug #39884 (ReflectionParameter::getClass() throws exception for
- type hint self). (thekid at php dot net)
-- Fixed bug #39878 (CURL doesn't compile on Sun Studio Pro). (Ilia)
-- Fixed bug #39873 (number_format() breaks with locale & decimal points).
- (Ilia)
-- Fixed bug #39869 (safe_read does not initialize errno).
- (michiel at boland dot org, Dmitry)
-- Fixed bug #39850 (SplFileObject throws contradictory/wrong error messages
- when trying to open "php://wrong"). (Tony)
-- Fixed bug #39846 (Invalid IPv4 treated as valid). (Ilia)
-- Fixed bug #39845 (Persistent connections generate a warning in pdo_pgsql).
- (Ilia)
-- Fixed bug #39832 (SOAP Server: parameter not matching the WSDL specified
- type are set to 0). (Dmitry)
-- Fixed bug #39825 (foreach produces memory error). (Dmitry)
-- Fixed bug #39816 (apxs2filter ignores httpd.conf & .htaccess php config
- settings). (Ilia)
-- Fixed bug #39815 (SOAP double encoding is not locale-independent). (Dmitry)
-- Fixed bug #39797 (virtual() does not reset changed INI settings). (Ilia)
-- Fixed bug #39795 (build fails on AIX because crypt_r() uses different
- data struct). (Tony)
-- Fixed bug #39791 (Crash in strtotime() on overly long relative date
- multipliers). (Ilia)
-- Fixed bug #39787 (PHP doesn't work with Apache 2.3).
- (mv at binarysec dot com).
-- Fixed bug #39782 (setTime() on a DateTime constructed with a Weekday
- yields incorrect results). (Ilia)
-- Fixed bug #39780 (PNG image with CRC/data error raises fatal error) (Pierre)
-- Fixed bug #39779 (Enable AUTH PLAIN mechanism in underlying libc-client).
- (michael dot heimpold at s2000 dot tu-chemnitz dot de, Ilia)
-- Fixed bug #39775 ("Indirect modification ..." message is not shown).
- (Dmitry)
-- Fixed bug #39763 (magic quotes are applied twice by ext/filter in
- parse_str()). (Ilia)
-- Fixed bug #39760 (cloning fails on nested SimpleXML-Object). (Rob)
-- Fixed bug #39759 (Can't use stored procedures fetching multiple result
- sets in pdo_mysql). (Ilia)
-- Fixed bug #39754 (Some POSIX extension functions not thread safe).
- (Ilia, wharmby at uk dot ibm dot com)
-- Fixed bug #39751 (putenv crash on Windows). (KevinJohnHoffman at gmail.com)
-- Fixed bug #39732 (oci_bind_array_by_name doesn't work on Solaris 64bit).
- (Tony)
-- Fixed bug #39724 (Broken build due to spl/filter usage of pcre extension).
- (Tony, Ilia)
-- Fixed bug #39718 (possible crash if assert.callback is set in ini). (Ilia)
-- Fixed bug #39702 (php crashes in the allocator on linux-m68k). (Dmitry)
-- Fixed bug #39685 (iconv() - undefined function). (Hannes)
-- Fixed bug #39673 (file_get_contents causes bus error on certain offsets).
- (Tony)
-- Fixed bug #39663 (Memory leak in pg_get_notify() and a possible memory
- corruption on Windows in pgsql and pdo_pgsql extensions).
- (Ilia, matteo at beccati dot com)
-- Fixed bug #39662 (Segfault when calling asXML() of a cloned
- SimpleXMLElement). (Rob, Tony)
-- Fixed bug #39656 (crash when calling fetch() on a PDO statment object after
- closeCursor()). (Ilia, Tony)
-- Fixed bug #39653 (ext/dba doesn't check for db-4.5 and db-4.4 when db4
- support is enabled). (Tony)
-- Fixed bug #39652 (Wrong negative results from memory_get_usage()). (Dmitry)
-- Fixed bug #39648 (Implementation of PHP functions chown() and chgrp() are
- not thread safe). (Ilia, wharmby at uk dot ibm dot com)
-- Fixed bug #39640 (Segfault with "Allowed memory size exhausted"). (Dmitry)
-- Fixed bug #39625 (Apache crashes on importStylesheet call). (Rob)
-- Fixed bug #39623 (thread safety fixes on *nix for putenv() & mime_magic).
- (Ilia, wharmby at uk dot ibm dot com)
-- Fixed bug #39621 (str_replace() is not binary safe on strings with equal
- length). (Tony)
-- Fixed bug #39613 (Possible segfault in imap initialization due to missing
- module dependency). (wharmby at uk dot ibm dot com, Tony)
-- Fixed bug #39606 (Use of com.typelib_file in PHP.ini STILL causes A/V). (Rob)
-- Fixed bug #39602 (Invalid session.save_handler crashes PHP). (Dmitry)
-- Fixed bug #39596 (Creating Variant of type VT_ARRAY). (Rob)
-- Fixed bug #39583 (ftp_put() does not change transfer mode to ASCII). (Tony)
-- Fixed bug #39576 (array_walk() doesn't separate user data zval). (Tony)
-- Fixed bug #39575 (move_uploaded_file() no longer working (safe mode
- related)). (Tony)
-- Fixed bug #39571 (timeout ssl:// connections). (Ilia)
-- Fixed bug #39564 (PDO::errorInfo() returns inconsistent information when
- sqlite3_step() fails). (Tony)
-- Fixed bug #39548 (ZMSG_LOG_SCRIPT_NAME not routed to OutputDebugString()
- on Windows). (Dmitry)
-- Fixed bug #39538 (fgetcsv can't handle starting newlines and trailing odd
- number of backslashes). (David Soria Parra, Pierre)
-- Fixed bug #39534 (Error in maths to calculate of
- ZEND_MM_ALIGNED_MIN_HEADER_SIZE). (wharmby at uk dot ibm dot com, Dmitry)
-- Fixed bug #39527 (Failure to retrieve results when multiple unbuffered,
- prepared statements are used in pdo_mysql). (Ilia)
-- Fixed bug #39508 (imagefill crashes with small images 3 pixels or less).
- (Pierre)
-- Fixed bug #39506 (Archive corrupt with ZipArchive::addFile method). (Pierre)
-- Fixed bug #39504 (xmlwriter_write_dtd_entity() creates Attlist tag, not
- entity). (Hannes)
-- Fixed bug #39483 (Problem with handling of \ char in prepared statements).
- (Ilia, suhachov at gmail dot com)
-- Fixed bug #39458 (ftp_nlist() returns false on empty dirs). (Nuno)
-- Fixed bug #39454 (Returning a SOAP array segfaults PHP). (Dmitry)
-- Fixed bug #39450 (getenv() fills other super-globals). (Ilia, Tony)
-- Fixed bug #39449 (Overloaded array properties do not work correctly).
- (Dmitry)
-- Fixed bug #39445 (Calling debug_backtrace() in the __toString()
- function produces a crash). (Dmitry)
-- Fixed bug #39438 (Fatal error: Out of memory). (Dmitry)
-- Fixed bug #39435 ('foo' instanceof bar gives invalid opcode error). (Sara)
-- Fixed bug #39414 (Syntax error while compiling with Sun Workshop Complier).
- (Johannes)
-- Fixed bug #39398 (Booleans are not automatically translated to integers).
- (Ilia)
-- Fixed bug #39394 (Missing check for older variants of openssl). (Ilia)
-- Fixed bug #39367 (clearstatcache() doesn't clear realpath cache).
- (j at pureftpd dot org, Dmitry)
-- Fixed bug #39366 (imagerotate does not use alpha with angle > 45 degrees)
- (Pierre)
-- Fixed bug #39364 (Removed warning on empty haystack inside mb_strstr()).
- (Ilia)
-- Fixed bug #39362 (Added an option to imap_open/imap_reopen to control the
- number of connection retries). (Ilia)
-- Fixed bugs #39361 & #39400 (mbstring function overloading problem). (Seiji)
-- Fixed bug #39354 (Allow building of curl extension against libcurl
- 7.16.0). (Ilia)
-- Fixed bug #39350 (crash with implode("\n", array(false))). (Ilia)
-- Fixed bug #39344 (Unnecessary calls to OnModify callback routine for
- an extension INI directive). (wharmby at uk dot ibm dot com, Dmitry)
-- Fixed bug #39320 (ZEND_HASH_APPLY_STOP causes deletion). (Marcus)
-- Fixed bug #39313 (spl_autoload triggers Fatal error). (Marcus)
-- Fixed bug #39300 (make install fails if wget is not available). (Tony)
-- Fixed bug #39297 (Memory corruption because of indirect modification of
- overloaded array). (Dmitry)
-- Fixed bug #39286 (misleading error message when invalid dimensions are
- given) (Pierre)
-- Fixed bug #39273 (imagecopyresized may ignore alpha channel) (Pierre)
-- Fixed bug #39265 (Fixed path handling inside mod_files.sh).
- (michal dot taborsky at gmail dot com, Ilia)
-- Fixed bug #39217 (serialNumber might be -1 when the value is too large).
- (Pierre, Tony)
-- Fixed bug #39215 (Inappropriate close of stdin/stdout/stderr). (Wez, Ilia)
-- Fixed bug #39201 (Possible crash in Apache 2 with 413 ErrorHandler). (Ilia)
-- Fixed bug #39151 (Parse error in recursiveiteratoriterator.php). (Marcus)
-- Fixed bug #39121 (Incorrect return array handling in non-wsdl soap client).
- (Dmitry)
-- Fixed bug #39090 (DirectoryFilterDots doxygen docs and example is wrong).
- (Marcus)
-- Fixed bug #38852 (XML-RPC Breaks iconv). (Hannes)
-- Fixed bug #38770 (unpack() broken with longs on 64 bit machines).
- (Ilia, David Soria Parra).
-- Fixed bug #38698 (for some keys cdbmake creates corrupted db and cdb can't
- read valid db). (Marcus)
-- Fixed bug #38680 (Added missing handling of basic types in json_decode).
- (Ilia)
-- Fixed bug #38604 (Fixed request time leak inside foreach() when iterating
- through virtual properties). (Dmitry)
-- Fixed bug #38602 (header( "HTTP/1.0 ..." ) does not change proto version).
- (Ilia)
-- Fixed bug #38542 (proc_get_status() returns wrong PID on windows). (Nuno)
-- Fixed bug #38536 (SOAP returns an array of values instead of an object).
- (Dmitry)
-- Fixed bug #38456 (Apache2 segfaults when virtual() is called in .php
- ErrorDocument). (Ilia)
-- Fixed bug #38325 (spl_autoload_register() gives wrong line for "class not
- found"). (Ilia)
-- Fixed bug #38319 (Remove bogus warnings from persistent PDO connections).
- (Ilia)
-- Fixed bug #38274 (Memlimit fatal error sent to "wrong" stderr when using
- fastcgi). (Dmitry)
-- Fixed bug #38252 (Incorrect PDO error message on invalid default fetch
- mode). (Ilia)
-- Fixed bug #37927 (Prevent trap when COM extension processes argument of
- type VT_DISPATCH|VT_REF) (Andy)
-- Fixed bug #37773 (iconv_substr() gives "Unknown error" when string
- length = 1"). (Ilia)
-- Fixed bug #37627 (session save_path check checks the parent directory).
- (Ilia)
-- Fixed bug #37619 (proc_open() closes stdin on fork() failure).
- (jdolecek at NetBSD dot org, Nuno)
-- Fixed bug #37588 (COM Property propputref converts to PHP function
- and can't be accesed). (Rob)
-- Fixed bug #36975 (natcasesort() causes array_pop() to misbehave).
- (Hannes)
-- Fixed bug #36812 (pg_execute() modifies input array). (Ilia)
-- Fixed bug #36798 (Error parsing named parameters with queries containing
- high-ascii chars). (Ilia)
-- Fixed bug #36644 (possible crash in variant_date_from_timestamp()). (Ilia)
-- Fixed bug #36427 (proc_open() / proc_close() leak handles on windows).
- (jdolecek at NetBSD dot org, Nuno)
-- Fixed bug #36392 (wrong number of decimal digits with %e specifier in
- sprintf). (Matt,Ilia)
-- Fixed bug #36214 (__get method works properly only when conditional
- operator is used). (Dmitry)
-- Fixed bug #35634 (Erroneous "Class declarations may not be nested"
- error raised). (Carl P. Corliss, Dmitry)
-- Fixed bug #35106 (nested foreach fails when array variable has a
- reference). (Dmitry)
-- Fixed bug #34564 (COM extension not returning modified "out" argument) (Andy)
-- Fixed bug #33734 (Something strange with COM Object). (Rob)
-- Fixed bug #33386 (ScriptControl only sees last function of class). (Rob)
-- Fixed bug #33282 (Re-assignment by reference does not clear the is_ref
- flag) (Ilia, Dmitry, Matt Wilmas)
-- Fixed bug #30074 (apparent symbol table error with
- extract($blah, EXTR_REFS)) (Brian)
-- Fixed bug #29840 (is_executable() does not honor safe_mode_exec_dir
- setting). (Ilia)
-- Fixed PECL bug #7295 (ORA-01405: fetched column value is NULL on LOB
- fields). (Tony)
-
-02 Nov 2006, PHP 5.2.0
-- Updated bundled OpenSSL to version 0.9.8d in the Windows distro. (Edin)
-- Updated Postgresql client libraries to 8.1.4 in the Windows distro. (Edin)
-- Updated PCRE to version 6.7. (Ilia)
-- Updated libsqlite in ext/pdo_sqlite to 3.3.7. (Ilia)
-- Updated bundled MySQL client library to version 5.0.22 in the Windows
- distribution. (Edin)
-- Updated timezonedb to version 2006.7. (Derick)
-
-- Added ability to make SOAP call userspace PHP<->XML converters. (Dmitry)
-- Added support for character sets in pg_escape_string() for PostgreSQL 8.1.4
- and higher. (Ilia)
-- Added support for character sets in PDO quote() method for PostgreSQL 8.1.4
- and higher. (Ilia)
-- Added DSA key generation support to openssl_pkey_new(), FR #38731 (marci
- at balabit dot hu, Tony)
-- Added SoapServer::setObject() method (it is a simplified version of
- SoapServer::setClass() method). (Dmitry)
-- Added support for hexadecimal entity in imagettftext() for the bundled GD.
- (Pierre)
-- Added support for httpOnly flag for session extension and cookie setting
- functions. (Scott MacVicar, Ilia)
-- Added version specific registry keys to allow different configurations for
- different php version. (Richard, Dmitry)
-- Added "PHPINIDir" Apache directive to apache and apache_hooks SAPIs.
- (Dmitry)
-- Added an optional boolean parameter to memory_get_usage() and
- memory_get_peak_usage() to get memory size allocated by emalloc() or real
- size of memory allocated from system. (Dmitry)
-- Added Zip Archive extension. (Pierre)
-- Added RFC1867 fileupload processing hook. (Stefan E.)
-- Added JSON and Filter extensions. (Derick, Rasmus)
-- Added error messages to disk_free_space() and disk_total_space() functions.
- FR #37971 (Tony)
-- Added PATHINFO_FILENAME option to pathinfo() to get the filename.
- (Toby S. and Christian S.)
-- Added array_fill_keys() function. (Marcus, Matt Wilmas)
-- Added posix_initgroups() function. (Ilia)
-- Added an optional parameter to parse_url() to allow retrieval of distinct
- URL components. (Ilia)
-- Added optional parameter to http_build_query() to allow specification of
- string separator. (Ilia)
-- Added image_type_to_extension() function. (Hannes, Ilia)
-- Added allow_url_include ini directive to complement allow_url_fopen. (Rasmus)
-- Added automatic module globals management. (Dmitry)
-- Added RFC2397 (data: stream) support. (Marcus)
-- Added new error mode E_RECOVERABLE_ERROR. (Derick, Marcus, Tony)
-- Added support for getenv() input filtering. (Rasmus)
-- Added support for constructors in interfaces to force constructor signature
- checks in implementations. (Marcus)
-- Added memory_get_peak_usage() function for retrieving peak memory usage of
- a PHP script. (Ilia)
-- Added pg_field_table() function. (Edin)
-- Added SimpleXMLElement::saveXML() as an alias for SimpleXMLElement::asXML().
- (Hannes)
-- Added DOMNode::getNodePath() for getting an XPath for a node. (Christian)
-- Added gmp_nextprime() function. (ants dot aasma at gmail dot com, Tony)
-- Added error_get_last() function. (Mike)
-
-- Removed current working directory from the php.ini search path for CLI and
- re-added it for other SAPIs (restore to pre 5.1.x behavior). (Edin)
-- Moved extensions to PECL:
- . ext/filepro (Derick, Tony)
- . ext/hwapi (Derick, Tony)
-- Disabled CURLOPT_FOLLOWLOCATION in curl when open_basedir or
- safe_mode are enabled. (Stefan E., Ilia)
-
-- Increased default memory limit to 16 megabytes to accommodate for a more
- accurate memory utilization measurement.
-- In addition to path to php.ini, PHPRC now may specify full file name.
- (Dmitry)
-
-- Optimized array/HashTable copying. (Matt Wilmas, Dmitry)
-- Optimized zend_try/zend_catch macros by eliminating memcpy(3). (Dmitry)
-- Optimized require_once() and include_once() by eliminating fopen(3) on
- second usage. (Dmitry)
-- Optimized request shutdown sequence. Restoring ini directives now iterates
- only over modified directives instead of all. (Dmitry)
-
-- Changed priority of PHPRC environment variable on win32 to be higher then
- value from registry. (Dmitry)
-- Changed __toString() to be called wherever applicable. (Marcus)
-- Changed E_ALL error reporting mode to include E_RECOVERABLE_ERROR. (Marcus)
-- Changed realpath cache to be disabled when "open_basedir" or "safe_mode"
- are enabled on per-request basis. (Ilia)
-
-- Improved SNMP extension: (Jani)
- . Renamed snmp_set_oid_numeric_print() to snmp_set_oid_output_format().
- . Added 2 new constants: SNMP_OID_OUTPUT_FULL and SNMP_OID_OUTPUT_NUMERIC
- . Fixed bug #37564 (AES privacy encryption not possible due to net-snmp 5.2
- compatibility issue). (Patch: scott dot moynes+php at gmail dot com)
-- Improved OpenSSL extension: (Pierre)
- . Added support for all supported algorithms in openssl_verify
- . Added openssl_pkey_get_details, returns the details of a key
- . Added x509 v3 extensions support
- . Added openssl_csr_get_subject() and openssl_csr_get_public_key()
- . Added 3 new constants OPENSSL_VERSION_TEXT and OPENSSL_VERSION_NUMBER and
- OPENSSL_KEYTYPE_EC
-- Improved the Zend memory manager: (Dmitry)
- . Removed unnecessary "--disable-zend-memory-manager" configure option.
- . Added "--enable-malloc-mm" configure option which is enabled by default in
- debug builds to allow using internal and external memory debuggers.
- . Allow tweaking the memory manager with ZEND_MM_MEM_TYPE and ZEND_MM_SEG_SIZE
- environment variables.
- . For more information: Zend/README.ZEND_MM
-- Improved safe_mode check for the error_log() function. (Ilia)
-- Improved the error reporting in SOAP extension on request failure. (Ilia)
-- Improved crypt() on win32 to be about 10 times faster and to have friendlier
- license. (Frank, Dmitry)
-- Improved performance of the implode() function on associated arrays. (Ilia)
-- Improved performance of str_replace() when doing 1 char to 1 char or 1 char
- to many chars replacement. (Ilia)
-- Improved apache2filter SAPI:
- . Allowed PHP to be an arbitrary filter in the chain and read the script from
- the Apache stream. (John)
- . Added support for apache2filter in the Windows build including binary
- support for both Apache 2.0.x (php5apache2_filter.dll) and Apache 2.2.x
- (php5apache2_2_filter.dll). (Edin)
-- Improved apache2handler SAPI:
- . Changed ap_set_content_type() to be called only once. (Mike)
- . Added support for Apache 2.2 handler in the Windows distribution. (Edin)
-- Improved FastCGI SAPI: (Dmitry)
- . Removed source compatibility with libfcgi.
- . Optimized access to FastCGI environment variables by using HashTable
- instead of linear search.
- . Allowed PHP_FCGI_MAX_REQUESTS=0 that assumes no limit.
- . Allowed PHP_FCGI_CHILDREN=0 that assumes no worker children. (FastCGI
- requests are handled by main process itself)
-- Improved CURL:
- . Added control character checks for "open_basedir" and "safe_mode" checks.
- (Ilia)
- . Added implementation of curl_multi_info_read(). (Brian)
-- Improved PCRE: (Andrei)
- . Added run-time configurable backtracking/recursion limits.
- . Added preg_last_error(). (Andrei)
-- Improved PDO:
- . Added new attribute ATTR_DEFAULT_FETCH_MODE. (Pierre)
- . Added FETCH_PROPS_LATE. (Marcus)
-- Improved SPL: (Marcus)
- . Made most iterator code exception safe.
- . Added RegExIterator and RecursiveRegExIterator.
- . Added full caching support and ArrayAccess to CachingIterator.
- . Added array functions to ArrayObject/ArrayIterator and made them faster.
- . Added support for reading csv and skipping empty lines in SplFileObject.
- . Added CachingIterator::TOSTRING_USE_INNER, calls inner iterator __toString.
- . Added ability to set the CSV separator per SplFileObject.
-- Improved xmlReader: (Rob)
- . Added readInnerXml(), xmlReader::setSchema().
- . Added readInnerXML(), readOuterXML(), readString(), setSchema(). (2.6.20+)
- . Changed to passing libxml options when loading reader.
-
-- Fixed invalid read in imagecreatefrompng when an empty file is given
- (Pierre, Tony)
-- Fixed infinite loop when a wrong color index is given to imagefill (Pierre)
-- Fixed mess with CGI/CLI -d option (now it works with cgi; constants are
- working exactly like in php.ini; with FastCGI -d affects all requests).
- (Dmitry)
-- Fixed missing open_basedir check inside chdir() function. (Ilia)
-- Fixed overflow on 64bit systems in str_repeat() and wordwrap(). (Stefan E.)
-- Fixed XSLTProcessor::importStylesheet() to return TRUE on success
- (Christian)
-- Fixed leaks in openssl_csr_sign and openssl_csr_new (Pierre)
-- Fixed phpinfo() cutoff of variables at \0. (Ilia)
-- Fixed a bug in the filter extension that prevented magic_quotes_gpc from
- being applied when RAW filter is used. (Ilia)
-- Fixed memory leaks in openssl streams context options. (Pierre)
-- Fixed handling of extremely long paths inside tempnam() function. (Ilia)
-- Fixed bug #39721 (Runtime inheritance causes data corruption). (Dmitry)
-- Fixed bug #39304 (Segmentation fault with list unpacking of string offset).
- (Dmitry)
-- Fixed bug #39192 (Not including nsapi.h properly with SJSWS 7). This will
- make PHP 5.2 compatible to new Sun Webserver. (Uwe)
-- Fixed bug #39140 (Uncaught exception may cause crash). (Dmitry)
-- Fixed bug #39125 (Memleak when reflecting non-existing class/method). (Tony)
-- Fixed bug #39067 (getDeclaringClass() and private properties). (Tony)
-- Fixed bug #39039 (SSL: fatal protocol error when fetching HTTPS from servers
- running Google web server). (Ilia)
-- Fixed bug #39035 (Compatibility issue between DOM and
- zend.ze1_compatibility_mode). (Rob)
-- Fixed bug #39034 (curl_exec() with return transfer returns TRUE on empty
- files). (Ilia)
-- Fixed bug #39032 (strcspn() stops on null character). (Tony)
-- Fixed bug #39020 (PHP in FastCGI server mode crashes). (Dmitry)
-- Fixed bug #39017 (foreach(($obj = new myClass) as $v); echo $obj;
- segfaults). (Dmitry)
-- Fixed bug #39004 (Fixed generation of config.nice with autoconf 2.60). (Ilia)
-- Fixed bug #39003 (__autoload() is called for type hinting). (Dmitry, Tony)
-- Fixed bug #39001 (ReflectionProperty returns incorrect declaring class for
- protected properties). (Tony)
-- Fixed bug #38996 (PDO_MYSQL doesn't check connections for liveness). (Tony)
-- Fixed bug #38993 (Fixed safe_mode/open_basedir checks for session.save_path,
- allowing them to account for extra parameters). (Ilia)
-- Fixed bug #38989 (Absolute path with slash at beginning doesn't work on win).
- (Dmitry)
-- Fixed bug #38985 (Can't cast COM objects). (Wez)
-- Fixed bug #38981 (using FTP URLs in get_headers() causes crash). (Tony)
-- Fixed bug #38963 (Fixed a possible open_basedir bypass in tempnam()). (Ilia)
-- Fixed bug #38961 (metaphone() results in segmentation fault on NetBSD).
- (Tony)
-- Fixed bug #38949 (Cannot get xmlns value attribute). (Rob)
-- Fixed bug #38942 (Double old-style-ctor inheritance). (Dmitry)
-- Fixed bug #38941 (imap extension does not compile against new version of the
- imap library). (Ilia)
-- Fixed bug #38934 (move_uploaded_file() cannot read uploaded file outside of
- open_basedir). (Ilia)
-- Fixed bug #38904 (apache2filter changes cwd to /). (Ilia, Hannes)
-- Fixed bug #38891 (get_headers() do not work with curl-wrappers). (Ilia)
-- Fixed bug #38882 (ldap_connect causes segfault with newer versions of
- OpenLDAP). (Tony)
-- Fixed bug #38859 (parse_url() fails if passing '@' in passwd). (Tony)
-- Fixed bug #38850 (lookupNamespaceURI doesn't return default namespace). (Rob)
-- Fixed bug #38844 (curl_easy_strerror() is defined only since cURL 7.12.0).
- (Tony)
-- Fixed bug #38813 (DOMEntityReference->__construct crashes when called
- explicitly). (Rob)
-- Fixed bug #38808 ("maybe ref" issue for current() and others). (Dmitry)
-- Fixed bug #38779 (engine crashes when require()'ing file with syntax error
- through userspace stream wrapper). (Tony, Dmitry)
-- Fixed bug #38772 (inconsistent overriding of methods in different visibility
- contexts). (Dmitry)
-- Fixed bug #38759 (PDO sqlite2 empty query causes segfault). (Tony)
-- Fixed bug #38721 (Invalid memory read in date_parse()). (Tony, Derick)
-- Fixed bug #38700 (SoapClient::__getTypes never returns). (Dmitry)
-- Fixed bug #38693 (curl_multi_add_handle() set curl handle to null). (Ilia)
-- Fixed bug #38687 (sockaddr local storage insufficient for all sock families).
- (Sara)
-- Fixed bug #38661 (mixed-case URL breaks url-wrappers). (Ilia)
-- Fixed bug #38653 (memory leak in ReflectionClass::getConstant()). (Tony)
-- Fixed bug #38649 (uninit'd optional arg in stream_socket_sendto()). (Sara)
-- Fixed bug #38637 (curl_copy_handle() fails to fully copy the cURL handle).
- (Tony, Ilia)
-- Fixed bug #38624 (Strange warning when incrementing an object property and
- exception is thrown from __get method). (Tony)
-- Fixed bug #38623 (leaks in a tricky code with switch() and exceptions).
- (Dmitry)
-- Fixed bug #38579 (include_once() may include the same file twice). (Dmitry)
-- Fixed bug #38574 (missing curl constants and improper constant detection).
- (Ilia)
-- Fixed bug #38543 (shutdown_executor() may segfault when memory_limit is too
- low). (Dmitry)
-- Fixed bug #38535 (memory corruption in pdo_pgsql driver on error retrieval
- inside a failed query executed via query() method). (Ilia)
-- Fixed bug #38534 (segfault when calling setlocale() in userspace session
- handler). (Tony)
-- Fixed bug #38524 (strptime() does not initialize the internal date storage
- structure). (Ilia)
-- Fixed bug #38511, #38473, #38263 (Fixed session extension request shutdown
- order to ensure it is shutdown before the extensions it may depend on).
- (Ilia)
-- Fixed bug #38488 (Access to "php://stdin" and family crashes PHP on win32).
- (Dmitry)
-- Fixed bug #38474 (getAttribute select attribute by order, even when
- prefixed). (Rob)
-- Fixed bug #38467 (--enable-versioning causes make fail on OS X). (Tony)
-- Fixed bug #38465 (ReflectionParameter fails if default value is an access
- to self::). (Johannes)
-- Fixed bug #38464 (array_count_values() mishandles numeric strings).
- (Matt Wilmas, Ilia)
-- Fixed bug #38461 (setting private attribute with __set() produces
- segfault). (Tony)
-- Fixed bug #38458, PECL bug #8944, PECL bug #7775 (error retrieving columns
- after long/text columns with PDO_ODBC). (Wez)
-- Fixed bug #38454 (warning upon disabling handler via
- xml_set_element_handler). (dtorop933 at gmail dot com, Rob)
-- Fixed bug #38451 (PDO_MYSQL doesn't compile on Solaris). (Tony)
-- Fixed bug #38450 (constructor is not called for classes used in userspace
- stream wrappers). (Tony)
-- Fixed bug #38438 (DOMNodeList->item(0) segfault on empty NodeList). (Ilia)
-- Fixed bug #38431 (xmlrpc_get_type() crashes PHP on objects). (Tony)
-- Fixed bug #38427 (unicode causes xml_parser to misbehave). (Rob)
-- Fixed bug #38424 (Different attribute assignment if new or existing). (Rob)
-- Fixed bug #38400 (Use of com.typelib_file may cause a crash). (Ilia)
-- Fixed bug #38394 (PDO fails to recover from failed prepared statement
- execution). (Ilia)
-- Fixed bug #38377 (session_destroy() gives warning after
- session_regenerate_id()). (Ilia)
-- Implemented #38357 (dbase_open can't open DBase 3 dbf file).
- (rodrigo at fabricadeideias dot com, Mike)
-- Fixed bug #38354 (Unwanted reformatting of XML when using AsXML). (Christian)
-- Fixed bug #38347 (Segmentation fault when using foreach with an unknown/empty
- SimpleXMLElement). (Tony)
-- Fixed bug #38322 (reading past array in sscanf() leads to arbitrary code
- execution). (Tony)
-- Fixed bug #38315 (Constructing in the destructor causes weird behavior).
- (Dmitry)
-- Fixed bug #38303 (spl_autoload_register() suppress all errors silently).
- (Ilia)
-- Fixed bug #38290 (configure script ignores --without-cdb,inifile,flatfile).
- (Marcus)
-- Fixed bug #38289 (segfault in session_decode() when _SESSION is NULL).
- (Tony)
-- Fixed bug #38287 (static variables mess up global vars). (Dmitry)
-- Fixed bug #38278 (session_cache_expire()'s value does not match phpinfo's
- session.cache_expire). (Tony)
-- Fixed bug #38276 (file_exists() works incorrectly with long filenames
- on Windows). (Ilia, Tony)
-- Fixed bug #38269 (fopen wrapper doesn't fail on invalid hostname with
- curlwrappers enabled). (Tony)
-- Fixed bug #38265 (heap corruption). (Dmitry)
-- Fixed bug #38261 (openssl_x509_parse() leaks with invalid cert) (Pierre)
-- Fixed bug #38255 (openssl possible leaks while passing keys) (Pierre)
-- Fixed bug #38253 (PDO produces segfault with default fetch mode). (Tony)
-- Fixed bug #38251 (socket_select() and invalid arguments). (Tony)
-- Fixed bug #38236 (Binary data gets corrupted on multipart/formdata POST).
- (Ilia)
-- Fixed bug #38234 (Exception in __clone makes memory leak). (Dmitry, Nuno)
-- Fixed bug #38229 (strtotime() does not parse YYYY-MM format). (Ilia)
-- Fixed bug #38224 (session extension can't handle broken cookies). (Ilia)
-- Fixed bug #38220 (Crash on some object operations). (Dmitry)
-- Fixed bug #38217 (ReflectionClass::newInstanceArgs() tries to allocate too
- much memory). (Tony)
-- Fixed bug #38214 (gif interlace output cannot work). (Pierre)
-- Fixed bug #38213, #37611, #37571 (wddx encoding fails to handle certain
- characters). (Ilia)
-- Fixed bug #38212 (Segfault on invalid imagecreatefromgd2part() parameters).
- (Pierre)
-- Fixed bug #38211 (variable name and cookie name match breaks script
- execution). (Dmitry)
-- Fixed bug #38199 (fclose() unable to close STDOUT and STDERR). (Tony)
-- Fixed bug #38198 (possible crash when COM reports an exception). (Ilia)
-- Fixed bug #38194 (ReflectionClass::isSubclassOf() returns TRUE for the
- class itself). (Ilia)
-- Fixed bug #38183 (disable_classes=Foobar causes disabled class to be
- called Foo). (Jani)
-- Fixed bug #38179 (imagecopy from a palette to a truecolor image loose alpha
- channel) (Pierre)
-- Fixed bug #38173 (Freeing nested cursors causes OCI8 to segfault). (Tony)
-- Fixed bug #38168 (Crash in pdo_pgsql on missing bound parameters). (Ilia)
-- Fixed bug #38161 (oci_bind_by_name() returns garbage when Oracle didn't set
- the variable). (Tony)
-- Fixed bug #38146 (Cannot use array returned from foo::__get('bar') in write
- context). (Dmitry)
-- Fixed bug #38132 (ReflectionClass::getStaticProperties() retains \0 in key
- names). (Ilia)
-- Fixed bug #38125 (undefined reference to spl_dual_it_free_storage). (Marcus)
-- Fixed bug #38112 (corrupted gif segfaults) (Pierre)
-- Fixed bug #38096 (large timeout values ignored on 32bit machines in
- stream_socket_accept() and stream_socket_client()). (Ilia)
-- Fixed bug #38086 (stream_copy_to_stream() returns 0 when maxlen is bigger
- than the actual length). (Tony)
-- Fixed bug #38072 (boolean arg for mysqli_autocommit() is always true on
- Solaris). (Tony)
-- Fixed bug #38067 (Parameters are not decoded from utf-8 when using encoding
- option). (Dmitry)
-- Fixed bug #38064 (ignored constructor visibility). (Marcus)
-- Fixed bug #38055 (Wrong interpretation of boolean parameters). (Dmitry)
-- Fixed bug #38047 ("file" and "line" sometimes not set in backtrace from
- inside error handler). (Dmitry)
-- Fixed bug #38019 (segfault extending mysqli class). (Dmitry)
-- Fixed bug #38005 (SoapFault faultstring doesn't follow encoding rules).
- (Dmitry)
-- Fixed bug #38004 (Parameters in SoapServer are decoded twice). (Dmitry)
-- Fixed bug #38003 (in classes inherited from MySQLi it's possible to call
- private constructors from invalid context). (Tony)
-- Fixed bug #37987 (invalid return of file_exists() in safe mode). (Ilia)
-- Fixed bug #37947 (zend_ptr_stack reallocation problem). (Dmitry)
-- Fixed bug #37945 (pathinfo() cannot handle argument with special characters
- like German "Umlaut"). (Mike)
-- Fixed bug #37931 (possible crash in OCI8 after database restart
- when using persistent connections). (Tony)
-- Fixed bug #37923 (Display constant value in reflection::export). (Johannes)
-- Fixed bug #37920 (compilation problems on z/OS). (Tony)
-- Fixed bug #37870 (pgo_pgsql tries to de-allocate unused statements).
- (Ilia, ce at netage dot bg)
-- Fixed bug #37864 (file_get_contents() leaks on empty file). (Hannes)
-- Fixed bug #37862 (Integer pointer comparison to numeric value).
- (bugs-php at thewrittenword dot com)
-- Fixed bug #37846 (wordwrap() wraps incorrectly). (ddk at krasn dot ru, Tony)
-- Fixed bug #37816 (ReflectionProperty does not throw exception when accessing
- protected attribute). (Marcus)
-- Fixed bug #37811 (define not using toString on objects). (Marcus)
-- Fixed bug #37807 (segmentation fault during SOAP schema import). (Tony)
-- Fixed bug #37806 (weird behavior of object type and comparison). (Marcus)
-- Fixed bug #37780 (memory leak trying to execute a non existing file (CLI)).
- (Mike)
-- Fixed bug #37779 (empty include_path leads to search for files inside /).
- (jr at terragate dot net, Ilia)
-- Fixed bug #37747 (strtotime segfaults when given "nextyear"). (Derick)
-- Fixed bug #37720 (merge_php_config scrambles values).
- (Mike, pumuckel at metropolis dot de)
-- Fixed bug #37709 (Possible crash in PDO::errorCode()). (Ilia)
-- Fixed bug #37707 (clone without assigning leaks memory). (Ilia, Nuno, Dmitri)
-- Fixed bug #37705 (Semaphore constants not available). (Ilia)
-- Fixed bug #37671 (MySQLi extension fails to recognize BIT column). (Ilia)
-- Fixed bug #37667 (Object is not added into array returned by __get). (Marcus)
-- Fixed bug #37635 (parameter of pcntl signal handler is trashed). (Mike)
-- Fixed bug #37632 (Protected method access problem). (Marcus)
-- Fixed bug #37630 (MySQL extensions should link against thread safe client
- libs if built with ZTS). (Mike)
-- Fixed bug #37620 (mysqli_ssl_set validation is inappropriate). (Georg)
-- Fixed bug #37616 (DATE_RFC822 does not product RFC 822 dates).
- (Hannes Magnusson, Derick)
-- Fixed bug #37614 (Class name lowercased in error message). (Johannes)
-- Fixed bug #37587 (var without attribute causes segfault). (Marcus)
-- Fixed bug #37586 (Bumped minimum PCRE version to 6.6, needed for recursion
- limit support). (Ilia)
-- Fixed bug #37581 (oci_bind_array_by_name clobbers input array when using
- SQLT_AFC, AVC). (Tony)
-- Fixed bug #37569 (WDDX incorrectly encodes high-ascii characters). (Ilia)
-- Fixed bug #37565 (Using reflection::export with simplexml causing a crash).
- (Marcus)
-- Fixed bug #37564 (AES privacy encryption not possible due to net-snmp 5.2
- compatibility issue). (Jani, patch by scott dot moynes+php at gmail dot com)
-- Fixed bug #37563 (array_key_exists performance is poor for &$array). (Ilia)
-- Fixed bug #37558 (timeout functionality doesn't work after a second PHP
- start-up on the same thread). (p dot desarnaud at wanadoo dot fr)
-- Fixed bug #37531 (oci8 persistent connection corruption). (Tony)
-- Fixed bug #37523 (namespaces added too late, leads to missing xsi:type
- attributes. Incompatibility with libxml2-2.6.24). (Dmitry)
-- Fixed bug #37514 (strtotime doesn't assume year correctly). (Derick)
-- Fixed bug #37510 (session_regenerate_id changes session_id() even on
- failure). (Hannes)
-- Fixed bug #37505 (touch() truncates large files). (Ilia)
-- Fixed bug #37499 (CLI segmentation faults during cleanup with sybase-ct
- extension enabled). (Tony)
-- Fixed bug #37496 (FastCGI output buffer overrun). (Piotr, Dmitry)
-- Fixed bug #37487 (oci_fetch_array() array-type should always default to
- OCI_BOTH). (Tony)
-- Fixed bug #37457 (Crash when an exception is thrown in accept() method of
- FilterIterator). (Marcus)
-- Fixed bug #37456 (DOMElement->setAttribute() loops forever). (Rob)
-- Fixed bug #37445 (Fixed crash in pdo_mysql resulting from premature object
- destruction). (Ilia)
-- Fixed bug #37428 (PHP crashes on windows if there are start-up errors and
- event log is used for logging them). (Edin)
-- Fixed bug #37418 (tidy module crashes on shutdown). (Tony)
-- Fixed bug #37416 (iterator_to_array() hides exceptions thrown in rewind()
- method). (Tony)
-- Fixed bug #37413 (Rejected versions of flex that don't work). (Ilia)
-- Fixed bug #37395 (recursive mkdir() fails to create nonexistent directories
- in root dir). (Tony)
-- Fixed bug #37394 (substr_compare() returns an error when offset equals
- string length). (Ilia)
-- Fixed bug #37392 (Unnecessary call to OCITransRollback() at the end of
- request). (Tony)
-- Fixed bug #37376 (fastcgi.c compile fail with gcc 2.95.4). (Ilia)
-- Fixed bug #37368 (Incorrect timestamp returned for strtotime()). (Derick)
-- Fixed bug #37363 (PDO_MYSQL does not build if no other mysql extension is
- enabled). (Mike)
-- Fixed bug #37348 (make PEAR install ignore open_basedir). (Ilia)
-- Fixed bug #37341 ($_SERVER in included file is shortened to two entries,
- if $_ENV gets used). (Dmitry)
-- Fixed bug #37313 (sigemptyset() used without including <signal.h>).
- (jdolecek)
-- Fixed bug #37306 (max_execution_time = max_input_time). (Dmitry)
-- Fixed bug #37278 (SOAP not respecting uri in __soapCall). (Dmitry)
-- Fixed bug #37265 (Added missing safe_mode & open_basedir checks to
- imap_body()). (Ilia)
-- Fixed bug #37262 (var_export() does not escape \0 character). (Ilia)
-- Fixed bug #37256 (php-fastcgi doesn't handle connection abort). (Dmitry)
-- Fixed bug #37244 (Added strict flag to base64_decode() that enforces
- RFC3548 compliance). (Ilia)
-- Fixed bug #37144 (PHP crashes trying to assign into property of dead object).
- (Dmitry)
-- Fixed bug #36949 (invalid internal mysqli objects dtor). (Mike)
-- Implement #36732 (req/x509 extensions support for openssl_csr_new and
- openssl_csr_sign) (ben at psc dot edu, Pierre)
-- Fixed bug #36759 (Objects destructors are invoked in wrong order when script
- is finished). (Dmitry)
-- Fixed bug #36681 (pdo_pgsql driver incorrectly ignored some errors).
- (Wez, Ilia)
-- Fixed bug #36630 (umask not reset at the end of the request). (Ilia)
-- Fixed bug #36515 (Unlinking buckets from non-existent brigades). (Sara)
-- Fixed bug #35973 (Error ORA-24806 occurs when trying to fetch a NCLOB
- field). (Tony)
-- Fixed bug #35886 (file_get_contents() fails with some combinations of
- offset & maxlen). (Nuno)
-- Fixed bug #35512 (Lack of read permission on main script results in
- E_WARNING rather then E_ERROR). (Ilia)
-- Fixed bug #34180 (--with-curlwrappers causes PHP to disregard some HTTP
- stream context options). (Mike)
-- Fixed bug #34066 (recursive array_walk causes segfault). (Tony)
-- Fixed bug #34065 (throw in foreach causes memory leaks). (Dmitry)
-- Fixed bug #34005 (oci_password_change() fails).
- (pholdaway at technocom-wireless dot com, Tony)
-- Fixed bug #33895 (Missing math constants). (Hannes)
-- Fixed bug #33770 (https:// or ftps:// do not work when --with-curlwrappers
- is used and ssl certificate is not verifiable). (Ilia)
-- Fixed bug #29538 (number_format and problem with 0). (Matt Wilmas)
-- Implement #28382 (openssl_x509_parse() extensions support) (Pierre)
-- Fixed PECL bug #9061 (oci8 might reuse wrong persistent connection). (Tony)
-- Fixed PECL bug #8816 (issue in php_oci_statement_fetch with more than one
- piecewise column) (jeff at badtz-maru dot com, Tony)
-- Fixed PECL bug #8112 (OCI8 persistent connections misbehave when Apache
- process times out). (Tony)
-- Fixed PECL bug #7755 (error selecting DOUBLE fields with PDO_ODBC).
- ("slaws", Wez)
-
-
-04 May 2006, PHP 5.1.4
-- Added "capture_peer_cert" and "capture_peer_cert_chain" context options
- for SSL streams. (Wez).
-- Added PDO::PARAM_EVT_* family of constants. (Sara)
-- Fixed possible crash in highlight_string(). (Dmitry)
-- Fixed bug #37291 (FastCGI no longer works with isapi_fcgi.dll). (Dmitry)
-- Fixed bug #37277 (cloning Dom Documents or Nodes does not work). (Rob)
-- Fixed bug #37276 (problems with $_POST array). (Dmitry)
-- Fixed bug #36632 (bad error reporting for pdo_odbc exec UPDATE). (Wez).
-- Fixed bug #35552 (crash when pdo_odbc prepare fails). (Wez).
-
-28 Apr 2006, PHP 5.1.3
-- Updated bundled PCRE library to version 6.6. (Andrei)
-- Moved extensions to PECL:
- . ext/msession (Derick)
-- Reimplemented FastCGI interface. (Dmitry)
-- Improved SPL: (Marcus)
- - Fixed issues with not/double calling of constructors of SPL iterators.
- - Fixed issues with info-class/file-class in SPL directory handling classes.
- - Fixed ArrayIterator::seek().
- - Added SimpleXMLIterator::count().
- - Dropped erroneous RecursiveDirectoryIterator::getSubPathInfo().
-- Improved SimpleXML: (Marcus, Rob)
- . Added SimpleXMLElement::getName() to retrieve name of element.
- . Added ability to create elements on the fly.
- . Added addChild() method for element creation supporting namespaces.
- . Added addAttribute() method for attribute creation supporting namespaces.
- . Added ability to delete specific elements and attributes by offset.
-- Improved Reflection API: (Marcus)
- . Added ReflectionClass::newInstanceArgs($args).
- . Added ability to analyze extension dependency.
- . Added ReflectionFunction::isDeprecated() and constant IS_DEPRECATED.
- . Added ReflectionParameter::getDeclaringClass().
- . Changed reflection constants to be prefixed with IS_. (Johannes)
-- Improved cURL extension: (Ilia)
- . Added curl_setopt_array() function that allows setting of multiple
- options via an associated array.
- . Added the ability to retrieve the request message sent to the server.
-- Improved GD extension: (Pierre)
- . Added a weak/tolerant mode to the JPEG loader.
- . Added filtering mode option to imagepng() to allow reducing file size.
- . Fixed imagecolorallocate() and imagecolorallocatelapha() to return FALSE
- on error.
-- Changed get_headers() to retrieve headers also from non-200 responses.
- (Ilia)
-- Changed get_headers() to use the default context. (Ilia)
-- Added lchown() and lchgrp() to change user/group ownership of symlinks.
- (Derick)
-- Added support for exif date format in strtotime(). (Derick)
-- Added a check for special characters in the session name. (Ilia)
-- Added "consumed" stream filter. (Marcus)
-- Added new mysqli constants for BIT and NEW_DECIMAL field types:
- MYSQLI_TYPE_NEWDECIMAL and MYSQLI_TYPE_BIT. FR #36007. (Georg)
-- Added imap_savebody() that allows message body to be written to a
- file. (Mike)
-- Added overflow checks to wordwrap() function. (Ilia)
-- Added support for BINARY_DOUBLE and BINARY_FLOAT to PDO_OCI and OCI8
- (also fixes bug #36764). (Tony)
-- Eliminated run-time constant fetching for TRUE, FALSE and NULL. (Dmitry)
-- Removed the E_STRICT deprecation notice from "var". (Ilia)
-- Fixed reading stream filters never notified about EOF. (Mike)
-- Fixed tempnam() 2nd parameter to be checked against path components. (Ilia)
-- Fixed a bug that would not fill in the fifth argument to preg_replace()
- properly, if the variable was not declared previously. (Andrei)
-- Fixed safe_mode check for source argument of the copy() function. (Ilia)
-- Fixed mysqli bigint conversion under Windows (Georg)
-- Fixed XSS inside phpinfo() with long inputs. (Ilia)
-- Fixed Apache2 SAPIs header handler modifying header strings. (Mike)
-- Fixed 'auto_globals_jit' to work together with 'register_argc_argv'. (Dmitry)
-- Fixed offset/length parameter validation in substr_compare() function. (Ilia)
-- Fixed debug_zval_dump() to support private and protected members. (Dmitry)
-- Fixed SoapFault::getMessage(). (Dmitry)
-- Fixed issue with iconv_mime_decode where the "encoding" would only allow
- upper case specifiers. (Derick)
-- Fixed tiger hash algorithm generating wrong results on big endian platforms.
- (Mike)
-- Fixed crash with DOMImplementation::createDocumentType("name:"). (Mike)
-- Fixed bug #37205 (Serving binary content/images fails with "comm with server
- aborted" FastCGI err). (Dmitry)
-- Fixed bug #37192 (cc may complain about non-constant initializers in
- hash_adler.c). (Mike)
-- Fixed bug #37191 (chmod takes off sticky bit when safe_mode is On). (Tony)
-- Fixed bug #37167 (PDO segfaults when throwing exception from the
- fetch handler). (Tony)
-- Fixed bug #37162 (wddx does not build as a shared extension).
- (jdolecek at NetBSD dot org, Ilia)
-- Fixed bug #37158 (fread behavior changes after calling
- stream_wrapper_register). (Wez)
-- Fixed bug #37138 (__autoload tries to load callback'ed self and parent).
- (Dmitry)
-- Fixed bug #37103 (libmbfl headers not installed). (Jani)
-- Fixed bug #37062 (compile failure on ARM architecture). (Tony)
-- Fixed bug #37061 (curl_exec() doesn't zero-terminate binary strings). (Tony)
-- Fixed bug #37060 (Type of retval of Countable::count() is not checked).
- (Johannes)
-- Fixed bug #37059 (oci_bind_by_name() doesn't support RAW and LONG RAW
- fields). (Tony)
-- Fixed bug #37057 (xmlrpc_decode() may produce arrays with numeric strings,
- which are unaccessible). (Tony)
-- Fixed bug #37055 (incorrect reference counting for persistent OCI8
- connections). (Tony)
-- Fixed bug #37054 (SoapClient Error Fetching http headers). (Dmitry)
-- Fixed bug #37053 (html_errors with internal classes produces wrong links).
- (Tony)
-- Fixed bug #37046 (foreach breaks static scope). (Dmitry)
-- Fixed bug #37045 (Fixed check for special chars for http redirects). (Ilia)
-- Fixed bug #37017 (strtotime fails before 13:00:00 with some time zones
- identifiers). (Derick)
-- Fixed bug #37002 (Have to quote literals in INI when concatenating with
- vars). (Dmitry)z
-- Fixed bug #36988 (mktime freezes on long numbers). (Derick)
-- Fixed bug #36981 (SplFileObject->fgets() ignores max_length). (Tony)
-- Fixed bug #36957 (serialize() does not handle recursion). (Ilia)
-- Fixed bug #36944 (strncmp & strncasecmp do not return false on negative
- string length). (Tony)
-- Fixed bug #36941 (ArrayIterator does not clone itself). (Marcus)
-- Fixed bug #36934 (OCILob->read() doesn't move internal pointer when
- reading 0's). (Tony)
-- Fixed bug #36908 (wsdl default value overrides value in soap request).
- (Dmitry)
-- Fixed bug #36898 (__set() leaks in classes extending internal ones).
- (Tony, Dmitry)
-- Fixed bug #36886 (User filters can leak buckets in some situations). (Ilia)
-- Fixed bug #36878 (error messages are printed even though an exception has
- been thrown). (Tony)
-- Fixed bug #36875 (is_*() functions do not account for open_basedir). (Ilia)
-- Fixed bug #36872 (session_destroy() fails after call to
- session_regenerate_id(true)). (Ilia)
-- Fixed bug #36869 (memory leak in output buffering when using chunked
- output). (Tony)
-- Fixed bug #36859 (DOMElement crashes when calling __construct when
- cloning). (Tony)
-- Fixed bug #36857 (Added support for partial content fetching to the
- HTTP streams wrapper). (Ilia)
-- Fixed bug #36851 (Documentation and code discrepancies for NULL
- data in oci_fetch_*() functions). (Tony)
-- Fixed bug #36825 (Exceptions thrown in ArrayObject::offsetGet cause
- segfault). (Tony)
-- Fixed bug #36820 (Privileged connection with an Oracle password file
- fails). (Tony)
-- Fixed bug #36809 (__FILE__ behavior changed). (Dmitry)
-- Fixed bug #36808 (syslog ident becomes garbage between requests). (Tony)
-- Fixed bug #36802 (mysqli_set_charset() crash with a non-open connection).
- (Ilia)
-- Fixed bug #36756 (DOMDocument::removeChild corrupts node). (Rob)
-- Fixed bug #36749 (SOAP: 'Error Fetching http body' when using HTTP Proxy).
- (Dmitry)
-- Fixed bug #36745 (No error message when load data local file isn't found).
- (Georg)
-- Fixed bug #36743 (In a class extending XMLReader array properties are not
- writable). (Tony)
-- Fixed bug #36727 (segfault in pdo_pgsql bindValue() when no parameters are
- defined). (Tony)
-- Fixed bug #36721 (The SoapServer is not able to send a header that it didn't
- receive). (Dmitry)
-- Fixed bug #36697 (Transparency is lost when using imagecreatetruecolor).
- (Pierre)
-- Fixed bug #36689 (Removed arbitrary limit on the length of syslog messages).
- (Ilia)
-- Fixed bug #36656 (http_build_query generates invalid URIs due to use of
- square brackets). (Mike)
-- Fixed bug #36638 (strtotime() returns false when 2nd argument < 1). (Derick)
-- Fixed bug #36629 (SoapServer::handle() exits on SOAP faults). (Dmitry)
-- Fixed bug #36625 (pg_trace() does not work). (iakio at mono-space dot net)
-- Fixed bug #36614 (Segfault when using Soap). (Dmitry)
-- Fixed bug #36611 (assignment to SimpleXML object attribute changes argument
- type to string). (Tony)
-- Fixed bug #36606 (pg_query_params() changes arguments type to string). (Tony)
-- Fixed bug #36599 (DATE_W3C format constant incorrect). (Derick)
-- Fixed bug #36575 (SOAP: Incorrect complex type instantiation with
- hierarchies). (Dmitry)
-- Fixed bug #36572 (Added PDO::MYSQL_ATTR_DIRECT_QUERY constant that should
- be set when executing internal queries like "show master status" via MySQL).
- (Ilia)
-- Fixed bug #36568 (memory_limit setting on win32 has no effect). (Dmitry)
-- Fixed bug #36513 (comment will be outputted in last line). (Dmitry)
-- Fixed bug #36510 (strtotime() fails to parse date strings with tabs).
- (Ilia, Derick)
-- Fixed bug #36459 (Incorrect adding PHPSESSID to links, which contains \r\n).
- (Ilia)
-- Fixed bug #36458 (sleep() accepts negative values). (Ilia)
-- Fixed bug #36436 (DBA problem with Berkeley DB4). (Marcus)
-- Fixed bug #36434 (Improper resolution of declaring class name of an
- inherited property). (Ilia)
-- Fixed bug #36420 (segfault when access result->num_rows after calling
- result->close()). (Ilia,Tony)
-- Fixed bug #36403 (oci_execute() no longer supports OCI_DESCRIBE_ONLY). (Tony)
-- Fixed bug #36400 (Custom 5xx error does not return correct HTTP response error
- code). (Tony)
-- Fixed bug #36396 (strtotime() fails to parse dates in dd-mm-yyyy format).
- (Derick)
-- Fixed bug #36388 (ext/soap crashes when throwing exception and session
- persistence). (David)
-- Fixed bug #36382 (PDO/PgSQL's getColumnMeta() crashes). (Derick)
-- Fixed bug #36359 (splFileObject::fwrite() doesn't write when no data
- length specified). (Tony)
-- Fixed bug #36351 (parse_url() does not parse numeric paths properly). (Ilia)
-- Fixed bug #36345 (PDO/MySQL problem loading BLOB over 1MB). (Ilia)
-- Fixed bug #36337 (ReflectionProperty fails to return correct visibility).
- (Ilia)
-- Fixed bug #36334 (Added missing documentation about realpath cache INI
- settings). (Ilia)
-- Fixed bug #36308 (ReflectionProperty::getDocComment() does not reflect
- extended class commentary). (Ilia)
-- Fixed bug #36306 (crc32() differ on 32-bit and 64-bit platforms)
- (anight@eyelinkmedia dot com, Pierre)
-- Fixed bug #36303 (foreach on error_zval produces segfault). (Dmitry)
-- Fixed bug #36295 (typo in SplFileObject::flock() parameter name). (Tony)
-- Fixed bug #36287 (Segfault with SplFileInfo conversion). (Marcus)
-- Fixed bug #36283 (SOAPClient Compression Broken). (Dmitry)
-- Fixed bug #36268 (Object destructors called even after fatal errors). (Dmitry)
-- Fixed bug #36258 (SplFileObject::getPath() may lead to segfault). (Tony)
-- Fixed bug #36250 (PHP causes ORA-07445 core dump in Oracle server 9.2.x).
- (Tony)
-- Fixed bug #36242 (Possible memory corruption in stream_select()). (Tony)
-- Fixed bug #36235 (ocicolumnname returns false before a successful fetch).
- (Tony)
-- Fixed bug #36226 (Inconsistent handling when passing potential arrays).
- (Dmitry)
-- Fixed bug #36224 (date(DATE_ATOM) gives wrong results).
- (Derick, Hannes Magnusson)
-- Fixed bug #36222 (errorInfo in PDOException is always NULL). (Ilia)
-- Fixed bug #36208 (symbol namespace conflicts using bundled gd). (Jakub Moc)
-- Fixed bug #36205 (Memory leaks on duplicate cookies). (Dmitry)
-- Fixed bug #36185 (str_rot13() crash on non-string parameter). (Pierre)
-- Fixed bug #36176 (PDO_PGSQL - PDO::exec() does not return number of rows
- affected by the operation). (Ilia)
-- Fixed bug #36158 (SIGTERM is not handled correctly when running as a
- FastCGI server). (Dmitry)
-- Fixed bug #36152 (problems with curl+ssl and pgsql+ssl in same PHP). (Mike)
-- Fixed bug #36148 (unpack("H*hex", $data) is adding an extra character to
- the end of the string). (Ilia)
-- Fixed bug #36134 (DirectoryIterator constructor failed to detect empty
- directory names). (Ilia)
-- Fixed bug #36113 (Reading records of unsupported type causes segfault).
- (Tony)
-- Fixed bug #36096 (oci_result() returns garbage after oci_fetch() failed).
- (Tony)
-- Fixed bug #36083 (SoapClient waits for responses on one-way operations).
- (Dmitry)
-- Fixed bug #36071 (Engine Crash related with 'clone'). (Dmitry)
-- Fixed bug #36055 (possible OCI8 crash in multi-threaded environment). (Tony)
-- Fixed bug #36046 (parse_ini_file() miscounts lines in multi-line values).
- (Ilia)
-- Fixed bug #36038 (ext/hash compile failure on Mac OSX). (Tony)
-- Fixed bug #36037 (heredoc adds extra line number). (Dmitry)
-- Fixed bug #36016 (realpath cache memleaks). (Dmitry, Nuno)
-- Fixed bug #36011 (Strict errormsg wrong for call_user_func() and the likes).
- (Marcus)
-- Fixed bug #36010 (Segfault when re-creating and re-executing statements with
- bound parameters). (Tony)
-- Fixed bug #36006 (Problem with $this in __destruct()). (Dmitry)
-- Fixed bug #35999 (recursive mkdir() does not work with relative path
- like "foo/bar"). (Tony)
-- Fixed bug #35998 (SplFileInfo::getPathname() returns unix style filenames
- in win32). (Marcus)
-- Fixed bug #35988 (Unknown persistent list entry type in module shutdown).
- (Dmitry)
-- Fixed bug #35954 (Fatal com_exception casting object). (Rob)
-- Fixed bug #35900 (stream_select() should warning when tv_sec is negative).
- (Ilia)
-- Fixed bug #35785 (SimpleXML causes memory read error zend engine). (Marcus)
-- Fixed bug #34272 (empty array onto COM object blows up). (Rob)
-- Fixed bug #33292 (apache_get_modules() crashes on Windows). (Edin)
-- Fixed bug #29476 (sqlite_fetch_column_types() locks the database forever).
- (Ilia)
-
-12 Jan 2006, PHP 5.1.2
-- Updated libsqlite in ext/sqlite to 2.8.17. (Ilia)
-- Updated libsqlite in ext/pdo_sqlite to 3.2.8. (Ilia)
-- Updated to libxml2-2.6.22 and libxslt-1.1.15 in the win32 bundle. (Rob)
-- Added new extensions: (Ilia, Wez)
- . XMLWriter
- . Hash
-- Added PNG compression support to GD extension. (Pierre)
-- Added reflection constants as class constants. (Johannes)
-- Added --enable-gcov configure option to enable C-level code coverage.
- (John, Jani, Ilia, Marcus)
-- Added missing support for 'B' format identifier to date() function. (Ilia)
-- Changed reflection to be an extension. (Marcus)
-- Improved SPL extension: (Marcus)
- . Added class SplFileInfo as root class for DirectoryIterator and
- SplFileObject
- . Added SplTempFileObject
-- Improved SimpleXML extension: (Marcus)
- . Fixed memleaks
- . Fixed var_dump()
- . Fixed isset/empty/(bool) behavior
- . Fixed iterator edge cases
- . Added methods getNamespaces(), getDocNamespaces()
-- Upgraded pear to version 1.4.6. (Greg)
-- Added constants for libxslt and libexslt versions: LIBXSLT_VERSION,
- LIBXSLT_DOTTED_VERSION, LIBEXSLT_VERSION and LIBEXSLT_DOTTED_VERSION. (Pierre)
-- Fixed possible crash in apache_getenv()/apache_setenv() on invalid parameters.
- (Ilia)
-- Changed errors to warnings in imagecolormatch(). (Pierre)
-- Fixed segfault/leak in imagecolormatch(). (Pierre)
-- Fixed small leak in mysqli_stmt_fetch() when bound variable was empty string.
- (Andrey)
-- Fixed prepared statement name conflict handling in PDO_PGSQL. (Thies, Ilia)
-- Fixed memory corruption when PDO::FETCH_LAZY mode is being used. (Ilia)
-- Fixed possible leaks in imagecreatefromstring() with invalid data. (Pierre)
-- Fixed possible memory corruption inside mb_strcut(). (Ilia)
-- Fixed possible header injection by limiting each header to a single line.
- (Ilia)
-- Fixed possible XSS inside error reporting functionality. (Ilia)
-- Fixed many bugs in OCI8. (Tony)
-- Fixed crash and leak in mysqli when using 4.1.x client libraries and
- connecting to 5.x server. (Andrey)
-- Fixed bug #35916 (Duplicate calls to stream_bucket_append() lead to a crash).
- (Ilia)
-- Fixed bug #35908 (curl extension uses undefined GCRY_THREAD_OPTIONS_USER).
- (Ilia)
-- Fixed bug #35907 (PDO_OCI uses hardcoded lib path $ORACLE_HOME/lib). (Tony)
-- Fixed bug #35887 (wddx_deserialize not parsing dateTime fields properly).
- (Derick)
-- Fixed bug #35885 (strtotime("NOW") no longer works). (Derick)
-- Fixed bug #35821 (array_map() segfaults when exception is throwed from
- the callback). (Tony)
-- Fixed bug #35817 (unpack() does not decode odd number of hexadecimal values).
- (Ilia)
-- Fixed bug #35797 (segfault on PDOStatement::execute() with
- zend.ze1_compatibility_mode = On). (Tony, Ilia)
-- Fixed bug #35781 (stream_filter_append() can cause segfault). (Tony)
-- Fixed bug #35760 (sybase_ct doesn't compile on Solaris using old gcc). (Tony)
-- Fixed bug #35759 (mysqli_stmt_bind_result() makes huge allocation when
- column empty). (Andrey)
-- Fixed bug #35751 (using date with a timestamp makes httpd segfault). (Derick)
-- Fixed bug #35740 (memory leak when including a directory). (Tony)
-- Fixed bug #35730 (ext/mssql + freetds: Use correct character encoding
- and allow setting it). (Frank)
-- Fixed bug #35723 (xmlrpc_introspection.c fails compile per C99 std). (Jani)
-- Fixed bug #35720 (A final constructor can be overwritten). (Marcus)
-- Fixed bug #35713 (getopt() returns array with numeric strings when passed
- options like '-1'). (Tony)
-- Fixed bug #35705 (strtotime() fails to parse soap date format without TZ).
- (Ilia)
-- Fixed bug #35699 (date() can't handle leap years before 1970). (Derick)
-- Fixed bug #35694 (Improved error message for invalid fetch mode). (Ilia)
-- Fixed bug #35692 (iconv_mime_decode() segmentation fault; with libiconv
- only). (Tony)
-- Fixed bug #35690 (pack() tries to allocate huge memory block when packing
- float values to strings). (Tony)
-- Fixed bug #35669 (imap_mail_compose() crashes with
- multipart-multiboundary-email). (Ilia)
-- Fixed bug #35660 (AIX TZ variable format not understood, yields UTC
- timezone). (Derick)
-- Fixed bug #35655 (whitespace following end of heredoc is lost). (Ilia)
-- Fixed bug #35630 (strtotime() crashes on certain relative identifiers).
- (Ilia)
-- Fixed bug #35629 (crash in http:// wrapper on multiple redirects). (Ilia)
-- Fixed bug #35624 (strtotime() does not handle 3 character weekdays). (Ilia)
-- Fixed bug #35612 (iis6 Access Violation crash). (Dmitry, alacn.uhahaa)
-- Fixed bug #35594 (Multiple calls to getopt() may result in a crash).
- (rabbitt at gmail dot com, Ilia)
-- Fixed bug #35571 (Fixed crash in Apache 2 SAPI when more then one php
- script is loaded via SSI include). (Ilia)
-- Fixed bug #35570 (segfault when re-using soap client object). (Dmitry)
-- Fixed bug #35558 (mktime() interpreting 3 digit years incorrectly). (Ilia)
-- Fixed bug #35543 (php crash when calling non existing method of a class
- that extends PDO). (Tony)
-- Fixed bug #35539 (typo in error message for ErrorException). (Tony)
-- FIxed bug #35536 (mysql_field_type() doesn't handle NEWDECIMAL). (Tony)
-- Fixed bug #35517 (mysql_stmt_fetch returns NULL on data truncation). (Georg)
-- Fixed bug #35509 (string constant as array key has different behavior inside
- object). (Dmitry)
-- Fixed bug #35508 (PDO fails when unknown fetch mode specified). (Tony)
-- Fixed bug #35499 (strtotime() does not handle whitespace around the date
- string). (Ilia)
-- Fixed bug #35496 (Crash in mcrypt_generic()/mdecrypt_generic() without
- proper init). (Ilia)
-- Fixed bug #35490 (socket_sendto() unable to handle IPv6 addresses). (Tony)
-- Fixed bug #35461 (Ming extension fails to compile with ming 0.3beta1). (Jani)
-- Fixed bug #35437 (Segfault or Invalid Opcode 137/1/4). (Dmitry)
-- Fixed bug #35470 (Assigning global using variable name from array doesn't
- function). (Dmitry)
-- Fixed bug #35456 (+ 1 [time unit] format did not work). (Ilia)
-- Fixed bug #35447 (xml_parse_into_struct() chokes on the UTF-8 BOM). (Rob)
-- Fixed bug #35431 (PDO crashes when using LAZY fetch with fetchAll). (Wez)
-- Fixed bug #35430 (PDO crashes on incorrect FETCH_FUNC use). (Tony)
-- Fixed bug #35427 (str_word_count() handles '-' incorrectly). (Ilia)
-- Fixed bug #35425 (idate() function ignores timezone settings). (Ilia)
-- Fixed bug #35422 (strtotime() does not parse times with UTC as timezone).
- (Ilia)
-- Fixed bug #35414 (strtotime() no longer works with ordinal suffix). (Ilia)
-- Fixed bug #35410 (wddx_deserialize() doesn't handle large ints as keys
- properly). (Ilia)
-- Fixed bug #35409 (undefined reference to 'rl_completion_matches'). (Jani)
-- Fixed bug #35399 (Since fix of bug #35273 SOAP decoding of
- soapenc:base64binary fails). (Dmitry)
-- Fixed bug #35393 (changing static protected members from outside the class,
- one more reference issue). (Dmitry)
-- Fixed bug #35381 (ssl library is not initialized properly). (Alan)
-- Fixed bug #35377 (PDO_SQLITE: undefined reference to "fdatasync").
- (Nuno, Jani)
-- Fixed bug #35373 (HP-UX "alias not allowed in this configuration"). (Dmitry)
-- Fixed bug #35288 (iconv() function defined as libiconv()). (Nuno)
-- Fixed bug #35103 (mysqli handles bad unsigned (big)int incorrectly).(Andrey)
-- Fixed bug #35062 (socket_read() produces warnings on non blocking sockets).
- (Nuno, Ilia)
-- Fixed bug #35028 (SimpleXML object fails FALSE test). (Marcus)
-- Fixed bug #34729 (Crash in ZTS mode under Apache). (Dmitry, Zeev)
-- Fixed bug #34429 (Output buffering cannot be turned off with FastCGI).
- (Dmitry, Ilya)
-- Fixed bug #34359 (Possible crash inside fopen http wrapper). (Ilia,Sara,Nuno)
-- Fixed bug #33789 (Many Problems with SunFuncs). (Derick)
-- Fixed bug #33671 (sun_rise and sun_set don't return a GMT timestamp if one
- passes an offset). (Derick)
-- Fixed bug #32820 (date_sunrise and date_sunset don't handle GMT offset
- well). (Derick)
-- Fixed bug #31347 (is_dir and is_file (incorrectly) return true for any string
- greater then 255 characters). (Nuno,Ilia)
-- Fixed bug #30937 (date_sunrise() & date_sunset() don't handle endless
- day/night at high latitudes). (Derick)
-- Fixed bug #30760 (Remove MessageBox on win32 for E_CORE errors if
- display_startup_error is off). (Ilia)
-- Fixed bug #29955 (mb_strtoupper() / lower() broken with Turkish encoding).
- (Rui)
-- Fixed bug #28899 (mb_substr() and substr() behave differently when
- "mbstring.func_overload" is enabled). (Rui)
-- Fixed bug #27678 (number_format() crashes with large numbers). (Marcus)
-
-28 Nov 2005, PHP 5.1.1
-- Disabled native date class to prevent pear::date conflict. (Ilia)
-- Changed reflection constants be both PHP and class constants. (Johannes)
-- Added an additional field $frame['object'] to the result array of
- debug_backtrace() that contains a reference to the respective object when the
- frame was called from an object. (Sebastian)
-- Fixed bug #35423 (RecursiveDirectoryIterator doesnt appear to recurse with
- RecursiveFilterIterator). (Marcus)
-- Fixed bug #35413 (Removed -dev flag from Zend Engine version). (Ilia)
-- Fixed bug #35411 (Regression with \{$ handling). (Ilia)
-- Fixed bug #35406 (eval hangs when evall'ed code ends with comment w/o
- newline). (Marcus)
-- Fixed bug #35391 (pdo_mysql::exec does not return number of affected rows).
- (Tony)
-- Fixed bug #35382 (Comment in end of file produces fatal error). (Ilia)
-- Fixed bug #35360 (exceptions in interactive mode (php -a) may cause crash).
- (Dmitry)
-- Fixed bug #35358 (Incorrect error messages for PDO class constants). (Ilia)
-- Fixed bug #35338 (pdo_pgsql does not handle binary bound params). (Wez)
-- Fixed bug #35316 (Application exception trying to create COM object). (Rob)
-- Fixed bug #35170 (PHP_AUTH_DIGEST differs under Apache 1.x and 2.x). (Ilia)
-
-24 Nov 2005, PHP 5.1
-- Added support for class constants and static members for internal classes.
- (Dmitry, Michael Wallner)
-- Added "new_link" parameter to mssql_connect() (Bug #34369). (Frank)
-- Added missing safe_mode checks for image* functions and cURL. (Ilia)
-- Added missing safe_mode/open_basedir checks for file uploads. (Ilia)
-- Added PDO_MYSQL_ATTR_USE_BUFFERED_QUERY parameter for pdo_mysql. (Ilia)
-- Added date_timezone_set() function to set the timezone that the date
- function will use. (Derick)
-- Added pg_fetch_all_columns() function to fetch all values of a column from a
- result cursor. (Ilia)
-- Added support for LOCK_EX flag for file_put_contents(). (Ilia)
-- Added bindto socket context option. (Ilia)
-- Added offset parameter to the stream_copy_to_stream() function. (Ilia)
-- Added offset & length parameters to substr_count() function. (Ilia)
-- Added man pages for "phpize" and "php-config" scripts. (Jakub Vrana)
-- Added support for .cc files in extensions. (Brian)
-- Added PHP_INT_MAX and PHP_INT_SIZE as predefined constants. (Andrey)
-- Added user opcode API that allow overloading of opcode handlers. (Dmitry)
-- Added an optional remove old session parameter to session_regenerate_id().
- (Ilia)
-- Added array type hinting. (Dmitry)
-- Added the tidy_get_opt_doc() function to return documentation for
- configuration options in tidy. (Patch by: nlopess@php.net)
-- Added support for .cc files in extensions. (Brian)
-- Added imageconvolution() function which can be used to apply a custom 3x3
- matrix convolution to an image. (Pierre)
-- Added optional first parameter to XsltProcessor::registerPHPFunctions to
- only allow certain functions to be called from XSLT. (Christian)
-- Added the ability to override the autotools executables used by the
- buildconf script via the PHP_AUTOCONF and PHP_AUTOHEADER environmental
- variables. (Jon)
-- Added several new functions to support the PostgreSQL v3 protocol introduced
- in PostgreSQL 7.4. (Christopher)
- . pg_transaction_status() - in-transaction status of a database connection.
- . pg_query_params() - execution of parameterized queries.
- . pg_prepare() - prepare named queries.
- . pg_execute() - execution of named prepared queries.
- . pg_send_query_params() - async equivalent of pg_query_params().
- . pg_send_prepare() - async equivalent of pg_prepare().
- . pg_send_execute() - async equivalent of pg_execute().
- . pg_result_error_field() - highly detailed error information, most
- importantly
- the SQLSTATE error code.
- . pg_set_error_verbosity() - set verbosity of errors.
-- Added optional fifth parameter "count" to preg_replace_callback() and
- preg_replace() to count the number of replacements made. FR #32275. (Andrey)
-- Added optional third parameter "charlist" to str_word_count() which contains
- characters to be considered as word part. FR #31560. (Andrey, Ilia)
-- Added interface Serializable. (Stanislav, Marcus)
-- Added pg_field_type_oid() PostgreSQL function. (mauroi at digbang dot com)
-- Added zend_declare_property_...() and zend_update_property_...() API
- functions for bool, double and binary safe strings. (Hartmut)
-- Added possibility to access INI variables from within .ini file. (Andrei)
-- Added variable $_SERVER['REQUEST_TIME'] containing request start time.
- (Ilia)
-- Added optional float parameter to gettimeofday(). (Ilia)
-- Added apache_reset_timeout() Apache1 function. (Rasmus)
-- Added sqlite_fetch_column_types() 3rd argument for arrays. (Ilia)
-- Added optional offset parameter to stream_get_contents() and
- file_get_contents(). (Ilia)
-- Added optional maxlen parameter to file_get_contents(). (Ilia)
-- Added SAPI hook to get the current request time. (Rasmus)
-- Added new functions:
- . array_diff_key() (Andrey)
- . array_diff_ukey() (Andrey)
- . array_intersect_key() (Christiano Duarte)
- . array_intersect_ukey() (Christiano Duarte)
- . array_product() (Andrey)
- . DomDocumentFragment::appendXML() (Christian)
- . fputcsv() (David Sklar)
- . htmlspecialchars_decode() (Ilia)
- . inet_pton() (Sara)
- . inet_ntop() (Sara)
- . mysqli::client_info property (Georg)
- . posix_access() (Magnus)
- . posix_mknod() (Magnus)
- . SimpleXMLElement::registerXPathNamespace() (Christian)
- . stream_context_get_default() (Wez)
- . stream_socket_enable_crypto() (Wez)
- . stream_wrapper_unregister() (Sara)
- . stream_wrapper_restore() (Sara)
- . stream_filter_remove() (Sara)
- . time_sleep_until() (Ilia)
-- Added DomDocument::$recover property for parsing not well-formed XML
- Documents. (Christian)
-- Added Cursor support for MySQL 5.0.x in mysqli (Georg)
-- Added proxy support to ftp wrapper via http. (Sara)
-- Added MDTM support to ftp_url_stat. (Sara)
-- Added zlib stream filter support. (Sara)
-- Added bz2 stream filter support. (Sara)
-- Added max_redirects context option that specifies how many HTTP
- redirects to follow. (Ilia)
-- Added support of parameter=>value arrays to
- xsl_xsltprocessor_set_parameter(). (Tony)
-
-- PHP extension loading mechanism with support for module
- dependencies and conflicts. (Jani, Dmitry)
-- Improved interactive mode of PHP CLI (php -a). (Johannes, Marcus)
-- Improved performance of:
- . general execution/compilation. (Andi, Thies, Sterling, Dmitry, Marcus)
- . switch() statement. (Dmitry)
- . several array functions. (Marcus)
- . virtual path handling by adding a realpath() cache. (Andi)
- . variable fetches. (Andi)
- . magic method invocations. (Marcus)
-- Improved support for embedded server in mysqli. (Georg)
-- Improved mysqli extension. (Georg)
- . added constructor for mysqli_stmt and mysqli_result classes
- . added new function mysqli_get_charset()
- . added new function mysqli_set_charset()
- . added new class mysqli_driver
- . added new class mysqli_warning
- . added new class mysqli_exception
- . added new class mysqli_sql_exception
-- Improved SPL extension. (Marcus)
- . Moved RecursiveArrayIterator from examples into extension
- . Moved RecursiveFilterIterator from examples into extension
- . Added SplObjectStorage
- . Made all SPL constants class constants
- . Renamed CachingRecursiveIterator to RecursiveCachingIterator to follow
- Recursive<*>Iterator naming scheme.
- . added standard hierarchy of Exception classes
- . added interface Countable
- . added interfaces Subject and SplObserver
- . added spl_autoload*() functions
- . converted several 5.0 examples into c code
- . added class SplFileObject
- . added possibility to use a string with class_parents() and
- class_implements(). (Andrey)
-
-- Changed type hints to allow "null" as default value for class and array.
- (Marcus, Derick, Dmitry)
-- Changed SQLite extension to be a shared module in Windows distribution.
- (Edin)
-- Changed "instanceof" and "catch" operators, is_a() and is_subclass_of()
- functions to not call __autoload(). (Dmitry)
-- Changed sha1_file() and md5_file() functions to use streams instead of low
- level IO. (Uwe)
-- Changed abstract private methods to be not allowed anymore. (Stas)
-- Changed stream_filter_(ap|pre)pend() to return resource. (Sara)
-- Changed mysqli_exception and sqlite_exception to use RuntimeException as
- base if SPL extension is present. (Georg, Marcus)
-
-- Upgraded bundled libraries:
- . PCRE library to version 6.2. (Andrei)
- . SQLite 3 library in ext/pdo_sqlite to 3.2.7. (Ilia)
- . SQLite 2 library in ext/sqlite to 2.8.16. (Ilia)
-- Upgraded bundled libraries in Windows distribution. (Edin)
- . zlib 1.2.3
- . curl 7.14.0
- . openssl 0.9.8
- . ming 0.3b
- . libpq (PostgreSQL) 8.0.1
-
-- Implemented feature request #33452 (Year belonging to ISO week). (Derick)
-- Allowed return by reference from internal functions. (Marcus, Andi, Dmitry)
-- Rewrote strtotime() with support for timezones and many new formats.
- Implements feature requests #21399, #26694, #28088, #29150, #29585 and
- #29595. (Derick)
-
-- Moved extensions to PECL:
- . ext/cpdf (Tony, Derick)
- . ext/dio (Jani, Derick)
- . ext/fam (Jani, Derick)
- . ext/ingres_ii (Jani, Derick)
- . ext/mnogosearch (Jani, Derick)
- . ext/w32api (Jani, Derick)
- . ext/yp (Jani, Derick)
- . ext/mcve (Jani, Derick, Pierre)
- . ext/oracle (Jani, Derick)
- . ext/ovrimos (Jani, Derick, Pierre)
- . ext/pfpro (Jani, Derick, Pierre)
- . ext/dbx (Jani, Derick)
- . ext/ircg (Jani, Derick)
-
-- Removed php_check_syntax() function which never worked properly. (Ilia)
-- Removed garbage manager in Zend Engine which results in more aggressive
- freeing of data. (Dmitry, Andi)
-
-- Fixed "make test" to work for phpized extensions. (Hartmut, Jani)
-- Fixed Apache 2 regression with sub-request handling on non-linux systems.
- (Ilia, Tony)
-- Fixed PDO shutdown problem (possible infinite loop running rollback on
- shutdown). (Wez)
-- Fixed PECL bug #3714 (PDO: beginTransaction doesn't work if you're in
- auto-commit mode). (Wez)
-- Fixed ZTS destruction. (Marcus)
-- Fixed __get/__set to allow recursive calls for different properties. (Dmitry)
-- Fixed a bug where stream_get_meta_data() did not return the "uri" element
- for files opened with tmpname(). (Derick)
-- Fixed a problem with SPL iterators aggregating the inner iterator. (Marcus)
-- Fixed an error in mysqli_fetch_fields (returned NULL instead of an array
- when row number > field_count). (Georg)
-- Fixed bug in mysql::client_version(). (Georg)
-- Fixed bug in mysqli extension with unsigned int(11) being represented as
- signed integer in PHP instead of string in 32bit systems. (Andrey)
-- Fixed bug with $HTTP_RAW_POST_DATA not getting set. (Brian)
-- Fixed crash inside stream_get_line() when length parameter equals 0. (Ilia)
-- Fixed ext/mysqli to allocate less memory when fetching bound params of type
- (MEDIUM|LONG)BLOB/(MEDIUM|LONG)TEXT. (Andrey)
-- Fixed extension initialization to respect dependencies between extensions.
- (Wez)
-- Fixed failing queries (FALSE returned) with mysqli_query() on 64 bit systems.
- (Andrey)
-- Fixed fgetcsv() and fputcsv() inconsistency. (Dmitry)
-- Fixed inheritance check to control return by reference and pass by
- reference correctly (ArrayAccess can no longer support references correctly).
- (Marcus, Andi, Dmitry)
-- Fixed initializing and argument checking for posix_mknod(). (Derick)
-- Fixed memory corruption in ImageTTFText() with 64bit systems. (Andrey)
-- Fixed memory corruption in pg_copy_from() in case the as_null parameter was
- passed. (Derick)
-- Fixed memory corruption in stristr(). (Derick)
-- Fixed possible GLOBALS variable override when register_globals are ON.
- (Ilia, Stefan)
-- Fixed possible INI setting leak via virtual() in Apache 2 sapi. (Ilia)
-- Fixed possible register_globals toggle via parse_str(). (Ilia, Stefan)
-- Fixed potential GLOBALS overwrite via import_request_variables() and
- possible crash and/or memory corruption. (Ilia)
-- Fixed segfaults when CURL callback functions throw exception. (Tony)
-- Fixed support for shared extensions on AIX. (Dmitry)
-- Fixed bug #35342 (isset(DOMNodeList->length) returns false). (Rob)
-- Fixed bug #35341 (Fix for bug #33760 breaks build with older curl). (Tony)
-- Fixed bug #35336 (crash on PDO::FETCH_CLASS + __set()). (Tony)
-- Fixed bug #35303 (PDO prepare() crashes with invalid parameters). (Ilia)
-- Fixed bug #35293 (PDO segfaults when using persistent connections). (Tony)
-- Fixed bug #35278 (Multiple virtual() calls crash Apache 2 php module). (Ilia)
-- Fixed bug #35273 (Error in mapping soap - java types). (Dmitry)
-- Fixed bug #35249 (compile failure when ext/readline is compiled as shared).
- (Jani)
-- Fixed bug #35248 (sqlite_query() doesn't set error_msg when return value is
- being used). (Ilia)
-- Fixed bug #35243 (php_mblen() crashes when compiled with thread-safety on
- Linux). (Patch: shulmanb at il dot ibm dot com, Jani)
-- Fixed bug #35239 (Objects can lose references). (Dmitry)
-- Fixed bug #35229 (call_user_func() crashes when argument_stack is nearly
- full). (Dmitry)
-- Fixed bug #35197 (Destructor is not called). (Tony)
-- Fixed bug #35179 (tokenizer extension needs T_HALT_COMPILER). (Greg)
-- Fixed bug #35176 (include()/require()/*_once() produce wrong error messages
- about main()). (Dmitry)
-- Fixed bug #35147 (__HALT_COMPILER() breaks with --enable-zend-multibyte).
- (Dmitry, Moriyoshi)
-- Fixed bug #35143 (gettimeofday() ignores current time zone). (Derick)
-- Fixed bug #35142 (SOAP Client/Server Complex Object Support). (Dmitry)
-- Fixed bug #35135 (PDOStatment without related PDO object may crash). (Ilia)
-- Fixed bug #35091 (SoapClient leaks memory). (Dmitry)
-- Fixed bug #35079 (stream_set_blocking(true) toggles, not enables blocking).
- (askalski at gmail dot com, Tony)
-- Fixed bug #35078 (configure does not find ldap_start_tls_s). (Jani)
-- Fixed bug #35046 (phpinfo() uses improper css enclosure). (Ilia)
-- Fixed bugs #35022, #35019 (Regression in the behavior of key() and
- current() functions). (Ilia)
-- Fixed bug #35017 (Exception thrown in error handler may cause unexpected
- behavior). (Dmitry)
-- Fixed bug #35014 (array_product() always returns 0). (Ilia)
-- Fixed bug #35009 (ZTS: Persistent resource destruct crashes when extension
- is compiled as shared). (Dmitry)
-- Fixed bug #34996 (ImageTrueColorToPalette() crashes when ncolors is zero).
- (Tony)
-- Fixed bug #34982 (array_walk_recursive() modifies elements outside function
- scope). (Dmitry)
-- Fixed bug #34977 (Compile failure on MacOSX due to use of varargs.h). (Tony)
-- Fixed bug #34968 (bz2 extension fails on to build on some win32 setups).
- (Ilia)
-- Fixed bug #34965 (tidy is not binary safe). (Mike)
-- Fixed bug #34957 (PHP doesn't respect ACLs for access checks). (Wez)
-- Fixed bug #34950 (Unable to get WSDL through proxy). (Dmitry)
-- Fixed bug #34938 (dns_get_record() doesn't resolve long hostnames and
- leaks). (Tony)
-- Fixed bug #34905 (Digest authentication does not work with Apache 1). (Ilia)
-- Fixed bug #34902 (mysqli::character_set_name() - undefined method). (Tony)
-- Fixed bug #34899 (Fixed sqlite extension compile failure). (Ilia)
-- Fixed bug #34893 (PHP5.1 overloading, Cannot access private property).
- (Dmitry)
-- Fixed bug #34884 (Possible crash in ext/sqlite when sqlite.assoc_case is
- being used). (Tony, Ilia)
-- Fixed bug #34879 (str_replace, array_map corrupt negative array indexes on
- 64-bit platforms). (Dmitry)
-- Fixed bug #34873 (Segmentation Fault on foreach in object). (Dmitry)
-- Fixed bug #34856 (configure fails to detect libiconv's type). (Tony)
-- Fixed bug #34855 (ibase_service_attach() segfault on AMD64).
- (irie at gmx dot de, Tony)
-- Fixed bug #34851 (SO_RECVTIMEO and SO_SNDTIMEO socket options expect
- integer parameter on Windows). (Mike)
-- Fixed bug #34850 (--program-suffix and --program-prefix not included in
- man page names). (Jani)
-- Fixed bug #34821 (zlib encoders fail on widely varying binary data on
- windows). (Mike, Ilia)
-- Fixed bug #34818 (several functions crash when invalid mysqli_link object
- is passed). (Tony)
-- Fixed bug #34810 (mysqli::init() and others use wrong $this pointer without
- checks). (Tony)
-- Fixed bug #34809 (FETCH_INTO in PDO crashes without a destination object).
- (Ilia)
-- Fixed bug #34802 (Fixed crash on object instantiation failure). (Ilia)
-- Fixed bug #34796 (missing SSL linking in ext/ftp when configured as shared).
- (Jani)
-- Fixed bug #34790 (preg_match_all(), named capturing groups, variable
- assignment/return => crash). (Dmitry)
-- Fixed bug #34788 (SOAP Client not applying correct namespace to generated
- values). (Dmitry)
-- Fixed bug #34787 (SOAP Client not handling boolean types correctly). (Dmitry)
-- Fixed bug #34786 (2 @ results in change to error_reporting() to random
- value) (Dmitry, Tony)
-- Fixed bug #34785 (subclassing of mysqli_stmt does not work). (Georg)
-- Fixed bug #34782 (token_get_all() gives wrong result). (Dmitry)
-- Fixed bug #34777 (Crash in dblib when fetching non-existent error info).
- (Ilia)
-- Fixed bug #34771 (strtotime() fails with 1-12am/pm). (Derick)
-- Fixed bug #34767 (Zend Engine 1 Compatibility not copying objects
- correctly). (Dmitry)
-- Fixed bug #34758 (PDO_DBLIB did not implement rowCount()). (Ilia)
-- Fixed bug #34757 (iconv_substr() gives "Unknown error" when offset > string
- length). (Tony)
-- Fixed bug #34742 (ftp wrapper failures caused from segmented command
- transfer). (Ilia)
-- Fixed bug #34725 (CLI segmentation faults during cleanup). (Dmitry)
-- Fixed bug #34723 (array_count_values() strips leading zeroes). (Tony)
-- Fixed bug #34712 (zend.ze1_compatibility_mode = on segfault). (Dmitry)
-- Fixed bug #34704 (Infinite recursion due to corrupt JPEG). (Marcus)
-- Fixed bug #34678 (__call(), is_callable() and static methods). (Dmitry)
-- Fixed bug #34676 (missing support for strtotime("midnight") and
- strtotime("noon")). (Derick)
-- Fixed bug #34645 (ctype corrupts memory when validating large numbers).
- (Ilia)
-- Fixed bug #34643 (wsdl default value has no effect). (Dmitry)
-- Fixed bug #34623 (Crash in pdo_mysql on longtext fields). (Ilia)
-- Fixed bug #34617 (zend_deactivate: objects_store used after
- zend_objects_store_destroy is called). (Dmitry)
-- Fixed bug #34590 (User defined PDOStatement class can't implement
- methods). (Marcus)
-- Fixed bug #34584 (Segfault with SPL autoload handler). (Marcus)
-- Fixed bug #34581 (crash with mod_rewrite). (Tony, Ilia)
-- Fixed bug #34565 (mb_send_mail does not fetch
- mail.force_extra_parameters). (Marco, Ilia)
-- Fixed bug #34557 (php -m exits with "error" 1). (Johannes)
-- Fixed bug #34518 (Unset doesn't separate container in CV). (Dmitry)
-- Fixed bug #34505 (Possible memory corruption when unmangling properties
- with empty names). (Tony)
-- Fixed bug #34478 (Incorrect parsing of url's fragment (#...)). (Dmitry)
-- Fixed bug #34467 (foreach + __get + __set inconsistency). (Dmitry)
-- Fixed bug #34456 (Possible crash inside pspell extension). (Ilia)
-- Fixed bug #34453 (parsing http://www.w3.org/2001/xml.xsd exception). (Dmitry)
-- Fixed bug #34450 (Segfault when calling mysqli_close() in destructor). (Tony)
-- Fixed bug #34449 (ext/soap: XSD_ANYXML functionality not exposed). (Dmitry)
-- Fixed bug #34420 (Possible crash inside curl_multi_remove_handle()). (Ilia)
-- Fixed bug #34358 (Fatal error: Cannot re-assign $this). (Dmitry)
-- Fixed bug #34331 (php crashes when variables_order is empty). (Ilia)
-- Fixed bug #34321 (Possible crash in filter code). (Ilia)
-- Fixed bug #34311 (unserialize() crashes with chars above 191 dec). (Nuno)
-- Fixed bug #34310 (foreach($arr as $c->d => $x) crashes). (Dmitry)
-- Fixed bug #34307 (on_modify handler not called to set the default value if
- setting from php.ini was invalid). (Andrei)
-- Fixed bug #34306 (wddx_serialize_value() crashes with long array keys).
- (Jani)
-- Fixed bug #34304 (date() doesn't have a modifier for ISO Week Day). (Derick)
-- Fixed bug #34302 (date('W') do not return leading zeros for week 1 to 9).
- (Derick)
-- Fixed bug #34299 (ReflectionClass::isInstantiable() returns true for abstract
- classes). (Marcus)
-- Fixed bug #34284 (CLI phpinfo showing html on _SERVER["argv"]). (Jani)
-- Fixed bug #34277 (array_filter() crashes with references and objects).
- (Dmitry)
-- Fixed bug #34276 (setAttributeNS doesn't work with default namespace).
- (Rob)
-- Fixed bug #34260 (Segfault with callbacks (array_map) + overloading).
- (Dmitry)
-- Fixed bug #34257 (lib64 not handled correctly in ming extension). (Marcus)
-- Fixed bug #34221 (Compiling xmlrpc as shared fails other parts). (Jani)
-- Fixed bug #34216 (Segfault with autoload). (Marcus)
-- Fixed bug #34199 (if($obj)/if(!$obj) inconsistency because of cast handler).
- (Dmitry, Alex)
-- Fixed bug #34191 (ob_gzhandler does not enforce trailing \0). (Ilia)
-- Fixed bug #34156 (memory usage remains elevated after memory limit is
- reached). (Ilia)
-- Fixed bug #34148 (+,- and . not supported as parts of scheme). (Ilia)
-- Fixed bug #34137 (assigning array element by reference causes binary mess).
- (Dmitry)
-- Fixed bug #34103 (line numbering not maintained in dom document). (Rob)
-- Fixed bug #34078 (Reflection API problems in methods with boolean or
- null default values). (Tony)
-- Fixed bug #34068 (Numeric string as array key not cast to integer in
- wddx_deserialize()). (Ilia)
-- Fixed bug #34064 (arr[] as param to function in class gives invalid
- opcode). (Dmitry)
-- Fixed bug #34062 (Crash in catch block when many arguments are used).
- (Dmitry)
-- Fixed bug #34052 (date('U') returns %ld not unix timestamp). (Nuno)
-- Fixed bug #34045 (Buffer overflow with serialized object). (Dmitry)
-- Fixed bug #34001 (pdo_mysql truncates numeric fields at 4 chars). (Ilia)
-- Fixed bug #33999 (object remains object when cast to int). (Dmitry)
-- Fixed bug #33996 (No information given for fatal error on passing invalid
- value to typed argument). (Dmitry)
-- Fixed bug #33989 (extract($GLOBALS,EXTR_REFS) crashes PHP). (Dmitry)
-- Fixed bug #33987 (php script as ErrorDocument causes crash in Apache 2).
- (Ilia)
-- Fixed bug #33967 (misuse of Exception constructor doesn't display
- errorfile). (Jani)
-- Fixed bug #33966 (Wrong use of reflectionproperty causes a segfault). (Tony)
-- Fixed bug #33963 (mssql_bind() fails on input parameters). (Frank)
-- Fixed bug #33958 (duplicate cookies and magic_quotes=off may cause a crash).
- (Ilia)
-- Fixed bug #33957 (gmdate('W')/date('W') sometimes returns wrong week number).
- (Derick)
-- Fixed bug #33940 (array_map() fails to pass by reference when called
- recursively). (Dmitry)
-- Fixed bug #33917 (number_format() output with > 1 char separators). (Jani)
-- Fixed bug #33904 (input array keys being escaped when magic quotes is off).
- (Ilia)
-- Fixed bug #33903 (spl_autoload_register class method). (Marcus)
-- Fixed bug #33899 (CLI: setting extension_dir=some/path extension=foobar.so
- does not work). (Jani)
-- Fixed bug #33882 (CLI was looking for php.ini in wrong path). (Hartmut)
-- Fixed bug #33869 (strtotime() problem with "+1days" format). (Ilia)
-- Fixed bug #33841 (pdo sqlite driver forgets to update affected column
- count on execution of prepared statments). (Ilia)
-- Fixed bug #33837 (Informix ESQL version numbering schema changed). (Jani)
-- Fixed bug #33829 (mime_content_type() returns text/plain for gzip and bzip
- files). (Derick)
-- Fixed bug #33802 (throw Exception in error handler causes crash). (Dmitry)
-- Fixed bug #33771 (error_reporting falls to 0 when @ was used inside
- try/catch block). (Tony)
-- Fixed bug #33760 (cURL needs to implement CRYPTO_callback functions to
- prevent locking). (Mike, Ilia)
-- Fixed bug #33732 (Wrong behavior of constants in class and interface
- extending). (Dmitry)
-- Fixed bug #33723 (php_value overrides php_admin_value). (Dmitry)
-- Fixed bug #33720 (mb_encode_mimeheader does not work for multibyte
- chars). (Rui)
-- Fixed bug #33710 (ArrayAccess objects does not initialize $this). (Dmitry)
-- Fixed bug #33690 (Crash setting some ini directives in httpd.conf). (Rasmus)
-- Fixed bug #33673 (Added detection for partially uploaded files). (Ilia)
-- Fixed bug #33605 (substr_compare() crashes with negative offset and length).
- (Tony)
-- Fixed bug #33597 (setcookie() "expires" date format doesn't comply with RFC).
- (Tony)
-- Fixed bug #33588 (LDAP: RootDSE query not possible). (Jani)
-- Fixed bug #33578 (strtotime() problem with "Oct17" format). (Derick)
-- Fixed bug #33578 (strtotime() doesn't understand "11 Oct" format). (Derick)
-- Fixed bug #33562 (date("") crashes). (Derick)
-- Fixed bug #33558 (warning with nested calls to functions returning by
- reference). (Dmitry)
-- Fixed bug #33536 (strtotime() defaults to now even on non time string).
- (Derick)
-- Fixed bug #33532 (Different output for strftime() and date()). (Derick)
-- Fixed bug #33523 (Memory leak in xmlrpc_encode_request()). (Ilia)
-- Fixed bug #33520 (crash if safe_mode is on and session.save_path is changed).
- (Dmitry)
-- Fixed bug #33512 (Add missing support for isset()/unset() overloading to
- complement the property get/set methods). (Dmitry)
-- Fixed bug #33491 (crash after extending MySQLi internal class). (Tony)
-- Fixed bug #33475 (cURL handle is not closed on curl_close(). (Ilia)
-- Fixed bug #33469 (Compile error undefined reference to ifx_checkAPI). (Jani)
-- Fixed bug #33433 (strtoll not available on Tru64). (Jani, Derick)
-- Fixed bug #33427 (ext/odbc: check if unixODBC header file exists). (Jani)
-- Fixed bug #33415 (strtotime() related bugs). (Derick)
-- Fixed bug #33414 (Comprehensive list of incorrect days returned after
- strtotime() / date() tests). (Derick)
-- Fixed bug #33389 (double free() when exporting a ReflectionClass). (Marcus)
-- Fixed bug #33383 (crash when retrieving empty LOBs). (Tony)
-- Fixed bug #33382 (array_reverse() fails after *sort()), introduced by
- zend_hash_sort() optimizations in HEAD. (Tony)
-- Fixed bug #33340 (CLI Crash when calling php:function from XSLT). (Rob)
-- Fixed bug #33326 (Cannot build extensions with phpize on Macosx). (Jani)
-- Fixed bug #33318 (throw 1; results in Invalid opcode 108/1/8). (Dmitry)
-- Fixed bug #33312 (ReflectionParameter methods do not work correctly).
- (Dmitry)
-- Fixed bug #33299 (php:function no longer handles returned dom objects).
- (Rob, Joe Orton)
-- Fixed bug #33286 (nested array_walk() calls and user array compare functions
- broken; FCI cache). (Andrei, patch from m.bretz@metropolis-ag.de)
-- Fixed bug #33277 (private method accessed by child class). (Dmitry)
-- Fixed bug #33268 (iconv_strlen() works only with a parameter of < 3 in
- length). (Ilia)
-- Fixed bug #33257 (array_splice() inconsistent when passed function instead of
- variable). (Dmitry)
-- Fixed bug #33243 (ze1_compatibility_mode does not work as expected). (Dmitry)
-- Fixed bug #33242 (Mangled error message when stream fails). (Derick)
-- Fixed bug #33222 (segfault when CURL handle is closed in a callback). (Tony)
-- Fixed bug #33214 (odbc_next_result does not signal SQL errors with
- 2-statement SQL batches). (rich at kastle dot com, Tony)
-- Fixed bug #33212 ([GCC 4]: 'zend_error_noreturn' aliased to external symbol
- 'zend_error'). (Dmitry)
-- Fixed bug #33210 (relax jpeg recursive loop protection). (Ilia)
-- Fixed bug #33201 (Crash when fetching some data types). (Frank)
-- Fixed bug #33200 (preg_replace(): magic_quotes_sybase=On makes 'e' modifier
- misbehave). (Jani)
-- Fixed bug #33185 (--enable-session=shared does not build). (Jani)
-- Fixed bug #33171 (foreach enumerates private fields declared in base
- classes). (Dmitry)
-- Fixed bug #33167 (Possible crash inside pg_fetch_array()). (Ilia)
-- Fixed bug #33164 (Soap extension incorrectly detects HTTP/1.1). (Ilia)
-- Fixed bug #33156 (cygwin version of setitimer doesn't accept ITIMER_PROF).
- (Nuno)
-- Fixed bug #33153 (crash in mssql_next result). (Frank)
-- Fixed bug #33150 (shtool: insecure temporary file creation). (Jani)
-- Fixed bug #33136 (method offsetSet in class extended from ArrayObject crash
- PHP). (Marcus)
-- Fixed bug #33125 (imagecopymergegray() produces mosaic rainbow effect).
- (Pierre)
-- Fixed bug #33116 (crash when assigning class name to global variable in
- __autoload). (Dmitry)
-- Fixed bug #33090 (mysqli_prepare() doesn't return an error). (Georg)
-- Fixed bug #33076 (str_ireplace() incorrectly counts result string length
- and may cause segfault). (Tony)
-- Fixed bug #33072 (Add a safemode/open_basedir check for runtime
- "session.save_path" change using session_save_path() function). (Rasmus)
-- Fixed bug #33070 (Improved performance of bzdecompress() by several orders
- of magnitude). (Ilia)
-- Fixed bug #33059 (crash when moving xml attribute set in dtd). (Ilia)
-- Fixed bug #33057 (Don't send extraneous entity-headers on a 304 as per
- RFC 2616 section 10.3.5) (Rasmus, Choitel)
-- Fixed bug #33019 (socket errors cause memory leaks in php_strerror()).
- (jwozniak23 at poczta dot onet dot pl, Tony).
-- Fixed bug #33017 ("make distclean" gives an error with VPATH build). (Jani)
-- Fixed bug #33013 ("next month" was handled wrong while parsing dates).
- (Derick)
-- Fixed bug #32993 (implemented Iterator function current() don't throw
- exception). (Dmitry)
-- Fixed bug #32981 (ReflectionMethod::getStaticVariables() causes apache2.0.54
- seg fault). (Dmitry)
-- Fixed bug #32956 (mysql_bind_result() doesn't support MYSQL_TYPE_NULL).
- (Georg)
-- Fixed bug #32947 (Incorrect option for mysqli default password). (Georg)
-- Fixed bug #32944 (Disabling session.use_cookies doesn't prevent reading
- session cookies). (Jani, Tony)
-- Fixed bug #32941 (Sending structured SOAP fault kills a php). (Dmitry)
-- Fixed bug #32937 (open_basedir looses trailing / in the limiter).
- (Adam Conrad)
-- Fixed bug #32936 (http redirects URLs are not checked for control chars).
- (Ilia)
-- Fixed bug #32933 (Cannot extend class "SQLiteDatabase"). (Marcus)
-- Fixed bug #32932 (Oracle LDAP: ldap_get_entries(), invalid pointer). (Jani)
-- Fixed bug #32930 (class extending DOMDocument doesn't clone properly). (Rob)
-- Fixed bug #32924 (file included with "auto_prepend_file" can be included
- with require_once() or include_once()). (Stas)
-- Fixed bug #32904 (pg_get_notify() ignores result_type parameter). (Tony)
-- Fixed bug #32852 (Crash with singleton and __destruct when
- zend.ze1_compatibility_mode = On). (Dmitry)
-- Fixed bug #32833 (Invalid opcode). (Dmitry)
-- Fixed bug #32813 (parse_url() does not handle scheme-only urls properly).
- (Ilia)
-- Fixed bug #32810 (temporary files not using plain file wrapper). (Ilia)
-- Fixed bug #32809 (Missing T1LIB support on Windows). (Edin)
-- Fixed bug #32802 (General cookie overrides more specific cookie). (Ilia)
-- Fixed bugs #32800, #32830 (ext/odbc: Problems with 64bit systems). (Jani)
-- Fixed bug #32799 (crash: calling the corresponding global var during the
- destruct). (Dmitry)
-- Fixed bug #32776 (SOAP doesn't support one-way operations). (Dmitry)
-- Fixed bug #32773 (GMP functions break when second parameter is 0). (Stas)
-- Fixed bug #32759 (incorrect determination of default value (COM)). (Wez)
-- Fixed bug #32758 (Cannot access safearray properties in VB6 objects). (Wez)
-- Fixed bug #32755 (Segfault in replaceChild() when DocumentFragment has no
- children). (Rob)
-- Fixed bug #32753 (Undefined constant SQLITE_NOTADB). (Ilia)
-- Fixed bug #32742 (segmentation fault when the stream with a wrapper
- is not closed). (Tony, Dmitry)
-- Fixed bug #32699 (pg_affected_rows() was defined when it was not available).
- (Derick)
-- Fixed bug #32686 (Require/include file in destructor causes segfault).
- (Marcus)
-- Fixed bug #32682 (ext/mssql: Error on module shutdown when called from
- activescript). (Frank)
-- Fixed bug #32674 (exception in iterator causes crash). (Dmitry)
-- Fixed bug #32660 (Assignment by reference causes crash when field access is
- overloaded (__get)). (Dmitry)
-- Fixed bug #32647 (Using register_shutdown_function() with invalid callback
- can crash PHP). (Jani)
-- Fixed bug #32615 (Segfault in replaceChild() using fragment when
- previousSibling is NULL). (Rob)
-- Fixed bug #32613 (ext/snmp: use of snmp_shutdown() causes snmpapp.conf
- access errors). (Jani, ric at arizona dot edu)
-- Fixed bug #32608 (html_entity_decode() converts single quotes even if
- ENT_NOQUOTES is given). (Ilia)
-- Fixed bug #32596 (Segfault/Memory Leak by getClass (etc) in __destruct).
- (Dmitry)
-- Fixed bug #32591 (ext/mysql: Unsatisfied symbol: ntohs with HP-UX). (Jani)
-- Fixed bug #32589 (possible crash inside imap_mail_compose() function).
- (Ilia)
-- Fixed bug #32589 (Possible crash inside imap_mail_compose, with charsets).
- (Ilia)
-- Fixed bug #32587 (Apache2: errors sent to error_log do not include
- timestamps). (Jani)
-- Fixed bug #32560 (configure looks for incorrect db2 library). (Tony)
-- Fixed bug #32553 (mmap loads only the 1st 2000000 bytes on Win32). (Ilia)
-- Fixed bug #32533 (proc_get_status() returns the incorrect process status).
- (Ilia)
-- Fixed bug #32530 (chunk_split() does not append endstr if chunklen is
- longer then the original string). (Ilia)
-- Fixed bug #32491 (File upload error - unable to create a temporary file).
- (Uwe Schindler)
-- Fixed bug #32455 (wrong setting property to unset value). (Dmitry)
-- Fixed bug #32429 (method_exists() always return TRUE if __call method
- exists). (Dmitry)
-- Fixed bug #32428 (The @ warning error suppression operator is broken).
- (Dmitry)
-- Fixed bug #32427 (Interfaces are not allowed 'static' access modifier).
- (Dmitry)
-- Fixed bug #32405 (mysqli::fetch() returns bad data - 64bit problem).
- (Andrey)
-- Fixed bug #32296 (get_class_methods() output has changed between 5.0.2 and
- 5.0.3). (Dmitry)
-- Fixed bug #32282 (Segfault in mysqli_fetch_array on 64-bit). (Georg)
-- Fixed bug #32245 (xml_parser_free() in a function assigned to the xml
- parser gives a segfault). (Rob)
-- Fixed bug #32179 (xmlrpc_encode() segfaults with recursive references).
- (Tony)
-- Fixed bug #32171 (Userspace stream wrapper crashes PHP). (Tony, Dmitry)
-- Fixed bug #32160 (copying a file into itself leads to data loss). (Ilia)
-- Fixed bug #32139 (SOAP client does not auto-handle base64 encoding). (Ilia)
-- Fixed bug #32109 ($_POST is not populated in multi-threaded environment).
- (Moriyoshi)
-- Fixed bug #32080 (segfault when assigning object to itself with
- zend.ze1_compatibility_mode=On). (Dmitry)
-- Fixed bug #32021 (Crash caused by range('', 'z')). (Derick)
-- Fixed bug #32013 (ext/mysqli bind_result causes fatal error: memory limit).
- (Andrey)
-- Fixed bug #32010 (Memory leak in mssql_fetch_batch). (fmk)
-- Fixed bug #32009 (crash when mssql_bind() is called more than once). (Frank)
-- Fixed bug #31971 (ftp_login fails on some SSL servers).
- (frantisek at augusztin dot com)
-- Fixed bug #31887 (ISAPI: Custom 5xx error does not return correct HTTP
- response message). (Jani)
-- Fixed bug #31828 (Crash with zend.ze1_compatibility_mode=On). (Dmitry)
-- Fixed bug #31668 (multi_query works exactly every other time - multi query
- d/e flag global and not per connection). (Andrey)
-- Fixed bug #31636 (another crash when echoing a COM object). (Wez)
-- Fixed bug #31583 (php_std_date() uses short day names in non-y2k_compliance
- mode). (mike at php dot net)
-- Fixed bug #31525 (object reference being dropped. $this getting lost).
- (Stas, Dmitry)
-- Fixed bug #31502 (Wrong deserialization from session when using WDDX
- serializer). (Dmitry)
-- Fixed bug #31478 (segfault with empty() / isset()). (Moriyoshi)
-- Fixed bug #31465 (False warning in unpack() when working with *). (Ilia)
-- Fixed bug #31363 (broken non-blocking flock()). (ian at snork dot net)
-- Fixed bug #31358 (Older GCC versions do not provide portable va_copy()).
- (Jani)
-- Fixed bug #31341 (escape on curly inconsistent). (Dmitry)
-- Fixed bug #31256 (PHP_EVAL_LIBLINE configure macro does not handle
- -pthread). (Jani)
-- Fixed bug #31213 (Side effects caused by fix of bug #29493). (Dmitry)
-- Fixed bug #31177 (memory leaks and corruption because of incorrect
- refcounting). (Dmitry)
-- Fixed bug #31158 (array_splice on $GLOBALS crashes). (Dmitry)
-- Fixed bug #31054 (safe_mode & open_basedir checks only check first
- include_path value). (Ilia)
-- Fixed bug #31033 (php:function(string, nodeset) with xsl:key crashes PHP).
- (Rob)
-- Fixed bug #30961 (Wrong line number in ReflectionClass getStartLine()).
- (Dmitry)
-- Fixed bug #30889 (Conflict between __get/__set and ++ operator). (Dmitry)
-- Fixed bug #30833 (array_count_values() modifying input array). (Tony)
-- Fixed bug #30828 (debug_backtrace() reports incorrect class in overridden
- methods). (Dmitry)
-- Fixed bug #30820 (static member conflict with $this->member silently
- ignored). (Dmitry)
-- Fixed bug #30819 (Better support for LDAP SASL bind). (Jani)
-- Fixed bug #30791 (magic methods (__sleep/__wakeup/__toString) call
- __call if object is overloaded). (Dmitry)
-- Fixed bug #30707 (Segmentation fault on exception in method).
- (Stas, Dmitry)
-- Fixed bug #30702 (cannot initialize class variable from class constant).
- (Dmitry)
-- Fixed bug #30578 (Output buffers flushed before calling __destruct()
- functions). (Jani)
-- Fixed bug #30519 (Interface not existing says Class not found). (Dmitry)
-- Fixed bug #30407 (Strange behavior of default arguments). (Dmitry)
-- Fixed bug #30394 (Assignment operators yield wrong result with __get/__set).
- (Dmitry)
-- Fixed bug #30332 (zend.ze1_compatibility_mode isn't fully compatible with
- array_push()). (Dmitry)
-- Fixed bug #30162 (Catching exception in constructor causes lose of
- $this). (Dmitry)
-- Fixed bug #30140 (Problem with array in static properties). (Dmitry)
-- Fixed bug #30126 (Enhancement for error message for abstract classes).
- (Marcus)
-- Fixed bug #30096 (gmmktime does not return the current time). (Derick)
-- Fixed bug #30080 (Passing array or non array of objects). (Dmitry)
-- Fixed bug #30052 (Crash on shutdown after odbc_pconnect()). (Edin)
-- Fixed bug #29983 (PHP does not explicitly set mime type & charset). (Ilia)
-- Fixed bug #29975 (memory leaks when set_error_handler() is used inside error
- handler). (Tony)
-- Fixed bug #29971 (variables_order behavior). (Dmitry)
-- Fixed bug #29944 (Function defined in switch, crashes). (Dmitry)
-- Fixed bug #29896 (Backtrace argument list out of sync). (Dmitry)
-- Fixed bug #29728 (Reflection API Feature: Default parameter value). (Marcus)
-- Fixed bug #29689 (default value of protected member overrides default value
- of private and other private variable problems in inherited classes). (Stas)
-- Fixed bug #29683 (headers_list() returns empty array). (Tony)
-- Fixed bug #29583 (crash when echoing a COM object). (M.Sisolak, Wez)
-- Fixed bug #29522 (accessing properties without connection). (Georg)
-- Fixed bug #29361 (var_export() producing invalid code). (Derick)
-- Fixed bug #29338 (unencoded spaces get ignored after certain tags). (Ilia)
-- Fixed bug #29335 (fetch functions now use MYSQLI_BOTH as default). (Georg)
-- Fixed bug #29334 (win32 mail() provides incorrect Date: header). (Jani)
-- Fixed bug #29311 (calling parent constructor in mysqli). (Georg)
-- Fixed bug #29268 (__autoload() not called with Reflection->getClass()).
- (Dmitry)
-- Fixed bug #29256 (SOAP HTTP Error when envelop size is more than 24345
- bytes). (Dmitry, Wez)
-- Fixed bug #29253 (array_diff with $GLOBALS argument fails). (Dmitry)
-- Fixed bug #29236 (memory error when wsdl-cache is enabled). (Dmitry)
-- Fixed bug #29210 (Function: is_callable - no support for private and
- protected classes). (Dmitry)
-- Fixed bug #29109 (SoapFault exception: [WSDL] Out of memory). (Dmitry)
-- Fixed bug #29104 (Function declaration in method doesn't work). (Dmitry)
-- Fixed bug #29061 (soap extension segfaults). (Dmitry)
-- Fixed bug #29015 (Incorrect behavior of member vars(non string ones)-numeric
- mem vars and others). (Dmitry)
-- Fixed bug #28985 (__getTypes() returning nothing on complex WSDL). (Dmitry)
-- Fixed bug #28969 (Wrong data encoding of special characters). (Dmitry)
-- Fixed bug #28839 (SIGSEGV in interactive mode (php -a)).
- (kameshj at fastmail dot fm)
-- Fixed bug #28605 (Need to use -[m]ieee option for Alpha CPUs). (Jani)
-- Fixed bug #28568 (SAPI::known_post_content_types is not thread safe).
- (Moriyoshi)
-- Fixed bug #28377 (debug_backtrace is intermittently passing args). (Dmitry)
-- Fixed bug #28355 (glob wont error if dir is not readable). (Hartmut)
-- Fixed bug #28072 (static array with some constant keys will be incorrectly
- ordered). (Dmitry)
-- Fixed bug #27908 (xml default_handlers not being called). (Rob)
-- Fixed bug #27598 (list() array key assignment causes HUGE memory leak).
- (Dmitry)
-- Fixed bug #27268 (Bad references accentuated by clone). (Dmitry)
-- Fixed bug #26456 (Wrong results from Reflection-API getDocComment() when
- called via STDIN). (Dmitry)
-- Fixed bug #25922 (In error handler, modifying 5th arg (errcontext) may
- result in seg fault). (Dmitry)
-- Fixed bug #25359 (array_multisort() doesn't work in a function if array is
- global or reference). (Dmitry)
-- Fixed bug #22836 (returning reference to uninitialized variable). (Dmitry)
-- Fixed bug #21306 (ext/sesssion: catch bailouts of write handler during
- RSHUTDOWN). (Jani, Xuefer at 21cn dot com)
-- Fixed bug #15854 (boolean ini options may be incorrectly displayed as Off
- when they are On). (Tony)
-- Fixed bugs #14561, #20382, #26090, #26320, #28024, #30532, #32086, #32270,
- #32555, #32588, #33056 (strtotime() related bugs). (Derick)
-
-31 Mar 2005, PHP 5.0.4
-- Added SNMPv2 support. (harrie)
-- Added Oracle Instant Client support. (cjbj at hotmail dot com, Tony)
-- Added length and charsetnr for field array and object in mysqli. (Georg)
-- Added checks for negative values to gmp_sqrt(), gmp_powm(), gmp_sqrtrem()
- and gmp_fact() to prevent SIGFPE. (Tony)
-- Changed foreach() to throw an exception if IteratorAggregate::getIterator()
- does not return an Iterator. (Marcus)
-- Changed phpize not to require libtool. (Jani)
-- Updated bundled oniguruma library (used for multibyte regular expression)
- to 3.7.0. (Moriyoshi)
-- Updated bundled libmbfl library (used for multibyte functions). (Moriyoshi)
- Fixed bugs:
- . Bug #32311 (mb_encode_mimeheader() does not properly escape characters)
- . Bug #32063 (mb_convert_encoding ignores named entity 'alpha')
- . Bug #31911 (mb_decode_mimeheader() is case-sensitive to hex escapes)
- . bug #30573 (compiler warnings in libmbfl due to invalid type cast)
- . Bug #30549 (incorrect character translations for some ISO8859 charsets).
-- Fixed bug preventing from building oci8 as shared.
- (stanislav dot voroniy at portavita dot nl, Tony)
-- Fixed a bug in mysql_affected_rows and mysql_stmt_affected_rows when the
- api function returns -1 (Georg)
-- Fixed several leaks in ext/browscap and sapi/embed. (Andrei)
-- Fixed several leaks in ext/filepro. (Tony)
-- Fixed build system to always use bundled libtool files. (Jani)
-- Fixed a bug in mysqli_stmt_execute() (type conversion with NULL values).
- (Georg)
-- Fixed segfault in mysqli_fetch_field_direct() when invalid field offset
- is passed. (Tony)
-- Fixed posix_getsid() & posix_getpgid() to return sid & pgid instead
- of true. (Tony)
-- Fixed bug #32394 (offsetUnset() segfaults in a foreach). (Marcus)
-- Fixed bug #32373 (segfault in bzopen() if supplied path to non-existent
- file). (Tony)
-- Fixed bug #32326 (Check values of Connection/Transfer-Encoding
- case-incentively in SOAP extension). (Ilia)
-- Fixed bug #32290 (call_user_func_array() calls wrong class method within
- child class). (Marcus)
-- Fixed bug #32238 (spl_array.c: void function cannot return value). (Johannes)
-- Fixed bug #32210 (proc_get_status() sets "running" always to true). (Ilia)
-- Fixed bug #32200 (Prevent using both --with-apxs2 and --with-apxs2filter).
- (Jani)
-- Fixed bug #32134 (Overloading offsetGet/offsetSet). (Marcus)
-- Fixed bug #32130 (ArrayIterator::seek() does not throw an Exception on
- invalid index). (Marcus)
-- Fixed bug #32115 (dateTime SOAP encoding of timezone incorrect). (Dmitry)
-- Fixed bug #32081 (in mysqli default socket value is not being used). (Ilia)
-- Fixed bug #32021 (Crash caused by range('', 'z')). (Derick)
-- Fixed bug #32011 (Fragments which replaced Nodes are not globaly useable).
- (Rob)
-- Fixed bug #32001 (xml_parse_into_struct() function exceeds maximum
- execution time). (Rob, Moriyoshi)
-- Fixed bug #31980 (Unicode exif data not available on Windows). (Edin)
-- Fixed bug #31960 (msql_fetch_row() and msql_fetch_array() dropping columns
- with NULL values). (Daniel Convissor)
-- Fixed bug #31878 (Segmentation fault using clone keyword on nodes). (Rob)
-- Fixed bug #31858 (--disable-cli does not force --without-pear). (Jani)
-- Fixed bug #31842 (*date('r') does not return RFC2822 conforming date string).
- (Jani)
-- Fixed bug #31832 (SOAP encoding problem with complex types in WSDL mode with
- multiple parts). (Dmitry)
-- Fixed bug #31797 (exif_read_data() uses too low nesting limit). (Ilia)
-- Fixed bug #31796 (readline completion handler does not handle empty return
- values). (Ilia)
-- Fixed bug #31792 (getrusage() does not provide ru_nswap value). (Ilia)
-- Fixed bug #31755 (Cannot create SOAP header in no namespace). (Dmitry)
-- Fixed bug #31754 (dbase_open() fails for mode = 1). (Mehdi, Derick)
-- Fixed bug #31751 (pg_parameter_status() missing on Windows). (Edin)
-- Fixed bug #31747 (SOAP Digest Authentication doesn't work with
- "HTTP/1.1 100 Continue" response). (Dmitry)
-- Fixed bug #31732 (mb_get_info() causes segfault when no parameters
- specified). (Tony)
-- Fixed bug #31710 (Wrong return values for mysqli_autocommit/commit/rollback).
- (Georg)
-- Fixed bug #31705 (parse_url() does not recognize http://foo.com#bar). (Ilia)
-- Fixed bug #31695 (Cannot redefine endpoint when using WSDL). (Dmitry)
-- Fixed bug #31684 (dio_tcsetattr(): misconfigured termios settings).
- (elod at itfais dot com)
-- Fixed bug #31683 (changes to $name in __get($name) override future
- parameters) (Dmitry)
-- Fixed bug #31699 (unserialize() float problem on non-English locales). (Ilia)
-- Fixed bug #31562 (__autoload() problem with static variables). (Marcus)
-- Fixed bug #31651 (ReflectionClass::getDefaultProperties segfaults with arrays).
- (Marcus)
-- Fixed bug #31623 (OCILogin does not support password grace period).
- (daniel dot beet at accuratesoftware dot com, Tony)
-- Fixed bug #31527 (crash in msg_send() when non-string is stored without
- being serialized). (Ilia)
-- Fixed bug #31515 (Improve performance of scandir() by factor of 10 or so). (Ilia)
-- Fixed bug #31514 (open_basedir uses path_translated rather then cwd for .
- translation). (Ilia)
-- Fixed bug #31480 (Possible infinite loop in imap_mail_compose()). (Ilia)
-- Fixed bug #31479 (Fixed crash in chunk_split(), when chunklen > strlen). (Ilia)
-- Fixed bug #31454 (session_set_save_handler crashes PHP when supplied
- non-existent object ref). (Tony)
-- Fixed bug #31444 (Memory leak in zend_language_scanner.c).
- (hexer at studentcenter dot org)
-- Fixed bug #31442 (unserialize broken on 64-bit systems). (Marcus)
-- Fixed bug #31440 ($GLOBALS can be overwritten via GPC when register_globals
- is enabled). (Ilia)
-- Fixed bug #31422 (No Error-Logging on SoapServer-Side). (Dmitry)
-- Fixed bug #31413 (curl POSTFIELDS crashes on 64-bit platforms). (Joe)
-- Fixed bug #31396 (compile fails with gd 2.0.33 without freetype). (Jani)
-- Fixed bug #31371 (highlight_file() trims new line after heredoc). (Ilia)
-- Fixed bug #31361 (simplexml/domxml segfault when adding node twice). (Rob)
-- Fixed bug #31348 (CachingIterator::rewind() leaks). (Marcus)
-- Fixed bug #31346 (ArrayIterator::next segfaults). (Marcus)
-- Fixed bug #31190 (Unexpected warning then exception is thrown from
- call_user_func_array()). (phpbugs at domain51 dot net, Dmitry)
-- Fixed bug #31142 (imap_mail_compose() fails to generate correct output). (Ilia)
-- Fixed bug #31139 (XML Parser Functions seem to drop &amp; when parsing). (Rob)
-- Fixed bug #31398 (When magic_guotes_gpc are enabled filenames with ' get cutoff).
- (Ilia)
-- Fixed bug #31288 (Possible crash in mysql_fetch_field(), if mysql_list_fields()
- was not called previously). (Ilia)
-- Fixed bug #31107, #31110, #31111, #31249 (Compile failure of zend_strtod.c).
- (Jani)
-- Fixed bug #31110 (PHP 4.3.10 does not compile on Tru64 UNIX 5.1B). (Derick)
-- Fixed bug #31107 (Compile failure on Solaris 9 (Intel) and gcc 3.4.3). (Derick)
-- Fixed bug #31103 (Better error message when c-client cannot be found). (Ilia)
-- Fixed bug #31101 (missing kerberos header file path with --with-openssl). (Jani)
-- Fixed bug #31098 (isset() / empty() incorrectly return true in dereference of
- a string type). (Moriyoshi)
-- Fixed bug #31087 (broken php_url_encode_hash macro). (Ilia)
-- Fixed bug #31072 (var_export() does not output an array element with an empty
- string key). (Derick)
-- Fixed bug #31060 (imageftbbox() does not use linespacing parameter). (Jani)
-- Fixed bug #31056 (php_std_date() returns invalid formatted date if
- y2k_compliance is On). (Ilia)
-- Fixed bug #31055 (apache2filter: per request leak proportional to the full
- path of the request URI). (kameshj at fastmail dot fm)
-- Fixed bug #30901 (can't send cookies with soap envelop). (Dmitry)
-- Fixed bug #30871 (Misleading warning message for array_combine()). (Andrey)
-- Fixed bug #30868 (evaluated pointer comparison in mbregex causes compile
- failure). (Moriyoshi)
-- Fixed bug #30862 (Static array with boolean indexes). (Marcus)
-- Fixed bug #30726 (-.1 like numbers are not being handled correctly). (Ilia)
-- Fixed bug #30725 (PHP segfaults when an exception is thrown in getIterator()
- within foreach). (Marcus)
-- Fixed bug #30609 (cURL functions bypass open_basedir). (Jani)
-- Fixed bug #30446 (apache2handler: virtual() includes files out of sequence)
-- Fixed bug #30430 (odbc_next_result() doesn't bind values and that results
- in segfault). (pdan-php at esync dot org, Tony)
-- Fixed bug #30266 (Invalid opcode 137/1/8). (Marcus)
-- Fixed bug #30120 imagettftext() and imagettfbbox() accept too many
- parameters). (Jani)
-- Fixed bug #30106 (SOAP cannot not parse 'ref' element. Causes Uncaught
- SoapFault exception). (Dmitry)
-- Fixed bug #29989 (type re_registers redefined in oniguruma.h). (Moriyoshi)
-- Fixed bug #28803 (enabled debug causes bailout errors with CLI on AIX
- because of fflush() called on already closed filedescriptor). (Tony)
-- Fixed bug #29767 (Weird behaviour of __set($name, $value)). (Dmitry)
-- Fixed bug #29733 (printf() handles repeated placeholders wrong).
- (bugs dot php dot net at bluetwanger dot de, Ilia)
-- Fixed bug #29424 (width and height inverted for JPEG2000 files). (Ilia)
-- Fixed bug #29329 (configure for mysqli with shared doesn't work). (Georg)
-- Fixed bug #29136 (make test - libtool failure on MacOSX). (Jani)
-- Fixed bug #28976 (mail(): use "From:" from headers if sendmail_from is empty).
- (Jani)
-- Fixed bug #28930 (PHP sources pick wrong header files generated by bison).
- (eggert at gnu dot org, Jani)
-- Fixed bug #28840 (__destruct of a class that extends mysqli not called).
- (Marcus)
-- Fixed bug #28804 (ini-file section parsing pattern is buggy).
- (wendland at scan-plus dot de)
-- Fixed bug #28451 (corrupt EXIF headers have unlimited recursive IFD directory
- entries). (Andrei)
-- Fixed bug #28444 (Cannot access undefined property for object with overloaded
- property access). (Dmitry)
-- Fixed bug #28442 (Changing a static variables in a class changes it across
- sub/super classes.) (Marcus)
-- Fixed bug #28324 (HTTP_SESSION_VARS appear when register_long_arrays is
- Off). (Tony)
-- Fixed bug #28074 (FastCGI: stderr should be written in a FCGI stderr stream).
- (chris at ex-parrot dot com)
-- Fixed bug #28067 (partially incorrect utf8 to htmlentities mapping). (Derick,
- Benjamin Greiner)
-- Fixed bug #28041 (SOAP HTTP Digest Access Authentication). (Dmitry)
-- Fixed bug #27633 (Double \r problem on ftp_get in ASCII mode on Win32). (Ilia)
-- Fixed bug #18613 (Multiple OUs in x509 certificate not handled properly).
- (Jani)
-
-15 Dec 2004, PHP 5.0.3
-- Added the %F modifier to *printf to render a non-locale-aware representation
- of a float with the . as decimal seperator. (Derick)
-- Fixed error handling in mysqli_multi_query. (Georg)
-- Extended the functionality of is_subclass_of() to accept either a class name
- or an object as first parameter. (Andrey)
-- Fixed potential problems with unserializing invalid serialize data. (Marcus)
-- Fixed bug #32076 (ReflectionMethod::isDestructor() always return true).
- (Derick, Tony)
-- Fixed bug #31034 (Problem with non-existing iconv header file). (Derick)
-- Fixed bug #30995 (snmp extension does not build with net-snmp 5.2). (Ilia)
-- Fixed bug #30994 (SOAP server unable to handle request with references).
- (Dmitry)
-- Fixed bug #30990 (allow popen() on *NIX to accept 'b' flag). (Ilia)
-- Fixed bug #30967 (properties in extended mysqli classes don't work). (Georg)
-- Fixed bug #30928 (When Using WSDL, SoapServer doesn't handle private or
- protected properties). (Dmitry)
-- Fixed bug #30922 (reflective functions crash PHP when interfaces extend
- themselves). (Tony, Dmitry)
-- Fixed bug #30904 (segfault when recording soapclient into session). (Tony,
- Dmitry)
-- Fixed bug #30890 (MySQLi testsuite)
-- Fixed bug #30856 (ReflectionClass::getStaticProperties segfaults). (Marcus)
-- Fixed bug #30832 ("!" stripped off comments in xml parser). (Rob)
-- Fixed bug #30799 (SoapServer doesn't handle private or protected properties).
- (Dmitry)
-- Fixed bug #30783 (Apache crash when using ReflectionFunction::
- getStaticVariables()). (Marcus)
-- Fixed bug #30750 (Meaningful error message when upload directory is not
- accessible). (Ilia)
-- Fixed bug #30685 (Malformed SOAPClient http header reequest). (Dmitry)
-- Fixed bug #30672 (Problem handling exif data in jpeg images at unusual
- places). (Marcus)
-- Fixed bug #30658 (Ensure that temporary files created by GD are removed).
- (Ilia)
-- Fixed bug #30645 (def. multi result set support for mysql_connect). (Georg)
-- Fixed bug #30637 (compile with pear error). (Antony)
-- Fixed bug #30587 (array_multisort doesn't separate zvals before
- changing them). (Tony)
-- Fixed bug #30572 (crash when comparing SimpleXML attribute to a boolean).
- (Andi)
-- Fixed bug #30566 (attribute namespace URIs are inconsistent when parsing).
- (Rob)
-- Fixed bug #30490 (PEAR installation fails). (Antony)
-- Fixed bug #30475 (curl_getinfo() may crash in some situations). (Ilia)
-- Fixed bug #30442 (segfault when parsing ?getvariable[][ ). (Tony)
-- Fixed bug #30388 (rename across filesystems loses ownership and
- permission info). (Tony)
-- Fixed bug #30387 (stream_socket_client async connect was broken).
- (vnegrier at esds dot com, Wez).
-- Fixed bug #30381 (Strange results with get_class_vars()). (Marcus)
-- Fixed bug #30375 (cal_info() does not work without a parameter). (Ilia)
-- Fixed bug #30362 (stream_get_line() not handling end string correctly).
- (Ilia)
-- Fixed bug #30359 (SOAP client requests have no port in "Host" field).
- (Dmitry)
-- Fixed bug #30356 (str_ireplace() does not work on all strings). (Ilia)
-- Fixed bug #30344 (Reflection::getModifierNames() returns too long strings).
- (Marcus)
-- Fixed bug #30329 (Error Fetching http body, No Content-Length, connection
- closed or chunked data). (Dmitry)
-- Fixed bug #30282 (segfault when using unknown/unsupported
- session.save_handler and/or session.serialize_handler). (Tony)
-- Fixed bug #30281 (Prevent non-wbmp images from being detected as such).
- (Ilia)
-- Fixed bug #30276 (Possible crash in ctype_digit on large numbers). (Ilia)
-- Fixed bug #30230 (exception handler not working with objects). (Marcus)
-- Fixed bug #30224 (Sybase date strings are sometimes not null terminated).
- (Ilia)
-- Fixed bug #30175 (SOAP results aren't parsed correctly). (Dmitry)
-- Fixed bug #30147 (OO sqlite_fetch_object did not reset error handler). (Wez)
-- Fixed bug #30133 (get_current_user() crashes on Windows). (Edin)
-- Fixed bug #30061 (xml_set_start_namespace_decl_handler not called). (Rob)
-- Fixed bug #30057 (did not detect IPV6 on FreeBSD 4.1). (Wez)
-- Fixed bug #30042 (strtotime does not use second param). (Derick)
-- Fixed bug #30027 (Possible crash inside ftp_get()).
- (cfield at affinitysolutions dot com)
-- Fixed bug #29954 (array_reduce segfaults when initial value is array). (Tony)
-- Fixed bug #29883 (isset gives invalid values on strings). (Tony, Dmitry)
-- Fixed bug #29801 (Set limit on the size of mmapable data). (Ilia)
-- Fixed bug #29557 (strtotime error). (Derick)
-- Fixed bug #29418 (double free when openssl_csr_new fails).
- (Kamesh Jayachandran).
-- Fixed bug #29385 (Soapserver always uses std class). (David, Dmitry)
-- Fixed bug #29211 (SoapClient doesn't request wsdl through proxy). (Rob)
-- Fixed bug #28817 (Var problem when extending domDocument). (Georg)
-- Fixed bug #28599 (strtotime fails with zero base time). (Derick)
-- Fixed bug #28598 (Lost support for MS Symbol fonts). (Pierre)
-- Fixed bug #28220 (mb_strwidth() returns wrong width values for some hangul
- characters). (Moriyoshi)
-- Fixed bug #28228 (NULL decimal separator is not being handled correctly).
- (Ilia)
-- Fixed bug #28209 (strtotime("now")). (Derick)
-- Fixed bug #27798 (private / protected variables not exposed by
- get_object_vars() inside class). (Marcus)
-- Fixed bug #27728 (Can't return within a zend_try {} block or the previous
- bailout state isn't restored. (Andi)
-- Fixed bug #27183 (Userland stream wrapper segfaults on stream_write).
- (Christian)
-
-23 Sep 2004, PHP 5.0.2
-- Added new boolean (fourth) parameter to array_slice() that turns on the
- preservation of keys in the returned array. (Derick)
-- Added the sorting flag SORT_LOCALE_STRING to the sort() functions which makes
- them sort based on the current locale. (Derick)
-- Added interface_exists() and make class_exists() only return true for real
- classes. (Andrey)
-- Added PHP_EOL constant that contains the OS way of representing newlines.
- (Paul Hudson, Derick)
-- Implemented periodic PCRE compiled regexp cache cleanup, to avoid memory
- exhaustion. (Andrei)
-- Renamed SoapClient->__call() to SoapClinet->__soapCall(). (Dmitry)
-- Fixed bug with raw_post_data not getting set (Brian)
-- Fixed a file-descriptor leak with phpinfo() and other 'special' URLs (Zeev)
-- Fixed bug #30209 (ReflectionClass::getMethod() lowercases attribute).
- (Marcus)
-- Fixed bug #30182 (SOAP module processing WSDL file dumps core). (Dmitry)
-- Fixed bug #30045 (Cannot pass big integers (> 2147483647) in SOAP requests).
- (Dmitry)
-- Fixed bug #29985 (unserialize()/ __PHP_Incomplete_class does not report
- correctly class name). (Marcus, Tony)
-- Fixed bug #29945 (simplexml_load_file URL limitation 255 char). (Rob)
-- Fixed bug #29873 (No defines around pcntl_*priority definitions). (Derick)
-- Fixed bug #29844 (SOAP doesn't return the result of a valid SOAP request).
- (Dmitry)
-- Fixed bug #29842 (soapclient return null value). (Dmitry)
-- Fixed bug #29839 (incorrect convert (xml:lang to lang)). (Dmitry)
-- Fixed bug #29830 (SoapServer::setClass() should not export non-public
- methods). (Dmitry)
-- Fixed bug #29828 (Interfaces no longer work). (Marcus)
-- Fixed bug #29821 (Fixed possible crashes in convert_uudecode() on invalid
- data). (Ilia)
-- Fixed bug #29808 (array_count_values() breaks with numeric strings). (Ilia)
-- Fixed bug #29805 (HTTP Authentication Issues). (Uwe Schindler)
-- Fixed bug #29795 (SegFault with Soap and Amazon's Web Services). (Dmitry)
-- Fixed bug #29737 (ip2long should return -1 if IP is 255.255.255.255 and FALSE
- on error). (Tony)
-- Fixed bug #29711 (Changed ext/xml to default to UTF-8 output). (Rob)
-- Fixed bug #29678 (opendir() with ftp:// wrapper segfaults if path does not
- have trailing slash). (Ilia)
-- Fixed bug #29657 (xml_* functions throw non descriptive error).
- (Christian, Rob)
-- Fixed bug #29656 (segfault on result and statement properties). (Georg)
-- Fixed bug #29566 (foreach/string handling strangeness (crash)). (Dmitry)
-- Fixed bug #29447 (Reflection API issues). (Marcus)
-- Fixed bug #29296 (Added sslv2 and sslv3 transports). (Wez)
-- Fixed bug #29283 (Invalid statement handle in mysqli on execute). (Georg)
-- Fixed bug #29913 (parse_url() is now binary safe). (Ilia)
-- Fixed bug #27994 (segfault with Soapserver when WSDL-Cache is enabled).
- (Dmitry)
-- Fixed bug #27791 (Apache 2.0 SAPI build against Apache 2 HEAD). (Joe Orton,
- Derick)
-- Fixed bug #26737 (private/protected properties not serialized when user
- declared method __sleep() exists). E_NOTICE thrown when __sleep() returns
- name of non-existing member. (Andrey, Curt)
+ . Fixed Bug #42614 (PDO_pgsql: add pg_get_notify support). (Matteo)
+ . Fixed Bug #63657 (pgsqlCopyFromFile, pgsqlCopyToArray use Postgres < 7.3
+ syntax). (Matteo)
-12 Aug 2004, PHP 5.0.1
-- Changed destructor mechanism so that destructors are called prior to request
- shutdown. (Marcus)
-- Rewritten UNIX and Windows install help files. (Documentation Team)
-- Updated several libraries bundled with the windows release which now
- includes libxml2-2.6.11, libxslt-1.1.7 and iconv-1.9.1. (Rob, Edin)
-- Improved and moved ActiveScript SAPI to PECL. (Wez)
-- Fixed bug #29606 (php_strip_whitespace() prints to stdout rather then
- returning the value). (Ilia)
-- Fixed bug #29577 (MYSQLI_CLIENT_FOUND_ROWS undefined) (Georg)
-- Fixed bug #29573 (Segmentation fault, when exception thrown within
- PHP function called from XSLT). (Christian)
-- Fixed bug #29522 (accessing properties without connection) (Georg)
-- Fixed bug #29505 (get_class_vars() severely broken when used with arrays).
- (Marcus)
-- Fixed bug #29490 (.Net object instantiation failed). (Michael Sisolak).
-- Fixed bug #29474 (win32: usleep() doesn't work). (Wez)
-- Fixed bug #29449 (win32: feof() hangs on empty tcp stream). (Wez)
-- Fixed bug #29437 (Possible crash inside array_walk_recursive()). (Ilia)
-- Fixed bug #29431 (crash when parsing invalid address; invalid address
- returned by stream_socket_recvfrom(), stream_socket_getname()). (Wez)
-- Fixed bug #29409 (Segfault in PHP functions called from XSLT). (Rob)
-- Fixed unloading of dynamically loaded extensions.
- (Marcus, kameshj at fastmail dot fm)
-- Fixed bug #29395 (sqlite_escape_string() returns bogus data on empty
- strings). (Ilia, Tony)
-- Fixed bug #29392 (com_dotnet crashes when echo'ing an object). (Wez)
-- Fixed bug #29368 (The destructor is called when an exception is thrown from
- the constructor). (Marcus)
-- Fixed bug #29354 (Exception constructor marked as both public and protected).
- (Marcus)
-- Fixed bug #29342 (strtotime() does not handle empty date string properly).
- (Ilia)
-- Fixed bug #29340 (win32 build produces invalid php_ifx.dll). (Edin)
-- Fixed bug #29335 (fetch functions now use MYSQLI_BOTH as default) (Georg)
-- Fixed bug #29291 (get_class_vars() return names with NULLs). (Marcus)
-- Fixed bug #29264 (gettext extension not working). (Edin)
-- Fixed bug #29258 (variant_date_from_timestamp() does not honour
- timezone). (Wez)
-- Fixed bug #29256 (error when sending large packets on a socket). (Dmitry)
-- Fixed bug #29236 (memory error when wsdl-cache is enabled). (Dmitry)
-- Fixed bug #29147 (Compile Error in mnoGoSearch functions). (Sergey, Antony)
-- Fixed bug #29132 ($_SERVER["PHP_AUTH_USER"] isn't defined). (Stefan)
-- Fixed bug #29119 (html_entity_decode() misbehaves with UTF-8). (Moriyoshi)
-- Fixed bug #29109 (SoapFault exception: [WSDL] Out of memory). (Dmitry)
-- Fixed bug #29061 (soap extension segfaults). (Dmitry)
-- Fixed bug #28985 (__getTypes() returning nothing on complex WSDL). (Dmitry)
-- Fixed bug #28969 (Wrong data encoding of special characters). (Dmitry)
-- Fixed bug #28895 (ReflectionClass::isAbstract always returns false). (Marcus)
-- Fixed bug #28829 (Thread-unsafety in bcmath elementary values). (Sara)
-- Fixed bug #28464 (catch() does not catch exceptions by interfaces). (Marcus)
-- Fixed bug #27669 (PHP 5 didn't support all possibilities for calling static
- methods dynamically). (Dmitry)
-- Fixed ReflectionClass::getMethod() and ReflectionClass::getProperty() to
- raise an ReflectionException instead of returning NULL on failure.
- (Sebastian)
-- Fixed convert.* filters to consume remaining buckets_in on flush. (Sara)
-- Fixed bug in mysqli->client_version. (Georg)
+- GMP:
+ . Moved GMP to use object as the underlying structure and implemented various
+ improvements based on this.
+ (RFC: https://wiki.php.net/rfc/operator_overloading_gmp). (Nikita)
-13 Jul 2004, PHP 5.0.0
-- Updated PCRE to provide better error handling in certain cases. (Andrei)
-- Changed doc comments to require a single white space after '/**'. (Marcus)
-- Fixed bug #29019 (Database not closing). (Marcus)
-- Fixed bug #29008 (array_combine() does not handle non-numeric/string keys).
- (Ilia)
-- Fixed bug #28999 (fixed behaviour of exec() to work as it did in 4.X). (Ilia)
-- Fixed bug #28868 (Internal filter registry not thread safe). (Sara)
-- Fixed bug #28851 (call_user_func_array has typo in error message). (Marcus)
-- Fixed bug #28831 (ArrayObject::offsetGet() does the work of offsetUnset()).
- (Marcus)
-- Fixed bug #28822 (ArrayObject::offsetExists() works inverted). (Marcus)
-- Fixed bug #28789 (ReflectionProperty getValue() fails on public static
- members). (Marcus)
-- Fixed bug #28771 (Segfault when using xslt and clone). (Rob)
-- Fixed bug #28751 (SoapServer does not call _autoload()). (Dmitry)
-- Fixed bug #28739 (array_*diff() and array_*intersect() not clearing the fci
- cache before work). (Andrey)
-- Fixed bug #28721 (appendChild() and insertBefore() unset DOMText).(Rob)
-- Fixed bug #28702 (SOAP does not parse WSDL service address correctly). (Dmitry)
-- Fixed bug #28699 (Reflection api bugs). (Marcus)
-- Fixed bug #28694 (ReflectionExtension::getFunctions() crashes PHP). (Marcus)
-- Fixed bug #28512 (Allocate enough space to store MSSQL data). (Frank)
-- Fixed strip_tags() to correctly handle '\0' characters. (Stefan)
+<<< NOTE: Insert NEWS from last stable release here prior to actual release! >>>
diff --git a/UPGRADING b/UPGRADING
index 99ab6380c1..e78e46d1d3 100755
--- a/UPGRADING
+++ b/UPGRADING
@@ -1,463 +1,85 @@
$Id$
-PHP 5.5 UPGRADE NOTES
+PHP X.Y UPGRADE NOTES
-1. Backward Incompatible Changes
-2. New Features
-2. Changes in SAPI modules
-3. Deprecated Functionality
-4. Changed Functions
-5. New Functions
-6. New Classes and Interfaces
-7. Removed Extensions
-8. Other Changes to Extensions
-9. New Global Constants
+1. Backward Incompatible Changes
+2. New Features
+2. Changes in SAPI modules
+3. Deprecated Functionality
+4. Changed Functions
+5. New Functions
+6. New Classes and Interfaces
+7. Removed Extensions
+8. Other Changes to Extensions
+9. New Global Constants
10. Changes to INI File Handling
-11. Windows Support
-12. Other Changes
+11. Other Changes
========================================
1. Backward Incompatible Changes
========================================
-- Dropped Windows XP and 2003 support. (Pierre)
-
-- All internal case insensitivity handling for class, function and constant
- names is done according to ASCII rules. Current locale settings are ignored.
-
-- self, parent & static keywords now are always case-insensitive (see bug
- #60833).
-
-- Removed Logo GUIDs: php_logo_guid(), php_egg_logo_guid(),
- php_real_logo_guid() and zend_logo_guid()
========================================
2. New Features
========================================
-- Support list in foreach. (Laruence)
- (http://php.net/foreach#control-structures.foreach.list,
- http://wiki.php.net/rfc/foreachlist)
-
-- Support "finally" keyword. (Laruence)
- (http://php.net/exceptions, http://wiki.php.net/rfc/finally)
-
-- Support constant array/string dereferencing. (Laruence)
- (http://php.net/manual/en/language.types.array.php,
- https://wiki.php.net/rfc/constdereference)
-
-- Add support for using empty() on the result of function calls and
- other expressions. Thus it is now possible to write empty(getArray()),
- for example. (http://php.net/manual/en/function.empty.php,
- https://wiki.php.net/rfc/empty_isset_exprs)
-
-- Added generators.
- (http://php.net/generators, https://wiki.php.net/rfc/generators)
-
-- ClassName::class syntax returning full class name for a class as a
- string constant. (http://php.net/oop5.basic,
- https://wiki.php.net/rfc/class_name_scalars)
-
-- Added support for non-scalar Iterator keys in foreach.
- (http://php.net/manual/en/control-structures.foreach.php,
- https://wiki.php.net/rfc/foreach-non-scalar-keys).
-
-- Bundled Zend OPcache extension to improve performance
- (http://php.net/manual/en/book.opcache.php,
- https://wiki.php.net/rfc/optimizerplus)
-
-- Added a simplified password hashing API
- (http://php.net/password, https://wiki.php.net/rfc/password_hash)
========================================
2. Changes in SAPI modules
========================================
-- Support for changing the process's title in CLI/CLI-Server
- SAPIs. (Keyur)
- (http://php.net/manual/en/function.cli-set-process-title.php,
- http://php.net/manual/en/function.cli-get-process-title.php,
- https://wiki.php.net/rfc/cli_process_title)
-
-- Support for systemd in php-fpm: Add --with-fpm-systemd option to
- report health to systemd, and add systemd_interval option to
- configure this. The service can now use Type=notify in the systemd
- unit file. (Remi)
========================================
3. Deprecated Functionality
========================================
-- The original MySQL extension is now deprecated and will generate
- deprecation warnings when connecting to a database through
- mysql_connect(), mysql_pconnect() or by establishing an implicit
- connection. Use MySQLi or PDO instead.
-
-- The preg_replace /e modifier is now deprecated. Use
- preg_replace_callback instead.
- (https://wiki.php.net/rfc/remove_preg_replace_eval_modifier)
-
-- IntlDateFormatter::setTimeZoneID() and datefmt_set_timezone_id() are
- deprecated. Use IntlDateFormatter::setTimeZone() or
- datefmt_set_timezone() instead.
-
-- mcrypt_ecb(), mcrypt_cbc(), mcrypt_cfb() and mcrypt_ofb() now throw
- E_DEPRECATED. Their use was already previously discouraged in the
- documentation, but that predated the existence of E_DEPRECATED.
========================================
4. Changed Functions
========================================
-- pack()/unpack() had the following changes, which bring it more in
- line with Perl's behavior: - Implemented format character "Z": NULL
- padded string, with trailing NULL bytes removed. - Changed format
- character "a": this no longer removes trailing NULL bytes. -
- Changed format character "A": all trailing ASCII whitespace is now
- removed (defined as spaces, tabs, \r, \n and NULL).
-
-- MessageFormatter::format() and related functions now accepted named
- arguments and mixed numeric/named arguments in ICU 4.8+.
-
-- MessageFormatter::format() and related functions now don't error out
- when an insufficient argument count is provided. Instead, the
- placeholders will remain unsubstituted.
-
-- MessageFormatter::parse() and MessageFormat::format() (and their
- static equivalents) now don't throw away better than second
- precision in the arguments.
-
-- IntlDateFormatter::__construct and datefmt_create() now accept for
- the $timezone argument time zone identifiers, IntlTimeZone objects,
- DateTimeZone objects and NULL. It used to accept only time zone
- identifiers and NULL. Invalid time zone identifiers are no longer
- accepted. Empty strings are no longer accepted.
-
-- The default time zone used in IntlDateFormatter::__construct and
- datefmt_create() (when the corresponding argument is not passed or
- NULL is passed) is now the one given by date_default_timezone_get(),
- not the default ICU time zone.
-
-- The time zone passed to the IntlDateFormatter is ignored if it is
- NULL and if the calendar passed is an IntlCalendar object -- in this
- case, the IntlCalendar's time zone will be used instead. Otherwise,
- the time zone specified in the $timezone argument is used
- instead. This does not affect old code, as IntlCalendar was
- introduced in this version.
-
-- IntlDateFormatter::__construct and datefmt_create() now accept for
- the $calendar argument also IntlCalendar objects.
-
-- IntlDateFormatter::getCalendar() and datefmt_get_calendar() return
- false if the IntlDateFormatter was set up with an IntlCalendar
- instead of the constants
- IntlDateFormatter::GREGORIAN/TRADITIONAL. IntlCalendar did not exist
- before this version.
-
-- IntlDateFormatter::setCalendar() and datefmt_set_calendar() now also
- accept an IntlCalendar object, in which case its time zone is
- taken. Passing a constant is still allowed, and still keeps the time
- zone.
-
-- IntlDateFormatter::format() and datefmt_format() now also accept an
- IntlCalendar object for formatting.
-
-- set_error_handler(NULL) can now be used to reset the error handler.
- Furthermore both set_error_handler(NULL) and
- set_exception_handler(NULL) will now return the previously defined
- error/exception handler. Previously bool(true) was returned.
-
-- setcookie(), setrawcookie() and ext/session now send Max-Age headers
- alongside Expires headers. (see
- https://wiki.php.net/rfc/cookie_max-age)
-
-- curl_setopt now accepts new option CURLOPT_SAFE_UPLOAD and CURLFile
- object for safer file uploads (see
- https://wiki.php.net/rfc/curl-file-upload)
-
-- Functions in the socket extension now do not emit warnings when the
- errno is EAGAIN, EWOULDBLOCK or EINPROGRESS.
+- cURL:
+ CURLOPT_SAFE_UPLOAD is now turned on by default and uploads with @file
+ do not work unless it is explicitly set to false.
========================================
5. New Functions
========================================
-- Core:
- - array_column()
- - boolval()
- - password_get_info()
- - password_hash()
- - password_needs_rehash()
- - password_verify()
-
-- cURL:
- - curl_file_create
-
-- GD
- - imageflip
- - imagecrop
- - imagecropauto
- - imagesetinterpolation
- - imageaffine
- - imageaffinematrixget
- - imageaffinematrixconcat
- - imagescale
-
-- Hash:
- - hash_pbkdf2()
-
-- Intl:
- - datefmt_format_object()
- - datefmt_get_calendar_object()
- - datefmt_get_timezone()
- - datefmt_set_timezone()
- - datefmt_get_calendar_object()
- - intlcal_create_instance()
- - intlcal_get_keyword_values_for_locale()
- - intlcal_get_now()
- - intlcal_get_available_locales()
- - intlcal_get()
- - intlcal_get_time()
- - intlcal_set_time()
- - intlcal_add()
- - intlcal_set_time_zone()
- - intlcal_after()
- - intlcal_before()
- - intlcal_set()
- - intlcal_roll()
- - intlcal_clear()
- - intlcal_field_difference()
- - intlcal_get_actual_maximum()
- - intlcal_get_actual_minimum()
- - intlcal_get_day_of_week_type()
- - intlcal_get_first_day_of_week()
- - intlcal_get_greatest_minimum()
- - intlcal_get_least_maximum()
- - intlcal_get_locale()
- - intlcal_get_maximum()
- - intlcal_get_minimal_days_in_first_week()
- - intlcal_get_minimum()
- - intlcal_get_time_zone()
- - intlcal_get_type()
- - intlcal_get_weekend_transition()
- - intlcal_in_daylight_time()
- - intlcal_is_equivalent_to()
- - intlcal_is_lenient()
- - intlcal_is_set()
- - intlcal_is_weekend()
- - intlcal_set_first_day_of_week()
- - intlcal_set_lenient()
- - intlcal_equals()
- - intlcal_get_repeated_wall_time_option()
- - intlcal_get_skipped_wall_time_option()
- - intlcal_set_repeated_wall_time_option()
- - intlcal_set_skipped_wall_time_option()
- - intlcal_from_date_time()
- - intlcal_to_date_time()
- - intlcal_get_error_code()
- - intlcal_get_error_message()
- - intlgregcal_create_instance()
- - intlgregcal_set_gregorian_change()
- - intlgregcal_get_gregorian_change()
- - intlgregcal_is_leap_year()
- - intltz_create_time_zone()
- - intltz_create_default()
- - intltz_get_id()
- - intltz_get_gmt()
- - intltz_get_unknown()
- - intltz_create_enumeration()
- - intltz_count_equivalent_ids()
- - intltz_create_time_zone_id_enumeration()
- - intltz_get_canonical_id()
- - intltz_get_region()
- - intltz_get_tz_data_version()
- - intltz_get_equivalent_id()
- - intltz_use_daylight_time()
- - intltz_get_offset()
- - intltz_get_raw_offset()
- - intltz_has_same_rules()
- - intltz_get_display_name()
- - intltz_get_dst_savings()
- - intltz_from_date_time_zone()
- - intltz_to_date_time_zone()
- - intltz_get_error_code()
- - intltz_get_error_message()
-
- - IntlDateFormatter::formatObject()
- - IntlDateFormatter::getCalendarObject()
- - IntlDateFormatter::getTimeZone()
- - IntlDateFormatter::setTimeZone()
-
-- Sockets:
- - socket_sendmsg()
- - socket_recvmsg()
- - socket_cmsg_space()
-
-- SPL:
- - SplFixedArray::__wakeup()
- - SplDoublyLinkedList::add()
-
-- Zend OPcache:
- - opcache_get_configuration()
- - opcache_get_status()
- - opcache_reset()
========================================
6. New Classes and Interfaces
========================================
-- Intl:
- - IntlCalendar
- - IntlGregorianCalendar
- - IntlTimeZone
- - IntlBreakIterator
- - IntlRuleBasedBreakIterator
- - IntlCodePointBreakIterator
- - UConverter
-
-- cURL:
- - CURLFile
========================================
7. Removed Extensions
========================================
-None
========================================
8. Other Changes to Extensions
========================================
-- Intl:
- - This extension now requires ICU 4.0+.
+- GMP:
+ The GMP extension now uses objects as the underlying data structure, rather
+ than resources. GMP instances now support dumping, serialization, cloning,
+ casts to primitive types and have overloaded operators.
+ (RFC: https://wiki.php.net/rfc/operator_overloading_gmp)
========================================
9. New Global Constants
========================================
-- mysqli:
- - Added MYSQLI_SERVER_PUBLIC_KEY constant to be used with mysqli_options()
-
-- cURL:
- - Added CURLOPT_SAFE_UPLOAD to be used with curl_setopt().
- - Added CURL_WRAPPERS_ENABLED to reflect --with-curlwrappers.
-
-- GD
- - Added constants for imageflip:
- . IMG_FLIP_HORIZONTAL
- . IMG_FLIP_VERTICAL
- . IMG_FLIP_BOTH
- - Added constants for imagecrop
- . IMG_CROP_DEFAULT
- . IMG_CROP_TRANSPARENT
- . IMG_CROP_BLACK
- . IMG_CROP_WHITE
- . IMG_CROP_SIDES
- . IMG_CROP_THRESHOLD
- - Added constants for imagesetinterpolation, used by imagescale
- imagerotate and imageaffine:
- . IMG_BELL
- . IMG_BESSEL
- . IMG_BILINEAR_FIXED
- . IMG_BICUBIC
- . IMG_BICUBIC_FIXED
- . IMG_BLACKMAN
- . IMG_BOX
- . IMG_BSPLINE
- . IMG_CATMULLROM
- . IMG_GAUSSIAN
- . IMG_GENERALIZED_CUBIC
- . IMG_HERMITE
- . IMG_HAMMING
- . IMG_HANNING
- . IMG_MITCHELL
- . IMG_POWER
- . IMG_QUADRATIC
- . IMG_SINC
- . IMG_NEAREST_NEIGHBOUR
- . IMG_WEIGHTED4
- . IMG_TRIANGLE
- - Added constants for imageaffinematrixget
- . IMG_AFFINE_TRANSLATE
- . IMG_AFFINE_SCALE
- . IMG_AFFINE_ROTATE
- . IMG_AFFINE_SHEAR_HORIZONTAL
- . IMG_AFFINE_SHEAR_VERTICAL
========================================
10. Changes to INI File Handling
========================================
-- Core:
- - Added sys_temp_dir INI directive, for specifying temporary
- directory.
-
-- Intl:
- - Added intl.use_exceptions INI directive, which controls what
- happens when global errors are set together with intl.error_level.
-
-- mysqlnd:
- - Added mysqlnd.sha256_server_public_key INI PERDIR setting that
- affects all APIs which use(are built) for mysqlnd. This allows
- ext/mysqli to be used with the new auth protocol, although at
- coarser level.
-
-- Zend OPcache (See http://php.net/manual/en/book.opcache.php)
- - Added the following directives:
- - opcache.enable (default "1")
- - opcache.memory_consumption (default "64")
- - opcache.interned_strings_buffer (default "4")
- - opcache.max_accelerated_files (default "2000")
- - opcache.max_wasted_percentage (default "5")
- - opcache.use_cwd (default "1")
- - opcache.validate_timestamps (default "1")
- - opcache.revalidate_freq (default "2")
- - opcache.revalidate_path (default "0")
- - opcache.save_comments (default "1")
- - opcache.load_comments (default "1")
- - opcache.fast_shutdown (default "0")
- - opcache.enable_file_override (default "0")
- - opcache.optimization_level (default "0xffffffff")
- - opcache.inherited_hack (default "1")
- - opcache.blacklist_filename (default "")
- - opcache.max_file_size (default "0")
- - opcache.consistency_checks (default "0")
- - opcache.force_restart_timeout (default "180")
- - opcache.error_log (default "" which means stderr)
- - opcache.log_verbosity_level (default "1")
- - opcache.preferred_memory_model (default "")
- - opcache.protect_memory (default "0")
- - opcache.mmap_base (Windows-only)
-
-========================================
-11. Windows Support
-========================================
-
-- The Apache 2.4 handler is supported as of PHP 5.5.0
-
-- OPcache: Errors like 'unable to reattach to base address' could
- happen in many common setups. It is due to some technical and
- design restriction in the engine and could not be fixed easily
- before 5.5.0 was released.
-
- A possible fix is to tweak the opcache.mmap_base INI setting by
- forcing the first address to be tried.
-
- For x86 version, the following addreses can be tried:
- . 0x20000000, 0x21000000, 0x30000000, 0x31000000, 0x50000000
- and for x64 (still experimental):
- . 0x0000100000000000, 0x0000200000000000, 0x0000300000000000, 0x0000700000000000
========================================
-12. Other Changes
+11. Other Changes
========================================
-- If the APC or WinCache user cache APIs were used before, consider
- these alternatives for PHP 5.5:
-
- - APCu
- - all supported OSes: http://pecl.php.net/package/APCu
- - Windows: http://windows.php.net/downloads/pecl/releases/apcu/
-
- - WinCache, Windows only: http://pecl.php.net/package/WinCache
diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS
index bdc2a43ab9..cfc19d515d 100644
--- a/UPGRADING.INTERNALS
+++ b/UPGRADING.INTERNALS
@@ -3,11 +3,7 @@ $Id$
UPGRADE NOTES - PHP X.Y
1. Internal API changes
- a. Executor changes
- b. Streams pooling API
- c. Lowercasing and locales
- d. zend_qsort_r
- e. get_current_key
+ a. Addition of do_operation and compare object handlers
2. Build system changes
a. Unix build system changes
@@ -18,95 +14,34 @@ UPGRADE NOTES - PHP X.Y
1. Internal API changes
========================
- a. Executor changes
+ a. Addition of do_operation and compare object handlers
- * extensions can't override zend_execute() any more, they should override
- zend_execute_ex() instead. The EG(current_execute_data) is already
- initialized in zend_execute_ex(), so for compatibility extensions
- may need to use EG(current_execute_data)->prev_execute_data instead.
- * removed EG(arg_types_stack), EX(fbc), EX(called_scope), EX(current_object)
- * added op_array->nested_calls. It's calculated at compile time.
- * added EX(call_slots). It is an array to store information about syntaticaly
- nested calls (e.g. foo(bar())). It's preallocated together with execute_data.
- * added EX(call) - pointer to a current calling function. Actually an
- element of EX(call_slots)
- * opcodes INIT_METHOD_CALL, ZEND_INIT_STATIC_METHOD_CALL,
- ZEND_INIT_FCALL_BY_NAME, ZEND_INIT_NS_FCALL_BY_NAME use result.num as
- an index in EX(call_slots)
- * opcode ZEND_NEW uses extended_vallue as an index in EX(call_slots)
- * opcoes ZEND_DO_FCALL and ZEND_DO_FCALL_BY_NAME use op2.num as
- an index in EX(call_slots)
- * added op_array->used_stack. It's calculated at compile time and the
- corresponding stack space is preallocated together with execute_data.
- ZEND_SEND* and ZEND_DO_FCALL* don't need to check for stack overflow
- anymore.
- * Removed execute_data->Ts field. The VM temporary variables always allocated
- immediately before execute_data structure. Now they are accessed by offset
- from the execute_data base pointer (instead of execute_data->Ts). Compiler
- stores new offsets in op_array->opcodes[*].op?.num. You can use macros
- EX_TMP_VAR() and EX_TMP_VAR_NUM() to access temp_variable by offset or
- number. You can convert number to offset using EX_TMP_VAR_NUM(0, num) or
- offset to number (EX_TMP_VAR_NUM(0,0)-EX_TMP_VAR(0,offset)).
- * Removed execute_data->CVs field. The VM compiled variables always allocated
- immediately after execute_data structure. Now they are accessed by offset
- from the execute_data base pointer (instead of execute_data->CVs). You can
- use macros EX_CV_NUM() to access compiled variables by number.
+ Two new object handlers have been added:
- b. Streams pooling API
+ do_operation:
+ typedef int (*zend_object_do_operation_t)(
+ zend_uchar opcode, zval *result, zval *op1, zval *op2 TSRMLS_DC
+ );
-The streams pooling API has been removed. The following functions no longer
-exist:
+ compare:
+ typedef int (*zend_object_compare_zvals_t)(
+ zval *result, zval *op1, zval *op2 TSRMLS_DC
+ );
-PHPAPI int php_stream_context_get_link(php_stream_context *context,
- const char *hostent, php_stream **stream);
-PHPAPI int php_stream_context_set_link(php_stream_context *context,
- const char *hostent, php_stream *stream);
-PHPAPI int php_stream_context_del_link(php_stream_context *context,
- php_stream *stream);
+ The first handler is used to overload arithmetic operations. The first
+ argument specifies the opcode of the operator, result is the target zval,
+ op1 the first operand and op2 the second operand. For unary operations
+ op2 is NULL. If the handler returns FAILURE PHP falls back to the default
+ behavior for the operation.
- c. Lowercasing and locales
+ The second handler is used to perform comparison operations with
+ non-objects. The value written into result must be an IS_LONG with value
+ -1 (smaller), 0 (equal) or 1 (greater). The return value is a SUCCESS/FAILURE
+ return code. The difference between this handler and compare_objects is
+ that it will be triggered for comparisons with non-objects and objects of
+ different types. It takes precedence over compare_objects.
-The lowercasing functions in zend_operators.c were split into those that do
-lowercasing according to locale rules and those that do ASCII lowercasing.
-ASCII:
-
- zend_str_tolower_copy
- zend_str_tolower_dup
- zend_str_tolower
- zend_binary_strcasecmp
- zend_binary_strncasecmp
-
-Locale-based:
- zend_binary_strncasecmp_l
- zend_binary_strcasecmp_l
- zend_binary_zval_strcasecmp
- zend_binary_zval_strncasecmp
- string_compare_function_ex
- string_case_compare_function
-
-Internal engine lowercasing will be using ASCII-only rules. User-facing functions,
-such as strcasecmp, will be using locale rules.
-
-Two new functions - zend_binary_strncasecmp_l and zend_binary_strcasecmp_l - added as
-locale-based counterparts to zend_binary_strcasecmp and zend_binary_strncasecmp.
-
- d. zend_qsort_r
-
-Added the function zend_qsort_r():
-
-typedef int (*compare_r_func_t)(const void *, const void * TSRMLS_DC, void *);
-void zend_qsort_r(void *base, size_t nmemb, size_t siz, compare_r_func_t compare, void *arg TSRMLS_DC);
-
-The extra argument it has (relatively to zend_qsort()) is passed to the
-comparison function.
-
- e. get_current_key
-
-The signature of the get_current_key iteration handler has been changed to:
-
-void (*get_current_key)(zend_object_iterator *iter, zval *key TSRMLS_DC);
-
-The key should be written into the zval* using the ZVAL_* macros.
+ Further docs in the RFC: https://wiki.php.net/rfc/operator_overloading_gmp
========================
2. Build system changes
@@ -116,5 +51,5 @@ The key should be written into the zval* using the ZVAL_* macros.
-
b. Windows build system changes
- - Drop Windows XP and 2003 support.
+ -
diff --git a/Zend/tests/bug30820.phpt b/Zend/tests/bug30820.phpt
index 97e46e9287..a0f71e72a7 100644
--- a/Zend/tests/bug30820.phpt
+++ b/Zend/tests/bug30820.phpt
@@ -2,6 +2,7 @@
Bug #30820 (static member conflict with $this->member silently ignored)
--INI--
error_reporting=4095
+opcache.optimization_level=0
--FILE--
<?php
class Blah {
diff --git a/Zend/tests/zend_signed_multiply-32bit.phpt b/Zend/tests/zend_signed_multiply-32bit.phpt
new file mode 100644
index 0000000000..3f37cbac19
--- /dev/null
+++ b/Zend/tests/zend_signed_multiply-32bit.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Zend signed multiply 32-bit
+--SKIPIF--
+<?php if ((1 << 31) > 0) print "skip Running on 64-bit target"; ?>
+--FILE--
+<?php
+var_dump(0x8000 * -0xffff);
+var_dump(0x8001 * 0xfffe);
+var_dump(0x8001 * -0xffff);
+?>
+--EXPECTF--
+int(-2147450880)
+int(2147483646)
+float(-2147516415)
diff --git a/Zend/tests/zend_signed_multiply-64bit.phpt b/Zend/tests/zend_signed_multiply-64bit.phpt
new file mode 100644
index 0000000000..94a6e035fa
--- /dev/null
+++ b/Zend/tests/zend_signed_multiply-64bit.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Zend signed multiply 64-bit
+--SKIPIF--
+<?php if ((1 << 31) < 0) print "skip Running on 32-bit target"; ?>
+--FILE--
+<?php
+var_dump(0x80000000 * -0xffffffff);
+var_dump(0x80000001 * 0xfffffffe);
+var_dump(0x80000001 * -0xffffffff);
+?>
+--EXPECTF--
+int(-9223372034707292160)
+int(9223372036854775806)
+float(-9.2233720390023E+18)
diff --git a/Zend/zend.h b/Zend/zend.h
index af653b15eb..1377fd5665 100644
--- a/Zend/zend.h
+++ b/Zend/zend.h
@@ -22,7 +22,7 @@
#ifndef ZEND_H
#define ZEND_H
-#define ZEND_VERSION "2.5.0"
+#define ZEND_VERSION "2.6.0-dev"
#define ZEND_ENGINE_2
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index a65f5331de..3c3dd8e3b0 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -183,8 +183,7 @@ static zend_always_inline zval *_get_zval_ptr_var(zend_uint var, const zend_exec
{
zval *ptr = EX_T(var).var.ptr;
- PZVAL_UNLOCK(ptr, should_free);
- return ptr;
+ return should_free->var = ptr;
}
static zend_never_inline zval **_get_zval_cv_lookup(zval ***ptr, zend_uint var, int type TSRMLS_DC)
@@ -386,6 +385,19 @@ static zend_always_inline zval **_get_zval_ptr_ptr_var(zend_uint var, const zend
return ptr_ptr;
}
+static zend_always_inline zval **_get_zval_ptr_ptr_var_fast(zend_uint var, const zend_execute_data *execute_data, zend_free_op *should_free TSRMLS_DC)
+{
+ zval** ptr_ptr = EX_T(var).var.ptr_ptr;
+
+ if (EXPECTED(ptr_ptr != NULL)) {
+ should_free->var = *ptr_ptr;
+ } else {
+ /* string offset */
+ should_free->var = EX_T(var).str_offset.str;
+ }
+ return ptr_ptr;
+}
+
static zend_always_inline zval **_get_zval_ptr_ptr_cv(zend_uint var, int type TSRMLS_DC)
{
zval ***ptr = EX_CV_NUM(EG(current_execute_data), var);
@@ -909,7 +921,7 @@ static inline zval* zend_assign_to_variable(zval **variable_ptr_ptr, zval *value
} else { /* we need to split */
Z_DELREF_P(variable_ptr);
GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr);
- if (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0) {
+ if (PZVAL_IS_REF(value)) {
ALLOC_ZVAL(variable_ptr);
*variable_ptr_ptr = variable_ptr;
INIT_PZVAL_COPY(variable_ptr, value);
@@ -918,7 +930,6 @@ static inline zval* zend_assign_to_variable(zval **variable_ptr_ptr, zval *value
} else {
*variable_ptr_ptr = value;
Z_ADDREF_P(value);
- Z_UNSET_ISREF_P(value);
return value;
}
}
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c
index 20896abf3e..c4cd8421cc 100644
--- a/Zend/zend_hash.c
+++ b/Zend/zend_hash.c
@@ -96,7 +96,7 @@ static void _zend_is_inconsistent(const HashTable *ht, const char *file, int lin
zend_hash_do_resize(ht); \
}
-static int zend_hash_do_resize(HashTable *ht);
+static void zend_hash_do_resize(HashTable *ht);
ZEND_API ulong zend_hash_func(const char *arKey, uint nKeyLength)
{
@@ -128,10 +128,6 @@ ZEND_API ulong zend_hash_func(const char *arKey, uint nKeyLength)
(p)->pData = &(p)->pDataPtr; \
} else { \
(p)->pData = (void *) pemalloc_rel(nDataSize, (ht)->persistent);\
- if (!(p)->pData) { \
- pefree_rel(p, (ht)->persistent); \
- return FAILURE; \
- } \
memcpy((p)->pData, pData, nDataSize); \
(p)->pDataPtr=NULL; \
}
@@ -245,15 +241,9 @@ ZEND_API int _zend_hash_add_or_update(HashTable *ht, const char *arKey, uint nKe
if (IS_INTERNED(arKey)) {
p = (Bucket *) pemalloc(sizeof(Bucket), ht->persistent);
- if (!p) {
- return FAILURE;
- }
p->arKey = arKey;
} else {
p = (Bucket *) pemalloc(sizeof(Bucket) + nKeyLength, ht->persistent);
- if (!p) {
- return FAILURE;
- }
p->arKey = (const char*)(p + 1);
memcpy((char*)p->arKey, arKey, nKeyLength);
}
@@ -322,15 +312,9 @@ ZEND_API int _zend_hash_quick_add_or_update(HashTable *ht, const char *arKey, ui
if (IS_INTERNED(arKey)) {
p = (Bucket *) pemalloc(sizeof(Bucket), ht->persistent);
- if (!p) {
- return FAILURE;
- }
p->arKey = arKey;
} else {
p = (Bucket *) pemalloc(sizeof(Bucket) + nKeyLength, ht->persistent);
- if (!p) {
- return FAILURE;
- }
p->arKey = (const char*)(p + 1);
memcpy((char*)p->arKey, arKey, nKeyLength);
}
@@ -410,9 +394,6 @@ ZEND_API int _zend_hash_index_update_or_next_insert(HashTable *ht, ulong h, void
p = p->pNext;
}
p = (Bucket *) pemalloc_rel(sizeof(Bucket), ht->persistent);
- if (!p) {
- return FAILURE;
- }
p->arKey = NULL;
p->nKeyLength = 0; /* Numeric indices are marked by making the nKeyLength == 0 */
p->h = h;
@@ -437,7 +418,7 @@ ZEND_API int _zend_hash_index_update_or_next_insert(HashTable *ht, ulong h, void
}
-static int zend_hash_do_resize(HashTable *ht)
+static void zend_hash_do_resize(HashTable *ht)
{
Bucket **t;
#ifdef ZEND_SIGNALS
@@ -447,19 +428,14 @@ static int zend_hash_do_resize(HashTable *ht)
IS_CONSISTENT(ht);
if ((ht->nTableSize << 1) > 0) { /* Let's double the table size */
- t = (Bucket **) perealloc_recoverable(ht->arBuckets, (ht->nTableSize << 1) * sizeof(Bucket *), ht->persistent);
- if (t) {
- HANDLE_BLOCK_INTERRUPTIONS();
- ht->arBuckets = t;
- ht->nTableSize = (ht->nTableSize << 1);
- ht->nTableMask = ht->nTableSize - 1;
- zend_hash_rehash(ht);
- HANDLE_UNBLOCK_INTERRUPTIONS();
- return SUCCESS;
- }
- return FAILURE;
+ t = (Bucket **) perealloc(ht->arBuckets, (ht->nTableSize << 1) * sizeof(Bucket *), ht->persistent);
+ HANDLE_BLOCK_INTERRUPTIONS();
+ ht->arBuckets = t;
+ ht->nTableSize = (ht->nTableSize << 1);
+ ht->nTableMask = ht->nTableSize - 1;
+ zend_hash_rehash(ht);
+ HANDLE_UNBLOCK_INTERRUPTIONS();
}
- return SUCCESS;
}
ZEND_API int zend_hash_rehash(HashTable *ht)
@@ -1449,9 +1425,6 @@ ZEND_API int zend_hash_sort(HashTable *ht, sort_func_t sort_func,
return SUCCESS;
}
arTmp = (Bucket **) pemalloc(ht->nNumOfElements * sizeof(Bucket *), ht->persistent);
- if (!arTmp) {
- return FAILURE;
- }
p = ht->pListHead;
i = 0;
while (p) {
diff --git a/Zend/zend_ini_scanner_defs.h b/Zend/zend_ini_scanner_defs.h
index 287d7bc1fb..5723954978 100644
--- a/Zend/zend_ini_scanner_defs.h
+++ b/Zend/zend_ini_scanner_defs.h
@@ -1,13 +1,13 @@
-/* Generated by re2c 0.13.5 */
-#line 3 "Zend/zend_ini_scanner_defs.h"
-
-enum YYCONDTYPE {
- yycINITIAL,
- yycST_OFFSET,
- yycST_SECTION_VALUE,
- yycST_VALUE,
- yycST_SECTION_RAW,
- yycST_DOUBLE_QUOTES,
- yycST_VARNAME,
- yycST_RAW,
-};
+/* Generated by re2c 0.13.5 */
+#line 3 "Zend/zend_ini_scanner_defs.h"
+
+enum YYCONDTYPE {
+ yycINITIAL,
+ yycST_OFFSET,
+ yycST_SECTION_VALUE,
+ yycST_VALUE,
+ yycST_SECTION_RAW,
+ yycST_DOUBLE_QUOTES,
+ yycST_VARNAME,
+ yycST_RAW,
+};
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c
index f7be37036f..921e0d798a 100644
--- a/Zend/zend_object_handlers.c
+++ b/Zend/zend_object_handlers.c
@@ -1651,6 +1651,8 @@ ZEND_API zend_object_handlers std_object_handlers = {
NULL, /* get_debug_info */
zend_std_get_closure, /* get_closure */
zend_std_get_gc, /* get_gc */
+ NULL, /* do_operation */
+ NULL, /* compare */
};
/*
diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h
index 3ea6008350..07428737ff 100644
--- a/Zend/zend_object_handlers.h
+++ b/Zend/zend_object_handlers.h
@@ -100,6 +100,7 @@ typedef zend_object_value (*zend_object_clone_obj_t)(zval *object TSRMLS_DC);
typedef zend_class_entry *(*zend_object_get_class_entry_t)(const zval *object TSRMLS_DC);
typedef int (*zend_object_get_class_name_t)(const zval *object, const char **class_name, zend_uint *class_name_len, int parent TSRMLS_DC);
typedef int (*zend_object_compare_t)(zval *object1, zval *object2 TSRMLS_DC);
+typedef int (*zend_object_compare_zvals_t)(zval *resul, zval *op1, zval *op2 TSRMLS_DC);
/* Cast an object to some other type
*/
@@ -113,6 +114,8 @@ typedef int (*zend_object_get_closure_t)(zval *obj, zend_class_entry **ce_ptr, u
typedef HashTable *(*zend_object_get_gc_t)(zval *object, zval ***table, int *n TSRMLS_DC);
+typedef int (*zend_object_do_operation_t)(zend_uchar opcode, zval *result, zval *op1, zval *op2 TSRMLS_DC);
+
struct _zend_object_handlers {
/* general object functions */
zend_object_add_ref_t add_ref;
@@ -142,6 +145,8 @@ struct _zend_object_handlers {
zend_object_get_debug_info_t get_debug_info;
zend_object_get_closure_t get_closure;
zend_object_get_gc_t get_gc;
+ zend_object_do_operation_t do_operation;
+ zend_object_compare_zvals_t compare;
};
extern ZEND_API zend_object_handlers std_object_handlers;
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index 88995c46b6..6073012188 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -857,6 +857,8 @@ ZEND_API int add_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ *
default:
if (!converted) {
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_ADD);
+
zendi_convert_scalar_to_number(op1, op1_copy, result);
zendi_convert_scalar_to_number(op2, op2_copy, result);
converted = 1;
@@ -904,6 +906,8 @@ ZEND_API int sub_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ *
default:
if (!converted) {
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_SUB);
+
zendi_convert_scalar_to_number(op1, op1_copy, result);
zendi_convert_scalar_to_number(op2, op2_copy, result);
converted = 1;
@@ -945,6 +949,8 @@ ZEND_API int mul_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ *
default:
if (!converted) {
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_MUL);
+
zendi_convert_scalar_to_number(op1, op1_copy, result);
zendi_convert_scalar_to_number(op2, op2_copy, result);
converted = 1;
@@ -1010,6 +1016,8 @@ ZEND_API int div_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ *
default:
if (!converted) {
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_DIV);
+
zendi_convert_scalar_to_number(op1, op1_copy, result);
zendi_convert_scalar_to_number(op2, op2_copy, result);
converted = 1;
@@ -1027,9 +1035,15 @@ ZEND_API int mod_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ *
zval op1_copy, op2_copy;
long op1_lval;
- zendi_convert_to_long(op1, op1_copy, result);
- op1_lval = Z_LVAL_P(op1);
- zendi_convert_to_long(op2, op2_copy, result);
+ if (Z_TYPE_P(op1) != IS_LONG || Z_TYPE_P(op2) != IS_LONG) {
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_MOD);
+
+ zendi_convert_to_long(op1, op1_copy, result);
+ op1_lval = Z_LVAL_P(op1);
+ zendi_convert_to_long(op2, op2_copy, result);
+ } else {
+ op1_lval = Z_LVAL_P(op1);
+ }
if (Z_LVAL_P(op2) == 0) {
zend_error(E_WARNING, "Division by zero");
@@ -1053,9 +1067,16 @@ ZEND_API int boolean_xor_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
zval op1_copy, op2_copy;
long op1_lval;
- zendi_convert_to_boolean(op1, op1_copy, result);
- op1_lval = Z_LVAL_P(op1);
- zendi_convert_to_boolean(op2, op2_copy, result);
+ if (Z_TYPE_P(op1) != IS_BOOL || Z_TYPE_P(op2) != IS_BOOL) {
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_BOOL_XOR);
+
+ zendi_convert_to_boolean(op1, op1_copy, result);
+ op1_lval = Z_LVAL_P(op1);
+ zendi_convert_to_boolean(op2, op2_copy, result);
+ } else {
+ op1_lval = Z_LVAL_P(op1);
+ }
+
ZVAL_BOOL(result, op1_lval ^ Z_LVAL_P(op2));
return SUCCESS;
}
@@ -1065,7 +1086,12 @@ ZEND_API int boolean_not_function(zval *result, zval *op1 TSRMLS_DC) /* {{{ */
{
zval op1_copy;
- zendi_convert_to_boolean(op1, op1_copy, result);
+ if (Z_TYPE_P(op1) != IS_BOOL) {
+ ZEND_TRY_UNARY_OBJECT_OPERATION(ZEND_BOOL_NOT);
+
+ zendi_convert_to_boolean(op1, op1_copy, result);
+ }
+
ZVAL_BOOL(result, !Z_LVAL_P(op1));
return SUCCESS;
}
@@ -1073,29 +1099,32 @@ ZEND_API int boolean_not_function(zval *result, zval *op1 TSRMLS_DC) /* {{{ */
ZEND_API int bitwise_not_function(zval *result, zval *op1 TSRMLS_DC) /* {{{ */
{
- zval op1_copy = *op1;
-
- op1 = &op1_copy;
- if (Z_TYPE_P(op1) == IS_LONG) {
- ZVAL_LONG(result, ~Z_LVAL_P(op1));
- return SUCCESS;
- } else if (Z_TYPE_P(op1) == IS_DOUBLE) {
- ZVAL_LONG(result, ~zend_dval_to_lval(Z_DVAL_P(op1)));
- return SUCCESS;
- } else if (Z_TYPE_P(op1) == IS_STRING) {
- int i;
-
- Z_TYPE_P(result) = IS_STRING;
- Z_STRVAL_P(result) = estrndup(Z_STRVAL_P(op1), Z_STRLEN_P(op1));
- Z_STRLEN_P(result) = Z_STRLEN_P(op1);
- for (i = 0; i < Z_STRLEN_P(op1); i++) {
- Z_STRVAL_P(result)[i] = ~Z_STRVAL_P(op1)[i];
+ switch (Z_TYPE_P(op1)) {
+ case IS_LONG:
+ ZVAL_LONG(result, ~Z_LVAL_P(op1));
+ return SUCCESS;
+ case IS_DOUBLE:
+ ZVAL_LONG(result, ~zend_dval_to_lval(Z_DVAL_P(op1)));
+ return SUCCESS;
+ case IS_STRING: {
+ int i;
+ zval op1_copy = *op1;
+
+ Z_TYPE_P(result) = IS_STRING;
+ Z_STRVAL_P(result) = estrndup(Z_STRVAL(op1_copy), Z_STRLEN(op1_copy));
+ Z_STRLEN_P(result) = Z_STRLEN(op1_copy);
+ for (i = 0; i < Z_STRLEN(op1_copy); i++) {
+ Z_STRVAL_P(result)[i] = ~Z_STRVAL(op1_copy)[i];
+ }
+ return SUCCESS;
}
- return SUCCESS;
+ default:
+ ZEND_TRY_UNARY_OBJECT_OPERATION(ZEND_BW_NOT);
+
+ zend_error(E_ERROR, "Unsupported operand types");
+ return FAILURE;
}
- zend_error(E_ERROR, "Unsupported operand types");
- return FAILURE; /* unknown datatype */
}
/* }}} */
@@ -1130,9 +1159,16 @@ ZEND_API int bitwise_or_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /
Z_STRLEN_P(result) = result_len;
return SUCCESS;
}
- zendi_convert_to_long(op1, op1_copy, result);
- op1_lval = Z_LVAL_P(op1);
- zendi_convert_to_long(op2, op2_copy, result);
+
+ if (Z_TYPE_P(op1) != IS_LONG || Z_TYPE_P(op2) != IS_LONG) {
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_BW_OR);
+
+ zendi_convert_to_long(op1, op1_copy, result);
+ op1_lval = Z_LVAL_P(op1);
+ zendi_convert_to_long(op2, op2_copy, result);
+ } else {
+ op1_lval = Z_LVAL_P(op1);
+ }
ZVAL_LONG(result, op1_lval | Z_LVAL_P(op2));
return SUCCESS;
@@ -1171,10 +1207,15 @@ ZEND_API int bitwise_and_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
return SUCCESS;
}
+ if (Z_TYPE_P(op1) != IS_LONG || Z_TYPE_P(op2) != IS_LONG) {
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_BW_AND);
- zendi_convert_to_long(op1, op1_copy, result);
- op1_lval = Z_LVAL_P(op1);
- zendi_convert_to_long(op2, op2_copy, result);
+ zendi_convert_to_long(op1, op1_copy, result);
+ op1_lval = Z_LVAL_P(op1);
+ zendi_convert_to_long(op2, op2_copy, result);
+ } else {
+ op1_lval = Z_LVAL_P(op1);
+ }
ZVAL_LONG(result, op1_lval & Z_LVAL_P(op2));
return SUCCESS;
@@ -1213,9 +1254,15 @@ ZEND_API int bitwise_xor_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
return SUCCESS;
}
- zendi_convert_to_long(op1, op1_copy, result);
- op1_lval = Z_LVAL_P(op1);
- zendi_convert_to_long(op2, op2_copy, result);
+ if (Z_TYPE_P(op1) != IS_LONG || Z_TYPE_P(op2) != IS_LONG) {
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_BW_XOR);
+
+ zendi_convert_to_long(op1, op1_copy, result);
+ op1_lval = Z_LVAL_P(op1);
+ zendi_convert_to_long(op2, op2_copy, result);
+ } else {
+ op1_lval = Z_LVAL_P(op1);
+ }
ZVAL_LONG(result, op1_lval ^ Z_LVAL_P(op2));
return SUCCESS;
@@ -1227,9 +1274,16 @@ ZEND_API int shift_left_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /
zval op1_copy, op2_copy;
long op1_lval;
- zendi_convert_to_long(op1, op1_copy, result);
- op1_lval = Z_LVAL_P(op1);
- zendi_convert_to_long(op2, op2_copy, result);
+ if (Z_TYPE_P(op1) != IS_LONG || Z_TYPE_P(op2) != IS_LONG) {
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_SL);
+
+ zendi_convert_to_long(op1, op1_copy, result);
+ op1_lval = Z_LVAL_P(op1);
+ zendi_convert_to_long(op2, op2_copy, result);
+ } else {
+ op1_lval = Z_LVAL_P(op1);
+ }
+
ZVAL_LONG(result, op1_lval << Z_LVAL_P(op2));
return SUCCESS;
}
@@ -1240,9 +1294,16 @@ ZEND_API int shift_right_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
zval op1_copy, op2_copy;
long op1_lval;
- zendi_convert_to_long(op1, op1_copy, result);
- op1_lval = Z_LVAL_P(op1);
- zendi_convert_to_long(op2, op2_copy, result);
+ if (Z_TYPE_P(op1) != IS_LONG || Z_TYPE_P(op2) != IS_LONG) {
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_SR);
+
+ zendi_convert_to_long(op1, op1_copy, result);
+ op1_lval = Z_LVAL_P(op1);
+ zendi_convert_to_long(op2, op2_copy, result);
+ } else {
+ op1_lval = Z_LVAL_P(op1);
+ }
+
ZVAL_LONG(result, op1_lval >> Z_LVAL_P(op2));
return SUCCESS;
}
@@ -1291,11 +1352,15 @@ ZEND_API int concat_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{
zval op1_copy, op2_copy;
int use_copy1 = 0, use_copy2 = 0;
- if (Z_TYPE_P(op1) != IS_STRING) {
- zend_make_printable_zval(op1, &op1_copy, &use_copy1);
- }
- if (Z_TYPE_P(op2) != IS_STRING) {
- zend_make_printable_zval(op2, &op2_copy, &use_copy2);
+ if (Z_TYPE_P(op1) != IS_STRING || Z_TYPE_P(op2) != IS_STRING) {
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_CONCAT);
+
+ if (Z_TYPE_P(op1) != IS_STRING) {
+ zend_make_printable_zval(op1, &op1_copy, &use_copy1);
+ }
+ if (Z_TYPE_P(op2) != IS_STRING) {
+ zend_make_printable_zval(op2, &op2_copy, &use_copy2);
+ }
}
if (use_copy1) {
@@ -1526,20 +1591,24 @@ ZEND_API int compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {
ZVAL_LONG(result, -1);
return SUCCESS;
- case TYPE_PAIR(IS_OBJECT, IS_OBJECT):
- /* If both are objects sharing the same comparision handler then use is */
- if (Z_OBJ_HANDLER_P(op1,compare_objects) == Z_OBJ_HANDLER_P(op2,compare_objects)) {
+ default:
+ if (Z_TYPE_P(op1) == IS_OBJECT && Z_OBJ_HANDLER_P(op1, compare)) {
+ return Z_OBJ_HANDLER_P(op1, compare)(result, op1, op2 TSRMLS_CC);
+ } else if (Z_TYPE_P(op2) == IS_OBJECT && Z_OBJ_HANDLER_P(op2, compare)) {
+ return Z_OBJ_HANDLER_P(op2, compare)(result, op1, op2 TSRMLS_CC);
+ }
+
+ if (Z_TYPE_P(op1) == IS_OBJECT && Z_TYPE_P(op2) == IS_OBJECT) {
if (Z_OBJ_HANDLE_P(op1) == Z_OBJ_HANDLE_P(op2)) {
/* object handles are identical, apparently this is the same object */
ZVAL_LONG(result, 0);
return SUCCESS;
}
- ZVAL_LONG(result, Z_OBJ_HT_P(op1)->compare_objects(op1, op2 TSRMLS_CC));
- return SUCCESS;
+ if (Z_OBJ_HANDLER_P(op1, compare_objects) == Z_OBJ_HANDLER_P(op2, compare_objects)) {
+ ZVAL_LONG(result, Z_OBJ_HANDLER_P(op1, compare_objects)(op1, op2 TSRMLS_CC));
+ return SUCCESS;
+ }
}
- /* break missing intentionally */
-
- default:
if (Z_TYPE_P(op1) == IS_OBJECT) {
if (Z_OBJ_HT_P(op1)->get) {
op_free = Z_OBJ_HT_P(op1)->get(op1 TSRMLS_CC);
@@ -1890,6 +1959,20 @@ ZEND_API int increment_function(zval *op1) /* {{{ */
}
}
break;
+ case IS_OBJECT:
+ if (Z_OBJ_HANDLER_P(op1, do_operation)) {
+ zval *op2;
+ int res;
+ TSRMLS_FETCH();
+
+ MAKE_STD_ZVAL(op2);
+ ZVAL_LONG(op2, 1);
+ res = Z_OBJ_HANDLER_P(op1, do_operation)(ZEND_ADD, op1, op1, op2 TSRMLS_CC);
+ zval_ptr_dtor(&op2);
+
+ return res;
+ }
+ return FAILURE;
default:
return FAILURE;
}
@@ -1936,6 +2019,20 @@ ZEND_API int decrement_function(zval *op1) /* {{{ */
break;
}
break;
+ case IS_OBJECT:
+ if (Z_OBJ_HANDLER_P(op1, do_operation)) {
+ zval *op2;
+ int res;
+ TSRMLS_FETCH();
+
+ MAKE_STD_ZVAL(op2);
+ ZVAL_LONG(op2, 1);
+ res = Z_OBJ_HANDLER_P(op1, do_operation)(ZEND_SUB, op1, op1, op2 TSRMLS_CC);
+ zval_ptr_dtor(&op2);
+
+ return res;
+ }
+ return FAILURE;
default:
return FAILURE;
}
diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h
index 0b890ff48c..e7ab9bb3fe 100644
--- a/Zend/zend_operators.h
+++ b/Zend/zend_operators.h
@@ -945,6 +945,24 @@ static zend_always_inline int fast_is_smaller_or_equal_function(zval *result, zv
return Z_LVAL_P(result) <= 0;
}
+#define ZEND_TRY_BINARY_OBJECT_OPERATION(opcode) \
+ if (Z_TYPE_P(op1) == IS_OBJECT && Z_OBJ_HANDLER_P(op1, do_operation)) { \
+ if (SUCCESS == Z_OBJ_HANDLER_P(op1, do_operation)(opcode, result, op1, op2 TSRMLS_CC)) { \
+ return SUCCESS; \
+ } \
+ } else if (Z_TYPE_P(op2) == IS_OBJECT && Z_OBJ_HANDLER_P(op2, do_operation)) { \
+ if (SUCCESS == Z_OBJ_HANDLER_P(op2, do_operation)(opcode, result, op1, op2 TSRMLS_CC)) { \
+ return SUCCESS; \
+ } \
+ }
+
+#define ZEND_TRY_UNARY_OBJECT_OPERATION(opcode) \
+ if (Z_TYPE_P(op1) == IS_OBJECT && Z_OBJ_HANDLER_P(op1, do_operation) \
+ && SUCCESS == Z_OBJ_HANDLER_P(op1, do_operation)(opcode, result, op1, NULL TSRMLS_CC) \
+ ) { \
+ return SUCCESS; \
+ }
+
#endif
/*
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index edb52bc4e4..518af4365f 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -1170,22 +1170,18 @@ ZEND_VM_HANDLER(81, ZEND_FETCH_DIM_R, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
SAVE_OPLINE();
- if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
- OP1_TYPE != IS_CV &&
- EX_T(opline->op1.var).var.ptr_ptr) {
- PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
- }
-
if (OP1_TYPE == IS_TMP_VAR || OP1_TYPE == IS_CONST) {
zval *container = GET_OP1_ZVAL_PTR(BP_VAR_R);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE, BP_VAR_R TSRMLS_CC);
FREE_OP2();
FREE_OP1();
} else {
- container = GET_OP1_ZVAL_PTR_PTR(BP_VAR_R);
+ container = GET_OP1_ZVAL_PTR_PTR_FAST(BP_VAR_R);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE, BP_VAR_R TSRMLS_CC);
FREE_OP2();
- FREE_OP1_VAR_PTR();
+ if (OP1_TYPE == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+ FREE_OP1_VAR_PTR_FAST();
+ }
}
CHECK_EXCEPTION();
@@ -1255,10 +1251,10 @@ ZEND_VM_HANDLER(90, ZEND_FETCH_DIM_IS, VAR|CV, CONST|TMP|VAR|CV)
zval **container;
SAVE_OPLINE();
- container = GET_OP1_ZVAL_PTR_PTR(BP_VAR_IS);
+ container = GET_OP1_ZVAL_PTR_PTR_FAST(BP_VAR_IS);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE, BP_VAR_IS TSRMLS_CC);
FREE_OP2();
- FREE_OP1_VAR_PTR();
+ FREE_OP1_VAR_PTR_FAST();
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -1280,15 +1276,17 @@ ZEND_VM_HANDLER(93, ZEND_FETCH_DIM_FUNC_ARG, VAR|CV, CONST|TMP|VAR|UNUSED|CV)
if (OP1_TYPE == IS_VAR && OP1_FREE && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
}
+ FREE_OP2();
+ FREE_OP1_VAR_PTR();
} else {
if (OP2_TYPE == IS_UNUSED) {
zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
}
- container = GET_OP1_ZVAL_PTR_PTR(BP_VAR_R);
+ container = GET_OP1_ZVAL_PTR_PTR_FAST(BP_VAR_R);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE, BP_VAR_R TSRMLS_CC);
+ FREE_OP2();
+ FREE_OP1_VAR_PTR_FAST();
}
- FREE_OP2();
- FREE_OP1_VAR_PTR();
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -1928,14 +1926,15 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
if (UNEXPECTED((fbc->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_DEPRECATED)) != 0)) {
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_ABSTRACT) != 0)) {
zend_error_noreturn(E_ERROR, "Cannot call abstract method %s::%s()", fbc->common.scope->name, fbc->common.function_name);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE(); /* Never reached */
}
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
zend_error(E_DEPRECATED, "Function %s%s%s() is deprecated",
fbc->common.scope ? fbc->common.scope->name : "",
fbc->common.scope ? "::" : "",
fbc->common.function_name);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ HANDLE_EXCEPTION();
+ }
}
}
if (fbc->common.scope &&
@@ -1945,6 +1944,9 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
/* FIXME: output identifiers properly */
zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically", fbc->common.scope->name, fbc->common.function_name);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ HANDLE_EXCEPTION();
+ }
} else {
/* FIXME: output identifiers properly */
/* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
@@ -2842,9 +2844,7 @@ ZEND_VM_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
retval_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
if (!EG(return_value_ptr_ptr)) {
- if (OP1_TYPE == IS_TMP_VAR) {
- FREE_OP1();
- }
+ FREE_OP1();
} else {
if (OP1_TYPE == IS_CONST ||
OP1_TYPE == IS_TMP_VAR ||
@@ -2857,18 +2857,23 @@ ZEND_VM_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
zval_copy_ctor(ret);
}
*EG(return_value_ptr_ptr) = ret;
+ FREE_OP1_IF_VAR();
} else if ((OP1_TYPE == IS_CV || OP1_TYPE == IS_VAR) &&
retval_ptr == &EG(uninitialized_zval)) {
zval *ret;
+ if (OP1_TYPE == IS_VAR) {
+ Z_DELREF_P(retval_ptr);
+ }
ALLOC_INIT_ZVAL(ret);
*EG(return_value_ptr_ptr) = ret;
} else {
*EG(return_value_ptr_ptr) = retval_ptr;
- Z_ADDREF_P(retval_ptr);
+ if (OP1_TYPE == IS_CV) {
+ Z_ADDREF_P(retval_ptr);
+ }
}
}
- FREE_OP1_IF_VAR();
ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
}
@@ -2936,7 +2941,7 @@ ZEND_VM_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY)
}
} while (0);
- FREE_OP1_IF_VAR();
+ FREE_OP1_VAR_PTR();
ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
}
@@ -3079,21 +3084,26 @@ ZEND_VM_HELPER(zend_send_by_var_helper, VAR|CV, ANY)
varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
if (varptr == &EG(uninitialized_zval)) {
- ALLOC_ZVAL(varptr);
- INIT_ZVAL(*varptr);
- Z_SET_REFCOUNT_P(varptr, 0);
+ if (OP1_TYPE == IS_VAR) {
+ Z_DELREF_P(varptr);
+ }
+ ALLOC_INIT_ZVAL(varptr);
} else if (PZVAL_IS_REF(varptr)) {
- zval *original_var = varptr;
+ if (OP1_TYPE == IS_CV ||
+ (OP1_TYPE == IS_VAR && Z_REFCOUNT_P(varptr) > 2)) {
+ zval *original_var = varptr;
- ALLOC_ZVAL(varptr);
- ZVAL_COPY_VALUE(varptr, original_var);
- Z_UNSET_ISREF_P(varptr);
- Z_SET_REFCOUNT_P(varptr, 0);
- zval_copy_ctor(varptr);
+ ALLOC_ZVAL(varptr);
+ INIT_PZVAL_COPY(varptr, original_var);
+ zval_copy_ctor(varptr);
+ FREE_OP1();
+ } else {
+ Z_UNSET_ISREF_P(varptr);
+ }
+ } else if (OP1_TYPE == IS_CV) {
+ Z_ADDREF_P(varptr);
}
- Z_ADDREF_P(varptr);
zend_vm_stack_push(varptr TSRMLS_CC);
- FREE_OP1(); /* for string offsets */
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -3114,22 +3124,15 @@ ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR|CV, ANY)
ZEND_VM_DISPATCH_TO_HELPER(zend_send_by_var_helper);
}
- if (OP1_TYPE == IS_VAR &&
- (opline->extended_value & ZEND_ARG_SEND_FUNCTION) &&
- EX_T(opline->op1.var).var.fcall_returned_reference &&
- EX_T(opline->op1.var).var.ptr) {
- varptr = EX_T(opline->op1.var).var.ptr;
- PZVAL_UNLOCK_EX(varptr, &free_op1, 0);
- } else {
- varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
- }
+ varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) ||
EX_T(opline->op1.var).var.fcall_returned_reference) &&
varptr != &EG(uninitialized_zval) &&
- (PZVAL_IS_REF(varptr) ||
- (Z_REFCOUNT_P(varptr) == 1 && (OP1_TYPE == IS_CV || free_op1.var)))) {
+ (PZVAL_IS_REF(varptr) || Z_REFCOUNT_P(varptr) == 1)) {
Z_SET_ISREF_P(varptr);
- Z_ADDREF_P(varptr);
+ if (OP1_TYPE == IS_CV) {
+ Z_ADDREF_P(varptr);
+ }
zend_vm_stack_push(varptr TSRMLS_CC);
} else {
zval *valptr;
@@ -3144,9 +3147,9 @@ ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR|CV, ANY)
if (!IS_OP1_TMP_FREE()) {
zval_copy_ctor(valptr);
}
+ FREE_OP1_IF_VAR();
zend_vm_stack_push(valptr TSRMLS_CC);
}
- FREE_OP1_IF_VAR();
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -3345,9 +3348,6 @@ ZEND_VM_HANDLER(48, ZEND_CASE, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
zend_free_op free_op1, free_op2;
SAVE_OPLINE();
- if (OP1_TYPE==IS_VAR) {
- PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
- }
is_equal_function(&EX_T(opline->result.var).tmp_var,
GET_OP1_ZVAL_PTR(BP_VAR_R),
GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
@@ -3611,7 +3611,8 @@ ZEND_VM_HANDLER(72, ZEND_ADD_ARRAY_ELEMENT, CONST|TMP|VAR|CV, CONST|TMP|VAR|UNUS
INIT_PZVAL_COPY(new_expr, expr_ptr);
expr_ptr = new_expr;
zendi_zval_copy_ctor(*expr_ptr);
- } else {
+ FREE_OP1_IF_VAR();
+ } else if (OP1_TYPE == IS_CV) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -3659,8 +3660,6 @@ ZEND_VM_C_LABEL(num_index):
}
if ((OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) && opline->extended_value) {
FREE_OP1_VAR_PTR();
- } else {
- FREE_OP1_IF_VAR();
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -4149,19 +4148,27 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
} else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
ce = Z_OBJCE_P(array_ptr);
if (!ce || !ce->get_iterator) {
- Z_ADDREF_P(array_ptr);
+ if (OP1_TYPE == IS_CV) {
+ Z_ADDREF_P(array_ptr);
+ }
}
} else if (OP1_TYPE == IS_CONST ||
- ((OP1_TYPE == IS_CV || OP1_TYPE == IS_VAR) &&
+ (OP1_TYPE == IS_CV &&
+ !Z_ISREF_P(array_ptr) &&
+ Z_REFCOUNT_P(array_ptr) > 1) ||
+ (OP1_TYPE == IS_VAR &&
!Z_ISREF_P(array_ptr) &&
- Z_REFCOUNT_P(array_ptr) > 1)) {
+ Z_REFCOUNT_P(array_ptr) > 2)) {
zval *tmp;
+ if (OP1_TYPE == IS_VAR) {
+ Z_DELREF_P(array_ptr);
+ }
ALLOC_ZVAL(tmp);
INIT_PZVAL_COPY(tmp, array_ptr);
zval_copy_ctor(tmp);
array_ptr = tmp;
- } else {
+ } else if (OP1_TYPE == IS_CV) {
Z_ADDREF_P(array_ptr);
}
}
@@ -4169,10 +4176,15 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
if (ce && ce->get_iterator) {
iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
+ if (OP1_TYPE == IS_VAR && !(opline->extended_value & ZEND_FE_RESET_VARIABLE)) {
+ FREE_OP1_IF_VAR();
+ }
if (iter && EXPECTED(EG(exception) == NULL)) {
array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
} else {
- FREE_OP1_IF_VAR();
+ if (OP1_TYPE == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+ FREE_OP1_VAR_PTR();
+ }
if (!EG(exception)) {
zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
}
@@ -4189,14 +4201,18 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
iter->funcs->rewind(iter TSRMLS_CC);
if (UNEXPECTED(EG(exception) != NULL)) {
zval_ptr_dtor(&array_ptr);
- FREE_OP1_IF_VAR();
+ if (OP1_TYPE == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+ FREE_OP1_VAR_PTR();
+ }
HANDLE_EXCEPTION();
}
}
is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
if (UNEXPECTED(EG(exception) != NULL)) {
zval_ptr_dtor(&array_ptr);
- FREE_OP1_IF_VAR();
+ if (OP1_TYPE == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+ FREE_OP1_VAR_PTR();
+ }
HANDLE_EXCEPTION();
}
iter->index = -1; /* will be set to 0 before using next handler */
@@ -4226,7 +4242,9 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
is_empty = 1;
}
- FREE_OP1_IF_VAR();
+ if (OP1_TYPE == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+ FREE_OP1_VAR_PTR();
+ }
if (is_empty) {
ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
} else {
@@ -4462,7 +4480,7 @@ ZEND_VM_HELPER_EX(zend_isset_isempty_dim_prop_obj_handler, VAR|UNUSED|CV, CONST|
zval *offset;
SAVE_OPLINE();
- container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_IS);
+ container = GET_OP1_OBJ_ZVAL_PTR_PTR_FAST(BP_VAR_IS);
offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
@@ -4589,7 +4607,7 @@ ZEND_VM_C_LABEL(num_index_prop):
Z_LVAL(EX_T(opline->result.var).tmp_var) = !result;
}
- FREE_OP1_VAR_PTR();
+ FREE_OP1_VAR_PTR_FAST();
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -5291,14 +5309,14 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSE
generator->value = *value_ptr;
}
- FREE_OP1_IF_VAR();
+ FREE_OP1_VAR_PTR();
}
} else {
zval *value = GET_OP1_ZVAL_PTR(BP_VAR_R);
/* Consts, temporary variables and references need copying */
if (OP1_TYPE == IS_CONST || OP1_TYPE == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -5311,12 +5329,13 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSE
}
generator->value = copy;
+ FREE_OP1_IF_VAR();
} else {
- Z_ADDREF_P(value);
+ if (OP1_TYPE == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
- FREE_OP1_IF_VAR();
}
} else {
/* If no value was specified yield null */
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index f7d73017cd..a6fec47952 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -480,14 +480,15 @@ static int ZEND_FASTCALL zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_AR
if (UNEXPECTED((fbc->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_DEPRECATED)) != 0)) {
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_ABSTRACT) != 0)) {
zend_error_noreturn(E_ERROR, "Cannot call abstract method %s::%s()", fbc->common.scope->name, fbc->common.function_name);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE(); /* Never reached */
}
if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
zend_error(E_DEPRECATED, "Function %s%s%s() is deprecated",
fbc->common.scope ? fbc->common.scope->name : "",
fbc->common.scope ? "::" : "",
fbc->common.function_name);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ HANDLE_EXCEPTION();
+ }
}
}
if (fbc->common.scope &&
@@ -497,6 +498,9 @@ static int ZEND_FASTCALL zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_AR
if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
/* FIXME: output identifiers properly */
zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically", fbc->common.scope->name, fbc->common.function_name);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ HANDLE_EXCEPTION();
+ }
} else {
/* FIXME: output identifiers properly */
/* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
@@ -1712,7 +1716,7 @@ static int ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_
zend_error_noreturn(E_ERROR, "Class name must be a valid object or a string");
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -1761,7 +1765,7 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER(ZEND_OPCODE_H
zend_error_noreturn(E_ERROR, "Call to undefined function %s()", function_name_strval);
}
efree(lcname);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
call->object = NULL;
call->called_scope = NULL;
call->is_ctor_call = 0;
@@ -1780,7 +1784,7 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER(ZEND_OPCODE_H
/* Delay closure destruction until its invocation */
call->fbc->common.prototype = (zend_function*)function_name;
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
call->is_ctor_call = 0;
EX(call) = call;
@@ -1851,7 +1855,7 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER(ZEND_OPCODE_H
}
call->is_ctor_call = 0;
EX(call) = call;
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
} else {
@@ -2332,9 +2336,7 @@ static int ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARG
retval_ptr = opline->op1.zv;
if (!EG(return_value_ptr_ptr)) {
- if (IS_CONST == IS_TMP_VAR) {
- }
} else {
if (IS_CONST == IS_CONST ||
IS_CONST == IS_TMP_VAR ||
@@ -2347,18 +2349,23 @@ static int ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARG
zval_copy_ctor(ret);
}
*EG(return_value_ptr_ptr) = ret;
+
} else if ((IS_CONST == IS_CV || IS_CONST == IS_VAR) &&
retval_ptr == &EG(uninitialized_zval)) {
zval *ret;
+ if (IS_CONST == IS_VAR) {
+ Z_DELREF_P(retval_ptr);
+ }
ALLOC_INIT_ZVAL(ret);
*EG(return_value_ptr_ptr) = ret;
} else {
*EG(return_value_ptr_ptr) = retval_ptr;
- Z_ADDREF_P(retval_ptr);
+ if (IS_CONST == IS_CV) {
+ Z_ADDREF_P(retval_ptr);
+ }
}
}
-
return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
}
@@ -2818,19 +2825,27 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
} else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
ce = Z_OBJCE_P(array_ptr);
if (!ce || !ce->get_iterator) {
- Z_ADDREF_P(array_ptr);
+ if (IS_CONST == IS_CV) {
+ Z_ADDREF_P(array_ptr);
+ }
}
} else if (IS_CONST == IS_CONST ||
- ((IS_CONST == IS_CV || IS_CONST == IS_VAR) &&
+ (IS_CONST == IS_CV &&
+ !Z_ISREF_P(array_ptr) &&
+ Z_REFCOUNT_P(array_ptr) > 1) ||
+ (IS_CONST == IS_VAR &&
!Z_ISREF_P(array_ptr) &&
- Z_REFCOUNT_P(array_ptr) > 1)) {
+ Z_REFCOUNT_P(array_ptr) > 2)) {
zval *tmp;
+ if (IS_CONST == IS_VAR) {
+ Z_DELREF_P(array_ptr);
+ }
ALLOC_ZVAL(tmp);
INIT_PZVAL_COPY(tmp, array_ptr);
zval_copy_ctor(tmp);
array_ptr = tmp;
- } else {
+ } else if (IS_CONST == IS_CV) {
Z_ADDREF_P(array_ptr);
}
}
@@ -2838,10 +2853,15 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
if (ce && ce->get_iterator) {
iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
+ if (IS_CONST == IS_VAR && !(opline->extended_value & ZEND_FE_RESET_VARIABLE)) {
+
+ }
if (iter && EXPECTED(EG(exception) == NULL)) {
array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
} else {
+ if (IS_CONST == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+ }
if (!EG(exception)) {
zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
}
@@ -2858,14 +2878,18 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
iter->funcs->rewind(iter TSRMLS_CC);
if (UNEXPECTED(EG(exception) != NULL)) {
zval_ptr_dtor(&array_ptr);
+ if (IS_CONST == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+ }
HANDLE_EXCEPTION();
}
}
is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
if (UNEXPECTED(EG(exception) != NULL)) {
zval_ptr_dtor(&array_ptr);
+ if (IS_CONST == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+ }
HANDLE_EXCEPTION();
}
iter->index = -1; /* will be set to 0 before using next handler */
@@ -2895,6 +2919,9 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
is_empty = 1;
}
+ if (IS_CONST == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+
+ }
if (is_empty) {
ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
} else {
@@ -3477,12 +3504,6 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_
SAVE_OPLINE();
- if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
- IS_CONST != IS_CV &&
- EX_T(opline->op1.var).var.ptr_ptr) {
- PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
- }
-
if (IS_CONST == IS_TMP_VAR || IS_CONST == IS_CONST) {
zval *container = opline->op1.zv;
zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
@@ -3492,7 +3513,9 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_
container = NULL;
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
+ if (IS_CONST == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+ }
}
CHECK_EXCEPTION();
@@ -3652,9 +3675,6 @@ static int ZEND_FASTCALL ZEND_CASE_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER
SAVE_OPLINE();
- if (IS_CONST==IS_VAR) {
- PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
- }
is_equal_function(&EX_T(opline->result.var).tmp_var,
opline->op1.zv,
opline->op2.zv TSRMLS_CC);
@@ -3791,7 +3811,8 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST_HANDLER(ZEND_O
INIT_PZVAL_COPY(new_expr, expr_ptr);
expr_ptr = new_expr;
zendi_zval_copy_ctor(*expr_ptr);
- } else {
+
+ } else if (IS_CONST == IS_CV) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -3839,8 +3860,6 @@ num_index:
}
if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && opline->extended_value) {
- } else {
-
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -4135,7 +4154,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLE
/* Consts, temporary variables and references need copying */
if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -4148,11 +4167,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLE
}
generator->value = copy;
+
} else {
- Z_ADDREF_P(value);
+ if (IS_CONST == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
}
} else {
/* If no value was specified yield null */
@@ -4500,12 +4521,6 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HA
SAVE_OPLINE();
- if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
- IS_CONST != IS_CV &&
- EX_T(opline->op1.var).var.ptr_ptr) {
- PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
- }
-
if (IS_CONST == IS_TMP_VAR || IS_CONST == IS_CONST) {
zval *container = opline->op1.zv;
zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
@@ -4515,7 +4530,9 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HA
container = NULL;
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
zval_dtor(free_op2.var);
+ if (IS_CONST == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+ }
}
CHECK_EXCEPTION();
@@ -4651,9 +4668,6 @@ static int ZEND_FASTCALL ZEND_CASE_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_A
zend_free_op free_op2;
SAVE_OPLINE();
- if (IS_CONST==IS_VAR) {
- PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
- }
is_equal_function(&EX_T(opline->result.var).tmp_var,
opline->op1.zv,
_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
@@ -4694,7 +4708,8 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMP_HANDLER(ZEND_OPC
INIT_PZVAL_COPY(new_expr, expr_ptr);
expr_ptr = new_expr;
zendi_zval_copy_ctor(*expr_ptr);
- } else {
+
+ } else if (IS_CONST == IS_CV) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -4742,8 +4757,6 @@ num_index:
}
if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && opline->extended_value) {
- } else {
-
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -4835,7 +4848,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_
/* Consts, temporary variables and references need copying */
if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -4848,11 +4861,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_
}
generator->value = copy;
+
} else {
- Z_ADDREF_P(value);
+ if (IS_CONST == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
}
} else {
/* If no value was specified yield null */
@@ -4926,7 +4941,7 @@ static int ZEND_FASTCALL ZEND_ADD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
opline->op1.zv,
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -4941,7 +4956,7 @@ static int ZEND_FASTCALL ZEND_SUB_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
opline->op1.zv,
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -4956,7 +4971,7 @@ static int ZEND_FASTCALL ZEND_MUL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
opline->op1.zv,
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -4971,7 +4986,7 @@ static int ZEND_FASTCALL ZEND_DIV_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
opline->op1.zv,
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -4986,7 +5001,7 @@ static int ZEND_FASTCALL ZEND_MOD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
opline->op1.zv,
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -5001,7 +5016,7 @@ static int ZEND_FASTCALL ZEND_SL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
opline->op1.zv,
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -5016,7 +5031,7 @@ static int ZEND_FASTCALL ZEND_SR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
opline->op1.zv,
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -5031,7 +5046,7 @@ static int ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER
opline->op1.zv,
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -5046,7 +5061,7 @@ static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_H
opline->op1.zv,
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -5063,7 +5078,7 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCO
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
Z_LVAL_P(result) = !Z_LVAL_P(result);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -5079,7 +5094,7 @@ static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDL
opline->op1.zv,
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -5095,7 +5110,7 @@ static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_H
opline->op1.zv,
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -5111,7 +5126,7 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HAN
opline->op1.zv,
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -5127,7 +5142,7 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_VAR_HANDLER(ZEND_O
opline->op1.zv,
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -5142,7 +5157,7 @@ static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_
opline->op1.zv,
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -5157,7 +5172,7 @@ static int ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER
opline->op1.zv,
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -5172,7 +5187,7 @@ static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER
opline->op1.zv,
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -5187,7 +5202,7 @@ static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDL
opline->op1.zv,
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -5364,22 +5379,18 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HA
SAVE_OPLINE();
- if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
- IS_CONST != IS_CV &&
- EX_T(opline->op1.var).var.ptr_ptr) {
- PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
- }
-
if (IS_CONST == IS_TMP_VAR || IS_CONST == IS_CONST) {
zval *container = opline->op1.zv;
zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
} else {
container = NULL;
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
+ if (IS_CONST == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+ }
}
CHECK_EXCEPTION();
@@ -5470,7 +5481,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_VAR_HANDLER(ZE
}
}
if (IS_VAR != IS_CONST) {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
} else {
if (UNEXPECTED(ce->constructor == NULL)) {
@@ -5515,14 +5526,11 @@ static int ZEND_FASTCALL ZEND_CASE_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_A
zend_free_op free_op2;
SAVE_OPLINE();
- if (IS_CONST==IS_VAR) {
- PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
- }
is_equal_function(&EX_T(opline->result.var).tmp_var,
opline->op1.zv,
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -5558,7 +5566,8 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_VAR_HANDLER(ZEND_OPC
INIT_PZVAL_COPY(new_expr, expr_ptr);
expr_ptr = new_expr;
zendi_zval_copy_ctor(*expr_ptr);
- } else {
+
+ } else if (IS_CONST == IS_CV) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -5600,14 +5609,12 @@ num_index:
/* do nothing */
break;
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
} else {
zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
}
if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && opline->extended_value) {
- } else {
-
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -5862,7 +5869,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_
/* Consts, temporary variables and references need copying */
if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -5875,11 +5882,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_
}
generator->value = copy;
+
} else {
- Z_ADDREF_P(value);
+ if (IS_CONST == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
}
} else {
/* If no value was specified yield null */
@@ -5918,7 +5927,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_
generator->largest_used_integer_key = Z_LVAL_P(generator->key);
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
} else {
/* If no key was specified we use auto-increment keys */
generator->largest_used_integer_key++;
@@ -6262,7 +6271,8 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER(ZEND_
INIT_PZVAL_COPY(new_expr, expr_ptr);
expr_ptr = new_expr;
zendi_zval_copy_ctor(*expr_ptr);
- } else {
+
+ } else if (IS_CONST == IS_CV) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -6310,8 +6320,6 @@ num_index:
}
if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && opline->extended_value) {
- } else {
-
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -6584,7 +6592,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDL
/* Consts, temporary variables and references need copying */
if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -6597,11 +6605,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDL
}
generator->value = copy;
+
} else {
- Z_ADDREF_P(value);
+ if (IS_CONST == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
}
} else {
/* If no value was specified yield null */
@@ -6949,12 +6959,6 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HAN
SAVE_OPLINE();
- if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
- IS_CONST != IS_CV &&
- EX_T(opline->op1.var).var.ptr_ptr) {
- PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
- }
-
if (IS_CONST == IS_TMP_VAR || IS_CONST == IS_CONST) {
zval *container = opline->op1.zv;
zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
@@ -6964,7 +6968,9 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HAN
container = NULL;
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
+ if (IS_CONST == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+ }
}
CHECK_EXCEPTION();
@@ -7160,9 +7166,6 @@ static int ZEND_FASTCALL ZEND_CASE_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_AR
SAVE_OPLINE();
- if (IS_CONST==IS_VAR) {
- PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
- }
is_equal_function(&EX_T(opline->result.var).tmp_var,
opline->op1.zv,
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
@@ -7202,7 +7205,8 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV_HANDLER(ZEND_OPCO
INIT_PZVAL_COPY(new_expr, expr_ptr);
expr_ptr = new_expr;
zendi_zval_copy_ctor(*expr_ptr);
- } else {
+
+ } else if (IS_CONST == IS_CV) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -7250,8 +7254,6 @@ num_index:
}
if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && opline->extended_value) {
- } else {
-
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -7343,7 +7345,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_A
/* Consts, temporary variables and references need copying */
if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -7356,11 +7358,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_A
}
generator->value = copy;
+
} else {
- Z_ADDREF_P(value);
+ if (IS_CONST == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
}
} else {
/* If no value was specified yield null */
@@ -7657,9 +7661,7 @@ static int ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
retval_ptr = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
if (!EG(return_value_ptr_ptr)) {
- if (IS_TMP_VAR == IS_TMP_VAR) {
- zval_dtor(free_op1.var);
- }
+ zval_dtor(free_op1.var);
} else {
if (IS_TMP_VAR == IS_CONST ||
IS_TMP_VAR == IS_TMP_VAR ||
@@ -7672,18 +7674,23 @@ static int ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
zval_copy_ctor(ret);
}
*EG(return_value_ptr_ptr) = ret;
+
} else if ((IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) &&
retval_ptr == &EG(uninitialized_zval)) {
zval *ret;
+ if (IS_TMP_VAR == IS_VAR) {
+ Z_DELREF_P(retval_ptr);
+ }
ALLOC_INIT_ZVAL(ret);
*EG(return_value_ptr_ptr) = ret;
} else {
*EG(return_value_ptr_ptr) = retval_ptr;
- Z_ADDREF_P(retval_ptr);
+ if (IS_TMP_VAR == IS_CV) {
+ Z_ADDREF_P(retval_ptr);
+ }
}
}
-
return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
}
@@ -8144,19 +8151,27 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
} else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
ce = Z_OBJCE_P(array_ptr);
if (!ce || !ce->get_iterator) {
- Z_ADDREF_P(array_ptr);
+ if (IS_TMP_VAR == IS_CV) {
+ Z_ADDREF_P(array_ptr);
+ }
}
} else if (IS_TMP_VAR == IS_CONST ||
- ((IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) &&
+ (IS_TMP_VAR == IS_CV &&
!Z_ISREF_P(array_ptr) &&
- Z_REFCOUNT_P(array_ptr) > 1)) {
+ Z_REFCOUNT_P(array_ptr) > 1) ||
+ (IS_TMP_VAR == IS_VAR &&
+ !Z_ISREF_P(array_ptr) &&
+ Z_REFCOUNT_P(array_ptr) > 2)) {
zval *tmp;
+ if (IS_TMP_VAR == IS_VAR) {
+ Z_DELREF_P(array_ptr);
+ }
ALLOC_ZVAL(tmp);
INIT_PZVAL_COPY(tmp, array_ptr);
zval_copy_ctor(tmp);
array_ptr = tmp;
- } else {
+ } else if (IS_TMP_VAR == IS_CV) {
Z_ADDREF_P(array_ptr);
}
}
@@ -8164,10 +8179,15 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
if (ce && ce->get_iterator) {
iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
+ if (IS_TMP_VAR == IS_VAR && !(opline->extended_value & ZEND_FE_RESET_VARIABLE)) {
+
+ }
if (iter && EXPECTED(EG(exception) == NULL)) {
array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
} else {
+ if (IS_TMP_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+ }
if (!EG(exception)) {
zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
}
@@ -8184,14 +8204,18 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
iter->funcs->rewind(iter TSRMLS_CC);
if (UNEXPECTED(EG(exception) != NULL)) {
zval_ptr_dtor(&array_ptr);
+ if (IS_TMP_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+ }
HANDLE_EXCEPTION();
}
}
is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
if (UNEXPECTED(EG(exception) != NULL)) {
zval_ptr_dtor(&array_ptr);
+ if (IS_TMP_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+ }
HANDLE_EXCEPTION();
}
iter->index = -1; /* will be set to 0 before using next handler */
@@ -8221,6 +8245,9 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
is_empty = 1;
}
+ if (IS_TMP_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+
+ }
if (is_empty) {
ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
} else {
@@ -8855,12 +8882,6 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HA
SAVE_OPLINE();
- if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
- IS_TMP_VAR != IS_CV &&
- EX_T(opline->op1.var).var.ptr_ptr) {
- PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
- }
-
if (IS_TMP_VAR == IS_TMP_VAR || IS_TMP_VAR == IS_CONST) {
zval *container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
@@ -8870,7 +8891,9 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HA
container = NULL;
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
+ if (IS_TMP_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+ }
}
CHECK_EXCEPTION();
@@ -9032,9 +9055,6 @@ static int ZEND_FASTCALL ZEND_CASE_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
zend_free_op free_op1;
SAVE_OPLINE();
- if (IS_TMP_VAR==IS_VAR) {
- PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
- }
is_equal_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
opline->op2.zv TSRMLS_CC);
@@ -9074,7 +9094,8 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST_HANDLER(ZEND_OPC
INIT_PZVAL_COPY(new_expr, expr_ptr);
expr_ptr = new_expr;
zendi_zval_copy_ctor(*expr_ptr);
- } else {
+
+ } else if (IS_TMP_VAR == IS_CV) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -9122,8 +9143,6 @@ num_index:
}
if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && opline->extended_value) {
- } else {
-
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -9378,7 +9397,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_
/* Consts, temporary variables and references need copying */
if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -9391,11 +9410,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_
}
generator->value = copy;
+
} else {
- Z_ADDREF_P(value);
+ if (IS_TMP_VAR == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
}
} else {
/* If no value was specified yield null */
@@ -9743,12 +9764,6 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HAND
SAVE_OPLINE();
- if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
- IS_TMP_VAR != IS_CV &&
- EX_T(opline->op1.var).var.ptr_ptr) {
- PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
- }
-
if (IS_TMP_VAR == IS_TMP_VAR || IS_TMP_VAR == IS_CONST) {
zval *container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
@@ -9758,7 +9773,9 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HAND
container = NULL;
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
zval_dtor(free_op2.var);
+ if (IS_TMP_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+ }
}
CHECK_EXCEPTION();
@@ -9896,9 +9913,6 @@ static int ZEND_FASTCALL ZEND_CASE_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
zend_free_op free_op1, free_op2;
SAVE_OPLINE();
- if (IS_TMP_VAR==IS_VAR) {
- PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
- }
is_equal_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
@@ -9939,7 +9953,8 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMP_HANDLER(ZEND_OPCOD
INIT_PZVAL_COPY(new_expr, expr_ptr);
expr_ptr = new_expr;
zendi_zval_copy_ctor(*expr_ptr);
- } else {
+
+ } else if (IS_TMP_VAR == IS_CV) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -9987,8 +10002,6 @@ num_index:
}
if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && opline->extended_value) {
- } else {
-
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -10080,7 +10093,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
/* Consts, temporary variables and references need copying */
if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -10093,11 +10106,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
}
generator->value = copy;
+
} else {
- Z_ADDREF_P(value);
+ if (IS_TMP_VAR == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
}
} else {
/* If no value was specified yield null */
@@ -10171,7 +10186,7 @@ static int ZEND_FASTCALL ZEND_ADD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
zval_dtor(free_op1.var);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -10186,7 +10201,7 @@ static int ZEND_FASTCALL ZEND_SUB_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
zval_dtor(free_op1.var);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -10201,7 +10216,7 @@ static int ZEND_FASTCALL ZEND_MUL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
zval_dtor(free_op1.var);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -10216,7 +10231,7 @@ static int ZEND_FASTCALL ZEND_DIV_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
zval_dtor(free_op1.var);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -10231,7 +10246,7 @@ static int ZEND_FASTCALL ZEND_MOD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
zval_dtor(free_op1.var);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -10246,7 +10261,7 @@ static int ZEND_FASTCALL ZEND_SL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
zval_dtor(free_op1.var);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -10261,7 +10276,7 @@ static int ZEND_FASTCALL ZEND_SR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
zval_dtor(free_op1.var);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -10276,7 +10291,7 @@ static int ZEND_FASTCALL ZEND_CONCAT_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_A
_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
zval_dtor(free_op1.var);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -10291,7 +10306,7 @@ static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HAN
_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
zval_dtor(free_op1.var);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -10308,7 +10323,7 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
Z_LVAL_P(result) = !Z_LVAL_P(result);
zval_dtor(free_op1.var);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -10324,7 +10339,7 @@ static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER
_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
zval_dtor(free_op1.var);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -10340,7 +10355,7 @@ static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HAN
_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
zval_dtor(free_op1.var);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -10356,7 +10371,7 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDL
_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
zval_dtor(free_op1.var);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -10372,7 +10387,7 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_VAR_HANDLER(ZEND_OPC
_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
zval_dtor(free_op1.var);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -10387,7 +10402,7 @@ static int ZEND_FASTCALL ZEND_BW_OR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
zval_dtor(free_op1.var);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -10402,7 +10417,7 @@ static int ZEND_FASTCALL ZEND_BW_AND_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_A
_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
zval_dtor(free_op1.var);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -10417,7 +10432,7 @@ static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_A
_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
zval_dtor(free_op1.var);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -10432,7 +10447,7 @@ static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER
_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
zval_dtor(free_op1.var);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -10609,22 +10624,18 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HAND
SAVE_OPLINE();
- if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
- IS_TMP_VAR != IS_CV &&
- EX_T(opline->op1.var).var.ptr_ptr) {
- PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
- }
-
if (IS_TMP_VAR == IS_TMP_VAR || IS_TMP_VAR == IS_CONST) {
zval *container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
zval_dtor(free_op1.var);
} else {
container = NULL;
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
+ if (IS_TMP_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+ }
}
CHECK_EXCEPTION();
@@ -10670,7 +10681,7 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_
* which aren't affected by FREE_OP(Ts, )'s anyway, unless they're
* string offsets or overloaded objects
*/
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -10728,7 +10739,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE
}
} else {
if (UNEXPECTED(EG(exception) != NULL)) {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
HANDLE_EXCEPTION();
}
zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
@@ -10750,7 +10761,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE
call->is_ctor_call = 0;
EX(call) = call;
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -10762,14 +10773,11 @@ static int ZEND_FASTCALL ZEND_CASE_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
zend_free_op free_op1, free_op2;
SAVE_OPLINE();
- if (IS_TMP_VAR==IS_VAR) {
- PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
- }
is_equal_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -10805,7 +10813,8 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD
INIT_PZVAL_COPY(new_expr, expr_ptr);
expr_ptr = new_expr;
zendi_zval_copy_ctor(*expr_ptr);
- } else {
+
+ } else if (IS_TMP_VAR == IS_CV) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -10847,14 +10856,12 @@ num_index:
/* do nothing */
break;
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
} else {
zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
}
if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && opline->extended_value) {
- } else {
-
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -11109,7 +11116,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
/* Consts, temporary variables and references need copying */
if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -11122,11 +11129,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
}
generator->value = copy;
+
} else {
- Z_ADDREF_P(value);
+ if (IS_TMP_VAR == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
}
} else {
/* If no value was specified yield null */
@@ -11165,7 +11174,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
generator->largest_used_integer_key = Z_LVAL_P(generator->key);
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
} else {
/* If no key was specified we use auto-increment keys */
generator->largest_used_integer_key++;
@@ -11386,7 +11395,8 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED_HANDLER(ZEND_OP
INIT_PZVAL_COPY(new_expr, expr_ptr);
expr_ptr = new_expr;
zendi_zval_copy_ctor(*expr_ptr);
- } else {
+
+ } else if (IS_TMP_VAR == IS_CV) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -11434,8 +11444,6 @@ num_index:
}
if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && opline->extended_value) {
- } else {
-
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -11690,7 +11698,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER
/* Consts, temporary variables and references need copying */
if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -11703,11 +11711,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER
}
generator->value = copy;
+
} else {
- Z_ADDREF_P(value);
+ if (IS_TMP_VAR == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
}
} else {
/* If no value was specified yield null */
@@ -12055,12 +12065,6 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDL
SAVE_OPLINE();
- if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
- IS_TMP_VAR != IS_CV &&
- EX_T(opline->op1.var).var.ptr_ptr) {
- PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
- }
-
if (IS_TMP_VAR == IS_TMP_VAR || IS_TMP_VAR == IS_CONST) {
zval *container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
@@ -12070,7 +12074,9 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDL
container = NULL;
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
+ if (IS_TMP_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+ }
}
CHECK_EXCEPTION();
@@ -12206,9 +12212,6 @@ static int ZEND_FASTCALL ZEND_CASE_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
zend_free_op free_op1;
SAVE_OPLINE();
- if (IS_TMP_VAR==IS_VAR) {
- PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
- }
is_equal_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
@@ -12248,7 +12251,8 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_HANDLER(ZEND_OPCODE
INIT_PZVAL_COPY(new_expr, expr_ptr);
expr_ptr = new_expr;
zendi_zval_copy_ctor(*expr_ptr);
- } else {
+
+ } else if (IS_TMP_VAR == IS_CV) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -12296,8 +12300,6 @@ num_index:
}
if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && opline->extended_value) {
- } else {
-
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -12389,7 +12391,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
/* Consts, temporary variables and references need copying */
if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -12402,11 +12404,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
}
generator->value = copy;
+
} else {
- Z_ADDREF_P(value);
+ if (IS_TMP_VAR == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
}
} else {
/* If no value was specified yield null */
@@ -12478,7 +12482,7 @@ static int ZEND_FASTCALL ZEND_BW_NOT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
SAVE_OPLINE();
bitwise_not_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -12491,7 +12495,7 @@ static int ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
SAVE_OPLINE();
boolean_not_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -12690,7 +12694,7 @@ static int ZEND_FASTCALL ZEND_ECHO_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
}
zend_print_variable(z);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -12717,7 +12721,7 @@ static int ZEND_FASTCALL ZEND_JMPZ_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
ret = Z_LVAL_P(val);
} else {
ret = i_zend_is_true(val);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -12747,7 +12751,7 @@ static int ZEND_FASTCALL ZEND_JMPNZ_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
ret = Z_LVAL_P(val);
} else {
ret = i_zend_is_true(val);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -12777,7 +12781,7 @@ static int ZEND_FASTCALL ZEND_JMPZNZ_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
retval = Z_LVAL_P(val);
} else {
retval = i_zend_is_true(val);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -12811,7 +12815,7 @@ static int ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
retval = Z_LVAL_P(val);
} else {
retval = i_zend_is_true(val);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -12842,7 +12846,7 @@ static int ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
retval = Z_LVAL_P(val);
} else {
retval = i_zend_is_true(val);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
}
@@ -12883,9 +12887,7 @@ static int ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
retval_ptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
if (!EG(return_value_ptr_ptr)) {
- if (IS_VAR == IS_TMP_VAR) {
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- }
+ zval_ptr_dtor(&free_op1.var);
} else {
if (IS_VAR == IS_CONST ||
IS_VAR == IS_TMP_VAR ||
@@ -12898,18 +12900,23 @@ static int ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
zval_copy_ctor(ret);
}
*EG(return_value_ptr_ptr) = ret;
+ zval_ptr_dtor(&free_op1.var);
} else if ((IS_VAR == IS_CV || IS_VAR == IS_VAR) &&
retval_ptr == &EG(uninitialized_zval)) {
zval *ret;
+ if (IS_VAR == IS_VAR) {
+ Z_DELREF_P(retval_ptr);
+ }
ALLOC_INIT_ZVAL(ret);
*EG(return_value_ptr_ptr) = ret;
} else {
*EG(return_value_ptr_ptr) = retval_ptr;
- Z_ADDREF_P(retval_ptr);
+ if (IS_VAR == IS_CV) {
+ Z_ADDREF_P(retval_ptr);
+ }
}
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
}
@@ -12930,7 +12937,7 @@ static int ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLE
retval_ptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
if (!EG(return_value_ptr_ptr)) {
if (IS_VAR == IS_TMP_VAR) {
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
}
} else if (!0) { /* Not a temp var */
zval *ret;
@@ -13008,7 +13015,7 @@ static int ZEND_FASTCALL ZEND_THROW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
zend_throw_exception_object(exception TSRMLS_CC);
zend_exception_restore(TSRMLS_C);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
HANDLE_EXCEPTION();
}
@@ -13020,21 +13027,26 @@ static int ZEND_FASTCALL zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_AR
varptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
if (varptr == &EG(uninitialized_zval)) {
- ALLOC_ZVAL(varptr);
- INIT_ZVAL(*varptr);
- Z_SET_REFCOUNT_P(varptr, 0);
+ if (IS_VAR == IS_VAR) {
+ Z_DELREF_P(varptr);
+ }
+ ALLOC_INIT_ZVAL(varptr);
} else if (PZVAL_IS_REF(varptr)) {
- zval *original_var = varptr;
+ if (IS_VAR == IS_CV ||
+ (IS_VAR == IS_VAR && Z_REFCOUNT_P(varptr) > 2)) {
+ zval *original_var = varptr;
- ALLOC_ZVAL(varptr);
- ZVAL_COPY_VALUE(varptr, original_var);
- Z_UNSET_ISREF_P(varptr);
- Z_SET_REFCOUNT_P(varptr, 0);
- zval_copy_ctor(varptr);
+ ALLOC_ZVAL(varptr);
+ INIT_PZVAL_COPY(varptr, original_var);
+ zval_copy_ctor(varptr);
+ zval_ptr_dtor(&free_op1.var);
+ } else {
+ Z_UNSET_ISREF_P(varptr);
+ }
+ } else if (IS_VAR == IS_CV) {
+ Z_ADDREF_P(varptr);
}
- Z_ADDREF_P(varptr);
zend_vm_stack_push(varptr TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; /* for string offsets */
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -13055,22 +13067,15 @@ static int ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HAND
return zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
}
- if (IS_VAR == IS_VAR &&
- (opline->extended_value & ZEND_ARG_SEND_FUNCTION) &&
- EX_T(opline->op1.var).var.fcall_returned_reference &&
- EX_T(opline->op1.var).var.ptr) {
- varptr = EX_T(opline->op1.var).var.ptr;
- PZVAL_UNLOCK_EX(varptr, &free_op1, 0);
- } else {
- varptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
- }
+ varptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) ||
EX_T(opline->op1.var).var.fcall_returned_reference) &&
varptr != &EG(uninitialized_zval) &&
- (PZVAL_IS_REF(varptr) ||
- (Z_REFCOUNT_P(varptr) == 1 && (IS_VAR == IS_CV || free_op1.var)))) {
+ (PZVAL_IS_REF(varptr) || Z_REFCOUNT_P(varptr) == 1)) {
Z_SET_ISREF_P(varptr);
- Z_ADDREF_P(varptr);
+ if (IS_VAR == IS_CV) {
+ Z_ADDREF_P(varptr);
+ }
zend_vm_stack_push(varptr TSRMLS_CC);
} else {
zval *valptr;
@@ -13085,9 +13090,9 @@ static int ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HAND
if (!0) {
zval_copy_ctor(valptr);
}
+ zval_ptr_dtor(&free_op1.var);
zend_vm_stack_push(valptr TSRMLS_CC);
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -13150,7 +13155,7 @@ static int ZEND_FASTCALL ZEND_BOOL_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
SAVE_OPLINE();
/* PHP 3.0 returned "" for false and 1 for true, here we use 0 and 1 for now */
ZVAL_BOOL(retval, i_zend_is_true(_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC)));
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -13227,7 +13232,7 @@ static int ZEND_FASTCALL ZEND_CLONE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
AI_SET_PTR(&EX_T(opline->result.var), retval);
}
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -13269,7 +13274,7 @@ static int ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
if (use_copy) {
ZVAL_COPY_VALUE(result, &var_copy);
if (0) {
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
}
} else {
ZVAL_COPY_VALUE(result, expr);
@@ -13286,7 +13291,7 @@ static int ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
convert_to_object(result);
break;
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -13375,7 +13380,7 @@ static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER(ZEND_OPCODE_HAND
if (tmp_inc_filename) {
zval_ptr_dtor(&tmp_inc_filename);
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
if (UNEXPECTED(EG(exception) != NULL)) {
HANDLE_EXCEPTION();
} else if (EXPECTED(new_op_array != NULL)) {
@@ -13482,19 +13487,27 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
} else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
ce = Z_OBJCE_P(array_ptr);
if (!ce || !ce->get_iterator) {
- Z_ADDREF_P(array_ptr);
+ if (IS_VAR == IS_CV) {
+ Z_ADDREF_P(array_ptr);
+ }
}
} else if (IS_VAR == IS_CONST ||
- ((IS_VAR == IS_CV || IS_VAR == IS_VAR) &&
+ (IS_VAR == IS_CV &&
+ !Z_ISREF_P(array_ptr) &&
+ Z_REFCOUNT_P(array_ptr) > 1) ||
+ (IS_VAR == IS_VAR &&
!Z_ISREF_P(array_ptr) &&
- Z_REFCOUNT_P(array_ptr) > 1)) {
+ Z_REFCOUNT_P(array_ptr) > 2)) {
zval *tmp;
+ if (IS_VAR == IS_VAR) {
+ Z_DELREF_P(array_ptr);
+ }
ALLOC_ZVAL(tmp);
INIT_PZVAL_COPY(tmp, array_ptr);
zval_copy_ctor(tmp);
array_ptr = tmp;
- } else {
+ } else if (IS_VAR == IS_CV) {
Z_ADDREF_P(array_ptr);
}
}
@@ -13502,10 +13515,15 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
if (ce && ce->get_iterator) {
iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
+ if (IS_VAR == IS_VAR && !(opline->extended_value & ZEND_FE_RESET_VARIABLE)) {
+ zval_ptr_dtor(&free_op1.var);
+ }
if (iter && EXPECTED(EG(exception) == NULL)) {
array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
} else {
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ if (IS_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ }
if (!EG(exception)) {
zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
}
@@ -13522,14 +13540,18 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
iter->funcs->rewind(iter TSRMLS_CC);
if (UNEXPECTED(EG(exception) != NULL)) {
zval_ptr_dtor(&array_ptr);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ if (IS_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ }
HANDLE_EXCEPTION();
}
}
is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
if (UNEXPECTED(EG(exception) != NULL)) {
zval_ptr_dtor(&array_ptr);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ if (IS_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ }
HANDLE_EXCEPTION();
}
iter->index = -1; /* will be set to 0 before using next handler */
@@ -13559,7 +13581,9 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
is_empty = 1;
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ if (IS_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ }
if (is_empty) {
ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
} else {
@@ -13714,7 +13738,7 @@ static int ZEND_FASTCALL ZEND_EXIT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
} else {
zend_print_variable(ptr);
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
}
#endif
zend_bailout();
@@ -13735,14 +13759,14 @@ static int ZEND_FASTCALL ZEND_JMP_SET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
if (!0) {
zendi_zval_copy_ctor(EX_T(opline->result.var).tmp_var);
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
#if DEBUG_ZEND>=2
printf("Conditional jmp to %d\n", opline->op2.opline_num);
#endif
ZEND_VM_JMP(opline->op2.jmp_addr);
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -13770,14 +13794,14 @@ static int ZEND_FASTCALL ZEND_JMP_SET_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_
zval_copy_ctor(EX_T(opline->result.var).var.ptr);
}
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
#if DEBUG_ZEND>=2
printf("Conditional jmp to %d\n", opline->op2.opline_num);
#endif
ZEND_VM_JMP(opline->op2.jmp_addr);
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -13795,7 +13819,7 @@ static int ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
if (!0) {
zval_copy_ctor(&EX_T(opline->result.var).tmp_var);
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -13823,7 +13847,7 @@ static int ZEND_FASTCALL ZEND_QM_ASSIGN_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLE
}
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -13844,7 +13868,7 @@ static int ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_A
result = 0;
}
ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, result);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -13858,7 +13882,7 @@ static int ZEND_FASTCALL ZEND_ADD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_AR
fast_add_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
opline->op2.zv TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -13873,7 +13897,7 @@ static int ZEND_FASTCALL ZEND_SUB_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_AR
fast_sub_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
opline->op2.zv TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -13888,7 +13912,7 @@ static int ZEND_FASTCALL ZEND_MUL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_AR
fast_mul_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
opline->op2.zv TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -13903,7 +13927,7 @@ static int ZEND_FASTCALL ZEND_DIV_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_AR
fast_div_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
opline->op2.zv TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -13918,7 +13942,7 @@ static int ZEND_FASTCALL ZEND_MOD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_AR
fast_mod_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
opline->op2.zv TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -13933,7 +13957,7 @@ static int ZEND_FASTCALL ZEND_SL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARG
shift_left_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
opline->op2.zv TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -13948,7 +13972,7 @@ static int ZEND_FASTCALL ZEND_SR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARG
shift_right_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
opline->op2.zv TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -13963,7 +13987,7 @@ static int ZEND_FASTCALL ZEND_CONCAT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER
concat_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
opline->op2.zv TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -13978,7 +14002,7 @@ static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_H
is_identical_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
opline->op2.zv TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -13995,7 +14019,7 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCO
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
opline->op2.zv TSRMLS_CC);
Z_LVAL_P(result) = !Z_LVAL_P(result);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -14011,7 +14035,7 @@ static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDL
ZVAL_BOOL(result, fast_equal_function(result,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
opline->op2.zv TSRMLS_CC));
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -14027,7 +14051,7 @@ static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_H
ZVAL_BOOL(result, fast_not_equal_function(result,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
opline->op2.zv TSRMLS_CC));
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -14043,7 +14067,7 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAN
ZVAL_BOOL(result, fast_is_smaller_function(result,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
opline->op2.zv TSRMLS_CC));
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -14059,7 +14083,7 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_CONST_HANDLER(ZEND_O
ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
opline->op2.zv TSRMLS_CC));
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -14074,7 +14098,7 @@ static int ZEND_FASTCALL ZEND_BW_OR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_
bitwise_or_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
opline->op2.zv TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -14089,7 +14113,7 @@ static int ZEND_FASTCALL ZEND_BW_AND_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER
bitwise_and_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
opline->op2.zv TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -14104,7 +14128,7 @@ static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER
bitwise_xor_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
opline->op2.zv TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -14119,7 +14143,7 @@ static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDL
boolean_xor_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
opline->op2.zv TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -14621,7 +14645,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_CONST(int type,
if (IS_VAR != IS_CONST && varname == &tmp_varname) {
zval_dtor(&tmp_varname);
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -14631,7 +14655,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_CONST(int type,
ce = EX_T(opline->op2.var).class_entry;
}
retval = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 0, ((IS_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
} else {
target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
/*
@@ -14670,11 +14694,11 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_CONST(int type,
switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
case ZEND_FETCH_GLOBAL:
if (IS_VAR != IS_TMP_VAR) {
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
}
break;
case ZEND_FETCH_LOCAL:
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
break;
case ZEND_FETCH_STATIC:
zval_update_constant(retval, (void*) 1 TSRMLS_CC);
@@ -14759,22 +14783,18 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HA
SAVE_OPLINE();
- if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
- IS_VAR != IS_CV &&
- EX_T(opline->op1.var).var.ptr_ptr) {
- PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
- }
-
if (IS_VAR == IS_TMP_VAR || IS_VAR == IS_CONST) {
zval *container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
} else {
- container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ if (IS_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+ zval_ptr_dtor(&free_op1.var);
+ }
}
CHECK_EXCEPTION();
@@ -14844,10 +14864,10 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_H
zval **container;
SAVE_OPLINE();
- container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_IS TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -14869,15 +14889,17 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OP
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
}
+
+ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
} else {
if (IS_CONST == IS_UNUSED) {
zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
}
- container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
- }
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
+ }
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -14961,7 +14983,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_CONST(
}
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -15088,7 +15110,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_H
}
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -15412,7 +15434,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCO
call->is_ctor_call = 0;
EX(call) = call;
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -15547,9 +15569,6 @@ static int ZEND_FASTCALL ZEND_CASE_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
zend_free_op free_op1;
SAVE_OPLINE();
- if (IS_VAR==IS_VAR) {
- PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
- }
is_equal_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
opline->op2.zv TSRMLS_CC);
@@ -15686,7 +15705,8 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST_HANDLER(ZEND_OPC
INIT_PZVAL_COPY(new_expr, expr_ptr);
expr_ptr = new_expr;
zendi_zval_copy_ctor(*expr_ptr);
- } else {
+ zval_ptr_dtor(&free_op1.var);
+ } else if (IS_VAR == IS_CV) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -15734,8 +15754,6 @@ num_index:
}
if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) {
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- } else {
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -15804,7 +15822,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAND
} else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
zval_ptr_dtor(&varname);
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
HANDLE_EXCEPTION();
}
if (UNEXPECTED(ce == NULL)) {
@@ -15828,7 +15846,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAND
} else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
zval_ptr_dtor(&varname);
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -16038,7 +16056,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPC
if (IS_VAR != IS_CONST && varname == &tmp) {
zval_dtor(&tmp);
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
}
if (opline->extended_value & ZEND_ISSET) {
@@ -16070,7 +16088,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CONST(
zval *offset;
SAVE_OPLINE();
- container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
offset = opline->op2.zv;
@@ -16197,7 +16215,7 @@ num_index_prop:
Z_LVAL(EX_T(opline->result.var).tmp_var) = !result;
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -16286,7 +16304,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_
/* Consts, temporary variables and references need copying */
if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -16299,12 +16317,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_
}
generator->value = copy;
+ zval_ptr_dtor(&free_op1.var);
} else {
- Z_ADDREF_P(value);
+ if (IS_VAR == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
}
} else {
/* If no value was specified yield null */
@@ -16377,7 +16396,7 @@ static int ZEND_FASTCALL ZEND_ADD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS
fast_add_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
zval_dtor(free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -16392,7 +16411,7 @@ static int ZEND_FASTCALL ZEND_SUB_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS
fast_sub_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
zval_dtor(free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -16407,7 +16426,7 @@ static int ZEND_FASTCALL ZEND_MUL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS
fast_mul_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
zval_dtor(free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -16422,7 +16441,7 @@ static int ZEND_FASTCALL ZEND_DIV_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS
fast_div_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
zval_dtor(free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -16437,7 +16456,7 @@ static int ZEND_FASTCALL ZEND_MOD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS
fast_mod_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
zval_dtor(free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -16452,7 +16471,7 @@ static int ZEND_FASTCALL ZEND_SL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
shift_left_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
zval_dtor(free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -16467,7 +16486,7 @@ static int ZEND_FASTCALL ZEND_SR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
shift_right_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
zval_dtor(free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -16482,7 +16501,7 @@ static int ZEND_FASTCALL ZEND_CONCAT_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_A
concat_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
zval_dtor(free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -16497,7 +16516,7 @@ static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAN
is_identical_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
zval_dtor(free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -16514,7 +16533,7 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
Z_LVAL_P(result) = !Z_LVAL_P(result);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
zval_dtor(free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -16530,7 +16549,7 @@ static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER
ZVAL_BOOL(result, fast_equal_function(result,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
zval_dtor(free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -16546,7 +16565,7 @@ static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAN
ZVAL_BOOL(result, fast_not_equal_function(result,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
zval_dtor(free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -16562,7 +16581,7 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDL
ZVAL_BOOL(result, fast_is_smaller_function(result,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
zval_dtor(free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -16578,7 +16597,7 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_TMP_HANDLER(ZEND_OPC
ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
zval_dtor(free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -16593,7 +16612,7 @@ static int ZEND_FASTCALL ZEND_BW_OR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
bitwise_or_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
zval_dtor(free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -16608,7 +16627,7 @@ static int ZEND_FASTCALL ZEND_BW_AND_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_A
bitwise_and_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
zval_dtor(free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -16623,7 +16642,7 @@ static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_A
bitwise_xor_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
zval_dtor(free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -16638,7 +16657,7 @@ static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER
boolean_xor_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
zval_dtor(free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -17115,22 +17134,18 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAND
SAVE_OPLINE();
- if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
- IS_VAR != IS_CV &&
- EX_T(opline->op1.var).var.ptr_ptr) {
- PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
- }
-
if (IS_VAR == IS_TMP_VAR || IS_VAR == IS_CONST) {
zval *container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
zval_dtor(free_op2.var);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
} else {
- container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
zval_dtor(free_op2.var);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ if (IS_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+ zval_ptr_dtor(&free_op1.var);
+ }
}
CHECK_EXCEPTION();
@@ -17200,10 +17215,10 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAN
zval **container;
SAVE_OPLINE();
- container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_IS TSRMLS_CC);
zval_dtor(free_op2.var);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -17225,15 +17240,17 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMP_HANDLER(ZEND_OPCO
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
}
+ zval_dtor(free_op2.var);
+ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
} else {
if (IS_TMP_VAR == IS_UNUSED) {
zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
}
- container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
+ zval_dtor(free_op2.var);
+ zval_ptr_dtor(&free_op1.var);
}
- zval_dtor(free_op2.var);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -17317,7 +17334,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_TMP(ZE
}
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -17444,7 +17461,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAN
}
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -17770,7 +17787,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE
EX(call) = call;
zval_dtor(free_op2.var);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -17905,9 +17922,6 @@ static int ZEND_FASTCALL ZEND_CASE_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
zend_free_op free_op1, free_op2;
SAVE_OPLINE();
- if (IS_VAR==IS_VAR) {
- PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
- }
is_equal_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
@@ -17948,7 +17962,8 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMP_HANDLER(ZEND_OPCOD
INIT_PZVAL_COPY(new_expr, expr_ptr);
expr_ptr = new_expr;
zendi_zval_copy_ctor(*expr_ptr);
- } else {
+ zval_ptr_dtor(&free_op1.var);
+ } else if (IS_VAR == IS_CV) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -17996,8 +18011,6 @@ num_index:
}
if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) {
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- } else {
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -18169,7 +18182,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_TMP(in
zval *offset;
SAVE_OPLINE();
- container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
@@ -18296,7 +18309,7 @@ num_index_prop:
Z_LVAL(EX_T(opline->result.var).tmp_var) = !result;
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -18385,7 +18398,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
/* Consts, temporary variables and references need copying */
if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -18398,12 +18411,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
}
generator->value = copy;
+ zval_ptr_dtor(&free_op1.var);
} else {
- Z_ADDREF_P(value);
+ if (IS_VAR == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
}
} else {
/* If no value was specified yield null */
@@ -18476,8 +18490,8 @@ static int ZEND_FASTCALL ZEND_ADD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
fast_add_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op1.var);
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -18491,8 +18505,8 @@ static int ZEND_FASTCALL ZEND_SUB_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
fast_sub_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op1.var);
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -18506,8 +18520,8 @@ static int ZEND_FASTCALL ZEND_MUL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
fast_mul_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op1.var);
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -18521,8 +18535,8 @@ static int ZEND_FASTCALL ZEND_DIV_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
fast_div_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op1.var);
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -18536,8 +18550,8 @@ static int ZEND_FASTCALL ZEND_MOD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
fast_mod_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op1.var);
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -18551,8 +18565,8 @@ static int ZEND_FASTCALL ZEND_SL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
shift_left_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op1.var);
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -18566,8 +18580,8 @@ static int ZEND_FASTCALL ZEND_SR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
shift_right_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op1.var);
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -18581,8 +18595,8 @@ static int ZEND_FASTCALL ZEND_CONCAT_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_A
concat_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op1.var);
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -18596,8 +18610,8 @@ static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN
is_identical_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op1.var);
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -18613,8 +18627,8 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
Z_LVAL_P(result) = !Z_LVAL_P(result);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op1.var);
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -18629,8 +18643,8 @@ static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER
ZVAL_BOOL(result, fast_equal_function(result,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op1.var);
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -18645,8 +18659,8 @@ static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN
ZVAL_BOOL(result, fast_not_equal_function(result,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op1.var);
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -18661,8 +18675,8 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL
ZVAL_BOOL(result, fast_is_smaller_function(result,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op1.var);
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -18677,8 +18691,8 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_VAR_HANDLER(ZEND_OPC
ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op1.var);
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -18692,8 +18706,8 @@ static int ZEND_FASTCALL ZEND_BW_OR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
bitwise_or_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op1.var);
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -18707,8 +18721,8 @@ static int ZEND_FASTCALL ZEND_BW_AND_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_A
bitwise_and_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op1.var);
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -18722,8 +18736,8 @@ static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_A
bitwise_xor_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op1.var);
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -18737,8 +18751,8 @@ static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER
boolean_xor_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op1.var);
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -18762,7 +18776,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_VAR(int (*bin
if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
zend_error(E_WARNING, "Attempt to assign property of non-object");
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
FREE_OP(free_op_data1);
if (RETURN_VALUE_USED(opline)) {
@@ -18843,7 +18857,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_VAR(int (*bin
if (0) {
zval_ptr_dtor(&property);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
FREE_OP(free_op_data1);
}
@@ -18902,7 +18916,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_VAR(int (*binary_
PZVAL_LOCK(&EG(uninitialized_zval));
AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
CHECK_EXCEPTION();
if (opline->extended_value == ZEND_ASSIGN_DIM) {
@@ -18930,7 +18944,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_VAR(int (*binary_
PZVAL_LOCK(*var_ptr);
AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
if (opline->extended_value == ZEND_ASSIGN_DIM) {
FREE_OP(free_op_data1);
@@ -19024,7 +19038,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_VAR(incdec_t i
if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
if (RETURN_VALUE_USED(opline)) {
PZVAL_LOCK(&EG(uninitialized_zval));
*retval = &EG(uninitialized_zval);
@@ -19087,7 +19101,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_VAR(incdec_t i
if (0) {
zval_ptr_dtor(&property);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
CHECK_EXCEPTION();
@@ -19128,7 +19142,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_VAR(incdec_t
if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
ZVAL_NULL(retval);
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
CHECK_EXCEPTION();
@@ -19189,7 +19203,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_VAR(incdec_t
if (0) {
zval_ptr_dtor(&property);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
CHECK_EXCEPTION();
@@ -19240,7 +19254,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_VAR(int type, ZE
if (IS_VAR != IS_CONST && varname == &tmp_varname) {
zval_dtor(&tmp_varname);
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -19250,7 +19264,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_VAR(int type, ZE
ce = EX_T(opline->op2.var).class_entry;
}
retval = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 0, ((IS_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
} else {
target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
/*
@@ -19289,11 +19303,11 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_VAR(int type, ZE
switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
case ZEND_FETCH_GLOBAL:
if (IS_VAR != IS_TMP_VAR) {
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
}
break;
case ZEND_FETCH_LOCAL:
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
break;
case ZEND_FETCH_STATIC:
zval_update_constant(retval, (void*) 1 TSRMLS_CC);
@@ -19378,22 +19392,18 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAND
SAVE_OPLINE();
- if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
- IS_VAR != IS_CV &&
- EX_T(opline->op1.var).var.ptr_ptr) {
- PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
- }
-
if (IS_VAR == IS_TMP_VAR || IS_VAR == IS_CONST) {
zval *container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op2.var);
+ zval_ptr_dtor(&free_op1.var);
} else {
- container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op2.var);
+ if (IS_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+ zval_ptr_dtor(&free_op1.var);
+ }
}
CHECK_EXCEPTION();
@@ -19413,7 +19423,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAND
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_W TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
}
@@ -19447,7 +19457,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_RW TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
}
@@ -19463,10 +19473,10 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN
zval **container;
SAVE_OPLINE();
- container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_IS TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op2.var);
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -19488,15 +19498,17 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_VAR_HANDLER(ZEND_OPCO
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
}
+ zval_ptr_dtor(&free_op2.var);
+ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
} else {
if (IS_VAR == IS_UNUSED) {
zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
}
- container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
+ zval_ptr_dtor(&free_op2.var);
+ zval_ptr_dtor(&free_op1.var);
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -19519,7 +19531,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_UNSET TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
}
@@ -19559,7 +19571,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_VAR(ZE
zend_error(E_NOTICE, "Trying to get property of non-object");
PZVAL_LOCK(&EG(uninitialized_zval));
AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
} else {
zval *retval;
@@ -19576,11 +19588,11 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_VAR(ZE
if (0) {
zval_ptr_dtor(&offset);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -19617,7 +19629,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAND
if (0) {
zval_ptr_dtor(&property);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
@@ -19660,7 +19672,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN
if (0) {
zval_ptr_dtor(&property);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
@@ -19686,7 +19698,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN
UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
PZVAL_LOCK(&EG(uninitialized_zval));
AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
} else {
zval *retval;
@@ -19703,11 +19715,11 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN
if (0) {
zval_ptr_dtor(&offset);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -19736,7 +19748,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_VAR_HANDLER(ZEND_OPCO
if (0) {
zval_ptr_dtor(&property);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
@@ -19775,7 +19787,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_
if (0) {
zval_ptr_dtor(&property);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
@@ -19813,7 +19825,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL
if (0) {
zval_ptr_dtor(&property_name);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
/* assign_obj has two opcodes! */
@@ -19845,7 +19857,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL
if (0) {
zval_ptr_dtor(&property_name);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
} else {
zend_free_op free_op2, free_op_data1, free_op_data2;
@@ -19854,7 +19866,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL
zval **variable_ptr_ptr;
zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), object_ptr, dim, IS_VAR, BP_VAR_W TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
variable_ptr_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
@@ -19953,7 +19965,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_A
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
/* zend_assign_to_variable() always takes care of op2, never free it! */
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -20065,7 +20077,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE
}
} else {
if (UNEXPECTED(EG(exception) != NULL)) {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
HANDLE_EXCEPTION();
}
zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
@@ -20087,8 +20099,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE
call->is_ctor_call = 0;
EX(call) = call;
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op2.var);
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -20178,7 +20190,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND
}
}
if (IS_VAR != IS_CONST) {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
} else {
if (UNEXPECTED(ce->constructor == NULL)) {
@@ -20223,14 +20235,11 @@ static int ZEND_FASTCALL ZEND_CASE_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
zend_free_op free_op1, free_op2;
SAVE_OPLINE();
- if (IS_VAR==IS_VAR) {
- PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
- }
is_equal_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -20266,7 +20275,8 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD
INIT_PZVAL_COPY(new_expr, expr_ptr);
expr_ptr = new_expr;
zendi_zval_copy_ctor(*expr_ptr);
- } else {
+ zval_ptr_dtor(&free_op1.var);
+ } else if (IS_VAR == IS_CV) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -20308,14 +20318,12 @@ num_index:
/* do nothing */
break;
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
} else {
zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
}
if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) {
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- } else {
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -20384,7 +20392,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE
} else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
zval_ptr_dtor(&varname);
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
HANDLE_EXCEPTION();
}
if (UNEXPECTED(ce == NULL)) {
@@ -20408,7 +20416,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE
} else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
zval_ptr_dtor(&varname);
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -20480,7 +20488,7 @@ num_index_dim:
zend_error(E_WARNING, "Illegal offset type in unset");
break;
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
break;
}
case IS_OBJECT:
@@ -20494,18 +20502,18 @@ num_index_dim:
if (0) {
zval_ptr_dtor(&offset);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
break;
case IS_STRING:
zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
ZEND_VM_CONTINUE(); /* bailed out before */
default:
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
break;
}
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
@@ -20540,13 +20548,13 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE
if (0) {
zval_ptr_dtor(&offset);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
@@ -20618,7 +20626,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD
if (IS_VAR != IS_CONST && varname == &tmp) {
zval_dtor(&tmp);
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
}
if (opline->extended_value & ZEND_ISSET) {
@@ -20650,7 +20658,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(in
zval *offset;
SAVE_OPLINE();
- container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
@@ -20713,7 +20721,7 @@ num_index_prop:
result = 1;
}
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
} else if (Z_TYPE_PP(container) == IS_OBJECT) {
if (0) {
MAKE_REAL_ZVAL_PTR(offset);
@@ -20736,7 +20744,7 @@ num_index_prop:
if (0) {
zval_ptr_dtor(&offset);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
} else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
zval tmp;
@@ -20765,9 +20773,9 @@ num_index_prop:
}
}
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
@@ -20777,7 +20785,7 @@ num_index_prop:
Z_LVAL(EX_T(opline->result.var).tmp_var) = !result;
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -20866,7 +20874,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
/* Consts, temporary variables and references need copying */
if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -20879,12 +20887,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
}
generator->value = copy;
+ zval_ptr_dtor(&free_op1.var);
} else {
- Z_ADDREF_P(value);
+ if (IS_VAR == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
}
} else {
/* If no value was specified yield null */
@@ -20923,7 +20932,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
generator->largest_used_integer_key = Z_LVAL_P(generator->key);
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
} else {
/* If no key was specified we use auto-increment keys */
generator->largest_used_integer_key++;
@@ -21239,7 +21248,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_UNUSED(int type,
if (IS_VAR != IS_CONST && varname == &tmp_varname) {
zval_dtor(&tmp_varname);
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -21249,7 +21258,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_UNUSED(int type,
ce = EX_T(opline->op2.var).class_entry;
}
retval = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 0, ((IS_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
} else {
target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
/*
@@ -21288,11 +21297,11 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_UNUSED(int type,
switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
case ZEND_FETCH_GLOBAL:
if (IS_VAR != IS_TMP_VAR) {
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
}
break;
case ZEND_FETCH_LOCAL:
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
break;
case ZEND_FETCH_STATIC:
zval_update_constant(retval, (void*) 1 TSRMLS_CC);
@@ -21442,15 +21451,17 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED_HANDLER(ZEND_O
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
}
+
+ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
} else {
if (IS_UNUSED == IS_UNUSED) {
zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
}
- container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_R TSRMLS_CC);
- }
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
+ }
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -21689,7 +21700,8 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER(ZEND_OP
INIT_PZVAL_COPY(new_expr, expr_ptr);
expr_ptr = new_expr;
zendi_zval_copy_ctor(*expr_ptr);
- } else {
+ zval_ptr_dtor(&free_op1.var);
+ } else if (IS_VAR == IS_CV) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -21737,8 +21749,6 @@ num_index:
}
if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) {
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- } else {
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -21807,7 +21817,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HAN
} else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
zval_ptr_dtor(&varname);
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
HANDLE_EXCEPTION();
}
if (UNEXPECTED(ce == NULL)) {
@@ -21831,7 +21841,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HAN
} else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
zval_ptr_dtor(&varname);
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -21900,7 +21910,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OP
if (IS_VAR != IS_CONST && varname == &tmp) {
zval_dtor(&tmp);
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
}
if (opline->extended_value & ZEND_ISSET) {
@@ -22015,7 +22025,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER
/* Consts, temporary variables and references need copying */
if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -22028,12 +22038,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER
}
generator->value = copy;
+ zval_ptr_dtor(&free_op1.var);
} else {
- Z_ADDREF_P(value);
+ if (IS_VAR == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
}
} else {
/* If no value was specified yield null */
@@ -22106,7 +22117,7 @@ static int ZEND_FASTCALL ZEND_ADD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
fast_add_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -22121,7 +22132,7 @@ static int ZEND_FASTCALL ZEND_SUB_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
fast_sub_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -22136,7 +22147,7 @@ static int ZEND_FASTCALL ZEND_MUL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
fast_mul_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -22151,7 +22162,7 @@ static int ZEND_FASTCALL ZEND_DIV_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
fast_div_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -22166,7 +22177,7 @@ static int ZEND_FASTCALL ZEND_MOD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
fast_mod_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -22181,7 +22192,7 @@ static int ZEND_FASTCALL ZEND_SL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
shift_left_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -22196,7 +22207,7 @@ static int ZEND_FASTCALL ZEND_SR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
shift_right_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -22211,7 +22222,7 @@ static int ZEND_FASTCALL ZEND_CONCAT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_AR
concat_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -22226,7 +22237,7 @@ static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HAND
is_identical_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -22243,7 +22254,7 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
Z_LVAL_P(result) = !Z_LVAL_P(result);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -22259,7 +22270,7 @@ static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_
ZVAL_BOOL(result, fast_equal_function(result,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC));
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -22275,7 +22286,7 @@ static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HAND
ZVAL_BOOL(result, fast_not_equal_function(result,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC));
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -22291,7 +22302,7 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLE
ZVAL_BOOL(result, fast_is_smaller_function(result,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC));
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -22307,7 +22318,7 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_CV_HANDLER(ZEND_OPCO
ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC));
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -22322,7 +22333,7 @@ static int ZEND_FASTCALL ZEND_BW_OR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
bitwise_or_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -22337,7 +22348,7 @@ static int ZEND_FASTCALL ZEND_BW_AND_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_AR
bitwise_and_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -22352,7 +22363,7 @@ static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_AR
bitwise_xor_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -22367,7 +22378,7 @@ static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_
boolean_xor_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -22843,22 +22854,18 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDL
SAVE_OPLINE();
- if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
- IS_VAR != IS_CV &&
- EX_T(opline->op1.var).var.ptr_ptr) {
- PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
- }
-
if (IS_VAR == IS_TMP_VAR || IS_VAR == IS_CONST) {
zval *container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
} else {
- container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ if (IS_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+ zval_ptr_dtor(&free_op1.var);
+ }
}
CHECK_EXCEPTION();
@@ -22928,10 +22935,10 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HAND
zval **container;
SAVE_OPLINE();
- container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_IS TSRMLS_CC);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -22953,15 +22960,17 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV_HANDLER(ZEND_OPCOD
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
}
+
+ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
} else {
if (IS_CV == IS_UNUSED) {
zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
}
- container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
- }
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
+ }
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -23045,7 +23054,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_CV(ZEN
}
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -23172,7 +23181,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HAND
}
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -23549,7 +23558,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_
call->is_ctor_call = 0;
EX(call) = call;
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -23684,9 +23693,6 @@ static int ZEND_FASTCALL ZEND_CASE_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
zend_free_op free_op1;
SAVE_OPLINE();
- if (IS_VAR==IS_VAR) {
- PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
- }
is_equal_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC),
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
@@ -23726,7 +23732,8 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE
INIT_PZVAL_COPY(new_expr, expr_ptr);
expr_ptr = new_expr;
zendi_zval_copy_ctor(*expr_ptr);
- } else {
+ zval_ptr_dtor(&free_op1.var);
+ } else if (IS_VAR == IS_CV) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -23774,8 +23781,6 @@ num_index:
}
if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) {
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- } else {
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -23947,7 +23952,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CV(int
zval *offset;
SAVE_OPLINE();
- container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ container = _get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
@@ -24074,7 +24079,7 @@ num_index_prop:
Z_LVAL(EX_T(opline->result.var).tmp_var) = !result;
}
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ zval_ptr_dtor(&free_op1.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -24163,7 +24168,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
/* Consts, temporary variables and references need copying */
if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -24176,12 +24181,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
}
generator->value = copy;
+ zval_ptr_dtor(&free_op1.var);
} else {
- Z_ADDREF_P(value);
+ if (IS_VAR == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
}
} else {
/* If no value was specified yield null */
@@ -25669,7 +25675,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDL
/* Consts, temporary variables and references need copying */
if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -25682,11 +25688,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDL
}
generator->value = copy;
+
} else {
- Z_ADDREF_P(value);
+ if (IS_UNUSED == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
}
} else {
/* If no value was specified yield null */
@@ -26990,7 +26998,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER
/* Consts, temporary variables and references need copying */
if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -27003,11 +27011,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER
}
generator->value = copy;
+
} else {
- Z_ADDREF_P(value);
+ if (IS_UNUSED == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
}
} else {
/* If no value was specified yield null */
@@ -27090,7 +27100,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_VAR(int (*
if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
zend_error(E_WARNING, "Attempt to assign property of non-object");
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
FREE_OP(free_op_data1);
if (RETURN_VALUE_USED(opline)) {
@@ -27171,7 +27181,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_VAR(int (*
if (0) {
zval_ptr_dtor(&property);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
FREE_OP(free_op_data1);
}
@@ -27229,7 +27239,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_VAR(int (*bina
PZVAL_LOCK(&EG(uninitialized_zval));
AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
if (opline->extended_value == ZEND_ASSIGN_DIM) {
@@ -27257,7 +27267,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_VAR(int (*bina
PZVAL_LOCK(*var_ptr);
AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
if (opline->extended_value == ZEND_ASSIGN_DIM) {
FREE_OP(free_op_data1);
@@ -27351,7 +27361,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_VAR(incdec_
if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
if (RETURN_VALUE_USED(opline)) {
PZVAL_LOCK(&EG(uninitialized_zval));
*retval = &EG(uninitialized_zval);
@@ -27414,7 +27424,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_VAR(incdec_
if (0) {
zval_ptr_dtor(&property);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
CHECK_EXCEPTION();
@@ -27455,7 +27465,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_VAR(incdec
if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
ZVAL_NULL(retval);
CHECK_EXCEPTION();
@@ -27516,7 +27526,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_VAR(incdec
if (0) {
zval_ptr_dtor(&property);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
CHECK_EXCEPTION();
@@ -27550,7 +27560,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_UNUSED_VAR
zend_error(E_NOTICE, "Trying to get property of non-object");
PZVAL_LOCK(&EG(uninitialized_zval));
AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
} else {
zval *retval;
@@ -27567,7 +27577,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_UNUSED_VAR
if (0) {
zval_ptr_dtor(&offset);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
}
@@ -27607,7 +27617,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_H
if (0) {
zval_ptr_dtor(&property);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
@@ -27649,7 +27659,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_
if (0) {
zval_ptr_dtor(&property);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
@@ -27675,7 +27685,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_
UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
PZVAL_LOCK(&EG(uninitialized_zval));
AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
} else {
zval *retval;
@@ -27692,7 +27702,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_
if (0) {
zval_ptr_dtor(&offset);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
}
@@ -27724,7 +27734,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_VAR_HANDLER(ZEND_O
if (0) {
zval_ptr_dtor(&property);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
@@ -27763,7 +27773,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCO
if (0) {
zval_ptr_dtor(&property);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
@@ -27800,7 +27810,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HA
if (0) {
zval_ptr_dtor(&property_name);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
/* assign_obj has two opcodes! */
@@ -27848,7 +27858,7 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDL
* which aren't affected by FREE_OP(Ts, )'s anyway, unless they're
* string offsets or overloaded objects
*/
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -27906,7 +27916,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPC
}
} else {
if (UNEXPECTED(EG(exception) != NULL)) {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
HANDLE_EXCEPTION();
}
zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
@@ -27928,7 +27938,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPC
call->is_ctor_call = 0;
EX(call) = call;
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -28015,7 +28025,7 @@ num_index_dim:
zend_error(E_WARNING, "Illegal offset type in unset");
break;
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
break;
}
case IS_OBJECT:
@@ -28029,18 +28039,18 @@ num_index_dim:
if (0) {
zval_ptr_dtor(&offset);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
break;
case IS_STRING:
zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
ZEND_VM_CONTINUE(); /* bailed out before */
default:
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
break;
}
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
CHECK_EXCEPTION();
@@ -28074,13 +28084,13 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HAN
if (0) {
zval_ptr_dtor(&offset);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
CHECK_EXCEPTION();
@@ -28161,7 +28171,7 @@ num_index_prop:
result = 1;
}
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
} else if (Z_TYPE_PP(container) == IS_OBJECT) {
if (0) {
MAKE_REAL_ZVAL_PTR(offset);
@@ -28184,7 +28194,7 @@ num_index_prop:
if (0) {
zval_ptr_dtor(&offset);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
} else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
zval tmp;
@@ -28213,9 +28223,9 @@ num_index_prop:
}
}
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
@@ -28311,7 +28321,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER
/* Consts, temporary variables and references need copying */
if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -28324,11 +28334,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER
}
generator->value = copy;
+
} else {
- Z_ADDREF_P(value);
+ if (IS_UNUSED == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
}
} else {
/* If no value was specified yield null */
@@ -28367,7 +28379,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER
generator->largest_used_integer_key = Z_LVAL_P(generator->key);
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
} else {
/* If no key was specified we use auto-increment keys */
generator->largest_used_integer_key++;
@@ -28734,7 +28746,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HAND
/* Consts, temporary variables and references need copying */
if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -28747,11 +28759,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HAND
}
generator->value = copy;
+
} else {
- Z_ADDREF_P(value);
+ if (IS_UNUSED == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
}
} else {
/* If no value was specified yield null */
@@ -30052,7 +30066,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_
/* Consts, temporary variables and references need copying */
if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -30065,11 +30079,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_
}
generator->value = copy;
+
} else {
- Z_ADDREF_P(value);
+ if (IS_UNUSED == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
}
} else {
/* If no value was specified yield null */
@@ -30527,9 +30543,7 @@ static int ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
retval_ptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
if (!EG(return_value_ptr_ptr)) {
- if (IS_CV == IS_TMP_VAR) {
- }
} else {
if (IS_CV == IS_CONST ||
IS_CV == IS_TMP_VAR ||
@@ -30542,18 +30556,23 @@ static int ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
zval_copy_ctor(ret);
}
*EG(return_value_ptr_ptr) = ret;
+
} else if ((IS_CV == IS_CV || IS_CV == IS_VAR) &&
retval_ptr == &EG(uninitialized_zval)) {
zval *ret;
+ if (IS_CV == IS_VAR) {
+ Z_DELREF_P(retval_ptr);
+ }
ALLOC_INIT_ZVAL(ret);
*EG(return_value_ptr_ptr) = ret;
} else {
*EG(return_value_ptr_ptr) = retval_ptr;
- Z_ADDREF_P(retval_ptr);
+ if (IS_CV == IS_CV) {
+ Z_ADDREF_P(retval_ptr);
+ }
}
}
-
return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
}
@@ -30663,21 +30682,26 @@ static int ZEND_FASTCALL zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARG
varptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
if (varptr == &EG(uninitialized_zval)) {
- ALLOC_ZVAL(varptr);
- INIT_ZVAL(*varptr);
- Z_SET_REFCOUNT_P(varptr, 0);
+ if (IS_CV == IS_VAR) {
+ Z_DELREF_P(varptr);
+ }
+ ALLOC_INIT_ZVAL(varptr);
} else if (PZVAL_IS_REF(varptr)) {
- zval *original_var = varptr;
+ if (IS_CV == IS_CV ||
+ (IS_CV == IS_VAR && Z_REFCOUNT_P(varptr) > 2)) {
+ zval *original_var = varptr;
+
+ ALLOC_ZVAL(varptr);
+ INIT_PZVAL_COPY(varptr, original_var);
+ zval_copy_ctor(varptr);
- ALLOC_ZVAL(varptr);
- ZVAL_COPY_VALUE(varptr, original_var);
- Z_UNSET_ISREF_P(varptr);
- Z_SET_REFCOUNT_P(varptr, 0);
- zval_copy_ctor(varptr);
+ } else {
+ Z_UNSET_ISREF_P(varptr);
+ }
+ } else if (IS_CV == IS_CV) {
+ Z_ADDREF_P(varptr);
}
- Z_ADDREF_P(varptr);
zend_vm_stack_push(varptr TSRMLS_CC);
- ; /* for string offsets */
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -30686,7 +30710,7 @@ static int ZEND_FASTCALL zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARG
static int ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1;
+
zval *varptr;
SAVE_OPLINE();
@@ -30698,22 +30722,15 @@ static int ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDL
return zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
}
- if (IS_CV == IS_VAR &&
- (opline->extended_value & ZEND_ARG_SEND_FUNCTION) &&
- EX_T(opline->op1.var).var.fcall_returned_reference &&
- EX_T(opline->op1.var).var.ptr) {
- varptr = EX_T(opline->op1.var).var.ptr;
- PZVAL_UNLOCK_EX(varptr, &free_op1, 0);
- } else {
- varptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
- }
+ varptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) ||
EX_T(opline->op1.var).var.fcall_returned_reference) &&
varptr != &EG(uninitialized_zval) &&
- (PZVAL_IS_REF(varptr) ||
- (Z_REFCOUNT_P(varptr) == 1 && (IS_CV == IS_CV || free_op1.var)))) {
+ (PZVAL_IS_REF(varptr) || Z_REFCOUNT_P(varptr) == 1)) {
Z_SET_ISREF_P(varptr);
- Z_ADDREF_P(varptr);
+ if (IS_CV == IS_CV) {
+ Z_ADDREF_P(varptr);
+ }
zend_vm_stack_push(varptr TSRMLS_CC);
} else {
zval *valptr;
@@ -30728,9 +30745,9 @@ static int ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDL
if (!0) {
zval_copy_ctor(valptr);
}
+
zend_vm_stack_push(valptr TSRMLS_CC);
}
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -31113,19 +31130,27 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
} else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
ce = Z_OBJCE_P(array_ptr);
if (!ce || !ce->get_iterator) {
- Z_ADDREF_P(array_ptr);
+ if (IS_CV == IS_CV) {
+ Z_ADDREF_P(array_ptr);
+ }
}
} else if (IS_CV == IS_CONST ||
- ((IS_CV == IS_CV || IS_CV == IS_VAR) &&
+ (IS_CV == IS_CV &&
!Z_ISREF_P(array_ptr) &&
- Z_REFCOUNT_P(array_ptr) > 1)) {
+ Z_REFCOUNT_P(array_ptr) > 1) ||
+ (IS_CV == IS_VAR &&
+ !Z_ISREF_P(array_ptr) &&
+ Z_REFCOUNT_P(array_ptr) > 2)) {
zval *tmp;
+ if (IS_CV == IS_VAR) {
+ Z_DELREF_P(array_ptr);
+ }
ALLOC_ZVAL(tmp);
INIT_PZVAL_COPY(tmp, array_ptr);
zval_copy_ctor(tmp);
array_ptr = tmp;
- } else {
+ } else if (IS_CV == IS_CV) {
Z_ADDREF_P(array_ptr);
}
}
@@ -31133,10 +31158,15 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
if (ce && ce->get_iterator) {
iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
+ if (IS_CV == IS_VAR && !(opline->extended_value & ZEND_FE_RESET_VARIABLE)) {
+
+ }
if (iter && EXPECTED(EG(exception) == NULL)) {
array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
} else {
+ if (IS_CV == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+ }
if (!EG(exception)) {
zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
}
@@ -31153,14 +31183,18 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
iter->funcs->rewind(iter TSRMLS_CC);
if (UNEXPECTED(EG(exception) != NULL)) {
zval_ptr_dtor(&array_ptr);
+ if (IS_CV == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+ }
HANDLE_EXCEPTION();
}
}
is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
if (UNEXPECTED(EG(exception) != NULL)) {
zval_ptr_dtor(&array_ptr);
+ if (IS_CV == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+ }
HANDLE_EXCEPTION();
}
iter->index = -1; /* will be set to 0 before using next handler */
@@ -31190,6 +31224,9 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
is_empty = 1;
}
+ if (IS_CV == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
+
+ }
if (is_empty) {
ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
} else {
@@ -32254,12 +32291,6 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HAN
SAVE_OPLINE();
- if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
- IS_CV != IS_CV &&
- EX_T(opline->op1.var).var.ptr_ptr) {
- PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
- }
-
if (IS_CV == IS_TMP_VAR || IS_CV == IS_CONST) {
zval *container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
@@ -32269,7 +32300,9 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HAN
container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
+ if (IS_CV == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+ }
}
CHECK_EXCEPTION();
@@ -32363,15 +32396,17 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CONST_HANDLER(ZEND_OPC
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
}
+
+
} else {
if (IS_CONST == IS_UNUSED) {
zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
}
container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
- }
+ }
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -32911,9 +32946,6 @@ static int ZEND_FASTCALL ZEND_CASE_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_AR
SAVE_OPLINE();
- if (IS_CV==IS_VAR) {
- PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
- }
is_equal_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
opline->op2.zv TSRMLS_CC);
@@ -32953,7 +32985,8 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST_HANDLER(ZEND_OPCO
INIT_PZVAL_COPY(new_expr, expr_ptr);
expr_ptr = new_expr;
zendi_zval_copy_ctor(*expr_ptr);
- } else {
+
+ } else if (IS_CV == IS_CV) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -33001,8 +33034,6 @@ num_index:
}
if ((IS_CV == IS_VAR || IS_CV == IS_CV) && opline->extended_value) {
- } else {
-
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -33548,7 +33579,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
/* Consts, temporary variables and references need copying */
if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -33561,11 +33592,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
}
generator->value = copy;
+
} else {
- Z_ADDREF_P(value);
+ if (IS_CV == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
}
} else {
/* If no value was specified yield null */
@@ -34375,12 +34408,6 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDL
SAVE_OPLINE();
- if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
- IS_CV != IS_CV &&
- EX_T(opline->op1.var).var.ptr_ptr) {
- PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
- }
-
if (IS_CV == IS_TMP_VAR || IS_CV == IS_CONST) {
zval *container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
@@ -34390,7 +34417,9 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDL
container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
zval_dtor(free_op2.var);
+ if (IS_CV == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+ }
}
CHECK_EXCEPTION();
@@ -34484,15 +34513,17 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMP_HANDLER(ZEND_OPCOD
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
}
+ zval_dtor(free_op2.var);
+
} else {
if (IS_TMP_VAR == IS_UNUSED) {
zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
}
container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
- }
- zval_dtor(free_op2.var);
+ zval_dtor(free_op2.var);
+ }
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -35034,9 +35065,6 @@ static int ZEND_FASTCALL ZEND_CASE_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS
zend_free_op free_op2;
SAVE_OPLINE();
- if (IS_CV==IS_VAR) {
- PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
- }
is_equal_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
_get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
@@ -35077,7 +35105,8 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMP_HANDLER(ZEND_OPCODE
INIT_PZVAL_COPY(new_expr, expr_ptr);
expr_ptr = new_expr;
zendi_zval_copy_ctor(*expr_ptr);
- } else {
+
+ } else if (IS_CV == IS_CV) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -35125,8 +35154,6 @@ num_index:
}
if ((IS_CV == IS_VAR || IS_CV == IS_CV) && opline->extended_value) {
- } else {
-
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -35509,7 +35536,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
/* Consts, temporary variables and references need copying */
if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -35522,11 +35549,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
}
generator->value = copy;
+
} else {
- Z_ADDREF_P(value);
+ if (IS_CV == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
}
} else {
/* If no value was specified yield null */
@@ -35600,7 +35629,7 @@ static int ZEND_FASTCALL ZEND_ADD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -35615,7 +35644,7 @@ static int ZEND_FASTCALL ZEND_SUB_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -35630,7 +35659,7 @@ static int ZEND_FASTCALL ZEND_MUL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -35645,7 +35674,7 @@ static int ZEND_FASTCALL ZEND_DIV_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -35660,7 +35689,7 @@ static int ZEND_FASTCALL ZEND_MOD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -35675,7 +35704,7 @@ static int ZEND_FASTCALL ZEND_SL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -35690,7 +35719,7 @@ static int ZEND_FASTCALL ZEND_SR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -35705,7 +35734,7 @@ static int ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -35720,7 +35749,7 @@ static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -35737,7 +35766,7 @@ static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
Z_LVAL_P(result) = !Z_LVAL_P(result);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -35753,7 +35782,7 @@ static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -35769,7 +35798,7 @@ static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -35785,7 +35814,7 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -35801,7 +35830,7 @@ static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_VAR_HANDLER(ZEND_OPCO
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC));
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -35816,7 +35845,7 @@ static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -35831,7 +35860,7 @@ static int ZEND_FASTCALL ZEND_BW_AND_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -35846,7 +35875,7 @@ static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -35861,7 +35890,7 @@ static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -35885,7 +35914,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_VAR(int (*bina
if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
zend_error(E_WARNING, "Attempt to assign property of non-object");
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
FREE_OP(free_op_data1);
if (RETURN_VALUE_USED(opline)) {
@@ -35966,7 +35995,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_VAR(int (*bina
if (0) {
zval_ptr_dtor(&property);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
FREE_OP(free_op_data1);
}
@@ -36024,7 +36053,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_VAR(int (*binary_o
PZVAL_LOCK(&EG(uninitialized_zval));
AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
if (opline->extended_value == ZEND_ASSIGN_DIM) {
@@ -36052,7 +36081,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_VAR(int (*binary_o
PZVAL_LOCK(*var_ptr);
AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
if (opline->extended_value == ZEND_ASSIGN_DIM) {
FREE_OP(free_op_data1);
@@ -36146,7 +36175,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_VAR(incdec_t in
if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
if (RETURN_VALUE_USED(opline)) {
PZVAL_LOCK(&EG(uninitialized_zval));
*retval = &EG(uninitialized_zval);
@@ -36209,7 +36238,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_VAR(incdec_t in
if (0) {
zval_ptr_dtor(&property);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
CHECK_EXCEPTION();
@@ -36250,7 +36279,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_VAR(incdec_t i
if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
ZVAL_NULL(retval);
CHECK_EXCEPTION();
@@ -36311,7 +36340,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_VAR(incdec_t i
if (0) {
zval_ptr_dtor(&property);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
CHECK_EXCEPTION();
@@ -36500,22 +36529,18 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDL
SAVE_OPLINE();
- if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
- IS_CV != IS_CV &&
- EX_T(opline->op1.var).var.ptr_ptr) {
- PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
- }
-
if (IS_CV == IS_TMP_VAR || IS_CV == IS_CONST) {
zval *container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
} else {
container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
+ if (IS_CV == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+ }
}
CHECK_EXCEPTION();
@@ -36535,7 +36560,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDL
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_W TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
}
@@ -36568,7 +36593,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_RW TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
}
@@ -36586,7 +36611,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND
SAVE_OPLINE();
container = _get_zval_ptr_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_IS TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -36609,15 +36634,17 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_VAR_HANDLER(ZEND_OPCOD
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
}
+ zval_ptr_dtor(&free_op2.var);
+
} else {
if (IS_VAR == IS_UNUSED) {
zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
}
container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
- }
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
+ }
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -36640,7 +36667,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_H
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_UNSET TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
}
@@ -36680,7 +36707,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_CV_VAR(ZEN
zend_error(E_NOTICE, "Trying to get property of non-object");
PZVAL_LOCK(&EG(uninitialized_zval));
AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
} else {
zval *retval;
@@ -36697,7 +36724,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_CV_VAR(ZEN
if (0) {
zval_ptr_dtor(&offset);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
}
@@ -36737,7 +36764,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDL
if (0) {
zval_ptr_dtor(&property);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
@@ -36779,7 +36806,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND
if (0) {
zval_ptr_dtor(&property);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
@@ -36805,7 +36832,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND
UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
PZVAL_LOCK(&EG(uninitialized_zval));
AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
} else {
zval *retval;
@@ -36822,7 +36849,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND
if (0) {
zval_ptr_dtor(&offset);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
}
@@ -36854,7 +36881,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_VAR_HANDLER(ZEND_OPCOD
if (0) {
zval_ptr_dtor(&property);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
@@ -36893,7 +36920,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_H
if (0) {
zval_ptr_dtor(&property);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
@@ -36930,7 +36957,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE
if (0) {
zval_ptr_dtor(&property_name);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
/* assign_obj has two opcodes! */
@@ -36962,7 +36989,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE
if (0) {
zval_ptr_dtor(&property_name);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
} else {
zend_free_op free_op2, free_op_data1, free_op_data2;
@@ -36971,7 +36998,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE
zval **variable_ptr_ptr;
zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), object_ptr, dim, IS_VAR, BP_VAR_W TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
variable_ptr_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
@@ -37068,7 +37095,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
}
/* zend_assign_to_variable() always takes care of op2, never free it! */
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -37179,7 +37206,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_
}
} else {
if (UNEXPECTED(EG(exception) != NULL)) {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
HANDLE_EXCEPTION();
}
zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
@@ -37201,7 +37228,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_
call->is_ctor_call = 0;
EX(call) = call;
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -37213,14 +37240,11 @@ static int ZEND_FASTCALL ZEND_CASE_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
zend_free_op free_op2;
SAVE_OPLINE();
- if (IS_CV==IS_VAR) {
- PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
- }
is_equal_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
_get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC);
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -37256,7 +37280,8 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_VAR_HANDLER(ZEND_OPCODE
INIT_PZVAL_COPY(new_expr, expr_ptr);
expr_ptr = new_expr;
zendi_zval_copy_ctor(*expr_ptr);
- } else {
+
+ } else if (IS_CV == IS_CV) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -37298,14 +37323,12 @@ num_index:
/* do nothing */
break;
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
} else {
zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
}
if ((IS_CV == IS_VAR || IS_CV == IS_CV) && opline->extended_value) {
- } else {
-
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -37470,7 +37493,7 @@ num_index_dim:
zend_error(E_WARNING, "Illegal offset type in unset");
break;
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
break;
}
case IS_OBJECT:
@@ -37484,18 +37507,18 @@ num_index_dim:
if (0) {
zval_ptr_dtor(&offset);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
break;
case IS_STRING:
zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
ZEND_VM_CONTINUE(); /* bailed out before */
default:
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
break;
}
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
CHECK_EXCEPTION();
@@ -37529,13 +37552,13 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER
if (0) {
zval_ptr_dtor(&offset);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
CHECK_EXCEPTION();
@@ -37701,7 +37724,7 @@ num_index_prop:
result = 1;
}
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
} else if (Z_TYPE_PP(container) == IS_OBJECT) {
if (0) {
MAKE_REAL_ZVAL_PTR(offset);
@@ -37724,7 +37747,7 @@ num_index_prop:
if (0) {
zval_ptr_dtor(&offset);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
} else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
zval tmp;
@@ -37753,9 +37776,9 @@ num_index_prop:
}
}
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
} else {
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
}
Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
@@ -37851,7 +37874,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
/* Consts, temporary variables and references need copying */
if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -37864,11 +37887,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
}
generator->value = copy;
+
} else {
- Z_ADDREF_P(value);
+ if (IS_CV == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
}
} else {
/* If no value was specified yield null */
@@ -37907,7 +37932,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
generator->largest_used_integer_key = Z_LVAL_P(generator->key);
}
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ zval_ptr_dtor(&free_op2.var);
} else {
/* If no key was specified we use auto-increment keys */
generator->largest_used_integer_key++;
@@ -38424,15 +38449,17 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED_HANDLER(ZEND_OP
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
}
+
+
} else {
if (IS_UNUSED == IS_UNUSED) {
zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
}
container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_R TSRMLS_CC);
- }
+ }
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -38548,7 +38575,8 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER(ZEND_OPC
INIT_PZVAL_COPY(new_expr, expr_ptr);
expr_ptr = new_expr;
zendi_zval_copy_ctor(*expr_ptr);
- } else {
+
+ } else if (IS_CV == IS_CV) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -38596,8 +38624,6 @@ num_index:
}
if ((IS_CV == IS_VAR || IS_CV == IS_CV) && opline->extended_value) {
- } else {
-
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -38852,7 +38878,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_
/* Consts, temporary variables and references need copying */
if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -38865,11 +38891,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_
}
generator->value = copy;
+
} else {
- Z_ADDREF_P(value);
+ if (IS_CV == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
}
} else {
/* If no value was specified yield null */
@@ -39678,12 +39706,6 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLE
SAVE_OPLINE();
- if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
- IS_CV != IS_CV &&
- EX_T(opline->op1.var).var.ptr_ptr) {
- PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
- }
-
if (IS_CV == IS_TMP_VAR || IS_CV == IS_CONST) {
zval *container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
@@ -39693,7 +39715,9 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLE
container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
+ if (IS_CV == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
+ }
}
CHECK_EXCEPTION();
@@ -39787,15 +39811,17 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV_HANDLER(ZEND_OPCODE
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
}
+
+
} else {
if (IS_CV == IS_UNUSED) {
zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
}
container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
- }
+ }
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -40387,9 +40413,6 @@ static int ZEND_FASTCALL ZEND_CASE_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
SAVE_OPLINE();
- if (IS_CV==IS_VAR) {
- PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
- }
is_equal_function(&EX_T(opline->result.var).tmp_var,
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC),
_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC) TSRMLS_CC);
@@ -40429,7 +40452,8 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_
INIT_PZVAL_COPY(new_expr, expr_ptr);
expr_ptr = new_expr;
zendi_zval_copy_ctor(*expr_ptr);
- } else {
+
+ } else if (IS_CV == IS_CV) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -40477,8 +40501,6 @@ num_index:
}
if ((IS_CV == IS_VAR || IS_CV == IS_CV) && opline->extended_value) {
- } else {
-
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -40861,7 +40883,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
/* Consts, temporary variables and references need copying */
if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR
- || (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0)
+ || PZVAL_IS_REF(value)
) {
zval *copy;
@@ -40874,11 +40896,13 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
}
generator->value = copy;
+
} else {
- Z_ADDREF_P(value);
+ if (IS_CV == IS_CV) {
+ Z_ADDREF_P(value);
+ }
generator->value = value;
}
-
}
} else {
/* If no value was specified yield null */
diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php
index 63d0cf73f0..f1afdf0ce1 100644
--- a/Zend/zend_vm_gen.php
+++ b/Zend/zend_vm_gen.php
@@ -143,6 +143,8 @@ $op1_get_zval_ptr_ptr = array(
"UNUSED" => "NULL",
"CV" => "_get_zval_ptr_ptr_cv_\\1(execute_data, opline->op1.var TSRMLS_CC)",
);
+$op1_get_zval_ptr_ptr_fast = $op1_get_zval_ptr_ptr;
+$op1_get_zval_ptr_ptr_fast["VAR"] = "_get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC)";
$op2_get_zval_ptr_ptr = array(
"ANY" => "get_zval_ptr_ptr(opline->op2_type, &opline->op2, execute_data, &free_op2, \\1)",
@@ -152,6 +154,8 @@ $op2_get_zval_ptr_ptr = array(
"UNUSED" => "NULL",
"CV" => "_get_zval_ptr_ptr_cv_\\1(execute_data, opline->op2.var TSRMLS_CC)",
);
+$op2_get_zval_ptr_ptr_fast = $op2_get_zval_ptr_ptr;
+$op2_get_zval_ptr_ptr_fast["VAR"] = "_get_zval_ptr_ptr_var_fast(opline->op2.var, execute_data, &free_op2 TSRMLS_CC)";
$op1_get_obj_zval_ptr = array(
"ANY" => "get_obj_zval_ptr(opline->op1_type, &opline->op1, execute_data, &free_op1, \\1)",
@@ -179,6 +183,8 @@ $op1_get_obj_zval_ptr_ptr = array(
"UNUSED" => "_get_obj_zval_ptr_ptr_unused(TSRMLS_C)",
"CV" => "_get_zval_ptr_ptr_cv_\\1(execute_data, opline->op1.var TSRMLS_CC)",
);
+$op1_get_obj_zval_ptr_ptr_fast = $op1_get_obj_zval_ptr_ptr;
+$op1_get_obj_zval_ptr_ptr_fast["VAR"] = "_get_zval_ptr_ptr_var_fast(opline->op1.var, execute_data, &free_op1 TSRMLS_CC)";
$op2_get_obj_zval_ptr_ptr = array(
"ANY" => "get_obj_zval_ptr_ptr(opline->op2_type, &opline->op2, execute_data, &free_op2, \\1)",
@@ -188,6 +194,8 @@ $op2_get_obj_zval_ptr_ptr = array(
"UNUSED" => "_get_obj_zval_ptr_ptr_unused(TSRMLS_C)",
"CV" => "_get_zval_ptr_ptr_cv_\\1(execute_data, opline->op2.var TSRMLS_CC)",
);
+$op2_get_obj_zval_ptr_ptr_fast = $op2_get_obj_zval_ptr_ptr;
+$op2_get_obj_zval_ptr_ptr_fast["VAR"] = "_get_zval_ptr_ptr_var_fast(opline->op2.var, execute_data, &free_op2 TSRMLS_CC)";
$op1_is_tmp_free = array(
"ANY" => "IS_TMP_FREE(free_op1)",
@@ -210,7 +218,7 @@ $op2_is_tmp_free = array(
$op1_free_op = array(
"ANY" => "FREE_OP(free_op1)",
"TMP" => "zval_dtor(free_op1.var)",
- "VAR" => "if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}",
+ "VAR" => "zval_ptr_dtor(&free_op1.var)",
"CONST" => "",
"UNUSED" => "",
"CV" => "",
@@ -219,7 +227,7 @@ $op1_free_op = array(
$op2_free_op = array(
"ANY" => "FREE_OP(free_op2)",
"TMP" => "zval_dtor(free_op2.var)",
- "VAR" => "if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}",
+ "VAR" => "zval_ptr_dtor(&free_op2.var)",
"CONST" => "",
"UNUSED" => "",
"CV" => "",
@@ -228,7 +236,7 @@ $op2_free_op = array(
$op1_free_op_if_var = array(
"ANY" => "FREE_OP_IF_VAR(free_op1)",
"TMP" => "",
- "VAR" => "if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}",
+ "VAR" => "zval_ptr_dtor(&free_op1.var)",
"CONST" => "",
"UNUSED" => "",
"CV" => "",
@@ -237,7 +245,7 @@ $op1_free_op_if_var = array(
$op2_free_op_if_var = array(
"ANY" => "FREE_OP_IF_VAR(free_op2)",
"TMP" => "",
- "VAR" => "if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}",
+ "VAR" => "zval_ptr_dtor(&free_op2.var)",
"CONST" => "",
"UNUSED" => "",
"CV" => "",
@@ -251,6 +259,8 @@ $op1_free_op_var_ptr = array(
"UNUSED" => "",
"CV" => "",
);
+$op1_free_op_var_ptr_fast = $op1_free_op_var_ptr;
+$op1_free_op_var_ptr_fast["VAR"] = "zval_ptr_dtor(&free_op1.var)";
$op2_free_op_var_ptr = array(
"ANY" => "if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}",
@@ -260,6 +270,8 @@ $op2_free_op_var_ptr = array(
"UNUSED" => "",
"CV" => "",
);
+$op2_free_op_var_ptr_fast = $op2_free_op_var_ptr;
+$op2_free_op_var_ptr_fast["VAR"] = "zval_ptr_dtor(&free_op2.var)";
$list = array(); // list of opcode handlers and helpers in original order
$opcodes = array(); // opcode handlers by code
@@ -311,7 +323,10 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name) {
$op1_get_obj_zval_ptr_ptr, $op2_get_obj_zval_ptr_ptr,
$op1_is_tmp_free, $op2_is_tmp_free, $op1_free, $op2_free,
$op1_free_op, $op2_free_op, $op1_free_op_if_var, $op2_free_op_if_var,
- $op1_free_op_var_ptr, $op2_free_op_var_ptr, $prefix;
+ $op1_free_op_var_ptr, $op2_free_op_var_ptr, $prefix,
+ $op1_get_zval_ptr_ptr_fast, $op2_get_zval_ptr_ptr_fast,
+ $op1_get_obj_zval_ptr_ptr_fast, $op2_get_obj_zval_ptr_ptr_fast,
+ $op1_free_op_var_ptr_fast, $op2_free_op_var_ptr_fast;
// Specializing
$code = preg_replace(
@@ -336,6 +351,12 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name) {
"/FREE_OP2_IF_VAR\(\)/",
"/FREE_OP1_VAR_PTR\(\)/",
"/FREE_OP2_VAR_PTR\(\)/",
+ "/GET_OP1_ZVAL_PTR_PTR_FAST\(([^)]*)\)/",
+ "/GET_OP2_ZVAL_PTR_PTR_FAST\(([^)]*)\)/",
+ "/GET_OP1_OBJ_ZVAL_PTR_PTR_FAST\(([^)]*)\)/",
+ "/GET_OP2_OBJ_ZVAL_PTR_PTR_FAST\(([^)]*)\)/",
+ "/FREE_OP1_VAR_PTR_FAST\(\)/",
+ "/FREE_OP2_VAR_PTR_FAST\(\)/",
"/^#ifdef\s+ZEND_VM_SPEC\s*\n/m",
"/^#ifndef\s+ZEND_VM_SPEC\s*\n/m",
"/\!defined\(ZEND_VM_SPEC\)/m",
@@ -368,6 +389,12 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name) {
$op2_free_op_if_var[$op2],
$op1_free_op_var_ptr[$op1],
$op2_free_op_var_ptr[$op2],
+ $op1_get_zval_ptr_ptr_fast[$op1],
+ $op2_get_zval_ptr_ptr_fast[$op2],
+ $op1_get_obj_zval_ptr_ptr_fast[$op1],
+ $op2_get_obj_zval_ptr_ptr_fast[$op2],
+ $op1_free_op_var_ptr_fast[$op1],
+ $op2_free_op_var_ptr_fast[$op2],
($op1!="ANY"||$op2!="ANY")?"#if 1\n":"#if 0\n",
($op1!="ANY"||$op2!="ANY")?"#if 0\n":"#if 1\n",
($op1!="ANY"||$op2!="ANY")?"0":"1",
diff --git a/configure.in b/configure.in
index f3a262262a..260b982ce8 100644
--- a/configure.in
+++ b/configure.in
@@ -118,8 +118,8 @@ int zend_sprintf(char *buffer, const char *format, ...);
])
PHP_MAJOR_VERSION=5
-PHP_MINOR_VERSION=5
-PHP_RELEASE_VERSION=1
+PHP_MINOR_VERSION=6
+PHP_RELEASE_VERSION=0
PHP_EXTRA_VERSION="-dev"
PHP_VERSION="$PHP_MAJOR_VERSION.$PHP_MINOR_VERSION.$PHP_RELEASE_VERSION$PHP_EXTRA_VERSION"
PHP_VERSION_ID=`expr [$]PHP_MAJOR_VERSION \* 10000 + [$]PHP_MINOR_VERSION \* 100 + [$]PHP_RELEASE_VERSION`
diff --git a/ext/curl/interface.c b/ext/curl/interface.c
index 4b6e5e27dc..80618674a3 100644
--- a/ext/curl/interface.c
+++ b/ext/curl/interface.c
@@ -1792,7 +1792,7 @@ static void alloc_curl_handle(php_curl **ch)
zend_llist_init(&(*ch)->to_free->str, sizeof(char *), (llist_dtor_func_t) curl_free_string, 0);
zend_llist_init(&(*ch)->to_free->slist, sizeof(struct curl_slist), (llist_dtor_func_t) curl_free_slist, 0);
zend_llist_init(&(*ch)->to_free->post, sizeof(struct HttpPost), (llist_dtor_func_t) curl_free_post, 0);
- (*ch)->safe_upload = 0; /* for now, for BC reason we allow unsafe API */
+ (*ch)->safe_upload = 1; /* for now, for BC reason we allow unsafe API */
}
/* }}} */
diff --git a/ext/gd/gd.c b/ext/gd/gd.c
index 7fef56ed74..7da8a62a39 100644
--- a/ext/gd/gd.c
+++ b/ext/gd/gd.c
@@ -82,6 +82,10 @@ static void php_free_ps_enc(zend_rsrc_list_entry *rsrc TSRMLS_DC);
# endif
#endif
+#if defined(HAVE_GD_XPM) && defined(HAVE_GD_BUNDLED)
+# include "X11/xpm.h"
+#endif
+
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
@@ -92,6 +96,10 @@ static void php_imagettftext_common(INTERNAL_FUNCTION_PARAMETERS, int, int);
#include "gd_ctx.c"
+/* as it is not really public, duplicate declaration here to avoid
+ pointless warnings */
+int overflow2(int a, int b);
+
/* Section Filters Declarations */
/* IMPORTANT NOTE FOR NEW FILTER
* Do not forget to update:
@@ -2082,7 +2090,7 @@ PHP_FUNCTION(imagerotate)
ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd);
- im_dst = gdImageRotateInterpolated(im_src, (float)degrees, color);
+ im_dst = gdImageRotateInterpolated(im_src, (const float)degrees, color);
if (im_dst != NULL) {
ZEND_REGISTER_RESOURCE(return_value, im_dst, le_gd);
@@ -5175,8 +5183,6 @@ PHP_FUNCTION(imageaffine)
pRect = NULL;
}
-
- //int gdTransformAffineGetImage(gdImagePtr *dst, const gdImagePtr src, gdRectPtr src_area, const double affine[6]);
if (gdTransformAffineGetImage(&dst, src, pRect, affine) != GD_TRUE) {
RETURN_FALSE;
}
diff --git a/ext/gd/libgd/gd.h b/ext/gd/libgd/gd.h
index 72515108d6..20156b97b5 100644
--- a/ext/gd/libgd/gd.h
+++ b/ext/gd/libgd/gd.h
@@ -849,8 +849,7 @@ gdImagePtr gdImageRotateNearestNeighbour(gdImagePtr src, const float degrees, co
gdImagePtr gdImageRotateBilinear(gdImagePtr src, const float degrees, const int bgColor);
gdImagePtr gdImageRotateBicubicFixed(gdImagePtr src, const float degrees, const int bgColor);
gdImagePtr gdImageRotateGeneric(gdImagePtr src, const float degrees, const int bgColor);
-
-
+gdImagePtr gdImageRotateInterpolated(const gdImagePtr src, const float angle, int bgcolor);
typedef enum {
GD_AFFINE_TRANSLATE = 0,
diff --git a/ext/gd/libgd/gd_interpolation.c b/ext/gd/libgd/gd_interpolation.c
index e3247a78c1..b6e7c69201 100644
--- a/ext/gd/libgd/gd_interpolation.c
+++ b/ext/gd/libgd/gd_interpolation.c
@@ -1,4 +1,5 @@
/*
+ * The two pass scaling function is based on:
* Filtered Image Rescaling
* Based on Gems III
* - Schumacher general filtered image rescaling
@@ -13,6 +14,7 @@
*
* Initial sources code is avaibable in the Gems Source Code Packages:
* http://www.acm.org/pubs/tog/GraphicsGems/GGemsIII.tar.gz
+ *
*/
/*
@@ -816,10 +818,6 @@ int getPixelInterpolated(gdImagePtr im, const double x, const double y, const in
return -1;
}
- /* Default to full alpha */
- if (bgColor == -1) {
- }
-
if (im->interpolation_id == GD_WEIGHTED4) {
return getPixelInterpolateWeight(im, x, y, bgColor);
}
@@ -1708,6 +1706,7 @@ gdImagePtr gdImageRotateNearestNeighbour(gdImagePtr src, const float degrees, co
gdImagePtr gdImageRotateGeneric(gdImagePtr src, const float degrees, const int bgColor)
{
float _angle = ((float) (-degrees / 180.0f) * (float)M_PI);
+ const int angle_rounded = (int)floor(degrees * 100);
const int src_w = gdImageSX(src);
const int src_h = gdImageSY(src);
const unsigned int new_width = (unsigned int)(abs((int)(src_w * cos(_angle))) + abs((int)(src_h * sin(_angle))) + 0.5f);
@@ -1730,6 +1729,10 @@ gdImagePtr gdImageRotateGeneric(gdImagePtr src, const float degrees, const int b
: 0;
+ if (bgColor < 0) {
+ return NULL;
+ }
+
dst = gdImageCreateTrueColor(new_width, new_height);
if (!dst) {
return NULL;
diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c
index f8c3a0773b..6b3dadf405 100644
--- a/ext/gmp/gmp.c
+++ b/ext/gmp/gmp.c
@@ -24,6 +24,7 @@
#include "php_ini.h"
#include "php_gmp.h"
#include "ext/standard/info.h"
+#include "zend_exceptions.h"
#if HAVE_GMP
@@ -34,9 +35,6 @@
#include "ext/standard/php_lcg.h"
#define GMP_ABS(x) ((x) >= 0 ? (x) : -(x))
-/* True global resources - no need for thread safety here */
-static int le_gmp;
-
/* {{{ arginfo */
ZEND_BEGIN_ARG_INFO_EX(arginfo_gmp_init, 0, 0, 1)
ZEND_ARG_INFO(0, number)
@@ -308,9 +306,18 @@ zend_module_entry gmp_module_entry = {
ZEND_GET_MODULE(gmp)
#endif
-static void _php_gmpnum_free(zend_rsrc_list_entry *rsrc TSRMLS_DC);
+zend_class_entry *gmp_ce;
+static zend_object_handlers gmp_object_handlers;
+
+typedef struct _gmp_object {
+ zend_object std;
+ mpz_t num;
+} gmp_object;
-#define GMP_RESOURCE_NAME "GMP integer"
+typedef struct _gmp_temp {
+ mpz_t num;
+ zend_bool is_used;
+} gmp_temp_t;
#define GMP_ROUND_ZERO 0
#define GMP_ROUND_PLUSINF 1
@@ -324,6 +331,123 @@ static void _php_gmpnum_free(zend_rsrc_list_entry *rsrc TSRMLS_DC);
# define MAX_BASE 36
#endif
+#define IS_GMP(zval) \
+ (Z_TYPE_P(zval) == IS_OBJECT && instanceof_function(Z_OBJCE_P(zval), gmp_ce TSRMLS_CC))
+
+#define GET_GMP_FROM_ZVAL(zval) \
+ (((gmp_object *) zend_object_store_get_object((zval) TSRMLS_CC))->num)
+
+/* The FETCH_GMP_ZVAL_* family of macros is used to fetch a gmp number
+ * (mpz_ptr) from a zval. If the zval is not a GMP instance, then we
+ * try to convert the value to a temporary gmp number using convert_to_gmp.
+ * This temporary number is stored in the temp argument, which is of type
+ * gmp_temp_t. This temporary value needs to be freed lateron using the
+ * FREE_GMP_TEMP macro.
+ *
+ * If the conversion to a gmp number fails, the macros return false.
+ * The _DEP / _DEP_DEP variants additionally free the temporary values
+ * passed in the last / last two arguments.
+ *
+ * If one zval can sometimes be fetched as a long you have to set the
+ * is_used member of the corresponding gmp_temp_t value to 0, otherwise
+ * the FREE_GMP_TEMP and *_DEP macros will not work properly.
+ *
+ * The three FETCH_GMP_ZVAL_* macros below are mostly copy & paste code
+ * as I couldn't find a way to combine them.
+ */
+
+#define FREE_GMP_TEMP(temp) \
+ if (temp.is_used) { \
+ mpz_clear(temp.num); \
+ }
+
+#define FETCH_GMP_ZVAL_DEP_DEP(gmpnumber, zval, temp, dep1, dep2) \
+if (IS_GMP(zval)) { \
+ gmpnumber = GET_GMP_FROM_ZVAL(zval); \
+ temp.is_used = 0; \
+} else { \
+ mpz_init(temp.num); \
+ if (convert_to_gmp(temp.num, zval, 0 TSRMLS_CC) == FAILURE) { \
+ mpz_clear(temp.num); \
+ FREE_GMP_TEMP(dep1); \
+ FREE_GMP_TEMP(dep2); \
+ RETURN_FALSE; \
+ } \
+ temp.is_used = 1; \
+ gmpnumber = temp.num; \
+}
+
+#define FETCH_GMP_ZVAL_DEP(gmpnumber, zval, temp, dep) \
+if (IS_GMP(zval)) { \
+ gmpnumber = GET_GMP_FROM_ZVAL(zval); \
+ temp.is_used = 0; \
+} else { \
+ mpz_init(temp.num); \
+ if (convert_to_gmp(temp.num, zval, 0 TSRMLS_CC) == FAILURE) { \
+ mpz_clear(temp.num); \
+ FREE_GMP_TEMP(dep); \
+ RETURN_FALSE; \
+ } \
+ temp.is_used = 1; \
+ gmpnumber = temp.num; \
+}
+
+#define FETCH_GMP_ZVAL(gmpnumber, zval, temp) \
+if (IS_GMP(zval)) { \
+ gmpnumber = GET_GMP_FROM_ZVAL(zval); \
+ temp.is_used = 0; \
+} else { \
+ mpz_init(temp.num); \
+ if (convert_to_gmp(temp.num, zval, 0 TSRMLS_CC) == FAILURE) { \
+ mpz_clear(temp.num); \
+ RETURN_FALSE; \
+ } \
+ temp.is_used = 1; \
+ gmpnumber = temp.num; \
+}
+
+#define INIT_GMP_RETVAL(gmpnumber) \
+ gmp_create_ex(return_value, &gmpnumber TSRMLS_CC)
+
+static void gmp_strval(zval *result, mpz_t gmpnum, long base);
+static int convert_to_gmp(mpz_t gmpnumber, zval *val, int base TSRMLS_DC);
+static void gmp_cmp(zval *return_value, zval *a_arg, zval *b_arg TSRMLS_DC);
+
+/*
+ * The gmp_*_op functions provide an implementation for several common types
+ * of GMP functions. The gmp_zval_(unary|binary)_*_op functions have to be manually
+ * passed zvals to work on, whereas the gmp_(unary|binary)_*_op macros already
+ * include parameter parsing.
+ */
+typedef void (*gmp_unary_op_t)(mpz_ptr, mpz_srcptr);
+typedef int (*gmp_unary_opl_t)(mpz_srcptr);
+
+typedef void (*gmp_unary_ui_op_t)(mpz_ptr, unsigned long);
+
+typedef void (*gmp_binary_op_t)(mpz_ptr, mpz_srcptr, mpz_srcptr);
+typedef int (*gmp_binary_opl_t)(mpz_srcptr, mpz_srcptr);
+
+typedef void (*gmp_binary_ui_op_t)(mpz_ptr, mpz_srcptr, unsigned long);
+typedef void (*gmp_binary_op2_t)(mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr);
+typedef void (*gmp_binary_ui_op2_t)(mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long);
+
+static inline void gmp_zval_binary_ui_op(zval *return_value, zval *a_arg, zval *b_arg, gmp_binary_op_t gmp_op, gmp_binary_ui_op_t gmp_ui_op, int check_b_zero TSRMLS_DC);
+static inline void gmp_zval_binary_ui_op2(zval *return_value, zval *a_arg, zval *b_arg, gmp_binary_op2_t gmp_op, gmp_binary_ui_op2_t gmp_ui_op, int check_b_zero TSRMLS_DC);
+static inline void gmp_zval_unary_op(zval *return_value, zval *a_arg, gmp_unary_op_t gmp_op TSRMLS_DC);
+static inline void gmp_zval_unary_ui_op(zval *return_value, zval *a_arg, gmp_unary_ui_op_t gmp_op TSRMLS_DC);
+
+/* Binary operations */
+#define gmp_binary_ui_op(op, uop) _gmp_binary_ui_op(INTERNAL_FUNCTION_PARAM_PASSTHRU, op, uop, 0)
+#define gmp_binary_op(op) _gmp_binary_ui_op(INTERNAL_FUNCTION_PARAM_PASSTHRU, op, NULL, 0)
+#define gmp_binary_opl(op) _gmp_binary_opl(INTERNAL_FUNCTION_PARAM_PASSTHRU, op)
+#define gmp_binary_ui_op_no_zero(op, uop) \
+ _gmp_binary_ui_op(INTERNAL_FUNCTION_PARAM_PASSTHRU, op, uop, 1)
+
+/* Unary operations */
+#define gmp_unary_op(op) _gmp_unary_op(INTERNAL_FUNCTION_PARAM_PASSTHRU, op)
+#define gmp_unary_opl(op) _gmp_unary_opl(INTERNAL_FUNCTION_PARAM_PASSTHRU, op)
+#define gmp_unary_ui_op(op) _gmp_unary_ui_op(INTERNAL_FUNCTION_PARAM_PASSTHRU, op)
+
/* {{{ gmp_emalloc
*/
static void *gmp_emalloc(size_t size)
@@ -348,6 +472,245 @@ static void gmp_efree(void *ptr, size_t size)
}
/* }}} */
+static inline long gmp_get_long(zval *zv) /* {{{ */
+{
+ if (Z_TYPE_P(zv) == IS_LONG) {
+ return Z_LVAL_P(zv);
+ } else {
+ zval tmp_zv;
+ MAKE_COPY_ZVAL(&zv, &tmp_zv);
+ convert_to_long(&tmp_zv);
+ return Z_LVAL(tmp_zv);
+ }
+}
+/* }}} */
+
+static void gmp_free_object_storage(gmp_object *intern TSRMLS_DC) /* {{{ */
+{
+ mpz_clear(intern->num);
+
+ zend_object_std_dtor(&intern->std TSRMLS_CC);
+ efree(intern);
+}
+/* }}} */
+
+static inline zend_object_value gmp_create_object_ex(zend_class_entry *ce, mpz_ptr *gmpnum_target TSRMLS_DC) /* {{{ */
+{
+ zend_object_value retval;
+ gmp_object *intern = emalloc(sizeof(gmp_object));
+
+ zend_object_std_init(&intern->std, ce TSRMLS_CC);
+ object_properties_init(&intern->std, ce);
+
+ mpz_init(intern->num);
+ *gmpnum_target = intern->num;
+
+ retval.handle = zend_objects_store_put(
+ intern, (zend_objects_store_dtor_t) zend_objects_destroy_object,
+ (zend_objects_free_object_storage_t) gmp_free_object_storage,
+ NULL TSRMLS_CC
+ );
+ retval.handlers = &gmp_object_handlers;
+
+ return retval;
+}
+/* }}} */
+
+static zend_object_value gmp_create_object(zend_class_entry *ce TSRMLS_DC) /* {{{ */
+{
+ mpz_ptr gmpnum_dummy;
+ return gmp_create_object_ex(ce, &gmpnum_dummy TSRMLS_CC);
+}
+/* }}} */
+
+static inline void gmp_create_ex(zval *target, mpz_ptr *gmpnum_target TSRMLS_DC) /* {{{ */
+{
+ Z_TYPE_P(target) = IS_OBJECT;
+ Z_OBJVAL_P(target) = gmp_create_object_ex(gmp_ce, gmpnum_target TSRMLS_CC);
+}
+/* }}} */
+
+static zval *gmp_create(mpz_ptr *gmpnum_target TSRMLS_DC) /* {{{ */
+{
+ zval *obj;
+ MAKE_STD_ZVAL(obj);
+ gmp_create_ex(obj, gmpnum_target TSRMLS_CC);
+ return obj;
+}
+/* }}} */
+
+static int gmp_cast_object(zval *readobj, zval *writeobj, int type TSRMLS_DC) /* {{{ */
+{
+ mpz_ptr gmpnum;
+ switch (type) {
+ case IS_STRING:
+ gmpnum = GET_GMP_FROM_ZVAL(readobj);
+ INIT_PZVAL(writeobj);
+ gmp_strval(writeobj, gmpnum, 10);
+ return SUCCESS;
+ case IS_LONG:
+ gmpnum = GET_GMP_FROM_ZVAL(readobj);
+ INIT_PZVAL(writeobj);
+ ZVAL_LONG(writeobj, mpz_get_si(gmpnum));
+ return SUCCESS;
+ case IS_DOUBLE:
+ gmpnum = GET_GMP_FROM_ZVAL(readobj);
+ INIT_PZVAL(writeobj);
+ ZVAL_DOUBLE(writeobj, mpz_get_d(gmpnum));
+ return SUCCESS;
+ default:
+ return FAILURE;
+ }
+}
+/* }}} */
+
+static HashTable *gmp_get_properties(zval *obj TSRMLS_DC) /* {{{ */
+{
+ HashTable *ht = zend_std_get_properties(obj TSRMLS_CC);
+ mpz_ptr gmpnum = GET_GMP_FROM_ZVAL(obj);
+ zval *zv;
+
+ MAKE_STD_ZVAL(zv);
+ gmp_strval(zv, gmpnum, 10);
+ zend_hash_update(ht, "num", sizeof("num"), &zv, sizeof(zval *), NULL);
+
+ return ht;
+}
+/* }}} */
+
+static zend_object_value gmp_clone_obj(zval *obj TSRMLS_DC) /* {{{ */
+{
+ gmp_object *old_object = zend_object_store_get_object(obj TSRMLS_CC);
+ zend_object_value new_object_val = gmp_create_object(Z_OBJCE_P(obj) TSRMLS_CC);
+ gmp_object *new_object = zend_object_store_get_object_by_handle(
+ new_object_val.handle TSRMLS_CC
+ );
+
+ zend_objects_clone_members(
+ &new_object->std, new_object_val,
+ &old_object->std, Z_OBJ_HANDLE_P(obj) TSRMLS_CC
+ );
+
+ mpz_set(new_object->num, old_object->num);
+
+ return new_object_val;
+}
+/* }}} */
+
+static void shift_operator_helper(gmp_binary_ui_op_t op, zval *return_value, zval *op1, zval *op2 TSRMLS_DC) {
+ zval op2_copy;
+ if (Z_TYPE_P(op2) != IS_LONG) {
+ op2_copy = *op2;
+ zval_copy_ctor(&op2_copy);
+ convert_to_long(&op2_copy);
+ op2 = &op2_copy;
+ }
+
+ if (Z_LVAL_P(op2) < 0) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Shift cannot be negative");
+ RETVAL_FALSE;
+ } else {
+ mpz_ptr gmpnum_op, gmpnum_result;
+ gmp_temp_t temp;
+
+ FETCH_GMP_ZVAL(gmpnum_op, op1, temp);
+ INIT_GMP_RETVAL(gmpnum_result);
+ op(gmpnum_result, gmpnum_op, (unsigned long) Z_LVAL_P(op2));
+ FREE_GMP_TEMP(temp);
+ }
+}
+
+#define DO_BINARY_UI_OP_EX(op, uop, check_b_zero) \
+ gmp_zval_binary_ui_op( \
+ result, op1, op2, op, (gmp_binary_ui_op_t) uop, \
+ check_b_zero TSRMLS_CC \
+ ); \
+ return SUCCESS;
+
+#define DO_BINARY_UI_OP(op) DO_BINARY_UI_OP_EX(op, op ## _ui, 0)
+#define DO_BINARY_OP(op) DO_BINARY_UI_OP_EX(op, NULL, 0)
+
+#define DO_UNARY_OP(op) \
+ gmp_zval_unary_op(result, op1, op TSRMLS_CC); \
+ return SUCCESS;
+
+static int gmp_do_operation(zend_uchar opcode, zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */
+{
+ switch (opcode) {
+ case ZEND_ADD:
+ DO_BINARY_UI_OP(mpz_add);
+ case ZEND_SUB:
+ DO_BINARY_UI_OP(mpz_sub);
+ case ZEND_MUL:
+ DO_BINARY_UI_OP(mpz_mul);
+ case ZEND_DIV:
+ DO_BINARY_UI_OP_EX(mpz_tdiv_q, mpz_tdiv_q_ui, 1);
+ case ZEND_MOD:
+ DO_BINARY_UI_OP_EX(mpz_mod, mpz_mod_ui, 1);
+ case ZEND_SL:
+ shift_operator_helper(mpz_mul_2exp, result, op1, op2 TSRMLS_CC);
+ return SUCCESS;
+ case ZEND_SR:
+ shift_operator_helper(mpz_fdiv_q_2exp, result, op1, op2 TSRMLS_CC);
+ return SUCCESS;
+ case ZEND_BW_OR:
+ DO_BINARY_OP(mpz_ior);
+ case ZEND_BW_AND:
+ DO_BINARY_OP(mpz_and);
+ case ZEND_BW_XOR:
+ DO_BINARY_OP(mpz_xor);
+ case ZEND_BW_NOT:
+ DO_UNARY_OP(mpz_com);
+
+ default:
+ return FAILURE;
+ }
+}
+/* }}} */
+
+static int gmp_compare(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */
+{
+ gmp_cmp(result, op1, op2 TSRMLS_CC);
+ if (Z_TYPE_P(result) == IS_BOOL) {
+ ZVAL_LONG(result, 1);
+ }
+ return SUCCESS;
+}
+/* }}} */
+
+PHP_METHOD(GMP, __wakeup) /* {{{ */
+{
+ HashTable *props;
+ zval **num_zv;
+
+ if (zend_parse_parameters_none() == FAILURE) {
+ return;
+ }
+
+ props = zend_std_get_properties(getThis() TSRMLS_CC);
+ if (zend_hash_find(props, "num", sizeof("num"), (void **) &num_zv) == SUCCESS
+ && Z_TYPE_PP(num_zv) == IS_STRING && Z_STRLEN_PP(num_zv) > 0
+ ) {
+ mpz_ptr gmpnumber = GET_GMP_FROM_ZVAL(getThis());
+ if (convert_to_gmp(gmpnumber, *num_zv, 10 TSRMLS_CC) == SUCCESS) {
+ return;
+ }
+ }
+
+ zend_throw_exception(
+ NULL, "Invalid serialization data", 0 TSRMLS_CC
+ );
+}
+/* }}} */
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_wakeup, 0, 0, 0)
+ZEND_END_ARG_INFO()
+
+const zend_function_entry gmp_methods[] = {
+ PHP_ME(GMP, __wakeup, arginfo_wakeup, ZEND_ACC_PUBLIC)
+ PHP_FE_END
+};
+
/* {{{ ZEND_GINIT_FUNCTION
*/
static ZEND_GINIT_FUNCTION(gmp)
@@ -358,9 +721,20 @@ static ZEND_GINIT_FUNCTION(gmp)
/* {{{ ZEND_MINIT_FUNCTION
*/
-ZEND_MODULE_STARTUP_D(gmp)
+ZEND_MINIT_FUNCTION(gmp)
{
- le_gmp = zend_register_list_destructors_ex(_php_gmpnum_free, NULL, GMP_RESOURCE_NAME, module_number);
+ zend_class_entry tmp_ce;
+ INIT_CLASS_ENTRY(tmp_ce, "GMP", gmp_methods); /* No methods on the class for now */
+ gmp_ce = zend_register_internal_class(&tmp_ce TSRMLS_CC);
+ gmp_ce->create_object = gmp_create_object;
+
+ memcpy(&gmp_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
+ gmp_object_handlers.cast_object = gmp_cast_object;
+ gmp_object_handlers.get_properties = gmp_get_properties;
+ gmp_object_handlers.clone_obj = gmp_clone_obj;
+ gmp_object_handlers.do_operation = gmp_do_operation;
+ gmp_object_handlers.compare = gmp_compare;
+
REGISTER_LONG_CONSTANT("GMP_ROUND_ZERO", GMP_ROUND_ZERO, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("GMP_ROUND_PLUSINF", GMP_ROUND_PLUSINF, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("GMP_ROUND_MINUSINF", GMP_ROUND_MINUSINF, CONST_CS | CONST_PERSISTENT);
@@ -403,246 +777,211 @@ ZEND_MODULE_INFO_D(gmp)
}
/* }}} */
-/* Fetch zval to be GMP number.
- Initially, zval can be also number or string */
-#define FETCH_GMP_ZVAL(gmpnumber, zval, tmp_resource) \
-if (Z_TYPE_PP(zval) == IS_RESOURCE) { \
- ZEND_FETCH_RESOURCE(gmpnumber, mpz_t *, zval, -1, GMP_RESOURCE_NAME, le_gmp); \
- tmp_resource = 0; \
-} else { \
- if (convert_to_gmp(&gmpnumber, zval, 0 TSRMLS_CC) == FAILURE) { \
- RETURN_FALSE; \
- } \
- tmp_resource = ZEND_REGISTER_RESOURCE(NULL, gmpnumber, le_gmp); \
-}
-
-#define FREE_GMP_TEMP(tmp_resource) \
- if(tmp_resource) { \
- zend_list_delete(tmp_resource); \
- }
-
-
-/* create a new initialized GMP number */
-#define INIT_GMP_NUM(gmpnumber) { gmpnumber=emalloc(sizeof(mpz_t)); mpz_init(*gmpnumber); }
-#define FREE_GMP_NUM(gmpnumber) { mpz_clear(*gmpnumber); efree(gmpnumber); }
/* {{{ convert_to_gmp
* Convert zval to be gmp number */
-static int convert_to_gmp(mpz_t * *gmpnumber, zval **val, int base TSRMLS_DC)
+static int convert_to_gmp(mpz_t gmpnumber, zval *val, int base TSRMLS_DC)
{
- int ret = 0;
- int skip_lead = 0;
-
- *gmpnumber = emalloc(sizeof(mpz_t));
-
- switch (Z_TYPE_PP(val)) {
+ switch (Z_TYPE_P(val)) {
case IS_LONG:
case IS_BOOL:
- case IS_CONSTANT:
- {
- convert_to_long_ex(val);
- mpz_init_set_si(**gmpnumber, Z_LVAL_PP(val));
- }
- break;
- case IS_STRING:
- {
- char *numstr = Z_STRVAL_PP(val);
-
- if (Z_STRLEN_PP(val) > 2) {
- if (numstr[0] == '0') {
- if (numstr[1] == 'x' || numstr[1] == 'X') {
- base = 16;
- skip_lead = 1;
- } else if (base != 16 && (numstr[1] == 'b' || numstr[1] == 'B')) {
- base = 2;
- skip_lead = 1;
- }
+ case IS_CONSTANT: {
+ mpz_set_si(gmpnumber, gmp_get_long(val));
+ return SUCCESS;
+ }
+ case IS_STRING: {
+ char *numstr = Z_STRVAL_P(val);
+ int skip_lead = 0;
+
+ if (Z_STRLEN_P(val) > 2) {
+ if (numstr[0] == '0') {
+ if (numstr[1] == 'x' || numstr[1] == 'X') {
+ base = 16;
+ skip_lead = 1;
+ } else if (base != 16 && (numstr[1] == 'b' || numstr[1] == 'B')) {
+ base = 2;
+ skip_lead = 1;
}
}
- ret = mpz_init_set_str(**gmpnumber, (skip_lead ? &numstr[2] : numstr), base);
}
- break;
- default:
- php_error_docref(NULL TSRMLS_CC, E_WARNING,"Unable to convert variable to GMP - wrong type");
- efree(*gmpnumber);
- return FAILURE;
- }
- if (ret) {
- FREE_GMP_NUM(*gmpnumber);
+ return mpz_set_str(gmpnumber, (skip_lead ? &numstr[2] : numstr), base);
+ }
+ default:
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to convert variable to GMP - wrong type");
return FAILURE;
}
-
- return SUCCESS;
}
/* }}} */
-/* {{{ typedefs
- */
-typedef void (*gmp_unary_op_t)(mpz_ptr, mpz_srcptr);
-typedef int (*gmp_unary_opl_t)(mpz_srcptr);
+static void gmp_strval(zval *result, mpz_t gmpnum, long base) /* {{{ */
+{
+ int num_len;
+ char *out_string;
-typedef void (*gmp_unary_ui_op_t)(mpz_ptr, unsigned long);
+ num_len = mpz_sizeinbase(gmpnum, abs(base));
+ if (mpz_sgn(gmpnum) < 0) {
+ num_len++;
+ }
-typedef void (*gmp_binary_op_t)(mpz_ptr, mpz_srcptr, mpz_srcptr);
-typedef int (*gmp_binary_opl_t)(mpz_srcptr, mpz_srcptr);
+ out_string = emalloc(num_len + 1);
+ mpz_get_str(out_string, base, gmpnum);
+
+ /*
+ * From GMP documentation for mpz_sizeinbase():
+ * The returned value will be exact or 1 too big. If base is a power of
+ * 2, the returned value will always be exact.
+ *
+ * So let's check to see if we already have a \0 byte...
+ */
+
+ if (out_string[num_len - 1] == '\0') {
+ num_len--;
+ } else {
+ out_string[num_len] = '\0';
+ }
-typedef unsigned long (*gmp_binary_ui_op_t)(mpz_ptr, mpz_srcptr, unsigned long);
-typedef void (*gmp_binary_op2_t)(mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr);
-typedef unsigned long (*gmp_binary_ui_op2_t)(mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long);
+ ZVAL_STRINGL(result, out_string, num_len, 0);
+}
/* }}} */
-#define gmp_zval_binary_ui_op(r, a, b, o, u) gmp_zval_binary_ui_op_ex(r, a, b, o, u, 0, 0, 0 TSRMLS_CC)
-#define gmp_zval_binary_ui_op2(r, a, b, o, u) gmp_zval_binary_ui_op2_ex(r, a, b, o, u, 0, 0, 0 TSRMLS_CC)
+static void gmp_cmp(zval *return_value, zval *a_arg, zval *b_arg TSRMLS_DC) /* {{{ */
+{
+ mpz_ptr gmpnum_a, gmpnum_b;
+ gmp_temp_t temp_a, temp_b;
+ zend_bool use_si = 0;
+ long res;
-#define gmp_binary_ui_op(op, uop) _gmp_binary_ui_op(INTERNAL_FUNCTION_PARAM_PASSTHRU, op, uop)
-#define gmp_binary_op(op) _gmp_binary_ui_op(INTERNAL_FUNCTION_PARAM_PASSTHRU, op, NULL)
-#define gmp_binary_opl(op) _gmp_binary_opl(INTERNAL_FUNCTION_PARAM_PASSTHRU, op)
+ FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
-/* Unary operations */
-#define gmp_unary_op(op) _gmp_unary_op(INTERNAL_FUNCTION_PARAM_PASSTHRU, op)
-#define gmp_unary_opl(op) _gmp_unary_opl(INTERNAL_FUNCTION_PARAM_PASSTHRU, op)
-#define gmp_unary_ui_op(op) _gmp_unary_ui_op(INTERNAL_FUNCTION_PARAM_PASSTHRU, op)
+ if (Z_TYPE_P(b_arg) == IS_LONG) {
+ use_si = 1;
+ temp_b.is_used = 0;
+ } else {
+ FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a);
+ }
+
+ if (use_si) {
+ res = mpz_cmp_si(gmpnum_a, Z_LVAL_P(b_arg));
+ } else {
+ res = mpz_cmp(gmpnum_a, gmpnum_b);
+ }
+
+ FREE_GMP_TEMP(temp_a);
+ FREE_GMP_TEMP(temp_b);
+
+ RETURN_LONG(res);
+}
+/* }}} */
-/* {{{ gmp_zval_binary_ui_op_ex
+/* {{{ gmp_zval_binary_ui_op
Execute GMP binary operation.
- May return GMP resource or long if operation allows this
*/
-static inline void gmp_zval_binary_ui_op_ex(zval *return_value, zval **a_arg, zval **b_arg, gmp_binary_op_t gmp_op, gmp_binary_ui_op_t gmp_ui_op, int allow_ui_return, int check_b_zero, int use_sign TSRMLS_DC)
+static inline void gmp_zval_binary_ui_op(zval *return_value, zval *a_arg, zval *b_arg, gmp_binary_op_t gmp_op, gmp_binary_ui_op_t gmp_ui_op, int check_b_zero TSRMLS_DC)
{
- mpz_t *gmpnum_a, *gmpnum_b, *gmpnum_result;
- unsigned long long_result = 0;
+ mpz_ptr gmpnum_a, gmpnum_b, gmpnum_result;
int use_ui = 0;
- int arga_tmp = 0, argb_tmp = 0;
+ gmp_temp_t temp_a, temp_b;
- FETCH_GMP_ZVAL(gmpnum_a, a_arg, arga_tmp);
+ FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
- if (gmp_ui_op && Z_TYPE_PP(b_arg) == IS_LONG && Z_LVAL_PP(b_arg) >= 0) {
+ if (gmp_ui_op && Z_TYPE_P(b_arg) == IS_LONG && Z_LVAL_P(b_arg) >= 0) {
use_ui = 1;
+ temp_b.is_used = 0;
} else {
- FETCH_GMP_ZVAL(gmpnum_b, b_arg, argb_tmp);
+ FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a);
}
- if(check_b_zero) {
+ if (check_b_zero) {
int b_is_zero = 0;
- if(use_ui) {
- b_is_zero = (Z_LVAL_PP(b_arg) == 0);
+ if (use_ui) {
+ b_is_zero = (Z_LVAL_P(b_arg) == 0);
} else {
- b_is_zero = !mpz_cmp_ui(*gmpnum_b, 0);
+ b_is_zero = !mpz_cmp_ui(gmpnum_b, 0);
}
- if(b_is_zero) {
+ if (b_is_zero) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Zero operand not allowed");
- FREE_GMP_TEMP(arga_tmp);
- FREE_GMP_TEMP(argb_tmp);
+ FREE_GMP_TEMP(temp_a);
+ FREE_GMP_TEMP(temp_b);
RETURN_FALSE;
}
}
- INIT_GMP_NUM(gmpnum_result);
+ INIT_GMP_RETVAL(gmpnum_result);
- if (use_ui && gmp_ui_op) {
- if (allow_ui_return) {
- long_result = gmp_ui_op(*gmpnum_result, *gmpnum_a, (unsigned long)Z_LVAL_PP(b_arg));
- if (use_sign && mpz_sgn(*gmpnum_a) == -1) {
- long_result = -long_result;
- }
- } else {
- gmp_ui_op(*gmpnum_result, *gmpnum_a, (unsigned long)Z_LVAL_PP(b_arg));
- }
+ if (use_ui) {
+ gmp_ui_op(gmpnum_result, gmpnum_a, (unsigned long) Z_LVAL_P(b_arg));
} else {
- gmp_op(*gmpnum_result, *gmpnum_a, *gmpnum_b);
+ gmp_op(gmpnum_result, gmpnum_a, gmpnum_b);
}
- FREE_GMP_TEMP(arga_tmp);
- FREE_GMP_TEMP(argb_tmp);
-
- if (use_ui && allow_ui_return) {
- FREE_GMP_NUM(gmpnum_result);
- RETURN_LONG((long)long_result);
- } else {
- ZEND_REGISTER_RESOURCE(return_value, gmpnum_result, le_gmp);
- }
+ FREE_GMP_TEMP(temp_a);
+ FREE_GMP_TEMP(temp_b);
}
/* }}} */
-/* {{{ gmp_zval_binary_ui_op2_ex
+/* {{{ gmp_zval_binary_ui_op2
Execute GMP binary operation which returns 2 values.
- May return GMP resources or longs if operation allows this.
*/
-static inline void gmp_zval_binary_ui_op2_ex(zval *return_value, zval **a_arg, zval **b_arg, gmp_binary_op2_t gmp_op, gmp_binary_ui_op2_t gmp_ui_op, int allow_ui_return, int check_b_zero TSRMLS_DC)
+static inline void gmp_zval_binary_ui_op2(zval *return_value, zval *a_arg, zval *b_arg, gmp_binary_op2_t gmp_op, gmp_binary_ui_op2_t gmp_ui_op, int check_b_zero TSRMLS_DC)
{
- mpz_t *gmpnum_a, *gmpnum_b, *gmpnum_result1, *gmpnum_result2;
- zval r;
+ mpz_ptr gmpnum_a, gmpnum_b, gmpnum_result1, gmpnum_result2;
int use_ui = 0;
- unsigned long long_result = 0;
- int arga_tmp = 0, argb_tmp = 0;
+ gmp_temp_t temp_a, temp_b;
- FETCH_GMP_ZVAL(gmpnum_a, a_arg, arga_tmp);
+ FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
- if (gmp_ui_op && Z_TYPE_PP(b_arg) == IS_LONG && Z_LVAL_PP(b_arg) >= 0) {
+ if (gmp_ui_op && Z_TYPE_P(b_arg) == IS_LONG && Z_LVAL_P(b_arg) >= 0) {
/* use _ui function */
use_ui = 1;
+ temp_b.is_used = 0;
} else {
- FETCH_GMP_ZVAL(gmpnum_b, b_arg, argb_tmp);
+ FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a);
}
- if(check_b_zero) {
+ if (check_b_zero) {
int b_is_zero = 0;
- if(use_ui) {
- b_is_zero = (Z_LVAL_PP(b_arg) == 0);
+ if (use_ui) {
+ b_is_zero = (Z_LVAL_P(b_arg) == 0);
} else {
- b_is_zero = !mpz_cmp_ui(*gmpnum_b, 0);
+ b_is_zero = !mpz_cmp_ui(gmpnum_b, 0);
}
- if(b_is_zero) {
+ if (b_is_zero) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Zero operand not allowed");
- FREE_GMP_TEMP(arga_tmp);
- FREE_GMP_TEMP(argb_tmp);
+ FREE_GMP_TEMP(temp_a);
+ FREE_GMP_TEMP(temp_b);
RETURN_FALSE;
}
}
- INIT_GMP_NUM(gmpnum_result1);
- INIT_GMP_NUM(gmpnum_result2);
+ array_init(return_value);
+ add_index_zval(return_value, 0, gmp_create(&gmpnum_result1 TSRMLS_CC));
+ add_index_zval(return_value, 1, gmp_create(&gmpnum_result2 TSRMLS_CC));
- if (use_ui && gmp_ui_op) {
- if (allow_ui_return) {
- long_result = gmp_ui_op(*gmpnum_result1, *gmpnum_result2, *gmpnum_a, (unsigned long)Z_LVAL_PP(b_arg));
- } else {
- gmp_ui_op(*gmpnum_result1, *gmpnum_result2, *gmpnum_a, (unsigned long)Z_LVAL_PP(b_arg));
- }
+ if (use_ui) {
+ gmp_ui_op(gmpnum_result1, gmpnum_result2, gmpnum_a, (unsigned long) Z_LVAL_P(b_arg));
} else {
- gmp_op(*gmpnum_result1, *gmpnum_result2, *gmpnum_a, *gmpnum_b);
+ gmp_op(gmpnum_result1, gmpnum_result2, gmpnum_a, gmpnum_b);
}
- FREE_GMP_TEMP(arga_tmp);
- FREE_GMP_TEMP(argb_tmp);
-
- array_init(return_value);
- ZEND_REGISTER_RESOURCE(&r, gmpnum_result1, le_gmp);
- add_index_resource(return_value, 0, Z_LVAL(r));
- if (use_ui && allow_ui_return) {
- mpz_clear(*gmpnum_result2);
- add_index_long(return_value, 1, long_result);
- } else {
- ZEND_REGISTER_RESOURCE(&r, gmpnum_result2, le_gmp);
- add_index_resource(return_value, 1, Z_LVAL(r));
- }
+ FREE_GMP_TEMP(temp_a);
+ FREE_GMP_TEMP(temp_b);
}
/* }}} */
/* {{{ _gmp_binary_ui_op
*/
-static inline void _gmp_binary_ui_op(INTERNAL_FUNCTION_PARAMETERS, gmp_binary_op_t gmp_op, gmp_binary_ui_op_t gmp_ui_op)
+static inline void _gmp_binary_ui_op(INTERNAL_FUNCTION_PARAMETERS, gmp_binary_op_t gmp_op, gmp_binary_ui_op_t gmp_ui_op, int check_b_zero)
{
- zval **a_arg, **b_arg;
+ zval *a_arg, *b_arg;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ", &a_arg, &b_arg) == FAILURE){
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &a_arg, &b_arg) == FAILURE){
return;
}
- gmp_zval_binary_ui_op(return_value, a_arg, b_arg, gmp_op, gmp_ui_op);
+ gmp_zval_binary_ui_op(return_value, a_arg, b_arg, gmp_op, gmp_ui_op, check_b_zero TSRMLS_CC);
}
/* }}} */
@@ -650,33 +989,28 @@ static inline void _gmp_binary_ui_op(INTERNAL_FUNCTION_PARAMETERS, gmp_binary_op
/* {{{ gmp_zval_unary_op
*/
-static inline void gmp_zval_unary_op(zval *return_value, zval **a_arg, gmp_unary_op_t gmp_op TSRMLS_DC)
+static inline void gmp_zval_unary_op(zval *return_value, zval *a_arg, gmp_unary_op_t gmp_op TSRMLS_DC)
{
- mpz_t *gmpnum_a, *gmpnum_result;
- int temp_a;
+ mpz_ptr gmpnum_a, gmpnum_result;
+ gmp_temp_t temp_a;
FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
- INIT_GMP_NUM(gmpnum_result);
- gmp_op(*gmpnum_result, *gmpnum_a);
+ INIT_GMP_RETVAL(gmpnum_result);
+ gmp_op(gmpnum_result, gmpnum_a);
FREE_GMP_TEMP(temp_a);
- ZEND_REGISTER_RESOURCE(return_value, gmpnum_result, le_gmp);
}
/* }}} */
/* {{{ gmp_zval_unary_ui_op
*/
-static inline void gmp_zval_unary_ui_op(zval *return_value, zval **a_arg, gmp_unary_ui_op_t gmp_op TSRMLS_DC)
+static inline void gmp_zval_unary_ui_op(zval *return_value, zval *a_arg, gmp_unary_ui_op_t gmp_op TSRMLS_DC)
{
- mpz_t *gmpnum_result;
-
- convert_to_long_ex(a_arg);
+ mpz_ptr gmpnum_result;
- INIT_GMP_NUM(gmpnum_result);
- gmp_op(*gmpnum_result, Z_LVAL_PP(a_arg));
-
- ZEND_REGISTER_RESOURCE(return_value, gmpnum_result, le_gmp);
+ INIT_GMP_RETVAL(gmpnum_result);
+ gmp_op(gmpnum_result, gmp_get_long(a_arg));
}
/* }}} */
@@ -685,9 +1019,9 @@ static inline void gmp_zval_unary_ui_op(zval *return_value, zval **a_arg, gmp_un
*/
static inline void _gmp_unary_ui_op(INTERNAL_FUNCTION_PARAMETERS, gmp_unary_ui_op_t gmp_op)
{
- zval **a_arg;
+ zval *a_arg;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &a_arg) == FAILURE){
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &a_arg) == FAILURE){
return;
}
@@ -699,9 +1033,9 @@ static inline void _gmp_unary_ui_op(INTERNAL_FUNCTION_PARAMETERS, gmp_unary_ui_o
*/
static inline void _gmp_unary_op(INTERNAL_FUNCTION_PARAMETERS, gmp_unary_op_t gmp_op)
{
- zval **a_arg;
+ zval *a_arg;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &a_arg) == FAILURE){
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &a_arg) == FAILURE){
return;
}
@@ -713,16 +1047,16 @@ static inline void _gmp_unary_op(INTERNAL_FUNCTION_PARAMETERS, gmp_unary_op_t gm
*/
static inline void _gmp_unary_opl(INTERNAL_FUNCTION_PARAMETERS, gmp_unary_opl_t gmp_op)
{
- zval **a_arg;
- mpz_t *gmpnum_a;
- int temp_a;
+ zval *a_arg;
+ mpz_ptr gmpnum_a;
+ gmp_temp_t temp_a;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &a_arg) == FAILURE){
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &a_arg) == FAILURE){
return;
}
FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
- RETVAL_LONG(gmp_op(*gmpnum_a));
+ RETVAL_LONG(gmp_op(gmpnum_a));
FREE_GMP_TEMP(temp_a);
}
/* }}} */
@@ -731,33 +1065,33 @@ static inline void _gmp_unary_opl(INTERNAL_FUNCTION_PARAMETERS, gmp_unary_opl_t
*/
static inline void _gmp_binary_opl(INTERNAL_FUNCTION_PARAMETERS, gmp_binary_opl_t gmp_op)
{
- zval **a_arg, **b_arg;
- mpz_t *gmpnum_a, *gmpnum_b;
- int temp_a, temp_b;
+ zval *a_arg, *b_arg;
+ mpz_ptr gmpnum_a, gmpnum_b;
+ gmp_temp_t temp_a, temp_b;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ", &a_arg, &b_arg) == FAILURE){
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &a_arg, &b_arg) == FAILURE){
return;
}
FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
- FETCH_GMP_ZVAL(gmpnum_b, b_arg, temp_b);
+ FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a);
- RETVAL_LONG(gmp_op(*gmpnum_a, *gmpnum_b));
+ RETVAL_LONG(gmp_op(gmpnum_a, gmpnum_b));
FREE_GMP_TEMP(temp_a);
FREE_GMP_TEMP(temp_b);
}
/* }}} */
-/* {{{ proto resource gmp_init(mixed number [, int base])
+/* {{{ proto GMP gmp_init(mixed number [, int base])
Initializes GMP number */
ZEND_FUNCTION(gmp_init)
{
- zval **number_arg;
- mpz_t * gmpnumber;
- long base=0;
+ zval *number_arg;
+ mpz_ptr gmpnumber;
+ long base = 0;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|l", &number_arg, &base) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|l", &number_arg, &base) == FAILURE) {
return;
}
@@ -766,48 +1100,42 @@ ZEND_FUNCTION(gmp_init)
RETURN_FALSE;
}
- if (convert_to_gmp(&gmpnumber, number_arg, base TSRMLS_CC) == FAILURE) {
+ INIT_GMP_RETVAL(gmpnumber);
+ if (convert_to_gmp(gmpnumber, number_arg, base TSRMLS_CC) == FAILURE) {
+ zval_dtor(return_value);
RETURN_FALSE;
}
-
- /* Write your own code here to handle argument number. */
- ZEND_REGISTER_RESOURCE(return_value, gmpnumber, le_gmp);
}
/* }}} */
-/* {{{ proto int gmp_intval(resource gmpnumber)
+/* {{{ proto int gmp_intval(mixed gmpnumber)
Gets signed long value of GMP number */
ZEND_FUNCTION(gmp_intval)
{
- zval **gmpnumber_arg;
- mpz_t * gmpnum;
+ zval *gmpnumber_arg;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &gmpnumber_arg) == FAILURE){
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &gmpnumber_arg) == FAILURE){
return;
}
- if (Z_TYPE_PP(gmpnumber_arg) == IS_RESOURCE) {
- ZEND_FETCH_RESOURCE(gmpnum, mpz_t *, gmpnumber_arg, -1, GMP_RESOURCE_NAME, le_gmp);
- RETVAL_LONG(mpz_get_si(*gmpnum));
+ if (IS_GMP(gmpnumber_arg)) {
+ RETVAL_LONG(mpz_get_si(GET_GMP_FROM_ZVAL(gmpnumber_arg)));
} else {
- convert_to_long_ex(gmpnumber_arg);
- RETVAL_LONG(Z_LVAL_PP(gmpnumber_arg));
+ RETVAL_LONG(gmp_get_long(gmpnumber_arg));
}
}
/* }}} */
-/* {{{ proto string gmp_strval(resource gmpnumber [, int base])
+/* {{{ proto string gmp_strval(mixed gmpnumber [, int base])
Gets string representation of GMP number */
ZEND_FUNCTION(gmp_strval)
{
- zval **gmpnumber_arg;
- int num_len;
+ zval *gmpnumber_arg;
long base = 10;
- mpz_t * gmpnum;
- char *out_string;
- int temp_a;
+ mpz_ptr gmpnum;
+ gmp_temp_t temp_a;
- if( zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "Z|l", &gmpnumber_arg, &base ) == FAILURE ) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|l", &gmpnumber_arg, &base) == FAILURE) {
return;
}
@@ -825,162 +1153,138 @@ ZEND_FUNCTION(gmp_strval)
FETCH_GMP_ZVAL(gmpnum, gmpnumber_arg, temp_a);
- num_len = mpz_sizeinbase(*gmpnum, abs(base));
- out_string = emalloc(num_len+2);
- if (mpz_sgn(*gmpnum) < 0) {
- num_len++;
- }
- mpz_get_str(out_string, base, *gmpnum);
-
- FREE_GMP_TEMP(temp_a);
-
- /*
- From GMP documentation for mpz_sizeinbase():
- The returned value will be exact or 1 too big. If base is a power of
- 2, the returned value will always be exact.
-
- So let's check to see if we already have a \0 byte...
- */
+ gmp_strval(return_value, gmpnum, base);
- if (out_string[num_len-1] == '\0') {
- num_len--;
- } else {
- out_string[num_len] = '\0';
- }
- RETVAL_STRINGL(out_string, num_len, 0);
+ FREE_GMP_TEMP(temp_a);
}
/* }}} */
-/* {{{ proto resource gmp_add(resource a, resource b)
+/* {{{ proto GMP gmp_add(mixed a, mixed b)
Add a and b */
ZEND_FUNCTION(gmp_add)
{
- gmp_binary_ui_op(mpz_add, (gmp_binary_ui_op_t)mpz_add_ui);
+ gmp_binary_ui_op(mpz_add, mpz_add_ui);
}
/* }}} */
-/* {{{ proto resource gmp_sub(resource a, resource b)
+/* {{{ proto GMP gmp_sub(mixed a, mixed b)
Subtract b from a */
ZEND_FUNCTION(gmp_sub)
{
- gmp_binary_ui_op(mpz_sub, (gmp_binary_ui_op_t)mpz_sub_ui);
+ gmp_binary_ui_op(mpz_sub, mpz_sub_ui);
}
/* }}} */
-/* {{{ proto resource gmp_mul(resource a, resource b)
+/* {{{ proto GMP gmp_mul(mixed a, mixed b)
Multiply a and b */
ZEND_FUNCTION(gmp_mul)
{
- gmp_binary_ui_op(mpz_mul, (gmp_binary_ui_op_t)mpz_mul_ui);
+ gmp_binary_ui_op(mpz_mul, mpz_mul_ui);
}
/* }}} */
-/* {{{ proto array gmp_div_qr(resource a, resource b [, int round])
+/* {{{ proto array gmp_div_qr(mixed a, mixed b [, int round])
Divide a by b, returns quotient and reminder */
ZEND_FUNCTION(gmp_div_qr)
{
- zval **a_arg, **b_arg;
+ zval *a_arg, *b_arg;
long round = GMP_ROUND_ZERO;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ|l", &a_arg, &b_arg, &round) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz|l", &a_arg, &b_arg, &round) == FAILURE) {
return;
}
switch (round) {
case GMP_ROUND_ZERO:
- gmp_zval_binary_ui_op2_ex(return_value, a_arg, b_arg, mpz_tdiv_qr, (gmp_binary_ui_op2_t)mpz_tdiv_qr_ui, 0, 1 TSRMLS_CC);
+ gmp_zval_binary_ui_op2(return_value, a_arg, b_arg, mpz_tdiv_qr, (gmp_binary_ui_op2_t) mpz_tdiv_qr_ui, 1 TSRMLS_CC);
break;
case GMP_ROUND_PLUSINF:
- gmp_zval_binary_ui_op2_ex(return_value, a_arg, b_arg, mpz_cdiv_qr, (gmp_binary_ui_op2_t)mpz_cdiv_qr_ui, 0, 1 TSRMLS_CC);
+ gmp_zval_binary_ui_op2(return_value, a_arg, b_arg, mpz_cdiv_qr, (gmp_binary_ui_op2_t) mpz_cdiv_qr_ui, 1 TSRMLS_CC);
break;
case GMP_ROUND_MINUSINF:
- gmp_zval_binary_ui_op2_ex(return_value, a_arg, b_arg, mpz_fdiv_qr, (gmp_binary_ui_op2_t)mpz_fdiv_qr_ui, 0, 1 TSRMLS_CC);
+ gmp_zval_binary_ui_op2(return_value, a_arg, b_arg, mpz_fdiv_qr, (gmp_binary_ui_op2_t) mpz_fdiv_qr_ui, 1 TSRMLS_CC);
break;
+ default:
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid rounding mode");
+ RETURN_FALSE;
}
-
}
/* }}} */
-/* {{{ proto resource gmp_div_r(resource a, resource b [, int round])
+/* {{{ proto GMP gmp_div_r(mixed a, mixed b [, int round])
Divide a by b, returns reminder only */
ZEND_FUNCTION(gmp_div_r)
{
- zval **a_arg, **b_arg;
+ zval *a_arg, *b_arg;
long round = GMP_ROUND_ZERO;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ|l", &a_arg, &b_arg, &round) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz|l", &a_arg, &b_arg, &round) == FAILURE) {
return;
}
switch (round) {
case GMP_ROUND_ZERO:
- gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg, mpz_tdiv_r, (gmp_binary_ui_op_t)mpz_tdiv_r_ui, 1, 1, 1 TSRMLS_CC);
+ gmp_zval_binary_ui_op(return_value, a_arg, b_arg, mpz_tdiv_r, (gmp_binary_ui_op_t) mpz_tdiv_r_ui, 1 TSRMLS_CC);
break;
case GMP_ROUND_PLUSINF:
- gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg, mpz_cdiv_r, (gmp_binary_ui_op_t)mpz_cdiv_r_ui, 1, 1, 1 TSRMLS_CC);
+ gmp_zval_binary_ui_op(return_value, a_arg, b_arg, mpz_cdiv_r, (gmp_binary_ui_op_t) mpz_cdiv_r_ui, 1 TSRMLS_CC);
break;
case GMP_ROUND_MINUSINF:
- gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg, mpz_fdiv_r, (gmp_binary_ui_op_t)mpz_fdiv_r_ui, 1, 1, 1 TSRMLS_CC);
+ gmp_zval_binary_ui_op(return_value, a_arg, b_arg, mpz_fdiv_r, (gmp_binary_ui_op_t) mpz_fdiv_r_ui, 1 TSRMLS_CC);
break;
+ default:
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid rounding mode");
+ RETURN_FALSE;
}
}
/* }}} */
-/* {{{ proto resource gmp_div_q(resource a, resource b [, int round])
+/* {{{ proto GMP gmp_div_q(mixed a, mixed b [, int round])
Divide a by b, returns quotient only */
ZEND_FUNCTION(gmp_div_q)
{
- zval **a_arg, **b_arg;
+ zval *a_arg, *b_arg;
long round = GMP_ROUND_ZERO;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ|l", &a_arg, &b_arg, &round) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz|l", &a_arg, &b_arg, &round) == FAILURE) {
return;
}
switch (round) {
case GMP_ROUND_ZERO:
- gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg, mpz_tdiv_q, (gmp_binary_ui_op_t)mpz_tdiv_q_ui, 0, 1, 1 TSRMLS_CC);
+ gmp_zval_binary_ui_op(return_value, a_arg, b_arg, mpz_tdiv_q, (gmp_binary_ui_op_t) mpz_tdiv_q_ui, 1 TSRMLS_CC);
break;
case GMP_ROUND_PLUSINF:
- gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg, mpz_cdiv_q, (gmp_binary_ui_op_t)mpz_cdiv_q_ui, 0, 1, 1 TSRMLS_CC);
+ gmp_zval_binary_ui_op(return_value, a_arg, b_arg, mpz_cdiv_q, (gmp_binary_ui_op_t) mpz_cdiv_q_ui, 1 TSRMLS_CC);
break;
case GMP_ROUND_MINUSINF:
- gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg, mpz_fdiv_q, (gmp_binary_ui_op_t)mpz_fdiv_q_ui, 0, 1, 1 TSRMLS_CC);
+ gmp_zval_binary_ui_op(return_value, a_arg, b_arg, mpz_fdiv_q, (gmp_binary_ui_op_t) mpz_fdiv_q_ui, 1 TSRMLS_CC);
break;
+ default:
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid rounding mode");
+ RETURN_FALSE;
}
}
/* }}} */
-/* {{{ proto resource gmp_mod(resource a, resource b)
+/* {{{ proto GMP gmp_mod(mixed a, mixed b)
Computes a modulo b */
ZEND_FUNCTION(gmp_mod)
{
- zval **a_arg, **b_arg;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ", &a_arg, &b_arg) == FAILURE){
- return;
- }
-
- gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg, mpz_mod, (gmp_binary_ui_op_t)mpz_mod_ui, 1, 1, 0 TSRMLS_CC);
+ gmp_binary_ui_op_no_zero(mpz_mod, (gmp_binary_ui_op_t) mpz_mod_ui);
}
/* }}} */
-/* {{{ proto resource gmp_divexact(resource a, resource b)
+/* {{{ proto GMP gmp_divexact(mixed a, mixed b)
Divide a by b using exact division algorithm */
ZEND_FUNCTION(gmp_divexact)
{
- zval **a_arg, **b_arg;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ", &a_arg, &b_arg) == FAILURE){
- return;
- }
-
- gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg, mpz_divexact, NULL, 0, 1, 1 TSRMLS_CC);
+ gmp_binary_ui_op_no_zero(mpz_divexact, NULL);
}
/* }}} */
-/* {{{ proto resource gmp_neg(resource a)
+/* {{{ proto GMP gmp_neg(mixed a)
Negates a number */
ZEND_FUNCTION(gmp_neg)
{
@@ -988,7 +1292,7 @@ ZEND_FUNCTION(gmp_neg)
}
/* }}} */
-/* {{{ proto resource gmp_abs(resource a)
+/* {{{ proto GMP gmp_abs(mixed a)
Calculates absolute value */
ZEND_FUNCTION(gmp_abs)
{
@@ -996,99 +1300,92 @@ ZEND_FUNCTION(gmp_abs)
}
/* }}} */
-/* {{{ proto resource gmp_fact(int a)
+/* {{{ proto GMP gmp_fact(int a)
Calculates factorial function */
ZEND_FUNCTION(gmp_fact)
{
- zval **a_arg;
- mpz_t *gmpnum_tmp;
- int temp_a;
+ zval *a_arg;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &a_arg) == FAILURE){
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &a_arg) == FAILURE){
return;
}
- if (Z_TYPE_PP(a_arg) == IS_RESOURCE) {
- FETCH_GMP_ZVAL(gmpnum_tmp, a_arg, temp_a); /* no need to free this since it's IS_RESOURCE */
- if (mpz_sgn(*gmpnum_tmp) < 0) {
+ if (IS_GMP(a_arg)) {
+ mpz_ptr gmpnum_tmp = GET_GMP_FROM_ZVAL(a_arg);
+ if (mpz_sgn(gmpnum_tmp) < 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number has to be greater than or equal to 0");
RETURN_FALSE;
}
} else {
- convert_to_long_ex(a_arg);
- if (Z_LVAL_PP(a_arg) < 0) {
+ if (gmp_get_long(a_arg) < 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number has to be greater than or equal to 0");
RETURN_FALSE;
}
}
-
+
gmp_zval_unary_ui_op(return_value, a_arg, mpz_fac_ui TSRMLS_CC);
}
/* }}} */
-/* {{{ proto resource gmp_pow(resource base, int exp)
+/* {{{ proto GMP gmp_pow(mixed base, int exp)
Raise base to power exp */
ZEND_FUNCTION(gmp_pow)
{
- zval **base_arg;
- mpz_t *gmpnum_result, *gmpnum_base;
- int use_ui = 0;
- int temp_base;
+ zval *base_arg;
+ mpz_ptr gmpnum_result, gmpnum_base;
+ gmp_temp_t temp_base;
long exp;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zl", &base_arg, &exp) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zl", &base_arg, &exp) == FAILURE) {
return;
}
- if (Z_TYPE_PP(base_arg) == IS_LONG && Z_LVAL_PP(base_arg) >= 0) {
- use_ui = 1;
- } else {
- FETCH_GMP_ZVAL(gmpnum_base, base_arg, temp_base);
- }
-
if (exp < 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Negative exponent not supported");
RETURN_FALSE;
}
- INIT_GMP_NUM(gmpnum_result);
- if (use_ui) {
- mpz_ui_pow_ui(*gmpnum_result, Z_LVAL_PP(base_arg), exp);
+ INIT_GMP_RETVAL(gmpnum_result);
+ if (Z_TYPE_P(base_arg) == IS_LONG && Z_LVAL_P(base_arg) >= 0) {
+ mpz_ui_pow_ui(gmpnum_result, Z_LVAL_P(base_arg), exp);
} else {
- mpz_pow_ui(*gmpnum_result, *gmpnum_base, exp);
+ FETCH_GMP_ZVAL(gmpnum_base, base_arg, temp_base);
+ mpz_pow_ui(gmpnum_result, gmpnum_base, exp);
FREE_GMP_TEMP(temp_base);
}
- ZEND_REGISTER_RESOURCE(return_value, gmpnum_result, le_gmp);
}
/* }}} */
-/* {{{ proto resource gmp_powm(resource base, resource exp, resource mod)
+/* {{{ proto GMP gmp_powm(mixed base, mixed exp, mixed mod)
Raise base to power exp and take result modulo mod */
ZEND_FUNCTION(gmp_powm)
{
- zval **base_arg, **exp_arg, **mod_arg;
- mpz_t *gmpnum_base, *gmpnum_exp, *gmpnum_mod, *gmpnum_result;
+ zval *base_arg, *exp_arg, *mod_arg;
+ mpz_ptr gmpnum_base, gmpnum_exp, gmpnum_mod, gmpnum_result;
int use_ui = 0;
- int temp_base, temp_exp, temp_mod;
+ gmp_temp_t temp_base, temp_exp, temp_mod;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZZ", &base_arg, &exp_arg, &mod_arg) == FAILURE){
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zzz", &base_arg, &exp_arg, &mod_arg) == FAILURE){
return;
}
FETCH_GMP_ZVAL(gmpnum_base, base_arg, temp_base);
- if (Z_TYPE_PP(exp_arg) == IS_LONG && Z_LVAL_PP(exp_arg) >= 0) {
+ if (Z_TYPE_P(exp_arg) == IS_LONG && Z_LVAL_P(exp_arg) >= 0) {
use_ui = 1;
+ temp_exp.is_used = 0;
} else {
- FETCH_GMP_ZVAL(gmpnum_exp, exp_arg, temp_exp);
- if (mpz_sgn(*gmpnum_exp) < 0) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING,"Second parameter cannot be less than 0");
+ FETCH_GMP_ZVAL_DEP(gmpnum_exp, exp_arg, temp_exp, temp_base);
+ if (mpz_sgn(gmpnum_exp) < 0) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Second parameter cannot be less than 0");
+ FREE_GMP_TEMP(temp_base);
+ FREE_GMP_TEMP(temp_exp);
RETURN_FALSE;
}
}
- FETCH_GMP_ZVAL(gmpnum_mod, mod_arg, temp_mod);
+ FETCH_GMP_ZVAL_DEP_DEP(gmpnum_mod, mod_arg, temp_mod, temp_exp, temp_base);
- if (!mpz_cmp_ui(*gmpnum_mod, 0)) {
+ if (!mpz_cmp_ui(gmpnum_mod, 0)) {
FREE_GMP_TEMP(temp_base);
if (use_ui) {
FREE_GMP_TEMP(temp_exp);
@@ -1097,202 +1394,175 @@ ZEND_FUNCTION(gmp_powm)
RETURN_FALSE;
}
- INIT_GMP_NUM(gmpnum_result);
+ INIT_GMP_RETVAL(gmpnum_result);
if (use_ui) {
- mpz_powm_ui(*gmpnum_result, *gmpnum_base, (unsigned long)Z_LVAL_PP(exp_arg), *gmpnum_mod);
+ mpz_powm_ui(gmpnum_result, gmpnum_base, (unsigned long) Z_LVAL_P(exp_arg), gmpnum_mod);
} else {
- mpz_powm(*gmpnum_result, *gmpnum_base, *gmpnum_exp, *gmpnum_mod);
+ mpz_powm(gmpnum_result, gmpnum_base, gmpnum_exp, gmpnum_mod);
FREE_GMP_TEMP(temp_exp);
}
FREE_GMP_TEMP(temp_base);
FREE_GMP_TEMP(temp_mod);
-
- ZEND_REGISTER_RESOURCE(return_value, gmpnum_result, le_gmp);
-
}
/* }}} */
-/* {{{ proto resource gmp_sqrt(resource a)
+/* {{{ proto GMP gmp_sqrt(mixed a)
Takes integer part of square root of a */
ZEND_FUNCTION(gmp_sqrt)
{
- zval **a_arg;
- mpz_t *gmpnum_a, *gmpnum_result;
- int temp_a;
+ zval *a_arg;
+ mpz_ptr gmpnum_a, gmpnum_result;
+ gmp_temp_t temp_a;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &a_arg) == FAILURE){
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &a_arg) == FAILURE){
return;
}
FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
- if (mpz_sgn(*gmpnum_a) < 0) {
+ if (mpz_sgn(gmpnum_a) < 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number has to be greater than or equal to 0");
FREE_GMP_TEMP(temp_a);
RETURN_FALSE;
}
-
- INIT_GMP_NUM(gmpnum_result);
- mpz_sqrt(*gmpnum_result, *gmpnum_a);
- FREE_GMP_TEMP(temp_a);
- ZEND_REGISTER_RESOURCE(return_value, gmpnum_result, le_gmp);
+ INIT_GMP_RETVAL(gmpnum_result);
+ mpz_sqrt(gmpnum_result, gmpnum_a);
+ FREE_GMP_TEMP(temp_a);
}
/* }}} */
-/* {{{ proto array gmp_sqrtrem(resource a)
+/* {{{ proto array gmp_sqrtrem(mixed a)
Square root with remainder */
ZEND_FUNCTION(gmp_sqrtrem)
{
- zval **a_arg;
- mpz_t *gmpnum_a, *gmpnum_result1, *gmpnum_result2;
- zval r;
- int temp_a;
+ zval *a_arg;
+ mpz_ptr gmpnum_a, gmpnum_result1, gmpnum_result2;
+ gmp_temp_t temp_a;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &a_arg) == FAILURE){
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &a_arg) == FAILURE){
return;
}
FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
-
- if (mpz_sgn(*gmpnum_a) < 0) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING,"Number has to be greater than or equal to 0");
+
+ if (mpz_sgn(gmpnum_a) < 0) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number has to be greater than or equal to 0");
+ FREE_GMP_TEMP(temp_a);
RETURN_FALSE;
}
- INIT_GMP_NUM(gmpnum_result1);
- INIT_GMP_NUM(gmpnum_result2);
+ array_init(return_value);
+ add_index_zval(return_value, 0, gmp_create(&gmpnum_result1 TSRMLS_CC));
+ add_index_zval(return_value, 1, gmp_create(&gmpnum_result2 TSRMLS_CC));
- mpz_sqrtrem(*gmpnum_result1, *gmpnum_result2, *gmpnum_a);
+ mpz_sqrtrem(gmpnum_result1, gmpnum_result2, gmpnum_a);
FREE_GMP_TEMP(temp_a);
-
- array_init(return_value);
- ZEND_REGISTER_RESOURCE(&r, gmpnum_result1, le_gmp);
- add_index_resource(return_value, 0, Z_LVAL(r));
- ZEND_REGISTER_RESOURCE(&r, gmpnum_result2, le_gmp);
- add_index_resource(return_value, 1, Z_LVAL(r));
}
/* }}} */
-/* {{{ proto bool gmp_perfect_square(resource a)
+/* {{{ proto bool gmp_perfect_square(mixed a)
Checks if a is an exact square */
ZEND_FUNCTION(gmp_perfect_square)
{
- zval **a_arg;
- mpz_t *gmpnum_a;
- int temp_a;
+ zval *a_arg;
+ mpz_ptr gmpnum_a;
+ gmp_temp_t temp_a;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &a_arg) == FAILURE){
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &a_arg) == FAILURE){
return;
}
FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
- RETVAL_BOOL((mpz_perfect_square_p(*gmpnum_a)!=0));
+ RETVAL_BOOL((mpz_perfect_square_p(gmpnum_a) != 0));
FREE_GMP_TEMP(temp_a);
}
/* }}} */
-/* {{{ proto int gmp_prob_prime(resource a[, int reps])
+/* {{{ proto int gmp_prob_prime(mixed a[, int reps])
Checks if a is "probably prime" */
ZEND_FUNCTION(gmp_prob_prime)
{
- zval **gmpnumber_arg;
- mpz_t *gmpnum_a;
+ zval *gmpnumber_arg;
+ mpz_ptr gmpnum_a;
long reps = 10;
- int temp_a;
+ gmp_temp_t temp_a;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|l", &gmpnumber_arg, &reps) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|l", &gmpnumber_arg, &reps) == FAILURE) {
return;
}
FETCH_GMP_ZVAL(gmpnum_a, gmpnumber_arg, temp_a);
- RETVAL_LONG(mpz_probab_prime_p(*gmpnum_a, reps));
+ RETVAL_LONG(mpz_probab_prime_p(gmpnum_a, reps));
FREE_GMP_TEMP(temp_a);
}
/* }}} */
-/* {{{ proto resource gmp_gcd(resource a, resource b)
+/* {{{ proto GMP gmp_gcd(mixed a, mixed b)
Computes greatest common denominator (gcd) of a and b */
ZEND_FUNCTION(gmp_gcd)
{
- zval **a_arg, **b_arg;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ", &a_arg, &b_arg) == FAILURE){
- return;
- }
-
- gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg, mpz_gcd, (gmp_binary_ui_op_t)mpz_gcd_ui, 0, 0, 1 TSRMLS_CC);
+ gmp_binary_ui_op(mpz_gcd, (gmp_binary_ui_op_t) mpz_gcd_ui);
}
/* }}} */
-/* {{{ proto array gmp_gcdext(resource a, resource b)
+/* {{{ proto array gmp_gcdext(mixed a, mixed b)
Computes G, S, and T, such that AS + BT = G = `gcd' (A, B) */
ZEND_FUNCTION(gmp_gcdext)
{
- zval **a_arg, **b_arg;
- mpz_t *gmpnum_a, *gmpnum_b, *gmpnum_t, *gmpnum_s, *gmpnum_g;
- zval r;
- int temp_a, temp_b;
+ zval *a_arg, *b_arg;
+ mpz_ptr gmpnum_a, gmpnum_b, gmpnum_t, gmpnum_s, gmpnum_g;
+ gmp_temp_t temp_a, temp_b;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ", &a_arg, &b_arg) == FAILURE){
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &a_arg, &b_arg) == FAILURE){
return;
}
FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
- FETCH_GMP_ZVAL(gmpnum_b, b_arg, temp_b);
+ FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a);
- INIT_GMP_NUM(gmpnum_g);
- INIT_GMP_NUM(gmpnum_s);
- INIT_GMP_NUM(gmpnum_t);
+ array_init(return_value);
+ add_assoc_zval(return_value, "g", gmp_create(&gmpnum_g TSRMLS_CC));
+ add_assoc_zval(return_value, "s", gmp_create(&gmpnum_s TSRMLS_CC));
+ add_assoc_zval(return_value, "t", gmp_create(&gmpnum_t TSRMLS_CC));
- mpz_gcdext(*gmpnum_g, *gmpnum_s, *gmpnum_t, *gmpnum_a, *gmpnum_b);
+ mpz_gcdext(gmpnum_g, gmpnum_s, gmpnum_t, gmpnum_a, gmpnum_b);
FREE_GMP_TEMP(temp_a);
FREE_GMP_TEMP(temp_b);
-
- array_init(return_value);
-
- ZEND_REGISTER_RESOURCE(&r, gmpnum_g, le_gmp);
- add_assoc_resource(return_value, "g", Z_LVAL(r));
- ZEND_REGISTER_RESOURCE(&r, gmpnum_s, le_gmp);
- add_assoc_resource(return_value, "s", Z_LVAL(r));
- ZEND_REGISTER_RESOURCE(&r, gmpnum_t, le_gmp);
- add_assoc_resource(return_value, "t", Z_LVAL(r));
}
/* }}} */
-/* {{{ proto resource gmp_invert(resource a, resource b)
+/* {{{ proto GMP gmp_invert(mixed a, mixed b)
Computes the inverse of a modulo b */
ZEND_FUNCTION(gmp_invert)
{
- zval **a_arg, **b_arg;
- mpz_t *gmpnum_a, *gmpnum_b, *gmpnum_result;
- int temp_a, temp_b;
+ zval *a_arg, *b_arg;
+ mpz_ptr gmpnum_a, gmpnum_b, gmpnum_result;
+ gmp_temp_t temp_a, temp_b;
int res;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ", &a_arg, &b_arg) == FAILURE){
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &a_arg, &b_arg) == FAILURE){
return;
}
FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
- FETCH_GMP_ZVAL(gmpnum_b, b_arg, temp_b);
+ FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a);
- INIT_GMP_NUM(gmpnum_result);
- res=mpz_invert(*gmpnum_result, *gmpnum_a, *gmpnum_b);
+ INIT_GMP_RETVAL(gmpnum_result);
+ res = mpz_invert(gmpnum_result, gmpnum_a, gmpnum_b);
FREE_GMP_TEMP(temp_a);
FREE_GMP_TEMP(temp_b);
- if (res) {
- ZEND_REGISTER_RESOURCE(return_value, gmpnum_result, le_gmp);
- } else {
- FREE_GMP_NUM(gmpnum_result);
+ if (!res) {
+ zval_dtor(return_value);
RETURN_FALSE;
}
}
/* }}} */
-/* {{{ proto int gmp_jacobi(resource a, resource b)
+/* {{{ proto int gmp_jacobi(mixed a, mixed b)
Computes Jacobi symbol */
ZEND_FUNCTION(gmp_jacobi)
{
@@ -1300,7 +1570,7 @@ ZEND_FUNCTION(gmp_jacobi)
}
/* }}} */
-/* {{{ proto int gmp_legendre(resource a, resource b)
+/* {{{ proto int gmp_legendre(mixed a, mixed b)
Computes Legendre symbol */
ZEND_FUNCTION(gmp_legendre)
{
@@ -1308,70 +1578,51 @@ ZEND_FUNCTION(gmp_legendre)
}
/* }}} */
-/* {{{ proto int gmp_cmp(resource a, resource b)
+/* {{{ proto int gmp_cmp(mixed a, mixed b)
Compares two numbers */
ZEND_FUNCTION(gmp_cmp)
{
- zval **a_arg, **b_arg;
- mpz_t *gmpnum_a, *gmpnum_b;
- int use_si = 0, res;
- int temp_a, temp_b;
+ zval *a_arg, *b_arg;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ", &a_arg, &b_arg) == FAILURE){
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &a_arg, &b_arg) == FAILURE){
return;
}
- FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
-
- if (Z_TYPE_PP(b_arg) == IS_LONG) {
- use_si = 1;
- } else {
- FETCH_GMP_ZVAL(gmpnum_b, b_arg, temp_b);
- }
-
- if (use_si) {
- res = mpz_cmp_si(*gmpnum_a, Z_LVAL_PP(b_arg));
- } else {
- res = mpz_cmp(*gmpnum_a, *gmpnum_b);
- FREE_GMP_TEMP(temp_b);
- }
- FREE_GMP_TEMP(temp_a);
-
- RETURN_LONG(res);
+ gmp_cmp(return_value, a_arg, b_arg TSRMLS_CC);
}
/* }}} */
-/* {{{ proto int gmp_sign(resource a)
+/* {{{ proto int gmp_sign(mixed a)
Gets the sign of the number */
ZEND_FUNCTION(gmp_sign)
{
- zval **a_arg;
- mpz_t *gmpnum_a;
- int temp_a;
+ zval *a_arg;
+ mpz_ptr gmpnum_a;
+ gmp_temp_t temp_a;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &a_arg) == FAILURE){
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &a_arg) == FAILURE){
return;
}
FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
- RETVAL_LONG(mpz_sgn(*gmpnum_a));
+ RETVAL_LONG(mpz_sgn(gmpnum_a));
FREE_GMP_TEMP(temp_a);
}
/* }}} */
-/* {{{ proto resource gmp_random([int limiter])
+/* {{{ proto GMP gmp_random([int limiter])
Gets random number */
ZEND_FUNCTION(gmp_random)
{
long limiter = 20;
- mpz_t *gmpnum_result;
+ mpz_ptr gmpnum_result;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &limiter) == FAILURE) {
return;
}
- INIT_GMP_NUM(gmpnum_result);
+ INIT_GMP_RETVAL(gmpnum_result);
if (!GMPG(rand_initialized)) {
/* Initialize */
@@ -1383,15 +1634,14 @@ ZEND_FUNCTION(gmp_random)
GMPG(rand_initialized) = 1;
}
#ifdef GMP_LIMB_BITS
- mpz_urandomb(*gmpnum_result, GMPG(rand_state), GMP_ABS (limiter) * GMP_LIMB_BITS);
+ mpz_urandomb(gmpnum_result, GMPG(rand_state), GMP_ABS (limiter) * GMP_LIMB_BITS);
#else
- mpz_urandomb(*gmpnum_result, GMPG(rand_state), GMP_ABS (limiter) * __GMP_BITS_PER_MP_LIMB);
+ mpz_urandomb(gmpnum_result, GMPG(rand_state), GMP_ABS (limiter) * __GMP_BITS_PER_MP_LIMB);
#endif
- ZEND_REGISTER_RESOURCE(return_value, gmpnum_result, le_gmp);
}
/* }}} */
-/* {{{ proto resource gmp_and(resource a, resource b)
+/* {{{ proto GMP gmp_and(mixed a, mixed b)
Calculates logical AND of a and b */
ZEND_FUNCTION(gmp_and)
{
@@ -1399,7 +1649,7 @@ ZEND_FUNCTION(gmp_and)
}
/* }}} */
-/* {{{ proto resource gmp_or(resource a, resource b)
+/* {{{ proto GMP gmp_or(mixed a, mixed b)
Calculates logical OR of a and b */
ZEND_FUNCTION(gmp_or)
{
@@ -1407,7 +1657,7 @@ ZEND_FUNCTION(gmp_or)
}
/* }}} */
-/* {{{ proto resource gmp_com(resource a)
+/* {{{ proto GMP gmp_com(mixed a)
Calculates one's complement of a */
ZEND_FUNCTION(gmp_com)
{
@@ -1415,7 +1665,7 @@ ZEND_FUNCTION(gmp_com)
}
/* }}} */
-/* {{{ proto resource gmp_nextprime(resource a)
+/* {{{ proto GMP gmp_nextprime(mixed a)
Finds next prime of a */
ZEND_FUNCTION(gmp_nextprime)
{
@@ -1423,21 +1673,22 @@ ZEND_FUNCTION(gmp_nextprime)
}
/* }}} */
-/* {{{ proto resource gmp_xor(resource a, resource b)
+/* {{{ proto GMP gmp_xor(mixed a, mixed b)
Calculates logical exclusive OR of a and b */
ZEND_FUNCTION(gmp_xor)
{
- /* use formula: a^b = (a|b)&^(a&b) */
- zval **a_arg, **b_arg;
+ gmp_binary_op(mpz_xor);
+ /* use formula: a^b = (a|b)&~(a&b) */
+ /*zval **a_arg, **b_arg;
mpz_t *gmpnum_a, *gmpnum_b, *gmpnum_result, *gmpnum_t;
- int temp_a, temp_b;
+ gmp_temp_t temp_a, temp_b;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ", &a_arg, &b_arg) == FAILURE){
return;
}
FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
- FETCH_GMP_ZVAL(gmpnum_b, b_arg, temp_b);
+ FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a);
INIT_GMP_NUM(gmpnum_result);
INIT_GMP_NUM(gmpnum_t);
@@ -1452,183 +1703,169 @@ ZEND_FUNCTION(gmp_xor)
FREE_GMP_TEMP(temp_a);
FREE_GMP_TEMP(temp_b);
- ZEND_REGISTER_RESOURCE(return_value, gmpnum_result, le_gmp);
+ RETVAL_GMP(gmpnum_result);*/
}
/* }}} */
-/* {{{ proto void gmp_setbit(resource &a, int index[, bool set_clear])
+/* {{{ proto void gmp_setbit(GMP &a, int index[, bool set_clear])
Sets or clear bit in a */
ZEND_FUNCTION(gmp_setbit)
{
- zval **a_arg;
+ zval *a_arg;
long index;
zend_bool set = 1;
- mpz_t *gmpnum_a;
+ mpz_ptr gmpnum_a;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zl|b", &a_arg, &index, &set) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ol|b", &a_arg, gmp_ce, &index, &set) == FAILURE) {
return;
}
- ZEND_FETCH_RESOURCE(gmpnum_a, mpz_t *, a_arg, -1, GMP_RESOURCE_NAME, le_gmp);
-
if (index < 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Index must be greater than or equal to zero");
return;
}
+ gmpnum_a = GET_GMP_FROM_ZVAL(a_arg);
+
if (set) {
- mpz_setbit(*gmpnum_a, index);
+ mpz_setbit(gmpnum_a, index);
} else {
- mpz_clrbit(*gmpnum_a, index);
+ mpz_clrbit(gmpnum_a, index);
}
}
/* }}} */
-/* {{{ proto void gmp_clrbit(resource &a, int index)
+/* {{{ proto void gmp_clrbit(GMP &a, int index)
Clears bit in a */
ZEND_FUNCTION(gmp_clrbit)
{
- zval **a_arg;
+ zval *a_arg;
long index;
- mpz_t *gmpnum_a;
+ mpz_ptr gmpnum_a;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zl", &a_arg, &index) == FAILURE){
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ol", &a_arg, gmp_ce, &index) == FAILURE){
return;
}
- ZEND_FETCH_RESOURCE(gmpnum_a, mpz_t *, a_arg, -1, GMP_RESOURCE_NAME, le_gmp);
-
if (index < 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Index must be greater than or equal to zero");
return;
}
- mpz_clrbit(*gmpnum_a, index);
+ gmpnum_a = GET_GMP_FROM_ZVAL(a_arg);
+ mpz_clrbit(gmpnum_a, index);
}
/* }}} */
-/* {{{ proto bool gmp_testbit(resource a, int index)
+/* {{{ proto bool gmp_testbit(mixed a, int index)
Tests if bit is set in a */
ZEND_FUNCTION(gmp_testbit)
{
- zval **a_arg;
+ zval *a_arg;
long index;
- mpz_t *gmpnum_a;
+ mpz_ptr gmpnum_a;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zl", &a_arg, &index) == FAILURE){
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zl", &a_arg, &index) == FAILURE){
return;
}
- ZEND_FETCH_RESOURCE(gmpnum_a, mpz_t *, a_arg, -1, GMP_RESOURCE_NAME, le_gmp);
-
if (index < 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Index must be greater than or equal to zero");
RETURN_FALSE;
}
- if (mpz_tstbit(*gmpnum_a, index)) {
- RETURN_TRUE;
- }
- RETURN_FALSE;
+ gmpnum_a = GET_GMP_FROM_ZVAL(a_arg);
+ RETURN_BOOL(mpz_tstbit(gmpnum_a, index));
}
/* }}} */
-/* {{{ proto int gmp_popcount(resource a)
+/* {{{ proto int gmp_popcount(mixed a)
Calculates the population count of a */
ZEND_FUNCTION(gmp_popcount)
{
- zval **a_arg;
- mpz_t *gmpnum_a;
- int temp_a;
+ zval *a_arg;
+ mpz_ptr gmpnum_a;
+ gmp_temp_t temp_a;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &a_arg) == FAILURE){
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &a_arg) == FAILURE){
return;
}
FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
- RETVAL_LONG(mpz_popcount(*gmpnum_a));
+ RETVAL_LONG(mpz_popcount(gmpnum_a));
FREE_GMP_TEMP(temp_a);
}
/* }}} */
-/* {{{ proto int gmp_hamdist(resource a, resource b)
+/* {{{ proto int gmp_hamdist(mixed a, mixed b)
Calculates hamming distance between a and b */
ZEND_FUNCTION(gmp_hamdist)
{
- zval **a_arg, **b_arg;
- mpz_t *gmpnum_a, *gmpnum_b;
- int temp_a, temp_b;
+ zval *a_arg, *b_arg;
+ mpz_ptr gmpnum_a, gmpnum_b;
+ gmp_temp_t temp_a, temp_b;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ", &a_arg, &b_arg) == FAILURE){
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &a_arg, &b_arg) == FAILURE){
return;
}
FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
- FETCH_GMP_ZVAL(gmpnum_b, b_arg, temp_b);
+ FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a);
- RETVAL_LONG(mpz_hamdist(*gmpnum_a, *gmpnum_b));
+ RETVAL_LONG(mpz_hamdist(gmpnum_a, gmpnum_b));
FREE_GMP_TEMP(temp_a);
FREE_GMP_TEMP(temp_b);
}
/* }}} */
-/* {{{ proto int gmp_scan0(resource a, int start)
+/* {{{ proto int gmp_scan0(mixed a, int start)
Finds first zero bit */
ZEND_FUNCTION(gmp_scan0)
{
- zval **a_arg;
- mpz_t *gmpnum_a;
- int temp_a;
+ zval *a_arg;
+ mpz_ptr gmpnum_a;
+ gmp_temp_t temp_a;
long start;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zl", &a_arg, &start) == FAILURE){
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zl", &a_arg, &start) == FAILURE){
return;
}
- FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
-
if (start < 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Starting index must be greater than or equal to zero");
RETURN_FALSE;
}
- RETVAL_LONG(mpz_scan0(*gmpnum_a, start));
+ FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
+
+ RETVAL_LONG(mpz_scan0(gmpnum_a, start));
FREE_GMP_TEMP(temp_a);
}
/* }}} */
-/* {{{ proto int gmp_scan1(resource a, int start)
+/* {{{ proto int gmp_scan1(mixed a, int start)
Finds first non-zero bit */
ZEND_FUNCTION(gmp_scan1)
{
- zval **a_arg;
- mpz_t *gmpnum_a;
- int temp_a;
+ zval *a_arg;
+ mpz_ptr gmpnum_a;
+ gmp_temp_t temp_a;
long start;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zl", &a_arg, &start) == FAILURE){
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zl", &a_arg, &start) == FAILURE){
return;
}
- FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
if (start < 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Starting index must be greater than or equal to zero");
RETURN_FALSE;
}
- RETVAL_LONG(mpz_scan1(*gmpnum_a, start));
- FREE_GMP_TEMP(temp_a);
-}
-/* }}} */
-
-/* {{{ _php_gmpnum_free
- */
-static void _php_gmpnum_free(zend_rsrc_list_entry *rsrc TSRMLS_DC)
-{
- mpz_t *gmpnum = (mpz_t *)rsrc->ptr;
+ FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
- FREE_GMP_NUM(gmpnum);
+ RETVAL_LONG(mpz_scan1(gmpnum_a, start));
+ FREE_GMP_TEMP(temp_a);
}
/* }}} */
diff --git a/ext/gmp/tests/004.phpt b/ext/gmp/tests/004.phpt
index a0fa1cd133..088dd08fd8 100644
--- a/ext/gmp/tests/004.phpt
+++ b/ext/gmp/tests/004.phpt
@@ -38,8 +38,6 @@ int(2342344)
Notice: Object of class stdClass could not be converted to int in %s on line %d
int(1)
int(0)
-
-Warning: gmp_intval(): supplied resource is not a valid GMP integer resource in %s on line %d
-bool(false)
+int(%d)
int(12345678)
Done
diff --git a/ext/gmp/tests/005.phpt b/ext/gmp/tests/005.phpt
index 7907ffbf53..4ae0cb750a 100644
--- a/ext/gmp/tests/005.phpt
+++ b/ext/gmp/tests/005.phpt
@@ -47,7 +47,7 @@ bool(false)
Warning: gmp_strval() expects parameter 2 to be long, string given in %s on line %d
NULL
-Warning: gmp_strval(): supplied resource is not a valid GMP integer resource in %s on line %d
+Warning: gmp_strval(): Unable to convert variable to GMP - wrong type in %s on line %d
bool(false)
string(7) "9765456"
diff --git a/ext/gmp/tests/006.phpt b/ext/gmp/tests/006.phpt
index dedbcd0472..740760631d 100644
--- a/ext/gmp/tests/006.phpt
+++ b/ext/gmp/tests/006.phpt
@@ -35,9 +35,15 @@ NULL
Warning: gmp_sub(): Unable to convert variable to GMP - wrong type in %s on line %d
bool(false)
-resource(%d) of type (GMP integer)
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "-1"
+}
string(2) "-1"
-resource(%d) of type (GMP integer)
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(5) "10001"
+}
string(5) "10001"
Warning: gmp_sub(): Unable to convert variable to GMP - wrong type in %s on line %d
diff --git a/ext/gmp/tests/007.phpt b/ext/gmp/tests/007.phpt
index 4d4a993a17..e391c121f8 100644
--- a/ext/gmp/tests/007.phpt
+++ b/ext/gmp/tests/007.phpt
@@ -8,34 +8,16 @@ gmp_div_qr() tests
var_dump(gmp_div_qr());
var_dump(gmp_div_qr(""));
-var_dump($r = gmp_div_qr(0,1));
-var_dump(gmp_strval($r[0]));
-var_dump(gmp_strval($r[1]));
-var_dump($r = gmp_div_qr(1,0));
-var_dump($r = gmp_div_qr(12653,23482734));
-var_dump(gmp_strval($r[0]));
-var_dump(gmp_strval($r[1]));
-var_dump($r = gmp_div_qr(12653,23482734, 10));
-var_dump(gmp_strval($r[0]));
-var_dump(gmp_strval($r[1]));
-var_dump($r = gmp_div_qr(1123123,123));
-var_dump(gmp_strval($r[0]));
-var_dump(gmp_strval($r[1]));
-var_dump($r = gmp_div_qr(1123123,123, 1));
-var_dump(gmp_strval($r[0]));
-var_dump(gmp_strval($r[1]));
-var_dump($r = gmp_div_qr(1123123,123, 2));
-var_dump(gmp_strval($r[0]));
-var_dump(gmp_strval($r[1]));
-var_dump($r = gmp_div_qr(1123123,123, GMP_ROUND_ZERO));
-var_dump(gmp_strval($r[0]));
-var_dump(gmp_strval($r[1]));
-var_dump($r = gmp_div_qr(1123123,123, GMP_ROUND_PLUSINF));
-var_dump(gmp_strval($r[0]));
-var_dump(gmp_strval($r[1]));
-var_dump($r = gmp_div_qr(1123123,123, GMP_ROUND_MINUSINF));
-var_dump(gmp_strval($r[0]));
-var_dump(gmp_strval($r[1]));
+var_dump(gmp_div_qr(0,1));
+var_dump(gmp_div_qr(1,0));
+var_dump(gmp_div_qr(12653,23482734));
+var_dump(gmp_div_qr(12653,23482734, 10));
+var_dump(gmp_div_qr(1123123,123));
+var_dump(gmp_div_qr(1123123,123, 1));
+var_dump(gmp_div_qr(1123123,123, 2));
+var_dump(gmp_div_qr(1123123,123, GMP_ROUND_ZERO));
+var_dump(gmp_div_qr(1123123,123, GMP_ROUND_PLUSINF));
+var_dump(gmp_div_qr(1123123,123, GMP_ROUND_MINUSINF));
$fp = fopen(__FILE__, 'r');
@@ -52,80 +34,108 @@ Warning: gmp_div_qr() expects at least 2 parameters, 1 given in %s on line %d
NULL
array(2) {
[0]=>
- resource(%d) of type (GMP integer)
+ object(GMP)#%d (1) {
+ ["num"]=>
+ string(1) "0"
+ }
[1]=>
- resource(%d) of type (GMP integer)
+ object(GMP)#%d (1) {
+ ["num"]=>
+ string(1) "0"
+ }
}
-string(1) "0"
-string(1) "0"
Warning: gmp_div_qr(): Zero operand not allowed in %s on line %d
bool(false)
array(2) {
[0]=>
- resource(%d) of type (GMP integer)
+ object(GMP)#%d (1) {
+ ["num"]=>
+ string(1) "0"
+ }
[1]=>
- resource(%d) of type (GMP integer)
+ object(GMP)#%d (1) {
+ ["num"]=>
+ string(5) "12653"
+ }
}
-string(1) "0"
-string(5) "12653"
-NULL
-
-Warning: gmp_strval(): Unable to convert variable to GMP - wrong type in %s on line %d
-bool(false)
-Warning: gmp_strval(): Unable to convert variable to GMP - wrong type in %s on line %d
+Warning: gmp_div_qr(): Invalid rounding mode in %s on line %d
bool(false)
array(2) {
[0]=>
- resource(%d) of type (GMP integer)
+ object(GMP)#%d (1) {
+ ["num"]=>
+ string(4) "9131"
+ }
[1]=>
- resource(%d) of type (GMP integer)
+ object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "10"
+ }
}
-string(4) "9131"
-string(2) "10"
array(2) {
[0]=>
- resource(%d) of type (GMP integer)
+ object(GMP)#%d (1) {
+ ["num"]=>
+ string(4) "9132"
+ }
[1]=>
- resource(%d) of type (GMP integer)
+ object(GMP)#%d (1) {
+ ["num"]=>
+ string(4) "-113"
+ }
}
-string(4) "9132"
-string(4) "-113"
array(2) {
[0]=>
- resource(%d) of type (GMP integer)
+ object(GMP)#%d (1) {
+ ["num"]=>
+ string(4) "9131"
+ }
[1]=>
- resource(%d) of type (GMP integer)
+ object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "10"
+ }
}
-string(4) "9131"
-string(2) "10"
array(2) {
[0]=>
- resource(%d) of type (GMP integer)
+ object(GMP)#%d (1) {
+ ["num"]=>
+ string(4) "9131"
+ }
[1]=>
- resource(%d) of type (GMP integer)
+ object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "10"
+ }
}
-string(4) "9131"
-string(2) "10"
array(2) {
[0]=>
- resource(%d) of type (GMP integer)
+ object(GMP)#%d (1) {
+ ["num"]=>
+ string(4) "9132"
+ }
[1]=>
- resource(%d) of type (GMP integer)
+ object(GMP)#%d (1) {
+ ["num"]=>
+ string(4) "-113"
+ }
}
-string(4) "9132"
-string(4) "-113"
array(2) {
[0]=>
- resource(%d) of type (GMP integer)
+ object(GMP)#%d (1) {
+ ["num"]=>
+ string(4) "9131"
+ }
[1]=>
- resource(%d) of type (GMP integer)
+ object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "10"
+ }
}
-string(4) "9131"
-string(2) "10"
-Warning: gmp_div_qr(): supplied resource is not a valid GMP integer resource in %s on line %d
+Warning: gmp_div_qr(): Unable to convert variable to GMP - wrong type in %s on line %d
bool(false)
Warning: gmp_div_qr(): Unable to convert variable to GMP - wrong type in %s on line %d
diff --git a/ext/gmp/tests/008.phpt b/ext/gmp/tests/008.phpt
index 4e44ec10bf..c1874c86f9 100644
--- a/ext/gmp/tests/008.phpt
+++ b/ext/gmp/tests/008.phpt
@@ -9,24 +9,15 @@ var_dump(gmp_div_r());
var_dump(gmp_div_r(""));
var_dump($r = gmp_div_r(0,1));
-var_dump(gmp_strval($r));
var_dump($r = gmp_div_r(1,0));
var_dump($r = gmp_div_r(12653,23482734));
-var_dump(gmp_strval($r));
var_dump($r = gmp_div_r(12653,23482734, 10));
-var_dump(gmp_strval($r));
var_dump($r = gmp_div_r(1123123,123));
-var_dump(gmp_strval($r));
var_dump($r = gmp_div_r(1123123,123, 1));
-var_dump(gmp_strval($r));
var_dump($r = gmp_div_r(1123123,123, 2));
-var_dump(gmp_strval($r));
var_dump($r = gmp_div_r(1123123,123, GMP_ROUND_ZERO));
-var_dump(gmp_strval($r));
var_dump($r = gmp_div_r(1123123,123, GMP_ROUND_PLUSINF));
-var_dump(gmp_strval($r));
var_dump($r = gmp_div_r(1123123,123, GMP_ROUND_MINUSINF));
-var_dump(gmp_strval($r));
$fp = fopen(__FILE__, 'r');
@@ -41,31 +32,46 @@ NULL
Warning: gmp_div_r() expects at least 2 parameters, 1 given in %s on line %d
NULL
-int(0)
-string(1) "0"
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(1) "0"
+}
Warning: gmp_div_r(): Zero operand not allowed in %s on line %d
bool(false)
-int(12653)
-string(5) "12653"
-NULL
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(5) "12653"
+}
-Warning: gmp_strval(): Unable to convert variable to GMP - wrong type in %s on line %d
+Warning: gmp_div_r(): Invalid rounding mode in %s on line %d
bool(false)
-int(10)
-string(2) "10"
-int(113)
-string(3) "113"
-int(10)
-string(2) "10"
-int(10)
-string(2) "10"
-int(113)
-string(3) "113"
-int(10)
-string(2) "10"
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "10"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(4) "-113"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "10"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "10"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(4) "-113"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "10"
+}
-Warning: gmp_div_r(): supplied resource is not a valid GMP integer resource in %s on line %d
+Warning: gmp_div_r(): Unable to convert variable to GMP - wrong type in %s on line %d
bool(false)
Warning: gmp_div_r(): Unable to convert variable to GMP - wrong type in %s on line %d
diff --git a/ext/gmp/tests/009.phpt b/ext/gmp/tests/009.phpt
index 745a4ef638..3b75a48e18 100644
--- a/ext/gmp/tests/009.phpt
+++ b/ext/gmp/tests/009.phpt
@@ -8,25 +8,16 @@ gmp_div_q() tests
var_dump(gmp_div_q());
var_dump(gmp_div_q(""));
-var_dump($r = gmp_div_q(0,1));
-var_dump(gmp_strval($r));
-var_dump($r = gmp_div_q(1,0));
-var_dump($r = gmp_div_q(12653,23482734));
-var_dump(gmp_strval($r));
-var_dump($r = gmp_div_q(12653,23482734, 10));
-var_dump(gmp_strval($r));
-var_dump($r = gmp_div_q(1123123,123));
-var_dump(gmp_strval($r));
-var_dump($r = gmp_div_q(1123123,123, 1));
-var_dump(gmp_strval($r));
-var_dump($r = gmp_div_q(1123123,123, 2));
-var_dump(gmp_strval($r));
-var_dump($r = gmp_div_q(1123123,123, GMP_ROUND_ZERO));
-var_dump(gmp_strval($r));
-var_dump($r = gmp_div_q(1123123,123, GMP_ROUND_PLUSINF));
-var_dump(gmp_strval($r));
-var_dump($r = gmp_div_q(1123123,123, GMP_ROUND_MINUSINF));
-var_dump(gmp_strval($r));
+var_dump(gmp_div_q(0,1));
+var_dump(gmp_div_q(1,0));
+var_dump(gmp_div_q(12653,23482734));
+var_dump(gmp_div_q(12653,23482734, 10));
+var_dump(gmp_div_q(1123123,123));
+var_dump(gmp_div_q(1123123,123, 1));
+var_dump(gmp_div_q(1123123,123, 2));
+var_dump(gmp_div_q(1123123,123, GMP_ROUND_ZERO));
+var_dump(gmp_div_q(1123123,123, GMP_ROUND_PLUSINF));
+var_dump(gmp_div_q(1123123,123, GMP_ROUND_MINUSINF));
$fp = fopen(__FILE__, 'r');
@@ -41,31 +32,46 @@ NULL
Warning: gmp_div_q() expects at least 2 parameters, 1 given in %s on line %d
NULL
-resource(%d) of type (GMP integer)
-string(1) "0"
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(1) "0"
+}
Warning: gmp_div_q(): Zero operand not allowed in %s on line %d
bool(false)
-resource(%d) of type (GMP integer)
-string(1) "0"
-NULL
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(1) "0"
+}
-Warning: gmp_strval(): Unable to convert variable to GMP - wrong type in %s on line %d
+Warning: gmp_div_q(): Invalid rounding mode %s on line %d
bool(false)
-resource(%d) of type (GMP integer)
-string(4) "9131"
-resource(%d) of type (GMP integer)
-string(4) "9132"
-resource(%d) of type (GMP integer)
-string(4) "9131"
-resource(%d) of type (GMP integer)
-string(4) "9131"
-resource(%d) of type (GMP integer)
-string(4) "9132"
-resource(%d) of type (GMP integer)
-string(4) "9131"
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(4) "9131"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(4) "9132"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(4) "9131"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(4) "9131"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(4) "9132"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(4) "9131"
+}
-Warning: gmp_div_q(): supplied resource is not a valid GMP integer resource in %s on line %d
+Warning: gmp_div_q(): Unable to convert variable to GMP - wrong type in %s on line %d
bool(false)
Warning: gmp_div_q(): Unable to convert variable to GMP - wrong type in %s on line %d
diff --git a/ext/gmp/tests/010.phpt b/ext/gmp/tests/010.phpt
index 293a2a0bf2..e3f85ec44f 100644
--- a/ext/gmp/tests/010.phpt
+++ b/ext/gmp/tests/010.phpt
@@ -28,13 +28,22 @@ NULL
Warning: gmp_mod() expects exactly 2 parameters, 1 given in %s on line %d
NULL
bool(false)
-int(0)
-resource(%d) of type (GMP integer)
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(1) "0"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(1) "0"
+}
Warning: gmp_mod(): Zero operand not allowed in %s on line %d
bool(false)
Warning: gmp_mod(): Unable to convert variable to GMP - wrong type in %s on line %d
bool(false)
-resource(%d) of type (GMP integer)
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(5) "31161"
+}
Done
diff --git a/ext/gmp/tests/014.phpt b/ext/gmp/tests/014.phpt
index 40e10c6fbe..6afccaf936 100644
--- a/ext/gmp/tests/014.phpt
+++ b/ext/gmp/tests/014.phpt
@@ -43,7 +43,7 @@ string(19) "2432902008176640000"
string(65) "30414093201713378043612608166064768844377641568960512000000000000"
string(7) "3628800"
string(1) "1"
-string(11) "87178291200"
+string(9) "479001600"
Warning: gmp_fact(): Number has to be greater than or equal to 0 in %s on line %d
string(1) "0"
@@ -53,6 +53,9 @@ NULL
Warning: gmp_fact() expects exactly 1 parameter, 2 given in %s on line %d
NULL
-resource(%d) of type (GMP integer)
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(1) "1"
+}
string(1) "1"
Done
diff --git a/ext/gmp/tests/016.phpt b/ext/gmp/tests/016.phpt
index 44360865ca..8a0b34458f 100644
--- a/ext/gmp/tests/016.phpt
+++ b/ext/gmp/tests/016.phpt
@@ -69,5 +69,8 @@ NULL
Warning: gmp_powm(): Second parameter cannot be less than 0 in %s on line %d
bool(false)
-resource(%d) of type (GMP integer)
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(1) "1"
+}
Done
diff --git a/ext/gmp/tests/033.phpt b/ext/gmp/tests/033.phpt
index 38ff5be5bf..99848959d5 100644
--- a/ext/gmp/tests/033.phpt
+++ b/ext/gmp/tests/033.phpt
@@ -52,13 +52,13 @@ string(12) "100008388608"
string(12) "100000000000"
string(12) "100000000008"
-Warning: gmp_setbit(): supplied argument is not a valid GMP integer resource in %s on line %d
+Warning: gmp_setbit() expects parameter 1 to be GMP, string given in %s on line %d
Warning: gmp_setbit() expects at least 2 parameters, 1 given in %s on line %d
Warning: gmp_setbit() expects at most 3 parameters, 4 given in %s on line %d
-Warning: gmp_setbit() expects parameter 2 to be long, array given in %s on line %d
+Warning: gmp_setbit() expects parameter 1 to be GMP, string given in %s on line %d
-Warning: gmp_setbit() expects parameter 2 to be long, array given in %s on line %d
+Warning: gmp_setbit() expects parameter 1 to be GMP, array given in %s on line %d
Done
diff --git a/ext/gmp/tests/034.phpt b/ext/gmp/tests/034.phpt
index 6011029905..079d5d669f 100644
--- a/ext/gmp/tests/034.phpt
+++ b/ext/gmp/tests/034.phpt
@@ -46,7 +46,7 @@ string(7) "1000000"
string(7) "1000000"
string(30) "238462734628347239571822592658"
-Warning: gmp_clrbit(): supplied argument is not a valid GMP integer resource in %s on line %d
+Warning: gmp_clrbit() expects parameter 1 to be GMP, array given in %s on line %d
Warning: gmp_clrbit() expects exactly 2 parameters, 3 given in %s on line %d
diff --git a/ext/gmp/tests/040.phpt b/ext/gmp/tests/040.phpt
index 3af18cce59..9cc497edc6 100644
--- a/ext/gmp/tests/040.phpt
+++ b/ext/gmp/tests/040.phpt
@@ -18,7 +18,10 @@ var_dump(gmp_strval(gmp_init("993247326237679187178",3)));
echo "Done\n";
?>
--EXPECTF--
-resource(%d) of type (GMP integer)
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(8) "98765678"
+}
string(8) "98765678"
Warning: gmp_init() expects at least 1 parameter, 0 given in %s on line %d
diff --git a/ext/gmp/tests/cast.phpt b/ext/gmp/tests/cast.phpt
new file mode 100644
index 0000000000..eb1832c4dd
--- /dev/null
+++ b/ext/gmp/tests/cast.phpt
@@ -0,0 +1,22 @@
+--TEST--
+GMP casting using casting operators
+--SKIPIF--
+<?php if (!extension_loaded("gmp")) print "skip"; ?>
+--FILE--
+<?php
+
+$n = gmp_init(42);
+echo $n, "\n";
+var_dump((string) $n);
+var_dump((int) $n);
+var_dump((float) $n);
+var_dump((bool) $n);
+
+?>
+--EXPECTF--
+42
+string(2) "42"
+int(42)
+float(42)
+
+Catchable fatal error: Object of class GMP could not be converted to boolean in %s on line %d
diff --git a/ext/gmp/tests/clone.phpt b/ext/gmp/tests/clone.phpt
new file mode 100644
index 0000000000..56b5ca3dfe
--- /dev/null
+++ b/ext/gmp/tests/clone.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Cloning GMP instances
+--SKIPIF--
+<?php if (!extension_loaded("gmp")) print "skip"; ?>
+--FILE--
+<?php
+
+$a = gmp_init(3);
+$b = clone $a;
+gmp_clrbit($a, 0);
+var_dump($a, $b); // $b should be unaffected
+
+?>
+--EXPECTF--
+object(GMP)#1 (1) {
+ ["num"]=>
+ string(1) "2"
+}
+object(GMP)#2 (1) {
+ ["num"]=>
+ string(1) "3"
+}
diff --git a/ext/gmp/tests/comparison.phpt b/ext/gmp/tests/comparison.phpt
new file mode 100644
index 0000000000..1f3a423267
--- /dev/null
+++ b/ext/gmp/tests/comparison.phpt
@@ -0,0 +1,37 @@
+--TEST--
+Overloaded GMP comparison in sort() etc
+--SKIPIF--
+<?php if (!extension_loaded("gmp")) print "skip"; ?>
+--FILE--
+<?php
+
+$arr = [gmp_init(0), -3, gmp_init(2), 1];
+sort($arr);
+var_dump($arr);
+
+var_dump(min(gmp_init(3), 4));
+var_dump(max(gmp_init(3), 4));
+
+?>
+--EXPECT--
+array(4) {
+ [0]=>
+ int(-3)
+ [1]=>
+ object(GMP)#1 (1) {
+ ["num"]=>
+ string(1) "0"
+ }
+ [2]=>
+ int(1)
+ [3]=>
+ object(GMP)#2 (1) {
+ ["num"]=>
+ string(1) "2"
+ }
+}
+object(GMP)#3 (1) {
+ ["num"]=>
+ string(1) "3"
+}
+int(4)
diff --git a/ext/gmp/tests/overloading.phpt b/ext/gmp/tests/overloading.phpt
new file mode 100644
index 0000000000..18e0bb2aa9
--- /dev/null
+++ b/ext/gmp/tests/overloading.phpt
@@ -0,0 +1,259 @@
+--TEST--
+GMP operator overloading
+--SKIPIF--
+<?php if (!extension_loaded("gmp")) print "skip"; ?>
+--FILE--
+<?php
+
+$a = gmp_init(42);
+$b = gmp_init(17);
+
+var_dump($a + $b);
+var_dump($a + 17);
+var_dump(42 + $b);
+
+var_dump($a - $b);
+var_dump($a - 17);
+var_dump(42 - $b);
+
+var_dump($a / $b);
+var_dump($a / 17);
+var_dump(42 / $b);
+var_dump($a / 0);
+
+var_dump($a % $b);
+var_dump($a % 17);
+var_dump(42 % $b);
+var_dump($a % 0);
+
+// sl, sr
+
+var_dump($a | $b);
+var_dump($a | 17);
+var_dump(42 | $b);
+
+var_dump($a & $b);
+var_dump($a & 17);
+var_dump(42 & $b);
+
+var_dump($a ^ $b);
+var_dump($a ^ 17);
+var_dump(42 ^ $b);
+
+var_dump($a << $b);
+var_dump($a << 17);
+var_dump(42 << $b);
+
+var_dump($a >> 2);
+var_dump(-$a >> 2);
+
+var_dump(~$a);
+var_dump(-$a);
+var_dump(+$a);
+
+var_dump($a == $b);
+var_dump($a != $b);
+var_dump($a < $b);
+var_dump($a <= $b);
+var_dump($a > $b);
+var_dump($a >= $b);
+
+var_dump($a == $a);
+var_dump($a != $a);
+
+var_dump($a == 42);
+var_dump($a != 42);
+var_dump($a < 42);
+var_dump($a <= 42);
+var_dump($a > 42);
+var_dump($a >= 42);
+
+var_dump($a == new stdClass);
+
+$a += 1;
+var_dump($a);
+$a -= 1;
+var_dump($a);
+
+var_dump(++$a);
+var_dump($a++);
+var_dump($a);
+
+var_dump(--$a);
+var_dump($a--);
+var_dump($a);
+
+?>
+--EXPECTF--
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "59"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "59"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "59"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "25"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "25"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "25"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(1) "2"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(1) "2"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(1) "2"
+}
+
+Warning: main(): Zero operand not allowed in %s on line %d
+bool(false)
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(1) "8"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(1) "8"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(1) "8"
+}
+
+Warning: main(): Zero operand not allowed in %s on line %d
+bool(false)
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "59"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "59"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "59"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(1) "0"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(1) "0"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(1) "0"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "59"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "59"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "59"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(7) "5505024"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(7) "5505024"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(7) "5505024"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "10"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(3) "-11"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(3) "-43"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(3) "-42"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "42"
+}
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+bool(true)
+bool(true)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+
+Warning: main(): Unable to convert variable to GMP - wrong type in %s on line %d
+bool(false)
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "43"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "42"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "43"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "43"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "44"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "43"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "43"
+}
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "42"
+}
+
diff --git a/ext/gmp/tests/serialize.phpt b/ext/gmp/tests/serialize.phpt
new file mode 100644
index 0000000000..26716b659c
--- /dev/null
+++ b/ext/gmp/tests/serialize.phpt
@@ -0,0 +1,22 @@
+--TEST--
+GMP serialization and unserialization
+--SKIPIF--
+<?php if (!extension_loaded("gmp")) print "skip"; ?>
+--FILE--
+<?php
+
+var_dump($n = gmp_init(42));
+var_dump($s = serialize($n));
+var_dump(unserialize($s));
+
+?>
+--EXPECTF--
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "42"
+}
+string(33) "O:3:"GMP":1:{s:3:"num";s:2:"42";}"
+object(GMP)#%d (1) {
+ ["num"]=>
+ string(2) "42"
+}
diff --git a/ext/hash/tests/hash_file_basic.phpt b/ext/hash/tests/hash_file_basic.phpt
index 9851c14b91..b16927d20e 100644
--- a/ext/hash/tests/hash_file_basic.phpt
+++ b/ext/hash/tests/hash_file_basic.phpt
@@ -15,7 +15,7 @@ Felix De Vliegher <felix.devliegher@gmail.com>
echo "*** Testing hash_file() : basic functionality ***\n";
// Set up file
-$filename = 'hash_file_example.txt';
+$filename = 'hash_file_basic_example.txt';
file_put_contents( $filename, 'The quick brown fox jumped over the lazy dog.' );
var_dump( hash_file( 'md5', $filename ) );
@@ -30,7 +30,7 @@ var_dump( base64_encode( hash_file( 'md5', $filename, true ) ) );
--CLEAN--
<?php
-$filename = 'hash_file_example.txt';
+$filename = 'hash_file_basic_example.txt';
unlink( $filename );
?>
diff --git a/ext/hash/tests/hash_file_error.phpt b/ext/hash/tests/hash_file_error.phpt
index 326fbd51a5..e1380301c2 100644
--- a/ext/hash/tests/hash_file_error.phpt
+++ b/ext/hash/tests/hash_file_error.phpt
@@ -15,7 +15,7 @@ Felix De Vliegher <felix.devliegher@gmail.com>
echo "*** Testing hash_file() : error conditions ***\n";
// Set up file
-$filename = 'hash_file_example.txt';
+$filename = 'hash_file_error_example.txt';
file_put_contents( $filename, 'The quick brown fox jumped over the lazy dog.' );
@@ -38,7 +38,7 @@ var_dump( hash_file( 'md5', $filename, false, $extra_arg ) );
--CLEAN--
<?php
-$filename = 'hash_file_example.txt';
+$filename = 'hash_file_error_example.txt';
unlink( $filename );
?>
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf8.c b/ext/mbstring/libmbfl/filters/mbfilter_utf8.c
index fcee610533..5539700343 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf8.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf8.c
@@ -79,7 +79,7 @@ const struct mbfl_convert_vtbl vtbl_utf8_wchar = {
mbfl_filt_conv_common_ctor,
mbfl_filt_conv_common_dtor,
mbfl_filt_conv_utf8_wchar,
- mbfl_filt_conv_common_flush
+ mbfl_filt_conv_utf8_wchar_flush
};
const struct mbfl_convert_vtbl vtbl_wchar_utf8 = {
@@ -93,6 +93,17 @@ const struct mbfl_convert_vtbl vtbl_wchar_utf8 = {
#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
+int mbfl_filt_put_invalid_char(int c, mbfl_convert_filter *filter)
+{
+ int w;
+ w = c & MBFL_WCSGROUP_MASK;
+ w |= MBFL_WCSGROUP_THROUGH;
+ filter->status = 0;
+ filter->cache = 0;
+ CK((*filter->output_function)(w, filter->data));
+}
+
+
/*
* UTF-8 => wchar
*/
@@ -100,111 +111,104 @@ int mbfl_filt_conv_utf8_wchar(int c, mbfl_convert_filter *filter)
{
int s, c1, w = 0, flag = 0;
- if (c < 0x80) {
- if (filter->status != 0) {
- w = (filter->cache & MBFL_WCSGROUP_MASK) | MBFL_WCSGROUP_THROUGH;
- CK((*filter->output_function)(w, filter->data));
- filter->status = 0;
- filter->cache = 0;
- }
- if (c >= 0) {
+retry:
+ switch (filter->status & 0xff) {
+ case 0x00:
+ if (c < 0x80) {
CK((*filter->output_function)(c, filter->data));
+ } else if (c >= 0xc2 && c <= 0xdf) { /* 2byte code first char: 0xc2-0xdf */
+ filter->status = 0x10;
+ filter->cache = c & 0x1f;
+ } else if (c >= 0xe0 && c <= 0xef) { /* 3byte code first char: 0xe0-0xef */
+ filter->status = 0x20;
+ filter->cache = c & 0xf;
+ } else if (c >= 0xf0 && c <= 0xf4) { /* 3byte code first char: 0xf0-0xf4 */
+ filter->status = 0x30;
+ filter->cache = c & 0x7;
+ } else {
+ mbfl_filt_put_invalid_char(c, filter);
}
- } else if (c < 0xc0) {
- int status = filter->status & 0xff;
- switch (status) {
- case 0x10: /* 2byte code 2nd char: 0x80-0xbf */
- case 0x21: /* 3byte code 3rd char: 0x80-0xbf */
- case 0x32: /* 4byte code 4th char: 0x80-0xbf */
- filter->status = 0;
- s = filter->cache | (c & 0x3f);
+ break;
+ case 0x10: /* 2byte code 2nd char: 0x80-0xbf */
+ case 0x21: /* 3byte code 3rd char: 0x80-0xbf */
+ case 0x32: /* 4byte code 4th char: 0x80-0xbf */
+ filter->status = 0;
+ if (c >= 0x80 && c <= 0xbf) {
+ s = (filter->cache<<6) | (c & 0x3f);
filter->cache = 0;
- if ((status == 0x10 && s >= 0x80) ||
- (status == 0x21 && s >= 0x800 && (s < 0xd800 || s > 0xdfff)) ||
- (status == 0x32 && s >= 0x10000 && s < 0x110000)) {
- CK((*filter->output_function)(s, filter->data));
- } else {
- w = s & MBFL_WCSGROUP_MASK;
- flag = 1;
- }
- break;
- case 0x20: /* 3byte code 2nd char: 0:0xa0-0xbf,D:0x80-9F,1-C,E-F:0x80-0x9f */
- s = filter->cache | ((c & 0x3f) << 6);
- c1 = (s >> 12) & 0xf;
- if ((c1 == 0x0 && c >= 0xa0) ||
- (c1 == 0xd && c < 0xa0) ||
- (c1 > 0x0 && c1 != 0xd)) {
- filter->cache = s;
- filter->status++;
- } else {
- w = s & MBFL_WCSGROUP_MASK;
- flag = 1;
- }
- break;
- case 0x31: /* 4byte code 3rd char: 0x80-0xbf */
- filter->cache |= ((c & 0x3f) << 6);
- filter->status++;
- break;
- case 0x30: /* 4byte code 2nd char: 0:0x90-0xbf,1-3:0x80-0xbf,4:0x80-0x8f */
- s = filter->cache | ((c & 0x3f) << 12);
- c1 = (s >> 18) & 0x7;
- if ((c1 == 0x0 && c >= 0x90) ||
- (c1 > 0x0 && c1 < 0x4) ||
- (c1 == 0x4 && c < 0x90)) {
- filter->cache = s;
- filter->status++;
- } else {
- w = s & MBFL_WCSGROUP_MASK;
- flag = 1;
- }
- break;
- default:
- w = c & MBFL_WCSGROUP_MASK;
- flag = 1;
- break;
+ CK((*filter->output_function)(s, filter->data));
+ } else {
+ mbfl_filt_put_invalid_char(filter->cache, filter);
+ goto retry;
}
- } else if (c < 0xc2) { /* invalid: 0xc0,0xc1 */
- w = c & MBFL_WCSGROUP_MASK;
- flag = 1;
- } else if (c < 0xe0) { /* 2byte code first char: 0xc2-0xdf */
- if (filter->status == 0x0) {
- filter->status = 0x10;
- filter->cache = (c & 0x1f) << 6;
+ break;
+ case 0x20: /* 3byte code 2nd char: 0:0xa0-0xbf,D:0x80-9F,1-C,E-F:0x80-0x9f */
+ s = (filter->cache<<6) | (c & 0x3f);
+ c1 = filter->cache & 0xf;
+
+ if ((c >= 0x80 && c <= 0xbf) &&
+ ((c1 == 0x0 && c >= 0xa0) ||
+ (c1 == 0xd && c < 0xa0) ||
+ (c1 > 0x0 && c1 != 0xd))) {
+ filter->cache = s;
+ filter->status++;
} else {
- w = c & MBFL_WCSGROUP_MASK;
- flag = 1;
+ mbfl_filt_put_invalid_char(filter->cache, filter);
+ goto retry;
}
- } else if (c < 0xf0) { /* 3byte code first char: 0xe0-0xef */
- if (filter->status == 0x0) {
- filter->status = 0x20;
- filter->cache = (c & 0xf) << 12;
+ break;
+ case 0x30: /* 4byte code 2nd char: 0:0x90-0xbf,1-3:0x80-0xbf,4:0x80-0x8f */
+ s = (filter->cache<<6) | (c & 0x3f);
+ c1 = filter->cache & 0x7;
+
+ if ((c >= 0x80 && c <= 0xbf) &&
+ ((c1 == 0x0 && c >= 0x90) ||
+ (c1 == 0x4 && c < 0x90) ||
+ (c1 > 0x0 && c1 != 0x4))) {
+ filter->cache = s;
+ filter->status++;
} else {
- w = c & MBFL_WCSGROUP_MASK;
- flag = 1;
+ mbfl_filt_put_invalid_char(filter->cache, filter);
+ goto retry;
}
- } else if (c < 0xf5) { /* 4byte code first char: 0xf0-0xf4 */
- if (filter->status == 0x0) {
- filter->status = 0x30;
- filter->cache = (c & 0x7) << 18;
+ break;
+ case 0x31: /* 4byte code 3rd char: 0x80-0xbf */
+ if (c >= 0x80 && c <= 0xbf) {
+ filter->cache = (filter->cache<<6) | (c & 0x3f);
+ filter->status++;
} else {
- w = c & MBFL_WCSGROUP_MASK;
- flag = 1;
+ mbfl_filt_put_invalid_char(filter->cache, filter);
+ goto retry;
}
- } else {
- w = c & MBFL_WCSGROUP_MASK;
- flag = 1;
- }
-
- if (flag) {
- w |= MBFL_WCSGROUP_THROUGH;
- CK((*filter->output_function)(w, filter->data));
+ break;
+ default:
filter->status = 0;
- filter->cache = 0;
+ break;
}
return c;
}
+int mbfl_filt_conv_utf8_wchar_flush(mbfl_convert_filter *filter)
+{
+ int status, cache;
+
+ status = filter->status;
+ cache = filter->cache;
+
+ filter->status = 0;
+ filter->cache = 0;
+
+ if (status != 0) {
+ mbfl_filt_put_invalid_char(cache, filter);
+ }
+
+ if (filter->flush_function != NULL) {
+ (*filter->flush_function)(filter->data);
+ }
+ return 0;
+}
+
/*
* wchar => UTF-8
*/
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf8.h b/ext/mbstring/libmbfl/filters/mbfilter_utf8.h
index 07bf655022..970ace6462 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf8.h
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf8.h
@@ -37,5 +37,6 @@ extern const struct mbfl_convert_vtbl vtbl_wchar_utf8;
int mbfl_filt_conv_utf8_wchar(int c, mbfl_convert_filter *filter);
int mbfl_filt_conv_wchar_utf8(int c, mbfl_convert_filter *filter);
+int mbfl_filt_conv_utf8_wchar_flush(mbfl_convert_filter *filter);
#endif /* MBFL_MBFILTER_UTF8_H */
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c
index 62feca40b6..f9b643c17d 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c
@@ -37,6 +37,7 @@
#include "mbfilter_sjis_mobile.h"
extern int mbfl_filt_ident_utf8(int c, mbfl_identify_filter *filter);
+extern int mbfl_filt_conv_utf8_wchar_flush(mbfl_convert_filter *filter);
extern const unsigned char mblen_table_utf8[];
@@ -115,7 +116,7 @@ const struct mbfl_convert_vtbl vtbl_utf8_docomo_wchar = {
mbfl_filt_conv_common_ctor,
mbfl_filt_conv_common_dtor,
mbfl_filt_conv_utf8_mobile_wchar,
- mbfl_filt_conv_common_flush
+ mbfl_filt_conv_utf8_wchar_flush
};
const struct mbfl_convert_vtbl vtbl_wchar_utf8_docomo = {
@@ -133,7 +134,7 @@ const struct mbfl_convert_vtbl vtbl_utf8_kddi_a_wchar = {
mbfl_filt_conv_common_ctor,
mbfl_filt_conv_common_dtor,
mbfl_filt_conv_utf8_mobile_wchar,
- mbfl_filt_conv_common_flush
+ mbfl_filt_conv_utf8_wchar_flush
};
const struct mbfl_convert_vtbl vtbl_wchar_utf8_kddi_a = {
@@ -151,7 +152,7 @@ const struct mbfl_convert_vtbl vtbl_utf8_kddi_b_wchar = {
mbfl_filt_conv_common_ctor,
mbfl_filt_conv_common_dtor,
mbfl_filt_conv_utf8_mobile_wchar,
- mbfl_filt_conv_common_flush
+ mbfl_filt_conv_utf8_wchar_flush
};
const struct mbfl_convert_vtbl vtbl_wchar_utf8_kddi_b = {
@@ -169,7 +170,7 @@ const struct mbfl_convert_vtbl vtbl_utf8_sb_wchar = {
mbfl_filt_conv_common_ctor,
mbfl_filt_conv_common_dtor,
mbfl_filt_conv_utf8_mobile_wchar,
- mbfl_filt_conv_common_flush
+ mbfl_filt_conv_utf8_wchar_flush
};
const struct mbfl_convert_vtbl vtbl_wchar_utf8_sb = {
@@ -191,119 +192,97 @@ int mbfl_filt_conv_utf8_mobile_wchar(int c, mbfl_convert_filter *filter)
int s, w = 0, flag = 0;
int s1 = 0, c1 = 0, snd = 0;
- if (c < 0x80) {
- if (c >= 0) {
+retry:
+ switch (filter->status & 0xff) {
+ case 0x00:
+ if (c < 0x80) {
CK((*filter->output_function)(c, filter->data));
+ } else if (c >= 0xc2 && c <= 0xdf) { /* 2byte code first char: 0xc2-0xdf */
+ filter->status = 0x10;
+ filter->cache = c & 0x1f;
+ } else if (c >= 0xe0 && c <= 0xef) { /* 3byte code first char: 0xe0-0xef */
+ filter->status = 0x20;
+ filter->cache = c & 0xf;
+ } else if (c >= 0xf0 && c <= 0xf4) { /* 3byte code first char: 0xf0-0xf4 */
+ filter->status = 0x30;
+ filter->cache = c & 0x7;
+ } else {
+ mbfl_filt_put_invalid_char(c, filter);
}
+ break;
+ case 0x10: /* 2byte code 2nd char: 0x80-0xbf */
+ case 0x21: /* 3byte code 3rd char: 0x80-0xbf */
+ case 0x32: /* 4byte code 4th char: 0x80-0xbf */
filter->status = 0;
- } else if (c < 0xc0) {
- int status = filter->status & 0xff;
- switch (status) {
- case 0x10: /* 2byte code 2nd char: 0x80-0xbf */
- case 0x21: /* 3byte code 3rd char: 0x80-0xbf */
- case 0x32: /* 4byte code 4th char: 0x80-0xbf */
- filter->status = 0;
- s = filter->cache | (c & 0x3f);
+ if (c >= 0x80 && c <= 0xbf) {
+ s = (filter->cache<<6) | (c & 0x3f);
filter->cache = 0;
- if ((status == 0x10 && s >= 0x80) ||
- (status == 0x21 && s >= 0x800 && (s < 0xd800 || s > 0xdfff)) ||
- (status == 0x32 && s >= 0x10000 && s < 0x110000)) {
-
- if (filter->from->no_encoding == mbfl_no_encoding_utf8_docomo &&
- mbfilter_conv_r_map_tbl(s, &s1, mbfl_docomo2uni_pua, 4) > 0) {
- s = mbfilter_sjis_emoji_docomo2unicode(s1, &snd);
- } else if (filter->from->no_encoding == mbfl_no_encoding_utf8_kddi_a &&
- mbfilter_conv_r_map_tbl(s, &s1, mbfl_kddi2uni_pua, 7) > 0) {
- s = mbfilter_sjis_emoji_kddi2unicode(s1, &snd);
- } else if (filter->from->no_encoding == mbfl_no_encoding_utf8_kddi_b &&
- mbfilter_conv_r_map_tbl(s, &s1, mbfl_kddi2uni_pua_b, 8) > 0) {
- s = mbfilter_sjis_emoji_kddi2unicode(s1, &snd);
- } else if (filter->from->no_encoding == mbfl_no_encoding_utf8_sb &&
- mbfilter_conv_r_map_tbl(s, &s1, mbfl_sb2uni_pua, 6) > 0) {
- s = mbfilter_sjis_emoji_sb2unicode(s1, &snd);
- }
-
- if (snd > 0) {
- CK((*filter->output_function)(snd, filter->data));
- }
- CK((*filter->output_function)(s, filter->data));
- } else {
- w = s & MBFL_WCSGROUP_MASK;
- flag = 1;
- }
- break;
- case 0x20: /* 3byte code 2nd char: 0:0xa0-0xbf,D:0x80-9F,1-C,E-F:0x80-0x9f */
- s = filter->cache | ((c & 0x3f) << 6);
- c1 = (s >> 12) & 0xf;
- if ((c1 == 0x0 && c >= 0xa0) ||
- (c1 == 0xd && c < 0xa0) ||
- (c1 > 0x0 && c1 != 0xd)) {
- filter->cache = s;
- filter->status++;
- } else {
- w = s & MBFL_WCSGROUP_MASK;
- flag = 1;
+
+ if (filter->from->no_encoding == mbfl_no_encoding_utf8_docomo &&
+ mbfilter_conv_r_map_tbl(s, &s1, mbfl_docomo2uni_pua, 4) > 0) {
+ s = mbfilter_sjis_emoji_docomo2unicode(s1, &snd);
+ } else if (filter->from->no_encoding == mbfl_no_encoding_utf8_kddi_a &&
+ mbfilter_conv_r_map_tbl(s, &s1, mbfl_kddi2uni_pua, 7) > 0) {
+ s = mbfilter_sjis_emoji_kddi2unicode(s1, &snd);
+ } else if (filter->from->no_encoding == mbfl_no_encoding_utf8_kddi_b &&
+ mbfilter_conv_r_map_tbl(s, &s1, mbfl_kddi2uni_pua_b, 8) > 0) {
+ s = mbfilter_sjis_emoji_kddi2unicode(s1, &snd);
+ } else if (filter->from->no_encoding == mbfl_no_encoding_utf8_sb &&
+ mbfilter_conv_r_map_tbl(s, &s1, mbfl_sb2uni_pua, 6) > 0) {
+ s = mbfilter_sjis_emoji_sb2unicode(s1, &snd);
}
- break;
- case 0x31: /* 4byte code 3rd char: 0x80-0xbf */
- filter->cache |= ((c & 0x3f) << 6);
- filter->status++;
- break;
- case 0x30: /* 4byte code 2nd char: 0:0x90-0xbf,1-3:0x80-0xbf,4:0x80-0x8f */
- s = filter->cache | ((c & 0x3f) << 12);
- c1 = (s >> 18) & 0x7;
- if ((c1 == 0x0 && c >= 0x90) ||
- (c1 > 0x0 && c1 < 0x4) ||
- (c1 == 0x4 && c < 0x90)) {
- filter->cache = s;
- filter->status++;
- } else {
- w = s & MBFL_WCSGROUP_MASK;
- flag = 1;
+
+ if (snd > 0) {
+ CK((*filter->output_function)(snd, filter->data));
}
- break;
- default:
- w = c & MBFL_WCSGROUP_MASK;
- flag = 1;
- break;
+ CK((*filter->output_function)(s, filter->data));
+ } else {
+ mbfl_filt_put_invalid_char(filter->cache, filter);
+ goto retry;
}
- } else if (c < 0xc2) { /* invalid: 0xc0,0xc1 */
- w = c & MBFL_WCSGROUP_MASK;
- flag = 1;
- } else if (c < 0xe0) { /* 2byte code first char: 0xc2-0xdf */
- if (filter->status == 0x0) {
- filter->status = 0x10;
- filter->cache = (c & 0x1f) << 6;
+ break;
+ case 0x20: /* 3byte code 2nd char: 0:0xa0-0xbf,D:0x80-9F,1-C,E-F:0x80-0x9f */
+ s = (filter->cache<<6) | (c & 0x3f);
+ c1 = filter->cache & 0xf;
+
+ if ((c >= 0x80 && c <= 0xbf) &&
+ ((c1 == 0x0 && c >= 0xa0) ||
+ (c1 == 0xd && c < 0xa0) ||
+ (c1 > 0x0 && c1 != 0xd))) {
+ filter->cache = s;
+ filter->status++;
} else {
- w = c & MBFL_WCSGROUP_MASK;
- flag = 1;
+ mbfl_filt_put_invalid_char(filter->cache, filter);
+ goto retry;
}
- } else if (c < 0xf0) { /* 3byte code first char: 0xe0-0xef */
- if (filter->status == 0x0) {
- filter->status = 0x20;
- filter->cache = (c & 0xf) << 12;
+ break;
+ case 0x30: /* 4byte code 2nd char: 0:0x90-0xbf,1-3:0x80-0xbf,4:0x80-0x8f */
+ s = (filter->cache<<6) | (c & 0x3f);
+ c1 = filter->cache & 0x7;
+
+ if ((c >= 0x80 && c <= 0xbf) &&
+ ((c1 == 0x0 && c >= 0x90) ||
+ (c1 == 0x4 && c < 0x90) ||
+ (c1 > 0x0 && c1 != 0x4))) {
+ filter->cache = s;
+ filter->status++;
} else {
- w = c & MBFL_WCSGROUP_MASK;
- flag = 1;
+ mbfl_filt_put_invalid_char(filter->cache, filter);
+ goto retry;
}
- } else if (c < 0xf5) { /* 4byte code first char: 0xf0-0xf4 */
- if (filter->status == 0x0) {
- filter->status = 0x30;
- filter->cache = (c & 0x7) << 18;
+ break;
+ case 0x31: /* 4byte code 3rd char: 0x80-0xbf */
+ if (c >= 0x80 && c <= 0xbf) {
+ filter->cache = (filter->cache<<6) | (c & 0x3f);
+ filter->status++;
} else {
- w = c & MBFL_WCSGROUP_MASK;
- flag = 1;
+ mbfl_filt_put_invalid_char(filter->cache, filter);
+ goto retry;
}
- } else {
- w = c & MBFL_WCSGROUP_MASK;
- flag = 1;
- }
-
- if (flag) {
- w |= MBFL_WCSGROUP_THROUGH;
- CK((*filter->output_function)(w, filter->data));
+ break;
+ default:
filter->status = 0;
- filter->cache = 0;
+ break;
}
return c;
diff --git a/ext/mbstring/tests/bug65045.phpt b/ext/mbstring/tests/bug65045.phpt
new file mode 100644
index 0000000000..03a090ded2
--- /dev/null
+++ b/ext/mbstring/tests/bug65045.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Bug #65045: mb_convert_encoding breaks well-formed character
+--SKIPIF--
+<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
+--FILE--
+<?php
+
+//declare(encoding = 'UTF-8');
+mb_internal_encoding('UTF-8');
+
+$str = "\xF0\xA4\xAD". "\xF0\xA4\xAD\xA2"."\xF0\xA4\xAD\xA2";
+$expected = "\xEF\xBF\xBD"."\xF0\xA4\xAD\xA2"."\xF0\xA4\xAD\xA2";
+
+$str2 = "\xF0\xA4\xAD\xA2"."\xF0\xA4\xAD\xA2"."\xF0\xA4\xAD";
+$expected2 = "\xF0\xA4\xAD\xA2"."\xF0\xA4\xAD\xA2"."\xEF\xBF\xBD";
+
+mb_substitute_character(0xFFFD);
+var_dump(
+ $expected === htmlspecialchars_decode(htmlspecialchars($str, ENT_SUBSTITUTE, 'UTF-8')),
+ $expected2 === htmlspecialchars_decode(htmlspecialchars($str2, ENT_SUBSTITUTE, 'UTF-8')),
+ $expected === mb_convert_encoding($str, 'UTF-8', 'UTF-8'),
+ $expected2 === mb_convert_encoding($str2, 'UTF-8', 'UTF-8')
+);
+
+--EXPECT--
+bool(true)
+bool(true)
+bool(true)
+bool(true) \ No newline at end of file
diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c
new file mode 100644
index 0000000000..b29241344c
--- /dev/null
+++ b/ext/opcache/Optimizer/compact_literals.c
@@ -0,0 +1,481 @@
+/* pass 11
+ * - compact literals table
+ */
+#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
+
+#define DEBUG_COMPACT_LITERALS 0
+
+#define LITERAL_VALUE 0x0100
+#define LITERAL_FUNC 0x0200
+#define LITERAL_CLASS 0x0300
+#define LITERAL_CONST 0x0400
+#define LITERAL_CLASS_CONST 0x0500
+#define LITERAL_STATIC_METHOD 0x0600
+#define LITERAL_STATIC_PROPERTY 0x0700
+#define LITERAL_METHOD 0x0800
+#define LITERAL_PROPERTY 0x0900
+
+#define LITERAL_EX_CLASS 0x4000
+#define LITERAL_EX_OBJ 0x2000
+#define LITERAL_MAY_MERGE 0x1000
+#define LITERAL_KIND_MASK 0x0f00
+#define LITERAL_NUM_RELATED_MASK 0x000f
+#define LITERAL_NUM_SLOTS_MASK 0x00f0
+#define LITERAL_NUM_SLOTS_SHIFT 4
+
+#define LITERAL_NUM_RELATED(info) (info & LITERAL_NUM_RELATED_MASK)
+#define LITERAL_NUM_SLOTS(info) ((info & LITERAL_NUM_SLOTS_MASK) >> LITERAL_NUM_SLOTS_SHIFT)
+
+typedef struct _literal_info {
+ zend_uint flags; /* bitmask (see defines above) */
+ union {
+ int num; /* variable number or class name literal number */
+ } u;
+} literal_info;
+
+#define LITERAL_FLAGS(kind, slots, related) \
+ ((kind) | ((slots) << LITERAL_NUM_SLOTS_SHIFT) | (related))
+
+#define LITERAL_INFO(n, kind, merge, slots, related) do { \
+ info[n].flags = (((merge) ? LITERAL_MAY_MERGE : 0) | LITERAL_FLAGS(kind, slots, related)); \
+ } while (0)
+
+#define LITERAL_INFO_CLASS(n, kind, merge, slots, related, _num) do { \
+ info[n].flags = (LITERAL_EX_CLASS | ((merge) ? LITERAL_MAY_MERGE : 0) | LITERAL_FLAGS(kind, slots, related)); \
+ info[n].u.num = (_num); \
+ } while (0)
+
+#define LITERAL_INFO_OBJ(n, kind, merge, slots, related, _num) do { \
+ info[n].flags = (LITERAL_EX_OBJ | ((merge) ? LITERAL_MAY_MERGE : 0) | LITERAL_FLAGS(kind, slots, related)); \
+ info[n].u.num = (_num); \
+ } while (0)
+
+static void optimizer_literal_obj_info(literal_info *info,
+ zend_uchar op_type,
+ znode_op op,
+ int constant,
+ zend_uint kind,
+ zend_uint slots,
+ zend_uint related,
+ zend_op_array *op_array)
+{
+ /* For now we merge only $this object properties and methods.
+ * In general it's also possible to do it for any CV variable as well,
+ * but it would require complex dataflow and/or type analysis.
+ */
+ if (Z_TYPE(op_array->literals[constant].constant) == IS_STRING &&
+ op_type == IS_UNUSED) {
+ LITERAL_INFO_OBJ(constant, kind, 1, slots, related, op_array->this_var);
+ } else {
+ LITERAL_INFO(constant, kind, 0, slots, related);
+ }
+}
+
+static void optimizer_literal_class_info(literal_info *info,
+ zend_uchar op_type,
+ znode_op op,
+ int constant,
+ zend_uint kind,
+ zend_uint slots,
+ zend_uint related,
+ zend_op_array *op_array)
+{
+ if (op_type == IS_CONST) {
+ LITERAL_INFO_CLASS(constant, kind, 1, slots, related, op.constant);
+ } else {
+ LITERAL_INFO(constant, kind, 0, slots, related);
+ }
+}
+
+static void optimizer_compact_literals(zend_op_array *op_array TSRMLS_DC)
+{
+ zend_op *opline, *end;
+ int i, j, n, *pos, *map, cache_slots;
+ ulong h;
+ literal_info *info;
+ int l_null = -1;
+ int l_false = -1;
+ int l_true = -1;
+ HashTable hash;
+ char *key;
+ int key_len;
+
+ if (op_array->last_literal) {
+ info = (literal_info*)ecalloc(op_array->last_literal, sizeof(literal_info));
+
+ /* Mark literals of specific types */
+ opline = op_array->opcodes;
+ end = opline + op_array->last;
+ while (opline < end) {
+ switch (opline->opcode) {
+ case ZEND_DO_FCALL:
+ LITERAL_INFO(opline->op1.constant, LITERAL_FUNC, 1, 1, 1);
+ break;
+ case ZEND_INIT_FCALL_BY_NAME:
+ if (ZEND_OP2_TYPE(opline) == IS_CONST) {
+ LITERAL_INFO(opline->op2.constant, LITERAL_FUNC, 1, 1, 2);
+ }
+ break;
+ case ZEND_INIT_NS_FCALL_BY_NAME:
+ LITERAL_INFO(opline->op2.constant, LITERAL_FUNC, 1, 1, 3);
+ break;
+ case ZEND_INIT_METHOD_CALL:
+ if (ZEND_OP2_TYPE(opline) == IS_CONST) {
+ optimizer_literal_obj_info(
+ info,
+ opline->op1_type,
+ opline->op1,
+ opline->op2.constant,
+ LITERAL_METHOD, 2, 2,
+ op_array);
+ }
+ break;
+ case ZEND_INIT_STATIC_METHOD_CALL:
+ if (ZEND_OP1_TYPE(opline) == IS_CONST) {
+ LITERAL_INFO(opline->op1.constant, LITERAL_CLASS, 1, 1, 2);
+ }
+ if (ZEND_OP2_TYPE(opline) == IS_CONST) {
+ optimizer_literal_class_info(
+ info,
+ opline->op1_type,
+ opline->op1,
+ opline->op2.constant,
+ LITERAL_STATIC_METHOD, (ZEND_OP1_TYPE(opline) == IS_CONST) ? 1 : 2, 2,
+ op_array);
+ }
+ break;
+ case ZEND_CATCH:
+ LITERAL_INFO(opline->op1.constant, LITERAL_CLASS, 1, 1, 2);
+ break;
+ case ZEND_FETCH_CONSTANT:
+ if (ZEND_OP1_TYPE(opline) == IS_UNUSED) {
+ if ((opline->extended_value & (IS_CONSTANT_IN_NAMESPACE|IS_CONSTANT_UNQUALIFIED)) == (IS_CONSTANT_IN_NAMESPACE|IS_CONSTANT_UNQUALIFIED)) {
+ LITERAL_INFO(opline->op2.constant, LITERAL_CONST, 1, 1, 5);
+ } else {
+ LITERAL_INFO(opline->op2.constant, LITERAL_CONST, 1, 1, 3);
+ }
+ } else {
+ if (ZEND_OP1_TYPE(opline) == IS_CONST) {
+ LITERAL_INFO(opline->op1.constant, LITERAL_CLASS, 1, 1, 2);
+ }
+ optimizer_literal_class_info(
+ info,
+ opline->op1_type,
+ opline->op1,
+ opline->op2.constant,
+ LITERAL_CLASS_CONST, (ZEND_OP1_TYPE(opline) == IS_CONST) ? 1 : 2, 1,
+ op_array);
+ }
+ break;
+ case ZEND_FETCH_R:
+ case ZEND_FETCH_W:
+ case ZEND_FETCH_RW:
+ case ZEND_FETCH_IS:
+ case ZEND_FETCH_UNSET:
+ case ZEND_FETCH_FUNC_ARG:
+ case ZEND_UNSET_VAR:
+ case ZEND_ISSET_ISEMPTY_VAR:
+ if (ZEND_OP2_TYPE(opline) == IS_UNUSED) {
+ if (ZEND_OP1_TYPE(opline) == IS_CONST) {
+ LITERAL_INFO(opline->op1.constant, LITERAL_VALUE, 1, 0, 1);
+ }
+ } else {
+ if (ZEND_OP2_TYPE(opline) == IS_CONST) {
+ LITERAL_INFO(opline->op2.constant, LITERAL_CLASS, 1, 1, 2);
+ }
+ if (ZEND_OP1_TYPE(opline) == IS_CONST) {
+ optimizer_literal_class_info(
+ info,
+ opline->op2_type,
+ opline->op2,
+ opline->op1.constant,
+ LITERAL_STATIC_PROPERTY, 2, 1,
+ op_array);
+ }
+ }
+ break;
+ case ZEND_FETCH_CLASS:
+ case ZEND_ADD_INTERFACE:
+ case ZEND_ADD_TRAIT:
+ if (ZEND_OP2_TYPE(opline) == IS_CONST) {
+ LITERAL_INFO(opline->op2.constant, LITERAL_CLASS, 1, 1, 2);
+ }
+ break;
+ case ZEND_ASSIGN_OBJ:
+ case ZEND_FETCH_OBJ_R:
+ case ZEND_FETCH_OBJ_W:
+ case ZEND_FETCH_OBJ_RW:
+ case ZEND_FETCH_OBJ_IS:
+ case ZEND_FETCH_OBJ_UNSET:
+ case ZEND_FETCH_OBJ_FUNC_ARG:
+ case ZEND_UNSET_OBJ:
+ case ZEND_PRE_INC_OBJ:
+ case ZEND_PRE_DEC_OBJ:
+ case ZEND_POST_INC_OBJ:
+ case ZEND_POST_DEC_OBJ:
+ case ZEND_ISSET_ISEMPTY_PROP_OBJ:
+ if (ZEND_OP2_TYPE(opline) == IS_CONST) {
+ optimizer_literal_obj_info(
+ info,
+ opline->op1_type,
+ opline->op1,
+ opline->op2.constant,
+ LITERAL_PROPERTY, 2, 1,
+ op_array);
+ }
+ break;
+ case ZEND_ASSIGN_ADD:
+ case ZEND_ASSIGN_SUB:
+ case ZEND_ASSIGN_MUL:
+ case ZEND_ASSIGN_DIV:
+ case ZEND_ASSIGN_MOD:
+ case ZEND_ASSIGN_SL:
+ case ZEND_ASSIGN_SR:
+ case ZEND_ASSIGN_CONCAT:
+ case ZEND_ASSIGN_BW_OR:
+ case ZEND_ASSIGN_BW_AND:
+ case ZEND_ASSIGN_BW_XOR:
+ if (ZEND_OP2_TYPE(opline) == IS_CONST) {
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ optimizer_literal_obj_info(
+ info,
+ opline->op1_type,
+ opline->op1,
+ opline->op2.constant,
+ LITERAL_PROPERTY, 2, 1,
+ op_array);
+ } else {
+ LITERAL_INFO(opline->op2.constant, LITERAL_VALUE, 1, 0, 1);
+ }
+ }
+ break;
+ default:
+ if (ZEND_OP1_TYPE(opline) == IS_CONST) {
+ LITERAL_INFO(opline->op1.constant, LITERAL_VALUE, 1, 0, 1);
+ }
+ if (ZEND_OP2_TYPE(opline) == IS_CONST) {
+ LITERAL_INFO(opline->op2.constant, LITERAL_VALUE, 1, 0, 1);
+ }
+ break;
+ }
+ opline++;
+ }
+
+#if DEBUG_COMPACT_LITERALS
+ {
+ int i, use_copy;
+ fprintf(stderr, "File %s func %s\n", op_array->filename,
+ op_array->function_name? op_array->function_name : "main");
+ fprintf(stderr, "Literlas table size %d\n", op_array->last_literal);
+
+ for (i = 0; i < op_array->last_literal; i++) {
+ zval zv = op_array->literals[i].constant;
+ zend_make_printable_zval(&op_array->literals[i].constant, &zv, &use_copy);
+ fprintf(stderr, "Literal %d, val (%d):%s\n", i, Z_STRLEN(zv), Z_STRVAL(zv));
+ if (use_copy) {
+ zval_dtor(&zv);
+ }
+ }
+ fflush(stderr);
+ }
+#endif
+
+ /* Merge equal constants */
+ j = 0; cache_slots = 0;
+ zend_hash_init(&hash, 16, NULL, NULL, 0);
+ map = (int*)ecalloc(op_array->last_literal, sizeof(int));
+ for (i = 0; i < op_array->last_literal; i++) {
+ if (!info[i].flags) {
+ /* unsed literal */
+ zval_dtor(&op_array->literals[i].constant);
+ continue;
+ }
+ switch (Z_TYPE(op_array->literals[i].constant)) {
+ case IS_NULL:
+ if (l_null < 0) {
+ l_null = j;
+ if (i != j) {
+ op_array->literals[j] = op_array->literals[i];
+ info[j] = info[i];
+ }
+ j++;
+ }
+ map[i] = l_null;
+ break;
+ case IS_BOOL:
+ if (Z_LVAL(op_array->literals[i].constant)) {
+ if (l_true < 0) {
+ l_true = j;
+ if (i != j) {
+ op_array->literals[j] = op_array->literals[i];
+ info[j] = info[i];
+ }
+ j++;
+ }
+ map[i] = l_true;
+ } else {
+ if (l_false < 0) {
+ l_false = j;
+ if (i != j) {
+ op_array->literals[j] = op_array->literals[i];
+ info[j] = info[i];
+ }
+ j++;
+ }
+ map[i] = l_false;
+ }
+ break;
+ case IS_LONG:
+ if (zend_hash_index_find(&hash, Z_LVAL(op_array->literals[i].constant), (void**)&pos) == SUCCESS) {
+ map[i] = *pos;
+ } else {
+ map[i] = j;
+ zend_hash_index_update(&hash, Z_LVAL(op_array->literals[i].constant), (void**)&j, sizeof(int), NULL);
+ if (i != j) {
+ op_array->literals[j] = op_array->literals[i];
+ info[j] = info[i];
+ }
+ j++;
+ }
+ break;
+ case IS_DOUBLE:
+ if (zend_hash_find(&hash, (char*)&Z_DVAL(op_array->literals[i].constant), sizeof(double), (void**)&pos) == SUCCESS) {
+ map[i] = *pos;
+ } else {
+ map[i] = j;
+ zend_hash_add(&hash, (char*)&Z_DVAL(op_array->literals[i].constant), sizeof(double), (void**)&j, sizeof(int), NULL);
+ if (i != j) {
+ op_array->literals[j] = op_array->literals[i];
+ info[j] = info[i];
+ }
+ j++;
+ }
+ break;
+ case IS_STRING:
+ case IS_CONSTANT:
+ if (info[i].flags & LITERAL_MAY_MERGE) {
+ if (info[i].flags & LITERAL_EX_OBJ) {
+ key_len = MAX_LENGTH_OF_LONG + sizeof("->") + Z_STRLEN(op_array->literals[i].constant);
+ key = emalloc(key_len);
+ key_len = snprintf(key, key_len-1, "%d->%s", info[i].u.num, Z_STRVAL(op_array->literals[i].constant));
+ } else if (info[i].flags & LITERAL_EX_CLASS) {
+ zval *class_name = &op_array->literals[(info[i].u.num < i) ? map[info[i].u.num] : info[i].u.num].constant;
+ key_len = Z_STRLEN_P(class_name) + sizeof("::") + Z_STRLEN(op_array->literals[i].constant);
+ key = emalloc(key_len);
+ memcpy(key, Z_STRVAL_P(class_name), Z_STRLEN_P(class_name));
+ memcpy(key + Z_STRLEN_P(class_name), "::", sizeof("::") - 1);
+ memcpy(key + Z_STRLEN_P(class_name) + sizeof("::") - 1,
+ Z_STRVAL(op_array->literals[i].constant),
+ Z_STRLEN(op_array->literals[i].constant) + 1);
+ } else {
+ key = Z_STRVAL(op_array->literals[i].constant);
+ key_len = Z_STRLEN(op_array->literals[i].constant)+1;
+ }
+ h = zend_hash_func(key, key_len);
+ h += info[i].flags;
+ }
+ if ((info[i].flags & LITERAL_MAY_MERGE) &&
+ zend_hash_quick_find(&hash, key, key_len, h, (void**)&pos) == SUCCESS &&
+ Z_TYPE(op_array->literals[i].constant) == Z_TYPE(op_array->literals[*pos].constant) &&
+ info[i].flags == info[*pos].flags) {
+
+ if (info[i].flags & (LITERAL_EX_OBJ|LITERAL_EX_CLASS)) {
+ efree(key);
+ }
+ map[i] = *pos;
+ zval_dtor(&op_array->literals[i].constant);
+ n = LITERAL_NUM_RELATED(info[i].flags);
+ while (n > 1) {
+ i++;
+ zval_dtor(&op_array->literals[i].constant);
+ n--;
+ }
+ } else {
+ map[i] = j;
+ if (info[i].flags & LITERAL_MAY_MERGE) {
+ zend_hash_quick_add(&hash, key, key_len, h, (void**)&j, sizeof(int), NULL);
+ if (info[i].flags & (LITERAL_EX_OBJ|LITERAL_EX_CLASS)) {
+ efree(key);
+ }
+ }
+ if (i != j) {
+ op_array->literals[j] = op_array->literals[i];
+ info[j] = info[i];
+ }
+ if (!op_array->literals[j].hash_value) {
+ if (IS_INTERNED(Z_STRVAL(op_array->literals[j].constant))) {
+ op_array->literals[j].hash_value = INTERNED_HASH(Z_STRVAL(op_array->literals[j].constant));
+ } else {
+ op_array->literals[j].hash_value = zend_hash_func(Z_STRVAL(op_array->literals[j].constant), Z_STRLEN(op_array->literals[j].constant)+1);
+ }
+ }
+ if (LITERAL_NUM_SLOTS(info[i].flags)) {
+ op_array->literals[j].cache_slot = cache_slots;
+ cache_slots += LITERAL_NUM_SLOTS(info[i].flags);
+ }
+ j++;
+ n = LITERAL_NUM_RELATED(info[i].flags);
+ while (n > 1) {
+ i++;
+ if (i != j) op_array->literals[j] = op_array->literals[i];
+ if (!op_array->literals[j].hash_value) {
+ if (IS_INTERNED(Z_STRVAL(op_array->literals[j].constant))) {
+ op_array->literals[j].hash_value = INTERNED_HASH(Z_STRVAL(op_array->literals[j].constant));
+ } else {
+ op_array->literals[j].hash_value = zend_hash_func(Z_STRVAL(op_array->literals[j].constant), Z_STRLEN(op_array->literals[j].constant)+1);
+ }
+ }
+ j++;
+ n--;
+ }
+ }
+ break;
+ default:
+ /* don't merge other types */
+ map[i] = j;
+ if (i != j) {
+ op_array->literals[j] = op_array->literals[i];
+ info[j] = info[i];
+ }
+ j++;
+ break;
+ }
+ }
+ zend_hash_destroy(&hash);
+ op_array->last_literal = j;
+ op_array->last_cache_slot = cache_slots;
+
+ /* Update opcodes to use new literals table */
+ opline = op_array->opcodes;
+ end = opline + op_array->last;
+ while (opline < end) {
+ if (ZEND_OP1_TYPE(opline) == IS_CONST) {
+ opline->op1.constant = map[opline->op1.constant];
+ }
+ if (ZEND_OP2_TYPE(opline) == IS_CONST) {
+ opline->op2.constant = map[opline->op2.constant];
+ }
+ opline++;
+ }
+ efree(map);
+ efree(info);
+
+#if DEBUG_COMPACT_LITERALS
+ {
+ int i, use_copy;
+ fprintf(stderr, "Optimized literlas table size %d\n", op_array->last_literal);
+
+ for (i = 0; i < op_array->last_literal; i++) {
+ zval zv = op_array->literals[i].constant;
+ zend_make_printable_zval(&op_array->literals[i].constant, &zv, &use_copy);
+ fprintf(stderr, "Literal %d, val (%d):%s\n", i, Z_STRLEN(zv), Z_STRVAL(zv));
+ if (use_copy) {
+ zval_dtor(&zv);
+ }
+ }
+ fflush(stderr);
+ }
+#endif
+ }
+}
+#endif
diff --git a/ext/opcache/Optimizer/optimize_func_calls.c b/ext/opcache/Optimizer/optimize_func_calls.c
new file mode 100644
index 0000000000..98bfc1e99e
--- /dev/null
+++ b/ext/opcache/Optimizer/optimize_func_calls.c
@@ -0,0 +1,138 @@
+/* pass 4
+ * - optimize INIT_FCALL_BY_NAME to DO_FCALL
+ */
+#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
+
+typedef struct _optimizer_call_info {
+ zend_function *func;
+ zend_op *opline;
+} optimizer_call_info;
+
+static void optimize_func_calls(zend_op_array *op_array, zend_persistent_script *script TSRMLS_DC) {
+ zend_op *opline = op_array->opcodes;
+ zend_op *end = opline + op_array->last;
+ int call = 0;
+#if ZEND_EXTENSION_API_NO > PHP_5_4_X_API_NO
+ optimizer_call_info *call_stack = ecalloc(op_array->nested_calls + 1, sizeof(optimizer_call_info));
+#else
+ int stack_size = 4;
+ optimizer_call_info *call_stack = ecalloc(stack_size, sizeof(optimizer_call_info));
+#endif
+
+ while (opline < end) {
+ switch (opline->opcode) {
+ case ZEND_INIT_FCALL_BY_NAME:
+ case ZEND_INIT_NS_FCALL_BY_NAME:
+ if (ZEND_OP2_TYPE(opline) == IS_CONST) {
+ zend_function *func;
+ zval *function_name = &op_array->literals[opline->op2.constant + 1].constant;
+ if ((zend_hash_quick_find(&script->function_table,
+ Z_STRVAL_P(function_name), Z_STRLEN_P(function_name) + 1,
+ Z_HASH_P(function_name), (void **)&func) == SUCCESS)) {
+ call_stack[call].func = func;
+ }
+ }
+ /* break missing intentionally */
+ case ZEND_NEW:
+ case ZEND_INIT_METHOD_CALL:
+ case ZEND_INIT_STATIC_METHOD_CALL:
+ call_stack[call].opline = opline;
+ call++;
+#if ZEND_EXTENSION_API_NO < PHP_5_5_X_API_NO
+ if (call == stack_size) {
+ stack_size += 4;
+ call_stack = erealloc(call_stack, sizeof(optimizer_call_info) * stack_size);
+ memset(call_stack + 4, 0, 4 * sizeof(optimizer_call_info));
+ }
+#endif
+ break;
+ case ZEND_DO_FCALL_BY_NAME:
+ call--;
+ if (call_stack[call].func && call_stack[call].opline) {
+ zend_op *fcall = call_stack[call].opline;
+
+ opline->opcode = ZEND_DO_FCALL;
+ ZEND_OP1_TYPE(opline) = IS_CONST;
+ opline->op1.constant = fcall->op2.constant + 1;
+ op_array->literals[fcall->op2.constant + 1].cache_slot = op_array->literals[fcall->op2.constant].cache_slot;
+ literal_dtor(&ZEND_OP2_LITERAL(fcall));
+ if (fcall->opcode == ZEND_INIT_NS_FCALL_BY_NAME) {
+ literal_dtor(&op_array->literals[fcall->op2.constant + 2].constant);
+ }
+ MAKE_NOP(fcall);
+ } else if (opline->extended_value == 0 &&
+ call_stack[call].opline &&
+ call_stack[call].opline->opcode == ZEND_INIT_FCALL_BY_NAME &&
+ ZEND_OP2_TYPE(call_stack[call].opline) == IS_CONST) {
+
+ zend_op *fcall = call_stack[call].opline;
+
+ opline->opcode = ZEND_DO_FCALL;
+ ZEND_OP1_TYPE(opline) = IS_CONST;
+ opline->op1.constant = fcall->op2.constant + 1;
+ op_array->literals[fcall->op2.constant + 1].cache_slot = op_array->literals[fcall->op2.constant].cache_slot;
+ literal_dtor(&ZEND_OP2_LITERAL(fcall));
+ MAKE_NOP(fcall);
+ }
+ call_stack[call].func = NULL;
+ call_stack[call].opline = NULL;
+ break;
+ case ZEND_FETCH_FUNC_ARG:
+ case ZEND_FETCH_OBJ_FUNC_ARG:
+ case ZEND_FETCH_DIM_FUNC_ARG:
+ if (call_stack[call - 1].func) {
+ if (ARG_SHOULD_BE_SENT_BY_REF(call_stack[call - 1].func, (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
+ opline->extended_value = 0;
+ opline->opcode -= 9;
+ } else {
+ opline->extended_value = 0;
+ opline->opcode -= 12;
+ }
+ }
+ break;
+ case ZEND_SEND_VAL:
+ if (opline->extended_value == ZEND_DO_FCALL_BY_NAME && call_stack[call - 1].func) {
+ if (ARG_MUST_BE_SENT_BY_REF(call_stack[call - 1].func, opline->op2.num)) {
+ /* We won't convert it into_DO_FCALL to emit error at run-time */
+ call_stack[call - 1].opline = NULL;
+ } else {
+ opline->extended_value = ZEND_DO_FCALL;
+ }
+ }
+ break;
+ case ZEND_SEND_VAR:
+ if (opline->extended_value == ZEND_DO_FCALL_BY_NAME && call_stack[call - 1].func) {
+ if (ARG_SHOULD_BE_SENT_BY_REF(call_stack[call - 1].func, opline->op2.num)) {
+ opline->opcode = ZEND_SEND_REF;
+ }
+ opline->extended_value = ZEND_DO_FCALL;
+ }
+ break;
+ case ZEND_SEND_VAR_NO_REF:
+ if (!(opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) && call_stack[call - 1].func) {
+ if (ARG_SHOULD_BE_SENT_BY_REF(call_stack[call - 1].func, opline->op2.num)) {
+ opline->extended_value |= ZEND_ARG_COMPILE_TIME_BOUND | ZEND_ARG_SEND_BY_REF;
+ } else if (opline->extended_value) {
+ opline->extended_value |= ZEND_ARG_COMPILE_TIME_BOUND;
+ } else {
+ opline->opcode = ZEND_SEND_VAR;
+ opline->extended_value = ZEND_DO_FCALL;
+ }
+ }
+ break;
+ case ZEND_SEND_REF:
+ if (opline->extended_value == ZEND_DO_FCALL_BY_NAME && call_stack[call - 1].func) {
+ /* We won't handle run-time pass by reference */
+ call_stack[call - 1].opline = NULL;
+ }
+ break;
+
+ default:
+ break;
+ }
+ opline++;
+ }
+
+ efree(call_stack);
+}
+#endif
diff --git a/ext/opcache/Optimizer/pass1_5.c b/ext/opcache/Optimizer/pass1_5.c
index dc9e7319a9..ec5a786577 100644
--- a/ext/opcache/Optimizer/pass1_5.c
+++ b/ext/opcache/Optimizer/pass1_5.c
@@ -3,13 +3,13 @@
* - perform compile-time evaluation of constant binary and unary operations
* - optimize series of ADD_STRING and/or ADD_CHAR
* - convert CAST(IS_BOOL,x) into BOOL(x)
- * - convert INTI_FCALL_BY_NAME, DO_FCALL_BY_NAME into DO_FCALL
*/
if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) {
int i = 0;
zend_op *opline = op_array->opcodes;
zend_op *end = opline + op_array->last;
+ zend_bool collect_constants = (op_array == &script->main_op_array);
while (opline < end) {
switch (opline->opcode) {
@@ -357,7 +357,9 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) {
zval c;
if (!zend_get_persistent_constant(Z_STRVAL(ZEND_OP2_LITERAL(opline)), Z_STRLEN(ZEND_OP2_LITERAL(opline)), &c, 1 TSRMLS_CC)) {
- break;
+ if (!*constants || !zend_optimizer_get_collected_constant(*constants, &ZEND_OP2_LITERAL(opline), &c)) {
+ break;
+ }
}
literal_dtor(&ZEND_OP2_LITERAL(opline));
ZEND_OP1_TYPE(opline) = IS_CONST;
@@ -371,22 +373,70 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) {
}
break;
- case ZEND_INIT_FCALL_BY_NAME:
- if (opline->extended_value == 0 /* not method */ &&
- ZEND_OP1_TYPE(opline) == IS_UNUSED &&
- ZEND_OP2_TYPE(opline) == IS_CONST) {
- if ((opline + 1)->opcode == ZEND_DO_FCALL_BY_NAME &&
- (opline + 1)->extended_value == 0) {
- (opline + 1)->opcode = ZEND_DO_FCALL;
- COPY_NODE((opline + 1)->op1, opline->op2);
- zend_str_tolower(Z_STRVAL(ZEND_OP1_LITERAL(opline + 1)), Z_STRLEN(ZEND_OP1_LITERAL(opline + 1)));
+ case ZEND_DO_FCALL:
+ /* define("name", scalar); */
+ if (collect_constants &&
+ opline->extended_value == 2 &&
+ ZEND_OP1_TYPE(opline) == IS_CONST &&
+ Z_TYPE(ZEND_OP1_LITERAL(opline)) == IS_STRING &&
+ Z_STRLEN(ZEND_OP1_LITERAL(opline)) == sizeof("define")-1 &&
+ zend_binary_strcasecmp(Z_STRVAL(ZEND_OP1_LITERAL(opline)), Z_STRLEN(ZEND_OP1_LITERAL(opline)), "define", sizeof("define")-1) == 0 &&
+ (opline-1)->opcode == ZEND_SEND_VAL &&
+ ZEND_OP1_TYPE(opline-1) == IS_CONST &&
+ (Z_TYPE(ZEND_OP1_LITERAL(opline-1)) <= IS_BOOL ||
+ Z_TYPE(ZEND_OP1_LITERAL(opline-1)) == IS_STRING) &&
+ (opline-2)->opcode == ZEND_SEND_VAL &&
+ ZEND_OP1_TYPE(opline-2) == IS_CONST &&
+ Z_TYPE(ZEND_OP1_LITERAL(opline-2)) == IS_STRING) {
+ zend_optimizer_collect_constant(constants, &ZEND_OP1_LITERAL(opline-2), &ZEND_OP1_LITERAL(opline-1));
+ }
+ break;
+#if ZEND_EXTENSION_API_NO > PHP_5_2_X_API_NO
+ case ZEND_DECLARE_CONST:
+ if (collect_constants &&
+ Z_TYPE(ZEND_OP1_LITERAL(opline)) == IS_STRING &&
+ (Z_TYPE(ZEND_OP2_LITERAL(opline)) <= IS_BOOL ||
+ Z_TYPE(ZEND_OP2_LITERAL(opline)) == IS_STRING)) {
+ zend_optimizer_collect_constant(constants, &ZEND_OP1_LITERAL(opline), &ZEND_OP2_LITERAL(opline));
+ }
+ break;
+#endif
+
+ case ZEND_RETURN:
#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
- Z_HASH_P(&ZEND_OP1_LITERAL(opline + 1)) = zend_hash_func(Z_STRVAL(ZEND_OP1_LITERAL(opline + 1)), Z_STRLEN(ZEND_OP1_LITERAL(opline + 1)) + 1);
- op_array->literals[(opline + 1)->op1.constant].cache_slot = op_array->last_cache_slot++;
+ case ZEND_RETURN_BY_REF:
#endif
- MAKE_NOP(opline);
- }
- }
+#if ZEND_EXTENSION_API_NO > PHP_5_4_X_API_NO
+ case ZEND_GENERATOR_RETURN:
+#endif
+ case ZEND_EXIT:
+ case ZEND_THROW:
+ case ZEND_CATCH:
+ case ZEND_BRK:
+ case ZEND_CONT:
+#if ZEND_EXTENSION_API_NO >= PHP_5_3_X_API_NO
+ case ZEND_GOTO:
+#endif
+#if ZEND_EXTENSION_API_NO > PHP_5_4_X_API_NO
+ case ZEND_FAST_CALL:
+ case ZEND_FAST_RET:
+#endif
+ case ZEND_JMP:
+ case ZEND_JMPZNZ:
+ case ZEND_JMPZ:
+ case ZEND_JMPNZ:
+ case ZEND_JMPZ_EX:
+ case ZEND_JMPNZ_EX:
+ case ZEND_FE_RESET:
+ case ZEND_FE_FETCH:
+ case ZEND_NEW:
+#if ZEND_EXTENSION_API_NO >= PHP_5_3_X_API_NO
+ case ZEND_JMP_SET:
+#endif
+#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
+ case ZEND_JMP_SET_VAR:
+#endif
+ collect_constants = 0;
break;
}
opline++;
diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c
index a6450ab5c4..f3fbabcf81 100644
--- a/ext/opcache/Optimizer/zend_optimizer.c
+++ b/ext/opcache/Optimizer/zend_optimizer.c
@@ -24,19 +24,47 @@
#include "zend_API.h"
#include "zend_constants.h"
#include "zend_execute.h"
+#include "zend_vm.h"
#define OPTIMIZATION_LEVEL \
ZCG(accel_directives).optimization_level
+static void zend_optimizer_zval_dtor_wrapper(zval *zvalue)
+{
+ zval_dtor(zvalue);
+}
+
+static void zend_optimizer_collect_constant(HashTable **constants, zval *name, zval* value)
+{
+ zval val;
+
+ if (!*constants) {
+ *constants = emalloc(sizeof(HashTable));
+ zend_hash_init(*constants, 16, NULL, (void (*)(void *))zend_optimizer_zval_dtor_wrapper, 0);
+ }
+ val = *value;
+ zval_copy_ctor(&val);
+ zend_hash_add(*constants, Z_STRVAL_P(name), Z_STRLEN_P(name)+1, (void**)&val, sizeof(zval), NULL);
+}
+
+static int zend_optimizer_get_collected_constant(HashTable *constants, zval *name, zval* value)
+{
+ zval *val;
+
+ if (zend_hash_find(constants, Z_STRVAL_P(name), Z_STRLEN_P(name)+1, (void**)&val) == SUCCESS) {
+ *value = *val;
+ zval_copy_ctor(value);
+ return 1;
+ }
+ return 0;
+}
+
#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
int zend_optimizer_add_literal(zend_op_array *op_array, const zval *zv TSRMLS_DC)
{
int i = op_array->last_literal;
op_array->last_literal++;
- if (i >= CG(context).literals_size) {
- CG(context).literals_size += 16; /* FIXME */
- op_array->literals = (zend_literal*)erealloc(op_array->literals, CG(context).literals_size * sizeof(zend_literal));
- }
+ op_array->literals = (zend_literal*)erealloc(op_array->literals, op_array->last_literal * sizeof(zend_literal));
op_array->literals[i].constant = *zv;
op_array->literals[i].hash_value = 0;
op_array->literals[i].cache_slot = -1;
@@ -84,8 +112,12 @@ int zend_optimizer_add_literal(zend_op_array *op_array, const zval *zv TSRMLS_DC
#include "Optimizer/nop_removal.c"
#include "Optimizer/block_pass.c"
#include "Optimizer/optimize_temp_vars_5.c"
+#include "Optimizer/compact_literals.c"
+#include "Optimizer/optimize_func_calls.c"
-void zend_optimizer(zend_op_array *op_array TSRMLS_DC)
+static void zend_optimize(zend_op_array *op_array,
+ zend_persistent_script *script,
+ HashTable **constants TSRMLS_DC)
{
if (op_array->type == ZEND_EVAL_CODE ||
(op_array->fn_flags & ZEND_ACC_INTERACTIVE)) {
@@ -97,7 +129,6 @@ void zend_optimizer(zend_op_array *op_array TSRMLS_DC)
* - perform compile-time evaluation of constant binary and unary operations
* - optimize series of ADD_STRING and/or ADD_CHAR
* - convert CAST(IS_BOOL,x) into BOOL(x)
- * - convert INTI_FCALL_BY_NAME + DO_FCALL_BY_NAME into DO_FCALL
*/
#include "Optimizer/pass1_5.c"
@@ -115,12 +146,21 @@ void zend_optimizer(zend_op_array *op_array TSRMLS_DC)
*/
#include "Optimizer/pass3.c"
+#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
+ /* pass 4:
+ * - INIT_FCALL_BY_NAME -> DO_FCALL
+ */
+ if (ZEND_OPTIMIZER_PASS_4 & OPTIMIZATION_LEVEL) {
+ optimize_func_calls(op_array, script TSRMLS_CC);
+ }
+#endif
+
/* pass 5:
* - CFG optimization
*/
#include "Optimizer/pass5.c"
- /* pass 9:
+ /* pass 9:
* - Optimize temp variables usage
*/
#include "Optimizer/pass9.c"
@@ -129,4 +169,143 @@ void zend_optimizer(zend_op_array *op_array TSRMLS_DC)
* - remove NOPs
*/
#include "Optimizer/pass10.c"
+
+#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
+ /* pass 11:
+ * - Compact literals table
+ */
+ if (ZEND_OPTIMIZER_PASS_11 & OPTIMIZATION_LEVEL) {
+ optimizer_compact_literals(op_array TSRMLS_CC);
+ }
+#endif
+}
+
+static void zend_accel_optimize(zend_op_array *op_array,
+ zend_persistent_script *script,
+ HashTable **constants TSRMLS_DC)
+{
+ zend_op *opline, *end;
+
+ /* Revert pass_two() */
+ opline = op_array->opcodes;
+ end = opline + op_array->last;
+ while (opline < end) {
+#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
+ if (opline->op1_type == IS_CONST) {
+ opline->op1.constant = opline->op1.literal - op_array->literals;
+ }
+ if (opline->op2_type == IS_CONST) {
+ opline->op2.constant = opline->op2.literal - op_array->literals;
+ }
+#endif
+ switch (opline->opcode) {
+ case ZEND_JMP:
+#if ZEND_EXTENSION_API_NO > PHP_5_2_X_API_NO
+ case ZEND_GOTO:
+#endif
+#if ZEND_EXTENSION_API_NO > PHP_5_4_X_API_NO
+ case ZEND_FAST_CALL:
+#endif
+ ZEND_OP1(opline).opline_num = ZEND_OP1(opline).jmp_addr - op_array->opcodes;
+ break;
+ case ZEND_JMPZ:
+ case ZEND_JMPNZ:
+ case ZEND_JMPZ_EX:
+ case ZEND_JMPNZ_EX:
+#if ZEND_EXTENSION_API_NO > PHP_5_2_X_API_NO
+ case ZEND_JMP_SET:
+#endif
+#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
+ case ZEND_JMP_SET_VAR:
+#endif
+ ZEND_OP2(opline).opline_num = ZEND_OP2(opline).jmp_addr - op_array->opcodes;
+ break;
+ }
+ opline++;
+ }
+
+ /* Do actual optimizations */
+ zend_optimize(op_array, script, constants TSRMLS_CC);
+
+ /* Redo pass_two() */
+ opline = op_array->opcodes;
+ end = opline + op_array->last;
+ while (opline < end) {
+#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
+ if (opline->op1_type == IS_CONST) {
+ opline->op1.zv = &op_array->literals[opline->op1.constant].constant;
+ }
+ if (opline->op2_type == IS_CONST) {
+ opline->op2.zv = &op_array->literals[opline->op2.constant].constant;
+ }
+#endif
+ switch (opline->opcode) {
+ case ZEND_JMP:
+#if ZEND_EXTENSION_API_NO > PHP_5_2_X_API_NO
+ case ZEND_GOTO:
+#endif
+#if ZEND_EXTENSION_API_NO > PHP_5_4_X_API_NO
+ case ZEND_FAST_CALL:
+#endif
+ ZEND_OP1(opline).jmp_addr = &op_array->opcodes[ZEND_OP1(opline).opline_num];
+ break;
+ case ZEND_JMPZ:
+ case ZEND_JMPNZ:
+ case ZEND_JMPZ_EX:
+ case ZEND_JMPNZ_EX:
+#if ZEND_EXTENSION_API_NO > PHP_5_2_X_API_NO
+ case ZEND_JMP_SET:
+#endif
+#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
+ case ZEND_JMP_SET_VAR:
+#endif
+ ZEND_OP2(opline).jmp_addr = &op_array->opcodes[ZEND_OP2(opline).opline_num];
+ break;
+ }
+ ZEND_VM_SET_OPCODE_HANDLER(opline);
+ opline++;
+ }
+}
+
+int zend_accel_script_optimize(zend_persistent_script *script TSRMLS_DC)
+{
+ Bucket *p, *q;
+ HashTable *constants = NULL;
+
+ zend_accel_optimize(&script->main_op_array, script, &constants TSRMLS_CC);
+
+ p = script->function_table.pListHead;
+ while (p) {
+ zend_op_array *op_array = (zend_op_array*)p->pData;
+ zend_accel_optimize(op_array, script, &constants TSRMLS_CC);
+ p = p->pListNext;
+ }
+
+ p = script->class_table.pListHead;
+ while (p) {
+ zend_class_entry *ce = (zend_class_entry*)p->pDataPtr;
+ q = ce->function_table.pListHead;
+ while (q) {
+ zend_op_array *op_array = (zend_op_array*)q->pData;
+ if (op_array->scope == ce) {
+ zend_accel_optimize(op_array, script, &constants TSRMLS_CC);
+ } else if (op_array->type == ZEND_USER_FUNCTION) {
+ zend_op_array *orig_op_array;
+ if (zend_hash_find(&op_array->scope->function_table, q->arKey, q->nKeyLength, (void**)&orig_op_array) == SUCCESS) {
+ HashTable *ht = op_array->static_variables;
+ *op_array = *orig_op_array;
+ op_array->static_variables = ht;
+ }
+ }
+ q = q->pListNext;
+ }
+ p = p->pListNext;
+ }
+
+ if (constants) {
+ zend_hash_destroy(constants);
+ efree(constants);
+ }
+
+ return 1;
}
diff --git a/ext/opcache/Optimizer/zend_optimizer.h b/ext/opcache/Optimizer/zend_optimizer.h
index 98275a20aa..5a3d715ac9 100644
--- a/ext/opcache/Optimizer/zend_optimizer.h
+++ b/ext/opcache/Optimizer/zend_optimizer.h
@@ -28,14 +28,14 @@
#define ZEND_OPTIMIZER_PASS_1 (1<<0) /* CSE, STRING construction */
#define ZEND_OPTIMIZER_PASS_2 (1<<1) /* Constant conversion and jumps */
#define ZEND_OPTIMIZER_PASS_3 (1<<2) /* ++, +=, series of jumps */
-#define ZEND_OPTIMIZER_PASS_4 (1<<3)
+#define ZEND_OPTIMIZER_PASS_4 (1<<3) /* INIT_FCALL_BY_NAME -> DO_FCALL */
#define ZEND_OPTIMIZER_PASS_5 (1<<4) /* CFG based optimization */
#define ZEND_OPTIMIZER_PASS_6 (1<<5)
#define ZEND_OPTIMIZER_PASS_7 (1<<6)
#define ZEND_OPTIMIZER_PASS_8 (1<<7)
#define ZEND_OPTIMIZER_PASS_9 (1<<8) /* TMP VAR usage */
#define ZEND_OPTIMIZER_PASS_10 (1<<9) /* NOP removal */
-#define ZEND_OPTIMIZER_PASS_11 (1<<10)
+#define ZEND_OPTIMIZER_PASS_11 (1<<10) /* Merge equal constants */
#define ZEND_OPTIMIZER_PASS_12 (1<<11)
#define ZEND_OPTIMIZER_PASS_13 (1<<12)
#define ZEND_OPTIMIZER_PASS_14 (1<<13)
@@ -44,6 +44,4 @@
#define DEFAULT_OPTIMIZATION_LEVEL "0xFFFFFFFF"
-void zend_optimizer(zend_op_array *op_array TSRMLS_DC);
-
#endif
diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c
index efd902f431..38b2028cfa 100644
--- a/ext/opcache/ZendAccelerator.c
+++ b/ext/opcache/ZendAccelerator.c
@@ -1126,6 +1126,10 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr
return new_persistent_script;
}
+ if (!zend_accel_script_optimize(new_persistent_script TSRMLS_CC)) {
+ return new_persistent_script;
+ }
+
if (!compact_persistent_script(new_persistent_script)) {
return new_persistent_script;
}
@@ -2744,19 +2748,6 @@ void accelerator_shm_read_unlock(TSRMLS_D)
}
}
-static void accel_op_array_handler(zend_op_array *op_array)
-{
- TSRMLS_FETCH();
-
- if (ZCG(enabled) &&
- accel_startup_ok &&
- ZCSG(accelerator_enabled) &&
- !ZSMMG(memory_exhausted) &&
- !ZCSG(restart_pending)) {
- zend_optimizer(op_array TSRMLS_CC);
- }
-}
-
ZEND_EXT_API zend_extension zend_extension_entry = {
ACCELERATOR_PRODUCT_NAME, /* name */
ACCELERATOR_VERSION, /* version */
@@ -2768,7 +2759,7 @@ ZEND_EXT_API zend_extension zend_extension_entry = {
accel_activate, /* per-script activation */
accel_deactivate, /* per-script deactivation */
NULL, /* message handler */
- accel_op_array_handler, /* op_array handler */
+ NULL, /* op_array handler */
NULL, /* extended statement handler */
NULL, /* extended fcall begin handler */
NULL, /* extended fcall end handler */
diff --git a/ext/opcache/ZendAccelerator.h b/ext/opcache/ZendAccelerator.h
index 733e544e11..06a2cf7f4a 100644
--- a/ext/opcache/ZendAccelerator.h
+++ b/ext/opcache/ZendAccelerator.h
@@ -319,6 +319,7 @@ extern char *zps_api_failure_reason;
void zend_accel_schedule_restart(zend_accel_restart_reason reason TSRMLS_DC);
void zend_accel_schedule_restart_if_necessary(zend_accel_restart_reason reason TSRMLS_DC);
int zend_accel_invalidate(const char *filename, int filename_len, zend_bool force TSRMLS_DC);
+int zend_accel_script_optimize(zend_persistent_script *persistent_script TSRMLS_DC);
int accelerator_shm_read_lock(TSRMLS_D);
void accelerator_shm_read_unlock(TSRMLS_D);
diff --git a/ext/opcache/tests/compact_literals.phpt b/ext/opcache/tests/compact_literals.phpt
new file mode 100644
index 0000000000..a691b912e3
--- /dev/null
+++ b/ext/opcache/tests/compact_literals.phpt
@@ -0,0 +1,215 @@
+--TEST--
+Test with compact literals
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.optimization_level=-1
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+
+echo "array key hash" . ":" . PHP_EOL;
+$array = array(
+ "1" => "one",
+ "2" => "two",
+ "one" => 1,
+ "two" => 2,
+);
+
+unset($array["one"]);
+unset($array["2"]);
+
+print_r($array);
+
+echo "funcion define" . ":" . PHP_EOL;
+if (!function_exists("dummy")) {
+ function dummy() {
+ var_dump(__FUNCTION__);
+ }
+}
+
+dummy();
+
+$dummy = function () { var_dump("lambda" . "dummy"); };
+$dummy();
+
+if (!class_exists("A")) {
+ class A {
+ public static $name = "A";
+ public static function say($n = "name") {
+ var_dump(static::$name);
+ }
+ }
+}
+
+class B extends A {
+ public static $name = "B";
+}
+
+if (!class_exists("C")) {
+ class C extends B {
+ public static $name = "C";
+ }
+}
+
+A::say();
+B::Say();
+A::say();
+B::say();
+C::say();
+
+function get_eol_define() {
+ define("MY_EOL", PHP_EOL);
+}
+get_eol_define();
+define("EOL", MY_EOL);
+
+echo "constants define" . ":" . EOL;
+
+echo "define " . "TEST" . EOL;
+define("TEST", "TEST");
+
+class E {
+ public static $E="EP";
+ const E="E";
+ const TEST="NULL";
+}
+
+class F {
+ const F="F";
+ public static $E="FEP";
+ const E="FE";
+ const TEST="FALSE";
+ public static $F = "FP";
+}
+
+var_dump(TEST); //"TEST"
+var_dump(E::E); //"E"
+var_dump(F::E); //"FE"
+var_dump(F::F); //"F"
+var_dump(E::TEST); //"NULL"
+var_dump(F::TEST); //"FALSE"
+var_dump(E::$E); //"EP"
+var_dumP(F::$F); //"FP"
+var_dumP(F::$E); //"FEP"
+
+echo "propertes and methods" . EOL;
+
+class CH {
+ const H = "H";
+ public function h() {
+ var_dump(self::H);
+ }
+}
+
+class CI {
+ const H = "I";
+ public function h() {
+ var_dump(self::H);
+ }
+}
+
+function change(&$obj) {
+ $obj = new CH;
+}
+
+function geti() {
+ return new CI;
+}
+
+$h = new CH;
+
+echo "-->H" . PHP_EOL;
+$h->H();
+var_dump($h::H);
+var_dump(CH::H);
+
+$h->H();
+var_dump($h::H);
+var_dump(CH::H);
+
+echo "-->I" . PHP_EOL;
+$h = new CI;
+$h->H();
+var_dump($h::H);
+var_dump(CI::H);
+$h->H();
+var_dump($h::H);
+var_dump(CI::H);
+
+echo "-->H" . PHP_EOL;
+change($h);
+
+$h->H();
+var_dump($h::H);
+var_dump(CH::H);
+
+$h->H();
+var_dump($h::H);
+var_dump(CH::H);
+
+echo "-->I" . PHP_EOL;
+$h = geti();
+$h->H();
+var_dump($h::H);
+var_dump(CI::H);
+$h->H();
+var_dump($h::H);
+var_dump(CI::H);
+?>
+--EXPECT--
+array key hash:
+Array
+(
+ [1] => one
+ [two] => 2
+)
+funcion define:
+string(5) "dummy"
+string(11) "lambdadummy"
+string(1) "A"
+string(1) "B"
+string(1) "A"
+string(1) "B"
+string(1) "C"
+constants define:
+define TEST
+string(4) "TEST"
+string(1) "E"
+string(2) "FE"
+string(1) "F"
+string(4) "NULL"
+string(5) "FALSE"
+string(2) "EP"
+string(2) "FP"
+string(3) "FEP"
+propertes and methods
+-->H
+string(1) "H"
+string(1) "H"
+string(1) "H"
+string(1) "H"
+string(1) "H"
+string(1) "H"
+-->I
+string(1) "I"
+string(1) "I"
+string(1) "I"
+string(1) "I"
+string(1) "I"
+string(1) "I"
+-->H
+string(1) "H"
+string(1) "H"
+string(1) "H"
+string(1) "H"
+string(1) "H"
+string(1) "H"
+-->I
+string(1) "I"
+string(1) "I"
+string(1) "I"
+string(1) "I"
+string(1) "I"
+string(1) "I"
diff --git a/ext/opcache/tests/optimize_func_calls.phpt b/ext/opcache/tests/optimize_func_calls.phpt
new file mode 100644
index 0000000000..b3bc8da6a9
--- /dev/null
+++ b/ext/opcache/tests/optimize_func_calls.phpt
@@ -0,0 +1,130 @@
+--TEST--
+Test with optimization of function calls
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.optimization_level=-1
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+
+class A {
+ public $obj;
+ public function test($a) {
+ }
+}
+
+function a(&$b) {
+ $b = "changed";
+ return "done";
+}
+
+$a = "a";
+$b = "b";
+$c = "c";
+$f = "a";
+
+/*
+ * INIT_FCALL_BY_NAME
+ * SEND_VAR
+ * DO_FCALL
+ * DO_FCALL_BY_NAME
+ */
+foo(a($a));
+var_dump($a);
+$a = "a";
+
+/*
+ * INIT_FCALL_BY_NAME
+ * INIT_FCALL_BY_NAME -- un-optimizable
+ * DO_FCALL_BY_NAME -- un-optimizable
+ * DO_FCALL_BY_NAME
+ */
+foo($f($a));
+var_dump($a);
+
+/*
+ * INIT_FCALL_BY_NAME
+ * ZEND_NEW
+ * DO_FCALL_BY_NAME
+ * DO_FCALL_BY_NAME
+ */
+foo(new A());
+
+/*
+ * INIT_FCALL_BY_NAME
+ * FETCH_OBJ_FUNC_ARG
+ * ZEND_SEND_VAR
+ * DO_FCALL_BY_NAME
+ */
+foo((new A)->obj);
+$obj = new A;
+ref($obj->obj);
+var_dump($obj->obj);
+
+ref(retarray()[0]);
+
+$a = "a";
+foo(a($a), $a, ref($b, $c), $obj);
+var_dump($a);
+var_dump($b);
+
+/*
+ * INIT_FCALL_BY_NAME
+ * SEND_VAL
+ * DO_FCALL_BY_NAME
+ */
+ref("xxx");
+
+function retarray() {
+ return array("retarray");
+}
+
+function foo($a) {
+ print_r(func_get_args());
+}
+
+function ref(&$b) {
+ $b = "changed";
+ return "ref";
+}
+--EXPECTF--
+Array
+(
+ [0] => done
+)
+string(7) "changed"
+Array
+(
+ [0] => done
+)
+string(7) "changed"
+Array
+(
+ [0] => A Object
+ (
+ [obj] =>
+ )
+
+)
+Array
+(
+ [0] =>
+)
+string(7) "changed"
+Array
+(
+ [0] => done
+ [1] => changed
+ [2] => ref
+ [3] => A Object
+ (
+ [obj] => changed
+ )
+
+)
+string(7) "changed"
+string(7) "changed"
+
+Fatal error: Cannot pass parameter 1 by reference in %soptimize_func_calls.php on line %d
diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c
index c939c01b2b..68f3aaf19b 100644
--- a/ext/openssl/openssl.c
+++ b/ext/openssl/openssl.c
@@ -391,11 +391,35 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_random_pseudo_bytes, 0, 0, 1)
ZEND_ARG_INFO(0, length)
ZEND_ARG_INFO(1, result_is_strong)
ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_spki_new, 0, 0, 2)
+ ZEND_ARG_INFO(0, privkey)
+ ZEND_ARG_INFO(0, challenge)
+ ZEND_ARG_INFO(0, algo)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO(arginfo_openssl_spki_verify, 0)
+ ZEND_ARG_INFO(0, spki)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO(arginfo_openssl_spki_export, 0)
+ ZEND_ARG_INFO(0, spki)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO(arginfo_openssl_spki_export_challenge, 0)
+ ZEND_ARG_INFO(0, spki)
+ZEND_END_ARG_INFO()
/* }}} */
/* {{{ openssl_functions[]
*/
const zend_function_entry openssl_functions[] = {
+/* spki functions */
+ PHP_FE(openssl_spki_new, arginfo_openssl_spki_new)
+ PHP_FE(openssl_spki_verify, arginfo_openssl_spki_verify)
+ PHP_FE(openssl_spki_export, arginfo_openssl_spki_export)
+ PHP_FE(openssl_spki_export_challenge, arginfo_openssl_spki_export_challenge)
+
/* public/private key functions */
PHP_FE(openssl_pkey_free, arginfo_openssl_pkey_free)
PHP_FE(openssl_pkey_new, arginfo_openssl_pkey_new)
@@ -790,6 +814,7 @@ static int add_oid_section(struct php_x509_request * req TSRMLS_DC) /* {{{ */
static const EVP_CIPHER * php_openssl_get_evp_cipher_from_algo(long algo);
+int openssl_spki_cleanup(const char *src, char *dest);
static int php_openssl_parse_config(struct php_x509_request * req, zval * optional_args TSRMLS_DC) /* {{{ */
{
@@ -1334,6 +1359,280 @@ PHP_FUNCTION(openssl_x509_export_to_file)
}
/* }}} */
+/* {{{ proto string openssl_spki_new(mixed zpkey, string challenge [, mixed method])
+ Creates new private key (or uses existing) and creates a new spki cert
+ outputting results to var */
+PHP_FUNCTION(openssl_spki_new)
+{
+ int challenge_len;
+ char * challenge = NULL, * spkstr = NULL, * s = NULL;
+ long keyresource = -1;
+ const char *spkac = "SPKAC=";
+ long algo = OPENSSL_ALGO_MD5;
+
+ zval *method = NULL;
+ zval * zpkey = NULL;
+ EVP_PKEY * pkey = NULL;
+ NETSCAPE_SPKI *spki=NULL;
+ const EVP_MD *mdtype;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|z", &zpkey, &challenge, &challenge_len, &method) == FAILURE) {
+ return;
+ }
+ RETVAL_FALSE;
+
+ pkey = php_openssl_evp_from_zval(&zpkey, 0, challenge, 1, &keyresource TSRMLS_CC);
+
+ if (pkey == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to use supplied private key");
+ goto cleanup;
+ }
+
+ if (method != NULL) {
+ if (Z_TYPE_P(method) == IS_LONG) {
+ algo = Z_LVAL_P(method);
+ } else {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Algorithm must be of supported type");
+ goto cleanup;
+ }
+ }
+ mdtype = php_openssl_get_evp_md_from_algo(algo);
+
+ if (!mdtype) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown signature algorithm");
+ goto cleanup;
+ }
+
+ if ((spki = NETSCAPE_SPKI_new()) == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to create new SPKAC");
+ goto cleanup;
+ }
+
+ if (challenge) {
+ ASN1_STRING_set(spki->spkac->challenge, challenge, challenge_len);
+ }
+
+ if (!NETSCAPE_SPKI_set_pubkey(spki, pkey)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to embed public key");
+ goto cleanup;
+ }
+
+ if (!NETSCAPE_SPKI_sign(spki, pkey, mdtype)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to sign with specified algorithm");
+ goto cleanup;
+ }
+
+ spkstr = NETSCAPE_SPKI_b64_encode(spki);
+ if (!spkstr){
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to encode SPKAC");
+ goto cleanup;
+ }
+
+ s = emalloc(strlen(spkac) + strlen(spkstr) + 1);
+ sprintf(s, "%s%s", spkac, spkstr);
+
+ RETVAL_STRINGL(s, strlen(s), 0);
+ goto cleanup;
+
+cleanup:
+
+ if (keyresource == -1 && spki != NULL) {
+ NETSCAPE_SPKI_free(spki);
+ }
+ if (keyresource == -1 && pkey != NULL) {
+ EVP_PKEY_free(pkey);
+ }
+ if (keyresource == -1 && spkstr != NULL) {
+ efree(spkstr);
+ }
+
+ if (strlen(s) <= 0) {
+ RETVAL_FALSE;
+ }
+
+ if (keyresource == -1 && s != NULL) {
+ efree(s);
+ }
+}
+/* }}} */
+
+/* {{{ proto bool openssl_spki_verify(string spki)
+ Verifies spki returns boolean */
+PHP_FUNCTION(openssl_spki_verify)
+{
+ int spkstr_len, i = 0;
+ char *spkstr = NULL, * spkstr_cleaned = NULL;
+
+ EVP_PKEY *pkey = NULL;
+ NETSCAPE_SPKI *spki = NULL;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &spkstr, &spkstr_len) == FAILURE) {
+ return;
+ }
+ RETVAL_FALSE;
+
+ if (spkstr == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to use supplied SPKAC");
+ goto cleanup;
+ }
+
+ spkstr_cleaned = emalloc(spkstr_len + 1);
+ openssl_spki_cleanup(spkstr, spkstr_cleaned);
+
+ if (strlen(spkstr_cleaned)<=0) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid SPKAC");
+ goto cleanup;
+ }
+
+ spki = NETSCAPE_SPKI_b64_decode(spkstr_cleaned, strlen(spkstr_cleaned));
+ if (spki == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to decode supplied SPKAC");
+ goto cleanup;
+ }
+
+ pkey = X509_PUBKEY_get(spki->spkac->pubkey);
+ if (pkey == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to aquire signed public key");
+ goto cleanup;
+ }
+
+ i = NETSCAPE_SPKI_verify(spki, pkey);
+ goto cleanup;
+
+cleanup:
+ if (spki != NULL) {
+ NETSCAPE_SPKI_free(spki);
+ }
+ if (pkey != NULL) {
+ EVP_PKEY_free(pkey);
+ }
+ if (spkstr_cleaned != NULL) {
+ efree(spkstr_cleaned);
+ }
+
+ if (i > 0) {
+ RETVAL_TRUE;
+ }
+}
+/* }}} */
+
+/* {{{ proto string openssl_spki_export(string spki)
+ Exports public key from existing spki to var */
+PHP_FUNCTION(openssl_spki_export)
+{
+ int spkstr_len;
+ char *spkstr = NULL, * spkstr_cleaned = NULL, * s = NULL;
+
+ EVP_PKEY *pkey = NULL;
+ NETSCAPE_SPKI *spki = NULL;
+ BIO *out = BIO_new(BIO_s_mem());
+ BUF_MEM *bio_buf;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &spkstr, &spkstr_len) == FAILURE) {
+ return;
+ }
+ RETVAL_FALSE;
+
+ if (spkstr == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to use supplied SPKAC");
+ goto cleanup;
+ }
+
+ spkstr_cleaned = emalloc(spkstr_len + 1);
+ openssl_spki_cleanup(spkstr, spkstr_cleaned);
+
+ spki = NETSCAPE_SPKI_b64_decode(spkstr_cleaned, strlen(spkstr_cleaned));
+ if (spki == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to decode supplied SPKAC");
+ goto cleanup;
+ }
+
+ pkey = X509_PUBKEY_get(spki->spkac->pubkey);
+ if (pkey == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to aquire signed public key");
+ goto cleanup;
+ }
+
+ out = BIO_new_fp(stdout, BIO_NOCLOSE);
+ PEM_write_bio_PUBKEY(out, pkey);
+ goto cleanup;
+
+cleanup:
+
+ if (spki != NULL) {
+ NETSCAPE_SPKI_free(spki);
+ }
+ if (out != NULL) {
+ BIO_free_all(out);
+ }
+ if (pkey != NULL) {
+ EVP_PKEY_free(pkey);
+ }
+ if (spkstr_cleaned != NULL) {
+ efree(spkstr_cleaned);
+ }
+ if (s != NULL) {
+ efree(s);
+ }
+}
+/* }}} */
+
+/* {{{ proto string openssl_spki_export_challenge(string spki)
+ Exports spkac challenge from existing spki to var */
+PHP_FUNCTION(openssl_spki_export_challenge)
+{
+ int spkstr_len;
+ char *spkstr = NULL, * spkstr_cleaned = NULL;
+
+ NETSCAPE_SPKI *spki = NULL;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &spkstr, &spkstr_len) == FAILURE) {
+ return;
+ }
+ RETVAL_FALSE;
+
+ if (spkstr == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to use supplied SPKAC");
+ goto cleanup;
+ }
+
+ spkstr_cleaned = emalloc(spkstr_len + 1);
+ openssl_spki_cleanup(spkstr, spkstr_cleaned);
+
+ spki = NETSCAPE_SPKI_b64_decode(spkstr_cleaned, strlen(spkstr_cleaned));
+ if (spki == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to decode SPKAC");
+ goto cleanup;
+ }
+
+ RETVAL_STRING(ASN1_STRING_data(spki->spkac->challenge), 1);
+ goto cleanup;
+
+cleanup:
+ if (spkstr_cleaned != NULL) {
+ efree(spkstr_cleaned);
+ }
+}
+/* }}} */
+
+/* {{{ strip line endings from spkac */
+int openssl_spki_cleanup(const char *src, char *dest)
+{
+ int removed=0;
+
+ while (*src) {
+ if (*src!='\n'&&*src!='\r') {
+ *dest++=*src;
+ } else {
+ ++removed;
+ }
+ ++src;
+ }
+ *dest=0;
+ return removed;
+}
+/* }}} */
+
/* {{{ proto bool openssl_x509_export(mixed x509, string &out [, bool notext = true])
Exports a CERT to file or a var */
PHP_FUNCTION(openssl_x509_export)
diff --git a/ext/openssl/php_openssl.h b/ext/openssl/php_openssl.h
index e6b064a277..8483bbf762 100644
--- a/ext/openssl/php_openssl.h
+++ b/ext/openssl/php_openssl.h
@@ -79,6 +79,11 @@ PHP_FUNCTION(openssl_csr_export_to_file);
PHP_FUNCTION(openssl_csr_sign);
PHP_FUNCTION(openssl_csr_get_subject);
PHP_FUNCTION(openssl_csr_get_public_key);
+
+PHP_FUNCTION(openssl_spki_new);
+PHP_FUNCTION(openssl_spki_verify);
+PHP_FUNCTION(openssl_spki_export);
+PHP_FUNCTION(openssl_spki_export_challenge);
#else
#define phpext_openssl_ptr NULL
diff --git a/ext/openssl/tests/openssl_spki_export.phpt b/ext/openssl/tests/openssl_spki_export.phpt
new file mode 100644
index 0000000000..59332f70a5
--- /dev/null
+++ b/ext/openssl/tests/openssl_spki_export.phpt
@@ -0,0 +1,62 @@
+--TEST--
+Testing openssl_spki_export()
+Creates SPKAC for all available key sizes & signature algorithms and exports public key
+--SKIPIF--
+<?php
+if (!extension_loaded("openssl")) die("skip");
+if (!@openssl_pkey_new()) die("skip cannot create private key");
+?>
+--FILE--
+<?php
+
+/* array of private key sizes to test */
+$ksize = array('1024'=>1024,
+ '2048'=>2048,
+ '4096'=>4096);
+
+/* array of available hashings to test */
+$algo = array('md4'=>OPENSSL_ALGO_MD4,
+ 'md5'=>OPENSSL_ALGO_MD5,
+ 'sha1'=>OPENSSL_ALGO_SHA1,
+ 'sha224'=>OPENSSL_ALGO_SHA224,
+ 'sha256'=>OPENSSL_ALGO_SHA256,
+ 'sha384'=>OPENSSL_ALGO_SHA384,
+ 'sha512'=>OPENSSL_ALGO_SHA512,
+ 'rmd160'=>OPENSSL_ALGO_RMD160);
+
+/* loop over key sizes for test */
+foreach($ksize as $k => $v) {
+
+ /* generate new private key of specified size to use for tests */
+ $pkey = openssl_pkey_new(array('digest_alg' => 'sha512',
+ 'private_key_type' => OPENSSL_KEYTYPE_RSA,
+ 'private_key_bits' => $v));
+ openssl_pkey_export($pkey, $pass);
+
+ /* loop to create and verify results */
+ foreach($algo as $key => $value) {
+ $spkac = openssl_spki_new($pkey, _uuid(), $value);
+ echo openssl_spki_export(preg_replace('/SPKAC=/', '', $spkac));
+ }
+ openssl_free_key($pkey);
+}
+
+/* generate a random challenge */
+function _uuid()
+{
+ return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff),
+ mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x0fff) | 0x4000,
+ mt_rand(0, 0x3fff) | 0x8000, mt_rand(0, 0xffff),
+ mt_rand(0, 0xffff), mt_rand(0, 0xffff));
+}
+
+?>
+--EXPECTREGEX--
+\-\-\-\-\-BEGIN PUBLIC KEY\-\-\-\-\-.*\-\-\-\-\-END PUBLIC KEY\-\-\-\-\-
+\-\-\-\-\-BEGIN PUBLIC KEY\-\-\-\-\-.*\-\-\-\-\-END PUBLIC KEY\-\-\-\-\-
+\-\-\-\-\-BEGIN PUBLIC KEY\-\-\-\-\-.*\-\-\-\-\-END PUBLIC KEY\-\-\-\-\-
+\-\-\-\-\-BEGIN PUBLIC KEY\-\-\-\-\-.*\-\-\-\-\-END PUBLIC KEY\-\-\-\-\-
+\-\-\-\-\-BEGIN PUBLIC KEY\-\-\-\-\-.*\-\-\-\-\-END PUBLIC KEY\-\-\-\-\-
+\-\-\-\-\-BEGIN PUBLIC KEY\-\-\-\-\-.*\-\-\-\-\-END PUBLIC KEY\-\-\-\-\-
+\-\-\-\-\-BEGIN PUBLIC KEY\-\-\-\-\-.*\-\-\-\-\-END PUBLIC KEY\-\-\-\-\-
+\-\-\-\-\-BEGIN PUBLIC KEY\-\-\-\-\-.*\-\-\-\-\-END PUBLIC KEY\-\-\-\-\-
diff --git a/ext/openssl/tests/openssl_spki_export_challenge.phpt b/ext/openssl/tests/openssl_spki_export_challenge.phpt
new file mode 100644
index 0000000000..71ef62edd5
--- /dev/null
+++ b/ext/openssl/tests/openssl_spki_export_challenge.phpt
@@ -0,0 +1,105 @@
+--TEST--
+Testing openssl_spki_export_challenge()
+Creates SPKAC for all available key sizes & signature algorithms and exports challenge
+--INI--
+error_reporting=0
+--SKIPIF--
+<?php
+if (!extension_loaded("openssl")) die("skip");
+if (!@openssl_pkey_new()) die("skip cannot create private key");
+?>
+--FILE--
+<?php
+
+/* array of private key sizes to test */
+$ksize = array('1024'=>1024,
+ '2048'=>2048,
+ '4096'=>4096);
+
+/* array of available hashings to test */
+$algo = array('md4'=>OPENSSL_ALGO_MD4,
+ 'md5'=>OPENSSL_ALGO_MD5,
+ 'sha1'=>OPENSSL_ALGO_SHA1,
+ 'sha224'=>OPENSSL_ALGO_SHA224,
+ 'sha256'=>OPENSSL_ALGO_SHA256,
+ 'sha384'=>OPENSSL_ALGO_SHA384,
+ 'sha512'=>OPENSSL_ALGO_SHA512,
+ 'rmd160'=>OPENSSL_ALGO_RMD160);
+
+/* loop over key sizes for test */
+foreach($ksize as $k => $v) {
+
+ /* generate new private key of specified size to use for tests */
+ $pkey = openssl_pkey_new(array('digest_alg' => 'sha512',
+ 'private_key_type' => OPENSSL_KEYTYPE_RSA,
+ 'private_key_bits' => $v));
+ openssl_pkey_export($pkey, $pass);
+
+ /* loop to create and verify results */
+ foreach($algo as $key => $value) {
+ $spkac = openssl_spki_new($pkey, _uuid(), $value);
+ var_dump(openssl_spki_export_challenge(preg_replace('/SPKAC=/', '', $spkac)));
+ var_dump(openssl_spki_export_challenge($spkac.'Make it fail'));
+ }
+ openssl_free_key($pkey);
+}
+
+/* generate a random challenge */
+function _uuid()
+{
+ return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff),
+ mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x0fff) | 0x4000,
+ mt_rand(0, 0x3fff) | 0x8000, mt_rand(0, 0xffff),
+ mt_rand(0, 0xffff), mt_rand(0, 0xffff));
+}
+
+?>
+--EXPECTREGEX--
+string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\"
+bool\(false\)
+string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\"
+bool\(false\)
+string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\"
+bool\(false\)
+string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\"
+bool\(false\)
+string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\"
+bool\(false\)
+string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\"
+bool\(false\)
+string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\"
+bool\(false\)
+string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\"
+bool\(false\)
+string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\"
+bool\(false\)
+string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\"
+bool\(false\)
+string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\"
+bool\(false\)
+string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\"
+bool\(false\)
+string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\"
+bool\(false\)
+string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\"
+bool\(false\)
+string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\"
+bool\(false\)
+string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\"
+bool\(false\)
+string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\"
+bool\(false\)
+string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\"
+bool\(false\)
+string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\"
+bool\(false\)
+string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\"
+bool\(false\)
+string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\"
+bool\(false\)
+string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\"
+bool\(false\)
+string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\"
+bool\(false\)
+string\(36\) \"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}\"
+bool\(false\)
diff --git a/ext/openssl/tests/openssl_spki_new.phpt b/ext/openssl/tests/openssl_spki_new.phpt
new file mode 100644
index 0000000000..e40f9bf28e
--- /dev/null
+++ b/ext/openssl/tests/openssl_spki_new.phpt
@@ -0,0 +1,77 @@
+--TEST--
+Testing openssl_spki_new()
+Tests SPKAC for all available private key sizes & hashing algorithms
+--SKIPIF--
+<?php
+if (!extension_loaded("openssl")) die("skip");
+if (!@openssl_pkey_new()) die("skip cannot create private key");
+?>
+--FILE--
+<?php
+
+/* array of private key sizes to test */
+$ksize = array('1024'=>1024,
+ '2048'=>2048,
+ '4096'=>4096);
+
+/* array of available hashings to test */
+$algo = array('md4'=>OPENSSL_ALGO_MD4,
+ 'md5'=>OPENSSL_ALGO_MD5,
+ 'sha1'=>OPENSSL_ALGO_SHA1,
+ 'sha224'=>OPENSSL_ALGO_SHA224,
+ 'sha256'=>OPENSSL_ALGO_SHA256,
+ 'sha384'=>OPENSSL_ALGO_SHA384,
+ 'sha512'=>OPENSSL_ALGO_SHA512,
+ 'rmd160'=>OPENSSL_ALGO_RMD160);
+
+/* loop over key sizes for test */
+foreach($ksize as $k => $v) {
+
+ /* generate new private key of specified size to use for tests */
+ $pkey = openssl_pkey_new(array('digest_alg' => 'sha512',
+ 'private_key_type' => OPENSSL_KEYTYPE_RSA,
+ 'private_key_bits' => $v));
+ openssl_pkey_export($pkey, $pass);
+
+ /* loop to create and verify results */
+ foreach($algo as $key => $value) {
+ var_dump(openssl_spki_new($pkey, _uuid(), $value));
+ }
+ openssl_free_key($pkey);
+}
+
+/* generate a random challenge */
+function _uuid()
+{
+ return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff),
+ mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x0fff) | 0x4000,
+ mt_rand(0, 0x3fff) | 0x8000, mt_rand(0, 0xffff),
+ mt_rand(0, 0xffff), mt_rand(0, 0xffff));
+}
+
+?>
+--EXPECTF--
+string(478) "%s"
+string(478) "%s"
+string(478) "%s"
+string(478) "%s"
+string(478) "%s"
+string(478) "%s"
+string(478) "%s"
+string(474) "%s"
+string(830) "%s"
+string(830) "%s"
+string(830) "%s"
+string(830) "%s"
+string(830) "%s"
+string(830) "%s"
+string(830) "%s"
+string(826) "%s"
+string(1510) "%s"
+string(1510) "%s"
+string(1510) "%s"
+string(1510) "%s"
+string(1510) "%s"
+string(1510) "%s"
+string(1510) "%s"
+string(1506) "%s"
diff --git a/ext/openssl/tests/openssl_spki_verify.phpt b/ext/openssl/tests/openssl_spki_verify.phpt
new file mode 100644
index 0000000000..1ee573fd3f
--- /dev/null
+++ b/ext/openssl/tests/openssl_spki_verify.phpt
@@ -0,0 +1,105 @@
+--TEST--
+Testing openssl_spki_verify()
+Creates SPKAC for all available key sizes & signature algorithms and tests for valid signature
+--INI--
+error_reporting=0
+--SKIPIF--
+<?php
+if (!extension_loaded("openssl")) die("skip");
+if (!@openssl_pkey_new()) die("skip cannot create private key");
+?>
+--FILE--
+<?php
+
+/* array of private key sizes to test */
+$ksize = array('1024'=>1024,
+ '2048'=>2048,
+ '4096'=>4096);
+
+/* array of available hashings to test */
+$algo = array('md4'=>OPENSSL_ALGO_MD4,
+ 'md5'=>OPENSSL_ALGO_MD5,
+ 'sha1'=>OPENSSL_ALGO_SHA1,
+ 'sha224'=>OPENSSL_ALGO_SHA224,
+ 'sha256'=>OPENSSL_ALGO_SHA256,
+ 'sha384'=>OPENSSL_ALGO_SHA384,
+ 'sha512'=>OPENSSL_ALGO_SHA512,
+ 'rmd160'=>OPENSSL_ALGO_RMD160);
+
+/* loop over key sizes for test */
+foreach($ksize as $k => $v) {
+
+ /* generate new private key of specified size to use for tests */
+ $pkey = openssl_pkey_new(array('digest_alg' => 'sha512',
+ 'private_key_type' => OPENSSL_KEYTYPE_RSA,
+ 'private_key_bits' => $v));
+ openssl_pkey_export($pkey, $pass);
+
+ /* loop to create and verify results */
+ foreach($algo as $key => $value) {
+ $spkac = openssl_spki_new($pkey, _uuid(), $value);
+ var_dump(openssl_spki_verify(preg_replace('/SPKAC=/', '', $spkac)));
+ var_dump(openssl_spki_verify($spkac.'Make it fail'));
+ }
+ openssl_free_key($pkey);
+}
+
+/* generate a random challenge */
+function _uuid()
+{
+ return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff),
+ mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x0fff) | 0x4000,
+ mt_rand(0, 0x3fff) | 0x8000, mt_rand(0, 0xffff),
+ mt_rand(0, 0xffff), mt_rand(0, 0xffff));
+}
+
+?>
+--EXPECT--
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false) \ No newline at end of file
diff --git a/ext/pdo/Makefile.frag b/ext/pdo/Makefile.frag
index 5ba5f80840..dc25c9f70b 100644
--- a/ext/pdo/Makefile.frag
+++ b/ext/pdo/Makefile.frag
@@ -2,7 +2,8 @@ phpincludedir=$(prefix)/include/php
PDO_HEADER_FILES= \
php_pdo.h \
- php_pdo_driver.h
+ php_pdo_driver.h \
+ php_pdo_error.h
$(srcdir)/pdo_sql_parser.c: $(srcdir)/pdo_sql_parser.re
diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c
index 25db6842f6..833c608f66 100644
--- a/ext/pdo/pdo_dbh.c
+++ b/ext/pdo/pdo_dbh.c
@@ -101,7 +101,7 @@ void pdo_raise_impl_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char *sqlstate
}
/* }}} */
-void pdo_handle_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */
+PDO_API void pdo_handle_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */
{
pdo_error_type *pdo_err = &dbh->error_code;
const char *msg = "<<Unknown>>";
diff --git a/ext/pdo/php_pdo_error.h b/ext/pdo/php_pdo_error.h
new file mode 100644
index 0000000000..387436af8f
--- /dev/null
+++ b/ext/pdo/php_pdo_error.h
@@ -0,0 +1,47 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Wez Furlong <wez@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifndef PHP_PDO_ERROR_H
+#define PHP_PDO_ERROR_H
+
+#include "php_pdo_driver.h"
+
+PDO_API void pdo_handle_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt TSRMLS_DC);
+
+#define PDO_DBH_CLEAR_ERR() do { \
+ strlcpy(dbh->error_code, PDO_ERR_NONE, sizeof(PDO_ERR_NONE)); \
+ if (dbh->query_stmt) { \
+ dbh->query_stmt = NULL; \
+ zend_objects_store_del_ref(&dbh->query_stmt_zval TSRMLS_CC); \
+ } \
+} while (0)
+#define PDO_STMT_CLEAR_ERR() strcpy(stmt->error_code, PDO_ERR_NONE)
+#define PDO_HANDLE_DBH_ERR() if (strcmp(dbh->error_code, PDO_ERR_NONE)) { pdo_handle_error(dbh, NULL TSRMLS_CC); }
+#define PDO_HANDLE_STMT_ERR() if (strcmp(stmt->error_code, PDO_ERR_NONE)) { pdo_handle_error(stmt->dbh, stmt TSRMLS_CC); }
+
+#endif /* PHP_PDO_ERROR_H */
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
diff --git a/ext/pdo/php_pdo_int.h b/ext/pdo/php_pdo_int.h
index 91d0bf0412..59dbaf9b01 100644
--- a/ext/pdo/php_pdo_int.h
+++ b/ext/pdo/php_pdo_int.h
@@ -23,6 +23,8 @@
/* Stuff private to the PDO extension and not for consumption by PDO drivers
* */
+#include "php_pdo_error.h"
+
extern HashTable pdo_driver_hash;
extern zend_class_entry *pdo_exception_ce;
PDO_API zend_class_entry *php_pdo_get_exception_base(int root TSRMLS_DC);
@@ -55,19 +57,6 @@ zend_object_iterator *php_pdo_dbstmt_iter_get(zend_class_entry *ce, zval *object
extern pdo_driver_t *pdo_find_driver(const char *name, int namelen);
-extern void pdo_handle_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt TSRMLS_DC);
-
-#define PDO_DBH_CLEAR_ERR() do { \
- strlcpy(dbh->error_code, PDO_ERR_NONE, sizeof(PDO_ERR_NONE)); \
- if (dbh->query_stmt) { \
- dbh->query_stmt = NULL; \
- zend_objects_store_del_ref(&dbh->query_stmt_zval TSRMLS_CC); \
- } \
-} while (0)
-#define PDO_STMT_CLEAR_ERR() strcpy(stmt->error_code, PDO_ERR_NONE)
-#define PDO_HANDLE_DBH_ERR() if (strcmp(dbh->error_code, PDO_ERR_NONE)) { pdo_handle_error(dbh, NULL TSRMLS_CC); }
-#define PDO_HANDLE_STMT_ERR() if (strcmp(stmt->error_code, PDO_ERR_NONE)) { pdo_handle_error(stmt->dbh, stmt TSRMLS_CC); }
-
int pdo_sqlstate_init_error_table(void);
void pdo_sqlstate_fini_error_table(void);
const char *pdo_sqlstate_state_to_description(char *state);
diff --git a/ext/pdo_pgsql/pgsql_driver.c b/ext/pdo_pgsql/pgsql_driver.c
index 252bfff25b..80abb4b7c8 100644
--- a/ext/pdo_pgsql/pgsql_driver.c
+++ b/ext/pdo_pgsql/pgsql_driver.c
@@ -27,8 +27,10 @@
#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
+#include "main/php_network.h"
#include "pdo/php_pdo.h"
#include "pdo/php_pdo_driver.h"
+#include "pdo/php_pdo_error.h"
#include "ext/standard/file.h"
#undef PACKAGE_BUGREPORT
@@ -60,7 +62,7 @@ static char * _pdo_pgsql_trim_message(const char *message, int persistent)
return tmp;
}
-int _pdo_pgsql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, int errcode, const char *sqlstate, const char *file, int line TSRMLS_DC) /* {{{ */
+int _pdo_pgsql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, int errcode, const char *sqlstate, const char *msg, const char *file, int line TSRMLS_DC) /* {{{ */
{
pdo_pgsql_db_handle *H = (pdo_pgsql_db_handle *)dbh->driver_data;
pdo_error_type *pdo_err = stmt ? &stmt->error_code : &dbh->error_code;
@@ -83,7 +85,10 @@ int _pdo_pgsql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, int errcode, const char *
strcpy(*pdo_err, sqlstate);
}
- if (errmsg) {
+ if (msg) {
+ einfo->errmsg = estrdup(msg);
+ }
+ else if (errmsg) {
einfo->errmsg = _pdo_pgsql_trim_message(errmsg, dbh->is_persistent);
}
@@ -91,7 +96,7 @@ int _pdo_pgsql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, int errcode, const char *
zend_throw_exception_ex(php_pdo_get_exception(), einfo->errcode TSRMLS_CC, "SQLSTATE[%s] [%d] %s",
*pdo_err, einfo->errcode, einfo->errmsg);
}
-
+
return errcode;
}
/* }}} */
@@ -315,7 +320,7 @@ static int pgsql_handle_quoter(pdo_dbh_t *dbh, const char *unquoted, int unquote
case PDO_PARAM_LOB:
/* escapedlen returned by PQescapeBytea() accounts for trailing 0 */
#ifdef HAVE_PQESCAPE_BYTEA_CONN
- escaped = PQescapeByteaConn(H->server, unquoted, unquotedlen, &tmp_len);
+ escaped = PQescapeByteaConn(H->server, (unsigned char *)unquoted, unquotedlen, &tmp_len);
#else
escaped = PQescapeBytea(unquoted, unquotedlen, &tmp_len);
#endif
@@ -535,11 +540,13 @@ static PHP_METHOD(PDO, pgsqlCopyFromArray)
dbh = zend_object_store_get_object(getThis() TSRMLS_CC);
PDO_CONSTRUCT_CHECK;
+ PDO_DBH_CLEAR_ERR();
+ /* using pre-9.0 syntax as PDO_pgsql is 7.4+ compatible */
if (pg_fields) {
- spprintf(&query, 0, "COPY %s (%s) FROM STDIN DELIMITERS E'%c' WITH NULL AS E'%s'", table_name, pg_fields, (pg_delim_len ? *pg_delim : '\t'), (pg_null_as_len ? pg_null_as : "\\\\N"));
+ spprintf(&query, 0, "COPY %s (%s) FROM STDIN WITH DELIMITER E'%c' NULL AS E'%s'", table_name, pg_fields, (pg_delim_len ? *pg_delim : '\t'), (pg_null_as_len ? pg_null_as : "\\\\N"));
} else {
- spprintf(&query, 0, "COPY %s FROM STDIN DELIMITERS E'%c' WITH NULL AS E'%s'", table_name, (pg_delim_len ? *pg_delim : '\t'), (pg_null_as_len ? pg_null_as : "\\\\N"));
+ spprintf(&query, 0, "COPY %s FROM STDIN WITH DELIMITER E'%c' NULL AS E'%s'", table_name, (pg_delim_len ? *pg_delim : '\t'), (pg_null_as_len ? pg_null_as : "\\\\N"));
}
/* Obtain db Handle */
@@ -583,7 +590,8 @@ static PHP_METHOD(PDO, pgsqlCopyFromArray)
query[query_len] = '\0';
if (PQputCopyData(H->server, query, query_len) != 1) {
efree(query);
- pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, "copy failed");
+ pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, NULL);
+ PDO_HANDLE_DBH_ERR();
RETURN_FALSE;
}
zend_hash_move_forward_ex(Z_ARRVAL_P(pg_rows), &pos);
@@ -593,22 +601,25 @@ static PHP_METHOD(PDO, pgsqlCopyFromArray)
}
if (PQputCopyEnd(H->server, NULL) != 1) {
- pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, "putcopyend failed");
+ pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, NULL);
+ PDO_HANDLE_DBH_ERR();
RETURN_FALSE;
}
while ((pgsql_result = PQgetResult(H->server))) {
if (PGRES_COMMAND_OK != PQresultStatus(pgsql_result)) {
- pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, "Copy command failed");
+ pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, pdo_pgsql_sqlstate(pgsql_result));
command_failed = 1;
}
PQclear(pgsql_result);
}
+ PDO_HANDLE_DBH_ERR();
RETURN_BOOL(!command_failed);
} else {
+ pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, pdo_pgsql_sqlstate(pgsql_result));
PQclear(pgsql_result);
- pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, "Copy command failed");
+ PDO_HANDLE_DBH_ERR();
RETURN_FALSE;
}
}
@@ -637,17 +648,20 @@ static PHP_METHOD(PDO, pgsqlCopyFromFile)
/* Obtain db Handler */
dbh = zend_object_store_get_object(getThis() TSRMLS_CC);
PDO_CONSTRUCT_CHECK;
+ PDO_DBH_CLEAR_ERR();
- stream = php_stream_open_wrapper_ex(filename, "rb", ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL, FG(default_context));
+ stream = php_stream_open_wrapper_ex(filename, "rb", ENFORCE_SAFE_MODE, NULL, FG(default_context));
if (!stream) {
- pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, "Unable to open the file");
+ pdo_pgsql_error_msg(dbh, PGRES_FATAL_ERROR, "Unable to open the file");
+ PDO_HANDLE_DBH_ERR();
RETURN_FALSE;
}
+ /* using pre-9.0 syntax as PDO_pgsql is 7.4+ compatible */
if (pg_fields) {
- spprintf(&query, 0, "COPY %s (%s) FROM STDIN DELIMITERS E'%c' WITH NULL AS E'%s'", table_name, pg_fields, (pg_delim_len ? *pg_delim : '\t'), (pg_null_as_len ? pg_null_as : "\\\\N"));
+ spprintf(&query, 0, "COPY %s (%s) FROM STDIN WITH DELIMITER E'%c' NULL AS E'%s'", table_name, pg_fields, (pg_delim_len ? *pg_delim : '\t'), (pg_null_as_len ? pg_null_as : "\\\\N"));
} else {
- spprintf(&query, 0, "COPY %s FROM STDIN DELIMITERS E'%c' WITH NULL AS E'%s'", table_name, (pg_delim_len ? *pg_delim : '\t'), (pg_null_as_len ? pg_null_as : "\\\\N"));
+ spprintf(&query, 0, "COPY %s FROM STDIN WITH DELIMITER E'%c' NULL AS E'%s'", table_name, (pg_delim_len ? *pg_delim : '\t'), (pg_null_as_len ? pg_null_as : "\\\\N"));
}
H = (pdo_pgsql_db_handle *)dbh->driver_data;
@@ -674,8 +688,9 @@ static PHP_METHOD(PDO, pgsqlCopyFromFile)
while ((buf = php_stream_get_line(stream, NULL, 0, &line_len)) != NULL) {
if (PQputCopyData(H->server, buf, line_len) != 1) {
efree(buf);
- pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, "copy failed");
+ pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, NULL);
php_stream_close(stream);
+ PDO_HANDLE_DBH_ERR();
RETURN_FALSE;
}
efree(buf);
@@ -683,23 +698,26 @@ static PHP_METHOD(PDO, pgsqlCopyFromFile)
php_stream_close(stream);
if (PQputCopyEnd(H->server, NULL) != 1) {
- pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, "putcopyend failed");
+ pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, NULL);
+ PDO_HANDLE_DBH_ERR();
RETURN_FALSE;
}
while ((pgsql_result = PQgetResult(H->server))) {
if (PGRES_COMMAND_OK != PQresultStatus(pgsql_result)) {
- pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, "Copy command failed");
+ pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, pdo_pgsql_sqlstate(pgsql_result));
command_failed = 1;
}
PQclear(pgsql_result);
}
+ PDO_HANDLE_DBH_ERR();
RETURN_BOOL(!command_failed);
} else {
- PQclear(pgsql_result);
php_stream_close(stream);
- pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, "Copy command failed");
+ pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, pdo_pgsql_sqlstate(pgsql_result));
+ PQclear(pgsql_result);
+ PDO_HANDLE_DBH_ERR();
RETURN_FALSE;
}
}
@@ -730,12 +748,14 @@ static PHP_METHOD(PDO, pgsqlCopyToFile)
dbh = zend_object_store_get_object(getThis() TSRMLS_CC);
PDO_CONSTRUCT_CHECK;
+ PDO_DBH_CLEAR_ERR();
H = (pdo_pgsql_db_handle *)dbh->driver_data;
- stream = php_stream_open_wrapper_ex(filename, "wb", ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL, FG(default_context));
+ stream = php_stream_open_wrapper_ex(filename, "wb", ENFORCE_SAFE_MODE, NULL, FG(default_context));
if (!stream) {
- pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, "Unable to open the file for writing");
+ pdo_pgsql_error_msg(dbh, PGRES_FATAL_ERROR, "Unable to open the file for writing");
+ PDO_HANDLE_DBH_ERR();
RETURN_FALSE;
}
@@ -743,10 +763,11 @@ static PHP_METHOD(PDO, pgsqlCopyToFile)
PQclear(pgsql_result);
}
+ /* using pre-9.0 syntax as PDO_pgsql is 7.4+ compatible */
if (pg_fields) {
- spprintf(&query, 0, "COPY %s (%s) TO STDIN DELIMITERS E'%c' WITH NULL AS E'%s'", table_name, pg_fields, (pg_delim_len ? *pg_delim : '\t'), (pg_null_as_len ? pg_null_as : "\\\\N"));
+ spprintf(&query, 0, "COPY %s (%s) TO STDIN WITH DELIMITER E'%c' NULL AS E'%s'", table_name, pg_fields, (pg_delim_len ? *pg_delim : '\t'), (pg_null_as_len ? pg_null_as : "\\\\N"));
} else {
- spprintf(&query, 0, "COPY %s TO STDIN DELIMITERS E'%c' WITH NULL AS E'%s'", table_name, (pg_delim_len ? *pg_delim : '\t'), (pg_null_as_len ? pg_null_as : "\\\\N"));
+ spprintf(&query, 0, "COPY %s TO STDIN WITH DELIMITER E'%c' NULL AS E'%s'", table_name, (pg_delim_len ? *pg_delim : '\t'), (pg_null_as_len ? pg_null_as : "\\\\N"));
}
pgsql_result = PQexec(H->server, query);
efree(query);
@@ -767,16 +788,18 @@ static PHP_METHOD(PDO, pgsqlCopyToFile)
break; /* done */
} else if (ret > 0) {
if (php_stream_write(stream, csv, ret) != ret) {
- pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, "Unable to write to file");
+ pdo_pgsql_error_msg(dbh, PGRES_FATAL_ERROR, "Unable to write to file");
PQfreemem(csv);
php_stream_close(stream);
+ PDO_HANDLE_DBH_ERR();
RETURN_FALSE;
} else {
PQfreemem(csv);
}
} else {
- pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, "Copy command failed: getline failed");
+ pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, NULL);
php_stream_close(stream);
+ PDO_HANDLE_DBH_ERR();
RETURN_FALSE;
}
}
@@ -788,8 +811,9 @@ static PHP_METHOD(PDO, pgsqlCopyToFile)
RETURN_TRUE;
} else {
php_stream_close(stream);
+ pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, pdo_pgsql_sqlstate(pgsql_result));
PQclear(pgsql_result);
- pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, "Copy command failed");
+ PDO_HANDLE_DBH_ERR();
RETURN_FALSE;
}
}
@@ -817,6 +841,7 @@ static PHP_METHOD(PDO, pgsqlCopyToArray)
dbh = zend_object_store_get_object(getThis() TSRMLS_CC);
PDO_CONSTRUCT_CHECK;
+ PDO_DBH_CLEAR_ERR();
H = (pdo_pgsql_db_handle *)dbh->driver_data;
@@ -824,10 +849,11 @@ static PHP_METHOD(PDO, pgsqlCopyToArray)
PQclear(pgsql_result);
}
+ /* using pre-9.0 syntax as PDO_pgsql is 7.4+ compatible */
if (pg_fields) {
- spprintf(&query, 0, "COPY %s (%s) TO STDIN DELIMITERS E'%c' WITH NULL AS E'%s'", table_name, pg_fields, (pg_delim_len ? *pg_delim : '\t'), (pg_null_as_len ? pg_null_as : "\\\\N"));
+ spprintf(&query, 0, "COPY %s (%s) TO STDIN WITH DELIMITER E'%c' NULL AS E'%s'", table_name, pg_fields, (pg_delim_len ? *pg_delim : '\t'), (pg_null_as_len ? pg_null_as : "\\\\N"));
} else {
- spprintf(&query, 0, "COPY %s TO STDIN DELIMITERS E'%c' WITH NULL AS E'%s'", table_name, (pg_delim_len ? *pg_delim : '\t'), (pg_null_as_len ? pg_null_as : "\\\\N"));
+ spprintf(&query, 0, "COPY %s TO STDIN WITH DELIMITER E'%c' NULL AS E'%s'", table_name, (pg_delim_len ? *pg_delim : '\t'), (pg_null_as_len ? pg_null_as : "\\\\N"));
}
pgsql_result = PQexec(H->server, query);
efree(query);
@@ -851,7 +877,8 @@ static PHP_METHOD(PDO, pgsqlCopyToArray)
add_next_index_stringl(return_value, csv, ret, 1);
PQfreemem(csv);
} else {
- pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, "Copy command failed: getline failed");
+ pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, NULL);
+ PDO_HANDLE_DBH_ERR();
RETURN_FALSE;
}
}
@@ -860,8 +887,9 @@ static PHP_METHOD(PDO, pgsqlCopyToArray)
PQclear(pgsql_result);
}
} else {
+ pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, pdo_pgsql_sqlstate(pgsql_result));
PQclear(pgsql_result);
- pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, "Copy command failed");
+ PDO_HANDLE_DBH_ERR();
RETURN_FALSE;
}
}
@@ -878,6 +906,7 @@ static PHP_METHOD(PDO, pgsqlLOBCreate)
dbh = zend_object_store_get_object(getThis() TSRMLS_CC);
PDO_CONSTRUCT_CHECK;
+ PDO_DBH_CLEAR_ERR();
H = (pdo_pgsql_db_handle *)dbh->driver_data;
lfd = lo_creat(H->server, INV_READ|INV_WRITE);
@@ -887,8 +916,9 @@ static PHP_METHOD(PDO, pgsqlLOBCreate)
spprintf(&buf, 0, "%lu", (long) lfd);
RETURN_STRING(buf, 0);
}
-
- pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, "HY000");
+
+ pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, NULL);
+ PDO_HANDLE_DBH_ERR();
RETURN_FALSE;
}
/* }}} */
@@ -924,6 +954,7 @@ static PHP_METHOD(PDO, pgsqlLOBOpen)
dbh = zend_object_store_get_object(getThis() TSRMLS_CC);
PDO_CONSTRUCT_CHECK;
+ PDO_DBH_CLEAR_ERR();
H = (pdo_pgsql_db_handle *)dbh->driver_data;
@@ -936,8 +967,10 @@ static PHP_METHOD(PDO, pgsqlLOBOpen)
return;
}
} else {
- pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, "HY000");
+ pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, NULL);
}
+
+ PDO_HANDLE_DBH_ERR();
RETURN_FALSE;
}
/* }}} */
@@ -964,17 +997,98 @@ static PHP_METHOD(PDO, pgsqlLOBUnlink)
dbh = zend_object_store_get_object(getThis() TSRMLS_CC);
PDO_CONSTRUCT_CHECK;
+ PDO_DBH_CLEAR_ERR();
H = (pdo_pgsql_db_handle *)dbh->driver_data;
-
+
if (1 == lo_unlink(H->server, oid)) {
RETURN_TRUE;
}
- pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, "HY000");
+
+ pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, NULL);
+ PDO_HANDLE_DBH_ERR();
RETURN_FALSE;
}
/* }}} */
+/* {{{ proto mixed PDO::pgsqlGetNotify([ int $result_type = PDO::FETCH_USE_DEFAULT] [, int $ms_timeout = 0 ]])
+ Get asyncronous notification */
+static PHP_METHOD(PDO, pgsqlGetNotify)
+{
+ pdo_dbh_t *dbh;
+ pdo_pgsql_db_handle *H;
+ long result_type = PDO_FETCH_USE_DEFAULT;
+ long ms_timeout = 0;
+ PGnotify *pgsql_notify;
+
+ if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ll",
+ &result_type, &ms_timeout)) {
+ RETURN_FALSE;
+ }
+
+ dbh = zend_object_store_get_object(getThis() TSRMLS_CC);
+ PDO_CONSTRUCT_CHECK;
+
+ if (result_type == PDO_FETCH_USE_DEFAULT) {
+ result_type = dbh->default_fetch_type;
+ }
+
+ if (result_type != PDO_FETCH_BOTH && result_type != PDO_FETCH_ASSOC && result_type != PDO_FETCH_NUM) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid result type");
+ RETURN_FALSE;
+ }
+
+ if (ms_timeout < 0) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid timeout");
+ RETURN_FALSE;
+ }
+
+ H = (pdo_pgsql_db_handle *)dbh->driver_data;
+
+ PQconsumeInput(H->server);
+ pgsql_notify = PQnotifies(H->server);
+
+ if (ms_timeout && !pgsql_notify) {
+ php_pollfd_for_ms(PQsocket(H->server), PHP_POLLREADABLE, ms_timeout);
+
+ PQconsumeInput(H->server);
+ pgsql_notify = PQnotifies(H->server);
+ }
+
+ if (!pgsql_notify) {
+ RETURN_FALSE;
+ }
+
+ array_init(return_value);
+ if (result_type == PDO_FETCH_NUM || result_type == PDO_FETCH_BOTH) {
+ add_index_string(return_value, 0, pgsql_notify->relname, 1);
+ add_index_long(return_value, 1, pgsql_notify->be_pid);
+ }
+ if (result_type == PDO_FETCH_ASSOC || result_type == PDO_FETCH_BOTH) {
+ add_assoc_string(return_value, "message", pgsql_notify->relname, 1);
+ add_assoc_long(return_value, "pid", pgsql_notify->be_pid);
+ }
+
+ PQfreemem(pgsql_notify);
+}
+/* }}} */
+
+/* {{{ proto int PDO::pgsqlGetPid()
+ Get backend(server) pid */
+static PHP_METHOD(PDO, pgsqlGetPid)
+{
+ pdo_dbh_t *dbh;
+ pdo_pgsql_db_handle *H;
+
+ dbh = zend_object_store_get_object(getThis() TSRMLS_CC);
+ PDO_CONSTRUCT_CHECK;
+
+ H = (pdo_pgsql_db_handle *)dbh->driver_data;
+
+ RETURN_LONG(PQbackendPID(H->server));
+}
+/* }}} */
+
static const zend_function_entry dbh_methods[] = {
PHP_ME(PDO, pgsqlLOBCreate, NULL, ZEND_ACC_PUBLIC)
@@ -984,6 +1098,8 @@ static const zend_function_entry dbh_methods[] = {
PHP_ME(PDO, pgsqlCopyFromFile, NULL, ZEND_ACC_PUBLIC)
PHP_ME(PDO, pgsqlCopyToArray, NULL, ZEND_ACC_PUBLIC)
PHP_ME(PDO, pgsqlCopyToFile, NULL, ZEND_ACC_PUBLIC)
+ PHP_ME(PDO, pgsqlGetNotify, NULL, ZEND_ACC_PUBLIC)
+ PHP_ME(PDO, pgsqlGetPid, NULL, ZEND_ACC_PUBLIC)
PHP_FE_END
};
diff --git a/ext/pdo_pgsql/php_pdo_pgsql_int.h b/ext/pdo_pgsql/php_pdo_pgsql_int.h
index 02a6717760..5600a92541 100644
--- a/ext/pdo_pgsql/php_pdo_pgsql_int.h
+++ b/ext/pdo_pgsql/php_pdo_pgsql_int.h
@@ -83,9 +83,11 @@ typedef struct {
extern pdo_driver_t pdo_pgsql_driver;
-extern int _pdo_pgsql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, int errcode, const char *sqlstate, const char *file, int line TSRMLS_DC);
-#define pdo_pgsql_error(d,e,z) _pdo_pgsql_error(d, NULL, e, z, __FILE__, __LINE__ TSRMLS_CC)
-#define pdo_pgsql_error_stmt(s,e,z) _pdo_pgsql_error(s->dbh, s, e, z, __FILE__, __LINE__ TSRMLS_CC)
+extern int _pdo_pgsql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, int errcode, const char *sqlstate, const char *msg, const char *file, int line TSRMLS_DC);
+#define pdo_pgsql_error(d,e,z) _pdo_pgsql_error(d, NULL, e, z, NULL, __FILE__, __LINE__ TSRMLS_CC)
+#define pdo_pgsql_error_msg(d,e,m) _pdo_pgsql_error(d, NULL, e, NULL, m, __FILE__, __LINE__ TSRMLS_CC)
+#define pdo_pgsql_error_stmt(s,e,z) _pdo_pgsql_error(s->dbh, s, e, z, NULL, __FILE__, __LINE__ TSRMLS_CC)
+#define pdo_pgsql_error_stmt_msg(s,e,m) _pdo_pgsql_error(s->dbh, s, e, NULL, m, __FILE__, __LINE__ TSRMLS_CC)
extern struct pdo_stmt_methods pgsql_stmt_methods;
diff --git a/ext/pdo_pgsql/tests/copy_from.phpt b/ext/pdo_pgsql/tests/copy_from.phpt
index 10967b0fe9..de1140dfea 100644
--- a/ext/pdo_pgsql/tests/copy_from.phpt
+++ b/ext/pdo_pgsql/tests/copy_from.phpt
@@ -16,8 +16,6 @@ $db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
$db->exec('CREATE TABLE test (a integer not null primary key, b text, c integer)');
-try {
-
echo "Preparing test file and array for CopyFrom tests\n";
$tableRows = array();
@@ -68,10 +66,13 @@ $db->rollback();
echo "Testing pgsqlCopyFromArray() with error\n";
$db->beginTransaction();
-var_dump($db->pgsqlCopyFromArray('test_error',$tableRowsWithDifferentNullValuesAndSelectedFields,";","NULL",'a,c'));
+try {
+ var_dump($db->pgsqlCopyFromArray('test_error',$tableRowsWithDifferentNullValuesAndSelectedFields,";","NULL",'a,c'));
+} catch (Exception $e) {
+ echo "Exception: {$e->getMessage()}\n";
+}
$db->rollback();
-
echo "Testing pgsqlCopyFromFile() with default parameters\n";
$db->beginTransaction();
var_dump($db->pgsqlCopyFromFile('test',$filename));
@@ -102,14 +103,21 @@ $db->rollback();
echo "Testing pgsqlCopyFromFile() with error\n";
$db->beginTransaction();
-var_dump($db->pgsqlCopyFromFile('test_error',$filenameWithDifferentNullValuesAndSelectedFields,";","NULL",'a,c'));
+try {
+ var_dump($db->pgsqlCopyFromFile('test_error',$filenameWithDifferentNullValuesAndSelectedFields,";","NULL",'a,c'));
+} catch (Exception $e) {
+ echo "Exception: {$e->getMessage()}\n";
+}
$db->rollback();
+echo "Testing pgsqlCopyFromFile() with non existing file\n";
+$db->beginTransaction();
+try {
+ var_dump($db->pgsqlCopyFromFile('test',"nonexisting/foo.csv",";","NULL",'a,c'));
} catch (Exception $e) {
- /* catch exceptions so that we can show the relative error */
- echo "Exception! at line ", $e->getLine(), "\n";
- var_dump($e->getMessage());
+ echo "Exception: {$e->getMessage()}\n";
}
+$db->rollback();
// Clean up
foreach (array($filename, $filenameWithDifferentNullValues, $filenameWithDifferentNullValuesAndSelectedFields) as $f) {
@@ -251,7 +259,7 @@ array(6) {
NULL
}
Testing pgsqlCopyFromArray() with error
-bool(false)
+Exception: SQLSTATE[42P01]: Undefined table: 7 ERROR: relation "test_error" does not exist
Testing pgsqlCopyFromFile() with default parameters
bool(true)
array(6) {
@@ -385,4 +393,7 @@ array(6) {
NULL
}
Testing pgsqlCopyFromFile() with error
-bool(false)
+Exception: SQLSTATE[42P01]: Undefined table: 7 ERROR: relation "test_error" does not exist
+Testing pgsqlCopyFromFile() with non existing file
+Exception: SQLSTATE[HY000]: General error: 7 Unable to open the file
+
diff --git a/ext/pdo_pgsql/tests/copy_to.phpt b/ext/pdo_pgsql/tests/copy_to.phpt
index 1dc7d1de33..7bc46c6e0b 100644
--- a/ext/pdo_pgsql/tests/copy_to.phpt
+++ b/ext/pdo_pgsql/tests/copy_to.phpt
@@ -17,7 +17,6 @@ $db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
$db->exec('CREATE TABLE test (a integer not null primary key, b text, c integer)');
$db->beginTransaction();
-try {
echo "Preparing test table for CopyTo tests\n";
$stmt = $db->prepare("INSERT INTO test (a, b, c) values (?, ?, ?)");
@@ -42,8 +41,11 @@ echo "Testing pgsqlCopyToArray() with only selected fields\n";
var_dump($db->pgsqlCopyToArray('test',";","NULL",'a,c'));
echo "Testing pgsqlCopyToArray() with error\n";
-var_dump($db->pgsqlCopyToArray('test_error'));
-
+try {
+ var_dump($db->pgsqlCopyToArray('test_error'));
+} catch (Exception $e) {
+ echo "Exception: {$e->getMessage()}\n";
+}
echo "Testing pgsqlCopyToFile() with default parameters\n";
@@ -58,14 +60,19 @@ var_dump($db->pgsqlCopyToFile('test',$filename,";","NULL",'a,c'));
echo file_get_contents($filename);
echo "Testing pgsqlCopyToFile() with error\n";
-var_dump($db->pgsqlCopyToFile('test_error',$filename));
-
+try {
+ var_dump($db->pgsqlCopyToFile('test_error',$filename));
+} catch (Exception $e) {
+ echo "Exception: {$e->getMessage()}\n";
+}
+echo "Testing pgsqlCopyToFile() to unwritable file\n";
+try {
+ var_dump($db->pgsqlCopyToFile('test', 'nonexistent/foo.csv'));
} catch (Exception $e) {
- /* catch exceptions so that we can show the relative error */
- echo "Exception! at line ", $e->getLine(), "\n";
- var_dump($e->getMessage());
+ echo "Exception: {$e->getMessage()}\n";
}
+
if(isset($filename)) {
@unlink($filename);
}
@@ -109,7 +116,7 @@ array(3) {
"
}
Testing pgsqlCopyToArray() with error
-bool(false)
+Exception: SQLSTATE[42P01]: Undefined table: 7 ERROR: relation "test_error" does not exist
Testing pgsqlCopyToFile() with default parameters
bool(true)
0 test insert 0 \N
@@ -126,4 +133,7 @@ bool(true)
1;NULL
2;NULL
Testing pgsqlCopyToFile() with error
-bool(false) \ No newline at end of file
+Exception: SQLSTATE[42P01]: Undefined table: 7 ERROR: relation "test_error" does not exist
+Testing pgsqlCopyToFile() to unwritable file
+Exception: SQLSTATE[HY000]: General error: 7 Unable to open the file for writing
+
diff --git a/ext/pdo_pgsql/tests/getnotify.phpt b/ext/pdo_pgsql/tests/getnotify.phpt
new file mode 100644
index 0000000000..c093e0357a
--- /dev/null
+++ b/ext/pdo_pgsql/tests/getnotify.phpt
@@ -0,0 +1,109 @@
+--TEST--
+PDO PgSQL LISTEN/NOTIFY support
+--SKIPIF--
+<?php # vim:se ft=php:
+if (!extension_loaded('pdo') || !extension_loaded('pdo_pgsql')) die('skip not loaded');
+require dirname(__FILE__) . '/config.inc';
+require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
+PDOTest::skip();
+?>
+--FILE--
+<?php
+require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
+$db = PDOTest::test_factory(dirname(__FILE__) . '/common.phpt');
+$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+// pgsqlGetPid should return something meaningful
+$pid = $db->pgsqlGetPid();
+var_dump($pid > 0);
+
+// No listen, no notifies
+var_dump($db->pgsqlGetNotify());
+
+// Listen started, no notifies
+$db->exec("LISTEN notifies_phpt");
+var_dump($db->pgsqlGetNotify());
+
+// No parameters, use default PDO::FETCH_NUM
+$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_NUM);
+$db->exec("NOTIFY notifies_phpt");
+$notify = $db->pgsqlGetNotify();
+var_dump(count($notify));
+var_dump($notify[0]);
+var_dump($notify[1] == $pid);
+
+// No parameters, use default PDO::FETCH_ASSOC
+$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
+$db->exec("NOTIFY notifies_phpt");
+$notify = $db->pgsqlGetNotify();
+var_dump(count($notify));
+var_dump($notify['message']);
+var_dump($notify['pid'] == $pid);
+
+// Test PDO::FETCH_NUM as parameter
+$db->exec("NOTIFY notifies_phpt");
+$notify = $db->pgsqlGetNotify(PDO::FETCH_NUM);
+var_dump(count($notify));
+var_dump($notify[0]);
+var_dump($notify[1] == $pid);
+
+// Test PDO::FETCH_ASSOC as parameter
+$db->exec("NOTIFY notifies_phpt");
+$notify = $db->pgsqlGetNotify(PDO::FETCH_ASSOC);
+var_dump(count($notify));
+var_dump($notify['message']);
+var_dump($notify['pid'] == $pid);
+
+// Test PDO::FETCH_BOTH as parameter
+$db->exec("NOTIFY notifies_phpt");
+$notify = $db->pgsqlGetNotify(PDO::FETCH_BOTH);
+var_dump(count($notify));
+var_dump($notify['message']);
+var_dump($notify['pid'] == $pid);
+var_dump($notify[0]);
+var_dump($notify[1] == $pid);
+
+// Verify that there are no notifies queued
+var_dump($db->pgsqlGetNotify());
+
+
+// Test second parameter, should wait 2 seconds because no notify is queued
+$t = microtime(1);
+$notify = $db->pgsqlGetNotify(PDO::FETCH_ASSOC, 1000);
+var_dump((microtime(1) - $t) >= 1);
+var_dump($notify);
+
+// Test second parameter, should return immediately because a notify is queued
+$db->exec("NOTIFY notifies_phpt");
+$t = microtime(1);
+$notify = $db->pgsqlGetNotify(PDO::FETCH_ASSOC, 5000);
+var_dump((microtime(1) - $t) < 1);
+var_dump(count($notify));
+
+?>
+--EXPECT--
+bool(true)
+bool(false)
+bool(false)
+int(2)
+string(13) "notifies_phpt"
+bool(true)
+int(2)
+string(13) "notifies_phpt"
+bool(true)
+int(2)
+string(13) "notifies_phpt"
+bool(true)
+int(2)
+string(13) "notifies_phpt"
+bool(true)
+int(4)
+string(13) "notifies_phpt"
+bool(true)
+string(13) "notifies_phpt"
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+int(2)
diff --git a/ext/sockets/tests/ipv4loop.phpt b/ext/sockets/tests/ipv4loop.phpt
index 9fdcc17dad..920b27b66e 100644
--- a/ext/sockets/tests/ipv4loop.phpt
+++ b/ext/sockets/tests/ipv4loop.phpt
@@ -13,8 +13,15 @@ IPv4 Loopback test
if (!$server) {
die('Unable to create AF_INET socket [server]');
}
- if (!socket_bind($server, '127.0.0.1', 31337)) {
- die('Unable to bind to 127.0.0.1:31337');
+ $bound = false;
+ for($port = 31337; $port < 31357; ++$port) {
+ if (socket_bind($server, '127.0.0.1', $port)) {
+ $bound = true;
+ break;
+ }
+ }
+ if (!$bound) {
+ die("Unable to bind to 127.0.0.1");
}
if (!socket_listen($server, 2)) {
die('Unable to listen on socket');
@@ -25,7 +32,7 @@ IPv4 Loopback test
if (!$client) {
die('Unable to create AF_INET socket [client]');
}
- if (!socket_connect($client, '127.0.0.1', 31337)) {
+ if (!socket_connect($client, '127.0.0.1', $port)) {
die('Unable to connect to server socket');
}
diff --git a/ext/sockets/tests/ipv6loop.phpt b/ext/sockets/tests/ipv6loop.phpt
index 6967605ffa..4720cb49e4 100644
--- a/ext/sockets/tests/ipv6loop.phpt
+++ b/ext/sockets/tests/ipv6loop.phpt
@@ -14,8 +14,15 @@ IPv6 Loopback test
if (!$server) {
die('Unable to create AF_INET6 socket [server]');
}
- if (!socket_bind($server, '::1', 31337)) {
- die('Unable to bind to [::1]:31337');
+ $bound = false;
+ for($port = 31337; $port < 31357; ++$port) {
+ if (socket_bind($server, '::1', $port)) {
+ $bound = true;
+ break;
+ }
+ }
+ if (!$bound) {
+ die("Unable to bind to [::1]:$port");
}
if (!socket_listen($server, 2)) {
die('Unable to listen on socket');
@@ -26,7 +33,7 @@ IPv6 Loopback test
if (!$client) {
die('Unable to create AF_INET6 socket [client]');
}
- if (!socket_connect($client, '::1', 31337)) {
+ if (!socket_connect($client, '::1', $port)) {
die('Unable to connect to server socket');
}
diff --git a/ext/sockets/tests/socket_getpeername_ipv4loop.phpt b/ext/sockets/tests/socket_getpeername_ipv4loop.phpt
index aa59abb8da..b948e0e7f4 100644
--- a/ext/sockets/tests/socket_getpeername_ipv4loop.phpt
+++ b/ext/sockets/tests/socket_getpeername_ipv4loop.phpt
@@ -14,17 +14,23 @@ ext/sockets - socket_getpeername_ipv4loop - basic test
/* Bind and connect sockets to localhost */
$localhost = '127.0.0.1';
- /* Hold the port associated to address */
- $port = 31337;
-
/* Setup socket server */
$server = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
if (!$server) {
die('Unable to create AF_INET socket [server]');
}
-
- if (!socket_bind($server, $localhost, $port)) {
- die('Unable to bind to '.$localhost.':'.$port);
+
+ $minport = 31337;
+ $maxport = 31356;
+ $bound = false;
+ for($port = $minport; $port <= $maxport; ++$port) {
+ if (socket_bind($server, $localhost, $port)) {
+ $bound = true;
+ break;
+ }
+ }
+ if (!$bound) {
+ die('Unable to bind to '.$localhost);
}
if (!socket_listen($server, 2)) {
die('Unable to listen on socket');
@@ -45,10 +51,10 @@ ext/sockets - socket_getpeername_ipv4loop - basic test
die('Unable to accept connection');
}
- if (!socket_getpeername($client, $address, $port)) {
+ if (!socket_getpeername($client, $address, $peerport)) {
die('Unable to retrieve peer name');
}
- var_dump($address, $port);
+ var_dump($address, $port === $peerport);
socket_close($client);
socket_close($socket);
@@ -56,4 +62,4 @@ ext/sockets - socket_getpeername_ipv4loop - basic test
?>
--EXPECT--
string(9) "127.0.0.1"
-int(31337)
+bool(true)
diff --git a/ext/sockets/tests/socket_getpeername_ipv6loop.phpt b/ext/sockets/tests/socket_getpeername_ipv6loop.phpt
index e865f3e064..5d03e32ce0 100644
--- a/ext/sockets/tests/socket_getpeername_ipv6loop.phpt
+++ b/ext/sockets/tests/socket_getpeername_ipv6loop.phpt
@@ -15,17 +15,23 @@ require 'ipv6_skipif.inc';
/* Bind and connect sockets to localhost */
$localhost = '::1';
- /* Hold the port associated to address */
- $port = 31337;
-
/* Setup socket server */
$server = socket_create(AF_INET6, SOCK_STREAM, getprotobyname('tcp'));
if (!$server) {
die('Unable to create AF_INET6 socket [server]');
}
-
- if (!socket_bind($server, $localhost, $port)) {
- die('Unable to bind to '.$localhost.':'.$port);
+
+ $minport = 31337;
+ $maxport = 31356;
+ $bound = false;
+ for($port = $minport; $port <= $maxport; ++$port) {
+ if (socket_bind($server, $localhost, $port)) {
+ $bound = true;
+ break;
+ }
+ }
+ if (!$bound) {
+ die('Unable to bind to '.$localhost);
}
if (!socket_listen($server, 2)) {
die('Unable to listen on socket');
@@ -46,10 +52,10 @@ require 'ipv6_skipif.inc';
die('Unable to accept connection');
}
- if (!socket_getpeername($client, $address, $port)) {
+ if (!socket_getpeername($client, $address, $peerport)) {
die('Unable to retrieve peer name');
}
- var_dump($address, $port);
+ var_dump($address, $port === $peerport);
socket_close($client);
socket_close($socket);
@@ -57,4 +63,4 @@ require 'ipv6_skipif.inc';
?>
--EXPECT--
string(3) "::1"
-int(31337)
+bool(true)
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c
index 9c91404eff..1379117745 100644
--- a/ext/standard/basic_functions.c
+++ b/ext/standard/basic_functions.c
@@ -2679,6 +2679,7 @@ ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO(arginfo_unserialize, 0)
ZEND_ARG_INFO(0, variable_representation)
+ ZEND_ARG_INFO(1, consumed)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_memory_get_usage, 0, 0, 0)
diff --git a/ext/standard/credits_ext.h b/ext/standard/credits_ext.h
index 2770d162fb..382e70e7d7 100644
--- a/ext/standard/credits_ext.h
+++ b/ext/standard/credits_ext.h
@@ -42,8 +42,8 @@ CREDIT_LINE("MS SQL", "Frank M. Kromann");
CREDIT_LINE("Multibyte String Functions", "Tsukada Takuya, Rui Hirokawa");
CREDIT_LINE("MySQL driver for PDO", "George Schlossnagle, Wez Furlong, Ilia Alshanetsky, Johannes Schlueter");
CREDIT_LINE("MySQLi", "Zak Greant, Georg Richter, Andrey Hristov, Ulf Wendel");
-CREDIT_LINE("MySQLnd", "Andrey Hristov, Ulf Wendel, Georg Richter, Johannes Schlueter");
-CREDIT_LINE("MySQL", "Zeev Suraski, Zak Greant, Georg Richter, Andrey Hristov");
+CREDIT_LINE("MySQLnd", "Andrey Hristov, Ulf Wendel, Georg Richter");
+CREDIT_LINE("MySQL", "Zeev Suraski, Zak Greant, Georg Richter");
CREDIT_LINE("OCI8", "Stig Bakken, Thies C. Arntzen, Andy Sautins, David Benson, Maxim Maletsky, Harald Radi, Antony Dovgal, Andi Gutmans, Wez Furlong, Christopher Jones, Oracle Corporation");
CREDIT_LINE("ODBC driver for PDO", "Wez Furlong");
CREDIT_LINE("ODBC", "Stig Bakken, Andreas Karajannis, Frank M. Kromann, Daniel R. Kalowsky");
diff --git a/ext/standard/dir.c b/ext/standard/dir.c
index ef28e9feaf..55326dbdd3 100644
--- a/ext/standard/dir.c
+++ b/ext/standard/dir.c
@@ -492,9 +492,7 @@ PHP_FUNCTION(glob)
if (!globbuf.gl_pathc || !globbuf.gl_pathv) {
no_results:
if (PG(open_basedir) && *PG(open_basedir)) {
- struct stat s;
-
- if (0 != VCWD_STAT(pattern, &s) || S_IFDIR != (s.st_mode & S_IFMT)) {
+ if (php_check_open_basedir_ex(pattern, 0 TSRMLS_CC)) {
RETURN_FALSE;
}
}
diff --git a/ext/standard/tests/serialize/serialization_error_001.phpt b/ext/standard/tests/serialize/serialization_error_001.phpt
index da6f50cc02..c6c17512f3 100644
--- a/ext/standard/tests/serialize/serialization_error_001.phpt
+++ b/ext/standard/tests/serialize/serialization_error_001.phpt
@@ -21,7 +21,7 @@ var_dump( unserialize() );
//Test serialize with one more than the expected number of arguments
var_dump( serialize(1,2) );
-var_dump( unserialize(1,2) );
+var_dump( unserialize(1,$x,2) );
echo "Done";
?>
@@ -31,12 +31,12 @@ echo "Done";
Warning: serialize() expects exactly 1 parameter, 0 given in %s on line 16
NULL
-Warning: unserialize() expects exactly 1 parameter, 0 given in %s on line 17
+Warning: unserialize() expects at least 1 parameter, 0 given in %s on line 17
bool(false)
Warning: serialize() expects exactly 1 parameter, 2 given in %s on line 20
NULL
-Warning: unserialize() expects exactly 1 parameter, 2 given in %s on line 21
+Warning: unserialize() expects at most 2 parameters, 3 given in %s on line 21
bool(false)
Done
diff --git a/ext/standard/tests/serialize/unserialize_consumed.phpt b/ext/standard/tests/serialize/unserialize_consumed.phpt
new file mode 100644
index 0000000000..6cc11e273f
--- /dev/null
+++ b/ext/standard/tests/serialize/unserialize_consumed.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Unserialization of partial strings
+--FILE--
+<?php
+$data = [123,4.56,true];
+$ser = serialize($data);
+$serlen = strlen($ser);
+
+$unser = unserialize($ser, $consumed);
+echo "Consume full string: ";
+var_dump($serlen == $consumed);
+echo "Return original data: ";
+var_dump($unser === $data);
+
+$ser .= "junk\x01data";
+$unser = unserialize($ser, $consumed);
+echo "Consume full string(junk): ";
+var_dump($serlen == $consumed);
+echo "Return original data(junk): ";
+var_dump($unser === $data);
+
+--EXPECT--
+Consume full string: bool(true)
+Return original data: bool(true)
+Consume full string(junk): bool(true)
+Return original data(junk): bool(true)
+
diff --git a/ext/standard/tests/url/parse_url_basic_001.phpt b/ext/standard/tests/url/parse_url_basic_001.phpt
index 1edc32eaba..4c5b0944c6 100644
--- a/ext/standard/tests/url/parse_url_basic_001.phpt
+++ b/ext/standard/tests/url/parse_url_basic_001.phpt
@@ -743,6 +743,13 @@ echo "Done";
string(1) ":"
}
+--> http://::#: array(2) {
+ ["scheme"]=>
+ string(4) "http"
+ ["host"]=>
+ string(1) ":"
+}
+
--> x://::6.5: array(3) {
["scheme"]=>
string(1) "x"
@@ -856,6 +863,8 @@ echo "Done";
--> http://?: bool(false)
+--> http://#: bool(false)
+
--> http://?:: bool(false)
--> http://:?: bool(false)
@@ -863,4 +872,4 @@ echo "Done";
--> http://blah.com:123456: bool(false)
--> http://blah.com:abcdef: bool(false)
-Done \ No newline at end of file
+Done
diff --git a/ext/standard/tests/url/parse_url_basic_002.phpt b/ext/standard/tests/url/parse_url_basic_002.phpt
index 464e977ffc..ed0f08a84f 100644
--- a/ext/standard/tests/url/parse_url_basic_002.phpt
+++ b/ext/standard/tests/url/parse_url_basic_002.phpt
@@ -96,6 +96,7 @@ echo "Done";
--> x:/blah.com : string(1) "x"
--> x://::abc/? : bool(false)
--> http://::? : string(4) "http"
+--> http://::# : string(4) "http"
--> x://::6.5 : string(1) "x"
--> http://?:/ : string(4) "http"
--> http://@?:/ : string(4) "http"
@@ -118,8 +119,9 @@ echo "Done";
--> http://@:/ : bool(false)
--> http://:/ : bool(false)
--> http://? : bool(false)
+--> http://# : bool(false)
--> http://?: : bool(false)
--> http://:? : bool(false)
--> http://blah.com:123456 : bool(false)
--> http://blah.com:abcdef : bool(false)
-Done \ No newline at end of file
+Done
diff --git a/ext/standard/tests/url/parse_url_basic_003.phpt b/ext/standard/tests/url/parse_url_basic_003.phpt
index 57f182bfa3..a2bbfa6482 100644
--- a/ext/standard/tests/url/parse_url_basic_003.phpt
+++ b/ext/standard/tests/url/parse_url_basic_003.phpt
@@ -95,6 +95,7 @@ echo "Done";
--> x:/blah.com : NULL
--> x://::abc/? : bool(false)
--> http://::? : string(1) ":"
+--> http://::# : string(1) ":"
--> x://::6.5 : string(1) ":"
--> http://?:/ : string(1) "?"
--> http://@?:/ : string(1) "?"
@@ -117,8 +118,9 @@ echo "Done";
--> http://@:/ : bool(false)
--> http://:/ : bool(false)
--> http://? : bool(false)
+--> http://# : bool(false)
--> http://?: : bool(false)
--> http://:? : bool(false)
--> http://blah.com:123456 : bool(false)
--> http://blah.com:abcdef : bool(false)
-Done \ No newline at end of file
+Done
diff --git a/ext/standard/tests/url/parse_url_basic_004.phpt b/ext/standard/tests/url/parse_url_basic_004.phpt
index 6abf4ed453..839ebee554 100644
--- a/ext/standard/tests/url/parse_url_basic_004.phpt
+++ b/ext/standard/tests/url/parse_url_basic_004.phpt
@@ -95,6 +95,7 @@ echo "Done";
--> x:/blah.com : NULL
--> x://::abc/? : bool(false)
--> http://::? : NULL
+--> http://::# : NULL
--> x://::6.5 : int(6)
--> http://?:/ : NULL
--> http://@?:/ : NULL
@@ -117,8 +118,9 @@ echo "Done";
--> http://@:/ : bool(false)
--> http://:/ : bool(false)
--> http://? : bool(false)
+--> http://# : bool(false)
--> http://?: : bool(false)
--> http://:? : bool(false)
--> http://blah.com:123456 : bool(false)
--> http://blah.com:abcdef : bool(false)
-Done \ No newline at end of file
+Done
diff --git a/ext/standard/tests/url/parse_url_basic_005.phpt b/ext/standard/tests/url/parse_url_basic_005.phpt
index 3bcc89106d..c113461fe7 100644
--- a/ext/standard/tests/url/parse_url_basic_005.phpt
+++ b/ext/standard/tests/url/parse_url_basic_005.phpt
@@ -95,6 +95,7 @@ echo "Done";
--> x:/blah.com : NULL
--> x://::abc/? : bool(false)
--> http://::? : NULL
+--> http://::# : NULL
--> x://::6.5 : NULL
--> http://?:/ : NULL
--> http://@?:/ : string(0) ""
@@ -117,8 +118,9 @@ echo "Done";
--> http://@:/ : bool(false)
--> http://:/ : bool(false)
--> http://? : bool(false)
+--> http://# : bool(false)
--> http://?: : bool(false)
--> http://:? : bool(false)
--> http://blah.com:123456 : bool(false)
--> http://blah.com:abcdef : bool(false)
-Done \ No newline at end of file
+Done
diff --git a/ext/standard/tests/url/parse_url_basic_006.phpt b/ext/standard/tests/url/parse_url_basic_006.phpt
index 741a424a61..24de1cc233 100644
--- a/ext/standard/tests/url/parse_url_basic_006.phpt
+++ b/ext/standard/tests/url/parse_url_basic_006.phpt
@@ -95,6 +95,7 @@ echo "Done";
--> x:/blah.com : NULL
--> x://::abc/? : bool(false)
--> http://::? : NULL
+--> http://::# : NULL
--> x://::6.5 : NULL
--> http://?:/ : NULL
--> http://@?:/ : NULL
@@ -117,8 +118,9 @@ echo "Done";
--> http://@:/ : bool(false)
--> http://:/ : bool(false)
--> http://? : bool(false)
+--> http://# : bool(false)
--> http://?: : bool(false)
--> http://:? : bool(false)
--> http://blah.com:123456 : bool(false)
--> http://blah.com:abcdef : bool(false)
-Done \ No newline at end of file
+Done
diff --git a/ext/standard/tests/url/parse_url_basic_007.phpt b/ext/standard/tests/url/parse_url_basic_007.phpt
index bf8f98042e..d4006879f4 100644
--- a/ext/standard/tests/url/parse_url_basic_007.phpt
+++ b/ext/standard/tests/url/parse_url_basic_007.phpt
@@ -95,6 +95,7 @@ echo "Done";
--> x:/blah.com : string(9) "/blah.com"
--> x://::abc/? : bool(false)
--> http://::? : NULL
+--> http://::# : NULL
--> x://::6.5 : NULL
--> http://?:/ : string(1) "/"
--> http://@?:/ : string(1) "/"
@@ -117,8 +118,9 @@ echo "Done";
--> http://@:/ : bool(false)
--> http://:/ : bool(false)
--> http://? : bool(false)
+--> http://# : bool(false)
--> http://?: : bool(false)
--> http://:? : bool(false)
--> http://blah.com:123456 : bool(false)
--> http://blah.com:abcdef : bool(false)
-Done \ No newline at end of file
+Done
diff --git a/ext/standard/tests/url/parse_url_basic_008.phpt b/ext/standard/tests/url/parse_url_basic_008.phpt
index a61fd06943..b283829c46 100644
--- a/ext/standard/tests/url/parse_url_basic_008.phpt
+++ b/ext/standard/tests/url/parse_url_basic_008.phpt
@@ -95,6 +95,7 @@ echo "Done";
--> x:/blah.com : NULL
--> x://::abc/? : bool(false)
--> http://::? : NULL
+--> http://::# : NULL
--> x://::6.5 : NULL
--> http://?:/ : NULL
--> http://@?:/ : NULL
@@ -117,8 +118,9 @@ echo "Done";
--> http://@:/ : bool(false)
--> http://:/ : bool(false)
--> http://? : bool(false)
+--> http://# : bool(false)
--> http://?: : bool(false)
--> http://:? : bool(false)
--> http://blah.com:123456 : bool(false)
--> http://blah.com:abcdef : bool(false)
-Done \ No newline at end of file
+Done
diff --git a/ext/standard/tests/url/parse_url_basic_009.phpt b/ext/standard/tests/url/parse_url_basic_009.phpt
index 5302388f6f..a7d70f34da 100644
--- a/ext/standard/tests/url/parse_url_basic_009.phpt
+++ b/ext/standard/tests/url/parse_url_basic_009.phpt
@@ -95,6 +95,7 @@ echo "Done";
--> x:/blah.com : NULL
--> x://::abc/? : bool(false)
--> http://::? : NULL
+--> http://::# : NULL
--> x://::6.5 : NULL
--> http://?:/ : NULL
--> http://@?:/ : NULL
@@ -117,8 +118,9 @@ echo "Done";
--> http://@:/ : bool(false)
--> http://:/ : bool(false)
--> http://? : bool(false)
+--> http://# : bool(false)
--> http://?: : bool(false)
--> http://:? : bool(false)
--> http://blah.com:123456 : bool(false)
--> http://blah.com:abcdef : bool(false)
-Done \ No newline at end of file
+Done
diff --git a/ext/standard/tests/url/urls.inc b/ext/standard/tests/url/urls.inc
index 27521c8520..4192f4a869 100644
--- a/ext/standard/tests/url/urls.inc
+++ b/ext/standard/tests/url/urls.inc
@@ -75,6 +75,7 @@ $urls = array(
'x:/blah.com',
'x://::abc/?',
'http://::?',
+'http://::#',
'x://::6.5',
'http://?:/',
'http://@?:/',
@@ -99,6 +100,7 @@ $urls = array(
'http://@:/',
'http://:/',
'http://?',
+'http://#',
'http://?:',
'http://:?',
'http://blah.com:123456',
@@ -106,4 +108,4 @@ $urls = array(
);
-?> \ No newline at end of file
+?>
diff --git a/ext/standard/var.c b/ext/standard/var.c
index f76a14cfa6..4acc6f57b7 100644
--- a/ext/standard/var.c
+++ b/ext/standard/var.c
@@ -945,7 +945,7 @@ PHP_FUNCTION(serialize)
}
/* }}} */
-/* {{{ proto mixed unserialize(string variable_representation)
+/* {{{ proto mixed unserialize(string variable_representation[, int &consumed])
Takes a string representation of variable and recreates it */
PHP_FUNCTION(unserialize)
{
@@ -953,8 +953,9 @@ PHP_FUNCTION(unserialize)
int buf_len;
const unsigned char *p;
php_unserialize_data_t var_hash;
+ zval *consumed = NULL;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &buf, &buf_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|z", &buf, &buf_len, &consumed) == FAILURE) {
RETURN_FALSE;
}
@@ -973,6 +974,11 @@ PHP_FUNCTION(unserialize)
RETURN_FALSE;
}
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
+
+ if (consumed) {
+ zval_dtor(consumed);
+ ZVAL_LONG(consumed, ((char*)p) - buf);
+ }
}
/* }}} */
diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c
index 37a0cdea19..b73082ba71 100644
--- a/ext/zip/php_zip.c
+++ b/ext/zip/php_zip.c
@@ -417,7 +417,7 @@ static int php_zip_parse_options(zval *options, long *remove_all_path,
ze_zip_object *obj = (ze_zip_object*) zend_object_store_get_object(object TSRMLS_CC); \
intern = obj->za; \
if (!intern) { \
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid or unitialized Zip object"); \
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid or uninitialized Zip object"); \
RETURN_FALSE; \
} \
}
diff --git a/ext/zlib/tests/gzseek_basic2.phpt b/ext/zlib/tests/gzseek_basic2.phpt
index a815b8ff41..82d305d0fb 100644
--- a/ext/zlib/tests/gzseek_basic2.phpt
+++ b/ext/zlib/tests/gzseek_basic2.phpt
@@ -8,7 +8,7 @@ if (!extension_loaded("zlib")) {
?>
--FILE--
<?php
-$f = "temp3.txt.gz";
+$f = "gzseek_basic2.gz";
$h = gzopen($f, 'w');
$str1 = "This is the first line.";
$str2 = "This is the second line.";
@@ -39,4 +39,4 @@ reading the output file
This is the first line.
string(40) "0000000000000000000000000000000000000000"
This is the second line.
-===DONE=== \ No newline at end of file
+===DONE===
diff --git a/ext/zlib/tests/gzseek_variation1.phpt b/ext/zlib/tests/gzseek_variation1.phpt
index 301b57d151..b260783f11 100644
--- a/ext/zlib/tests/gzseek_variation1.phpt
+++ b/ext/zlib/tests/gzseek_variation1.phpt
@@ -8,7 +8,7 @@ if (!extension_loaded("zlib")) {
?>
--FILE--
<?php
-$f = "temp3.txt.gz";
+$f = "gzseek_variation1.gz";
$h = gzopen($f, 'w');
$str1 = "This is the first line.";
$str2 = "This is the second line.";
@@ -30,4 +30,4 @@ unlink($f);
This is the first line.
string(40) "0000000000000000000000000000000000000000"
This is the second line.
-===DONE=== \ No newline at end of file
+===DONE===
diff --git a/ext/zlib/tests/gzseek_variation4.phpt b/ext/zlib/tests/gzseek_variation4.phpt
index fc641f6c82..3d0cf67ceb 100644
--- a/ext/zlib/tests/gzseek_variation4.phpt
+++ b/ext/zlib/tests/gzseek_variation4.phpt
@@ -8,7 +8,7 @@ if (!extension_loaded("zlib")) {
?>
--FILE--
<?php
-$f = "temp3.txt.gz";
+$f = "gzseek_variation5.gz";
$h = gzopen($f, 'w');
$str1 = "This is the first line.";
$str2 = "This is the second line.";
@@ -39,4 +39,4 @@ reading the output file
This is the first line.
string(40) "0000000000000000000000000000000000000000"
This is the second line.
-===DONE=== \ No newline at end of file
+===DONE===
diff --git a/ext/zlib/tests/gzseek_variation5.phpt b/ext/zlib/tests/gzseek_variation5.phpt
index 0167e204c2..93fb19fdbb 100644
--- a/ext/zlib/tests/gzseek_variation5.phpt
+++ b/ext/zlib/tests/gzseek_variation5.phpt
@@ -8,7 +8,7 @@ if (!extension_loaded("zlib")) {
?>
--FILE--
<?php
-$f = "temp3.txt.gz";
+$f = "gzseek_variation5.gz";
$h = gzopen($f, 'w');
$str1 = "This is the first line.";
$str2 = "This is the second line.";
@@ -39,4 +39,4 @@ reading the output file
This is the first line.
string(40) "0000000000000000000000000000000000000000"
This is the second line.
-===DONE=== \ No newline at end of file
+===DONE===
diff --git a/ext/zlib/tests/gzseek_variation7.phpt b/ext/zlib/tests/gzseek_variation7.phpt
index aab0834652..a365272ba2 100644
--- a/ext/zlib/tests/gzseek_variation7.phpt
+++ b/ext/zlib/tests/gzseek_variation7.phpt
@@ -8,7 +8,7 @@ if (!extension_loaded("zlib")) {
?>
--FILE--
<?php
-$f = "temp3.txt.gz";
+$f = "gzseek_variation7.gz";
$h = gzopen($f, 'w');
$str1 = "This is the first line.";
$str2 = "This is the second line.";
@@ -44,4 +44,4 @@ tell=int(47)
reading the output file
This is the first line.This is the second line.
-===DONE=== \ No newline at end of file
+===DONE===
diff --git a/main/main.c b/main/main.c
index 90474cd8ee..de794ace99 100644
--- a/main/main.c
+++ b/main/main.c
@@ -1335,7 +1335,7 @@ PHPAPI int php_stream_open_for_zend_ex(const char *filename, zend_file_handle *h
handle->handle.stream.reader = (zend_stream_reader_t)_php_stream_read;
handle->handle.stream.fsizer = php_zend_stream_fsizer;
handle->handle.stream.isatty = 0;
- /* can we mmap immeadiately? */
+ /* can we mmap immediately? */
memset(&handle->handle.stream.mmap, 0, sizeof(handle->handle.stream.mmap));
len = php_zend_stream_fsizer(stream TSRMLS_CC);
if (len != 0
@@ -2187,7 +2187,7 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod
zend_set_utility_values(&zuv);
php_startup_sapi_content_types(TSRMLS_C);
- /* startup extensions staticly compiled in */
+ /* startup extensions statically compiled in */
if (php_register_internal_extensions_func(TSRMLS_C) == FAILURE) {
php_printf("Unable to start builtin modules\n");
return FAILURE;
diff --git a/main/php_version.h b/main/php_version.h
index d4d4fe05eb..d48bf13c6f 100644
--- a/main/php_version.h
+++ b/main/php_version.h
@@ -1,8 +1,8 @@
/* automatically generated by configure */
/* edit configure.in to change version number */
#define PHP_MAJOR_VERSION 5
-#define PHP_MINOR_VERSION 5
-#define PHP_RELEASE_VERSION 1
+#define PHP_MINOR_VERSION 6
+#define PHP_RELEASE_VERSION 0
#define PHP_EXTRA_VERSION "-dev"
-#define PHP_VERSION "5.5.1-dev"
-#define PHP_VERSION_ID 50501
+#define PHP_VERSION "5.6.0-dev"
+#define PHP_VERSION_ID 50600
diff --git a/php.ini-development b/php.ini-development
index b7f0b30359..8e866c662f 100644
--- a/php.ini-development
+++ b/php.ini-development
@@ -78,11 +78,13 @@
; compatibility with older or less security conscience applications. We
; recommending using the production ini in production and testing environments.
-; php.ini-development is very similar to its production variant, except it's
-; much more verbose when it comes to errors. We recommending using the
-; development version only in development environments as errors shown to
+; php.ini-development is very similar to its production variant, except it is
+; much more verbose when it comes to errors. We recommend using the
+; development version only in development environments, as errors shown to
; application users can inadvertently leak otherwise secure information.
+; This is php.ini-development INI file.
+
;;;;;;;;;;;;;;;;;;;
; Quick Reference ;
;;;;;;;;;;;;;;;;;;;
@@ -197,13 +199,13 @@
engine = On
; This directive determines whether or not PHP will recognize code between
-; <? and ?> tags as PHP source which should be processed as such. It's been
-; recommended for several years that you not use the short tag "short cut" and
-; instead to use the full <?php and ?> tag combination. With the wide spread use
+; <? and ?> tags as PHP source which should be processed as such. For several
+; years we recommended that you not use the short tag shortcut and
+; instead to use the full <?php and ?> tag combination. With the widespread use
; of XML and use of these tags by other languages, the server can become easily
-; confused and end up parsing the wrong code in the wrong context. But because
-; this short cut has been a feature for such a long time, it's currently still
-; supported for backwards compatibility, but we recommend you don't use them.
+; confused and end up parsing the wrong code in the wrong context.
+; This shortcut is still supported for backwards compatibility, but we
+; recommend against its use.
; Default Value: On
; Development Value: Off
; Production Value: Off
@@ -432,7 +434,7 @@ memory_limit = 128M
; E_NOTICE - run-time notices (these are warnings which often result
; from a bug in your code, but it's possible that it was
; intentional (e.g., using an uninitialized variable and
-; relying on the fact it's automatically initialized to an
+; relying on the fact it is automatically initialized to an
; empty string)
; E_STRICT - run-time notices, enable to have PHP suggest changes
; to your code which will ensure the best interoperability
@@ -465,8 +467,8 @@ error_reporting = E_ALL
; it could be very dangerous in production environments. Depending on the code
; which is triggering the error, sensitive information could potentially leak
; out of your application such as database usernames and passwords or worse.
-; It's recommended that errors be logged on production servers rather than
-; having the errors sent to STDOUT.
+; For production environments, we recommend logging errors rather than
+; sending them to STDOUT.
; Possible Values:
; Off = Do not display any errors
; stderr = Display errors to STDERR (affects only CGI/CLI binaries!)
@@ -480,8 +482,8 @@ display_errors = On
; The display of errors which occur during PHP's startup sequence are handled
; separately from display_errors. PHP's default behavior is to suppress those
; errors from clients. Turning the display of startup errors on can be useful in
-; debugging configuration problems. But, it's strongly recommended that you
-; leave this setting off on production servers.
+; debugging configuration problems. We strongly recommend you
+; set this to 'off' for production servers.
; Default Value: Off
; Development Value: On
; Production Value: Off
@@ -779,8 +781,8 @@ enable_dl = Off
;fastcgi.logging = 0
; cgi.rfc2616_headers configuration option tells PHP what type of headers to
-; use when sending HTTP response code. If it's set 0 PHP sends Status: header that
-; is supported by Apache. When this option is set to 1 PHP will send
+; use when sending HTTP response code. If set to 0, PHP sends Status: header that
+; is supported by Apache. When this option is set to 1, PHP will send
; RFC2616 compliant header.
; Default is zero.
; http://php.net/cgi.rfc2616-headers
@@ -1380,9 +1382,9 @@ session.save_handler = files
;
; where N is an integer. Instead of storing all the session files in
; /path, what this will do is use subdirectories N-levels deep, and
-; store the session data in those directories. This is useful if you
-; or your OS have problems with lots of files in one directory, and is
-; a more efficient layout for servers that handle lots of sessions.
+; store the session data in those directories. This is useful if
+; your OS has problems with many files in one directory, and is
+; a more efficient layout for servers that handle many sessions.
;
; NOTE 1: PHP will not create this directory structure automatically.
; You can use the script in the ext/session dir for that purpose.
@@ -1409,7 +1411,7 @@ session.use_cookies = 1
; This option forces PHP to fetch and use a cookie for storing and maintaining
; the session id. We encourage this operation as it's very helpful in combating
; session hijacking when not specifying and managing your own session id. It is
-; not the end all be all of session hijacking defense, but it's a good start.
+; not the be-all and end-all of session hijacking defense, but it's a good start.
; http://php.net/session.use-only-cookies
session.use_only_cookies = 1
@@ -1482,14 +1484,14 @@ session.gc_maxlifetime = 1440
; PHP 4.2 and less have an undocumented feature/bug that allows you to
; to initialize a session variable in the global scope.
-; PHP 4.3 and later will warn you, if this feature is used.
+; PHP 4.3 and later will warn you if this feature is used.
; You can disable the feature and the warning separately. At this time,
; the warning is only displayed, if bug_compat_42 is enabled. This feature
-; introduces some serious security problems if not handled correctly. It's
-; recommended that you do not use this feature on production servers. But you
+; introduces some serious security problems if not handled correctly. We
+; recommend you not use this feature on production servers. You
; should enable this on development servers and enable the warning as well. If you
; do not enable the feature on development servers, you won't be warned when it's
-; used and debugging errors caused by this can be difficult to track down.
+; used, so debugging errors caused by this can be difficult to track down.
; Default Value: On
; Development Value: On
; Production Value: Off
@@ -1534,7 +1536,7 @@ session.cache_limiter = nocache
session.cache_expire = 180
; trans sid support is disabled by default.
-; Use of trans sid may risk your users security.
+; Use of trans sid may risk your users' security.
; Use this option with caution.
; - User may send URL contains active session ID
; to other person via. email/irc/etc.
diff --git a/php.ini-production b/php.ini-production
index 8b14386c1f..0553700be6 100644
--- a/php.ini-production
+++ b/php.ini-production
@@ -78,11 +78,13 @@
; compatibility with older or less security conscience applications. We
; recommending using the production ini in production and testing environments.
-; php.ini-development is very similar to its production variant, except it's
-; much more verbose when it comes to errors. We recommending using the
-; development version only in development environments as errors shown to
+; php.ini-development is very similar to its production variant, except it is
+; much more verbose when it comes to errors. We recommend using the
+; development version only in development environments, as errors shown to
; application users can inadvertently leak otherwise secure information.
+; This is php.ini-production INI file.
+
;;;;;;;;;;;;;;;;;;;
; Quick Reference ;
;;;;;;;;;;;;;;;;;;;
@@ -197,13 +199,14 @@
engine = On
; This directive determines whether or not PHP will recognize code between
-; <? and ?> tags as PHP source which should be processed as such. It's been
-; recommended for several years that you not use the short tag "short cut" and
-; instead to use the full <?php and ?> tag combination. With the wide spread use
+; <? and ?> tags as PHP source which should be processed as such. For several
+; years we recommended that you not use the short tag shortcut and
+; instead to use the full <?php and ?> tag combination. With the widespread use
; of XML and use of these tags by other languages, the server can become easily
-; confused and end up parsing the wrong code in the wrong context. But because
-; this short cut has been a feature for such a long time, it's currently still
-; supported for backwards compatibility, but we recommend you don't use them.
+; confused and end up parsing the wrong code in the wrong context.
+; This shortcut is still supported for backwards compatibility, but we
+; recommend against its use.
+; Default Value: On
; Default Value: On
; Development Value: Off
; Production Value: Off
@@ -432,7 +435,7 @@ memory_limit = 128M
; E_NOTICE - run-time notices (these are warnings which often result
; from a bug in your code, but it's possible that it was
; intentional (e.g., using an uninitialized variable and
-; relying on the fact it's automatically initialized to an
+; relying on the fact it is automatically initialized to an
; empty string)
; E_STRICT - run-time notices, enable to have PHP suggest changes
; to your code which will ensure the best interoperability
@@ -465,8 +468,8 @@ error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
; it could be very dangerous in production environments. Depending on the code
; which is triggering the error, sensitive information could potentially leak
; out of your application such as database usernames and passwords or worse.
-; It's recommended that errors be logged on production servers rather than
-; having the errors sent to STDOUT.
+; For production environments, we recommend logging errors rather than
+; sending them to STDOUT.
; Possible Values:
; Off = Do not display any errors
; stderr = Display errors to STDERR (affects only CGI/CLI binaries!)
@@ -480,8 +483,8 @@ display_errors = Off
; The display of errors which occur during PHP's startup sequence are handled
; separately from display_errors. PHP's default behavior is to suppress those
; errors from clients. Turning the display of startup errors on can be useful in
-; debugging configuration problems. But, it's strongly recommended that you
-; leave this setting off on production servers.
+; debugging configuration problems. We strongly recommend you
+; set this to 'off' for production servers.
; Default Value: Off
; Development Value: On
; Production Value: Off
@@ -779,8 +782,8 @@ enable_dl = Off
;fastcgi.logging = 0
; cgi.rfc2616_headers configuration option tells PHP what type of headers to
-; use when sending HTTP response code. If it's set 0 PHP sends Status: header that
-; is supported by Apache. When this option is set to 1 PHP will send
+; use when sending HTTP response code. If set to 0, PHP sends Status: header that
+; is supported by Apache. When this option is set to 1, PHP will send
; RFC2616 compliant header.
; Default is zero.
; http://php.net/cgi.rfc2616-headers
@@ -1380,9 +1383,9 @@ session.save_handler = files
;
; where N is an integer. Instead of storing all the session files in
; /path, what this will do is use subdirectories N-levels deep, and
-; store the session data in those directories. This is useful if you
-; or your OS have problems with lots of files in one directory, and is
-; a more efficient layout for servers that handle lots of sessions.
+; store the session data in those directories. This is useful if
+; your OS has problems with many files in one directory, and is
+; a more efficient layout for servers that handle many sessions.
;
; NOTE 1: PHP will not create this directory structure automatically.
; You can use the script in the ext/session dir for that purpose.
@@ -1409,7 +1412,7 @@ session.use_cookies = 1
; This option forces PHP to fetch and use a cookie for storing and maintaining
; the session id. We encourage this operation as it's very helpful in combating
; session hijacking when not specifying and managing your own session id. It is
-; not the end all be all of session hijacking defense, but it's a good start.
+; not the be-all and end-all of session hijacking defense, but it's a good start.
; http://php.net/session.use-only-cookies
session.use_only_cookies = 1
@@ -1482,14 +1485,14 @@ session.gc_maxlifetime = 1440
; PHP 4.2 and less have an undocumented feature/bug that allows you to
; to initialize a session variable in the global scope.
-; PHP 4.3 and later will warn you, if this feature is used.
+; PHP 4.3 and later will warn you if this feature is used.
; You can disable the feature and the warning separately. At this time,
; the warning is only displayed, if bug_compat_42 is enabled. This feature
-; introduces some serious security problems if not handled correctly. It's
-; recommended that you do not use this feature on production servers. But you
+; introduces some serious security problems if not handled correctly. We
+; recommend you not use this feature on production servers. You
; should enable this on development servers and enable the warning as well. If you
; do not enable the feature on development servers, you won't be warned when it's
-; used and debugging errors caused by this can be difficult to track down.
+; used, so debugging errors caused by this can be difficult to track down.
; Default Value: On
; Development Value: On
; Production Value: Off
@@ -1534,7 +1537,7 @@ session.cache_limiter = nocache
session.cache_expire = 180
; trans sid support is disabled by default.
-; Use of trans sid may risk your users security.
+; Use of trans sid may risk your users' security.
; Use this option with caution.
; - User may send URL contains active session ID
; to other person via. email/irc/etc.
diff --git a/win32/time.h b/win32/time.h
index f841a2b601..d5d86eb1ed 100644
--- a/win32/time.h
+++ b/win32/time.h
@@ -50,4 +50,6 @@ PHPAPI extern int setitimer(int which, const struct itimerval *value,
PHPAPI int nanosleep( const struct timespec * rqtp, struct timespec * rmtp );
+PHPAPI int usleep(unsigned int useconds);
+
#endif