diff options
317 files changed, 14686 insertions, 13446 deletions
@@ -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/CODING_STANDARDS b/CODING_STANDARDS index 7413be453c..16ec36b681 100644 --- a/CODING_STANDARDS +++ b/CODING_STANDARDS @@ -259,7 +259,10 @@ The file labelled 'EXPERIMENTAL' should include the following information:: Any authoring information (known bugs, future directions of the module). - Ongoing status notes which may not be appropriate for SVN comments. + Ongoing status notes which may not be appropriate for Git comments. + +In general new features should go to PECL or experimental branches until +there are specific reasons for directly adding it to the core distribution. Aliases & Legacy Documentation ----------------------------------- diff --git a/Makefile.global b/Makefile.global index 05c5d151b7..bd82daf4d8 100644 --- a/Makefile.global +++ b/Makefile.global @@ -120,7 +120,7 @@ clean: distclean: clean rm -f Makefile config.cache config.log config.status Makefile.objects Makefile.fragments libtool main/php_config.h main/internal_functions_cli.c main/internal_functions.c stamp-h sapi/apache/libphp$(PHP_MAJOR_VERSION).module sapi/apache_hooks/libphp$(PHP_MAJOR_VERSION).module buildmk.stamp Zend/zend_dtrace_gen.h Zend/zend_dtrace_gen.h.bak Zend/zend_config.h TSRM/tsrm_config.h rm -f php5.spec main/build-defs.h scripts/phpize - rm -f ext/date/lib/timelib_config.h ext/mbstring/oniguruma/config.h ext/mbstring/libmbfl/config.h ext/mysqlnd/php_mysqlnd_config.h + rm -f ext/date/lib/timelib_config.h ext/mbstring/oniguruma/config.h ext/mbstring/libmbfl/config.h ext/oci8/oci8_dtrace_gen.h ext/oci8/oci8_dtrace_gen.h.bak rm -f scripts/man1/phpize.1 scripts/php-config scripts/man1/php-config.1 sapi/cli/php.1 sapi/cgi/php-cgi.1 ext/phar/phar.1 ext/phar/phar.phar.1 rm -f sapi/fpm/php-fpm.conf sapi/fpm/init.d.php-fpm sapi/fpm/php-fpm.service sapi/fpm/php-fpm.8 sapi/fpm/status.html rm -f ext/iconv/php_have_bsd_iconv.h ext/iconv/php_have_glibc_iconv.h ext/iconv/php_have_ibm_iconv.h ext/iconv/php_have_iconv.h ext/iconv/php_have_libiconv.h ext/iconv/php_iconv_aliased_libiconv.h ext/iconv/php_iconv_supports_errno.h ext/iconv/php_php_iconv_h_path.h ext/iconv/php_php_iconv_impl.h @@ -1,8611 +1,43 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| -?? ??? 2013, PHP 5.5.5 - -?? ??? 2013, PHP 5.5.4 +?? ??? 201?, PHP 5.6.0 - Core: - . Fixed bug #60598 (cli/apache sapi segfault on objects manipulation). - (Laruence) - . Improved fputcsv() to allow specifying escape character. - . Fixed bug #65490 (Duplicate calls to get lineno & filename for - DTRACE_FUNCTION_*). (Chris Jones) - . Fixed bug #65483 (quoted-printable encode stream filter incorrectly encoding - spaces). (Michael M Slusarz) - . Fixed bug #65470 (Segmentation fault in zend_error() with - --enable-dtrace). (Chris Jones, Kris Van Hees) - . Fixed bug #65225 (PHP_BINARY incorrectly set). (Patrick Allaert) - . Fixed bug #62692 (PHP fails to build with DTrace). (Chris Jones, Kris Van Hees) - . Fixed bug #61759 (class_alias() should accept classes with leading - backslashes). (Julien) - . Fixed bug #46311 (Pointer aliasing issue results in miscompile on gcc4.4). - (Nikita Popov) - -- cURL: - . Fixed bug #65458 (curl memory leak). (Adam) - -- Datetime: - . Fixed bug #65554 (createFromFormat broken when weekday name is followed - by some delimiters). (Valentin Logvinskiy, Stas). - . Fixed bug #65564 (stack-buffer-overflow in DateTimeZone stuff caught - by AddressSanitizer). (Remi). - -- GD - . Ensure that the defined interpolation method is used with the generic scaling methods (Pierre) - -- OPCache: - . Fixed bug #65561 (Zend Opcache on Solaris 11 x86 needs ZEND_MM_ALIGNMENT=4). - (Terry Ellison) - . Fixed bug #65510 (5.5.2 crashes in _get_zval_ptr_ptr_var). (Dmitry) - -- Openssl: - . Fixed bug #64802 (openssl_x509_parse fails to parse subject properly in - some cases). (Mark Jones) + . Improved IS_VAR operands fetching. (Laruence, Dmitry) + . Implemented internal operator overloading + (RFC: https://wiki.php.net/rfc/operator_overloading_gmp). (Nikita) + . Made calls from incompatible context issue an E_DEPRECATED warning instead + of E_STRICT (phase 1 of RFC: https://wiki.php.net/rfc/incompat_ctx). + (Gustavo) - Session: - . Fixed bug #65475 (Session ID is not initialized properly when strict session - is enabled). (Yasuo) - . Fixed bug #51127/#65359 Request #25630/#43980/#54383 (Added php_serialize - session serialize handler that uses plain serialize()). (Yasuo) - -- Standard: - . Fix issue with return types of password API helper functions. Found via static - analysis by cjones. (Anthony Ferrara) - -22 Aug 2013, PHP 5.5.3 - -- Openssl: - . Fixed UMR in fix for CVE-2013-4248. - -15 Aug 2013, PHP 5.5.2 - -- Core: - . Fixed bug #65372 (Segfault in gc_zval_possible_root when return reference - fails). (Laruence) - . Fixed value of FILTER_SANITIZE_FULL_SPECIAL_CHARS constant (previously was - erroneously set to FILTER_SANITIZE_SPECIAL_CHARS value). (Andrey - avp200681 gmail com). - . Fixed bug #65304 (Use of max int in array_sum). (Laruence) - . Fixed bug #65291 (get_defined_constants() causes PHP to crash in a very - limited case). (Arpad) - . Fixed bug #62691 (solaris sed has no -i switch). (Chris Jones) - . Fixed bug #61345 (CGI mode - make install don't work). (Michael Heimpold) - . Fixed bug #61268 (--enable-dtrace leads make to clobber - Zend/zend_dtrace.d) (Chris Jones) - -- DOM: - . Added flags option to DOMDocument::schemaValidate() and - DOMDocument::schemaValidateSource(). Added LIBXML_SCHEMA_CREATE flag. - (Chris Wright) - -- OPcache: - . Added opcache.restrict_api configuration directive that may limit - usage of OPcache API functions only to particular script(s). (Dmitry) - . Added support for glob symbols in blacklist entries (?, *, **). - (Terry Elison, Dmitry) - . Fixed bug #65338 (Enabling both php_opcache and php_wincache AVs on - shutdown). (Dmitry) - -- Openssl: - . Fixed handling null bytes in subjectAltName (CVE-2013-4248). - (Christian Heimes) - -- PDO_mysql: - . Fixed bug #65299 (pdo mysql parsing errors). (Johannes) - -- Pgsql: - . Fixed bug #62978 (Disallow possible SQL injections with pg_select()/pg_update() - /pg_delete()/pg_insert()). (Yasuo) - -- Phar: - . Fixed bug #65028 (Phar::buildFromDirectory creates corrupt archives for - some specific contents). (Stas) - -- Sessions: - . Implemented strict sessions RFC (https://wiki.php.net/rfc/strict_sessions) - which protects against session fixation attacks and session collisions. - (CVE-2011-4718). (Yasuo Ohgaki) - . Fixed possible buffer overflow under Windows. Note: Not a security fix. + . Fixed Bug #65315 (session.hash_function silently fallback to default md5) (Yasuo) - . Changed session.auto_start to PHP_INI_PERDIR. (Yasuo) - -- SOAP: - . Fixed bug #65018 (SoapHeader problems with SoapServer). (Dmitry) - -- SPL: - . Fixed bug #65328 (Segfault when getting SplStack object Value). (Laruence) - . Added RecursiveTreeIterator setPostfix and getPostifx methods. (Joshua - Thijssen) - . Fixed bug #61697 (spl_autoload_functions returns lambda functions - incorrectly). (Laruence) - -- Streams: - . Fixed bug #65268 (select() implementation uses outdated tick API). (Anatol) - -- Pgsql: - . Fixed bug #65336 (pg_escape_literal/identifier() scilently returns false). + . Implemented Request #54649 (Create session_serializer_name()). (Yasuo) + . Implemented Request #17860 (Session write short circuit). (Yasuo) + . Implemented Request #20421 (session_abort() and session_reset() function). (Yasuo) + . Implemented Request #11100 (session_gc() function). (Yasuo) -18 Jul 2013, PHP 5.5.1 - -- 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) - -- 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 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) - . Allowed specifying paths in the abstract namespace for the functions - socket_bind(), socket_connect() and socket_sendmsg(). (Gustavo) - . Fixed bug #65260 (sendmsg() ancillary data construction for SCM_RIGHTS is - faulty). (Gustavo) - -- 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) - -- 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) +- mysqlnd: + . Disabled flag for SP OUT variables for 5.5+ servers as they are not natively + supported by the overlying APIs. (Andrey) -- 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) +- 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 #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 " 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 ' ' instead of - '). (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 & 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/README.EXTENSIONS b/README.EXTENSIONS deleted file mode 100644 index 51e3b730e7..0000000000 --- a/README.EXTENSIONS +++ /dev/null @@ -1,39 +0,0 @@ -Between PHP 4.0.6 and 4.1.0, the Zend module struct changed in a way -that broke both source and binary compatibility. If you are -maintaining a third party extension, here's how to update it: - -If this was your old module entry: - -zend_module_entry foo_module_entry = { - "foo", /* extension name */ - foo_functions, /* extension function list */ - NULL, /* extension-wide startup function */ - NULL, /* extension-wide shutdown function */ - PHP_RINIT(foo), /* per-request startup function */ - PHP_RSHUTDOWN(foo), /* per-request shutdown function */ - PHP_MINFO(foo), /* information function */ - STANDARD_MODULE_PROPERTIES -}; - -Here's how it should look if you want your code to build with PHP -4.1.0 and up: - -zend_module_entry foo_module_entry = { -#if ZEND_MODULE_API_NO >= 20010901 - STANDARD_MODULE_HEADER, -#endif - "foo", /* extension name */ - foo_functions, /* extension function list */ - NULL, /* extension-wide startup function */ - NULL, /* extension-wide shutdown function */ - PHP_RINIT(foo), /* per-request startup function */ - PHP_RSHUTDOWN(foo), /* per-request shutdown function */ - PHP_MINFO(foo), /* information function */ -#if ZEND_MODULE_API_NO >= 20010901 - FOO_VERSION, /* extension version number (string) */ -#endif - STANDARD_MODULE_PROPERTIES -}; - -If you don't care about source compatibility with earlier PHP releases -than 4.1.0, you can drop the #if/#endif lines. diff --git a/README.PHP4-TO-PHP5-THIN-CHANGES b/README.PHP4-TO-PHP5-THIN-CHANGES deleted file mode 100644 index 0a2c6d6657..0000000000 --- a/README.PHP4-TO-PHP5-THIN-CHANGES +++ /dev/null @@ -1,155 +0,0 @@ -1. strrpos() and strripos() now use the entire string as a needle. Be aware - that the existing scripts may no longer work as you expect. - - EX : - <?php - var_dump(strrpos("ABCDEF","DEF")); - var_dump(strrpos("ABCDEF","DAF")); - ?> - - Will give you different results. The former returns 3 while the latter - returns false rather than the position of the last occurrence of 'D'. - The same applies to strripos(). - -2. Illegal use of string offsets causes E_ERROR instead of E_WARNING. - - EX : - <?php - $a = "foo"; - unset($a[0][1][2]); - ?> - - Fatal error: Cannot use string offset as an array in ... on line 1 - -3. array_merge() was changed to accept only arrays. If a non-array variable is - passed, a E_WARNING will be thrown for every such parameter. Be careful - because your code may start emitting E_WARNING out of the blue. - -4. Be careful when porting from ext/mysql to ext/mysqli. The following - functions return NULL when no more data is available in the result set - (ext/mysql's functions return FALSE). - - - mysqli_fetch_row() - - mysqli_fetch_array() - - mysqli_fetch_assoc() - -5. PATH_TRANSLATED server variable is no longer set implicitly under - Apache2 SAPI in contrast to the situation in PHP 4, where it is set to the - same value as the SCRIPT_FILENAME server variable when it is not populated - by Apache. This change was made to comply with the CGI specification. - Please refer to bug #23610 for further information. - -6. Starting PHP 5.0.0 the T_ML_CONSTANT constant is no longer defined by the - ext/tokenizer extension. If error_reporting is set to E_ALL notices will - be produced. Instead of T_ML_CONSTANT for /* */ the T_COMMENT constant - is used, thus both // and /* */ are resolved as the T_COMMENT constant. - However the PHPDoc style comments /** */ ,which starting PHP 5 are parsed - by PHP, are recongnized as T_DOC_COMMENT. - -7. $_SERVER should be populated with argc and argv if variables_order - includes "S". If you have specifically configured your system to not - create $_SERVER, then of course it shouldn't be there. The change was to - always make argc and argv available in the CLI version regardless of the - variables_order setting. As in, the CLI version will now always populate - the global $argc and $argv variables. - -8. In some cases classes must be declared before used. It only happens only - if some of the new features of PHP 5 are used. Otherwise the behaviour is - the old. - Example 1 (works with no errors): - <?php - $a = new a(); - class a { - } - ?> - - Example 2 (throws an error): - <?php - $a = new a(); - interface b{ - } - class a implements b { - } - ?> - - Output (example 2) : - Fatal error: Class 'a' not found in /tmp/cl.php on line 2 - -9. get_class() starting PHP 5 returns the name of the class as it was - declared which may lead to problems in older scripts that rely on - the previous behaviour - the class name is lowercased. Expect the - same behaviour from get_parent_class() when applicable. - Example : - <?php - class FooBar { - } - class ExtFooBar extends FooBar{} - $a = new FooBar(); - var_dump(get_class($a), get_parent_class($a)); - ?> - - Output (PHP 4): - string(6) "foobar" - string(9) "extfoobar" - - Output (PHP 5): - string(6) "FooBar" - string(9) "ExtFooBar" - ---------------------------------------------------------------------- - Example code that will break : - //.... - function someMethod($p) { - if (get_class($p) != 'helpingclass') { - return FALSE; - } - //... - } - //... - Possible solution is to search for get_class() and get_parent_class() in - all your scripts and use strtolower(). - -10. get_class_methods() returns the names of the methods of a class as they - declared. In PHP4 the names are all lowercased. - Example code : - <?php - class Foo{ - function doFoo(){} - function hasFoo(){} - } - var_dump(get_class_methods("Foo")); - ?> - Output (PHP4): - array(2) { - [0]=> - string(5) "dofoo" - [1]=> - string(6) "hasfoo" - } - Output (PHP5): - array(2) { - [0]=> - string(5) "doFoo" - [1]=> - string(6) "hasFoo" - } - -11. Assignment $this is impossible. Starting PHP 5.0.0 $this has special - meaning in class methods and is recognized by the PHP parser. The latter - will generate a parse error when assignment to $this is found - Example code : - <?php - class Foo { - function assignNew($obj) { - $this = $obj; - } - } - $a = new Foo(); - $b = new Foo(); - $a->assignNew($b); - echo "I was executed\n"; - ?> - Output (PHP 4): - I was executed - Output (PHP 5): - PHP Fatal error: Cannot re-assign $this in /tmp/this_ex.php on line 4 - diff --git a/README.STREAMS b/README.STREAMS index f625406a3b..0046e6a754 100644 --- a/README.STREAMS +++ b/README.STREAMS @@ -46,7 +46,7 @@ Opening Streams =============== In most cases, you should use this API: -PHPAPI php_stream *php_stream_open_wrapper(char *path, char *mode, +PHPAPI php_stream *php_stream_open_wrapper(const char *path, const char *mode, int options, char **opened_path TSRMLS_DC); Where: diff --git a/README.SUBMITTING_PATCH b/README.SUBMITTING_PATCH index 63b7156f10..d1b74bd18d 100644 --- a/README.SUBMITTING_PATCH +++ b/README.SUBMITTING_PATCH @@ -5,7 +5,7 @@ This document describes how to submit an enhancement or patch for PHP. It's easy! You don't need any login accounts or special access to download, -build, debug and begin submitting PHP, PECL or PEAR code, tests or +build, debug and begin submitting PHP or PECL code, tests or documentation. Once you've followed this README and had several patches accepted, commit privileges are often quickly granted. @@ -16,8 +16,8 @@ http://phpadvent.org/2008/less-whining-more-coding-by-elizabeth-smith Online Forums ------------- There are several IRC channels where PHP developers are often -available to discuss questions. They include #php.pecl, #php.doc and -#pear on the EFNet network and #php-dev-win on FreeNode. +available to discuss questions. They include #php.pecl and #php.doc +on the EFNet network and #php-dev-win on FreeNode. PHP Patches @@ -78,7 +78,7 @@ of type 'text/*' are accepted. PECL Extension Patches: http://pecl.php.net/ -------------------------------------------- If you are fixing broken functionality in a PECL extension then create -a bug or identify an existing bug at http://pecl.php.net/bugs/. A bug +a bug or identify an existing bug at http://bugs.php.net/. A bug can be used to track the patch progress and prevent your changes getting lost in the PHP mail archives. @@ -114,15 +114,15 @@ http://pear.php.net/manual/en/guide-developers.php How to create your PHP, PHP Documentation or PECL patch ------------------------------------------------------- -PHP and PECL use Subversion (SVN) for revision control. Read -http://www.php.net/svn.php for help on using SVN to get and build PHP -source code. We recommend using a Sparse Directory checkout described -in http://wiki.php.net/vcs/svnfaq. If you are new to SVN, read -http://svnbook.red-bean.com. +PHP and most PECL packages use Git for revision control. Some PECL +packages use Subversion (SVN) Read http://www.php.net/git.php for help +on using Git to get and build PHP source code. We recommend to look +at our workflow on https://wiki.php.net/vcs/gitworkflow and our FAQ +https://wiki.php.net/vcs/gitfaq. Generally we ask that bug fix patches work on the current stable PHP -development branches and on "trunk". New PHP features only need to -work on "trunk". +development branches and on "master". New PHP features only need to +work on "master". Read CODING_STANDARDS before you start working. @@ -134,7 +134,7 @@ comprehensive. After testing is finished, create a patch file using the command: - svn diff > your_patch.txt + git diff > your_patch.txt For ease of review and later troubleshooting, submit individual patches for each bug or feature. @@ -142,7 +142,7 @@ patches for each bug or feature. Checklist for submitting your PHP or PECL code patch ---------------------------------------------------- - - Update SVN source just before running your final 'diff' and + - Update git source just before running your final 'diff' and before testing. - Add in-line comments and/or have external documentation ready. Use only "/* */" style comments, not "//". @@ -175,7 +175,7 @@ about these questions: What happens when your PHP or PECL patch is applied --------------------------------------------------- -Your name will likely be included in the SVN commit log. If your +Your name will likely be included in the Git commit log. If your patch affects end users, a brief description and your name might be added to the NEWS file. diff --git a/TSRM/tsrm_virtual_cwd.c b/TSRM/tsrm_virtual_cwd.c index 3e211fa54f..a7d09630a2 100644 --- a/TSRM/tsrm_virtual_cwd.c +++ b/TSRM/tsrm_virtual_cwd.c @@ -1673,7 +1673,7 @@ CWD_API int virtual_creat(const char *path, mode_t mode TSRMLS_DC) /* {{{ */ } /* }}} */ -CWD_API int virtual_rename(char *oldname, char *newname TSRMLS_DC) /* {{{ */ +CWD_API int virtual_rename(const char *oldname, const char *newname TSRMLS_DC) /* {{{ */ { cwd_state old_state; cwd_state new_state; diff --git a/TSRM/tsrm_virtual_cwd.h b/TSRM/tsrm_virtual_cwd.h index 8aac4aa267..72c4424670 100644 --- a/TSRM/tsrm_virtual_cwd.h +++ b/TSRM/tsrm_virtual_cwd.h @@ -161,7 +161,7 @@ CWD_API char *virtual_realpath(const char *path, char *real_path TSRMLS_DC); CWD_API FILE *virtual_fopen(const char *path, const char *mode TSRMLS_DC); CWD_API int virtual_open(const char *path TSRMLS_DC, int flags, ...); CWD_API int virtual_creat(const char *path, mode_t mode TSRMLS_DC); -CWD_API int virtual_rename(char *oldname, char *newname TSRMLS_DC); +CWD_API int virtual_rename(const char *oldname, const char *newname TSRMLS_DC); CWD_API int virtual_stat(const char *path, struct stat *buf TSRMLS_DC); CWD_API int virtual_lstat(const char *path, struct stat *buf TSRMLS_DC); CWD_API int virtual_unlink(const char *path TSRMLS_DC); @@ -1,484 +1,100 @@ $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. +- Incompatible context calls: + Instance calls from an incompatible context are now deprecated and issue + E_DEPRECATED instead of E_STRICT. See https://wiki.php.net/rfc/incompat_ctx ======================================== 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. - -- Since 5.5.2, spl_autoload_functions() returns different names for - different lambda functions registered via spl_autoload_register(). - -- Since 5.5.3, DOMDocument::schemaValidateSource() and - DOMDocument::schemaValidate() accept flag parameter. Only flag - available now is LIBXML_SCHEMA_CREATE. Default is 0. - -- Since 5.5.4, fputcsv() has fifth parameter escape_char, allowing to - specify escape char. +- 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() - - RecursiveTreeIterator::getPostfix() (5.5.2) - - RecursiveTreeIterator::setPostfix() (5.5.2) - -- 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) + +- OCI8: + - Added Implicit Result Set support for Oracle Database 12c with a + new oci_get_implicit_resultset() function. + - Using 'oci_execute($s, OCI_NO_AUTO_COMMIT)' for a SELECT no longer + unnecessarily initiates an internal ROLLBACK during connection + close. + - Added DTrace probes enabled with PHP's generic --enable-dtrace + - The oci_internal_debug() function is now a no-op. + - The phpinfo() output format for OCI8 has changed. ======================================== 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. - -- MSSQL: - - mssql.compatability_mode renamed to mssql.compatibility_mode in 5.5.2, - old directive still supported for BC reasons. - -- 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. - -- Sessions: - - Added session.use_strict_mode in 5.5.3, which prevents session - fixation attacks and session collisions. - See also https://wiki.php.net/rfc/strict_sessions - -- 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 +- File upload: + Uploads equal or greater than 2GB in size are now accepted. diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index bdc2a43ab9..7cb5539fc1 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -3,11 +3,8 @@ $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 + b. return_value_ptr now always available, RETVAL_ZVAL_FAST macros 2. Build system changes a. Unix build system changes @@ -18,103 +15,58 @@ UPGRADE NOTES - PHP X.Y 1. Internal API changes ======================== - a. Executor changes - - * 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. - - b. Streams pooling API - -The streams pooling API has been removed. The following functions no longer -exist: - -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); - - c. Lowercasing and locales - -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. + a. Addition of do_operation and compare object handlers + + Two new object handlers have been added: + + do_operation: + typedef int (*zend_object_do_operation_t)( + zend_uchar opcode, zval *result, zval *op1, zval *op2 TSRMLS_DC + ); + + compare: + typedef int (*zend_object_compare_zvals_t)( + zval *result, zval *op1, zval *op2 TSRMLS_DC + ); + + 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. + + 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. + + Further docs in the RFC: https://wiki.php.net/rfc/operator_overloading_gmp + + b. return_value_ptr now always available, RETVAL_ZVAL_FAST macros + + The return_value_ptr argument to internal functions is now always set. + Previously it was only available for functions returning by-reference. + return_value_ptr can now be used to return zvals without copying them. + For this purpose two new macros are provided: + + RETVAL_ZVAL_FAST(zv); /* analog to RETVAL_ZVAL(zv, 1, 0) */ + RETURN_ZVAL_FAST(zv); /* analog to RETURN_ZVAL(zv, 1, 0) */ + + The macros behave similarly to the non-FAST variants with copy=1 and + dtor=0, but will try to return the zval without making a copy by utilizing + return_value_ptr. ======================== 2. Build system changes ======================== a. Unix build system changes - - + - The bison version check is now a blacklist instead of a whitelist. + - The bison binary can be specified through the YACC environment/configure + variable. Previously `bison` was assumed to be in $PATH. b. Windows build system changes - - Drop Windows XP and 2003 support. + - diff --git a/Zend/acinclude.m4 b/Zend/acinclude.m4 index 454513f68c..fe3ab63beb 100644 --- a/Zend/acinclude.m4 +++ b/Zend/acinclude.m4 @@ -3,8 +3,13 @@ dnl dnl This file contains local autoconf functions. AC_DEFUN([LIBZEND_BISON_CHECK],[ - # we only support certain bison versions - bison_version_list="2.4 2.4.1 2.4.2 2.4.3 2.5 2.5.1 2.6 2.6.1 2.6.2 2.6.3 2.6.4 2.6.5 2.7" + # we only support certain bison versions; + # min: 2.4 (i.e. 204, major * 100 + minor for easier comparison) + bison_version_min="204" + # non-working versions, e.g. "3.0 3.2"; + # remove "none" when introducing the first incompatible bison version an + # separate any following additions by spaces + bison_version_exclude="none" # for standalone build of Zend Engine test -z "$SED" && SED=sed @@ -12,23 +17,27 @@ AC_DEFUN([LIBZEND_BISON_CHECK],[ bison_version=none if test "$YACC"; then AC_CACHE_CHECK([for bison version], php_cv_bison_version, [ - bison_version_vars=`bison --version 2> /dev/null | grep 'GNU Bison' | cut -d ' ' -f 4 | $SED -e 's/\./ /' | tr -d a-z` + bison_version_vars=`$YACC --version 2> /dev/null | grep 'GNU Bison' | cut -d ' ' -f 4 | $SED -e 's/\./ /g' | tr -d a-z` php_cv_bison_version=invalid if test -n "$bison_version_vars"; then set $bison_version_vars bison_version="${1}.${2}" - for bison_check_version in $bison_version_list; do - if test "$bison_version" = "$bison_check_version"; then - php_cv_bison_version="$bison_check_version (ok)" - break - fi - done + bison_version_num="`expr ${1} \* 100 + ${2}`" + if test $bison_version_num -ge $bison_version_min; then + php_cv_bison_version="$bison_version (ok)" + for bison_check_version in $bison_version_exclude; do + if test "$bison_version" = "$bison_check_version"; then + php_cv_bison_version=invalid + break + fi + done + fi fi ]) fi case $php_cv_bison_version in ""|invalid[)] - bison_msg="bison versions supported for regeneration of the Zend/PHP parsers: $bison_version_list (found: $bison_version)." + bison_msg="This bison version is not supported for regeneration of the Zend/PHP parsers (found: $bison_version, min: $bison_version_min, excluded: $bison_version_exclude)." AC_MSG_WARN([$bison_msg]) YACC="exit 0;" ;; 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/incompat_ctx_user.phpt b/Zend/tests/incompat_ctx_user.phpt new file mode 100644 index 0000000000..2d9b59c1e8 --- /dev/null +++ b/Zend/tests/incompat_ctx_user.phpt @@ -0,0 +1,20 @@ +--TEST-- +Incompatible context call (non-internal function) +--INI-- +error_reporting=E_ALL +--FILE-- +<?php + +class A { + function foo() { var_dump(get_class($this)); } +} +class B { + function bar() { A::foo(); } +} +$b = new B; +$b->bar(); + +?> +--EXPECTF-- +Deprecated: Non-static method A::foo() should not be called statically, assuming $this from incompatible context in %s on line %d +string(1) "B" 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_API.h b/Zend/zend_API.h index ecc8d9acd9..16e766d8a5 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -594,22 +594,20 @@ END_EXTERN_C() Z_TYPE_P(__z) = IS_STRING; \ } while (0) -#define ZVAL_ZVAL(z, zv, copy, dtor) { \ - zend_uchar is_ref = Z_ISREF_P(z); \ - zend_uint refcount = Z_REFCOUNT_P(z); \ - ZVAL_COPY_VALUE(z, zv); \ +#define ZVAL_ZVAL(z, zv, copy, dtor) do { \ + zval *__z = (z); \ + zval *__zv = (zv); \ + ZVAL_COPY_VALUE(__z, __zv); \ if (copy) { \ - zval_copy_ctor(z); \ + zval_copy_ctor(__z); \ } \ if (dtor) { \ if (!copy) { \ - ZVAL_NULL(zv); \ + ZVAL_NULL(__zv); \ } \ - zval_ptr_dtor(&zv); \ + zval_ptr_dtor(&__zv); \ } \ - Z_SET_ISREF_TO_P(z, is_ref); \ - Z_SET_REFCOUNT_P(z, refcount); \ - } + } while (0) #define ZVAL_FALSE(z) ZVAL_BOOL(z, 0) #define ZVAL_TRUE(z) ZVAL_BOOL(z, 1) @@ -638,6 +636,18 @@ END_EXTERN_C() #define RETURN_FALSE { RETVAL_FALSE; return; } #define RETURN_TRUE { RETVAL_TRUE; return; } +#define RETVAL_ZVAL_FAST(z) do { \ + zval *_z = (z); \ + if (Z_ISREF_P(_z)) { \ + RETVAL_ZVAL(_z, 1, 0); \ + } else { \ + zval_ptr_dtor(&return_value); \ + Z_ADDREF_P(_z); \ + *return_value_ptr = _z; \ + } \ +} while (0) +#define RETURN_ZVAL_FAST(z) { RETVAL_ZVAL_FAST(z); return; } + #define SET_VAR_STRING(n, v) { \ { \ zval *var; \ diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index 5faefbd224..fcad86f171 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -59,14 +59,8 @@ ZEND_METHOD(Closure, __invoke) /* {{{ */ } else if (call_user_function_ex(CG(function_table), NULL, this_ptr, &closure_result_ptr, ZEND_NUM_ARGS(), arguments, 1, NULL TSRMLS_CC) == FAILURE) { RETVAL_FALSE; } else if (closure_result_ptr) { - if (Z_ISREF_P(closure_result_ptr) && return_value_ptr) { - if (return_value) { - zval_ptr_dtor(&return_value); - } - *return_value_ptr = closure_result_ptr; - } else { - RETVAL_ZVAL(closure_result_ptr, 1, 1); - } + zval_ptr_dtor(&return_value); + *return_value_ptr = closure_result_ptr; } efree(arguments); diff --git a/Zend/zend_constants.c b/Zend/zend_constants.c index 21580d3d5f..594559d58b 100644 --- a/Zend/zend_constants.c +++ b/Zend/zend_constants.c @@ -25,7 +25,7 @@ #include "zend_variables.h" #include "zend_operators.h" #include "zend_globals.h" - +#include "zend_API.h" void free_zend_constant(zend_constant *c) { @@ -119,42 +119,12 @@ void zend_register_standard_constants(TSRMLS_D) REGISTER_MAIN_LONG_CONSTANT("DEBUG_BACKTRACE_IGNORE_ARGS", DEBUG_BACKTRACE_IGNORE_ARGS, CONST_PERSISTENT | CONST_CS); /* true/false constants */ { - zend_constant c; - - c.flags = CONST_PERSISTENT | CONST_CT_SUBST; - c.module_number = 0; - - c.name = zend_strndup(ZEND_STRL("TRUE")); - c.name_len = sizeof("TRUE"); - c.value.value.lval = 1; - c.value.type = IS_BOOL; - zend_register_constant(&c TSRMLS_CC); - - c.name = zend_strndup(ZEND_STRL("FALSE")); - c.name_len = sizeof("FALSE"); - c.value.value.lval = 0; - c.value.type = IS_BOOL; - zend_register_constant(&c TSRMLS_CC); - - c.name = zend_strndup(ZEND_STRL("NULL")); - c.name_len = sizeof("NULL"); - c.value.type = IS_NULL; - zend_register_constant(&c TSRMLS_CC); - - c.flags = CONST_PERSISTENT | CONST_CS; - - c.name = zend_strndup(ZEND_STRL("ZEND_THREAD_SAFE")); - c.name_len = sizeof("ZEND_THREAD_SAFE"); - c.value.value.lval = ZTS_V; - c.value.type = IS_BOOL; - zend_register_constant(&c TSRMLS_CC); - - c.name = zend_strndup(ZEND_STRL("ZEND_DEBUG_BUILD")); - c.name_len = sizeof("ZEND_DEBUG_BUILD"); - c.value.value.lval = ZEND_DEBUG; - c.value.type = IS_BOOL; - zend_register_constant(&c TSRMLS_CC); + REGISTER_MAIN_BOOL_CONSTANT("TRUE", 1, CONST_PERSISTENT | CONST_CT_SUBST); + REGISTER_MAIN_BOOL_CONSTANT("FALSE", 0, CONST_PERSISTENT | CONST_CT_SUBST); + REGISTER_MAIN_BOOL_CONSTANT("ZEND_THREAD_SAFE", ZTS_V, CONST_PERSISTENT | CONST_CS); + REGISTER_MAIN_BOOL_CONSTANT("ZEND_DEBUG_BUILD", ZEND_DEBUG, CONST_PERSISTENT | CONST_CS); } + REGISTER_MAIN_NULL_CONSTANT("NULL", CONST_PERSISTENT | CONST_CT_SUBST); } @@ -175,13 +145,35 @@ void clean_non_persistent_constants(TSRMLS_D) } } +ZEND_API void zend_register_null_constant(const char *name, uint name_len, int flags, int module_number TSRMLS_DC) +{ + zend_constant c; + + ZVAL_NULL(&c.value); + c.flags = flags; + c.name = zend_strndup(name, name_len-1); + c.name_len = name_len; + c.module_number = module_number; + zend_register_constant(&c TSRMLS_CC); +} + +ZEND_API void zend_register_bool_constant(const char *name, uint name_len, zend_bool bval, int flags, int module_number TSRMLS_DC) +{ + zend_constant c; + + ZVAL_BOOL(&c.value, bval); + c.flags = flags; + c.name = zend_strndup(name, name_len-1); + c.name_len = name_len; + c.module_number = module_number; + zend_register_constant(&c TSRMLS_CC); +} ZEND_API void zend_register_long_constant(const char *name, uint name_len, long lval, int flags, int module_number TSRMLS_DC) { zend_constant c; - c.value.type = IS_LONG; - c.value.value.lval = lval; + ZVAL_LONG(&c.value, lval); c.flags = flags; c.name = zend_strndup(name, name_len-1); c.name_len = name_len; @@ -194,8 +186,7 @@ ZEND_API void zend_register_double_constant(const char *name, uint name_len, dou { zend_constant c; - c.value.type = IS_DOUBLE; - c.value.value.dval = dval; + ZVAL_DOUBLE(&c.value, dval); c.flags = flags; c.name = zend_strndup(name, name_len-1); c.name_len = name_len; @@ -208,9 +199,7 @@ ZEND_API void zend_register_stringl_constant(const char *name, uint name_len, ch { zend_constant c; - c.value.type = IS_STRING; - c.value.value.str.val = strval; - c.value.value.str.len = strlen; + ZVAL_STRINGL(&c.value, strval, strlen, 0); c.flags = flags; c.name = zend_strndup(name, name_len-1); c.name_len = name_len; diff --git a/Zend/zend_constants.h b/Zend/zend_constants.h index c7261946c8..718c173cc7 100644 --- a/Zend/zend_constants.h +++ b/Zend/zend_constants.h @@ -38,16 +38,22 @@ typedef struct _zend_constant { int module_number; } zend_constant; +#define REGISTER_NULL_CONSTANT(name, flags) zend_register_null_constant((name), sizeof(name), (flags), module_number TSRMLS_CC) +#define REGISTER_BOOL_CONSTANT(name, bval, flags) zend_register_bool_constant((name), sizeof(name), (bval), (flags), module_number TSRMLS_CC) #define REGISTER_LONG_CONSTANT(name, lval, flags) zend_register_long_constant((name), sizeof(name), (lval), (flags), module_number TSRMLS_CC) #define REGISTER_DOUBLE_CONSTANT(name, dval, flags) zend_register_double_constant((name), sizeof(name), (dval), (flags), module_number TSRMLS_CC) #define REGISTER_STRING_CONSTANT(name, str, flags) zend_register_string_constant((name), sizeof(name), (str), (flags), module_number TSRMLS_CC) #define REGISTER_STRINGL_CONSTANT(name, str, len, flags) zend_register_stringl_constant((name), sizeof(name), (str), (len), (flags), module_number TSRMLS_CC) +#define REGISTER_NS_NULL_CONSTANT(ns, name, flags) zend_register_null_constant(ZEND_NS_NAME(ns, name), sizeof(ZEND_NS_NAME(ns, name)), (flags), module_number TSRMLS_CC) +#define REGISTER_NS_BOOL_CONSTANT(ns, name, bval, flags) zend_register_bool_constant(ZEND_NS_NAME(ns, name), sizeof(ZEND_NS_NAME(ns, name)), (bval), (flags), module_number TSRMLS_CC) #define REGISTER_NS_LONG_CONSTANT(ns, name, lval, flags) zend_register_long_constant(ZEND_NS_NAME(ns, name), sizeof(ZEND_NS_NAME(ns, name)), (lval), (flags), module_number TSRMLS_CC) #define REGISTER_NS_DOUBLE_CONSTANT(ns, name, dval, flags) zend_register_double_constant(ZEND_NS_NAME(ns, name), sizeof(ZEND_NS_NAME(ns, name)), (dval), (flags), module_number TSRMLS_CC) #define REGISTER_NS_STRING_CONSTANT(ns, name, str, flags) zend_register_string_constant(ZEND_NS_NAME(ns, name), sizeof(ZEND_NS_NAME(ns, name)), (str), (flags), module_number TSRMLS_CC) #define REGISTER_NS_STRINGL_CONSTANT(ns, name, str, len, flags) zend_register_stringl_constant(ZEND_NS_NAME(ns, name), sizeof(ZEND_NS_NAME(ns, name)), (str), (len), (flags), module_number TSRMLS_CC) +#define REGISTER_MAIN_NULL_CONSTANT(name, flags) zend_register_null_constant((name), sizeof(name), (flags), 0 TSRMLS_CC) +#define REGISTER_MAIN_BOOL_CONSTANT(name, bval, flags) zend_register_bool_constant((name), sizeof(name), (bval), (flags), 0 TSRMLS_CC) #define REGISTER_MAIN_LONG_CONSTANT(name, lval, flags) zend_register_long_constant((name), sizeof(name), (lval), (flags), 0 TSRMLS_CC) #define REGISTER_MAIN_DOUBLE_CONSTANT(name, dval, flags) zend_register_double_constant((name), sizeof(name), (dval), (flags), 0 TSRMLS_CC) #define REGISTER_MAIN_STRING_CONSTANT(name, str, flags) zend_register_string_constant((name), sizeof(name), (str), (flags), 0 TSRMLS_CC) @@ -62,6 +68,8 @@ void zend_register_standard_constants(TSRMLS_D); void clean_non_persistent_constants(TSRMLS_D); ZEND_API int zend_get_constant(const char *name, uint name_len, zval *result TSRMLS_DC); ZEND_API int zend_get_constant_ex(const char *name, uint name_len, zval *result, zend_class_entry *scope, ulong flags TSRMLS_DC); +ZEND_API void zend_register_bool_constant(const char *name, uint name_len, zend_bool bval, int flags, int module_number TSRMLS_DC); +ZEND_API void zend_register_null_constant(const char *name, uint name_len, int flags, int module_number TSRMLS_DC); ZEND_API void zend_register_long_constant(const char *name, uint name_len, long lval, int flags, int module_number TSRMLS_DC); ZEND_API void zend_register_double_constant(const char *name, uint name_len, double dval, int flags, int module_number TSRMLS_DC); ZEND_API void zend_register_string_constant(const char *name, uint name_len, char *strval, int flags, int module_number TSRMLS_DC); diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index a65f5331de..048c1fc184 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; } } @@ -1476,15 +1487,17 @@ ZEND_API opcode_handler_t *zend_opcode_handlers; ZEND_API void execute_internal(zend_execute_data *execute_data_ptr, zend_fcall_info *fci, int return_value_used TSRMLS_DC) { - if(fci != NULL) { - ((zend_internal_function *) execute_data_ptr->function_state.function)->handler(fci->param_count, - *fci->retval_ptr_ptr, fci->retval_ptr_ptr, fci->object_ptr, 1 TSRMLS_CC); - + if (fci != NULL) { + execute_data_ptr->function_state.function->internal_function.handler( + fci->param_count, *fci->retval_ptr_ptr, fci->retval_ptr_ptr, + fci->object_ptr, 1 TSRMLS_CC + ); } else { zval **return_value_ptr = &EX_TMP_VAR(execute_data_ptr, execute_data_ptr->opline->result.var)->var.ptr; - ((zend_internal_function *) execute_data_ptr->function_state.function)->handler(execute_data_ptr->opline->extended_value, *return_value_ptr, - (execute_data_ptr->function_state.function->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)?return_value_ptr:NULL, - execute_data_ptr->object, return_value_used TSRMLS_CC); + execute_data_ptr->function_state.function->internal_function.handler( + execute_data_ptr->opline->extended_value, *return_value_ptr, return_value_ptr, + execute_data_ptr->object, return_value_used TSRMLS_CC + ); } } diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 83c2217984..0b29086a0d 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -952,9 +952,9 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS if (EX(function_state).function->common.scope) { EG(scope) = EX(function_state).function->common.scope; } - if(EXPECTED(zend_execute_internal == NULL)) { + if (EXPECTED(zend_execute_internal == NULL)) { /* saves one function call if zend_execute_internal is not used */ - ((zend_internal_function *) EX(function_state).function)->handler(fci->param_count, *fci->retval_ptr_ptr, fci->retval_ptr_ptr, fci->object_ptr, 1 TSRMLS_CC); + EX(function_state).function->internal_function.handler(fci->param_count, *fci->retval_ptr_ptr, fci->retval_ptr_ptr, fci->object_ptr, 1 TSRMLS_CC); } else { zend_execute_internal(&execute_data, fci, 1 TSRMLS_CC); } diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index 1a805bbd6d..c6b211ae4d 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -430,7 +430,7 @@ ZEND_METHOD(Generator, current) zend_generator_ensure_initialized(generator TSRMLS_CC); if (generator->value) { - RETURN_ZVAL(generator->value, 1, 0); + RETURN_ZVAL_FAST(generator->value); } } /* }}} */ @@ -450,7 +450,7 @@ ZEND_METHOD(Generator, key) zend_generator_ensure_initialized(generator TSRMLS_CC); if (generator->key) { - RETURN_ZVAL(generator->key, 1, 0); + RETURN_ZVAL_FAST(generator->key); } } /* }}} */ @@ -499,7 +499,7 @@ ZEND_METHOD(Generator, send) zend_generator_resume(generator TSRMLS_CC); if (generator->value) { - RETURN_ZVAL(generator->value, 1, 0); + RETURN_ZVAL_FAST(generator->value); } } /* }}} */ @@ -532,7 +532,7 @@ ZEND_METHOD(Generator, throw) zend_generator_resume(generator TSRMLS_CC); if (generator->value) { - RETURN_ZVAL(generator->value, 1, 0); + RETURN_ZVAL_FAST(generator->value); } } else { /* If the generator is already closed throw the exception in the diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index 96c3f3d7b5..ae7d8402f4 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..8beacdfd35 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -896,11 +896,8 @@ ZEND_API void zend_std_call_user_call(INTERNAL_FUNCTION_PARAMETERS) /* {{{ */ zend_call_method_with_2_params(&this_ptr, ce, &ce->__call, ZEND_CALL_FUNC_NAME, &method_result_ptr, method_name_ptr, method_args_ptr); if (method_result_ptr) { - if (Z_ISREF_P(method_result_ptr) || Z_REFCOUNT_P(method_result_ptr) > 1) { - RETVAL_ZVAL(method_result_ptr, 1, 1); - } else { - RETVAL_ZVAL(method_result_ptr, 0, 1); - } + RETVAL_ZVAL_FAST(method_result_ptr); + zval_ptr_dtor(&method_result_ptr); } /* now destruct all auxiliaries */ @@ -1113,11 +1110,8 @@ ZEND_API void zend_std_callstatic_user_call(INTERNAL_FUNCTION_PARAMETERS) /* {{{ zend_call_method_with_2_params(NULL, ce, &ce->__callstatic, ZEND_CALLSTATIC_FUNC_NAME, &method_result_ptr, method_name_ptr, method_args_ptr); if (method_result_ptr) { - if (Z_ISREF_P(method_result_ptr) || Z_REFCOUNT_P(method_result_ptr) > 1) { - RETVAL_ZVAL(method_result_ptr, 1, 1); - } else { - RETVAL_ZVAL(method_result_ptr, 0, 1); - } + RETVAL_ZVAL_FAST(method_result_ptr); + zval_ptr_dtor(&method_result_ptr); } /* now destruct all auxiliaries */ @@ -1651,6 +1645,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 5c84deb268..34237387b6 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 6e7c1c01df..15ad79e4db 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -269,11 +269,11 @@ static inline zend_uchar is_numeric_string(const char *str, int length, long *lv return is_numeric_string_ex(str, length, lval, dval, allow_errors, NULL); } -static inline char * -zend_memnstr(char *haystack, char *needle, int needle_len, char *end) +static inline const char * +zend_memnstr(const char *haystack, const char *needle, int needle_len, char *end) { - char *p = haystack; - char ne = needle[needle_len-1]; + const char *p = haystack; + const char ne = needle[needle_len-1]; if (needle_len == 1) { return (char *)memchr(p, *needle, (end-p)); @@ -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 ada20ca308..2bc80faa4e 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. */ @@ -1988,7 +1990,7 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY) if (!zend_execute_internal) { /* saves one function call if zend_execute_internal is not used */ - fbc->internal_function.handler(opline->extended_value, ret->var.ptr, (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) ? &ret->var.ptr : NULL, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC); + fbc->internal_function.handler(opline->extended_value, ret->var.ptr, &ret->var.ptr, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC); } else { zend_execute_internal(execute_data, NULL, RETURN_VALUE_USED(opline) TSRMLS_CC); } @@ -2607,7 +2609,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMP|VAR|UNUS /* We are calling method of the other (incompatible) class, but passing $this. This is done for compatibility with php-4. */ if (call->fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) { - zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); + zend_error(E_DEPRECATED, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); } else { /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */ zend_error_noreturn(E_ERROR, "Non-static method %s::%s() cannot be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); @@ -2682,7 +2684,7 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST|TMP|VAR|CV) if (call->object) { Z_ADDREF_P(call->object); } - if (OP2_TYPE == IS_VAR && OP2_FREE && + if (OP2_TYPE == IS_VAR && OP2_FREE && Z_REFCOUNT_P(function_name) == 1 && call->fbc->common.fn_flags & ZEND_ACC_CLOSURE) { /* Delay closure destruction until its invocation */ call->fbc->common.prototype = (zend_function*)function_name; @@ -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); } @@ -2939,7 +2944,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); } @@ -3082,21 +3087,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(); @@ -3117,22 +3127,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; @@ -3147,9 +3150,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(); } @@ -3348,9 +3351,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); @@ -3614,7 +3614,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); } } @@ -3662,8 +3663,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(); @@ -4152,19 +4151,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); } } @@ -4172,10 +4179,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); } @@ -4192,14 +4204,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 */ @@ -4229,7 +4245,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 { @@ -4465,7 +4483,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); @@ -4592,7 +4610,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(); @@ -5294,14 +5312,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; @@ -5314,12 +5332,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 2ba6bfef1d..08fb847382 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -487,14 +487,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 && @@ -504,6 +505,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. */ @@ -547,7 +551,7 @@ static int ZEND_FASTCALL zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_AR if (!zend_execute_internal) { /* saves one function call if zend_execute_internal is not used */ - fbc->internal_function.handler(opline->extended_value, ret->var.ptr, (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) ? &ret->var.ptr : NULL, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC); + fbc->internal_function.handler(opline->extended_value, ret->var.ptr, &ret->var.ptr, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC); } else { zend_execute_internal(execute_data, NULL, RETURN_VALUE_USED(opline) TSRMLS_CC); } @@ -1270,7 +1274,7 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE if (call->object) { Z_ADDREF_P(call->object); } - if (IS_CONST == IS_VAR && 0 && + if (IS_CONST == IS_VAR && 0 && Z_REFCOUNT_P(function_name) == 1 && call->fbc->common.fn_flags & ZEND_ACC_CLOSURE) { /* Delay closure destruction until its invocation */ call->fbc->common.prototype = (zend_function*)function_name; @@ -1595,7 +1599,7 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_TMP_HANDLER(ZEND_OPCODE_H if (call->object) { Z_ADDREF_P(call->object); } - if (IS_TMP_VAR == IS_VAR && 1 && + if (IS_TMP_VAR == IS_VAR && 1 && Z_REFCOUNT_P(function_name) == 1 && call->fbc->common.fn_flags & ZEND_ACC_CLOSURE) { /* Delay closure destruction until its invocation */ call->fbc->common.prototype = (zend_function*)function_name; @@ -1719,7 +1723,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(); } @@ -1768,7 +1772,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; @@ -1782,12 +1786,12 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER(ZEND_OPCODE_H if (call->object) { Z_ADDREF_P(call->object); } - if (IS_VAR == IS_VAR && (free_op2.var != NULL) && + if (IS_VAR == IS_VAR && (free_op2.var != NULL) && Z_REFCOUNT_P(function_name) == 1 && call->fbc->common.fn_flags & ZEND_ACC_CLOSURE) { /* 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; @@ -1858,7 +1862,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 { @@ -2007,7 +2011,7 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER(ZEND_OPCODE_HA if (call->object) { Z_ADDREF_P(call->object); } - if (IS_CV == IS_VAR && 0 && + if (IS_CV == IS_VAR && 0 && Z_REFCOUNT_P(function_name) == 1 && call->fbc->common.fn_flags & ZEND_ACC_CLOSURE) { /* Delay closure destruction until its invocation */ call->fbc->common.prototype = (zend_function*)function_name; @@ -2339,9 +2343,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 || @@ -2354,18 +2356,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); } @@ -2828,19 +2835,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); } } @@ -2848,10 +2863,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); } @@ -2868,14 +2888,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 */ @@ -2905,6 +2929,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 { @@ -3487,12 +3514,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); @@ -3502,7 +3523,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(); @@ -3638,7 +3661,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST_HANDLER( /* We are calling method of the other (incompatible) class, but passing $this. This is done for compatibility with php-4. */ if (call->fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) { - zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); + zend_error(E_DEPRECATED, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); } else { /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */ zend_error_noreturn(E_ERROR, "Non-static method %s::%s() cannot be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); @@ -3662,9 +3685,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); @@ -3801,7 +3821,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); } } @@ -3849,8 +3870,6 @@ num_index: } if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && opline->extended_value) { - } else { - } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -4145,7 +4164,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; @@ -4158,11 +4177,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 */ @@ -4510,12 +4531,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); @@ -4525,7 +4540,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(); @@ -4637,7 +4654,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMP_HANDLER(ZE /* We are calling method of the other (incompatible) class, but passing $this. This is done for compatibility with php-4. */ if (call->fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) { - zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); + zend_error(E_DEPRECATED, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); } else { /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */ zend_error_noreturn(E_ERROR, "Non-static method %s::%s() cannot be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); @@ -4661,9 +4678,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); @@ -4704,7 +4718,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); } } @@ -4752,8 +4767,6 @@ num_index: } if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && opline->extended_value) { - } else { - } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -4845,7 +4858,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; @@ -4858,11 +4871,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 */ @@ -4936,7 +4951,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(); } @@ -4951,7 +4966,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(); } @@ -4966,7 +4981,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(); } @@ -4981,7 +4996,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(); } @@ -4996,7 +5011,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(); } @@ -5011,7 +5026,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(); } @@ -5026,7 +5041,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(); } @@ -5041,7 +5056,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(); } @@ -5056,7 +5071,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(); } @@ -5073,7 +5088,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(); } @@ -5089,7 +5104,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(); } @@ -5105,7 +5120,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(); } @@ -5121,7 +5136,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(); } @@ -5137,7 +5152,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(); } @@ -5152,7 +5167,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(); } @@ -5167,7 +5182,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(); } @@ -5182,7 +5197,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(); } @@ -5197,7 +5212,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(); } @@ -5374,22 +5389,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(); @@ -5480,7 +5491,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)) { @@ -5501,7 +5512,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_VAR_HANDLER(ZE /* We are calling method of the other (incompatible) class, but passing $this. This is done for compatibility with php-4. */ if (call->fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) { - zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); + zend_error(E_DEPRECATED, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); } else { /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */ zend_error_noreturn(E_ERROR, "Non-static method %s::%s() cannot be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); @@ -5525,14 +5536,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(); } @@ -5568,7 +5576,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); } } @@ -5610,14 +5619,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(); @@ -5872,7 +5879,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; @@ -5885,11 +5892,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 */ @@ -5928,7 +5937,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++; @@ -6223,7 +6232,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER /* We are calling method of the other (incompatible) class, but passing $this. This is done for compatibility with php-4. */ if (call->fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) { - zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); + zend_error(E_DEPRECATED, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); } else { /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */ zend_error_noreturn(E_ERROR, "Non-static method %s::%s() cannot be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); @@ -6272,7 +6281,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); } } @@ -6320,8 +6330,6 @@ num_index: } if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && opline->extended_value) { - } else { - } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -6594,7 +6602,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; @@ -6607,11 +6615,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 */ @@ -6959,12 +6969,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); @@ -6974,7 +6978,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(); @@ -7086,7 +7092,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEN /* We are calling method of the other (incompatible) class, but passing $this. This is done for compatibility with php-4. */ if (call->fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) { - zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); + zend_error(E_DEPRECATED, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); } else { /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */ zend_error_noreturn(E_ERROR, "Non-static method %s::%s() cannot be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); @@ -7170,9 +7176,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); @@ -7212,7 +7215,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); } } @@ -7260,8 +7264,6 @@ num_index: } if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && opline->extended_value) { - } else { - } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -7353,7 +7355,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; @@ -7366,11 +7368,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 */ @@ -7667,9 +7671,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 || @@ -7682,18 +7684,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); } @@ -8157,19 +8164,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); } } @@ -8177,10 +8192,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); } @@ -8197,14 +8217,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 */ @@ -8234,6 +8258,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 { @@ -8868,12 +8895,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); @@ -8883,7 +8904,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(); @@ -9045,9 +9068,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); @@ -9087,7 +9107,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); } } @@ -9135,8 +9156,6 @@ num_index: } if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && opline->extended_value) { - } else { - } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -9391,7 +9410,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; @@ -9404,11 +9423,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 */ @@ -9756,12 +9777,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); @@ -9771,7 +9786,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(); @@ -9909,9 +9926,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); @@ -9952,7 +9966,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); } } @@ -10000,8 +10015,6 @@ num_index: } if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && opline->extended_value) { - } else { - } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -10093,7 +10106,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; @@ -10106,11 +10119,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 */ @@ -10184,7 +10199,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(); } @@ -10199,7 +10214,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(); } @@ -10214,7 +10229,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(); } @@ -10229,7 +10244,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(); } @@ -10244,7 +10259,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(); } @@ -10259,7 +10274,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(); } @@ -10274,7 +10289,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(); } @@ -10289,7 +10304,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(); } @@ -10304,7 +10319,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(); } @@ -10321,7 +10336,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(); } @@ -10337,7 +10352,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(); } @@ -10353,7 +10368,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(); } @@ -10369,7 +10384,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(); } @@ -10385,7 +10400,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(); } @@ -10400,7 +10415,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(); } @@ -10415,7 +10430,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(); } @@ -10430,7 +10445,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(); } @@ -10445,7 +10460,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(); } @@ -10622,22 +10637,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(); @@ -10683,7 +10694,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(); @@ -10741,7 +10752,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); @@ -10763,7 +10774,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(); @@ -10775,14 +10786,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(); } @@ -10818,7 +10826,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); } } @@ -10860,14 +10869,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(); @@ -11122,7 +11129,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; @@ -11135,11 +11142,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 */ @@ -11178,7 +11187,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++; @@ -11399,7 +11408,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); } } @@ -11447,8 +11457,6 @@ num_index: } if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && opline->extended_value) { - } else { - } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -11703,7 +11711,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; @@ -11716,11 +11724,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 */ @@ -12068,12 +12078,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); @@ -12083,7 +12087,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(); @@ -12219,9 +12225,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); @@ -12261,7 +12264,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); } } @@ -12309,8 +12313,6 @@ num_index: } if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && opline->extended_value) { - } else { - } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -12402,7 +12404,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; @@ -12415,11 +12417,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 */ @@ -12491,7 +12495,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(); } @@ -12504,7 +12508,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(); } @@ -12703,7 +12707,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(); } @@ -12730,7 +12734,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(); } @@ -12760,7 +12764,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(); } @@ -12790,7 +12794,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(); } @@ -12824,7 +12828,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(); } @@ -12855,7 +12859,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(); } @@ -12896,9 +12900,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 || @@ -12911,18 +12913,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); } @@ -12943,7 +12950,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; @@ -13024,7 +13031,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(); } @@ -13036,21 +13043,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(); @@ -13071,22 +13083,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; @@ -13101,9 +13106,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(); } @@ -13166,7 +13171,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(); @@ -13243,7 +13248,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(); } @@ -13285,7 +13290,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); @@ -13302,7 +13307,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(); } @@ -13391,7 +13396,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)) { @@ -13498,19 +13503,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); } } @@ -13518,10 +13531,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); } @@ -13538,14 +13556,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 */ @@ -13575,7 +13597,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 { @@ -13730,7 +13754,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(); @@ -13751,14 +13775,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(); } @@ -13786,14 +13810,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(); } @@ -13811,7 +13835,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(); } @@ -13839,7 +13863,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(); } @@ -13860,7 +13884,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(); } @@ -13874,7 +13898,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(); @@ -13889,7 +13913,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(); @@ -13904,7 +13928,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(); @@ -13919,7 +13943,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(); @@ -13934,7 +13958,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(); @@ -13949,7 +13973,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(); @@ -13964,7 +13988,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(); @@ -13979,7 +14003,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(); @@ -13994,7 +14018,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(); @@ -14011,7 +14035,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(); @@ -14027,7 +14051,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(); @@ -14043,7 +14067,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(); @@ -14059,7 +14083,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(); @@ -14075,7 +14099,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(); @@ -14090,7 +14114,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(); @@ -14105,7 +14129,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(); @@ -14120,7 +14144,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(); @@ -14135,7 +14159,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(); @@ -14637,7 +14661,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(); } @@ -14647,7 +14671,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); /* @@ -14686,11 +14710,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); @@ -14775,22 +14799,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(); @@ -14860,10 +14880,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(); } @@ -14885,15 +14905,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(); } @@ -14977,7 +14999,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(); } @@ -15104,7 +15126,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(); } @@ -15428,7 +15450,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(); @@ -15539,7 +15561,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZE /* We are calling method of the other (incompatible) class, but passing $this. This is done for compatibility with php-4. */ if (call->fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) { - zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); + zend_error(E_DEPRECATED, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); } else { /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */ zend_error_noreturn(E_ERROR, "Non-static method %s::%s() cannot be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); @@ -15563,9 +15585,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); @@ -15702,7 +15721,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); } } @@ -15750,8 +15770,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(); @@ -15820,7 +15838,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)) { @@ -15844,7 +15862,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(); } @@ -16054,7 +16072,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) { @@ -16086,7 +16104,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; @@ -16213,7 +16231,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(); @@ -16302,7 +16320,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; @@ -16315,12 +16333,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 */ @@ -16393,7 +16412,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(); @@ -16408,7 +16427,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(); @@ -16423,7 +16442,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(); @@ -16438,7 +16457,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(); @@ -16453,7 +16472,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(); @@ -16468,7 +16487,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(); @@ -16483,7 +16502,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(); @@ -16498,7 +16517,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(); @@ -16513,7 +16532,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(); @@ -16530,7 +16549,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(); @@ -16546,7 +16565,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(); @@ -16562,7 +16581,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(); @@ -16578,7 +16597,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(); @@ -16594,7 +16613,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(); @@ -16609,7 +16628,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(); @@ -16624,7 +16643,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(); @@ -16639,7 +16658,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(); @@ -16654,7 +16673,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(); @@ -17131,22 +17150,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(); @@ -17216,10 +17231,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(); } @@ -17241,15 +17256,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(); } @@ -17333,7 +17350,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(); } @@ -17460,7 +17477,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(); } @@ -17786,7 +17803,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(); @@ -17897,7 +17914,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND /* We are calling method of the other (incompatible) class, but passing $this. This is done for compatibility with php-4. */ if (call->fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) { - zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); + zend_error(E_DEPRECATED, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); } else { /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */ zend_error_noreturn(E_ERROR, "Non-static method %s::%s() cannot be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); @@ -17921,9 +17938,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); @@ -17964,7 +17978,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); } } @@ -18012,8 +18027,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(); @@ -18185,7 +18198,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); @@ -18312,7 +18325,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(); @@ -18401,7 +18414,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; @@ -18414,12 +18427,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 */ @@ -18492,8 +18506,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(); } @@ -18507,8 +18521,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(); } @@ -18522,8 +18536,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(); } @@ -18537,8 +18551,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(); } @@ -18552,8 +18566,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(); } @@ -18567,8 +18581,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(); } @@ -18582,8 +18596,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(); } @@ -18597,8 +18611,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(); } @@ -18612,8 +18626,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(); } @@ -18629,8 +18643,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(); } @@ -18645,8 +18659,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(); } @@ -18661,8 +18675,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(); } @@ -18677,8 +18691,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(); } @@ -18693,8 +18707,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(); } @@ -18708,8 +18722,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(); } @@ -18723,8 +18737,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(); } @@ -18738,8 +18752,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(); } @@ -18753,8 +18767,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(); } @@ -18778,7 +18792,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)) { @@ -18859,7 +18873,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); } @@ -18918,7 +18932,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) { @@ -18946,7 +18960,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); @@ -19040,7 +19054,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); @@ -19103,7 +19117,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(); @@ -19144,7 +19158,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(); @@ -19205,7 +19219,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(); @@ -19256,7 +19270,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(); } @@ -19266,7 +19280,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); /* @@ -19305,11 +19319,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); @@ -19394,22 +19408,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(); @@ -19429,7 +19439,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)); } @@ -19463,7 +19473,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)); } @@ -19479,10 +19489,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(); } @@ -19504,15 +19514,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(); } @@ -19535,7 +19547,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)); } @@ -19575,7 +19587,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; @@ -19592,11 +19604,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(); } @@ -19633,7 +19645,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)); @@ -19676,7 +19688,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)); @@ -19702,7 +19714,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; @@ -19719,11 +19731,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(); } @@ -19752,7 +19764,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)); @@ -19791,7 +19803,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)); @@ -19829,7 +19841,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! */ @@ -19861,7 +19873,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; @@ -19870,7 +19882,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); @@ -19969,7 +19981,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(); @@ -20081,7 +20093,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); @@ -20103,8 +20115,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(); @@ -20194,7 +20206,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)) { @@ -20215,7 +20227,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND /* We are calling method of the other (incompatible) class, but passing $this. This is done for compatibility with php-4. */ if (call->fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) { - zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); + zend_error(E_DEPRECATED, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); } else { /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */ zend_error_noreturn(E_ERROR, "Non-static method %s::%s() cannot be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); @@ -20239,14 +20251,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(); } @@ -20282,7 +20291,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); } } @@ -20324,14 +20334,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(); @@ -20400,7 +20408,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)) { @@ -20424,7 +20432,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(); } @@ -20496,7 +20504,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: @@ -20510,18 +20518,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);}; @@ -20556,13 +20564,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);}; @@ -20634,7 +20642,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) { @@ -20666,7 +20674,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); @@ -20729,7 +20737,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); @@ -20752,7 +20760,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; @@ -20781,9 +20789,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; @@ -20793,7 +20801,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(); @@ -20882,7 +20890,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; @@ -20895,12 +20903,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 */ @@ -20939,7 +20948,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++; @@ -21255,7 +21264,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(); } @@ -21265,7 +21274,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); /* @@ -21304,11 +21313,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); @@ -21458,15 +21467,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(); } @@ -21656,7 +21667,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED_HANDLER(Z /* We are calling method of the other (incompatible) class, but passing $this. This is done for compatibility with php-4. */ if (call->fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) { - zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); + zend_error(E_DEPRECATED, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); } else { /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */ zend_error_noreturn(E_ERROR, "Non-static method %s::%s() cannot be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); @@ -21705,7 +21716,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); } } @@ -21753,8 +21765,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(); @@ -21823,7 +21833,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)) { @@ -21847,7 +21857,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(); } @@ -21916,7 +21926,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) { @@ -22031,7 +22041,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; @@ -22044,12 +22054,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 */ @@ -22122,7 +22133,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(); @@ -22137,7 +22148,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(); @@ -22152,7 +22163,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(); @@ -22167,7 +22178,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(); @@ -22182,7 +22193,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(); @@ -22197,7 +22208,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(); @@ -22212,7 +22223,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(); @@ -22227,7 +22238,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(); @@ -22242,7 +22253,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(); @@ -22259,7 +22270,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(); @@ -22275,7 +22286,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(); @@ -22291,7 +22302,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(); @@ -22307,7 +22318,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(); @@ -22323,7 +22334,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(); @@ -22338,7 +22349,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(); @@ -22353,7 +22364,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(); @@ -22368,7 +22379,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(); @@ -22383,7 +22394,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(); @@ -22859,22 +22870,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(); @@ -22944,10 +22951,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(); } @@ -22969,15 +22976,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(); } @@ -23061,7 +23070,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(); } @@ -23188,7 +23197,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(); } @@ -23565,7 +23574,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(); @@ -23676,7 +23685,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_ /* We are calling method of the other (incompatible) class, but passing $this. This is done for compatibility with php-4. */ if (call->fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) { - zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); + zend_error(E_DEPRECATED, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); } else { /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */ zend_error_noreturn(E_ERROR, "Non-static method %s::%s() cannot be called statically, assuming $this from incompatible context", call->fbc->common.scope->name, call->fbc->common.function_name); @@ -23700,9 +23709,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); @@ -23742,7 +23748,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); } } @@ -23790,8 +23797,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(); @@ -23963,7 +23968,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); @@ -24090,7 +24095,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(); @@ -24179,7 +24184,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; @@ -24192,12 +24197,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 */ @@ -25685,7 +25691,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; @@ -25698,11 +25704,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 */ @@ -27006,7 +27014,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; @@ -27019,11 +27027,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 */ @@ -27106,7 +27116,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)) { @@ -27187,7 +27197,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); } @@ -27245,7 +27255,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) { @@ -27273,7 +27283,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); @@ -27367,7 +27377,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); @@ -27430,7 +27440,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(); @@ -27471,7 +27481,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(); @@ -27532,7 +27542,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(); @@ -27566,7 +27576,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; @@ -27583,7 +27593,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); } } @@ -27623,7 +27633,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)); @@ -27665,7 +27675,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)); @@ -27691,7 +27701,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; @@ -27708,7 +27718,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); } } @@ -27740,7 +27750,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)); @@ -27779,7 +27789,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)); @@ -27816,7 +27826,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! */ @@ -27864,7 +27874,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(); @@ -27922,7 +27932,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); @@ -27944,7 +27954,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(); @@ -28031,7 +28041,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: @@ -28045,18 +28055,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(); @@ -28090,13 +28100,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(); @@ -28177,7 +28187,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); @@ -28200,7 +28210,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; @@ -28229,9 +28239,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; @@ -28327,7 +28337,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; @@ -28340,11 +28350,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 */ @@ -28383,7 +28395,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++; @@ -28750,7 +28762,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; @@ -28763,11 +28775,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 */ @@ -30068,7 +30082,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; @@ -30081,11 +30095,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 */ @@ -30543,9 +30559,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 || @@ -30558,18 +30572,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); } @@ -30682,21 +30701,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(); @@ -30705,7 +30729,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(); @@ -30717,22 +30741,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; @@ -30747,9 +30764,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(); } @@ -31132,19 +31149,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); } } @@ -31152,10 +31177,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); } @@ -31172,14 +31202,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 */ @@ -31209,6 +31243,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 { @@ -32273,12 +32310,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); @@ -32288,7 +32319,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(); @@ -32382,15 +32415,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(); } @@ -32930,9 +32965,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); @@ -32972,7 +33004,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); } } @@ -33020,8 +33053,6 @@ num_index: } if ((IS_CV == IS_VAR || IS_CV == IS_CV) && opline->extended_value) { - } else { - } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -33567,7 +33598,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; @@ -33580,11 +33611,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 */ @@ -34394,12 +34427,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); @@ -34409,7 +34436,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(); @@ -34503,15 +34532,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(); } @@ -35053,9 +35084,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); @@ -35096,7 +35124,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); } } @@ -35144,8 +35173,6 @@ num_index: } if ((IS_CV == IS_VAR || IS_CV == IS_CV) && opline->extended_value) { - } else { - } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -35528,7 +35555,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; @@ -35541,11 +35568,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 */ @@ -35619,7 +35648,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(); } @@ -35634,7 +35663,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(); } @@ -35649,7 +35678,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(); } @@ -35664,7 +35693,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(); } @@ -35679,7 +35708,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(); } @@ -35694,7 +35723,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(); } @@ -35709,7 +35738,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(); } @@ -35724,7 +35753,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(); } @@ -35739,7 +35768,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(); } @@ -35756,7 +35785,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(); } @@ -35772,7 +35801,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(); } @@ -35788,7 +35817,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(); } @@ -35804,7 +35833,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(); } @@ -35820,7 +35849,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(); } @@ -35835,7 +35864,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(); } @@ -35850,7 +35879,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(); } @@ -35865,7 +35894,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(); } @@ -35880,7 +35909,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(); } @@ -35904,7 +35933,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)) { @@ -35985,7 +36014,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); } @@ -36043,7 +36072,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) { @@ -36071,7 +36100,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); @@ -36165,7 +36194,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); @@ -36228,7 +36257,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(); @@ -36269,7 +36298,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(); @@ -36330,7 +36359,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(); @@ -36519,22 +36548,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(); @@ -36554,7 +36579,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)); } @@ -36587,7 +36612,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)); } @@ -36605,7 +36630,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(); @@ -36628,15 +36653,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(); } @@ -36659,7 +36686,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)); } @@ -36699,7 +36726,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; @@ -36716,7 +36743,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); } } @@ -36756,7 +36783,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)); @@ -36798,7 +36825,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)); @@ -36824,7 +36851,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; @@ -36841,7 +36868,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); } } @@ -36873,7 +36900,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)); @@ -36912,7 +36939,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)); @@ -36949,7 +36976,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! */ @@ -36981,7 +37008,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; @@ -36990,7 +37017,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); @@ -37087,7 +37114,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(); @@ -37198,7 +37225,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); @@ -37220,7 +37247,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(); @@ -37232,14 +37259,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(); } @@ -37275,7 +37299,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); } } @@ -37317,14 +37342,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(); @@ -37489,7 +37512,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: @@ -37503,18 +37526,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(); @@ -37548,13 +37571,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(); @@ -37720,7 +37743,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); @@ -37743,7 +37766,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; @@ -37772,9 +37795,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; @@ -37870,7 +37893,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; @@ -37883,11 +37906,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 */ @@ -37926,7 +37951,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++; @@ -38443,15 +38468,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(); } @@ -38567,7 +38594,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); } } @@ -38615,8 +38643,6 @@ num_index: } if ((IS_CV == IS_VAR || IS_CV == IS_CV) && opline->extended_value) { - } else { - } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -38871,7 +38897,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; @@ -38884,11 +38910,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 */ @@ -39697,12 +39725,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); @@ -39712,7 +39734,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(); @@ -39806,15 +39830,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(); } @@ -40406,9 +40432,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); @@ -40448,7 +40471,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); } } @@ -40496,8 +40520,6 @@ num_index: } if ((IS_CV == IS_VAR || IS_CV == IS_CV) && opline->extended_value) { - } else { - } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -40880,7 +40902,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; @@ -40893,11 +40915,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 9b2877b996..a65349c4ed 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/acinclude.m4 b/acinclude.m4 index 3284978804..c25e59eef0 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -2686,14 +2686,14 @@ EOF fi for arg in $ac_configure_args; do if test `expr -- $arg : "'.*"` = 0; then - if test `expr -- $arg : "--.*"` = 0; then - break; + if test `expr -- $arg : "-.*"` = 0 && test `expr -- $arg : ".*=.*"` = 0; then + continue; fi echo "'[$]arg' \\" >> $1 CONFIGURE_OPTIONS="$CONFIGURE_OPTIONS '[$]arg'" else - if test `expr -- $arg : "'--.*"` = 0; then - break; + if test `expr -- $arg : "'-.*"` = 0 && test `expr -- $arg : "'.*=.*"` = 0; then + continue; fi echo "[$]arg \\" >> $1 CONFIGURE_OPTIONS="$CONFIGURE_OPTIONS [$]arg" @@ -3012,3 +3012,22 @@ EOF ;; esac ]) + +dnl +dnl PHP_CHECK_STDINT_TYPES +dnl +AC_DEFUN([PHP_CHECK_STDINT_TYPES], [ + AC_CHECK_SIZEOF([short], 2) + AC_CHECK_SIZEOF([int], 4) + AC_CHECK_SIZEOF([long], 4) + AC_CHECK_SIZEOF([long long], 8) + AC_CHECK_TYPES([int8, int16, int32, int64, int8_t, int16_t, int32_t, int64_t, uint8, uint16, uint32, uint64, uint8_t, uint16_t, uint32_t, uint64_t, u_int8_t, u_int16_t, u_int32_t, u_int64_t], [], [], [ +#if HAVE_STDINT_H +# include <stdint.h> +#endif +#if HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif + ]) + AC_DEFINE([PHP_HAVE_STDINT_TYPES], [1], [Checked for stdint types]) +]) diff --git a/configure.in b/configure.in index 40130626cb..16738fe30a 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=5 +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` @@ -572,6 +572,9 @@ PHP_CHECK_SIZEOF(intmax_t, 0) PHP_CHECK_SIZEOF(ssize_t, 8) PHP_CHECK_SIZEOF(ptrdiff_t, 8) +dnl Check stdint types (must be after header check) +PHP_CHECK_STDINT_TYPES + dnl Check for members of the stat structure AC_STRUCT_ST_BLKSIZE dnl AC_STRUCT_ST_BLOCKS will screw QNX because fileblocks.o does not exists diff --git a/ext/bz2/bz2.c b/ext/bz2/bz2.c index abe84fc316..4adaa47fa9 100644 --- a/ext/bz2/bz2.c +++ b/ext/bz2/bz2.c @@ -192,7 +192,7 @@ php_stream_ops php_stream_bz2io_ops = { /* {{{ Bzip2 stream openers */ PHP_BZ2_API php_stream *_php_stream_bz2open_from_BZFILE(BZFILE *bz, - char *mode, php_stream *innerstream STREAMS_DC TSRMLS_DC) + const char *mode, php_stream *innerstream STREAMS_DC TSRMLS_DC) { struct php_bz2_stream_data_t *self; @@ -205,8 +205,8 @@ PHP_BZ2_API php_stream *_php_stream_bz2open_from_BZFILE(BZFILE *bz, } PHP_BZ2_API php_stream *_php_stream_bz2open(php_stream_wrapper *wrapper, - char *path, - char *mode, + const char *path, + const char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) diff --git a/ext/bz2/php_bz2.h b/ext/bz2/php_bz2.h index 8b12eca357..7bcffc1831 100644 --- a/ext/bz2/php_bz2.h +++ b/ext/bz2/php_bz2.h @@ -47,8 +47,8 @@ extern zend_module_entry bz2_module_entry; # define PHP_BZ2_API #endif -PHP_BZ2_API php_stream *_php_stream_bz2open(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC); -PHP_BZ2_API php_stream *_php_stream_bz2open_from_BZFILE(BZFILE *bz, char *mode, php_stream *innerstream STREAMS_DC TSRMLS_DC); +PHP_BZ2_API php_stream *_php_stream_bz2open(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC); +PHP_BZ2_API php_stream *_php_stream_bz2open_from_BZFILE(BZFILE *bz, const char *mode, php_stream *innerstream STREAMS_DC TSRMLS_DC); #define php_stream_bz2open_from_BZFILE(bz, mode, innerstream) _php_stream_bz2open_from_BZFILE((bz), (mode), (innerstream) STREAMS_CC TSRMLS_CC) #define php_stream_bz2open(wrapper, path, mode, options, opened_path) _php_stream_bz2open((wrapper), (path), (mode), (options), (opened_path), NULL STREAMS_CC TSRMLS_CC) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 9fdb57cc4e..ac872dfbc2 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -1791,7 +1791,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->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 */ (*ch)->to_free->slist = emalloc(sizeof(HashTable)); zend_hash_init((*ch)->to_free->slist, 4, NULL, curl_free_slist, 0); diff --git a/ext/date/config0.m4 b/ext/date/config0.m4 index f403104a8a..0b46c6803a 100644 --- a/ext/date/config0.m4 +++ b/ext/date/config0.m4 @@ -22,4 +22,5 @@ cat > $ext_builddir/lib/timelib_config.h <<EOF #else # include <php_config.h> #endif +#include <php_stdint.h> EOF diff --git a/ext/date/lib/timelib_structs.h b/ext/date/lib/timelib_structs.h index a3d7793447..cc12eb38a6 100644 --- a/ext/date/lib/timelib_structs.h +++ b/ext/date/lib/timelib_structs.h @@ -23,37 +23,7 @@ #include "timelib_config.h" -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif - -#if defined(HAVE_INTTYPES_H) -#include <inttypes.h> -#elif defined(HAVE_STDINT_H) -#include <stdint.h> -#endif - -#ifdef PHP_WIN32 -/* TODO: Remove these hacks/defs once we have the int definitions in main/ - rathen than in each 2nd extension and win32/ */ -# include "win32/php_stdint.h" -#else -# ifndef HAVE_INT32_T -# if SIZEOF_INT == 4 -typedef int int32_t; -# elif SIZEOF_LONG == 4 -typedef long int int32_t; -# endif -# endif - -# ifndef HAVE_UINT32_T -# if SIZEOF_INT == 4 -typedef unsigned int uint32_t; -# elif SIZEOF_LONG == 4 -typedef unsigned long int uint32_t; -# endif -# endif -#endif +#include "php_stdint.h" #include <stdio.h> diff --git a/ext/exif/exif.c b/ext/exif/exif.c index bd646d9adf..ec121a6c32 100644 --- a/ext/exif/exif.c +++ b/ext/exif/exif.c @@ -40,16 +40,6 @@ #include "php.h" #include "ext/standard/file.h" -#ifdef HAVE_STDINT_H -# include <stdint.h> -#endif -#ifdef HAVE_INTTYPES_H -# include <inttypes.h> -#endif -#ifdef PHP_WIN32 -# include "win32/php_stdint.h" -#endif - #if HAVE_EXIF /* When EXIF_DEBUG is defined the module generates a lot of debug messages diff --git a/ext/ext_skel b/ext/ext_skel index 2492bf73da..061e78d649 100755 --- a/ext/ext_skel +++ b/ext/ext_skel @@ -12,7 +12,7 @@ echo "" echo " --extname=module module is the name of your extension" echo " --proto=file file contains prototypes of functions to create" echo " --stubs=file generate only function stubs in file" -echo " --xml generate xml documentation to be added to phpdoc-cvs" +echo " --xml generate xml documentation to be added to phpdoc-svn" echo " --skel=dir path to the skeleton directory" echo " --full-xml generate xml documentation for a self-contained extension" echo " (not yet implemented)" @@ -187,11 +187,43 @@ if (PHP_$EXTNAME != "no") { eof -$ECHO_N " .svnignore$ECHO_C" -cat >.svnignore <<eof +$ECHO_N " .gitignore$ECHO_C" +cat >.gitignore <<eof .deps *.lo *.la +.libs +acinclude.m4 +aclocal.m4 +autom4te.cache +build +config.guess +config.h +config.h.in +config.log +config.nice +config.status +config.sub +configure +configure.in +include +install-sh +libtool +ltmain.sh +Makefile +Makefile.fragments +Makefile.global +Makefile.objects +missing +mkinstalldirs +modules +run-tests.php +tests/*/*.diff +tests/*/*.out +tests/*/*.php +tests/*/*.exp +tests/*/*.log +tests/*/*.sh eof $ECHO_N " $extname.c$ECHO_C" diff --git a/ext/fileinfo/fileinfo.c b/ext/fileinfo/fileinfo.c index 353adb98b9..799891ed13 100644 --- a/ext/fileinfo/fileinfo.c +++ b/ext/fileinfo/fileinfo.c @@ -497,7 +497,7 @@ static void _php_finfo_get_type(INTERNAL_FUNCTION_PARAMETERS, int mode, int mime case FILEINFO_MODE_FILE: { /* determine if the file is a local file or remote URL */ - char *tmp2; + const char *tmp2; php_stream_wrapper *wrap; php_stream_statbuf ssb; diff --git a/ext/gd/gd.c b/ext/gd/gd.c index fb258214a1..d8a90f5fb6 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 3643535f2e..e34242bb73 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); } @@ -1711,6 +1709,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); @@ -1733,6 +1732,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 e3a3563aac..8b5c131e76 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 = 0, temp_exp = 0, temp_mod; + gmp_temp_t temp_base = {0}, temp_exp = {0}, 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/config.m4 b/ext/hash/config.m4 index 44c6d267bc..5174db3b71 100644 --- a/ext/hash/config.m4 +++ b/ext/hash/config.m4 @@ -31,7 +31,7 @@ if test "$PHP_HASH" != "no"; then EXT_HASH_HEADERS="php_hash.h php_hash_md.h php_hash_sha.h php_hash_ripemd.h \ php_hash_haval.h php_hash_tiger.h php_hash_gost.h php_hash_snefru.h \ php_hash_whirlpool.h php_hash_adler32.h php_hash_crc32.h \ - php_hash_fnv.h php_hash_joaat.h php_hash_types.h" + php_hash_fnv.h php_hash_joaat.h" PHP_NEW_EXTENSION(hash, $EXT_HASH_SOURCES, $ext_shared) ifdef([PHP_INSTALL_HEADERS], [ diff --git a/ext/hash/config.w32 b/ext/hash/config.w32 index abe8675f30..8e9d4c3d48 100644 --- a/ext/hash/config.w32 +++ b/ext/hash/config.w32 @@ -19,7 +19,6 @@ if (PHP_HASH != "no") { PHP_INSTALL_HEADERS("ext/hash/", "php_hash.h php_hash_md.h php_hash_sha.h php_hash_ripemd.h " + "php_hash_haval.h php_hash_tiger.h php_hash_gost.h php_hash_snefru.h " + - "php_hash_whirlpool.h php_hash_adler32.h php_hash_crc32.h " + - "php_hash_types.h"); + "php_hash_whirlpool.h php_hash_adler32.h php_hash_crc32.h"); } diff --git a/ext/hash/package.xml b/ext/hash/package.xml index 119cdd673d..25a598a4a1 100644 --- a/ext/hash/package.xml +++ b/ext/hash/package.xml @@ -42,7 +42,6 @@ Supported Algorithms: <file role="src" name="config.w32"/> <file role="src" name="hash.c"/> <file role="src" name="php_hash.h"/> - <file role="src" name="php_hash_types.h"/> <file role="src" name="hash_md.c"/> <file role="src" name="php_hash_md.h"/> <file role="src" name="hash_sha.c"/> diff --git a/ext/hash/php_hash.h b/ext/hash/php_hash.h index 4bfddbacd9..3f5e7ced3a 100644 --- a/ext/hash/php_hash.h +++ b/ext/hash/php_hash.h @@ -22,7 +22,6 @@ #define PHP_HASH_H #include "php.h" -#include "php_hash_types.h" #define PHP_HASH_EXTNAME "hash" #define PHP_HASH_EXTVER "1.0" @@ -30,6 +29,12 @@ #define PHP_HASH_HMAC 0x0001 +#define L64 INT64_C +#define php_hash_int32 int32_t +#define php_hash_uint32 uint32_t +#define php_hash_int64 int64_t +#define php_hash_uint64 uint64_t + typedef void (*php_hash_init_func_t)(void *context); typedef void (*php_hash_update_func_t)(void *context, const unsigned char *buf, unsigned int count); typedef void (*php_hash_final_func_t)(unsigned char *digest, void *context); diff --git a/ext/hash/php_hash_types.h b/ext/hash/php_hash_types.h deleted file mode 100644 index 8793da55d6..0000000000 --- a/ext/hash/php_hash_types.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | 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: Michael Wallner <mike@php.net> | - +----------------------------------------------------------------------+ -*/ - -/* $Id$ */ - -#ifndef PHP_HASH_TYPES_H -#define PHP_HASH_TYPES_H - -#ifdef HAVE_CONFIG_H -#include "config.h" -#else -#ifndef PHP_WIN32 -#include "php_config.h" -#endif -#endif - -#ifndef PHP_WIN32 -#if SIZEOF_LONG == 8 -#define L64(x) x -typedef unsigned long php_hash_uint64; -#if SIZEOF_INT == 4 -typedef unsigned int php_hash_uint32; -#elif SIZEOF_SHORT == 4 -typedef unsigned short php_hash_uint32; -#else -#error "Need a 32bit integer type" -#endif -#elif SIZEOF_LONG_LONG == 8 -#define L64(x) x##LL -typedef unsigned long long php_hash_uint64; -#if SIZEOF_INT == 4 -typedef unsigned int php_hash_uint32; -#elif SIZEOF_LONG == 4 -typedef unsigned long php_hash_uint32; -#else -#error "Need a 32bit integer type" -#endif -#else -#error "Need a 64bit integer type" -#endif -#else -#define L64(x) x##i64 -typedef unsigned __int64 php_hash_uint64; -typedef unsigned __int32 php_hash_uint32; -#endif - -#endif - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - * vim600: sw=4 ts=4 fdm=marker - * vim<600: sw=4 ts=4 - */ 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 de7ce55b10..96c41e6432 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/libxml/libxml.c b/ext/libxml/libxml.c index 354cb548a7..05b8df4d0d 100644 --- a/ext/libxml/libxml.c +++ b/ext/libxml/libxml.c @@ -293,7 +293,8 @@ static void *php_libxml_streams_IO_open_wrapper(const char *filename, const char php_stream_statbuf ssbuf; php_stream_context *context = NULL; php_stream_wrapper *wrapper = NULL; - char *resolved_path, *path_to_open = NULL; + char *resolved_path; + const char *path_to_open = NULL; void *ret_val = NULL; int isescaped=0; xmlURI *uri; diff --git a/ext/mysqlnd/config9.m4 b/ext/mysqlnd/config9.m4 index 09aca5af8a..0e08b977af 100644 --- a/ext/mysqlnd/config9.m4 +++ b/ext/mysqlnd/config9.m4 @@ -48,16 +48,4 @@ fi if test "$PHP_MYSQLND" != "no" || test "$PHP_MYSQLND_ENABLED" = "yes" || test "$PHP_MYSQLI" != "no"; then PHP_ADD_BUILD_DIR([ext/mysqlnd], 1) - - dnl This creates a file so it has to be after above macros - PHP_CHECK_TYPES([int8 uint8 int16 uint16 int32 uint32 uchar ulong int8_t uint8_t int16_t uint16_t int32_t uint32_t int64_t uint64_t], [ - ext/mysqlnd/php_mysqlnd_config.h - ],[ -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif -#ifdef HAVE_STDINT_H -#include <stdint.h> -#endif - ]) fi diff --git a/ext/mysqlnd/mysqlnd_enum_n_def.h b/ext/mysqlnd/mysqlnd_enum_n_def.h index 4ace69adcf..c9127ef93c 100644 --- a/ext/mysqlnd/mysqlnd_enum_n_def.h +++ b/ext/mysqlnd/mysqlnd_enum_n_def.h @@ -104,7 +104,7 @@ #define MYSQLND_CAPABILITIES (CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG | CLIENT_TRANSACTIONS | \ CLIENT_PROTOCOL_41 | CLIENT_SECURE_CONNECTION | \ - CLIENT_MULTI_RESULTS | CLIENT_PS_MULTI_RESULTS | CLIENT_LOCAL_FILES | CLIENT_PLUGIN_AUTH) + CLIENT_MULTI_RESULTS | CLIENT_LOCAL_FILES | CLIENT_PLUGIN_AUTH) #define MYSQLND_NET_FLAG_USE_COMPRESSION 1 diff --git a/ext/mysqlnd/mysqlnd_portability.h b/ext/mysqlnd/mysqlnd_portability.h index b9479150ae..72a156a795 100644 --- a/ext/mysqlnd/mysqlnd_portability.h +++ b/ext/mysqlnd/mysqlnd_portability.h @@ -36,8 +36,6 @@ This file is public domain and comes with NO WARRANTY of any kind */ #if defined(_WIN32) || defined(_WIN64) || defined(__WIN32__) || defined(WIN32) # include "ext/mysqlnd/config-win.h" -#else -# include <ext/mysqlnd/php_mysqlnd_config.h> #endif /* _WIN32... */ #if __STDC_VERSION__ < 199901L && !defined(atoll) @@ -45,14 +43,7 @@ This file is public domain and comes with NO WARRANTY of any kind */ #define atoll atol #endif - -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif - -#ifdef HAVE_STDINT_H -#include <stdint.h> -#endif +#include "php_stdint.h" #if SIZEOF_LONG_LONG > 4 && !defined(_LONG_LONG) #define _LONG_LONG 1 /* For AIX string library */ @@ -70,102 +61,6 @@ This file is public domain and comes with NO WARRANTY of any kind */ #define HAVE_LONG_LONG 1 #endif - -/* Typdefs for easyier portability */ -#ifndef HAVE_INT8_T -#ifndef HAVE_INT8 -typedef signed char int8_t; /* Signed integer >= 8 bits */ -#else -typedef int8 int8_t; /* Signed integer >= 8 bits */ -#endif -#endif - -#ifndef HAVE_UINT8_T -#ifndef HAVE_UINT8 -typedef unsigned char uint8_t; /* Unsigned integer >= 8 bits */ -#else -typedef uint8 uint8_t; /* Signed integer >= 8 bits */ -#endif -#endif - -#ifndef HAVE_INT16_T -#ifndef HAVE_INT16 -typedef signed short int16_t; /* Signed integer >= 16 bits */ -#else -typedef int16 int16_t; /* Signed integer >= 16 bits */ -#endif -#endif - -#ifndef HAVE_UINT16_T -#ifndef HAVE_UINT16 -typedef unsigned short uint16_t; /* Signed integer >= 16 bits */ -#else -typedef uint16 uint16_t; /* Signed integer >= 16 bits */ -#endif -#endif - - -#ifndef HAVE_INT32_T -#ifdef HAVE_INT32 -typedef int32 int32_t; -#elif SIZEOF_INT == 4 -typedef signed int int32_t; -#elif SIZEOF_LONG == 4 -typedef signed long int32_t; -#else -error "Neither int nor long is of 4 bytes width" -#endif -#endif /* HAVE_INT32_T */ - -#ifndef HAVE_UINT32_T -#ifdef HAVE_UINT32 -typedef uint32 uint32_t; -#elif SIZEOF_INT == 4 -typedef unsigned int uint32_t; -#elif SIZEOF_LONG == 4 -typedef unsigned long uint32_t; -#else -#error "Neither int nor long is of 4 bytes width" -#endif -#endif /* HAVE_UINT32_T */ - -#ifndef HAVE_INT64_T -#ifdef HAVE_INT64 -typedef int64 int64_t; -#elif SIZEOF_INT == 8 -typedef signed int int64_t; -#elif SIZEOF_LONG == 8 -typedef signed long int64_t; -#elif SIZEOF_LONG_LONG == 8 -#ifdef PHP_WIN32 -typedef __int64 int64_t; -#else -typedef signed long long int64_t; -#endif -#else -#error "Neither int nor long nor long long is of 8 bytes width" -#endif -#endif /* HAVE_INT64_T */ - -#ifndef HAVE_UINT64_T -#ifdef HAVE_UINT64 -typedef uint64 uint64_t; -#elif SIZEOF_INT == 8 -typedef unsigned int uint64_t; -#elif SIZEOF_LONG == 8 -typedef unsigned long uint64_t; -#elif SIZEOF_LONG_LONG == 8 -#ifdef PHP_WIN32 -typedef unsigned __int64 uint64_t; -#else -typedef unsigned long long uint64_t; -#endif -#else -#error "Neither int nor long nor long long is of 8 bytes width" -#endif -#endif /* HAVE_INT64_T */ - - #ifdef PHP_WIN32 #define MYSQLND_LLU_SPEC "%I64u" #define MYSQLND_LL_SPEC "%I64d" diff --git a/ext/oci8/README b/ext/oci8/README index 420d5dac58..af5beeb5c0 100644 --- a/ext/oci8/README +++ b/ext/oci8/README @@ -6,8 +6,8 @@ Use the OCI8 extension to access Oracle Database. Documentation is at http://php.net/oci8 The extension can be built with PHP versions 4.3.9 to 5.x using Oracle -9.2, 10, or 11 client libraries. Oracle's standard cross-version -connectivity applies. For example PHP linked with Oracle 11.2 client -libraries can connect to Oracle Database 9.2 onwards. See Oracle's -note "Oracle Client / Server Interoperability Support" (ID 207303.1) -for details. +Database 9.2, 10, 11 or 12 client libraries. Oracle's standard +cross-version connectivity applies. For example PHP linked with +Oracle 11.2 client libraries can connect to Oracle Database 9.2 +onwards. See Oracle's note "Oracle Client / Server Interoperability +Support" (ID 207303.1) for details. diff --git a/ext/oci8/config.m4 b/ext/oci8/config.m4 index 39c037548a..49998d18f0 100644 --- a/ext/oci8/config.m4 +++ b/ext/oci8/config.m4 @@ -15,22 +15,6 @@ else PHP_OCI8_TAIL1="tail -1" fi -AC_DEFUN([PHP_OCI_IF_DEFINED],[ - old_CPPFLAGS=$CPPFLAGS - CPPFLAGS=$3 - AC_EGREP_CPP(yes,[ -#include <oci.h> -#if defined($1) - yes -#endif - ],[ - CPPFLAGS=$old_CPPFLAGS - $2 - ],[ - CPPFLAGS=$old_CPPFLAGS - ]) -]) - AC_DEFUN([AC_OCI8_CHECK_LIB_DIR],[ AC_MSG_CHECKING([ORACLE_HOME library validity]) if test ! -d "$OCI8_DIR"; then @@ -98,13 +82,99 @@ AC_DEFUN([AC_OCI8_ORACLE_VERSION],[ AC_MSG_RESULT($OCI8_ORACLE_VERSION) ]) +dnl +dnl OCI8_INIT_DTRACE(providerdesc, header-file, sources) +dnl This mimics PHP_INIT_DTRACE from PHP 5.4's acinclude.m4. It is +dnl necessarily different from PHP_INIT_DTRACE which doesn't currently +dnl support DTrace for extensions. Creating OCI8_INIT_DTRACE +dnl independently instead of using a refactored PHP_INIT_DTRACE allows +dnl OCI8 to be DTraced on versions of PHP where core PHP DTrace support +dnl isn't available. +dnl +AC_DEFUN([OCI8_INIT_DTRACE],[ + ac_srcdir=[]PHP_EXT_SRCDIR([oci8])/ + ac_bdir=[]PHP_EXT_BUILDDIR([oci8])/ + +dnl providerdesc + ac_provsrc=$1 + +dnl header-file + ac_hdrobj=$2 + +dnl DTrace objects + old_IFS=[$]IFS + for ac_src in $3; do + IFS=. + set $ac_src + ac_obj=[$]1 + IFS=$old_IFS + + OCI8_DTRACE_OBJS="[$]OCI8_DTRACE_OBJS [$]ac_bdir[$]ac_obj.lo" + done; + + for ac_lo in $OCI8_DTRACE_OBJS; do + dtrace_oci8_objs="[$]dtrace_oci8_objs `echo $ac_lo | $SED -e 's,\.lo$,.o,' -e 's#\(.*\)\/#\1\/.libs\/#'`" + done; + +dnl Generate Makefile.objects entry +dnl The empty $ac_provsrc command stops an implicit circular dependency +dnl in GNU Make which causes the .d file to be overwritten (Bug 61268) + cat>>Makefile.objects<<EOF + +PHP_EXT_SRCDIR([oci8])/$ac_provsrc:; + +$ac_bdir[$]ac_hdrobj: $ac_srcdir[$]ac_provsrc + CFLAGS="\$(CFLAGS_CLEAN)" dtrace -h -C -s $ac_srcdir[$]ac_provsrc -o \$[]@.bak && \$(SED) -e 's,PHP_,DTRACE_,g' \$[]@.bak > \$[]@ + +\$(OCI8_DTRACE_OBJS): $ac_bdir[$]ac_hdrobj + +EOF + + case $host_alias in + *solaris*|*linux*) + dtrace_prov_name="`echo $ac_provsrc | $SED -e 's#\(.*\)\/##'`.o" + dtrace_lib_dir="`echo $ac_bdir[$]ac_provsrc | $SED -e 's#\(.*\)/[^/]*#\1#'`/.libs" + dtrace_d_obj="`echo $ac_bdir[$]ac_provsrc | $SED -e 's#\(.*\)/\([^/]*\)#\1/.libs/\2#'`.o" + dtrace_nolib_objs='$(OCI8_DTRACE_OBJS:.lo=.o)' + for ac_lo in $OCI8_DTRACE_OBJS; do + dtrace_oci8_lib_objs="[$]dtrace_oci8_lib_objs `echo $ac_lo | $SED -e 's,\.lo$,.o,' -e 's#\(.*\)\/#\1\/.libs\/#'`" + done; +dnl Always attempt to create both PIC and non-PIC DTrace objects (Bug 63692) + cat>>Makefile.objects<<EOF +$ac_bdir[$]ac_provsrc.lo: \$(OCI8_DTRACE_OBJS) + echo "[#] Generated by Makefile for libtool" > \$[]@ + @test -d "$dtrace_lib_dir" || mkdir $dtrace_lib_dir + if CFLAGS="\$(CFLAGS_CLEAN)" dtrace -G -o $dtrace_d_obj -s $ac_srcdir[$]ac_provsrc $dtrace_oci8_lib_objs 2> /dev/null && test -f "$dtrace_d_obj"; then [\\] + echo "pic_object=['].libs/$dtrace_prov_name[']" >> \$[]@ [;\\] + else [\\] + echo "pic_object='none'" >> \$[]@ [;\\] + fi + if CFLAGS="\$(CFLAGS_CLEAN)" dtrace -G -o $ac_bdir[$]ac_provsrc.o -s $ac_srcdir[$]ac_provsrc $dtrace_nolib_objs 2> /dev/null && test -f "$ac_bdir[$]ac_provsrc.o"; then [\\] + echo "non_pic_object=[']$dtrace_prov_name[']" >> \$[]@ [;\\] + else [\\] + echo "non_pic_object='none'" >> \$[]@ [;\\] + fi + +EOF + ;; + *) + AC_MSG_WARN([OCI8 extension: OCI8 DTrace support is not confirmed on this platform]) +cat>>Makefile.objects<<EOF +$ac_bdir[$]ac_provsrc.o: \$(OCI8_DTRACE_OBJS) + CFLAGS="\$(CFLAGS_CLEAN)" dtrace -G -o \$[]@ -s $ac_srcdir[$]ac_provsrc $dtrace_oci8_objs + +EOF + ;; + esac +]) + dnl --with-oci8=shared,instantclient,/path/to/client/dir/lib dnl or dnl --with-oci8=shared,/path/to/oracle/home PHP_ARG_WITH(oci8, for Oracle Database OCI8 support, -[ --with-oci8[=DIR] Include Oracle Database OCI8 support. DIR defaults to \$ORACLE_HOME. - Use --with-oci8=instantclient,/path/to/instant/client/lib +[ --with-oci8[=DIR] Include Oracle Database OCI8 support. DIR defaults to [$]ORACLE_HOME. + Use --with-oci8=instantclient,/path/to/instant/client/lib to use an Oracle Instant Client installation]) if test "$PHP_OCI8" != "no"; then @@ -140,12 +210,36 @@ if test "$PHP_OCI8" != "no"; then if test "$oci8_php_version" -lt "4003009"; then AC_MSG_ERROR([You need at least PHP 4.3.9 to be able to use this version of OCI8. PHP $php_version found]) - elif test "$oci8_php_version" -ge "6000000"; then - AC_MSG_ERROR([This version of OCI8 is not compatible with PHP 6 or higher]) else AC_MSG_RESULT([$php_version, ok]) fi + dnl Check whether --enable-dtrace was set. + dnl To use DTrace with a PECL install, extract the OCI8 archive, phpize it, and set + dnl PHP_DTRACE=yes before running configure + AC_MSG_CHECKING([OCI8 DTrace support]) + oci8_do_dtrace="`echo $PHP_OCI8 | cut -d, -f3`" + if test "$PHP_DTRACE" = "yes" -o "$oci8_do_dtrace" = "dtrace" ; then + AC_MSG_RESULT([yes]) + if test "$ext_shared" = "no"; then + AC_MSG_ERROR([For DTrace support OCI8 must be configured as a shared extension]) + else + AC_CHECK_HEADERS([sys/sdt.h], [ + OCI8_INIT_DTRACE([oci8_dtrace.d],[oci8_dtrace_gen.h],[oci8.c oci8_statement.c]) + + ], [ + AC_MSG_ERROR( + [Cannot find sys/sdt.h which is required for DTrace support]) + ]) + PHP_SUBST(OCI8_DTRACE_OBJS) + AC_DEFINE(HAVE_OCI8_DTRACE,1,[Defined to 1 if PHP OCI8 DTrace support was enabled during configuration]) + dnl Developer warning: hard coded extension is OK for the known supported environments + shared_objects_oci8="$shared_objects_oci8 PHP_EXT_BUILDDIR(oci8)/oci8_dtrace.d.lo" + fi + else + AC_MSG_RESULT([no]) + fi + dnl Set some port specific directory components for use later AC_CHECK_SIZEOF(long int, 4) @@ -255,14 +349,14 @@ if test "$PHP_OCI8" != "no"; then ;; *) - AC_DEFINE(HAVE_OCI_LOB_READ2,1,[ ]) + AC_DEFINE(HAVE_OCI_LOB_READ2,1,[Defined to 1 if OCI8 configuration located Oracle's OCILobRead2 function]) ;; esac PHP_ADD_LIBRARY(clntsh, 1, OCI8_SHARED_LIBADD) PHP_ADD_LIBPATH($OCI8_DIR/$OCI8_LIB_DIR, OCI8_SHARED_LIBADD) PHP_NEW_EXTENSION(oci8, oci8.c oci8_lob.c oci8_statement.c oci8_collection.c oci8_interface.c, $ext_shared) - AC_DEFINE(HAVE_OCI8,1,[ ]) + AC_DEFINE(HAVE_OCI8,1,[Defined to 1 if the PHP OCI8 extension for Oracle Database is configured]) PHP_SUBST_OLD(OCI8_SHARED_LIBADD) PHP_SUBST_OLD(OCI8_DIR) @@ -330,11 +424,11 @@ if test "$PHP_OCI8" != "no"; then PHP_ADD_LIBRARY(clntsh, 1, OCI8_SHARED_LIBADD) PHP_ADD_LIBPATH($PHP_OCI8_INSTANT_CLIENT, OCI8_SHARED_LIBADD) - AC_DEFINE(HAVE_OCI_INSTANT_CLIENT,1,[ ]) - AC_DEFINE(HAVE_OCI_LOB_READ2,1,[ ]) + AC_DEFINE(HAVE_OCI_INSTANT_CLIENT,1,[Defined to 1 if OCI8 configuration located Oracle's Instant Client libraries]) + AC_DEFINE(HAVE_OCI_LOB_READ2,1,[Defined to 1 if OCI8 configuration located Oracle's OCILobRead2 function]) PHP_NEW_EXTENSION(oci8, oci8.c oci8_lob.c oci8_statement.c oci8_collection.c oci8_interface.c, $ext_shared) - AC_DEFINE(HAVE_OCI8,1,[ ]) + AC_DEFINE(HAVE_OCI8,1,[Defined to 1 if the PHP OCI8 extension for Oracle Database is configured]) PHP_SUBST_OLD(OCI8_SHARED_LIBADD) PHP_SUBST_OLD(OCI8_DIR) diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index 44bfa71398..bccaa529b0 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -12,7 +12,7 @@ | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ - | Authors: Stig Sæther Bakken <ssb@php.net> | + | Authors: Stig S�ther Bakken <ssb@php.net> | | Thies C. Arntzen <thies@thieso.net> | | Maxim Maletsky <maxim@maxim.cx> | | | @@ -37,13 +37,6 @@ #include "php_ini.h" #include "ext/standard/php_smart_str.h" -#ifdef HAVE_STDINT_H -#include <stdint.h> -#endif -#ifdef PHP_WIN32 -#include "win32/php_stdint.h" -#endif - #if HAVE_OCI8 #if PHP_MAJOR_VERSION > 5 @@ -58,11 +51,17 @@ #include "php_oci8_int.h" #include "zend_hash.h" -#if defined(HAVE_STDINT_H) || defined(PHP_WIN32) -#define OCI8_INT_TO_PTR(I) ((void *)(intptr_t)(I)) +#if defined(__PTRDIFF_TYPE__) +# define OCI8_INT_TO_PTR(I) ((void*)(__PTRDIFF_TYPE__)(I)) +# define OCI8_PTR_TO_INT(P) ((int)(__PTRDIFF_TYPE__)(P)) +#elif !defined(__GNUC__) +#define OCI8_INT_TO_PTR(I) ((void*)&((char*)0)[I]) +#define OCI8_PTR_TO_INT(P) ((int)(((char*)P)-(char*)0)) +#elif defined(HAVE_STDINT_H) +#define OCI8_INT_TO_PTR(I) ((void*)(intptr_t)(I)) #define OCI8_PTR_TO_INT(P) ((int)(intptr_t)(P)) #else -#define OCI8_INT_TO_PTR(I) ((void *)(I)) +#define OCI8_INT_TO_PTR(I) ((void*)(I)) #define OCI8_PTR_TO_INT(P) ((int)(P)) #endif @@ -128,7 +127,7 @@ zend_class_entry *oci_coll_class_entry_ptr; #define PHP_OCI_INIT_MODE (OCI_DEFAULT | OCI_OBJECT) #endif -/* static protos {{{ */ +/* {{{ static protos */ static void php_oci_connection_list_dtor (zend_rsrc_list_entry * TSRMLS_DC); static void php_oci_pconnection_list_dtor (zend_rsrc_list_entry * TSRMLS_DC); static void php_oci_pconnection_list_np_dtor (zend_rsrc_list_entry * TSRMLS_DC); @@ -425,6 +424,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_oci_parse, 0, 0, 2) ZEND_ARG_INFO(0, sql_text) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_oci_get_implicit_resultset, 0, 0, 1) +ZEND_ARG_INFO(0, statement_resource) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO_EX(arginfo_oci_set_prefetch, 0, 0, 2) ZEND_ARG_INFO(0, statement_resource) ZEND_ARG_INFO(0, number_of_rows) @@ -698,6 +701,7 @@ static unsigned char arginfo_oci_bind_array_by_name[] = { 3, BYREF_NONE, BYREF_N #define arginfo_oci_error NULL #define arginfo_oci_num_fields NULL #define arginfo_oci_parse NULL +#define arginfo_oci_get_implicit_resultset NULL #define arginfo_oci_set_prefetch NULL #define arginfo_oci_set_client_identifier NULL #define arginfo_oci_set_edition NULL @@ -786,6 +790,7 @@ PHP_FUNCTION(oci_rollback); PHP_FUNCTION(oci_new_descriptor); PHP_FUNCTION(oci_num_fields); PHP_FUNCTION(oci_parse); +PHP_FUNCTION(oci_get_implicit_resultset); PHP_FUNCTION(oci_new_cursor); PHP_FUNCTION(oci_result); PHP_FUNCTION(oci_client_version); @@ -862,6 +867,7 @@ zend_function_entry php_oci_functions[] = { PHP_FE(oci_internal_debug, arginfo_oci_internal_debug) PHP_FE(oci_num_fields, arginfo_oci_num_fields) PHP_FE(oci_parse, arginfo_oci_parse) + PHP_FE(oci_get_implicit_resultset, arginfo_oci_get_implicit_resultset) PHP_FE(oci_new_cursor, arginfo_oci_new_cursor) PHP_FE(oci_result, arginfo_oci_result) PHP_FE(oci_client_version, arginfo_oci_client_version) @@ -1055,8 +1061,12 @@ PHP_INI_BEGIN() STD_PHP_INI_ENTRY( "oci8.statement_cache_size", "20", PHP_INI_SYSTEM, ONUPDATELONGFUNC, statement_cache_size, zend_oci_globals, oci_globals) STD_PHP_INI_ENTRY( "oci8.default_prefetch", "100", PHP_INI_SYSTEM, ONUPDATELONGFUNC, default_prefetch, zend_oci_globals, oci_globals) STD_PHP_INI_BOOLEAN("oci8.old_oci_close_semantics", "0", PHP_INI_SYSTEM, OnUpdateBool, old_oci_close_semantics,zend_oci_globals, oci_globals) +#if (OCI_MAJOR_VERSION >= 11) STD_PHP_INI_ENTRY( "oci8.connection_class", "", PHP_INI_ALL, OnUpdateString, connection_class, zend_oci_globals, oci_globals) +#endif +#if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2))) STD_PHP_INI_BOOLEAN("oci8.events", "0", PHP_INI_SYSTEM, OnUpdateBool, events, zend_oci_globals, oci_globals) +#endif PHP_INI_END() /* }}} */ @@ -1132,7 +1142,8 @@ static void php_oci_init_global_handles(TSRMLS_D) } } } -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_cleanup_global_handles() * @@ -1149,7 +1160,8 @@ static void php_oci_cleanup_global_handles(TSRMLS_D) PHP_OCI_CALL(OCIHandleFree, ((dvoid *) OCI_G(env), OCI_HTYPE_ENV)); OCI_G(env) = NULL; } -} /* }}} */ +} +/* }}} */ /* {{{ PHP_GINIT_FUNCTION * @@ -1294,7 +1306,6 @@ PHP_MINIT_FUNCTION(oci) PHP_RINIT_FUNCTION(oci) { - OCI_G(debug_mode) = 0; /* start "fresh" */ OCI_G(num_links) = OCI_G(num_persistent); OCI_G(errcode) = 0; OCI_G(edition) = NULL; @@ -1336,22 +1347,26 @@ PHP_RSHUTDOWN_FUNCTION(oci) PHP_MINFO_FUNCTION(oci) { char buf[32]; +#if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2))) char *ver; +#endif php_info_print_table_start(); php_info_print_table_row(2, "OCI8 Support", "enabled"); - php_info_print_table_row(2, "Version", PHP_OCI8_VERSION); +#if defined(HAVE_OCI8_DTRACE) + php_info_print_table_row(2, "OCI8 DTrace Support", "enabled"); +#else + php_info_print_table_row(2, "OCI8 DTrace Support", "disabled"); +#endif + php_info_print_table_row(2, "OCI8 Version", PHP_OCI8_VERSION); php_info_print_table_row(2, "Revision", "$Id$"); - snprintf(buf, sizeof(buf), "%ld", OCI_G(num_persistent)); - php_info_print_table_row(2, "Active Persistent Connections", buf); - snprintf(buf, sizeof(buf), "%ld", OCI_G(num_links)); - php_info_print_table_row(2, "Active Connections", buf); - #if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2))) php_oci_client_get_version(&ver TSRMLS_CC); php_info_print_table_row(2, "Oracle Run-time Client Library Version", ver); efree(ver); +#else + php_info_print_table_row(2, "Oracle Run-time Client Library Version", "Unknown"); #endif #if defined(OCI_MAJOR_VERSION) && defined(OCI_MINOR_VERSION) snprintf(buf, sizeof(buf), "%d.%d", OCI_MAJOR_VERSION, OCI_MINOR_VERSION); @@ -1361,9 +1376,9 @@ PHP_MINFO_FUNCTION(oci) snprintf(buf, sizeof(buf), "Unknown"); #endif #if defined(HAVE_OCI_INSTANT_CLIENT) - php_info_print_table_row(2, "Oracle Instant Client Version", buf); + php_info_print_table_row(2, "Oracle Compile-time Instant Client Version", buf); #else - php_info_print_table_row(2, "Oracle Version", buf); + php_info_print_table_row(2, "Oracle Compile-time Version", buf); #endif #if !defined(PHP_WIN32) && !defined(HAVE_OCI_INSTANT_CLIENT) @@ -1375,14 +1390,22 @@ PHP_MINFO_FUNCTION(oci) #endif #endif - php_info_print_table_row(2, "Temporary Lob support", "enabled"); - php_info_print_table_row(2, "Collections support", "enabled"); + php_info_print_table_end(); + DISPLAY_INI_ENTRIES(); + + php_info_print_table_start(); + php_info_print_table_header(2, "Statistics", ""); + snprintf(buf, sizeof(buf), "%ld", OCI_G(num_persistent)); + php_info_print_table_row(2, "Active Persistent Connections", buf); + snprintf(buf, sizeof(buf), "%ld", OCI_G(num_links)); + php_info_print_table_row(2, "Active Connections", buf); + php_info_print_table_end(); } /* }}} */ -/* list destructors {{{ */ +/* {{{ list destructors */ /* {{{ php_oci_connection_list_dtor() * @@ -1396,7 +1419,8 @@ static void php_oci_connection_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC) php_oci_connection_close(connection TSRMLS_CC); OCI_G(num_links)--; } -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_pconnection_list_dtor() * @@ -1411,7 +1435,8 @@ static void php_oci_pconnection_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC) OCI_G(num_persistent)--; OCI_G(num_links)--; } -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_pconnection_list_np_dtor() * @@ -1449,11 +1474,12 @@ static void php_oci_pconnection_list_np_dtor(zend_rsrc_list_entry *entry TSRMLS_ OCI_G(num_persistent)--; } - if (OCI_G(debug_mode)) { - php_printf ("OCI8 DEBUG L1: np_dtor cleaning up: (%p) at (%s:%d) \n", connection, __FILE__, __LINE__); +#ifdef HAVE_OCI8_DTRACE + if (DTRACE_OCI8_CONNECT_P_DTOR_CLOSE_ENABLED()) { + DTRACE_OCI8_CONNECT_P_DTOR_CLOSE(connection); } - } - else { +#endif /* HAVE_OCI8_DTRACE */ + } else { /* * Release the connection to underlying pool. We do this unconditionally so that * out-of-scope pconnects are now consistent with oci_close and out-of-scope new connect @@ -1465,11 +1491,14 @@ static void php_oci_pconnection_list_np_dtor(zend_rsrc_list_entry *entry TSRMLS_ */ php_oci_connection_release(connection TSRMLS_CC); - if (OCI_G(debug_mode)) { - php_printf ("OCI8 DEBUG L1: np_dtor releasing: (%p) at (%s:%d) \n", connection, __FILE__, __LINE__); +#ifdef HAVE_OCI8_DTRACE + if (DTRACE_OCI8_CONNECT_P_DTOR_RELEASE_ENABLED()) { + DTRACE_OCI8_CONNECT_P_DTOR_RELEASE(connection); } +#endif /* HAVE_OCI8_DTRACE */ } -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_statement_list_dtor() * @@ -1479,7 +1508,8 @@ static void php_oci_statement_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC) { php_oci_statement *statement = (php_oci_statement *)entry->ptr; php_oci_statement_free(statement TSRMLS_CC); -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_descriptor_list_dtor() * @@ -1489,7 +1519,8 @@ static void php_oci_descriptor_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC) { php_oci_descriptor *descriptor = (php_oci_descriptor *)entry->ptr; php_oci_lob_free(descriptor TSRMLS_CC); -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_collection_list_dtor() * @@ -1499,11 +1530,12 @@ static void php_oci_collection_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC) { php_oci_collection *collection = (php_oci_collection *)entry->ptr; php_oci_collection_close(collection TSRMLS_CC); -} /* }}} */ +} +/* }}} */ /* }}} */ -/* Hash Destructors {{{ */ +/* {{{ Hash Destructors */ /* {{{ php_oci_define_hash_dtor() * @@ -1605,18 +1637,17 @@ void php_oci_connection_descriptors_free(php_oci_connection *connection TSRMLS_D } /* }}} */ - /* {{{ php_oci_error() * * Fetch & print out error message if we get an error * Returns an Oracle error number */ -sb4 php_oci_error(OCIError *err_p, sword status TSRMLS_DC) +sb4 php_oci_error(OCIError *err_p, sword errstatus TSRMLS_DC) { text *errbuf = (text *)NULL; - sb4 errcode = 0; + sb4 errcode = 0; /* Oracle error number */ - switch (status) { + switch (errstatus) { case OCI_SUCCESS: break; case OCI_SUCCESS_WITH_INFO: @@ -1659,9 +1690,16 @@ sb4 php_oci_error(OCIError *err_p, sword status TSRMLS_DC) php_error_docref(NULL TSRMLS_CC, E_WARNING, "OCI_CONTINUE"); break; default: - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown OCI error code: %d", status); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown OCI error code: %d", errstatus); break; } + +#ifdef HAVE_OCI8_DTRACE + if (DTRACE_OCI8_ERROR_ENABLED()) { + DTRACE_OCI8_ERROR((int)errstatus, (long)errcode); + } +#endif /* HAVE_OCI8_DTRACE */ + return errcode; } /* }}} */ @@ -1690,7 +1728,8 @@ sb4 php_oci_fetch_errmsg(OCIError *error_handle, text **error_buf TSRMLS_DC) } } return error_code; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_fetch_sqltext_offset() * @@ -1718,7 +1757,8 @@ int php_oci_fetch_sqltext_offset(php_oci_statement *statement, text **sqltext, u return 1; } return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_do_connect() * @@ -1738,18 +1778,32 @@ void php_oci_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent, int exclus return; } +#ifdef HAVE_OCI8_DTRACE + if (DTRACE_OCI8_CONNECT_ENTRY_ENABLED()) { + DTRACE_OCI8_CONNECT_ENTRY(username, dbname, charset, session_mode, persistent, exclusive); + } +#endif /* HAVE_OCI8_DTRACE */ + if (!charset_len) { charset = NULL; } connection = php_oci_do_connect_ex(username, username_len, password, password_len, NULL, 0, dbname, dbname_len, charset, session_mode, persistent, exclusive TSRMLS_CC); +#ifdef HAVE_OCI8_DTRACE + if (DTRACE_OCI8_CONNECT_RETURN_ENABLED()) { + DTRACE_OCI8_CONNECT_RETURN(connection); + } +#endif /* HAVE_OCI8_DTRACE */ + + if (!connection) { RETURN_FALSE; } - RETURN_RESOURCE(connection->rsrc_id); + RETURN_RESOURCE(connection->id); -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_do_connect_ex() * @@ -1908,16 +1962,11 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char } } - /* Debug statements {{{ */ - if (OCI_G(debug_mode)) { - if (connection && connection->is_stub) { - php_printf ("OCI8 DEBUG L1: Got a cached stub: (%p) at (%s:%d) \n", connection, __FILE__, __LINE__); - } else if (connection) { - php_printf ("OCI8 DEBUG L1: Got a cached connection: (%p) at (%s:%d) \n", connection, __FILE__, __LINE__); - } else { - php_printf ("OCI8 DEBUG L1: Got NO cached connection at (%s:%d) \n", __FILE__, __LINE__); - } - } /* }}} */ +#ifdef HAVE_OCI8_DTRACE + if (DTRACE_OCI8_CONNECT_LOOKUP_ENABLED()) { + DTRACE_OCI8_CONNECT_LOOKUP(connection, connection && connection->is_stub ? 1 : 0); + } +#endif /* HAVE_OCI8_DTRACE */ /* If we got a pconnection stub, then 'load'(OCISessionGet) the real connection from its * private spool A connection is a stub if it is only a cached structure and the real @@ -1963,24 +2012,20 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char /* okay, the connection is open and the server is still alive */ connection->used_this_request = 1; - tmp = (php_oci_connection *)zend_list_find(connection->rsrc_id, &rsrc_type); + tmp = (php_oci_connection *)zend_list_find(connection->id, &rsrc_type); if (tmp != NULL && rsrc_type == le_pconnection && strlen(tmp->hash_key) == hashed_details.len && - memcmp(tmp->hash_key, hashed_details.c, hashed_details.len) == 0 && zend_list_addref(connection->rsrc_id) == SUCCESS) { + memcmp(tmp->hash_key, hashed_details.c, hashed_details.len) == 0 && zend_list_addref(connection->id) == SUCCESS) { /* do nothing */ } else { -#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 3) || (PHP_MAJOR_VERSION > 5) - connection->rsrc_id = zend_list_insert(connection, le_pconnection TSRMLS_CC); -#else - connection->rsrc_id = zend_list_insert(connection, le_pconnection); -#endif + PHP_OCI_REGISTER_RESOURCE(connection, le_pconnection); /* Persistent connections: For old close semantics we artificially * bump up the refcount to prevent the non-persistent destructor * from getting called until request shutdown. The refcount is * decremented in the persistent helper */ if (OCI_G(old_oci_close_semantics)) { - zend_list_addref(connection->rsrc_id); + zend_list_addref(connection->id); } } smart_str_free_ex(&hashed_details, 0); @@ -1991,7 +2036,7 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char } else { /* we do not ping non-persistent connections */ smart_str_free_ex(&hashed_details, 0); - zend_list_addref(connection->rsrc_id); + zend_list_addref(connection->id); return connection; } } /* is_open is true? */ @@ -2008,7 +2053,7 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char /* We have to do a hash_del but need to preserve the resource if there is a positive * refcount. Set the data pointer in the list entry to NULL */ - if (connection == zend_list_find(connection->rsrc_id, &rsrc_type) && rsrc_type == le_pconnection) { + if (connection == zend_list_find(connection->id, &rsrc_type) && rsrc_type == le_pconnection) { le->ptr = NULL; } @@ -2085,7 +2130,8 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char smart_str_free_ex(&hashed_details, 0); return NULL; } - } /* }}} */ + } + /* }}} */ connection->idle_expiry = (OCI_G(persistent_timeout) > 0) ? (timestamp + OCI_G(persistent_timeout)) : 0; @@ -2124,50 +2170,34 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char new_le.ptr = connection; new_le.type = le_pconnection; connection->used_this_request = 1; -#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 3) || (PHP_MAJOR_VERSION > 5) - connection->rsrc_id = zend_list_insert(connection, le_pconnection TSRMLS_CC); -#else - connection->rsrc_id = zend_list_insert(connection, le_pconnection); -#endif + PHP_OCI_REGISTER_RESOURCE(connection, le_pconnection); /* Persistent connections: For old close semantics we artificially bump up the refcount to * prevent the non-persistent destructor from getting called until request shutdown. The * refcount is decremented in the persistent helper */ if (OCI_G(old_oci_close_semantics)) { - zend_list_addref(connection->rsrc_id); + zend_list_addref(connection->id); } zend_hash_update(&EG(persistent_list), connection->hash_key, strlen(connection->hash_key)+1, (void *)&new_le, sizeof(zend_rsrc_list_entry), NULL); OCI_G(num_persistent)++; OCI_G(num_links)++; } else if (!exclusive) { -#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 3) || (PHP_MAJOR_VERSION > 5) - connection->rsrc_id = zend_list_insert(connection, le_connection TSRMLS_CC); -#else - connection->rsrc_id = zend_list_insert(connection, le_connection); -#endif - new_le.ptr = OCI8_INT_TO_PTR(connection->rsrc_id); + PHP_OCI_REGISTER_RESOURCE(connection, le_connection); + new_le.ptr = OCI8_INT_TO_PTR(connection->id); new_le.type = le_index_ptr; zend_hash_update(&EG(regular_list), connection->hash_key, strlen(connection->hash_key)+1, (void *)&new_le, sizeof(zend_rsrc_list_entry), NULL); OCI_G(num_links)++; } else { -#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 3) || (PHP_MAJOR_VERSION > 5) - connection->rsrc_id = zend_list_insert(connection, le_connection TSRMLS_CC); -#else - connection->rsrc_id = zend_list_insert(connection, le_connection); -#endif + PHP_OCI_REGISTER_RESOURCE(connection, le_connection); OCI_G(num_links)++; } - /* Debug statements {{{ */ - if (OCI_G(debug_mode)) { - if (connection->is_persistent) { - php_printf ("OCI8 DEBUG L1: New Persistent Connection address: (%p) at (%s:%d) \n", connection, __FILE__, __LINE__); - } else { - php_printf ("OCI8 DEBUG L1: New Non-Persistent Connection address: (%p) at (%s:%d) \n", connection, __FILE__, __LINE__); - } - php_printf ("OCI8 DEBUG L1: num_persistent=(%ld), num_links=(%ld) at (%s:%d) \n", OCI_G(num_persistent), OCI_G(num_links), __FILE__, __LINE__); - } /* }}} */ +#ifdef HAVE_OCI8_DTRACE + if (DTRACE_OCI8_CONNECT_TYPE_ENABLED()) { + DTRACE_OCI8_CONNECT_TYPE(connection->is_persistent ? 1 : 0, exclusive ? 1 : 0, connection, OCI_G(num_persistent), OCI_G(num_links)); + } +#endif /* HAVE_OCI8_DTRACE */ return connection; } @@ -2179,20 +2209,24 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char */ static int php_oci_connection_ping(php_oci_connection *connection TSRMLS_DC) { + sword errstatus; + + OCI_G(errcode) = 0; /* assume ping is successful */ + /* Use OCIPing instead of OCIServerVersion. If OCIPing returns ORA-1010 (invalid OCI operation) * such as from Pre-10.1 servers, the error is still from the server and we would have * successfully performed a roundtrip and validated the connection. Use OCIServerVersion for * Pre-10.2 clients */ #if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2))) /* OCIPing available 10.2 onwards */ - PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIPing, (connection->svc, OCI_G(err), OCI_DEFAULT)); + PHP_OCI_CALL_RETURN(errstatus, OCIPing, (connection->svc, OCI_G(err), OCI_DEFAULT)); #else char version[256]; /* use good old OCIServerVersion() */ - PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIServerVersion, (connection->svc, OCI_G(err), (text *)version, sizeof(version), OCI_HTYPE_SVCCTX)); + PHP_OCI_CALL_RETURN(errstatus, OCIServerVersion, (connection->svc, OCI_G(err), (text *)version, sizeof(version), OCI_HTYPE_SVCCTX)); #endif - if (OCI_G(errcode) == OCI_SUCCESS) { + if (errstatus == OCI_SUCCESS) { return 1; } else { sb4 error_code = 0; @@ -2203,10 +2237,9 @@ static int php_oci_connection_ping(php_oci_connection *connection TSRMLS_DC) if (error_code == 1010) { return 1; } + OCI_G(errcode) = error_code; } - /* ignore errors here, just return failure - * php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); */ return 0; } /* }}} */ @@ -2217,17 +2250,17 @@ static int php_oci_connection_ping(php_oci_connection *connection TSRMLS_DC) */ static int php_oci_connection_status(php_oci_connection *connection TSRMLS_DC) { - ub4 ss = 0; + ub4 ss = OCI_SERVER_NOT_CONNECTED; + sword errstatus; /* get OCI_ATTR_SERVER_STATUS */ - PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrGet, ((dvoid *)connection->server, OCI_HTYPE_SERVER, (dvoid *)&ss, (ub4 *)0, OCI_ATTR_SERVER_STATUS, OCI_G(err))); + PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ((dvoid *)connection->server, OCI_HTYPE_SERVER, (dvoid *)&ss, (ub4 *)0, OCI_ATTR_SERVER_STATUS, OCI_G(err))); - if (OCI_G(errcode) == OCI_SUCCESS && ss == OCI_SERVER_NORMAL) { + if (errstatus == OCI_SUCCESS && ss == OCI_SERVER_NORMAL) { return 1; } - /* ignore errors here, just return failure - * php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); */ + /* ignore errors here, just return failure */ return 0; } /* }}} */ @@ -2238,16 +2271,20 @@ static int php_oci_connection_status(php_oci_connection *connection TSRMLS_DC) */ int php_oci_connection_rollback(php_oci_connection *connection TSRMLS_DC) { - PHP_OCI_CALL_RETURN(connection->errcode, OCITransRollback, (connection->svc, connection->err, (ub4) 0)); - connection->needs_commit = 0; + sword errstatus; + + PHP_OCI_CALL_RETURN(errstatus, OCITransRollback, (connection->svc, connection->err, (ub4) 0)); + connection->rb_on_disconnect = 0; - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_connection_commit() * @@ -2255,16 +2292,20 @@ int php_oci_connection_rollback(php_oci_connection *connection TSRMLS_DC) */ int php_oci_connection_commit(php_oci_connection *connection TSRMLS_DC) { - PHP_OCI_CALL_RETURN(connection->errcode, OCITransCommit, (connection->svc, connection->err, (ub4) 0)); - connection->needs_commit = 0; + sword errstatus; + + PHP_OCI_CALL_RETURN(errstatus, OCITransCommit, (connection->svc, connection->err, (ub4) 0)); + connection->rb_on_disconnect = 0; - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_connection_close() * @@ -2275,13 +2316,19 @@ static int php_oci_connection_close(php_oci_connection *connection TSRMLS_DC) int result = 0; zend_bool in_call_save = OCI_G(in_call); +#ifdef HAVE_OCI8_DTRACE + if (DTRACE_OCI8_CONNECTION_CLOSE_ENABLED()) { + DTRACE_OCI8_CONNECTION_CLOSE(connection); + } +#endif /* HAVE_OCI8_DTRACE */ + if (!connection->is_stub) { /* Release resources associated with connection */ php_oci_connection_release(connection TSRMLS_CC); } if (!connection->using_spool && connection->svc) { - PHP_OCI_CALL(OCISessionEnd, (connection->svc, connection->err, connection->session, (ub4) 0)); + PHP_OCI_CALL(OCISessionEnd, (connection->svc, connection->err, connection->session, (ub4) 0)); } if (connection->err) { @@ -2302,7 +2349,7 @@ static int php_oci_connection_close(php_oci_connection *connection TSRMLS_DC) } if (connection->svc) { - PHP_OCI_CALL(OCIHandleFree, ((dvoid *) connection->svc, (ub4) OCI_HTYPE_SVCCTX)); + PHP_OCI_CALL(OCIHandleFree, ((dvoid *) connection->svc, (ub4) OCI_HTYPE_SVCCTX)); } if (connection->server) { @@ -2333,7 +2380,8 @@ static int php_oci_connection_close(php_oci_connection *connection TSRMLS_DC) connection = NULL; OCI_G(in_call) = in_call_save; return result; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_connection_release() * @@ -2357,7 +2405,7 @@ int php_oci_connection_release(php_oci_connection *connection TSRMLS_DC) if (connection->svc) { /* rollback outstanding transactions */ - if (connection->needs_commit) { + if (connection->rb_on_disconnect) { if (php_oci_connection_rollback(connection TSRMLS_CC)) { /* rollback failed */ result = 1; @@ -2408,7 +2456,7 @@ int php_oci_connection_release(php_oci_connection *connection TSRMLS_DC) connection->server = NULL; connection->session = NULL; - connection->is_attached = connection->is_open = connection->needs_commit = connection->used_this_request = 0; + connection->is_attached = connection->is_open = connection->rb_on_disconnect = connection->used_this_request = 0; connection->is_stub = 1; /* Cut the link between the connection structure and the time_t structure allocated within @@ -2419,7 +2467,8 @@ int php_oci_connection_release(php_oci_connection *connection TSRMLS_DC) OCI_G(in_call) = in_call_save; return result; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_password_change() * @@ -2427,17 +2476,20 @@ int php_oci_connection_release(php_oci_connection *connection TSRMLS_DC) */ int php_oci_password_change(php_oci_connection *connection, char *user, int user_len, char *pass_old, int pass_old_len, char *pass_new, int pass_new_len TSRMLS_DC) { - PHP_OCI_CALL_RETURN(connection->errcode, OCIPasswordChange, (connection->svc, connection->err, (text *)user, user_len, (text *)pass_old, pass_old_len, (text *)pass_new, pass_new_len, OCI_DEFAULT)); + sword errstatus; + + PHP_OCI_CALL_RETURN(errstatus, OCIPasswordChange, (connection->svc, connection->err, (text *)user, user_len, (text *)pass_old, pass_old_len, (text *)pass_new, pass_new_len, OCI_DEFAULT)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ connection->passwd_changed = 1; return 0; -} /* }}} */ - +} +/* }}} */ /* {{{ php_oci_client_get_version() * @@ -2446,21 +2498,21 @@ int php_oci_password_change(php_oci_connection *connection, char *user, int user void php_oci_client_get_version(char **version TSRMLS_DC) { char version_buff[256]; +#if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2))) /* OCIClientVersion only available 10.2 onwards */ sword major_version = 0; sword minor_version = 0; sword update_num = 0; sword patch_num = 0; sword port_update_num = 0; -#if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2))) /* OCIClientVersion only available 10.2 onwards */ PHP_OCI_CALL(OCIClientVersion, (&major_version, &minor_version, &update_num, &patch_num, &port_update_num)); snprintf(version_buff, sizeof(version_buff), "%d.%d.%d.%d.%d", major_version, minor_version, update_num, patch_num, port_update_num); #else memcpy(version_buff, "Unknown", sizeof("Unknown")); #endif *version = estrdup(version_buff); -} /* }}} */ - +} +/* }}} */ /* {{{ php_oci_server_get_version() * @@ -2468,19 +2520,21 @@ void php_oci_client_get_version(char **version TSRMLS_DC) */ int php_oci_server_get_version(php_oci_connection *connection, char **version TSRMLS_DC) { + sword errstatus; char version_buff[256]; - PHP_OCI_CALL_RETURN(connection->errcode, OCIServerVersion, (connection->svc, connection->err, (text *)version_buff, sizeof(version_buff), OCI_HTYPE_SVCCTX)); + PHP_OCI_CALL_RETURN(errstatus, OCIServerVersion, (connection->svc, connection->err, (text *)version_buff, sizeof(version_buff), OCI_HTYPE_SVCCTX)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } *version = estrdup(version_buff); return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_column_to_zval() * @@ -2564,14 +2618,19 @@ int php_oci_column_to_zval(php_oci_out_column *column, zval *value, int mode TSR } /* }}} */ + /* {{{ php_oci_fetch_row() * * Fetch the next row from the given statement + * Has logic for Oracle 12c Implicit Result Sets */ void php_oci_fetch_row (INTERNAL_FUNCTION_PARAMETERS, int mode, int expected_args) { zval *z_statement, *array; - php_oci_statement *statement; + php_oci_statement *statement; /* statement that will be fetched from */ +#if (OCI_MAJOR_VERSION >= 12) + php_oci_statement *invokedstatement; /* statement this function was invoked with */ +#endif /* OCI_MAJOR_VERSION */ php_oci_out_column *column; ub4 nrows = 1; int i; @@ -2617,11 +2676,63 @@ void php_oci_fetch_row (INTERNAL_FUNCTION_PARAMETERS, int mode, int expected_arg } } +#if (OCI_MAJOR_VERSION < 12) PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement); if (php_oci_statement_fetch(statement, nrows TSRMLS_CC)) { - RETURN_FALSE; + RETURN_FALSE; /* end of fetch */ } +#else /* OCI_MAJOR_VERSION */ + PHP_OCI_ZVAL_TO_STATEMENT(z_statement, invokedstatement); + + if (invokedstatement->impres_flag == PHP_OCI_IMPRES_NO_CHILDREN) { + /* Already know there are no Implicit Result Sets */ + statement = invokedstatement; + } else if (invokedstatement->impres_flag == PHP_OCI_IMPRES_HAS_CHILDREN) { + /* Previously saw an Implicit Result Set in an earlier invocation of php_oci_fetch_row */ + statement = (php_oci_statement *)invokedstatement->impres_child_stmt; + } else { + sword errstatus; + + /* Check for an Implicit Result Set on this statement handle */ + PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ((dvoid *)invokedstatement->stmt, OCI_HTYPE_STMT, + (dvoid *) &invokedstatement->impres_count, + (ub4 *)NULL, OCI_ATTR_IMPLICIT_RESULT_COUNT, invokedstatement->err)); + if (errstatus) { + RETURN_FALSE; + } + if (invokedstatement->impres_count > 0) { + /* Make it so the fetch occurs on the first Implicit Result Set */ + statement = php_oci_get_implicit_resultset(invokedstatement TSRMLS_CC); + if (!statement || php_oci_statement_execute(statement, (ub4)OCI_DEFAULT TSRMLS_CC)) + RETURN_FALSE; + invokedstatement->impres_count--; + invokedstatement->impres_child_stmt = (struct php_oci_statement *)statement; + invokedstatement->impres_flag = PHP_OCI_IMPRES_HAS_CHILDREN; + } else { + statement = invokedstatement; /* didn't find Implicit Result Sets */ + invokedstatement->impres_flag = PHP_OCI_IMPRES_NO_CHILDREN; /* Don't bother checking again */ + } + } + + if (php_oci_statement_fetch(statement, nrows TSRMLS_CC)) { + /* End of fetch */ + if (invokedstatement->impres_count > 0) { + /* Check next Implicit Result Set */ + statement = php_oci_get_implicit_resultset(invokedstatement TSRMLS_CC); + if (!statement || php_oci_statement_execute(statement, (ub4)OCI_DEFAULT TSRMLS_CC)) + RETURN_FALSE; + invokedstatement->impres_count--; + invokedstatement->impres_child_stmt = (struct php_oci_statement *)statement; + if (php_oci_statement_fetch(statement, nrows TSRMLS_CC)) { + /* End of all fetches */ + RETURN_FALSE; + } + } else { + RETURN_FALSE; + } + } +#endif /* OCI_MAJOR_VERSION */ array_init(return_value); @@ -2688,9 +2799,11 @@ static int php_oci_persistent_helper(zend_rsrc_list_entry *le TSRMLS_DC) connection = (php_oci_connection *)le->ptr; if (!connection->used_this_request && OCI_G(persistent_timeout) != -1) { - if (OCI_G(debug_mode)) { - php_printf ("OCI8 DEBUG L1: persistent_helper processing for timeout: (%p stub=%d) at (%s:%d) \n", connection, connection->is_stub, __FILE__, __LINE__); +#ifdef HAVE_OCI8_DTRACE + if (DTRACE_OCI8_CONNECT_EXPIRY_ENABLED()) { + DTRACE_OCI8_CONNECT_EXPIRY(connection, connection->is_stub ? 1 : 0, (long)connection->idle_expiry, (long)timestamp); } +#endif /* HAVE_OCI8_DTRACE */ if (connection->idle_expiry < timestamp) { /* connection has timed out */ return ZEND_HASH_APPLY_REMOVE; @@ -2698,7 +2811,8 @@ static int php_oci_persistent_helper(zend_rsrc_list_entry *le TSRMLS_DC) } } return ZEND_HASH_APPLY_KEEP; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_create_spool() * @@ -2710,6 +2824,7 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha zend_bool iserror = 0; ub4 poolmode = OCI_DEFAULT; /* Mode to be passed to OCISessionPoolCreate */ OCIAuthInfo *spoolAuth = NULL; + sword errstatus; /* Allocate sessionpool out of persistent memory */ session_pool = (php_oci_spool *) calloc(1, sizeof(php_oci_spool)); @@ -2734,10 +2849,10 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha } /* Allocate the pool handle */ - PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIHandleAlloc, (session_pool->env, (dvoid **) &session_pool->poolh, OCI_HTYPE_SPOOL, (size_t) 0, (dvoid **) 0)); + PHP_OCI_CALL_RETURN(errstatus, OCIHandleAlloc, (session_pool->env, (dvoid **) &session_pool->poolh, OCI_HTYPE_SPOOL, (size_t) 0, (dvoid **) 0)); - if (OCI_G(errcode) != OCI_SUCCESS) { - php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + OCI_G(errcode) = php_oci_error(OCI_G(err), errstatus TSRMLS_CC); iserror = 1; goto exit_create_spool; } @@ -2746,10 +2861,10 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha * generic bug which can free up the OCI_G(err) variable before destroying connections. We * cannot use this for other roundtrip calls as there is no way the user can access this error */ - PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIHandleAlloc, ((dvoid *) session_pool->env, (dvoid **)&(session_pool->err), (ub4) OCI_HTYPE_ERROR,(size_t) 0, (dvoid **) 0)); + PHP_OCI_CALL_RETURN(errstatus, OCIHandleAlloc, ((dvoid *) session_pool->env, (dvoid **)&(session_pool->err), (ub4) OCI_HTYPE_ERROR,(size_t) 0, (dvoid **) 0)); - if (OCI_G(errcode) != OCI_SUCCESS) { - php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + OCI_G(errcode) = php_oci_error(OCI_G(err), errstatus TSRMLS_CC); iserror = 1; goto exit_create_spool; } @@ -2762,52 +2877,56 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha #endif #if ((OCI_MAJOR_VERSION > 11) || ((OCI_MAJOR_VERSION == 11) && (OCI_MINOR_VERSION >= 2))) - /* Allocate auth handle for session pool {{{ */ - PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIHandleAlloc, (session_pool->env, (dvoid **)&(spoolAuth), OCI_HTYPE_AUTHINFO, 0, NULL)); + /* {{{ Allocate auth handle for session pool */ + PHP_OCI_CALL_RETURN(errstatus, OCIHandleAlloc, (session_pool->env, (dvoid **)&(spoolAuth), OCI_HTYPE_AUTHINFO, 0, NULL)); - if (OCI_G(errcode) != OCI_SUCCESS) { - php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + OCI_G(errcode) = php_oci_error(OCI_G(err), errstatus TSRMLS_CC); iserror = 1; goto exit_create_spool; - } /* }}} */ + } + /* }}} */ - /* Set the edition attribute on the auth handle {{{ */ + /* {{{ Set the edition attribute on the auth handle */ if (OCI_G(edition)) { - PHP_OCI_CALL_RETURN(OCI_G(errcode),OCIAttrSet, ((dvoid *) spoolAuth, (ub4) OCI_HTYPE_AUTHINFO, (dvoid *) OCI_G(edition), (ub4)(strlen(OCI_G(edition))), (ub4)OCI_ATTR_EDITION, OCI_G(err))); + PHP_OCI_CALL_RETURN(errstatus, OCIAttrSet, ((dvoid *) spoolAuth, (ub4) OCI_HTYPE_AUTHINFO, (dvoid *) OCI_G(edition), (ub4)(strlen(OCI_G(edition))), (ub4)OCI_ATTR_EDITION, OCI_G(err))); - if (OCI_G(errcode) != OCI_SUCCESS) { - php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + OCI_G(errcode) = php_oci_error(OCI_G(err), errstatus TSRMLS_CC); iserror = 1; goto exit_create_spool; } - } /* }}} */ + } + /* }}} */ - /* Set the driver name attribute on the auth handle {{{ */ - PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) spoolAuth, (ub4) OCI_HTYPE_AUTHINFO, (dvoid *) PHP_OCI8_DRIVER_NAME, (ub4) sizeof(PHP_OCI8_DRIVER_NAME)-1, (ub4) OCI_ATTR_DRIVER_NAME, OCI_G(err))); + /* {{{ Set the driver name attribute on the auth handle */ + PHP_OCI_CALL_RETURN(errstatus, OCIAttrSet, ((dvoid *) spoolAuth, (ub4) OCI_HTYPE_AUTHINFO, (dvoid *) PHP_OCI8_DRIVER_NAME, (ub4) sizeof(PHP_OCI8_DRIVER_NAME)-1, (ub4) OCI_ATTR_DRIVER_NAME, OCI_G(err))); - if (OCI_G(errcode) != OCI_SUCCESS) { - php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + OCI_G(errcode) = php_oci_error(OCI_G(err), errstatus TSRMLS_CC); iserror = 1; goto exit_create_spool; - } /* }}} */ + } + /* }}} */ - /* Set the auth handle on the session pool {{{ */ - PHP_OCI_CALL_RETURN(OCI_G(errcode),OCIAttrSet, ((dvoid *) (session_pool->poolh),(ub4) OCI_HTYPE_SPOOL, (dvoid *) spoolAuth, (ub4)0, (ub4)OCI_ATTR_SPOOL_AUTH, OCI_G(err))); + /* {{{ Set the auth handle on the session pool */ + PHP_OCI_CALL_RETURN(errstatus, OCIAttrSet, ((dvoid *) (session_pool->poolh),(ub4) OCI_HTYPE_SPOOL, (dvoid *) spoolAuth, (ub4)0, (ub4)OCI_ATTR_SPOOL_AUTH, OCI_G(err))); - if (OCI_G(errcode) != OCI_SUCCESS) { - php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + OCI_G(errcode) = php_oci_error(OCI_G(err), errstatus TSRMLS_CC); iserror = 1; goto exit_create_spool; - } /* }}} */ + } + /* }}} */ #endif /* Create the homogeneous session pool - We have different session pools for every different * username, password, charset and dbname. */ - PHP_OCI_CALL_RETURN(OCI_G(errcode), OCISessionPoolCreate,(session_pool->env, OCI_G(err), session_pool->poolh, (OraText **)&session_pool->poolname, &session_pool->poolname_len, (OraText *)dbname, (ub4)dbname_len, 0, UB4MAXVAL, 1,(OraText *)username, (ub4)username_len, (OraText *)password,(ub4)password_len, poolmode)); + PHP_OCI_CALL_RETURN(errstatus, OCISessionPoolCreate,(session_pool->env, OCI_G(err), session_pool->poolh, (OraText **)&session_pool->poolname, &session_pool->poolname_len, (OraText *)dbname, (ub4)dbname_len, 0, UB4MAXVAL, 1,(OraText *)username, (ub4)username_len, (OraText *)password,(ub4)password_len, poolmode)); - if (OCI_G(errcode) != OCI_SUCCESS) { - php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + OCI_G(errcode) = php_oci_error(OCI_G(err), errstatus TSRMLS_CC); iserror = 1; } @@ -2821,12 +2940,15 @@ exit_create_spool: PHP_OCI_CALL(OCIHandleFree, ((dvoid *) spoolAuth, (ub4) OCI_HTYPE_AUTHINFO)); } - if (OCI_G(debug_mode)) { - php_printf ("OCI8 DEBUG L1: create_spool: (%p) at (%s:%d) \n", session_pool, __FILE__, __LINE__); +#ifdef HAVE_OCI8_DTRACE + if (DTRACE_OCI8_SESSPOOL_CREATE_ENABLED()) { + DTRACE_OCI8_SESSPOOL_CREATE(session_pool); } +#endif /* HAVE_OCI8_DTRACE */ return session_pool; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_get_spool() * @@ -2841,7 +2963,7 @@ static php_oci_spool *php_oci_get_spool(char *username, int username_len, char * zend_rsrc_list_entry *spool_out_le = NULL; zend_bool iserror = 0; - /* Create the spool hash key {{{ */ + /* {{{ Create the spool hash key */ smart_str_appendl_ex(&spool_hashed_details, "oci8spool***", sizeof("oci8spool***") - 1, 0); smart_str_appendl_ex(&spool_hashed_details, username, username_len, 0); smart_str_appendl_ex(&spool_hashed_details, "**", sizeof("**") - 1, 0); @@ -2880,11 +3002,7 @@ static php_oci_spool *php_oci_get_spool(char *username, int username_len, char * } spool_le.ptr = session_pool; spool_le.type = le_psessionpool; -#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 3) || (PHP_MAJOR_VERSION > 5) - zend_list_insert(session_pool, le_psessionpool TSRMLS_CC); -#else - zend_list_insert(session_pool, le_psessionpool); -#endif + PHP_OCI_REGISTER_RESOURCE(session_pool, le_psessionpool); zend_hash_update(&EG(persistent_list), session_pool->spool_hash_key, strlen(session_pool->spool_hash_key)+1,(void *)&spool_le, sizeof(zend_rsrc_list_entry),NULL); } else if (spool_out_le->type == le_psessionpool && strlen(((php_oci_spool *)(spool_out_le->ptr))->spool_hash_key) == spool_hashed_details.len && @@ -2902,7 +3020,8 @@ exit_get_spool: return session_pool; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_create_env() * @@ -2933,7 +3052,8 @@ static OCIEnv *php_oci_create_env(ub2 charsetid TSRMLS_DC) return NULL; } return retenv; -}/* }}} */ +} +/* }}} */ /* {{{ php_oci_old_create_session() * @@ -2944,57 +3064,58 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna { ub4 statement_cache_size = (OCI_G(statement_cache_size) > 0) ? OCI_G(statement_cache_size) : 0; - if (OCI_G(debug_mode)) { - php_printf ("OCI8 DEBUG: Bypassing client-side session pool for session create at (%s:%d) \n", __FILE__, __LINE__); - } - /* Create the OCI environment separate for each connection */ if (!(connection->env = php_oci_create_env(connection->charset TSRMLS_CC))) { return 1; } - /* Allocate our server handle {{{ */ + /* {{{ Allocate our server handle */ PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIHandleAlloc, (connection->env, (dvoid **)&(connection->server), OCI_HTYPE_SERVER, 0, NULL)); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); return 1; - } /* }}} */ + } + /* }}} */ - /* Attach to the server {{{ */ + /* {{{ Attach to the server */ PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIServerAttach, (connection->server, OCI_G(err), (text *)dbname, dbname_len, (ub4) OCI_DEFAULT)); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); return 1; - } /* }}} */ + } + /* }}} */ connection->is_attached = 1; - /* Allocate our session handle {{{ */ + /* {{{ Allocate our session handle */ PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIHandleAlloc, (connection->env, (dvoid **)&(connection->session), OCI_HTYPE_SESSION, 0, NULL)); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); return 1; - } /* }}} */ + } + /* }}} */ - /* Allocate our private error-handle {{{ */ + /* {{{ Allocate our private error-handle */ PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIHandleAlloc, (connection->env, (dvoid **)&(connection->err), OCI_HTYPE_ERROR, 0, NULL)); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); return 1; - } /* }}} */ + } + /* }}} */ - /* Allocate our service-context {{{ */ + /* {{{ Allocate our service-context */ PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIHandleAlloc, (connection->env, (dvoid **)&(connection->svc), OCI_HTYPE_SVCCTX, 0, NULL)); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); return 1; - } /* }}} */ + } + /* }}} */ - /* Set the username {{{ */ + /* {{{ Set the username */ if (username) { PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) username, (ub4) username_len, (ub4) OCI_ATTR_USERNAME, OCI_G(err))); @@ -3002,9 +3123,10 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); return 1; } - }/* }}} */ + } + /* }}} */ - /* Set the password {{{ */ + /* {{{ Set the password */ if (password) { PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) password, (ub4) password_len, (ub4) OCI_ATTR_PASSWORD, OCI_G(err))); @@ -3012,9 +3134,10 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); return 1; } - }/* }}} */ + } + /* }}} */ - /* Set the edition attribute on the session handle {{{ */ + /* {{{ Set the edition attribute on the session handle */ #if ((OCI_MAJOR_VERSION > 11) || ((OCI_MAJOR_VERSION == 11) && (OCI_MINOR_VERSION >= 2))) if (OCI_G(edition)) { PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) OCI_G(edition), (ub4) (strlen(OCI_G(edition))), (ub4) OCI_ATTR_EDITION, OCI_G(err))); @@ -3024,9 +3147,10 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna return 1; } } -#endif /* }}} */ +#endif +/* }}} */ - /* Set the driver name attribute on the session handle {{{ */ + /* {{{ Set the driver name attribute on the session handle */ #if (OCI_MAJOR_VERSION >= 11) PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) PHP_OCI8_DRIVER_NAME, (ub4) sizeof(PHP_OCI8_DRIVER_NAME)-1, (ub4) OCI_ATTR_DRIVER_NAME, OCI_G(err))); @@ -3034,26 +3158,29 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); return 1; } -#endif /* }}} */ +#endif +/* }}} */ - /* Set the server handle in the service handle {{{ */ + /* {{{ Set the server handle in the service handle */ PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, (connection->svc, OCI_HTYPE_SVCCTX, connection->server, 0, OCI_ATTR_SERVER, OCI_G(err))); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); return 1; - } /* }}} */ + } + /* }}} */ - /* Set the authentication handle in the service handle {{{ */ + /* {{{ Set the authentication handle in the service handle */ PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, (connection->svc, OCI_HTYPE_SVCCTX, connection->session, 0, OCI_ATTR_SESSION, OCI_G(err))); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); return 1; - } /* }}} */ + } + /* }}} */ if (new_password) { - /* Try to change password if new one was provided {{{ */ + /* {{{ Try to change password if new one was provided */ PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIPasswordChange, (connection->svc, OCI_G(err), (text *)username, username_len, (text *)password, password_len, (text *)new_password, new_password_len, OCI_AUTH)); if (OCI_G(errcode) != OCI_SUCCESS) { @@ -3066,9 +3193,10 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); return 1; - } /* }}} */ + } + /* }}} */ } else { - /* start the session {{{ */ + /* {{{ start the session */ ub4 cred_type = OCI_CRED_RDBMS; /* Extract the overloaded session_mode parameter into valid Oracle credential and session mode values */ @@ -3089,7 +3217,8 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna if (OCI_G(errcode) != OCI_SUCCESS_WITH_INFO) { return 1; } - } /* }}} */ + } + /* }}} */ } /* Brand new connection: Init and update the next_ping in the connection */ @@ -3107,7 +3236,8 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna /* Successfully created session */ return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_create_session() * @@ -3138,13 +3268,11 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool connection->using_spool = 1; } - if (OCI_G(debug_mode)) { - if (session_pool) { - php_printf ("OCI8 DEBUG L1: using shared pool: (%p) at (%s:%d) \n", session_pool, __FILE__, __LINE__); - } else { - php_printf ("OCI8 DEBUG L1: using private pool: (%p) at (%s:%d) \n", connection->private_spool, __FILE__, __LINE__); - } +#ifdef HAVE_OCI8_DTRACE + if (DTRACE_OCI8_SESSPOOL_TYPE_ENABLED()) { + DTRACE_OCI8_SESSPOOL_TYPE(session_pool ? 1 : 0, session_pool ? session_pool : connection->private_spool); } +#endif /* HAVE_OCI8_DTRACE */ /* The passed in "connection" can be a cached stub from plist or freshly created. In the former * case, we do not have to allocate any handles @@ -3170,7 +3298,7 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool /* Set the Connection class and purity if OCI client version >= 11g */ #if (OCI_MAJOR_VERSION > 10) - PHP_OCI_CALL_RETURN(OCI_G(errcode),OCIAttrSet, ((dvoid *) connection->authinfo,(ub4) OCI_HTYPE_SESSION, (dvoid *) OCI_G(connection_class), (ub4)(strlen(OCI_G(connection_class))), (ub4)OCI_ATTR_CONNECTION_CLASS, OCI_G(err))); + PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->authinfo,(ub4) OCI_HTYPE_SESSION, (dvoid *) OCI_G(connection_class), (ub4)(strlen(OCI_G(connection_class))), (ub4)OCI_ATTR_CONNECTION_CLASS, OCI_G(err))); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); @@ -3189,16 +3317,20 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool return 1; } #endif - } /* }}} */ + } + /* }}} */ - /* Debug statements {{{ */ - if (OCI_G(debug_mode)) { + /* {{{ Debug statements */ +#ifdef HAVE_OCI8_DTRACE + if (DTRACE_OCI8_SESSPOOL_STATS_ENABLED()) { ub4 numfree = 0, numbusy = 0, numopen = 0; PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrGet, ((dvoid *)actual_spool->poolh, OCI_HTYPE_SPOOL, (dvoid *)&numopen, (ub4 *)0, OCI_ATTR_SPOOL_OPEN_COUNT, OCI_G(err))); PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrGet, ((dvoid *)actual_spool->poolh, OCI_HTYPE_SPOOL, (dvoid *)&numbusy, (ub4 *)0, OCI_ATTR_SPOOL_BUSY_COUNT, OCI_G(err))); numfree = numopen - numbusy; /* number of free connections in the pool */ - php_printf ("OCI8 DEBUG L1: (numopen=%d)(numbusy=%d)(numfree=%d) at (%s:%d) \n", numopen, numbusy, numfree, __FILE__, __LINE__); - } /* }}} */ + DTRACE_OCI8_SESSPOOL_STATS(numfree, numbusy, numopen); + } +#endif /* HAVE_OCI8_DTRACE */ + /* }}} */ /* Ping loop: Ping and loop till we get a good connection. When a database instance goes * down, it can leave several bad connections that need to be flushed out before getting a @@ -3225,7 +3357,8 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool /* {{{ Populate the session and server fields of the connection */ PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrGet, ((dvoid *)connection->svc, OCI_HTYPE_SVCCTX, (dvoid *)&(connection->server), (ub4 *)0, OCI_ATTR_SERVER, OCI_G(err))); - PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrGet, ((dvoid *)connection->svc, OCI_HTYPE_SVCCTX, (dvoid *)&(connection->session), (ub4 *)0, OCI_ATTR_SESSION, OCI_G(err))); /* }}} */ + PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrGet, ((dvoid *)connection->svc, OCI_HTYPE_SVCCTX, (dvoid *)&(connection->session), (ub4 *)0, OCI_ATTR_SESSION, OCI_G(err))); + /* }}} */ PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIContextGetValue, (connection->session, OCI_G(err), (ub1 *)"NEXT_PING", (ub1)sizeof("NEXT_PING"), (void **)&(connection->next_pingp))); if (OCI_G(errcode) != OCI_SUCCESS) { @@ -3265,7 +3398,8 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool connection->is_attached = connection->is_open = 1; return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_spool_list_dtor() * @@ -3280,7 +3414,8 @@ static void php_oci_spool_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC) } return; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_spool_close() * @@ -3310,7 +3445,8 @@ static void php_oci_spool_close(php_oci_spool *session_pool TSRMLS_DC) } free(session_pool); -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_ping_init() * @@ -3353,7 +3489,22 @@ static sword php_oci_ping_init(php_oci_connection *connection, OCIError *errh TS connection->next_pingp = next_pingp; return OCI_SUCCESS; -} /* }}} */ +} +/* }}} */ + +/* {{{ php_oci_dtrace_check_connection() + * + * DTrace output for connections that may have become invalid and marked for reopening + */ +void php_oci_dtrace_check_connection(php_oci_connection *connection, sb4 errcode, ub4 serverStatus) +{ +#ifdef HAVE_OCI8_DTRACE + if (DTRACE_OCI8_CHECK_CONNECTION_ENABLED()) { + DTRACE_OCI8_CHECK_CONNECTION(connection, connection && connection->is_open ? 1 : 0, (long)errcode, (unsigned long)serverStatus); + } +#endif /* HAVE_OCI8_DTRACE */ +} +/* }}} */ #endif /* HAVE_OCI8 */ diff --git a/ext/oci8/oci8_collection.c b/ext/oci8/oci8_collection.c index 763e12e924..320e90a5b8 100644 --- a/ext/oci8/oci8_collection.c +++ b/ext/oci8/oci8_collection.c @@ -44,21 +44,22 @@ /* {{{ php_oci_collection_create() Create and return connection handle */ -php_oci_collection * php_oci_collection_create(php_oci_connection *connection, char *tdo, int tdo_len, char *schema, int schema_len TSRMLS_DC) +php_oci_collection *php_oci_collection_create(php_oci_connection *connection, char *tdo, int tdo_len, char *schema, int schema_len TSRMLS_DC) { dvoid *dschp1 = NULL; dvoid *parmp1; dvoid *parmp2; php_oci_collection *collection; + sword errstatus; collection = emalloc(sizeof(php_oci_collection)); collection->connection = connection; collection->collection = NULL; - zend_list_addref(collection->connection->rsrc_id); + zend_list_addref(collection->connection->id); /* get type handle by name */ - PHP_OCI_CALL_RETURN(connection->errcode, OCITypeByName, + PHP_OCI_CALL_RETURN(errstatus, OCITypeByName, ( connection->env, connection->err, @@ -75,19 +76,19 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c ) ); - if (connection->errcode != OCI_SUCCESS) { + if (errstatus != OCI_SUCCESS) { goto CLEANUP; } /* allocate describe handle */ - PHP_OCI_CALL_RETURN(connection->errcode, OCIHandleAlloc, (connection->env, (dvoid **) &dschp1, (ub4) OCI_HTYPE_DESCRIBE, (size_t) 0, (dvoid **) 0)); + PHP_OCI_CALL_RETURN(errstatus, OCIHandleAlloc, (connection->env, (dvoid **) &dschp1, (ub4) OCI_HTYPE_DESCRIBE, (size_t) 0, (dvoid **) 0)); - if (connection->errcode != OCI_SUCCESS) { + if (errstatus != OCI_SUCCESS) { goto CLEANUP; } /* describe TDO */ - PHP_OCI_CALL_RETURN(connection->errcode, OCIDescribeAny, + PHP_OCI_CALL_RETURN(errstatus, OCIDescribeAny, ( connection->svc, connection->err, @@ -100,19 +101,19 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c ) ); - if (connection->errcode != OCI_SUCCESS) { + if (errstatus != OCI_SUCCESS) { goto CLEANUP; } /* get first parameter handle */ - PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet, ((dvoid *) dschp1, (ub4) OCI_HTYPE_DESCRIBE, (dvoid *)&parmp1, (ub4 *)0, (ub4)OCI_ATTR_PARAM, connection->err)); + PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ((dvoid *) dschp1, (ub4) OCI_HTYPE_DESCRIBE, (dvoid *)&parmp1, (ub4 *)0, (ub4)OCI_ATTR_PARAM, connection->err)); - if (connection->errcode != OCI_SUCCESS) { + if (errstatus != OCI_SUCCESS) { goto CLEANUP; } /* get the collection type code of the attribute */ - PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet, + PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ( (dvoid*) parmp1, (ub4) OCI_DTYPE_PARAM, @@ -123,7 +124,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c ) ); - if (connection->errcode != OCI_SUCCESS) { + if (errstatus != OCI_SUCCESS) { goto CLEANUP; } @@ -131,7 +132,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c case OCI_TYPECODE_TABLE: case OCI_TYPECODE_VARRAY: /* get collection element handle */ - PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet, + PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ( (dvoid*) parmp1, (ub4) OCI_DTYPE_PARAM, @@ -142,12 +143,12 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c ) ); - if (connection->errcode != OCI_SUCCESS) { + if (errstatus != OCI_SUCCESS) { goto CLEANUP; } /* get REF of the TDO for the type */ - PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet, + PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ( (dvoid*) parmp2, (ub4) OCI_DTYPE_PARAM, @@ -158,12 +159,12 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c ) ); - if (connection->errcode != OCI_SUCCESS) { + if (errstatus != OCI_SUCCESS) { goto CLEANUP; } /* get the TDO (only header) */ - PHP_OCI_CALL_RETURN(connection->errcode, OCITypeByRef, + PHP_OCI_CALL_RETURN(errstatus, OCITypeByRef, ( connection->env, connection->err, @@ -174,12 +175,12 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c ) ); - if (connection->errcode != OCI_SUCCESS) { + if (errstatus != OCI_SUCCESS) { goto CLEANUP; } /* get typecode */ - PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet, + PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ( (dvoid*) parmp2, (ub4) OCI_DTYPE_PARAM, @@ -190,7 +191,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c ) ); - if (connection->errcode != OCI_SUCCESS) { + if (errstatus != OCI_SUCCESS) { goto CLEANUP; } break; @@ -201,7 +202,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c } /* Create object to hold return table */ - PHP_OCI_CALL_RETURN(connection->errcode, OCIObjectNew, + PHP_OCI_CALL_RETURN(errstatus, OCIObjectNew, ( connection->env, connection->err, @@ -215,13 +216,14 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c ) ); - if (connection->errcode != OCI_SUCCESS) { + if (errstatus != OCI_SUCCESS) { goto CLEANUP; } /* free the describe handle (Bug #44113) */ PHP_OCI_CALL(OCIHandleFree, ((dvoid *) dschp1, OCI_HTYPE_DESCRIBE)); PHP_OCI_REGISTER_RESOURCE(collection, le_collection); + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return collection; CLEANUP: @@ -230,27 +232,31 @@ CLEANUP: /* free the describe handle (Bug #44113) */ PHP_OCI_CALL(OCIHandleFree, ((dvoid *) dschp1, OCI_HTYPE_DESCRIBE)); } - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); php_oci_collection_close(collection TSRMLS_CC); return NULL; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_collection_size() Return size of the collection */ int php_oci_collection_size(php_oci_collection *collection, sb4 *size TSRMLS_DC) { php_oci_connection *connection = collection->connection; + sword errstatus; - PHP_OCI_CALL_RETURN(connection->errcode, OCICollSize, (connection->env, connection->err, collection->collection, (sb4 *)size)); + PHP_OCI_CALL_RETURN(errstatus, OCICollSize, (connection->env, connection->err, collection->collection, (sb4 *)size)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_collection_max() Return max number of elements in the collection */ @@ -262,23 +268,27 @@ int php_oci_collection_max(php_oci_collection *collection, long *max TSRMLS_DC) /* error handling is not necessary here? */ return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_collection_trim() Trim collection to the given number of elements */ int php_oci_collection_trim(php_oci_collection *collection, long trim_size TSRMLS_DC) { php_oci_connection *connection = collection->connection; - - PHP_OCI_CALL_RETURN(connection->errcode, OCICollTrim, (connection->env, connection->err, trim_size, collection->collection)); + sword errstatus; + + PHP_OCI_CALL_RETURN(errstatus, OCICollTrim, (connection->env, connection->err, trim_size, collection->collection)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + errstatus = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_collection_append_null() Append NULL element to the end of the collection */ @@ -286,17 +296,20 @@ int php_oci_collection_append_null(php_oci_collection *collection TSRMLS_DC) { OCIInd null_index = OCI_IND_NULL; php_oci_connection *connection = collection->connection; + sword errstatus; /* append NULL element */ - PHP_OCI_CALL_RETURN(connection->errcode, OCICollAppend, (connection->env, connection->err, (dvoid *)0, &null_index, collection->collection)); + PHP_OCI_CALL_RETURN(errstatus, OCICollAppend, (connection->env, connection->err, (dvoid *)0, &null_index, collection->collection)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + errstatus = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_collection_append_date() Append DATE element to the end of the collection (use "DD-MON-YY" format) */ @@ -305,18 +318,19 @@ int php_oci_collection_append_date(php_oci_collection *collection, char *date, i OCIInd new_index = OCI_IND_NOTNULL; OCIDate oci_date; php_oci_connection *connection = collection->connection; + sword errstatus; /* format and language are NULLs, so format is "DD-MON-YY" and language is the default language of the session */ - PHP_OCI_CALL_RETURN(connection->errcode, OCIDateFromText, (connection->err, (CONST text *)date, date_len, NULL, 0, NULL, 0, &oci_date)); + PHP_OCI_CALL_RETURN(errstatus, OCIDateFromText, (connection->err, (CONST text *)date, date_len, NULL, 0, NULL, 0, &oci_date)); - if (connection->errcode != OCI_SUCCESS) { + if (errstatus != OCI_SUCCESS) { /* failed to convert string to date */ - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } - PHP_OCI_CALL_RETURN(connection->errcode, OCICollAppend, + PHP_OCI_CALL_RETURN(errstatus, OCICollAppend, ( connection->env, connection->err, @@ -326,14 +340,16 @@ int php_oci_collection_append_date(php_oci_collection *collection, char *date, i ) ); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_collection_append_number() Append NUMBER to the end of the collection */ @@ -343,6 +359,7 @@ int php_oci_collection_append_number(php_oci_collection *collection, char *numbe double element_double; OCINumber oci_number; php_oci_connection *connection = collection->connection; + sword errstatus; #if (PHP_MAJOR_VERSION == 4 && PHP_MINOR_VERSION == 3 && PHP_RELEASE_VERSION < 10) /* minimum PHP version ext/oci8/config.m4 accepts is 4.3.9 */ @@ -352,15 +369,15 @@ int php_oci_collection_append_number(php_oci_collection *collection, char *numbe element_double = zend_strtod(number, NULL); #endif - PHP_OCI_CALL_RETURN(connection->errcode, OCINumberFromReal, (connection->err, &element_double, sizeof(double), &oci_number)); + PHP_OCI_CALL_RETURN(errstatus, OCINumberFromReal, (connection->err, &element_double, sizeof(double), &oci_number)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } - PHP_OCI_CALL_RETURN(connection->errcode, OCICollAppend, + PHP_OCI_CALL_RETURN(errstatus, OCICollAppend, ( connection->env, connection->err, @@ -370,14 +387,16 @@ int php_oci_collection_append_number(php_oci_collection *collection, char *numbe ) ); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_collection_append_string() Append STRING to the end of the collection */ @@ -386,16 +405,17 @@ int php_oci_collection_append_string(php_oci_collection *collection, char *eleme OCIInd new_index = OCI_IND_NOTNULL; OCIString *ocistr = (OCIString *)0; php_oci_connection *connection = collection->connection; + sword errstatus; - PHP_OCI_CALL_RETURN(connection->errcode, OCIStringAssignText, (connection->env, connection->err, (CONST oratext *)element, element_len, &ocistr)); + PHP_OCI_CALL_RETURN(errstatus, OCIStringAssignText, (connection->env, connection->err, (CONST oratext *)element, element_len, &ocistr)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } - PHP_OCI_CALL_RETURN(connection->errcode, OCICollAppend, + PHP_OCI_CALL_RETURN(errstatus, OCICollAppend, ( connection->env, connection->err, @@ -405,14 +425,16 @@ int php_oci_collection_append_string(php_oci_collection *collection, char *eleme ) ); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_collection_append() Append wrapper. Appends any supported element to the end of the collection */ @@ -452,7 +474,8 @@ int php_oci_collection_append(php_oci_collection *collection, char *element, int } /* never reached */ return 1; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_collection_element_get() Get the element with the given index */ @@ -464,11 +487,14 @@ int php_oci_collection_element_get(php_oci_collection *collection, long index, z boolean exists; oratext buff[1024]; ub4 buff_len = 1024; + sword errstatus; MAKE_STD_ZVAL(*result_element); ZVAL_NULL(*result_element); - PHP_OCI_CALL_RETURN(connection->errcode, OCICollGetElem, + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ + + PHP_OCI_CALL_RETURN(errstatus, OCICollGetElem, ( connection->env, connection->err, @@ -480,8 +506,8 @@ int php_oci_collection_element_get(php_oci_collection *collection, long index, z ) ); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); FREE_ZVAL(*result_element); return 1; @@ -500,10 +526,10 @@ int php_oci_collection_element_get(php_oci_collection *collection, long index, z switch (collection->element_typecode) { case OCI_TYPECODE_DATE: - PHP_OCI_CALL_RETURN(connection->errcode, OCIDateToText, (connection->err, element, 0, 0, 0, 0, &buff_len, buff)); + PHP_OCI_CALL_RETURN(errstatus, OCIDateToText, (connection->err, element, 0, 0, 0, 0, &buff_len, buff)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); FREE_ZVAL(*result_element); return 1; @@ -543,10 +569,10 @@ int php_oci_collection_element_get(php_oci_collection *collection, long index, z { double double_number; - PHP_OCI_CALL_RETURN(connection->errcode, OCINumberToReal, (connection->err, (CONST OCINumber *) element, (uword) sizeof(double), (dvoid *) &double_number)); + PHP_OCI_CALL_RETURN(errstatus, OCINumberToReal, (connection->err, (CONST OCINumber *) element, (uword) sizeof(double), (dvoid *) &double_number)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); FREE_ZVAL(*result_element); return 1; @@ -565,7 +591,8 @@ int php_oci_collection_element_get(php_oci_collection *collection, long index, z } /* never reached */ return 1; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_collection_element_set_null() Set the element with the given index to NULL */ @@ -573,17 +600,20 @@ int php_oci_collection_element_set_null(php_oci_collection *collection, long ind { OCIInd null_index = OCI_IND_NULL; php_oci_connection *connection = collection->connection; + sword errstatus; /* set NULL element */ - PHP_OCI_CALL_RETURN(connection->errcode, OCICollAssignElem, (connection->env, connection->err, (ub4) index, (dvoid *)"", &null_index, collection->collection)); + PHP_OCI_CALL_RETURN(errstatus, OCICollAssignElem, (connection->env, connection->err, (ub4) index, (dvoid *)"", &null_index, collection->collection)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_collection_element_set_date() Change element's value to the given DATE */ @@ -592,18 +622,19 @@ int php_oci_collection_element_set_date(php_oci_collection *collection, long ind OCIInd new_index = OCI_IND_NOTNULL; OCIDate oci_date; php_oci_connection *connection = collection->connection; + sword errstatus; /* format and language are NULLs, so format is "DD-MON-YY" and language is the default language of the session */ - PHP_OCI_CALL_RETURN(connection->errcode, OCIDateFromText, (connection->err, (CONST text *)date, date_len, NULL, 0, NULL, 0, &oci_date)); + PHP_OCI_CALL_RETURN(errstatus, OCIDateFromText, (connection->err, (CONST text *)date, date_len, NULL, 0, NULL, 0, &oci_date)); - if (connection->errcode != OCI_SUCCESS) { + if (errstatus != OCI_SUCCESS) { /* failed to convert string to date */ - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } - PHP_OCI_CALL_RETURN(connection->errcode, OCICollAssignElem, + PHP_OCI_CALL_RETURN(errstatus, OCICollAssignElem, ( connection->env, connection->err, @@ -614,14 +645,16 @@ int php_oci_collection_element_set_date(php_oci_collection *collection, long ind ) ); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_collection_element_set_number() Change element's value to the given NUMBER */ @@ -631,6 +664,7 @@ int php_oci_collection_element_set_number(php_oci_collection *collection, long i double element_double; OCINumber oci_number; php_oci_connection *connection = collection->connection; + sword errstatus; #if (PHP_MAJOR_VERSION == 4 && PHP_MINOR_VERSION == 3 && PHP_RELEASE_VERSION < 10) /* minimum PHP version ext/oci8/config.m4 accepts is 4.3.9 */ @@ -640,15 +674,15 @@ int php_oci_collection_element_set_number(php_oci_collection *collection, long i element_double = zend_strtod(number, NULL); #endif - PHP_OCI_CALL_RETURN(connection->errcode, OCINumberFromReal, (connection->err, &element_double, sizeof(double), &oci_number)); + PHP_OCI_CALL_RETURN(errstatus, OCINumberFromReal, (connection->err, &element_double, sizeof(double), &oci_number)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } - PHP_OCI_CALL_RETURN(connection->errcode, OCICollAssignElem, + PHP_OCI_CALL_RETURN(errstatus, OCICollAssignElem, ( connection->env, connection->err, @@ -659,14 +693,16 @@ int php_oci_collection_element_set_number(php_oci_collection *collection, long i ) ); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_collection_element_set_string() Change element's value to the given string */ @@ -675,16 +711,17 @@ int php_oci_collection_element_set_string(php_oci_collection *collection, long i OCIInd new_index = OCI_IND_NOTNULL; OCIString *ocistr = (OCIString *)0; php_oci_connection *connection = collection->connection; + sword errstatus; - PHP_OCI_CALL_RETURN(connection->errcode, OCIStringAssignText, (connection->env, connection->err, (CONST oratext *)element, element_len, &ocistr)); + PHP_OCI_CALL_RETURN(errstatus, OCIStringAssignText, (connection->env, connection->err, (CONST oratext *)element, element_len, &ocistr)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } - PHP_OCI_CALL_RETURN(connection->errcode, OCICollAssignElem, + PHP_OCI_CALL_RETURN(errstatus, OCICollAssignElem, ( connection->env, connection->err, @@ -695,14 +732,16 @@ int php_oci_collection_element_set_string(php_oci_collection *collection, long i ) ); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_collection_element_set() Collection element setter */ @@ -742,44 +781,51 @@ int php_oci_collection_element_set(php_oci_collection *collection, long index, c } /* never reached */ return 1; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_collection_assign() Assigns a value to the collection from another collection */ int php_oci_collection_assign(php_oci_collection *collection_dest, php_oci_collection *collection_from TSRMLS_DC) { php_oci_connection *connection = collection_dest->connection; + sword errstatus; - PHP_OCI_CALL_RETURN(connection->errcode, OCICollAssign, (connection->env, connection->err, collection_from->collection, collection_dest->collection)); + PHP_OCI_CALL_RETURN(errstatus, OCICollAssign, (connection->env, connection->err, collection_from->collection, collection_dest->collection)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_collection_close() Destroy collection and all associated resources */ void php_oci_collection_close(php_oci_collection *collection TSRMLS_DC) { php_oci_connection *connection = collection->connection; + sword errstatus; if (collection->collection) { - PHP_OCI_CALL_RETURN(connection->errcode, OCIObjectFree, (connection->env, connection->err, (dvoid *)collection->collection, (ub2)OCI_OBJECTFREE_FORCE)); + PHP_OCI_CALL_RETURN(errstatus, OCIObjectFree, (connection->env, connection->err, (dvoid *)collection->collection, (ub2)OCI_OBJECTFREE_FORCE)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); + } else { + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ } } - zend_list_delete(collection->connection->rsrc_id); - + zend_list_delete(collection->connection->id); efree(collection); return; -} /* }}} */ +} +/* }}} */ #endif /* HAVE_OCI8 */ diff --git a/ext/oci8/oci8_dtrace.d b/ext/oci8/oci8_dtrace.d new file mode 100644 index 0000000000..8ac94105c1 --- /dev/null +++ b/ext/oci8/oci8_dtrace.d @@ -0,0 +1,36 @@ +/* + +----------------------------------------------------------------------+ + | Zend Engine | + +----------------------------------------------------------------------+ + | Copyright (c) 2013 Zend Technologies Ltd. (http://www.zend.com) | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the Zend 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.zend.com/license/3_01.txt. | + | If you did not receive a copy of the Zend license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@zend.com so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: Christopher Jones <christopher.jones@oracle.com> | + +----------------------------------------------------------------------+ +*/ + +provider php { + probe oci8__check__connection(void *connection, int is_open, long errcode, unsigned long server_status); + probe oci8__connect__entry(char *username, char *dbname, char *charset, long session_mode, int persistent, int exclusive); + probe oci8__connect__return(void *connection); + probe oci8__connection__close(void *connection); + probe oci8__error(int status, long errcode); + probe oci8__execute__mode(void *connection, unsigned int mode); + probe oci8__sqltext(void *connection, char *sql); + + probe oci8__connect__p__dtor__close(void *connection); + probe oci8__connect__p__dtor__release(void *connection); + probe oci8__connect__lookup(void *connection, int is_stub); + probe oci8__connect__expiry(void *connection, int is_stub, long idle_expiry, long timestamp); + probe oci8__connect__type(int persistent, int exclusive, void *connection, long num_persistent, long num_connections); + probe oci8__sesspool__create(void *session_pool); + probe oci8__sesspool__stats(unsigned long free, unsigned long busy, unsigned long open); + probe oci8__sesspool__type(int type, void *session_pool); +}; diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c index e51d3c92f5..8d70aff9c2 100644 --- a/ext/oci8/oci8_interface.c +++ b/ext/oci8/oci8_interface.c @@ -1308,12 +1308,7 @@ PHP_FUNCTION(oci_field_is_null) Toggle internal debugging output for the OCI extension */ PHP_FUNCTION(oci_internal_debug) { - zend_bool on_off; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &on_off) == FAILURE) { - return; - } - OCI_G(debug_mode) = on_off; + /* NOP in OCI8 2.0. Obsoleted by DTrace probes */ } /* }}} */ @@ -1583,7 +1578,7 @@ PHP_FUNCTION(oci_close) } PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); - zend_list_delete(connection->rsrc_id); + zend_list_delete(connection->id); ZVAL_NULL(z_connection); @@ -1591,7 +1586,7 @@ PHP_FUNCTION(oci_close) } /* }}} */ -/* {{{ proto resource oci_new_connect(string user, string pass [, string db]) +/* {{{ proto resource oci_new_connect(string user, string pass [, string db, string charset [, int session_mode ]]) Connect to an Oracle database and log on. Returns a new session. */ PHP_FUNCTION(oci_new_connect) { @@ -1607,7 +1602,7 @@ PHP_FUNCTION(oci_connect) } /* }}} */ -/* {{{ proto resource oci_pconnect(string user, string pass [, string db [, string charset ]]) +/* {{{ proto resource oci_pconnect(string user, string pass [, string db [, string charset [, int session_mode ]]) Connect to an Oracle database using a persistent connection and log on. Returns a new session. */ PHP_FUNCTION(oci_pconnect) { @@ -1624,7 +1619,6 @@ PHP_FUNCTION(oci_error) php_oci_connection *connection; text *errbuf; sb4 errcode = 0; - sword error = OCI_SUCCESS; dvoid *errh = NULL; ub2 error_offset = 0; text *sqltext = NULL; @@ -1635,10 +1629,9 @@ PHP_FUNCTION(oci_error) if (ZEND_NUM_ARGS() > 0) { statement = (php_oci_statement *) zend_fetch_resource(&arg TSRMLS_CC, -1, NULL, NULL, 1, le_statement); - if (statement) { errh = statement->err; - error = statement->errcode; + errcode = statement->errcode; if (php_oci_fetch_sqltext_offset(statement, &sqltext, &error_offset TSRMLS_CC)) { RETURN_FALSE; @@ -1649,23 +1642,23 @@ PHP_FUNCTION(oci_error) connection = (php_oci_connection *) zend_fetch_resource(&arg TSRMLS_CC, -1, NULL, NULL, 1, le_connection); if (connection) { errh = connection->err; - error = connection->errcode; + errcode = connection->errcode; goto go_out; } connection = (php_oci_connection *) zend_fetch_resource(&arg TSRMLS_CC, -1, NULL, NULL, 1, le_pconnection); if (connection) { errh = connection->err; - error = connection->errcode; + errcode = connection->errcode; goto go_out; } } else { errh = OCI_G(err); - error = OCI_G(errcode); + errcode = OCI_G(errcode); } go_out: - if (error == OCI_SUCCESS) { /* no error set in the handle */ + if (errcode == 0) { /* no error set in the handle */ RETURN_FALSE; } @@ -1744,7 +1737,12 @@ PHP_FUNCTION(oci_set_prefetch) PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement); - if (php_oci_statement_set_prefetch(statement, size TSRMLS_CC)) { + if (size < 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of rows to be prefetched has to be greater than or equal to 0"); + return; + } + + if (php_oci_statement_set_prefetch(statement, (ub4)size TSRMLS_CC)) { RETURN_FALSE; } RETURN_TRUE; @@ -1759,6 +1757,7 @@ PHP_FUNCTION(oci_set_client_identifier) php_oci_connection *connection; char *client_id; int client_id_len; + sword errstatus; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_connection, &client_id, &client_id_len) == FAILURE) { return; @@ -1766,10 +1765,10 @@ PHP_FUNCTION(oci_set_client_identifier) PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); - PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) client_id, (ub4) client_id_len, (ub4) OCI_ATTR_CLIENT_IDENTIFIER, OCI_G(err))); + PHP_OCI_CALL_RETURN(errstatus, OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) client_id, (ub4) client_id_len, (ub4) OCI_ATTR_CLIENT_IDENTIFIER, connection->err)); - if (OCI_G(errcode) != OCI_SUCCESS) { - php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); RETURN_FALSE; } @@ -1809,7 +1808,7 @@ PHP_FUNCTION(oci_set_edition) /* }}} */ /* {{{ proto bool oci_set_module_name(resource connection, string value) - Sets the module attribute on the connection */ + Sets the module attribute on the connection for end-to-end tracing */ PHP_FUNCTION(oci_set_module_name) { #if (OCI_MAJOR_VERSION >= 10) @@ -1817,6 +1816,7 @@ PHP_FUNCTION(oci_set_module_name) php_oci_connection *connection; char *module; int module_len; + sword errstatus; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_connection, &module, &module_len) == FAILURE) { return; @@ -1824,10 +1824,10 @@ PHP_FUNCTION(oci_set_module_name) PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); - PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) module, (ub4) module_len, (ub4) OCI_ATTR_MODULE, OCI_G(err))); + PHP_OCI_CALL_RETURN(errstatus, OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) module, (ub4) module_len, (ub4) OCI_ATTR_MODULE, connection->err)); - if (OCI_G(errcode) != OCI_SUCCESS) { - php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); RETURN_FALSE; } @@ -1840,7 +1840,7 @@ PHP_FUNCTION(oci_set_module_name) /* }}} */ /* {{{ proto bool oci_set_action(resource connection, string value) - Sets the action attribute on the connection */ + Sets the action attribute on the connection for end-to-end tracing */ PHP_FUNCTION(oci_set_action) { #if (OCI_MAJOR_VERSION >= 10) @@ -1848,6 +1848,7 @@ PHP_FUNCTION(oci_set_action) php_oci_connection *connection; char *action; int action_len; + sword errstatus; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_connection, &action, &action_len) == FAILURE) { return; @@ -1855,10 +1856,10 @@ PHP_FUNCTION(oci_set_action) PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); - PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) action, (ub4) action_len, (ub4) OCI_ATTR_ACTION, OCI_G(err))); + PHP_OCI_CALL_RETURN(errstatus, OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) action, (ub4) action_len, (ub4) OCI_ATTR_ACTION, connection->err)); - if (OCI_G(errcode) != OCI_SUCCESS) { - php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); RETURN_FALSE; } @@ -1871,7 +1872,7 @@ PHP_FUNCTION(oci_set_action) /* }}} */ /* {{{ proto bool oci_set_client_info(resource connection, string value) - Sets the client info attribute on the connection */ + Sets the client info attribute on the connection for end-to-end tracing */ PHP_FUNCTION(oci_set_client_info) { #if (OCI_MAJOR_VERSION >= 10) @@ -1879,6 +1880,7 @@ PHP_FUNCTION(oci_set_client_info) php_oci_connection *connection; char *client_info; int client_info_len; + sword errstatus; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_connection, &client_info, &client_info_len) == FAILURE) { return; @@ -1886,10 +1888,10 @@ PHP_FUNCTION(oci_set_client_info) PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); - PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) client_info, (ub4) client_info_len, (ub4) OCI_ATTR_CLIENT_INFO, OCI_G(err))); + PHP_OCI_CALL_RETURN(errstatus, OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) client_info, (ub4) client_info_len, (ub4) OCI_ATTR_CLIENT_INFO, connection->err)); - if (OCI_G(errcode) != OCI_SUCCESS) { - php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); RETURN_FALSE; } @@ -1957,7 +1959,7 @@ PHP_FUNCTION(oci_password_change) if (!connection) { RETURN_FALSE; } - RETURN_RESOURCE(connection->rsrc_id); + RETURN_RESOURCE(connection->id); } WRONG_PARAM_COUNT; } @@ -2395,6 +2397,32 @@ PHP_FUNCTION(oci_new_collection) } /* }}} */ +/* {{{ proto bool oci_get_implicit(resource stmt) + Get the next statement resource from an Oracle 12c PL/SQL Implicit Result Set */ +PHP_FUNCTION(oci_get_implicit_resultset) +{ + zval *z_statement; + php_oci_statement *statement; + php_oci_statement *imp_statement; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &z_statement) == FAILURE) { + return; + } + + PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement); + + imp_statement = php_oci_get_implicit_resultset(statement TSRMLS_CC); + + if (imp_statement) { + if (php_oci_statement_execute(imp_statement, (ub4)OCI_DEFAULT TSRMLS_CC)) + RETURN_FALSE; + RETURN_RESOURCE(imp_statement->id); + } + RETURN_FALSE; +} + +/* }}} */ + #endif /* HAVE_OCI8 */ /* diff --git a/ext/oci8/oci8_lob.c b/ext/oci8/oci8_lob.c index d05e053919..8d14dc3f50 100644 --- a/ext/oci8/oci8_lob.c +++ b/ext/oci8/oci8_lob.c @@ -54,6 +54,7 @@ php_oci_descriptor *php_oci_lob_create (php_oci_connection *connection, long type TSRMLS_DC) { php_oci_descriptor *descriptor; + sword errstatus; switch (type) { case OCI_DTYPE_FILE: @@ -70,15 +71,17 @@ php_oci_descriptor *php_oci_lob_create (php_oci_connection *connection, long typ descriptor = ecalloc(1, sizeof(php_oci_descriptor)); descriptor->type = type; descriptor->connection = connection; - zend_list_addref(descriptor->connection->rsrc_id); + zend_list_addref(descriptor->connection->id); - PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIDescriptorAlloc, (connection->env, (dvoid*)&(descriptor->descriptor), descriptor->type, (size_t) 0, (dvoid **) 0)); + PHP_OCI_CALL_RETURN(errstatus, OCIDescriptorAlloc, (connection->env, (dvoid*)&(descriptor->descriptor), descriptor->type, (size_t) 0, (dvoid **) 0)); - if (OCI_G(errcode) != OCI_SUCCESS) { - OCI_G(errcode) = php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + OCI_G(errcode) = php_oci_error(OCI_G(err), errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, OCI_G(errcode)); efree(descriptor); return NULL; + } else { + OCI_G(errcode) = 0; /* retain backwards compat with OCI8 1.4 */ } PHP_OCI_REGISTER_RESOURCE(descriptor, le_descriptor); @@ -109,13 +112,15 @@ php_oci_descriptor *php_oci_lob_create (php_oci_connection *connection, long typ } return descriptor; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_lob_get_length() Get length of the LOB. The length is cached so we don't need to ask Oracle every time */ int php_oci_lob_get_length (php_oci_descriptor *descriptor, ub4 *length TSRMLS_DC) { php_oci_connection *connection = descriptor->connection; + sword errstatus; *length = 0; @@ -124,18 +129,18 @@ int php_oci_lob_get_length (php_oci_descriptor *descriptor, ub4 *length TSRMLS_D return 0; } else { if (descriptor->type == OCI_DTYPE_FILE) { - PHP_OCI_CALL_RETURN(connection->errcode, OCILobFileOpen, (connection->svc, connection->err, descriptor->descriptor, OCI_FILE_READONLY)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + PHP_OCI_CALL_RETURN(errstatus, OCILobFileOpen, (connection->svc, connection->err, descriptor->descriptor, OCI_FILE_READONLY)); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } } - PHP_OCI_CALL_RETURN(connection->errcode, OCILobGetLength, (connection->svc, connection->err, descriptor->descriptor, (ub4 *)length)); + PHP_OCI_CALL_RETURN(errstatus, OCILobGetLength, (connection->svc, connection->err, descriptor->descriptor, (ub4 *)length)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } @@ -143,17 +148,20 @@ int php_oci_lob_get_length (php_oci_descriptor *descriptor, ub4 *length TSRMLS_D descriptor->lob_size = *length; if (descriptor->type == OCI_DTYPE_FILE) { - PHP_OCI_CALL_RETURN(connection->errcode, OCILobFileClose, (connection->svc, connection->err, descriptor->descriptor)); + PHP_OCI_CALL_RETURN(errstatus, OCILobFileClose, (connection->svc, connection->err, descriptor->descriptor)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } } + + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ } return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_lob_callback() Append LOB portion to a memory buffer */ @@ -203,25 +211,28 @@ sb4 php_oci_lob_callback (dvoid *ctxp, CONST dvoid *bufxp, ub4 len, ub1 piece) } /* }}} */ -/* {{{ php_oci_lob_calculate_buffer() */ +/* {{{ php_oci_lob_calculate_buffer() + Work out the size for LOB buffering */ static inline int php_oci_lob_calculate_buffer(php_oci_descriptor *descriptor, long read_length TSRMLS_DC) { php_oci_connection *connection = descriptor->connection; ub4 chunk_size; + sword errstatus; if (descriptor->type == OCI_DTYPE_FILE) { return read_length; } if (!descriptor->chunk_size) { - PHP_OCI_CALL_RETURN(connection->errcode, OCILobGetChunkSize, (connection->svc, connection->err, descriptor->descriptor, &chunk_size)); + PHP_OCI_CALL_RETURN(errstatus, OCILobGetChunkSize, (connection->svc, connection->err, descriptor->descriptor, &chunk_size)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return read_length; /* we have to return original length here */ } descriptor->chunk_size = chunk_size; + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ } if ((read_length % descriptor->chunk_size) != 0) { @@ -250,6 +261,7 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini #endif int is_clob = 0; sb4 bytes_per_char = 1; + sword errstatus; *data_len = 0; *data = NULL; @@ -286,20 +298,20 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini offset = initial_offset; if (descriptor->type == OCI_DTYPE_FILE) { - PHP_OCI_CALL_RETURN(connection->errcode, OCILobFileOpen, (connection->svc, connection->err, descriptor->descriptor, OCI_FILE_READONLY)); + PHP_OCI_CALL_RETURN(errstatus, OCILobFileOpen, (connection->svc, connection->err, descriptor->descriptor, OCI_FILE_READONLY)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } } else { ub2 charset_id = 0; - PHP_OCI_CALL_RETURN(connection->errcode, OCILobCharSetId, (connection->env, connection->err, descriptor->descriptor, &charset_id)); + PHP_OCI_CALL_RETURN(errstatus, OCILobCharSetId, (connection->env, connection->err, descriptor->descriptor, &charset_id)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } @@ -310,10 +322,10 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini } if (is_clob) { - PHP_OCI_CALL_RETURN(connection->errcode, OCINlsNumericInfoGet, (connection->env, connection->err, &bytes_per_char, OCI_NLS_CHARSET_MAXBYTESZ)); + PHP_OCI_CALL_RETURN(errstatus, OCINlsNumericInfoGet, (connection->env, connection->err, &bytes_per_char, OCI_NLS_CHARSET_MAXBYTESZ)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } @@ -337,7 +349,7 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini buffer_size = php_oci_lob_calculate_buffer(descriptor, buffer_size TSRMLS_CC); /* use chunk size */ bufp = (ub1 *) ecalloc(1, buffer_size); - PHP_OCI_CALL_RETURN(connection->errcode, OCILobRead2, + PHP_OCI_CALL_RETURN(errstatus, OCILobRead2, ( connection->svc, connection->err, @@ -370,7 +382,7 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini buffer_size = php_oci_lob_calculate_buffer(descriptor, buffer_size TSRMLS_CC); /* use chunk size */ bufp = (ub1 *) ecalloc(1, buffer_size); - PHP_OCI_CALL_RETURN(connection->errcode, OCILobRead, + PHP_OCI_CALL_RETURN(errstatus, OCILobRead, ( connection->svc, connection->err, @@ -391,8 +403,8 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini #endif - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); if (*data) { efree(*data); @@ -405,10 +417,10 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini descriptor->lob_current_position = (int)offset; if (descriptor->type == OCI_DTYPE_FILE) { - PHP_OCI_CALL_RETURN(connection->errcode, OCILobFileClose, (connection->svc, connection->err, descriptor->descriptor)); + PHP_OCI_CALL_RETURN(errstatus, OCILobFileClose, (connection->svc, connection->err, descriptor->descriptor)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); if (*data) { efree(*data); @@ -419,8 +431,10 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini } } + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_lob_write() Write data to the LOB */ @@ -429,6 +443,7 @@ int php_oci_lob_write (php_oci_descriptor *descriptor, ub4 offset, char *data, i OCILobLocator *lob = (OCILobLocator *) descriptor->descriptor; php_oci_connection *connection = (php_oci_connection *) descriptor->connection; ub4 lob_length; + sword errstatus; *bytes_written = 0; if (php_oci_lob_get_length(descriptor, &lob_length TSRMLS_CC)) { @@ -447,7 +462,7 @@ int php_oci_lob_write (php_oci_descriptor *descriptor, ub4 offset, char *data, i offset = descriptor->lob_current_position; } - PHP_OCI_CALL_RETURN(connection->errcode, OCILobWrite, + PHP_OCI_CALL_RETURN(errstatus, OCILobWrite, ( connection->svc, connection->err, @@ -464,8 +479,8 @@ int php_oci_lob_write (php_oci_descriptor *descriptor, ub4 offset, char *data, i ) ); - if (connection->errcode) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); *bytes_written = 0; return 1; @@ -482,14 +497,17 @@ int php_oci_lob_write (php_oci_descriptor *descriptor, ub4 offset, char *data, i descriptor->buffering = PHP_OCI_LOB_BUFFER_USED; } + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_lob_set_buffering() Turn buffering off/onn for this particular LOB */ int php_oci_lob_set_buffering (php_oci_descriptor *descriptor, int on_off TSRMLS_DC) { php_oci_connection *connection = descriptor->connection; + sword errstatus; if (!on_off && descriptor->buffering == PHP_OCI_LOB_BUFFER_DISABLED) { /* disabling when it's already off */ @@ -502,19 +520,21 @@ int php_oci_lob_set_buffering (php_oci_descriptor *descriptor, int on_off TSRMLS } if (on_off) { - PHP_OCI_CALL_RETURN(connection->errcode, OCILobEnableBuffering, (connection->svc, connection->err, descriptor->descriptor)); + PHP_OCI_CALL_RETURN(errstatus, OCILobEnableBuffering, (connection->svc, connection->err, descriptor->descriptor)); } else { - PHP_OCI_CALL_RETURN(connection->errcode, OCILobDisableBuffering, (connection->svc, connection->err, descriptor->descriptor)); + PHP_OCI_CALL_RETURN(errstatus, OCILobDisableBuffering, (connection->svc, connection->err, descriptor->descriptor)); } - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } descriptor->buffering = on_off ? PHP_OCI_LOB_BUFFER_ENABLED : PHP_OCI_LOB_BUFFER_DISABLED; + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_lob_get_buffering() Return current buffering state for the LOB */ @@ -525,7 +545,8 @@ int php_oci_lob_get_buffering (php_oci_descriptor *descriptor) } else { return 0; } -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_lob_copy() Copy one LOB (or its part) to another one */ @@ -533,6 +554,7 @@ int php_oci_lob_copy (php_oci_descriptor *descriptor_dest, php_oci_descriptor *d { php_oci_connection *connection = descriptor_dest->connection; ub4 length_dest, length_from, copy_len; + sword errstatus; if (php_oci_lob_get_length(descriptor_dest, &length_dest TSRMLS_CC)) { return 1; @@ -553,7 +575,7 @@ int php_oci_lob_copy (php_oci_descriptor *descriptor_dest, php_oci_descriptor *d return 1; } - PHP_OCI_CALL_RETURN(connection->errcode, OCILobCopy, + PHP_OCI_CALL_RETURN(errstatus, OCILobCopy, ( connection->svc, connection->err, @@ -565,29 +587,33 @@ int php_oci_lob_copy (php_oci_descriptor *descriptor_dest, php_oci_descriptor *d ) ); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_lob_close() Close LOB */ int php_oci_lob_close (php_oci_descriptor *descriptor TSRMLS_DC) { php_oci_connection *connection = descriptor->connection; - + sword errstatus; + if (descriptor->is_open) { - PHP_OCI_CALL_RETURN(connection->errcode, OCILobClose, (connection->svc, connection->err, descriptor->descriptor)); - } + PHP_OCI_CALL_RETURN(errstatus, OCILobClose, (connection->svc, connection->err, descriptor->descriptor)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); - PHP_OCI_HANDLE_ERROR(connection, connection->errcode); - return 1; + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); + PHP_OCI_HANDLE_ERROR(connection, connection->errcode); + return 1; + } + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ } if (php_oci_temp_lob_close(descriptor TSRMLS_CC)) { @@ -595,7 +621,8 @@ int php_oci_lob_close (php_oci_descriptor *descriptor TSRMLS_DC) } return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_temp_lob_close() Close Temporary LOB */ @@ -603,27 +630,29 @@ int php_oci_temp_lob_close (php_oci_descriptor *descriptor TSRMLS_DC) { php_oci_connection *connection = descriptor->connection; int is_temporary; + sword errstatus; - PHP_OCI_CALL_RETURN(connection->errcode, OCILobIsTemporary, (connection->env,connection->err, descriptor->descriptor, &is_temporary)); + PHP_OCI_CALL_RETURN(errstatus, OCILobIsTemporary, (connection->env,connection->err, descriptor->descriptor, &is_temporary)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } if (is_temporary) { - PHP_OCI_CALL_RETURN(connection->errcode, OCILobFreeTemporary, (connection->svc, connection->err, descriptor->descriptor)); + PHP_OCI_CALL_RETURN(errstatus, OCILobFreeTemporary, (connection->svc, connection->err, descriptor->descriptor)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } } + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return 0; -} /* }}} */ - +} +/* }}} */ /* {{{ php_oci_lob_flush() Flush buffers for the LOB (only if they have been used) */ @@ -631,7 +660,8 @@ int php_oci_lob_flush(php_oci_descriptor *descriptor, long flush_flag TSRMLS_DC) { OCILobLocator *lob = descriptor->descriptor; php_oci_connection *connection = descriptor->connection; - + sword errstatus; + if (!lob) { return 1; } @@ -654,18 +684,20 @@ int php_oci_lob_flush(php_oci_descriptor *descriptor, long flush_flag TSRMLS_DC) return 0; } - PHP_OCI_CALL_RETURN(connection->errcode, OCILobFlushBuffer, (connection->svc, connection->err, lob, flush_flag)); + PHP_OCI_CALL_RETURN(errstatus, OCILobFlushBuffer, (connection->svc, connection->err, lob, flush_flag)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } /* marking buffer as enabled and not used */ descriptor->buffering = PHP_OCI_LOB_BUFFER_ENABLED; + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_lob_free() Close LOB descriptor and free associated resources */ @@ -709,9 +741,10 @@ void php_oci_lob_free (php_oci_descriptor *descriptor TSRMLS_DC) PHP_OCI_CALL(OCIDescriptorFree, (descriptor->descriptor, descriptor->type)); - zend_list_delete(descriptor->connection->rsrc_id); + zend_list_delete(descriptor->connection->id); efree(descriptor); -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_lob_import() Import LOB contents from the given file */ @@ -723,6 +756,7 @@ int php_oci_lob_import (php_oci_descriptor *descriptor, char *filename TSRMLS_DC php_oci_connection *connection = descriptor->connection; char buf[8192]; ub4 offset = 1; + sword errstatus; #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 3) || (PHP_MAJOR_VERSION > 5) /* Safe mode has been removed in PHP 5.4 */ @@ -739,7 +773,7 @@ int php_oci_lob_import (php_oci_descriptor *descriptor, char *filename TSRMLS_DC } while ((loblen = read(fp, &buf, sizeof(buf))) > 0) { - PHP_OCI_CALL_RETURN(connection->errcode, + PHP_OCI_CALL_RETURN(errstatus, OCILobWrite, ( connection->svc, @@ -757,18 +791,21 @@ int php_oci_lob_import (php_oci_descriptor *descriptor, char *filename TSRMLS_DC ) ); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); close(fp); return 1; + } else { + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ } offset += loblen; } close(fp); return 0; -} /* }}} */ +} + /* }}} */ /* {{{ php_oci_lob_append() Append data to the end of the LOB */ @@ -778,6 +815,7 @@ int php_oci_lob_append (php_oci_descriptor *descriptor_dest, php_oci_descriptor OCILobLocator *lob_dest = descriptor_dest->descriptor; OCILobLocator *lob_from = descriptor_from->descriptor; ub4 dest_len, from_len; + sword errstatus; if (php_oci_lob_get_length(descriptor_dest, &dest_len TSRMLS_CC)) { return 1; @@ -791,15 +829,17 @@ int php_oci_lob_append (php_oci_descriptor *descriptor_dest, php_oci_descriptor return 0; } - PHP_OCI_CALL_RETURN(connection->errcode, OCILobAppend, (connection->svc, connection->err, lob_dest, lob_from)); + PHP_OCI_CALL_RETURN(errstatus, OCILobAppend, (connection->svc, connection->err, lob_dest, lob_from)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_lob_truncate() Truncate LOB to the given length */ @@ -808,6 +848,7 @@ int php_oci_lob_truncate (php_oci_descriptor *descriptor, long new_lob_length TS php_oci_connection *connection = descriptor->connection; OCILobLocator *lob = descriptor->descriptor; ub4 lob_length; + sword errstatus; if (php_oci_lob_get_length(descriptor, &lob_length TSRMLS_CC)) { return 1; @@ -827,17 +868,20 @@ int php_oci_lob_truncate (php_oci_descriptor *descriptor, long new_lob_length TS return 1; } - PHP_OCI_CALL_RETURN(connection->errcode, OCILobTrim, (connection->svc, connection->err, lob, new_lob_length)); + PHP_OCI_CALL_RETURN(errstatus, OCILobTrim, (connection->svc, connection->err, lob, new_lob_length)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } descriptor->lob_size = new_lob_length; + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ + return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_lob_erase() Erase (or fill with whitespaces, depending on LOB type) the LOB (or its part) */ @@ -846,6 +890,7 @@ int php_oci_lob_erase (php_oci_descriptor *descriptor, long offset, ub4 length, php_oci_connection *connection = descriptor->connection; OCILobLocator *lob = descriptor->descriptor; ub4 lob_length; + sword errstatus; *bytes_erased = 0; @@ -861,17 +906,19 @@ int php_oci_lob_erase (php_oci_descriptor *descriptor, long offset, ub4 length, length = lob_length; } - PHP_OCI_CALL_RETURN(connection->errcode, OCILobErase, (connection->svc, connection->err, lob, (ub4 *)&length, offset+1)); + PHP_OCI_CALL_RETURN(errstatus, OCILobErase, (connection->svc, connection->err, lob, (ub4 *)&length, offset+1)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } *bytes_erased = length; + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_lob_is_equal() Compare two LOB descriptors and figure out if they are pointing to the same LOB */ @@ -880,16 +927,19 @@ int php_oci_lob_is_equal (php_oci_descriptor *descriptor_first, php_oci_descript php_oci_connection *connection = descriptor_first->connection; OCILobLocator *first_lob = descriptor_first->descriptor; OCILobLocator *second_lob = descriptor_second->descriptor; + sword errstatus; - PHP_OCI_CALL_RETURN(connection->errcode, OCILobIsEqual, (connection->env, first_lob, second_lob, result)); + PHP_OCI_CALL_RETURN(errstatus, OCILobIsEqual, (connection->env, first_lob, second_lob, result)); - if (connection->errcode) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_lob_write_tmp() Create temporary LOB and write data to it */ @@ -898,6 +948,7 @@ int php_oci_lob_write_tmp (php_oci_descriptor *descriptor, long type, char *data php_oci_connection *connection = descriptor->connection; OCILobLocator *lob = descriptor->descriptor; ub4 bytes_written = 0; + sword errstatus; switch (type) { case OCI_TEMP_BLOB: @@ -914,7 +965,7 @@ int php_oci_lob_write_tmp (php_oci_descriptor *descriptor, long type, char *data return 1; } - PHP_OCI_CALL_RETURN(connection->errcode, OCILobCreateTemporary, + PHP_OCI_CALL_RETURN(errstatus, OCILobCreateTemporary, ( connection->svc, connection->err, @@ -927,24 +978,26 @@ int php_oci_lob_write_tmp (php_oci_descriptor *descriptor, long type, char *data ) ); - if (connection->errcode) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } - PHP_OCI_CALL_RETURN(connection->errcode, OCILobOpen, (connection->svc, connection->err, lob, OCI_LOB_READWRITE)); + PHP_OCI_CALL_RETURN(errstatus, OCILobOpen, (connection->svc, connection->err, lob, OCI_LOB_READWRITE)); - if (connection->errcode) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return 1; } descriptor->is_open = 1; + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return php_oci_lob_write(descriptor, 0, data, data_len, &bytes_written TSRMLS_CC); -} /* }}} */ +} +/* }}} */ #endif /* HAVE_OCI8 */ diff --git a/ext/oci8/oci8_statement.c b/ext/oci8/oci8_statement.c index 89facb0703..274c4e9e33 100644 --- a/ext/oci8/oci8_statement.c +++ b/ext/oci8/oci8_statement.c @@ -43,21 +43,30 @@ /* {{{ php_oci_statement_create() Create statemend handle and allocate necessary resources */ -php_oci_statement *php_oci_statement_create (php_oci_connection *connection, char *query, int query_len TSRMLS_DC) +php_oci_statement *php_oci_statement_create(php_oci_connection *connection, char *query, int query_len TSRMLS_DC) { php_oci_statement *statement; - + sword errstatus; + + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ + statement = ecalloc(1,sizeof(php_oci_statement)); if (!query_len) { /* do not allocate stmt handle for refcursors, we'll get it from OCIStmtPrepare2() */ PHP_OCI_CALL(OCIHandleAlloc, (connection->env, (dvoid **)&(statement->stmt), OCI_HTYPE_STMT, 0, NULL)); + } else { +#ifdef HAVE_OCI8_DTRACE + if (DTRACE_OCI8_SQLTEXT_ENABLED()) { + DTRACE_OCI8_SQLTEXT(connection, query); + } +#endif /* HAVE_OCI8_DTRACE */ } PHP_OCI_CALL(OCIHandleAlloc, (connection->env, (dvoid **)&(statement->err), OCI_HTYPE_ERROR, 0, NULL)); if (query_len > 0) { - PHP_OCI_CALL_RETURN(connection->errcode, OCIStmtPrepare2, + PHP_OCI_CALL_RETURN(errstatus, OCIStmtPrepare2, ( connection->svc, &(statement->stmt), @@ -70,14 +79,13 @@ php_oci_statement *php_oci_statement_create (php_oci_connection *connection, cha OCI_DEFAULT ) ); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); - PHP_OCI_CALL(OCIStmtRelease, (statement->stmt, statement->err, NULL, 0, statement->errcode ? OCI_STRLS_CACHE_DELETE : OCI_DEFAULT)); + PHP_OCI_CALL(OCIStmtRelease, (statement->stmt, statement->err, NULL, 0, OCI_STRLS_CACHE_DELETE)); PHP_OCI_CALL(OCIHandleFree,(statement->err, OCI_HTYPE_ERROR)); - - efree(statement); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); + efree(statement); return NULL; } } @@ -95,10 +103,15 @@ php_oci_statement *php_oci_statement_create (php_oci_connection *connection, cha statement->has_data = 0; statement->has_descr = 0; statement->parent_stmtid = 0; - zend_list_addref(statement->connection->rsrc_id); + statement->impres_child_stmt = NULL; + statement->impres_count = 0; + statement->impres_flag = PHP_OCI_IMPRES_UNKNOWN; /* may or may not have Implicit Result Set children */ + zend_list_addref(statement->connection->id); if (OCI_G(default_prefetch) >= 0) { - php_oci_statement_set_prefetch(statement, OCI_G(default_prefetch) TSRMLS_CC); + php_oci_statement_set_prefetch(statement, (ub4)OCI_G(default_prefetch) TSRMLS_CC); + } else { + php_oci_statement_set_prefetch(statement, (ub4)100 TSRMLS_CC); /* semi-arbitrary, "sensible default" */ } PHP_OCI_REGISTER_RESOURCE(statement, le_statement); @@ -109,25 +122,85 @@ php_oci_statement *php_oci_statement_create (php_oci_connection *connection, cha } /* }}} */ +/* {{{ php_oci_get_implicit_resultset() + Fetch implicit result set statement resource */ +php_oci_statement *php_oci_get_implicit_resultset(php_oci_statement *statement TSRMLS_DC) +{ +#if (OCI_MAJOR_VERSION < 12) + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Implicit results are available in Oracle Database 12c onwards"); + return NULL; +#else + void *result; + ub4 rtype; + php_oci_statement *statement2; /* implicit result set statement handle */ + sword errstatus; + + PHP_OCI_CALL_RETURN(errstatus, OCIStmtGetNextResult, (statement->stmt, statement->err, &result, &rtype, OCI_DEFAULT)); + if (errstatus == OCI_NO_DATA) { + return NULL; + } + + if (rtype != OCI_RESULT_TYPE_SELECT) { + /* Only OCI_RESULT_TYPE_SELECT is supported by Oracle DB 12cR1 */ + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unexpected implicit result type returned from Oracle Database"); + return NULL; + } else { + statement2 = ecalloc(1,sizeof(php_oci_statement)); + + PHP_OCI_CALL(OCIHandleAlloc, (statement->connection->env, (dvoid **)&(statement2->err), OCI_HTYPE_ERROR, 0, NULL)); + statement2->stmt = (OCIStmt *)result; + statement2->parent_stmtid = statement->id; + statement2->impres_child_stmt = NULL; + statement2->impres_count = 0; + statement2->impres_flag = PHP_OCI_IMPRES_IS_CHILD; + statement2->connection = statement->connection; + statement2->errcode = 0; + statement2->last_query = NULL; + statement2->last_query_len = 0; + statement2->columns = NULL; + statement2->binds = NULL; + statement2->defines = NULL; + statement2->ncolumns = 0; + statement2->executed = 0; + statement2->has_data = 0; + statement2->has_descr = 0; + statement2->stmttype = 0; + + zend_list_addref(statement->id); + zend_list_addref(statement2->connection->id); + + php_oci_statement_set_prefetch(statement2, statement->prefetch_count TSRMLS_CC); + + PHP_OCI_REGISTER_RESOURCE(statement2, le_statement); + + OCI_G(num_statements)++; + + return statement2; + } +#endif /* OCI_MAJOR_VERSION < 12 */ +} +/* }}} */ + /* {{{ php_oci_statement_set_prefetch() - Set prefetch buffer size for the statement (we're assuming that one row is ~1K sized) */ -int php_oci_statement_set_prefetch(php_oci_statement *statement, long size TSRMLS_DC) + Set prefetch buffer size for the statement */ +int php_oci_statement_set_prefetch(php_oci_statement *statement, ub4 prefetch TSRMLS_DC) { - ub4 prefetch = size; + sword errstatus; - if (size < 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of rows to be prefetched has to be greater than or equal to 0"); - return 1; + if (prefetch > 20000) { + prefetch = 20000; /* keep it somewhat sane */ } + + PHP_OCI_CALL_RETURN(errstatus, OCIAttrSet, (statement->stmt, OCI_HTYPE_STMT, &prefetch, 0, OCI_ATTR_PREFETCH_ROWS, statement->err)); - PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrSet, (statement->stmt, OCI_HTYPE_STMT, &prefetch, 0, OCI_ATTR_PREFETCH_ROWS, statement->err)); - - if (statement->errcode != OCI_SUCCESS) { - statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); + statement->prefetch_count = 0; return 1; } - + statement->prefetch_count = prefetch; + statement->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return 0; } /* }}} */ @@ -163,8 +236,8 @@ int php_oci_cleanup_pre_fetch(void *data TSRMLS_DC) } return ZEND_HASH_APPLY_KEEP; -} /* }}} */ - +} +/* }}} */ /* {{{ php_oci_statement_fetch() Fetch a row from the statement */ @@ -175,16 +248,18 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC) ub4 typep, iterp, idxp; ub1 in_outp, piecep; zend_bool piecewisecols = 0; - php_oci_out_column *column; + sword errstatus; + + statement->errcode = 0; /* retain backwards compat with OCI8 1.4 */ if (statement->has_descr && statement->columns) { zend_hash_apply(statement->columns, (apply_func_t) php_oci_cleanup_pre_fetch TSRMLS_CC); } - PHP_OCI_CALL_RETURN(statement->errcode, OCIStmtFetch, (statement->stmt, statement->err, nrows, OCI_FETCH_NEXT, OCI_DEFAULT)); + PHP_OCI_CALL_RETURN(errstatus, OCIStmtFetch, (statement->stmt, statement->err, nrows, OCI_FETCH_NEXT, OCI_DEFAULT)); - if ( statement->errcode == OCI_NO_DATA || nrows == 0 ) { + if (errstatus == OCI_NO_DATA || nrows == 0) { if (statement->last_query == NULL) { /* reset define-list for refcursors */ if (statement->columns) { @@ -196,7 +271,6 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC) statement->executed = 0; } - statement->errcode = 0; /* OCI_NO_DATA is NO error for us!!! */ statement->has_data = 0; if (nrows == 0) { @@ -209,15 +283,15 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC) /* reset length for all piecewise columns */ for (i = 0; i < statement->ncolumns; i++) { column = php_oci_statement_get_column(statement, i + 1, NULL, 0 TSRMLS_CC); - if (column->piecewise) { + if (column && column->piecewise) { column->retlen4 = 0; piecewisecols = 1; } } - while (statement->errcode == OCI_NEED_DATA) { + while (errstatus == OCI_NEED_DATA) { if (piecewisecols) { - PHP_OCI_CALL_RETURN(statement->errcode, + PHP_OCI_CALL_RETURN(errstatus, OCIStmtGetPieceInfo, ( statement->stmt, @@ -234,7 +308,7 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC) /* scan through our columns for a piecewise column with a matching handle */ for (i = 0; i < statement->ncolumns; i++) { column = php_oci_statement_get_column(statement, i + 1, NULL, 0 TSRMLS_CC); - if (column->piecewise && handlepp == column->oci_define) { + if (column && column->piecewise && handlepp == column->oci_define) { if (!column->data) { column->data = (text *) ecalloc(1, PHP_OCI_PIECE_SIZE + 1); } else { @@ -259,7 +333,7 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC) } } - PHP_OCI_CALL_RETURN(statement->errcode, OCIStmtFetch, (statement->stmt, statement->err, nrows, OCI_FETCH_NEXT, OCI_DEFAULT)); + PHP_OCI_CALL_RETURN(errstatus, OCIStmtFetch, (statement->stmt, statement->err, nrows, OCI_FETCH_NEXT, OCI_DEFAULT)); if (piecewisecols) { for (i = 0; i < statement->ncolumns; i++) { @@ -271,7 +345,7 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC) } } - if (statement->errcode == OCI_SUCCESS_WITH_INFO || statement->errcode == OCI_SUCCESS) { + if (errstatus == OCI_SUCCESS_WITH_INFO || errstatus == OCI_SUCCESS) { statement->has_data = 1; /* do the stuff needed for OCIDefineByName */ @@ -292,7 +366,7 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC) return 0; } - statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); + statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); statement->has_data = 0; @@ -332,7 +406,7 @@ php_oci_out_column *php_oci_statement_get_column(php_oci_statement *statement, l } /* }}} */ -/* php_oci_define_callback() {{{ */ +/* {{{ php_oci_define_callback() */ sb4 php_oci_define_callback(dvoid *ctx, OCIDefine *define, ub4 iter, dvoid **bufpp, ub4 **alenpp, ub1 *piecep, dvoid **indpp, ub2 **rcpp) { php_oci_out_column *outcol = (php_oci_out_column *)ctx; @@ -415,12 +489,18 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) ub4 colcount; ub2 dynamic; dvoid *buf; + sword errstatus; switch (mode) { case OCI_COMMIT_ON_SUCCESS: case OCI_DESCRIBE_ONLY: case OCI_DEFAULT: /* only these are allowed */ +#ifdef HAVE_OCI8_DTRACE + if (DTRACE_OCI8_EXECUTE_MODE_ENABLED()) { + DTRACE_OCI8_EXECUTE_MODE(statement->connection, mode); + } +#endif /* HAVE_OCI8_DTRACE */ break; default: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid execute mode given: %d", mode); @@ -430,12 +510,14 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) if (!statement->stmttype) { /* get statement type */ - PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (ub2 *)&statement->stmttype, (ub4 *)0, OCI_ATTR_STMT_TYPE, statement->err)); + PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (ub2 *)&statement->stmttype, (ub4 *)0, OCI_ATTR_STMT_TYPE, statement->err)); - if (statement->errcode != OCI_SUCCESS) { - statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; + } else { + statement->errcode = 0; /* retain backwards compat with OCI8 1.4 */ } } @@ -445,9 +527,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) iters = 1; } - if (statement->last_query) { - /* if we execute refcursors we don't have a query and - we don't want to execute!!! */ + if (statement->last_query) { /* Don't execute REFCURSORS or Implicit Result Set handles */ if (statement->binds) { int result = 0; @@ -458,10 +538,10 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) } /* execute statement */ - PHP_OCI_CALL_RETURN(statement->errcode, OCIStmtExecute, (statement->connection->svc, statement->stmt, statement->err, iters, 0, NULL, NULL, mode)); + PHP_OCI_CALL_RETURN(errstatus, OCIStmtExecute, (statement->connection->svc, statement->stmt, statement->err, iters, 0, NULL, NULL, mode)); - if (statement->errcode != OCI_SUCCESS) { - statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; } @@ -471,10 +551,20 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) } if (mode & OCI_COMMIT_ON_SUCCESS) { - statement->connection->needs_commit = 0; - } else { - statement->connection->needs_commit = 1; + /* No need to rollback on disconnect */ + statement->connection->rb_on_disconnect = 0; + } else if (statement->stmttype != OCI_STMT_SELECT) { + /* Assume some uncommitted DML occurred */ + statement->connection->rb_on_disconnect = 1; } + /* else for SELECT with OCI_NO_AUTO_COMMIT, leave + * "rb_on_disconnect" at its previous value. SELECT can't + * initiate uncommitted DML. (An AUTONOMOUS_TRANSACTION in + * invoked PL/SQL must explicitly rollback/commit else the + * SELECT fails). + */ + + statement->errcode = 0; /* retain backwards compat with OCI8 1.4 */ } if (statement->stmttype == OCI_STMT_SELECT && statement->executed == 0) { @@ -487,10 +577,10 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) counter = 1; /* get number of columns */ - PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (dvoid *)&colcount, (ub4 *)0, OCI_ATTR_PARAM_COUNT, statement->err)); + PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (dvoid *)&colcount, (ub4 *)0, OCI_ATTR_PARAM_COUNT, statement->err)); - if (statement->errcode != OCI_SUCCESS) { - statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; } @@ -507,50 +597,50 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) } /* get column */ - PHP_OCI_CALL_RETURN(statement->errcode, OCIParamGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, statement->err, (dvoid**)¶m, counter)); + PHP_OCI_CALL_RETURN(errstatus, OCIParamGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, statement->err, (dvoid**)¶m, counter)); - if (statement->errcode != OCI_SUCCESS) { - statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; } /* get column datatype */ - PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->data_type, (ub4 *)0, OCI_ATTR_DATA_TYPE, statement->err)); + PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->data_type, (ub4 *)0, OCI_ATTR_DATA_TYPE, statement->err)); - if (statement->errcode != OCI_SUCCESS) { + if (errstatus != OCI_SUCCESS) { PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); - statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); + statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; } /* get character set form */ - PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->charset_form, (ub4 *)0, OCI_ATTR_CHARSET_FORM, statement->err)); + PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->charset_form, (ub4 *)0, OCI_ATTR_CHARSET_FORM, statement->err)); - if (statement->errcode != OCI_SUCCESS) { + if (errstatus != OCI_SUCCESS) { PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); - statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); + statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; } /* get character set id */ - PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->charset_id, (ub4 *)0, OCI_ATTR_CHARSET_ID, statement->err)); + PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->charset_id, (ub4 *)0, OCI_ATTR_CHARSET_ID, statement->err)); - if (statement->errcode != OCI_SUCCESS) { + if (errstatus != OCI_SUCCESS) { PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); - statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); + statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; } /* get size of the column */ - PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->data_size, (dvoid *)0, OCI_ATTR_DATA_SIZE, statement->err)); + PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->data_size, (dvoid *)0, OCI_ATTR_DATA_SIZE, statement->err)); - if (statement->errcode != OCI_SUCCESS) { + if (errstatus != OCI_SUCCESS) { PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); - statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); + statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; } @@ -559,31 +649,31 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) outcol->retlen = outcol->data_size; /* get scale of the column */ - PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->scale, (dvoid *)0, OCI_ATTR_SCALE, statement->err)); + PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->scale, (dvoid *)0, OCI_ATTR_SCALE, statement->err)); - if (statement->errcode != OCI_SUCCESS) { + if (errstatus != OCI_SUCCESS) { PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); - statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); + statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; } /* get precision of the column */ - PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->precision, (dvoid *)0, OCI_ATTR_PRECISION, statement->err)); + PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->precision, (dvoid *)0, OCI_ATTR_PRECISION, statement->err)); - if (statement->errcode != OCI_SUCCESS) { + if (errstatus != OCI_SUCCESS) { PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); - statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); + statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; } /* get name of the column */ - PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid **)&colname, (ub4 *)&outcol->name_len, (ub4)OCI_ATTR_NAME, statement->err)); + PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid **)&colname, (ub4 *)&outcol->name_len, (ub4)OCI_ATTR_NAME, statement->err)); - if (statement->errcode != OCI_SUCCESS) { + if (errstatus != OCI_SUCCESS) { PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); - statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); + statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; } @@ -591,7 +681,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) outcol->name = estrndup((char*) colname, outcol->name_len); - /* find a user-setted define */ + /* find a user-set define */ if (statement->defines) { if (zend_hash_find(statement->defines,outcol->name,outcol->name_len,(void **) &outcol->define) == SUCCESS) { if (outcol->define->type) { @@ -679,7 +769,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) } if (dynamic == OCI_DYNAMIC_FETCH) { - PHP_OCI_CALL_RETURN(statement->errcode, + PHP_OCI_CALL_RETURN(errstatus, OCIDefineByPos, ( statement->stmt, /* IN/OUT handle to the requested SQL query */ @@ -697,7 +787,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) ); } else { - PHP_OCI_CALL_RETURN(statement->errcode, + PHP_OCI_CALL_RETURN(errstatus, OCIDefineByPos, ( statement->stmt, /* IN/OUT handle to the requested SQL query */ @@ -716,10 +806,10 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) } - if (statement->errcode != OCI_SUCCESS) { - statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); - return 0; + return 1; } /* additional OCIDefineDynamic() call */ @@ -729,7 +819,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) case SQLT_BLOB: case SQLT_CLOB: case SQLT_BFILE: - PHP_OCI_CALL_RETURN(statement->errcode, + PHP_OCI_CALL_RETURN(errstatus, OCIDefineDynamic, ( outcol->oci_define, @@ -739,9 +829,15 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) ) ); + if (errstatus != OCI_SUCCESS) { + statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC); + PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); + return 1; + } break; } } + statement->errcode = 0; /* retain backwards compat with OCI8 1.4 */ } return 0; @@ -752,10 +848,9 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) Cancel statement */ int php_oci_statement_cancel(php_oci_statement *statement TSRMLS_DC) { - return php_oci_statement_fetch(statement, 0 TSRMLS_CC); - -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_statement_free() Destroy statement handle and free associated resources */ @@ -764,15 +859,15 @@ void php_oci_statement_free(php_oci_statement *statement TSRMLS_DC) if (statement->stmt) { if (statement->last_query_len) { /* FIXME: magical */ PHP_OCI_CALL(OCIStmtRelease, (statement->stmt, statement->err, NULL, 0, statement->errcode ? OCI_STRLS_CACHE_DELETE : OCI_DEFAULT)); - } else { + } else if (statement->impres_flag != PHP_OCI_IMPRES_IS_CHILD) { /* Oracle doc says don't free Implicit Result Set handles */ PHP_OCI_CALL(OCIHandleFree, (statement->stmt, OCI_HTYPE_STMT)); } - statement->stmt = 0; + statement->stmt = NULL; } if (statement->err) { PHP_OCI_CALL(OCIHandleFree, (statement->err, OCI_HTYPE_ERROR)); - statement->err = 0; + statement->err = NULL; } if (statement->last_query) { @@ -798,11 +893,12 @@ void php_oci_statement_free(php_oci_statement *statement TSRMLS_DC) zend_list_delete(statement->parent_stmtid); } - zend_list_delete(statement->connection->rsrc_id); + zend_list_delete(statement->connection->id); efree(statement); OCI_G(num_statements)--; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_bind_pre_exec() Helper function */ @@ -872,6 +968,7 @@ int php_oci_bind_post_exec(void *data TSRMLS_DC) { php_oci_bind *bind = (php_oci_bind *) data; php_oci_connection *connection = bind->parent_statement->connection; + sword errstatus; if (bind->indicator == -1) { /* NULL */ zval *val = bind->zval; @@ -931,24 +1028,26 @@ int php_oci_bind_post_exec(void *data TSRMLS_DC) memset((void*)buff,0,sizeof(buff)); if ((i < bind->array.old_length) && (zend_hash_get_current_data(hash, (void **) &entry) != FAILURE)) { - PHP_OCI_CALL_RETURN(connection->errcode, OCIDateToText, (connection->err, &(((OCIDate *)(bind->array.elements))[i]), 0, 0, 0, 0, &buff_len, buff)); + PHP_OCI_CALL_RETURN(errstatus, OCIDateToText, (connection->err, &(((OCIDate *)(bind->array.elements))[i]), 0, 0, 0, 0, &buff_len, buff)); zval_dtor(*entry); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); ZVAL_NULL(*entry); } else { + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ ZVAL_STRINGL(*entry, (char *)buff, buff_len, 1); } zend_hash_move_forward(hash); } else { - PHP_OCI_CALL_RETURN(connection->errcode, OCIDateToText, (connection->err, &(((OCIDate *)(bind->array.elements))[i]), 0, 0, 0, 0, &buff_len, buff)); - if (connection->errcode != OCI_SUCCESS) { - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + PHP_OCI_CALL_RETURN(errstatus, OCIDateToText, (connection->err, &(((OCIDate *)(bind->array.elements))[i]), 0, 0, 0, 0, &buff_len, buff)); + if (errstatus != OCI_SUCCESS) { + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); add_next_index_null(bind->zval); } else { + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ add_next_index_stringl(bind->zval, (char *)buff, buff_len, 1); } } @@ -982,7 +1081,7 @@ int php_oci_bind_post_exec(void *data TSRMLS_DC) /* {{{ php_oci_bind_by_name() Bind zval to the given placeholder */ -int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, zval* var, long maxlength, ub2 type TSRMLS_DC) +int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, zval *var, long maxlength, ub2 type TSRMLS_DC) { php_oci_collection *bind_collection = NULL; php_oci_descriptor *bind_descriptor = NULL; @@ -994,6 +1093,7 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, php_oci_bind bind, *old_bind, *bindp; int mode = OCI_DATA_AT_EXEC; sb4 value_sz = -1; + sword errstatus; switch (type) { case SQLT_NTY: @@ -1117,7 +1217,7 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, bindp->type = type; zval_add_ref(&var); - PHP_OCI_CALL_RETURN(statement->errcode, + PHP_OCI_CALL_RETURN(errstatus, OCIBindByName, ( statement->stmt, /* statement handle */ @@ -1137,14 +1237,14 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, ) ); - if (statement->errcode != OCI_SUCCESS) { - statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; } if (mode == OCI_DATA_AT_EXEC) { - PHP_OCI_CALL_RETURN(statement->errcode, OCIBindDynamic, + PHP_OCI_CALL_RETURN(errstatus, OCIBindDynamic, ( bindp->bind, statement->err, @@ -1155,8 +1255,8 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, ) ); - if (statement->errcode != OCI_SUCCESS) { - statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; } @@ -1164,7 +1264,7 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, if (type == SQLT_NTY) { /* Bind object */ - PHP_OCI_CALL_RETURN(statement->errcode, OCIBindObject, + PHP_OCI_CALL_RETURN(errstatus, OCIBindObject, ( bindp->bind, statement->err, @@ -1176,15 +1276,17 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, ) ); - if (statement->errcode) { - statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); + if (errstatus) { + statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; } } + statement->errcode = 0; /* retain backwards compat with OCI8 1.4 */ return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_bind_in_callback() Callback used when binding LOBs and VARCHARs */ @@ -1235,7 +1337,8 @@ sb4 php_oci_bind_in_callback( *piecep = OCI_ONE_PIECE; /* pass all data in one go */ return OCI_CONTINUE; -}/* }}} */ +} +/* }}} */ /* {{{ php_oci_bind_out_callback() Callback used when binding LOBs and VARCHARs */ @@ -1358,55 +1461,61 @@ php_oci_out_column *php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAME zval_dtor(&tmp); } return column; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_statement_get_type() Return type of the statement */ int php_oci_statement_get_type(php_oci_statement *statement, ub2 *type TSRMLS_DC) { ub2 statement_type; + sword errstatus; *type = 0; - PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (ub2 *)&statement_type, (ub4 *)0, OCI_ATTR_STMT_TYPE, statement->err)); + PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (ub2 *)&statement_type, (ub4 *)0, OCI_ATTR_STMT_TYPE, statement->err)); - if (statement->errcode != OCI_SUCCESS) { - statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; } - + statement->errcode = 0; /* retain backwards compat with OCI8 1.4 */ *type = statement_type; return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_statement_get_numrows() Get the number of rows fetched to the clientside (NOT the number of rows in the result set) */ int php_oci_statement_get_numrows(php_oci_statement *statement, ub4 *numrows TSRMLS_DC) { ub4 statement_numrows; + sword errstatus; *numrows = 0; - PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (ub4 *)&statement_numrows, (ub4 *)0, OCI_ATTR_ROW_COUNT, statement->err)); + PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (ub4 *)&statement_numrows, (ub4 *)0, OCI_ATTR_ROW_COUNT, statement->err)); - if (statement->errcode != OCI_SUCCESS) { - statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); + if (errstatus != OCI_SUCCESS) { + statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; } - + statement->errcode = 0; /* retain backwards compat with OCI8 1.4 */ *numrows = statement_numrows; return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_bind_array_by_name() Bind arrays to PL/SQL types */ -int php_oci_bind_array_by_name(php_oci_statement *statement, char *name, int name_len, zval* var, long max_table_length, long maxlength, long type TSRMLS_DC) +int php_oci_bind_array_by_name(php_oci_statement *statement, char *name, int name_len, zval *var, long max_table_length, long maxlength, long type TSRMLS_DC) { php_oci_bind *bind, *bindp; + sword errstatus; convert_to_array(var); @@ -1470,7 +1579,7 @@ int php_oci_bind_array_by_name(php_oci_statement *statement, char *name, int nam zval_add_ref(&var); - PHP_OCI_CALL_RETURN(statement->errcode, + PHP_OCI_CALL_RETURN(errstatus, OCIBindByName, ( statement->stmt, @@ -1491,19 +1600,21 @@ int php_oci_bind_array_by_name(php_oci_statement *statement, char *name, int nam ); - if (statement->errcode != OCI_SUCCESS) { + if (errstatus != OCI_SUCCESS) { efree(bind); - statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); + statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; } + statement->errcode = 0; /* retain backwards compat with OCI8 1.4 */ efree(bind); return 0; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_bind_array_helper_string() Bind arrays to PL/SQL types */ -php_oci_bind *php_oci_bind_array_helper_string(zval* var, long max_table_length, long maxlength TSRMLS_DC) +php_oci_bind *php_oci_bind_array_helper_string(zval *var, long max_table_length, long maxlength TSRMLS_DC) { php_oci_bind *bind; ub4 i; @@ -1568,11 +1679,12 @@ php_oci_bind *php_oci_bind_array_helper_string(zval* var, long max_table_length, zend_hash_internal_pointer_reset(hash); return bind; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_bind_array_helper_number() Bind arrays to PL/SQL types */ -php_oci_bind *php_oci_bind_array_helper_number(zval* var, long max_table_length TSRMLS_DC) +php_oci_bind *php_oci_bind_array_helper_number(zval *var, long max_table_length TSRMLS_DC) { php_oci_bind *bind; ub4 i; @@ -1606,11 +1718,12 @@ php_oci_bind *php_oci_bind_array_helper_number(zval* var, long max_table_length zend_hash_internal_pointer_reset(hash); return bind; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_bind_array_helper_double() Bind arrays to PL/SQL types */ -php_oci_bind *php_oci_bind_array_helper_double(zval* var, long max_table_length TSRMLS_DC) +php_oci_bind *php_oci_bind_array_helper_double(zval *var, long max_table_length TSRMLS_DC) { php_oci_bind *bind; ub4 i; @@ -1644,16 +1757,18 @@ php_oci_bind *php_oci_bind_array_helper_double(zval* var, long max_table_length zend_hash_internal_pointer_reset(hash); return bind; -} /* }}} */ +} +/* }}} */ /* {{{ php_oci_bind_array_helper_date() Bind arrays to PL/SQL types */ -php_oci_bind *php_oci_bind_array_helper_date(zval* var, long max_table_length, php_oci_connection *connection TSRMLS_DC) +php_oci_bind *php_oci_bind_array_helper_date(zval *var, long max_table_length, php_oci_connection *connection TSRMLS_DC) { php_oci_bind *bind; ub4 i; HashTable *hash; zval **entry; + sword errstatus; hash = HASH_OF(var); @@ -1675,14 +1790,14 @@ php_oci_bind *php_oci_bind_array_helper_date(zval* var, long max_table_length, p if ((i < bind->array.current_length) && (zend_hash_get_current_data(hash, (void **) &entry) != FAILURE)) { convert_to_string_ex(entry); - PHP_OCI_CALL_RETURN(connection->errcode, OCIDateFromText, (connection->err, (CONST text *)Z_STRVAL_PP(entry), Z_STRLEN_PP(entry), NULL, 0, NULL, 0, &oci_date)); + PHP_OCI_CALL_RETURN(errstatus, OCIDateFromText, (connection->err, (CONST text *)Z_STRVAL_PP(entry), Z_STRLEN_PP(entry), NULL, 0, NULL, 0, &oci_date)); - if (connection->errcode != OCI_SUCCESS) { + if (errstatus != OCI_SUCCESS) { /* failed to convert string to date */ efree(bind->array.element_lengths); efree(bind->array.elements); efree(bind); - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return NULL; } @@ -1690,25 +1805,27 @@ php_oci_bind *php_oci_bind_array_helper_date(zval* var, long max_table_length, p ((OCIDate *)bind->array.elements)[i] = oci_date; zend_hash_move_forward(hash); } else { - PHP_OCI_CALL_RETURN(connection->errcode, OCIDateFromText, (connection->err, (CONST text *)"01-JAN-00", sizeof("01-JAN-00")-1, NULL, 0, NULL, 0, &oci_date)); + PHP_OCI_CALL_RETURN(errstatus, OCIDateFromText, (connection->err, (CONST text *)"01-JAN-00", sizeof("01-JAN-00")-1, NULL, 0, NULL, 0, &oci_date)); - if (connection->errcode != OCI_SUCCESS) { + if (errstatus != OCI_SUCCESS) { /* failed to convert string to date */ efree(bind->array.element_lengths); efree(bind->array.elements); efree(bind); - connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); + connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); return NULL; } ((OCIDate *)bind->array.elements)[i] = oci_date; } + connection->errcode = 0; /* retain backwards compat with OCI8 1.4 */ } zend_hash_internal_pointer_reset(hash); return bind; -} /* }}} */ +} +/* }}} */ #endif /* HAVE_OCI8 */ diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index feadf1907b..fcab20cc45 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -6,7 +6,14 @@ http://pear.php.net/dtd/package-2.0.xsd"> <name>oci8</name> <channel>pecl.php.net</channel> <summary>Extension for Oracle Database</summary> - <description>This extension allows you to access Oracle databases. It can be built with PHP 4.3.9 to 5.x. It can be linked with Oracle 9.2, 10, 11, or 12.1 client libraries. + + <description> + This extension allows you to access Oracle Database. OCI8 2.0 can + be built with PHP 4.3.9 onwards. OCI8 can be linked with Oracle + Database 9.2, 10, 11, or 12.1 client libraries. Oracle's standard + cross-version connectivity applies. For example PHP linked with + Oracle Database 11.2 client libraries can connect to Oracle + Database 9.2 onwards. </description> <lead> <name>Christopher Jones</name> @@ -18,7 +25,7 @@ http://pear.php.net/dtd/package-2.0.xsd"> <name>Antony Dovgal</name> <user>tony2001</user> <email>tony2001@php.net</email> - <active>yes</active> + <active>no</active> </lead> <lead> <name>Wez Furlong</name> @@ -33,21 +40,24 @@ http://pear.php.net/dtd/package-2.0.xsd"> <active>no</active> </lead> - <date>2013-07-08</date> + <date>2013-09-06</date> <time>12:00:00</time> - <version> - <release>1.4.10</release> - <api>1.4.10</api> - </version> - <stability> - <release>stable</release> - <api>stable</api> - </stability> - <license uri="http://www.php.net/license">PHP</license> - <notes> - Bump PECL package info version check to allow PECL installs with PHP 5.5+ - </notes> + <version> + <release>2.0.2</release> + <api>2.0.2</api> + </version> + <stability> + <release>devel</release> + <api>devel</api> + </stability> + <license uri="http://www.php.net/license">PHP</license> + <notes> +Review and improve error handling code and data types. +Fix oci_set_*($connection, ...) error handling so oci_error($connection) works. +Add DTrace oci8-connection-close probe +Add the connection handle to several DTrace probes. + </notes> <contents> <dir name="/"> <dir name="tests"> @@ -94,6 +104,7 @@ http://pear.php.net/dtd/package-2.0.xsd"> <file name="bind_misccoltypes.phpt" role="test" /> <file name="bind_number.phpt" role="test" /> <file name="bind_query.phpt" role="test" /> + <file name="bind_raw_2.phpt" role="test" /> <file name="bind_raw.phpt" role="test" /> <file name="bind_rowid.phpt" role="test" /> <file name="bind_sqltafc.phpt" role="test" /> @@ -287,6 +298,38 @@ http://pear.php.net/dtd/package-2.0.xsd"> <file name="field_funcs_old.phpt" role="test" /> <file name="field_funcs.phpt" role="test" /> <file name="function_aliases.phpt" role="test" /> + <file name="imp_res_1.phpt" role="test" /> + <file name="imp_res_2.phpt" role="test" /> + <file name="imp_res_3.phpt" role="test" /> + <file name="imp_res_4.phpt" role="test" /> + <file name="imp_res_5.phpt" role="test" /> + <file name="imp_res_6.phpt" role="test" /> + <file name="imp_res_7.phpt" role="test" /> + <file name="imp_res_call_error.phpt" role="test" /> + <file name="imp_res_cancel.phpt" role="test" /> + <file name="imp_res_close.phpt" role="test" /> + <file name="imp_res_cursor.phpt" role="test" /> + <file name="imp_res_dbmsoutput.phpt" role="test" /> + <file name="imp_res_field.phpt" role="test" /> + <file name="imp_res_func_error.phpt" role="test" /> + <file name="imp_res_get_1.phpt" role="test" /> + <file name="imp_res_get_2.phpt" role="test" /> + <file name="imp_res_get_3.phpt" role="test" /> + <file name="imp_res_get_4.phpt" role="test" /> + <file name="imp_res_get_5.phpt" role="test" /> + <file name="imp_res_get_all.phpt" role="test" /> + <file name="imp_res_get_cancel.phpt" role="test" /> + <file name="imp_res_get_close_1.phpt" role="test" /> + <file name="imp_res_get_close_2.phpt" role="test" /> + <file name="imp_res_get_close_3.phpt" role="test" /> + <file name="imp_res_get_cursor.phpt" role="test" /> + <file name="imp_res_get_dbmsoutput.phpt" role="test" /> + <file name="imp_res_get_exec.phpt" role="test" /> + <file name="imp_res_get_none.phpt" role="test" /> + <file name="imp_res_insert.phpt" role="test" /> + <file name="imp_res_lob.phpt" role="test" /> + <file name="imp_res_prefetch.phpt" role="test" /> + <file name="ini_1.phpt" role="test" /> <file name="lob_001.phpt" role="test" /> <file name="lob_002.phpt" role="test" /> <file name="lob_003.phpt" role="test" /> @@ -335,6 +378,7 @@ http://pear.php.net/dtd/package-2.0.xsd"> <file name="lob_aliases.phpt" role="test" /> <file name="lob_null.phpt" role="test" /> <file name="lob_temp1.phpt" role="test" /> + <file name="lob_temp2.phpt" role="test" /> <file name="lob_temp.phpt" role="test" /> <file name="minfo.phpt" role="test" /> <file name="null_byte_1.phpt" role="test" /> @@ -383,13 +427,14 @@ http://pear.php.net/dtd/package-2.0.xsd"> <file name="config.w32" role="src" /> <file name="CREDITS" role="doc" /> <file name="oci8.c" role="src" /> - <file name="oci8.dsp" role="src" /> + <file name="oci8_dtrace.d" role="src" /> <file name="oci8_collection.c" role="src" /> <file name="oci8_interface.c" role="src" /> <file name="oci8_lob.c" role="src" /> <file name="oci8_statement.c" role="src" /> <file name="php_oci8.h" role="src" /> <file name="php_oci8_int.h" role="src" /> + <file name="oci8.dsp" role="src" /> <file name="README" role="doc" /> </dir> <!-- / --> </contents> @@ -411,6 +456,116 @@ http://pear.php.net/dtd/package-2.0.xsd"> <changelog> <release> + <version> + <release>2.0.1</release> + <api>2.0.1</api> + </version> + <stability> + <release>devel</release> + <api>devel</api> + </stability> + <license uri="http://www.php.net/license">PHP</license> + <notes> +Fixed --enable-maintainer-zts mode. +Allow Implicit Result Set statement resources to inherit the parent's current prefetch count. +Allow OCI8 to be DTrace-enabled independently from core PHP. +Require OCI8 to be configured 'shared' when enabling DTrace support. + </notes> +</release> + +<release> + <version> + <release>2.0.0</release> + <api>2.0.0</api> + </version> + <stability> + <release>devel</release> + <api>devel</api> + </stability> + <license uri="http://www.php.net/license">PHP</license> + <notes> +- NEW FUNCTIONALITY: + + - Added Implicit Result Set support for Oracle Database 12c. + Streaming of all IRS's returned from a PL/SQL block is available + via oci_fetch_array, oci_fetch_assoc, oci_fetch_object and + oci_fetch_row (but not oci_fetch or oci_fetch_all). + Alternatively individual IRS statement resources can be obtained + with the new function 'oci_get_implicit_resultset' and passed to + any oci_fetch_* function. + + - Added DTrace probes enabled with PHP's generic --enable-dtrace + +- IMPROVED FUNCTIONALITY: + + - Using 'oci_execute($s, OCI_NO_AUTO_COMMIT)' for a SELECT no + longer unnecessarily initiates an internal ROLLBACK during + connection close. This can improve overall scalability by + reducing "round trips" between PHP and the database. + +- CHANGED FUNCTIONALITY: + + - PHPINFO() CHANGES: + + - The oci8.event and oci8.connection_class values are now shown + only when the Oracle client libraries support the respective + functionality. + + - Connection statistics are now in a separate phpinfo() table. + + - Temporary LOB and Collection support status lines in + phpinfo() were removed. These features have always been + enabled since 2007. + + - OCI_INTERNAL_DEBUG() CHANGES: + + - The oci_internal_debug() function is now a no-op. Use PHP's + --enable-dtrace functionality with DTrace or SystemTap instead. + +- INTERNAL CHANGES: + + - Fixed a potential NULL pointer dereference flagged by Parfait + static code analysis. + + - Extended testing of existing OCI8 functionality. + + - Improved test output portability when using the PHP development + web server to run tests. + + - Removed no-longer necessary Unicode patterns from tests + (vestiges of PHP's previous PHP 6 project) + + - Improved build portability by removing compilation type cast + warnings with some compilers. + + - Fixed compilation warnings when building with Oracle 9.2 + client libraries. + + - Updated code to use internal macro PHP_OCI_REGISTER_RESOURCE. + + - Regularized code prototypes and fixed some in-line documentation + prototypes. + + - Fixed code folding. + </notes> +</release> + +<release> + <version> + <release>1.4.10</release> + <api>1.4.10</api> + </version> + <stability> + <release>stable</release> + <api>stable</api> + </stability> + <license uri="http://www.php.net/license">PHP</license> + <notes> + Bump PECL package info version check to allow PECL installs with PHP 5.5+ + </notes> +</release> + +<release> <version> <release>1.4.9</release> <api>1.4.9</api> @@ -457,7 +612,7 @@ http://pear.php.net/dtd/package-2.0.xsd"> Fixed OCI8 part of bug #55748 (CVE-2011-4153: multiple NULL pointer dereferences with zend_strndup) Fixed OCI8 part of bug #55301 (multiple null pointer dereferences with calloc) Increased maximum Oracle error message buffer length for new Oracle 11.2.0.3 size - Improve internal initalization failure error messages + Improve internal initialization failure error messages </notes> </release> @@ -472,7 +627,7 @@ http://pear.php.net/dtd/package-2.0.xsd"> </stability> <license uri="http://www.php.net/license">PHP</license> <notes> - Added oci_client_version() returning the runtime Oracle client library version + Added oci_client_version() returning the run time Oracle client library version Made OCI8 extension buildable with PHP 5.4-development code </notes> </release> @@ -846,7 +1001,7 @@ Fixed bug #36820 (Privileged connection with an Oracle password file fails) <date>2006-03-16</date> <license uri="http://www.php.net/license">PHP</license> <notes>Changed OCI8 code to use OCIServerVersion() instead of OCIPing(), which may crash Oracle server of version < 10.2 -Fixed bug #36235 (ocicolumnname returns false before a successfull fetch) +Fixed bug #36235 (ocicolumnname returns false before a successful fetch) Fixed bug #36096 (oci_result() returns garbage after oci_fetch() failed) Fixed bug #36055 (possible OCI8 crash in multithreaded environment) Fixed bug #36010 (Segfault when re-creating and re-executing statements with bound parameters) diff --git a/ext/oci8/php_oci8.h b/ext/oci8/php_oci8.h index f1079526f6..8c5fba9ab0 100644 --- a/ext/oci8/php_oci8.h +++ b/ext/oci8/php_oci8.h @@ -46,7 +46,7 @@ */ #undef PHP_OCI8_VERSION #endif -#define PHP_OCI8_VERSION "1.4.10" +#define PHP_OCI8_VERSION "2.0.2-dev" extern zend_module_entry oci8_module_entry; #define phpext_oci8_ptr &oci8_module_entry diff --git a/ext/oci8/php_oci8_int.h b/ext/oci8/php_oci8_int.h index 155e57d2cd..6155a883b0 100644 --- a/ext/oci8/php_oci8_int.h +++ b/ext/oci8/php_oci8_int.h @@ -31,7 +31,7 @@ # ifndef PHP_OCI8_INT_H # define PHP_OCI8_INT_H -/* misc defines {{{ */ +/* {{{ misc defines */ # if (defined(__osf__) && defined(__alpha)) # ifndef A_OSF # define A_OSF @@ -44,6 +44,10 @@ # endif # endif /* osf alpha */ +#ifdef HAVE_OCI8_DTRACE +#include "oci8_dtrace_gen.h" +#endif + #if defined(min) #undef min #endif @@ -66,7 +70,7 @@ extern int le_session; extern zend_class_entry *oci_lob_class_entry_ptr; extern zend_class_entry *oci_coll_class_entry_ptr; -/* constants {{{ */ +/* {{{ constants */ #define PHP_OCI_SEEK_SET 0 #define PHP_OCI_SEEK_CUR 1 #define PHP_OCI_SEEK_END 2 @@ -101,6 +105,11 @@ extern zend_class_entry *oci_coll_class_entry_ptr; #error Invalid value for PHP_OCI_CRED_EXT #endif +#define PHP_OCI_IMPRES_UNKNOWN 0 +#define PHP_OCI_IMPRES_NO_CHILDREN 1 +#define PHP_OCI_IMPRES_HAS_CHILDREN 2 +#define PHP_OCI_IMPRES_IS_CHILD 3 + /* * Name passed to Oracle for tracing. Note some DB views only show * the first nine characters of the driver name. @@ -109,16 +118,21 @@ extern zend_class_entry *oci_coll_class_entry_ptr; /* }}} */ -typedef struct { /* php_oci_spool {{{ */ - OCIEnv *env; /*env of this session pool */ +/* {{{ php_oci_spool */ +typedef struct { + int id; /* resource id */ + OCIEnv *env; /* env of this session pool */ OCIError *err; /* pool's error handle */ OCISPool *poolh; /* pool handle */ void *poolname; /* session pool name */ unsigned int poolname_len; /* length of session pool name */ char *spool_hash_key; /* Hash key for session pool in plist */ -} php_oci_spool; /* }}} */ +} php_oci_spool; +/* }}} */ -typedef struct { /* php_oci_connection {{{ */ +/* {{{ php_oci_connection */ +typedef struct { + int id; /* resource ID */ OCIEnv *env; /* private env handle */ ub2 charset; /* charset ID */ OCIServer *server; /* private server handle */ @@ -127,7 +141,7 @@ typedef struct { /* php_oci_connection {{{ */ OCIAuthInfo *authinfo; /* Cached authinfo handle for OCISessionGet */ OCIError *err; /* private error handle */ php_oci_spool *private_spool; /* private session pool (for persistent) */ - sword errcode; /* last errcode */ + sb4 errcode; /* last ORA- error number */ HashTable *descriptors; /* descriptors hash, used to flush all the LOBs using this connection on commit */ ulong descriptor_count; /* used to index the descriptors hash table. Not an accurate count */ @@ -135,17 +149,18 @@ typedef struct { /* php_oci_connection {{{ */ unsigned is_attached:1; /* hels to determine if we should detach from the server when closing/freeing the connection */ unsigned is_persistent:1; /* self-descriptive */ unsigned used_this_request:1; /* helps to determine if we should reset connection's next ping time and check its timeout */ - unsigned needs_commit:1; /* helps to determine if we should rollback this connection on close/shutdown */ + unsigned rb_on_disconnect:1; /* helps to determine if we should rollback this connection on close/shutdown */ unsigned passwd_changed:1; /* helps determine if a persistent connection hash should be invalidated after a password change */ unsigned is_stub:1; /* flag to keep track whether the connection structure has a real OCI connection associated */ unsigned using_spool:1; /* Is this connection from session pool? */ - int rsrc_id; /* resource ID */ time_t idle_expiry; /* time when the connection will be considered as expired */ time_t *next_pingp; /* (pointer to) time of the next ping */ char *hash_key; /* hashed details of the connection */ -} php_oci_connection; /* }}} */ +} php_oci_connection; +/* }}} */ -typedef struct { /* php_oci_descriptor {{{ */ +/* {{{ php_oci_descriptor */ +typedef struct { int id; ulong index; /* descriptors hash table index */ php_oci_connection *connection; /* parent connection handle */ @@ -158,15 +173,19 @@ typedef struct { /* php_oci_descriptor {{{ */ ub1 charset_form; /* charset form, required for NCLOBs */ ub2 charset_id; /* charset ID */ unsigned is_open:1; /* helps to determine if lob is open or not */ -} php_oci_descriptor; /* }}} */ +} php_oci_descriptor; +/* }}} */ -typedef struct { /* php_oci_lob_ctx {{{ */ +/* {{{ php_oci_lob_ctx */ +typedef struct { char **lob_data; /* address of pointer to LOB data */ ub4 *lob_len; /* address of LOB length variable (bytes) */ ub4 alloc_len; -} php_oci_lob_ctx; /* }}} */ +} php_oci_lob_ctx; +/* }}} */ -typedef struct { /* php_oci_collection {{{ */ +/* {{{ php_oci_collection */ +typedef struct { int id; php_oci_connection *connection; /* parent connection handle */ OCIType *tdo; /* collection's type handle */ @@ -175,23 +194,30 @@ typedef struct { /* php_oci_collection {{{ */ OCIType *element_type; /* element's type handle */ OCITypeCode element_typecode; /* element's typecode handle */ OCIColl *collection; /* collection handle */ -} php_oci_collection; /* }}} */ +} php_oci_collection; +/* }}} */ -typedef struct { /* php_oci_define {{{ */ +/* {{{ php_oci_define */ +typedef struct { zval *zval; /* zval used in define */ text *name; /* placeholder's name */ ub4 name_len; /* placeholder's name length */ ub4 type; /* define type */ -} php_oci_define; /* }}} */ +} php_oci_define; +/* }}} */ -typedef struct { /* php_oci_statement {{{ */ +/* {{{ php_oci_statement */ +typedef struct { int id; int parent_stmtid; /* parent statement id */ + struct php_oci_statement *impres_child_stmt;/* child of current Implicit Result Set statement handle */ + ub4 impres_count; /* count of remaining Implicit Result children on parent statement handle */ php_oci_connection *connection; /* parent connection handle */ - sword errcode; /* last errcode*/ + sb4 errcode; /* last ORA- error number */ OCIError *err; /* private error handle */ OCIStmt *stmt; /* statement handle */ - char *last_query; /* last query issued. also used to determine if this is a statement or a refcursor received from Oracle */ + char *last_query; /* last query issued. also used to determine if this is a statement or a refcursor recieved from Oracle */ + char impres_flag; /* PHP_OCI_IMPRES_*_ */ long last_query_len; /* last query length */ HashTable *columns; /* hash containing all the result columns */ HashTable *binds; /* binds hash */ @@ -201,9 +227,12 @@ typedef struct { /* php_oci_statement {{{ */ unsigned has_data:1; /* statement has more data flag */ unsigned has_descr:1; /* statement has at least one descriptor or cursor column */ ub2 stmttype; /* statement type */ -} php_oci_statement; /* }}} */ + ub4 prefetch_count; /* current prefetch count */ +} php_oci_statement; +/* }}} */ -typedef struct { /* php_oci_bind {{{ */ +/* {{{ php_oci_bind */ +typedef struct { OCIBind *bind; /* bind handle */ zval *zval; /* value */ dvoid *descriptor; /* used for binding of LOBS etc */ @@ -222,9 +251,11 @@ typedef struct { /* php_oci_bind {{{ */ sb2 indicator; /* -1 means NULL */ ub2 retcode; ub4 dummy_len; /* a dummy var to store alenpp value in bind OUT callback */ -} php_oci_bind; /* }}} */ +} php_oci_bind; +/* }}} */ -typedef struct { /* php_oci_out_column {{{ */ +/* {{{ php_oci_out_column */ +typedef struct { php_oci_statement *statement; /* statement handle. used when fetching REFCURSORS */ php_oci_statement *nested_statement; /* statement handle. used when fetching REFCURSORS */ OCIDefine *oci_define; /* define handle */ @@ -249,28 +280,23 @@ typedef struct { /* php_oci_out_column {{{ */ sb2 precision; /* column precision */ ub1 charset_form; /* charset form, required for NCLOBs */ ub2 charset_id; /* charset ID */ -} php_oci_out_column; /* }}} */ +} php_oci_out_column; +/* }}} */ /* {{{ macros */ -#define PHP_OCI_CALL(func, params) \ - do { \ - if (OCI_G(debug_mode)) { \ - php_printf ("OCI8 DEBUG: " #func " at (%s:%d) \n", __FILE__, __LINE__); \ - } \ - OCI_G(in_call) = 1; \ - func params; \ - OCI_G(in_call) = 0; \ +#define PHP_OCI_CALL(func, params) \ + do { \ + OCI_G(in_call) = 1; \ + func params; \ + OCI_G(in_call) = 0; \ } while (0) -#define PHP_OCI_CALL_RETURN(__retval, func, params) \ - do { \ - if (OCI_G(debug_mode)) { \ - php_printf ("OCI8 DEBUG: " #func " at (%s:%d) \n", __FILE__, __LINE__); \ - } \ - OCI_G(in_call) = 1; \ - __retval = func params; \ - OCI_G(in_call) = 0; \ +#define PHP_OCI_CALL_RETURN(__retval, func, params) \ + do { \ + OCI_G(in_call) = 1; \ + __retval = func params; \ + OCI_G(in_call) = 0; \ } while (0) /* Check for errors that indicate the connection to the DB is no @@ -284,6 +310,7 @@ typedef struct { /* php_oci_out_column {{{ */ */ #define PHP_OCI_HANDLE_ERROR(connection, errcode) \ do { \ + ub4 serverStatus = OCI_SERVER_NORMAL; \ switch (errcode) { \ case 1013: \ zend_bailout(); \ @@ -313,7 +340,6 @@ typedef struct { /* php_oci_out_column {{{ */ break; \ default: \ { \ - ub4 serverStatus = OCI_SERVER_NORMAL; \ PHP_OCI_CALL(OCIAttrGet, ((dvoid *)(connection)->server, OCI_HTYPE_SERVER, (dvoid *)&serverStatus, \ (ub4 *)0, OCI_ATTR_SERVER_STATUS, (connection)->err)); \ if (serverStatus != OCI_SERVER_NORMAL) { \ @@ -322,6 +348,7 @@ typedef struct { /* php_oci_out_column {{{ */ } \ break; \ } \ + php_oci_dtrace_check_connection(connection, errcode, serverStatus); \ } while (0) #define PHP_OCI_REGISTER_RESOURCE(resource, le_resource) \ @@ -365,117 +392,110 @@ typedef struct { /* php_oci_out_column {{{ */ /* PROTOS */ -/* main prototypes {{{ */ - -void php_oci_column_hash_dtor (void *data); -void php_oci_define_hash_dtor (void *data); -void php_oci_bind_hash_dtor (void *data); -void php_oci_descriptor_flush_hash_dtor (void *data); +/* {{{ main prototypes */ +void php_oci_column_hash_dtor(void *data); +void php_oci_define_hash_dtor(void *data); +void php_oci_bind_hash_dtor(void *data); +void php_oci_descriptor_flush_hash_dtor(void *data); void php_oci_connection_descriptors_free(php_oci_connection *connection TSRMLS_DC); - -sb4 php_oci_error (OCIError *, sword TSRMLS_DC); -sb4 php_oci_fetch_errmsg(OCIError *, text ** TSRMLS_DC); -int php_oci_fetch_sqltext_offset(php_oci_statement *, text **, ub2 * TSRMLS_DC); - -void php_oci_do_connect (INTERNAL_FUNCTION_PARAMETERS, int , int); +sb4 php_oci_error(OCIError *err_p, sword status TSRMLS_DC); +sb4 php_oci_fetch_errmsg(OCIError *error_handle, text **error_buf TSRMLS_DC); +int php_oci_fetch_sqltext_offset(php_oci_statement *statement, text **sqltext, ub2 *error_offset TSRMLS_DC); +void php_oci_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent, int exclusive); php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char *password, int password_len, char *new_password, int new_password_len, char *dbname, int dbname_len, char *charset, long session_mode, int persistent, int exclusive TSRMLS_DC); - -int php_oci_connection_rollback(php_oci_connection * TSRMLS_DC); -int php_oci_connection_commit(php_oci_connection * TSRMLS_DC); +int php_oci_connection_rollback(php_oci_connection *connection TSRMLS_DC); +int php_oci_connection_commit(php_oci_connection *connection TSRMLS_DC); int php_oci_connection_release(php_oci_connection *connection TSRMLS_DC); - -int php_oci_password_change(php_oci_connection *, char *, int, char *, int, char *, int TSRMLS_DC); -void php_oci_client_get_version(char ** TSRMLS_DC); -int php_oci_server_get_version(php_oci_connection *, char ** TSRMLS_DC); - -void php_oci_fetch_row(INTERNAL_FUNCTION_PARAMETERS, int, int); -int php_oci_column_to_zval(php_oci_out_column *, zval *, int TSRMLS_DC); +int php_oci_password_change(php_oci_connection *connection, char *user, int user_len, char *pass_old, int pass_old_len, char *pass_new, int pass_new_len TSRMLS_DC); +void php_oci_client_get_version(char **version TSRMLS_DC); +int php_oci_server_get_version(php_oci_connection *connection, char **version TSRMLS_DC); +void php_oci_fetch_row(INTERNAL_FUNCTION_PARAMETERS, int mode, int expected_args); +int php_oci_column_to_zval(php_oci_out_column *column, zval *value, int mode TSRMLS_DC); +void php_oci_dtrace_check_connection(php_oci_connection *connection, sb4 errcode, ub4 serverStatus); /* }}} */ -/* lob related prototypes {{{ */ - -php_oci_descriptor * php_oci_lob_create (php_oci_connection *, long TSRMLS_DC); -int php_oci_lob_get_length (php_oci_descriptor *, ub4 * TSRMLS_DC); -int php_oci_lob_read (php_oci_descriptor *, long, long, char **, ub4 * TSRMLS_DC); -int php_oci_lob_write (php_oci_descriptor *, ub4, char *, int, ub4 * TSRMLS_DC); -int php_oci_lob_flush (php_oci_descriptor *, long TSRMLS_DC); -int php_oci_lob_set_buffering (php_oci_descriptor *, int TSRMLS_DC); -int php_oci_lob_get_buffering (php_oci_descriptor *); -int php_oci_lob_copy (php_oci_descriptor *, php_oci_descriptor *, long TSRMLS_DC); -int php_oci_lob_close (php_oci_descriptor * TSRMLS_DC); -int php_oci_temp_lob_close (php_oci_descriptor * TSRMLS_DC); -int php_oci_lob_write_tmp (php_oci_descriptor *, long, char *, int TSRMLS_DC); -void php_oci_lob_free(php_oci_descriptor * TSRMLS_DC); -int php_oci_lob_import(php_oci_descriptor *descriptor, char * TSRMLS_DC); -int php_oci_lob_append (php_oci_descriptor *, php_oci_descriptor * TSRMLS_DC); -int php_oci_lob_truncate (php_oci_descriptor *, long TSRMLS_DC); -int php_oci_lob_erase (php_oci_descriptor *, long, ub4, ub4 * TSRMLS_DC); -int php_oci_lob_is_equal (php_oci_descriptor *, php_oci_descriptor *, boolean * TSRMLS_DC); +/* {{{ lob related prototypes */ + +php_oci_descriptor *php_oci_lob_create(php_oci_connection *connection, long type TSRMLS_DC); +int php_oci_lob_get_length(php_oci_descriptor *descriptor, ub4 *length TSRMLS_DC); +int php_oci_lob_read(php_oci_descriptor *descriptor, long read_length, long inital_offset, char **data, ub4 *data_len TSRMLS_DC); +int php_oci_lob_write(php_oci_descriptor *descriptor, ub4 offset, char *data, int data_len, ub4 *bytes_written TSRMLS_DC); +int php_oci_lob_flush(php_oci_descriptor *descriptor, long flush_flag TSRMLS_DC); +int php_oci_lob_set_buffering(php_oci_descriptor *descriptor, int on_off TSRMLS_DC); +int php_oci_lob_get_buffering(php_oci_descriptor *descriptor); +int php_oci_lob_copy(php_oci_descriptor *descriptor, php_oci_descriptor *descriptor_from, long length TSRMLS_DC); +int php_oci_lob_close(php_oci_descriptor *descriptor TSRMLS_DC); +int php_oci_temp_lob_close(php_oci_descriptor *descriptor TSRMLS_DC); +int php_oci_lob_write_tmp(php_oci_descriptor *descriptor, long type, char *data, int data_len TSRMLS_DC); +void php_oci_lob_free(php_oci_descriptor *descriptor TSRMLS_DC); +int php_oci_lob_import(php_oci_descriptor *descriptor, char *filename TSRMLS_DC); +int php_oci_lob_append(php_oci_descriptor *descriptor_dest, php_oci_descriptor *descriptor_from TSRMLS_DC); +int php_oci_lob_truncate(php_oci_descriptor *descriptor, long new_lob_length TSRMLS_DC); +int php_oci_lob_erase(php_oci_descriptor *descriptor, long offset, ub4 length, ub4 *bytes_erased TSRMLS_DC); +int php_oci_lob_is_equal(php_oci_descriptor *descriptor_first, php_oci_descriptor *descriptor_second, boolean *result TSRMLS_DC); #if defined(HAVE_OCI_LOB_READ2) -sb4 php_oci_lob_callback (dvoid *ctxp, CONST dvoid *bufxp, oraub8 len, ub1 piece, dvoid **changed_bufpp, oraub8 *changed_lenp); +sb4 php_oci_lob_callback(dvoid *ctxp, CONST dvoid *bufxp, oraub8 len, ub1 piece, dvoid **changed_bufpp, oraub8 *changed_lenp); #else -sb4 php_oci_lob_callback (dvoid *ctxp, CONST dvoid *bufxp, ub4 len, ub1 piece); +sb4 php_oci_lob_callback(dvoid *ctxp, CONST dvoid *bufxp, ub4 len, ub1 piece); #endif /* }}} */ -/* collection related prototypes {{{ */ - -php_oci_collection * php_oci_collection_create(php_oci_connection *, char *, int, char *, int TSRMLS_DC); -int php_oci_collection_size(php_oci_collection *, sb4 * TSRMLS_DC); -int php_oci_collection_max(php_oci_collection *, long * TSRMLS_DC); -int php_oci_collection_trim(php_oci_collection *, long TSRMLS_DC); -int php_oci_collection_append(php_oci_collection *, char *, int TSRMLS_DC); -int php_oci_collection_element_get(php_oci_collection *, long, zval** TSRMLS_DC); -int php_oci_collection_element_set(php_oci_collection *, long, char *, int TSRMLS_DC); -int php_oci_collection_element_set_null(php_oci_collection *, long TSRMLS_DC); -int php_oci_collection_element_set_date(php_oci_collection *, long, char *, int TSRMLS_DC); -int php_oci_collection_element_set_number(php_oci_collection *, long, char *, int TSRMLS_DC); -int php_oci_collection_element_set_string(php_oci_collection *, long, char *, int TSRMLS_DC); -int php_oci_collection_assign(php_oci_collection *, php_oci_collection * TSRMLS_DC); -void php_oci_collection_close(php_oci_collection * TSRMLS_DC); -int php_oci_collection_append_null(php_oci_collection * TSRMLS_DC); -int php_oci_collection_append_date(php_oci_collection *, char *, int TSRMLS_DC); -int php_oci_collection_append_number(php_oci_collection *, char *, int TSRMLS_DC); -int php_oci_collection_append_string(php_oci_collection *, char *, int TSRMLS_DC); +/* {{{ collection related prototypes */ + +php_oci_collection *php_oci_collection_create(php_oci_connection *connection, char *tdo, int tdo_len, char *schema, int schema_len TSRMLS_DC); +int php_oci_collection_size(php_oci_collection *collection, sb4 *size TSRMLS_DC); +int php_oci_collection_max(php_oci_collection *collection, long *max TSRMLS_DC); +int php_oci_collection_trim(php_oci_collection *collection, long trim_size TSRMLS_DC); +int php_oci_collection_append(php_oci_collection *collection, char *element, int element_len TSRMLS_DC); +int php_oci_collection_element_get(php_oci_collection *collection, long index, zval **result_element TSRMLS_DC); +int php_oci_collection_element_set(php_oci_collection *collection, long index, char *value, int value_len TSRMLS_DC); +int php_oci_collection_element_set_null(php_oci_collection *collection, long index TSRMLS_DC); +int php_oci_collection_element_set_date(php_oci_collection *collection, long index, char *date, int date_len TSRMLS_DC); +int php_oci_collection_element_set_number(php_oci_collection *collection, long index, char *number, int number_len TSRMLS_DC); +int php_oci_collection_element_set_string(php_oci_collection *collection, long index, char *element, int element_len TSRMLS_DC); +int php_oci_collection_assign(php_oci_collection *collection_dest, php_oci_collection *collection_from TSRMLS_DC); +void php_oci_collection_close(php_oci_collection *collection TSRMLS_DC); +int php_oci_collection_append_null(php_oci_collection *collection TSRMLS_DC); +int php_oci_collection_append_date(php_oci_collection *collection, char *date, int date_len TSRMLS_DC); +int php_oci_collection_append_number(php_oci_collection *collection, char *number, int number_len TSRMLS_DC); +int php_oci_collection_append_string(php_oci_collection *collection, char *element, int element_len TSRMLS_DC); /* }}} */ -/* statement related prototypes {{{ */ +/* {{{ statement related prototypes */ -php_oci_statement * php_oci_statement_create (php_oci_connection *, char *, int TSRMLS_DC); -int php_oci_statement_set_prefetch (php_oci_statement *, long TSRMLS_DC); -int php_oci_statement_fetch (php_oci_statement *, ub4 TSRMLS_DC); -php_oci_out_column * php_oci_statement_get_column (php_oci_statement *, long, char *, int TSRMLS_DC); -int php_oci_statement_execute (php_oci_statement *, ub4 TSRMLS_DC); -int php_oci_statement_cancel (php_oci_statement * TSRMLS_DC); -void php_oci_statement_free (php_oci_statement * TSRMLS_DC); +php_oci_statement *php_oci_statement_create(php_oci_connection *connection, char *query, int query_len TSRMLS_DC); +php_oci_statement *php_oci_get_implicit_resultset(php_oci_statement *statement TSRMLS_DC); +int php_oci_statement_set_prefetch(php_oci_statement *statement, ub4 prefetch TSRMLS_DC); +int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC); +php_oci_out_column *php_oci_statement_get_column(php_oci_statement *statement, long column_index, char *column_name, int column_name_len TSRMLS_DC); +int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC); +int php_oci_statement_cancel(php_oci_statement *statement TSRMLS_DC); +void php_oci_statement_free(php_oci_statement *statement TSRMLS_DC); int php_oci_bind_pre_exec(void *data, void *result TSRMLS_DC); int php_oci_bind_post_exec(void *data TSRMLS_DC); -int php_oci_bind_by_name(php_oci_statement *, char *, int, zval*, long, ub2 TSRMLS_DC); -sb4 php_oci_bind_in_callback(dvoid *, OCIBind *, ub4, ub4, dvoid **, ub4 *, ub1 *, dvoid **); -sb4 php_oci_bind_out_callback(dvoid *, OCIBind *, ub4, ub4, dvoid **, ub4 **, ub1 *, dvoid **, ub2 **); +int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, zval *var, long maxlength, ub2 type TSRMLS_DC); +sb4 php_oci_bind_in_callback(dvoid *ictxp, OCIBind *bindp, ub4 iter, ub4 index, dvoid **bufpp, ub4 *alenp, ub1 *piecep, dvoid **indpp); +sb4 php_oci_bind_out_callback(dvoid *octxp, OCIBind *bindp, ub4 iter, ub4 index, dvoid **bufpp, ub4 **alenpp, ub1 *piecep, dvoid **indpp, ub2 **rcodepp); php_oci_out_column *php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAMETERS, int need_data); int php_oci_cleanup_pre_fetch(void *data TSRMLS_DC); - -int php_oci_statement_get_type(php_oci_statement *, ub2 * TSRMLS_DC); -int php_oci_statement_get_numrows(php_oci_statement *, ub4 * TSRMLS_DC); -int php_oci_bind_array_by_name(php_oci_statement *statement, char *name, int name_len, zval* var, long max_table_length, long maxlength, long type TSRMLS_DC); -php_oci_bind *php_oci_bind_array_helper_number(zval* var, long max_table_length TSRMLS_DC); -php_oci_bind *php_oci_bind_array_helper_double(zval* var, long max_table_length TSRMLS_DC); -php_oci_bind *php_oci_bind_array_helper_string(zval* var, long max_table_length, long maxlength TSRMLS_DC); -php_oci_bind *php_oci_bind_array_helper_date(zval* var, long max_table_length, php_oci_connection *connection TSRMLS_DC); +int php_oci_statement_get_type(php_oci_statement *statement, ub2 *type TSRMLS_DC); +int php_oci_statement_get_numrows(php_oci_statement *statement, ub4 *numrows TSRMLS_DC); +int php_oci_bind_array_by_name(php_oci_statement *statement, char *name, int name_len, zval *var, long max_table_length, long maxlength, long type TSRMLS_DC); +php_oci_bind *php_oci_bind_array_helper_number(zval *var, long max_table_length TSRMLS_DC); +php_oci_bind *php_oci_bind_array_helper_double(zval *var, long max_table_length TSRMLS_DC); +php_oci_bind *php_oci_bind_array_helper_string(zval *var, long max_table_length, long maxlength TSRMLS_DC); +php_oci_bind *php_oci_bind_array_helper_date(zval *var, long max_table_length, php_oci_connection *connection TSRMLS_DC); /* }}} */ -ZEND_BEGIN_MODULE_GLOBALS(oci) /* {{{ */ - sword errcode; /* global last error code (used when connect fails, for example) */ +ZEND_BEGIN_MODULE_GLOBALS(oci) /* {{{ Module globals */ + sb4 errcode; /* global last ORA- error number. Used when connect fails, for example */ OCIError *err; /* global error handle */ - zend_bool debug_mode; /* debug mode flag */ - long max_persistent; /* maximum number of persistent connections per process */ long num_persistent; /* number of existing persistent connections */ long num_links; /* non-persistent + persistent connections */ diff --git a/ext/oci8/tests/bind_char_1.phpt b/ext/oci8/tests/bind_char_1.phpt index 91fa4b75b7..d68991a7f2 100644 --- a/ext/oci8/tests/bind_char_1.phpt +++ b/ext/oci8/tests/bind_char_1.phpt @@ -5,12 +5,15 @@ SELECT oci_bind_by_name with SQLT_AFC aka CHAR if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. -if (preg_match('/Release 10\.2\./', oci_server_version($c), $matches) !== 1) { - if (preg_match('/Release 11\.2\.0\.2/', oci_server_version($c), $matches) !== 2) { - die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases"); - } +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 10 && $matches[2] >= 2) || + ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2) + ))) { + die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases"); } -if (preg_match('/^11\./', oci_client_version()) != 1) { +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (isset($matches[0]) && $matches[0] < 11) { die("skip test expected to work only with Oracle 11g or greater version of client"); } ?> diff --git a/ext/oci8/tests/bind_char_1_11gR1.phpt b/ext/oci8/tests/bind_char_1_11gR1.phpt index a7feff9f6a..2a7c713aa7 100644 --- a/ext/oci8/tests/bind_char_1_11gR1.phpt +++ b/ext/oci8/tests/bind_char_1_11gR1.phpt @@ -5,10 +5,12 @@ SELECT oci_bind_by_name with SQLT_AFC aka CHAR if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. -if (preg_match('/Release 11\.1\./', oci_server_version($c), $matches) !== 1) { - if (preg_match('/Release 11\.2\.0\.3/', oci_server_version($c), $matches) !== 1) { - die("skip expected output only valid when using Oracle 11gR1 or 11.2.0.3 databases"); - } +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 11 && $matches[2] == 1) || + ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3) + ))) { + die("skip expected output only valid when using Oracle 11gR1 or 11.2.0.3 databases"); } ?> --ENV-- diff --git a/ext/oci8/tests/bind_char_2.phpt b/ext/oci8/tests/bind_char_2.phpt index 43661a065d..3695c85854 100644 --- a/ext/oci8/tests/bind_char_2.phpt +++ b/ext/oci8/tests/bind_char_2.phpt @@ -5,12 +5,15 @@ SELECT oci_bind_by_name with SQLT_AFC aka CHAR and dates if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. -if (preg_match('/Release 10\.2\./', oci_server_version($c), $matches) !== 1) { - if (preg_match('/Release 11\.2\.0\.2/', oci_server_version($c), $matches) !== 2) { - die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases"); - } +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 10 && $matches[2] >= 2) || + ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2) + ))) { + die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases"); } -if (preg_match('/^11\./', oci_client_version()) != 1) { +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (isset($matches[0]) && $matches[0] < 11) { die("skip test expected to work only with Oracle 11g or greater version of client"); } ?> diff --git a/ext/oci8/tests/bind_char_2_11gR1.phpt b/ext/oci8/tests/bind_char_2_11gR1.phpt index edb2a12ff0..b9afd6940b 100644 --- a/ext/oci8/tests/bind_char_2_11gR1.phpt +++ b/ext/oci8/tests/bind_char_2_11gR1.phpt @@ -5,10 +5,12 @@ SELECT oci_bind_by_name with SQLT_AFC aka CHAR and dates if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. -if (preg_match('/Release 11\.1\./', oci_server_version($c), $matches) !== 1) { - if (preg_match('/Release 11\.2\.0\.3/', oci_server_version($c), $matches) !== 1) { - die("skip expected output only valid when using Oracle 11gR1 or 11.2.0.3 databases"); - } +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 11 && $matches[2] == 1) || + ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3) + ))) { + die("skip expected output only valid when using Oracle 11gR1 or 11.2.0.3 databases"); } ?> --ENV-- diff --git a/ext/oci8/tests/bind_char_3.phpt b/ext/oci8/tests/bind_char_3.phpt index 25115836df..009e60a542 100644 --- a/ext/oci8/tests/bind_char_3.phpt +++ b/ext/oci8/tests/bind_char_3.phpt @@ -5,12 +5,15 @@ PL/SQL oci_bind_by_name with SQLT_AFC aka CHAR to CHAR parameter if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. -if (preg_match('/Release 10\.2\./', oci_server_version($c), $matches) !== 1) { - if (preg_match('/Release 11\.2\.0\.2/', oci_server_version($c), $matches) !== 2) { - die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases"); - } +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 10 && $matches[2] >= 2) || + ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2) + ))) { + die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases"); } -if (preg_match('/^11\./', oci_client_version()) != 1) { +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (isset($matches[0]) && $matches[0] < 11) { die("skip test expected to work only with Oracle 11g or greater version of client"); } ?> diff --git a/ext/oci8/tests/bind_char_3_11gR1.phpt b/ext/oci8/tests/bind_char_3_11gR1.phpt index fea77754d1..a894de00c0 100644 --- a/ext/oci8/tests/bind_char_3_11gR1.phpt +++ b/ext/oci8/tests/bind_char_3_11gR1.phpt @@ -5,10 +5,12 @@ PL/SQL oci_bind_by_name with SQLT_AFC aka CHAR to CHAR parameter if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. -if (preg_match('/Release 11\.1\./', oci_server_version($c), $matches) !== 1) { - if (preg_match('/Release 11\.2\.0\.3/', oci_server_version($c), $matches) !== 1) { - die("skip expected output only valid when using Oracle 11gR1 or 11.2.0.3 databases"); - } +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 11 && $matches[2] == 1) || + ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3) + ))) { + die("skip expected output only valid when using Oracle 11gR1 or 11.2.0.3 databases"); } ?> --ENV-- diff --git a/ext/oci8/tests/bind_char_4.phpt b/ext/oci8/tests/bind_char_4.phpt index 36765f8137..0ac60e503d 100644 --- a/ext/oci8/tests/bind_char_4.phpt +++ b/ext/oci8/tests/bind_char_4.phpt @@ -5,12 +5,15 @@ PL/SQL oci_bind_by_name with SQLT_AFC aka CHAR to VARCHAR2 parameter if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. -if (preg_match('/Release 10\.2\./', oci_server_version($c), $matches) !== 1) { - if (preg_match('/Release 11\.2\.0\.2/', oci_server_version($c), $matches) !== 2) { - die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases"); - } +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 10 && $matches[2] >= 2) || + ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2) + ))) { + die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases"); } -if (preg_match('/^11\./', oci_client_version()) != 1) { +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (isset($matches[0]) && $matches[0] < 11) { die("skip test expected to work only with Oracle 11g or greater version of client"); } ?> diff --git a/ext/oci8/tests/bind_char_4_11gR1.phpt b/ext/oci8/tests/bind_char_4_11gR1.phpt index 2bc2f14246..d5ce116afb 100644 --- a/ext/oci8/tests/bind_char_4_11gR1.phpt +++ b/ext/oci8/tests/bind_char_4_11gR1.phpt @@ -5,10 +5,12 @@ PL/SQL oci_bind_by_name with SQLT_AFC aka CHAR to VARCHAR2 parameter if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. -if (preg_match('/Release 11\.1\./', oci_server_version($c), $matches) !== 1) { - if (preg_match('/Release 11\.2\.0\.3/', oci_server_version($c), $matches) !== 1) { - die("skip expected output only valid when using Oracle 11gR1 or 11.2.0.3 databases"); - } +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 11 && $matches[2] == 1) || + ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3) + ))) { + die("skip expected output only valid when using Oracle 11gR1 or 11.2.0.3 databases"); } ?> --ENV-- diff --git a/ext/oci8/tests/bind_unsupported_2.phpt b/ext/oci8/tests/bind_unsupported_2.phpt index d3e5375df6..a2bf9de5a6 100644 --- a/ext/oci8/tests/bind_unsupported_2.phpt +++ b/ext/oci8/tests/bind_unsupported_2.phpt @@ -3,7 +3,8 @@ Bind with various unsupported 10g+ bind types --SKIPIF-- <?php if (!extension_loaded('oci8')) die("skip no oci8 extension"); -if (preg_match('/^1[01]\./', oci_client_version()) !== 1) { +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (isset($matches[0]) && $matches[0] < 10) { die ("skip expected output only valid for Oracle 10g+ clients"); } ?> diff --git a/ext/oci8/tests/bug27303_1.phpt b/ext/oci8/tests/bug27303_1.phpt index 40ab4ebed2..0ef47f13dd 100644 --- a/ext/oci8/tests/bug27303_1.phpt +++ b/ext/oci8/tests/bug27303_1.phpt @@ -5,12 +5,15 @@ Bug #27303 (OCIBindByName binds numeric PHP values as characters) if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. -if (preg_match('/Release 10\.2\.0\.2/', oci_server_version($c), $matches) !== 1 && - preg_match('/Release 11\.2\.0\.2/', oci_server_version($c), $matches) !== 1) { - die("skip expected output only valid when using Oracle 10.2.0.2 or 11.2.0.2 databases"); - // Other point releases may also work +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 10 && $matches[2] >= 2) || + ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2) + ))) { + die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases"); } -if (preg_match('/^11\./', oci_client_version()) != 1) { +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (isset($matches[0]) && $matches[0] < 11) { die("skip test expected to work only with Oracle 11g or greater version of client"); } ?> diff --git a/ext/oci8/tests/bug27303_1_11gR1.phpt b/ext/oci8/tests/bug27303_1_11gR1.phpt index 6de9b99378..7b4c158561 100644 --- a/ext/oci8/tests/bug27303_1_11gR1.phpt +++ b/ext/oci8/tests/bug27303_1_11gR1.phpt @@ -5,12 +5,13 @@ Bug #27303 (OCIBindByName binds numeric PHP values as characters) if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. -if (preg_match('/Release 10\.2\.0\.3/', oci_server_version($c), $matches) !== 1) { - if (preg_match('/Release 11\.1\.0\.6/', oci_server_version($c), $matches) !== 1) { - if (preg_match('/Release 11\.2\.0\.3/', oci_server_version($c), $matches) !== 1) { - die("skip expected output only valid when using specific Oracle database versions"); - } - } +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 10 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3) || + ($matches[1] == 11 && $matches[2] == 1 && $matches[3] == 0 && $matches[4] == 6) || + ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3) + ))) { + die("skip expected output only valid when using Oracle 10gR2 or 11.2.0.2 databases"); } ?> --FILE-- diff --git a/ext/oci8/tests/bug27303_2.phpt b/ext/oci8/tests/bug27303_2.phpt index 1fb2b31682..72d4e5a7dd 100644 --- a/ext/oci8/tests/bug27303_2.phpt +++ b/ext/oci8/tests/bug27303_2.phpt @@ -5,12 +5,15 @@ Bug #27303 (OCIBindByName binds numeric PHP values as characters) if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. -if (preg_match('/Release 10\.2\.0\.2/', oci_server_version($c), $matches) !== 1 && - preg_match('/Release 11\.2\.0\.2/', oci_server_version($c), $matches) !== 1) { - die("skip expected output only valid when using Oracle 10.2.0.2 or 11.2.0.2 databases"); - // Other point releases may also work +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 10 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2) || + ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2) + ))) { + die("skip expected output only valid when using Oracle 10.2.0.2 or 11.2.0.2 databases"); } -if (preg_match('/^11\./', oci_client_version()) != 1) { +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (isset($matches[0]) && $matches[0] < 11) { die("skip test expected to work only with Oracle 11g or greater version of client"); } ?> diff --git a/ext/oci8/tests/bug27303_2_11gR1.phpt b/ext/oci8/tests/bug27303_2_11gR1.phpt index 1e3e3105ad..27d8a585bd 100644 --- a/ext/oci8/tests/bug27303_2_11gR1.phpt +++ b/ext/oci8/tests/bug27303_2_11gR1.phpt @@ -5,12 +5,13 @@ Bug #27303 (OCIBindByName binds numeric PHP values as characters) if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. -if (preg_match('/Release 10\.2\.0\.3/', oci_server_version($c), $matches) !== 1) { - if (preg_match('/Release 11\.1\.0\.6/', oci_server_version($c), $matches) !== 1) { - if (preg_match('/Release 11\.2\.0\.3/', oci_server_version($c), $matches) !== 1) { - die("skip expected output only valid when using specific Oracle database versions"); - } - } +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 10 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3) || + ($matches[1] == 11 && $matches[2] == 1 && $matches[3] == 0 && $matches[4] == 6) || + ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3) + ))) { + die("skip expected output only valid when using specific Oracle database versions"); } ?> --FILE-- diff --git a/ext/oci8/tests/bug27303_4.phpt b/ext/oci8/tests/bug27303_4.phpt index 3137db8659..a24ae705ab 100644 --- a/ext/oci8/tests/bug27303_4.phpt +++ b/ext/oci8/tests/bug27303_4.phpt @@ -5,12 +5,16 @@ Bug #27303 (OCIBindByName binds numeric PHP values as characters) if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. -if (preg_match('/Release 10\.2\.0\.2/', oci_server_version($c), $matches) !== 1 && - preg_match('/Release 11\.2\.0\.2/', oci_server_version($c), $matches) !== 1) { - die("skip expected output only valid when using Oracle 10.2.0.2 or 11.2.0.2 databases"); - // Other point releases may also work +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 10 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2) || + ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 2) + ))) { + die("skip expected output only valid when using Oracle 10.2.0.2 or 11.2.0.2 databases"); + // Other point releases may also work } -if (preg_match('/^11\./', oci_client_version()) != 1) { +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (isset($matches[0]) && $matches[0] < 11) { die("skip test expected to work only with Oracle 11g or greater version of client"); } ?> diff --git a/ext/oci8/tests/bug27303_4_11gR1.phpt b/ext/oci8/tests/bug27303_4_11gR1.phpt index f9bc2da8a2..01db1dc5a0 100644 --- a/ext/oci8/tests/bug27303_4_11gR1.phpt +++ b/ext/oci8/tests/bug27303_4_11gR1.phpt @@ -5,12 +5,13 @@ Bug #27303 (OCIBindByName binds numeric PHP values as characters) if (!extension_loaded('oci8')) die ("skip no oci8 extension"); require(dirname(__FILE__)."/connect.inc"); // The bind buffer size edge cases seem to change each DB version. -if (preg_match('/Release 10\.2\.0\.3/', oci_server_version($c), $matches) !== 1) { - if (preg_match('/Release 11\.1\.0\.6/', oci_server_version($c), $matches) !== 1) { - if (preg_match('/Release 11\.2\.0\.3/', oci_server_version($c), $matches) !== 1) { - die("skip expected output only valid when using specific Oracle database versions"); - } - } +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 10 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3) || + ($matches[1] == 11 && $matches[2] == 1 && $matches[3] == 0 && $matches[4] == 6) || + ($matches[1] == 11 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] == 3) + ))) { + die("skip expected output only valid when using specific Oracle database versions"); } ?> --FILE-- diff --git a/ext/oci8/tests/bug36403.phpt b/ext/oci8/tests/bug36403.phpt index 53dae694ec..4ac32c4b06 100644 --- a/ext/oci8/tests/bug36403.phpt +++ b/ext/oci8/tests/bug36403.phpt @@ -3,8 +3,9 @@ Bug #36403 (oci_execute no longer supports OCI_DESCRIBE_ONLY) --SKIPIF-- <?php if (!extension_loaded('oci8')) die ("skip no oci8 extension"); -if (preg_match('/^1[01]\./', oci_client_version()) != 1) { - die("skip expected output only valid with Oracle 10g or greater version of client"); +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (isset($matches[0]) && $matches[0] < 10) { + die("skip test expected to work only with Oracle 10g or greater version of client"); } ?> --FILE-- diff --git a/ext/oci8/tests/bug43497.phpt b/ext/oci8/tests/bug43497.phpt index 8c57fabeef..05798889c4 100644 --- a/ext/oci8/tests/bug43497.phpt +++ b/ext/oci8/tests/bug43497.phpt @@ -5,8 +5,9 @@ Bug #43497 (OCI8 XML/getClobVal aka temporary LOBs leak UGA memory) $target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs require(dirname(__FILE__).'/skipif.inc'); if (getenv('SKIP_SLOW_TESTS')) die('skip slow tests excluded by request'); -if (preg_match('/^1[01]\./', oci_client_version()) != 1) { - die("skip expected output only valid with Oracle 10g or greater version of client"); +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (isset($matches[0]) && $matches[0] < 10) { + die("skip test expected to work only with Oracle 10g or greater version of client"); } ?> --FILE-- diff --git a/ext/oci8/tests/bug47281.phpt b/ext/oci8/tests/bug47281.phpt index d0e0023537..0098ec5ebb 100644 --- a/ext/oci8/tests/bug47281.phpt +++ b/ext/oci8/tests/bug47281.phpt @@ -6,11 +6,12 @@ $target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on t require(dirname(__FILE__).'/skipif.inc'); // error3.phpt obsoletes this test for newer Oracle client versions // Assume runtime client version is >= compile time client version -$cv = explode('.', oci_client_version()); -if ($cv[0] > 11 || ($cv[0] == 11 && $cv[1] > 2) || ($cv[0] == 11 && $cv[1] == 2 && $cv[3] >= 3)) { +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!isset($matches[0]) || + ($matches[0] > 11 || ($matches[0] == 11 && $matches[1] > 2) || ($matches[0] == 11 && $matches[1] == 2 && $matches[3] >= 3) + )) { die("skip test works only with Oracle 11.2.0.2 or earlier Oracle client libraries"); } - ?> --ENV-- NLS_LANG=.AL32UTF8 diff --git a/ext/oci8/tests/commit_001.phpt b/ext/oci8/tests/commit_001.phpt index 806fb193a0..ef4018118e 100644 --- a/ext/oci8/tests/commit_001.phpt +++ b/ext/oci8/tests/commit_001.phpt @@ -81,48 +81,48 @@ echo "Done\n"; bool(true) int(0) array(5) { - [%u|b%"ID"]=> + ["ID"]=> array(0) { } - [%u|b%"VALUE"]=> + ["VALUE"]=> array(0) { } - [%u|b%"BLOB"]=> + ["BLOB"]=> array(0) { } - [%u|b%"CLOB"]=> + ["CLOB"]=> array(0) { } - [%u|b%"STRING"]=> + ["STRING"]=> array(0) { } } bool(true) int(4) array(5) { - [%u|b%"ID"]=> + ["ID"]=> array(4) { [0]=> - %string|unicode%(1) "1" + string(1) "1" [1]=> - %string|unicode%(1) "1" + string(1) "1" [2]=> - %string|unicode%(1) "1" + string(1) "1" [3]=> - %string|unicode%(1) "1" + string(1) "1" } - [%u|b%"VALUE"]=> + ["VALUE"]=> array(4) { [0]=> - %string|unicode%(1) "1" + string(1) "1" [1]=> - %string|unicode%(1) "1" + string(1) "1" [2]=> - %string|unicode%(1) "1" + string(1) "1" [3]=> - %string|unicode%(1) "1" + string(1) "1" } - [%u|b%"BLOB"]=> + ["BLOB"]=> array(4) { [0]=> NULL @@ -133,7 +133,7 @@ array(5) { [3]=> NULL } - [%u|b%"CLOB"]=> + ["CLOB"]=> array(4) { [0]=> NULL @@ -144,7 +144,7 @@ array(5) { [3]=> NULL } - [%u|b%"STRING"]=> + ["STRING"]=> array(4) { [0]=> NULL diff --git a/ext/oci8/tests/conn_attr.inc b/ext/oci8/tests/conn_attr.inc index 220e688210..2edc1c9552 100644 --- a/ext/oci8/tests/conn_attr.inc +++ b/ext/oci8/tests/conn_attr.inc @@ -2,30 +2,28 @@ require(dirname(__FILE__)."/connect.inc"); -$sv = oci_server_version($c); -$sv = preg_match('/Release (11\.2|12)\./', $sv, $matches); -if ($sv == 1) { +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if ((isset($matches[1]) && $matches[1] >= 11)) { // Server is Oracle 11.2+ $stmtarray = array( - "drop user testuser cascade", - "create user testuser identified by testuser", - "grant connect,resource,dba to testuser", - "alter user testuser enable editions", - "drop edition myedition1", - "drop edition myedition", - "grant create any edition to testuser", + "drop user $testuser cascade", + "create user $testuser identified by $testpassword", // $testuser should be set by the file that includes conn_attr.inc + "grant connect,resource,dba to $testuser", + "alter user $testuser enable editions", + "drop edition myedition1 cascade", + "drop edition myedition cascade", + "grant create any edition to $testuser", "create edition myedition", "create edition myedition1 as child of myedition", - "grant use on edition myedition to testuser", - "grant use on edition myedition1 to testuser", + "grant use on edition myedition to $testuser", + "grant use on edition myedition1 to $testuser", ); -} -else { +} else { // Server is Pre 11.2 $stmtarray = array( - "drop user testuser cascade", - "create user testuser identified by testuser", - "grant connect,resource,dba to testuser", + "drop user $testuser cascade", + "create user $testuser identified by $testpassword", + "grant connect,resource,dba to $testuser", ); } @@ -68,8 +66,8 @@ function get_attr($conn,$attr) function get_conn($conn_type) { - $user = 'testuser'; - $password = 'testuser'; + $user = $GLOBALS['testuser']; + $password = $GLOBALS['testpassword']; $dbase = $GLOBALS['dbase']; switch($conn_type) { case 1: @@ -139,9 +137,9 @@ function get_sys_attr($conn,$attr) function clean_up($c) { $stmtarray = array( - "drop user testuser cascade", - "drop edition myedition1", - "drop edition myedition", + "drop edition myedition1 cascade", + "drop edition myedition cascade", + "drop user " . $GLOBALS['testuser'] . " cascade", ); foreach ($stmtarray as $stmt) { diff --git a/ext/oci8/tests/conn_attr_1.phpt b/ext/oci8/tests/conn_attr_1.phpt index ad508a2ed2..631bc19c1d 100644 --- a/ext/oci8/tests/conn_attr_1.phpt +++ b/ext/oci8/tests/conn_attr_1.phpt @@ -9,15 +9,21 @@ if (strcasecmp($user, "system") && strcasecmp($user, "sys")) die("skip needs to be run as a DBA user"); if ($test_drcp) die("skip output might vary with DRCP"); -if (preg_match('/Release 1[01]\./', oci_server_version($c), $matches) !== 1) { +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 10)) { die("skip expected output only valid when using Oracle 10g or greater database server"); -} else if (preg_match('/^1[01]\./', oci_client_version()) != 1) { +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (isset($matches[0]) && $matches[0] < 10) { die("skip test expected to work only with Oracle 10g or greater version of client"); } - ?> --FILE-- <?php + +$testuser = 'testuser_attr_1'; // Used in conn_attr.inc +$testpassword = 'testuser'; + require(dirname(__FILE__)."/conn_attr.inc"); $attr_array = array('MODULE','ACTION','CLIENT_INFO','CLIENT_IDENTIFIER'); diff --git a/ext/oci8/tests/conn_attr_2.phpt b/ext/oci8/tests/conn_attr_2.phpt index 1072503529..432a3cff04 100644 --- a/ext/oci8/tests/conn_attr_2.phpt +++ b/ext/oci8/tests/conn_attr_2.phpt @@ -8,40 +8,45 @@ require(dirname(__FILE__).'/skipif.inc'); if (strcasecmp($user, "system") && strcasecmp($user, "sys")) die("skip needs to be run as a DBA user"); if ($test_drcp) die("skip output might vary with DRCP"); -if (preg_match('/Release 1[01]\./', oci_server_version($c), $matches) !== 1) { +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 10)) { die("skip expected output only valid when using Oracle 10g or greater database server"); -} else if (preg_match('/^1[01]\./', oci_client_version()) != 1) { +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (isset($matches[0]) && $matches[0] < 10) { die("skip test expected to work only with Oracle 10g or greater version of client"); } - ?> --INI-- oci8.privileged_connect = On --FILE-- <?php + +$testuser = 'testuser_attr_2'; // Used in conn_attr.inc +$testpassword = 'testuser'; + require(dirname(__FILE__)."/conn_attr.inc"); -$user='testuser'; -$password='testuser'; + $attr_array = array('MODULE','ACTION','CLIENT_INFO','CLIENT_IDENTIFIER'); echo"**Set values using pconnect-1**\n"; -var_dump($pc1 = oci_pconnect($user,$password,$dbase)); +var_dump($pc1 = oci_pconnect($testuser,$testpassword,$dbase)); foreach($attr_array as $attr) { set_attr($pc1,$attr,100); } // using pc1 again echo"\n**Get values using pconnect-2**\n"; -var_dump($pc3 = oci_pconnect($user,$password,$dbase)); +var_dump($pc3 = oci_pconnect($testuser,$testpassword,$dbase)); foreach($attr_array as $attr) { get_attr($pc3,$attr); } // Get with different pconnect echo"\n**Get values using pconnect-3**\n"; -var_dump($pc2 = oci_pconnect($user,$password,$dbase,'UTF8')); +var_dump($pc2 = oci_pconnect($testuser,$testpassword,$dbase,'UTF8')); foreach($attr_array as $attr) { get_attr($pc2,$attr); } @@ -52,15 +57,22 @@ oci_close($pc3); // Re-open a persistent connection and check for the attr values. echo "\n**Re-open a pconnect()**\n"; -var_dump($pc4 = oci_pconnect($user,$password,$dbase)); +var_dump($pc4 = oci_pconnect($testuser,$testpassword,$dbase)); foreach($attr_array as $attr) { get_attr($pc4,$attr); } oci_close($pc4); // Test with SYSDBA connection. -var_dump($sys_c1 = oci_pconnect($user,$password,$dbase,false,OCI_SYSDBA)); -if ($sys_c1) { +echo "\n**Test with SYSDBA connection**\n"; +$sys_c1 = @oci_pconnect($testuser,$testpassword,$dbase,false,OCI_SYSDBA); +var_dump($sys_c1); +if (!$sys_c1) { + $e = oci_error(); + if ($e['code'] != 1031 && $e['code'] != 1017) { + var_dump($e); + } +} else { set_attr($sys_c1,'ACTION',10); get_sys_attr($sys_c1,'ACTION'); get_attr($pc2,'ACTION'); @@ -100,6 +112,6 @@ The value of ACTION is TASK100 The value of CLIENT_INFO is INFO1100 The value of CLIENT_IDENTIFIER is ID00100 -Warning: oci_pconnect(): ORA-01031: %s on line %d +**Test with SYSDBA connection** bool(false) Done diff --git a/ext/oci8/tests/conn_attr_3.phpt b/ext/oci8/tests/conn_attr_3.phpt index be8d3306de..921487c9a0 100644 --- a/ext/oci8/tests/conn_attr_3.phpt +++ b/ext/oci8/tests/conn_attr_3.phpt @@ -8,14 +8,21 @@ require(dirname(__FILE__).'/skipif.inc'); if (strcasecmp($user, "system") && strcasecmp($user, "sys")) die("skip needs to be run as a DBA user"); if ($test_drcp) die("skip output might vary with DRCP"); -if (preg_match('/Release 1[01]\./', oci_server_version($c), $matches) !== 1) { +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 10)) { die("skip expected output only valid when using Oracle 10g or greater database server"); -} else if (preg_match('/^1[01]\./', oci_client_version()) != 1) { +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (isset($matches[0]) && $matches[0] < 10) { die("skip test expected to work only with Oracle 10g or greater version of client"); } ?> --FILE-- <?php + +$testuser = 'testuser_attr_3'; // Used in conn_attr.inc +$testpassword = 'testuser'; + require(dirname(__FILE__)."/conn_attr.inc"); echo"**Test Set and get values for the attributes with oci_close() ************\n"; diff --git a/ext/oci8/tests/conn_attr_4.phpt b/ext/oci8/tests/conn_attr_4.phpt index 4885f80b71..f32f9876d5 100644 --- a/ext/oci8/tests/conn_attr_4.phpt +++ b/ext/oci8/tests/conn_attr_4.phpt @@ -9,21 +9,27 @@ if (getenv('SKIP_SLOW_TESTS')) die('skip slow tests excluded by request'); if (strcasecmp($user, "system") && strcasecmp($user, "sys")) die("skip needs to be run as a DBA user"); if ($test_drcp) die("skip output might vary with DRCP"); -if (preg_match('/Release (11\.2|12)\./', oci_server_version($c), $matches) !== 1) { - // Bug fixed in 11.2 prevents client_info being rest +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 11 && $matches[2] >= 2) || + ($matches[1] >= 12) + ))) { + // Bug fixed in 11.2 prevents client_info being reset die("skip expected output only valid when using Oracle 11gR2 or greater database server"); -} else if (preg_match('/^1[01]\./', oci_client_version()) != 1) { +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (isset($matches[0]) && $matches[0] < 10) { die("skip test expected to work only with Oracle 10g or greater version of client"); } ?> --FILE-- <?php +$testuser = 'testuser_attr_4'; // Used in conn_attr.inc +$testpassword = 'testuser'; require(dirname(__FILE__)."/conn_attr.inc"); -$user='testuser'; -$password='testuser'; $attr_array = array('MODULE','ACTION','CLIENT_INFO','CLIENT_IDENTIFIER'); echo"**Test Negative cases************\n"; @@ -40,7 +46,7 @@ var_dump(oci_set_client_info($str1,$str1)); // Setting an Invalid value. echo "\nInvalid Value \n"; -$c1=oci_connect($user,$password,$dbase); +$c1=oci_connect($testuser,$testpassword,$dbase); var_dump(oci_set_action($c1,$c1)); // Setting values multiple times. diff --git a/ext/oci8/tests/conn_attr_5.phpt b/ext/oci8/tests/conn_attr_5.phpt index d694ec06a5..77f233b4e2 100644 --- a/ext/oci8/tests/conn_attr_5.phpt +++ b/ext/oci8/tests/conn_attr_5.phpt @@ -8,14 +8,21 @@ require(dirname(__FILE__).'/skipif.inc'); if (strcasecmp($user, "system") && strcasecmp($user, "sys")) die("skip needs to be run as a DBA user"); if ($test_drcp) die("skip output might vary with DRCP"); -if (preg_match('/Release 1[01]\./', oci_server_version($c), $matches) !== 1) { +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 10)) { die("skip expected output only valid when using Oracle 10g or greater database server"); -} else if (preg_match('/^1[01]\./', oci_client_version()) != 1) { +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (isset($matches[0]) && $matches[0] < 10) { die("skip test expected to work only with Oracle 10g or greater version of client"); } ?> --FILE-- <?php + +$testuser = 'testuser_attr_5'; // Used in conn_attr.inc +$testpassword = 'testuser'; + require(dirname(__FILE__)."/conn_attr.inc"); echo"**Test - Set and get values for the attributes with scope end ************\n"; diff --git a/ext/oci8/tests/connect_without_oracle_home.phpt b/ext/oci8/tests/connect_without_oracle_home.phpt index e14fb93695..0acd2bc33a 100644 --- a/ext/oci8/tests/connect_without_oracle_home.phpt +++ b/ext/oci8/tests/connect_without_oracle_home.phpt @@ -10,8 +10,8 @@ $ov = preg_match('/Compile-time ORACLE_HOME/', $phpinfo); if ($ov !== 1) { die ("skip Test only valid when OCI8 is built with an ORACLE_HOME"); } -$iv = preg_match('/Oracle .*Version => (10\.2)/', $phpinfo); -if ($iv != 1) { +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!isset($matches[0]) || !($matches[0] == 10 && $matches[0] == 2)) { die ("skip tests a feature that works only with Oracle 10gR2"); } ?> diff --git a/ext/oci8/tests/connect_without_oracle_home_11.phpt b/ext/oci8/tests/connect_without_oracle_home_11.phpt index 1620803dbb..40dc5a98fc 100644 --- a/ext/oci8/tests/connect_without_oracle_home_11.phpt +++ b/ext/oci8/tests/connect_without_oracle_home_11.phpt @@ -10,7 +10,11 @@ $ov = preg_match('/Compile-time ORACLE_HOME/', $phpinfo); if ($ov != 1) { die ("skip Test only valid when OCI8 is built with an ORACLE_HOME"); } -if (preg_match('/^11\.2|12\./', oci_client_version()) != 1) { +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && + (($matches[0] == 11 && $matches[1] >= 2) || + ($matches[0] >= 12) + ))) { die("skip test expected to work only with Oracle 11gR2 or greater version of client"); } ?> diff --git a/ext/oci8/tests/connect_without_oracle_home_old_11.phpt b/ext/oci8/tests/connect_without_oracle_home_old_11.phpt index c7cfecf396..e04016f41a 100644 --- a/ext/oci8/tests/connect_without_oracle_home_old_11.phpt +++ b/ext/oci8/tests/connect_without_oracle_home_old_11.phpt @@ -10,7 +10,11 @@ $ov = preg_match('/Compile-time ORACLE_HOME/', $phpinfo); if ($ov !== 1) { die ("skip Test only valid when OCI8 is built with an ORACLE_HOME"); } -if (preg_match('/^11\.2|12\./', oci_client_version()) != 1) { +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && + (($matches[0] == 11 && $matches[1] >= 2) || + ($matches[0] >= 12) + ))) { die("skip test expected to work only with Oracle 11gR2 or greater version of client"); } ?> diff --git a/ext/oci8/tests/cursors_old.phpt b/ext/oci8/tests/cursors_old.phpt index d60e2ff1ea..aa25937570 100644 --- a/ext/oci8/tests/cursors_old.phpt +++ b/ext/oci8/tests/cursors_old.phpt @@ -52,19 +52,19 @@ echo "Done\n"; ?> --EXPECTF-- array(2) { - [%u|b%"ID"]=> - %unicode|string%(1) "1" - [%u|b%"VALUE"]=> - %unicode|string%(1) "1" + ["ID"]=> + string(1) "1" + ["VALUE"]=> + string(1) "1" } bool(true) Warning: ocifetchinto():%sORA-01002: %s in %scursors_old.php on line %d array(2) { - [%u|b%"ID"]=> - %unicode|string%(1) "1" - [%u|b%"VALUE"]=> - %unicode|string%(1) "1" + ["ID"]=> + string(1) "1" + ["VALUE"]=> + string(1) "1" } bool(true) Done diff --git a/ext/oci8/tests/debug.phpt b/ext/oci8/tests/debug.phpt index fe96e6e87e..66ab0f0d00 100644 --- a/ext/oci8/tests/debug.phpt +++ b/ext/oci8/tests/debug.phpt @@ -16,10 +16,9 @@ else { oci_connect($user, $password); } -echo "Done\n"; - oci_internal_debug(false); ?> ---EXPECTREGEX-- -^OCI8 DEBUG: .*Done$ +===DONE=== +--EXPECT-- +===DONE=== diff --git a/ext/oci8/tests/define.phpt b/ext/oci8/tests/define.phpt index c6ce7bd9b3..b78f698e7c 100644 --- a/ext/oci8/tests/define.phpt +++ b/ext/oci8/tests/define.phpt @@ -44,5 +44,5 @@ echo "Done\n"; ?> --EXPECTF-- -%unicode|string%(%d) "some" +string(%d) "some" Done diff --git a/ext/oci8/tests/define1.phpt b/ext/oci8/tests/define1.phpt index 6e4b74e3ba..be16271d5b 100644 --- a/ext/oci8/tests/define1.phpt +++ b/ext/oci8/tests/define1.phpt @@ -55,5 +55,5 @@ bool(false) Warning: oci_define_by_name() expects at least 3 parameters, 2 given in %s on line %d NULL -%unicode|string%(4) "some" +string(4) "some" Done diff --git a/ext/oci8/tests/define4.phpt b/ext/oci8/tests/define4.phpt index 266fd7edd7..3114a73937 100644 --- a/ext/oci8/tests/define4.phpt +++ b/ext/oci8/tests/define4.phpt @@ -58,15 +58,15 @@ echo "Done\n"; Test 1 bool(true) Test 2 -%unicode|string%(4) "1234" -%unicode|string%(4) "some" -%unicode|string%(4) "some" -%unicode|string%(4) "some" -%unicode|string%(4) "1234" -%unicode|string%(4) "some" +string(4) "1234" +string(4) "some" +string(4) "some" +string(4) "some" +string(4) "1234" +string(4) "some" Test 3 bool(true) -%unicode|string%(4) "some" +string(4) "some" Warning: oci_result(): %d is not a valid oci8 statement resource in %s on line %d bool(false) diff --git a/ext/oci8/tests/define5.phpt b/ext/oci8/tests/define5.phpt index 68fa01d09a..978d66b260 100644 --- a/ext/oci8/tests/define5.phpt +++ b/ext/oci8/tests/define5.phpt @@ -61,12 +61,12 @@ echo "Done\n"; Test 1 - must do define before execute bool(true) NULL -%unicode|string%(4) "some" +string(4) "some" Test 2 - normal define order bool(true) -%unicode|string%(4) "some" +string(4) "some" Test 3 - no new define done -%unicode|string%(4) "some" -%unicode|string%(5) "thing" +string(4) "some" +string(5) "thing" Done diff --git a/ext/oci8/tests/define_old.phpt b/ext/oci8/tests/define_old.phpt index f65e6b8080..cc07e2ea94 100644 --- a/ext/oci8/tests/define_old.phpt +++ b/ext/oci8/tests/define_old.phpt @@ -44,5 +44,5 @@ echo "Done\n"; ?> --EXPECTF-- -%unicode|string%(4) "some" +string(4) "some" Done diff --git a/ext/oci8/tests/details.inc b/ext/oci8/tests/details.inc index 9a86c46868..e54ea84abd 100644 --- a/ext/oci8/tests/details.inc +++ b/ext/oci8/tests/details.inc @@ -52,7 +52,7 @@ if (!function_exists('oci8_test_sql_execute')) { $s = oci_parse($c, $stmt); if (!$s) { $m = oci_error($c); - echo $stmt . PHP_EOL . $m['message'] . PHP_EOL; + echo "oci8_test_sql_execute() error:". PHP_EOL . $stmt . PHP_EOL . $m['message'] . PHP_EOL; } else { $r = @oci_execute($s); @@ -66,7 +66,7 @@ if (!function_exists('oci8_test_sql_execute')) { , 4080 // trigger does not exist , 38802 // edition does not exist ))) { - echo $stmt . PHP_EOL . $m['message'] . PHP_EOL; + echo "oci8_test_sql_execute() error:". PHP_EOL . $stmt . PHP_EOL . $m['message'] . PHP_EOL; } } } diff --git a/ext/oci8/tests/edition_1.phpt b/ext/oci8/tests/edition_1.phpt index b9c8fd817e..d8ca53cddf 100644 --- a/ext/oci8/tests/edition_1.phpt +++ b/ext/oci8/tests/edition_1.phpt @@ -24,6 +24,9 @@ if (preg_match('/Release (1[1]\.2|12)\./', oci_server_version($c), $matches) !== * already */ +$testuser = 'testuser_attr_1'; // Used in conn_attr.inc +$testpassword = 'testuser'; + require(dirname(__FILE__)."/conn_attr.inc"); function select_fn($conn) { @@ -39,7 +42,7 @@ function select_fn($conn) { select from both the editions and verify the contents. */ set_edit_attr('MYEDITION'); -$conn = oci_connect('testuser','testuser',$dbase); +$conn = oci_connect($testuser,$testpassword,$dbase); if ($conn === false) { $m = oci_error(); die("Error:" . $m['message']); @@ -61,7 +64,7 @@ select_fn($conn); // Create a different version of view_ed in MYEDITION1. set_edit_attr('MYEDITION1'); -$conn2 = oci_new_connect('testuser','testuser',$dbase); +$conn2 = oci_new_connect($testuser,$testpassword,$dbase); $stmt = "create or replace editioning view view_ed as select name,age,job,salary from edit_tab"; $s = oci_parse($conn2, $stmt); oci_execute($s); @@ -87,58 +90,58 @@ The value of edition has been successfully set The value of current EDITION is MYEDITION array(3) { [0]=> - %unicode|string%(%d) "mike" + string(%d) "mike" [1]=> - %unicode|string%(%d) "30" + string(%d) "30" [2]=> - %unicode|string%(%d) "Senior engineer" + string(%d) "Senior engineer" } array(3) { [0]=> - %unicode|string%(%d) "juan" + string(%d) "juan" [1]=> - %unicode|string%(%d) "25" + string(%d) "25" [2]=> - %unicode|string%(%d) "engineer" + string(%d) "engineer" } The value of edition has been successfully set The value of current EDITION is MYEDITION1 array(4) { [0]=> - %unicode|string%(%d) "mike" + string(%d) "mike" [1]=> - %unicode|string%(%d) "30" + string(%d) "30" [2]=> - %unicode|string%(%d) "Senior engineer" + string(%d) "Senior engineer" [3]=> - %unicode|string%(%d) "200" + string(%d) "200" } array(4) { [0]=> - %unicode|string%(%d) "juan" + string(%d) "juan" [1]=> - %unicode|string%(%d) "25" + string(%d) "25" [2]=> - %unicode|string%(%d) "engineer" + string(%d) "engineer" [3]=> - %unicode|string%(%d) "100" + string(%d) "100" } version of view_ed in MYEDITION The value of current EDITION is MYEDITION array(3) { [0]=> - %unicode|string%(%d) "mike" + string(%d) "mike" [1]=> - %unicode|string%(%d) "30" + string(%d) "30" [2]=> - %unicode|string%(%d) "Senior engineer" + string(%d) "Senior engineer" } array(3) { [0]=> - %unicode|string%(%d) "juan" + string(%d) "juan" [1]=> - %unicode|string%(%d) "25" + string(%d) "25" [2]=> - %unicode|string%(%d) "engineer" + string(%d) "engineer" } Done diff --git a/ext/oci8/tests/edition_2.phpt b/ext/oci8/tests/edition_2.phpt index 030e6a673c..0ffb62dc32 100644 --- a/ext/oci8/tests/edition_2.phpt +++ b/ext/oci8/tests/edition_2.phpt @@ -24,10 +24,10 @@ if (preg_match('/Release (1[1]\.2|12)\./', oci_server_version($c), $matches) !== * already */ -require(dirname(__FILE__)."/conn_attr.inc"); +$testuser = 'testuser_ed_2'; // Used in conn_attr.inc +$testpassword = 'testuser'; -$user = 'testuser'; -$password = 'testuser'; +require(dirname(__FILE__)."/conn_attr.inc"); echo"**Test 1.1 - Default value for the attribute **************\n"; get_edit_attr($c); @@ -50,7 +50,7 @@ get_edit_attr($conn3); oci_close($conn1); // With a oci_pconnect with a different charset. -$pc1 = oci_pconnect($user,$password,$dbase,"utf8"); +$pc1 = oci_pconnect($testuser,$testpassword,$dbase,"utf8"); get_edit_attr($pc1); oci_close($pc1); @@ -145,7 +145,7 @@ function set_scope() { } function get_scope() { - $sc1 = oci_connect($GLOBALS['user'],$GLOBALS['password'],$GLOBALS['dbase']); + $sc1 = oci_connect($GLOBALS['testuser'],$GLOBALS['testpassword'],$GLOBALS['dbase']); if ($sc1 === false) { $m = oci_error(); die("Error:" . $m['message']); diff --git a/ext/oci8/tests/error_set.phpt b/ext/oci8/tests/error_set.phpt new file mode 100644 index 0000000000..ad56e8aefa --- /dev/null +++ b/ext/oci8/tests/error_set.phpt @@ -0,0 +1,72 @@ +--TEST-- +Check oci_set_{action,client_identifier,module_name,client_info} error handling +--SKIPIF-- +<?php if (!extension_loaded('oci8')) die ("skip no oci8 extension"); ?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +error_reporting(E_ALL); +ini_set('display_errors', 'Off'); + +echo "Test 1\n"; + +// Generates "ORA-24960: the attribute OCI_ATTR_* is greater than the maximum allowable length of 64" +$s = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; + +$r = oci_set_action($c, $s); +var_dump($r); +$m = oci_error($c); +echo $m['code'] , "\n"; + +$r = oci_set_client_identifier($c, $s); +var_dump($r); +$m = oci_error($c); +echo $m['code'] , "\n"; + +$r = oci_set_module_name($c, $s); +var_dump($r); +$m = oci_error($c); +echo $m['code'] , "\n"; + +$r = oci_set_client_info($c, $s); +var_dump($r); +$m = oci_error($c); +echo $m['code'] , "\n"; + +echo "\nTest 2\n"; +$s = "x"; + +$r = oci_set_action($c, $s); +var_dump($r); + +$r = oci_set_client_identifier($c, $s); +var_dump($r); + +$r = oci_set_module_name($c, $s); +var_dump($r); + +$r = oci_set_client_info($c, $s); +var_dump($r); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 +bool(false) +24960 +bool(false) +24960 +bool(false) +24960 +bool(false) +24960 + +Test 2 +bool(true) +bool(true) +bool(true) +bool(true) +===DONE=== diff --git a/ext/oci8/tests/extauth_01.phpt b/ext/oci8/tests/extauth_01.phpt index 37f8f3834d..1194ae180d 100644 --- a/ext/oci8/tests/extauth_01.phpt +++ b/ext/oci8/tests/extauth_01.phpt @@ -143,56 +143,56 @@ Test 7 Warning: oci_connect(): ORA-12154: %s in %s on line %d array(4) { - [%u|b%"code"]=> + ["code"]=> int(12154) - [%u|b%"message"]=> - %unicode|string%(%d) "ORA-12154: %s" - [%u|b%"offset"]=> + ["message"]=> + string(%d) "ORA-12154: %s" + ["offset"]=> int(0) - [%u|b%"sqltext"]=> - %unicode|string%(0) "" + ["sqltext"]=> + string(0) "" } bool(false) Test 8 Warning: oci_connect(): ORA-12154: %s in %s on line %d array(4) { - [%u|b%"code"]=> + ["code"]=> int(12154) - [%u|b%"message"]=> - %unicode|string%(%d) "ORA-12154: %s" - [%u|b%"offset"]=> + ["message"]=> + string(%d) "ORA-12154: %s" + ["offset"]=> int(0) - [%u|b%"sqltext"]=> - %unicode|string%(0) "" + ["sqltext"]=> + string(0) "" } bool(false) Test 9 Warning: oci_connect(): ORA-%d: TNS:%s in %s on line %d array(4) { - [%u|b%"code"]=> + ["code"]=> int(%d) - [%u|b%"message"]=> - %unicode|string%(%d) "ORA-%d: %s" - [%u|b%"offset"]=> + ["message"]=> + string(%d) "ORA-%d: %s" + ["offset"]=> int(0) - [%u|b%"sqltext"]=> - %unicode|string%(0) "" + ["sqltext"]=> + string(0) "" } bool(false) Test 10 Warning: oci_connect(): ORA-%d: TNS:%s in %s on line %d array(4) { - [%u|b%"code"]=> + ["code"]=> int(%d) - [%u|b%"message"]=> - %unicode|string%(%d) "ORA-%d: %s" - [%u|b%"offset"]=> + ["message"]=> + string(%d) "ORA-%d: %s" + ["offset"]=> int(0) - [%u|b%"sqltext"]=> - %unicode|string%(0) "" + ["sqltext"]=> + string(0) "" } bool(false) ===DONE=== diff --git a/ext/oci8/tests/extauth_02.phpt b/ext/oci8/tests/extauth_02.phpt index f3b517f730..0a3227019c 100644 --- a/ext/oci8/tests/extauth_02.phpt +++ b/ext/oci8/tests/extauth_02.phpt @@ -142,56 +142,56 @@ Test 7 Warning: oci_new_connect(): ORA-12154: %s in %s on line %d array(4) { - [%u|b%"code"]=> + ["code"]=> int(12154) - [%u|b%"message"]=> - %unicode|string%(%d) "ORA-12154: %s" - [%u|b%"offset"]=> + ["message"]=> + string(%d) "ORA-12154: %s" + ["offset"]=> int(0) - [%u|b%"sqltext"]=> - %unicode|string%(0) "" + ["sqltext"]=> + string(0) "" } bool(false) Test 8 Warning: oci_new_connect(): ORA-12154: %s in %s on line %d array(4) { - [%u|b%"code"]=> + ["code"]=> int(12154) - [%u|b%"message"]=> - %unicode|string%(%d) "ORA-12154: %s" - [%u|b%"offset"]=> + ["message"]=> + string(%d) "ORA-12154: %s" + ["offset"]=> int(0) - [%u|b%"sqltext"]=> - %unicode|string%(0) "" + ["sqltext"]=> + string(0) "" } bool(false) Test 9 Warning: oci_new_connect(): ORA-%d: TNS:%s %s on line %d array(4) { - [%u|b%"code"]=> + ["code"]=> int(%d) - [%u|b%"message"]=> - %unicode|string%(%d) "ORA-%d: %s" - [%u|b%"offset"]=> + ["message"]=> + string(%d) "ORA-%d: %s" + ["offset"]=> int(0) - [%u|b%"sqltext"]=> - %unicode|string%(0) "" + ["sqltext"]=> + string(0) "" } bool(false) Test 10 Warning: oci_new_connect(): ORA-%d: TNS:%s %s on line %d array(4) { - [%u|b%"code"]=> + ["code"]=> int(%d) - [%u|b%"message"]=> - %unicode|string%(%d) "ORA-%d: %s" - [%u|b%"offset"]=> + ["message"]=> + string(%d) "ORA-%d: %s" + ["offset"]=> int(0) - [%u|b%"sqltext"]=> - %unicode|string%(0) "" + ["sqltext"]=> + string(0) "" } bool(false) ===DONE=== diff --git a/ext/oci8/tests/extauth_03.phpt b/ext/oci8/tests/extauth_03.phpt index e6685eb176..d7884ce6b4 100644 --- a/ext/oci8/tests/extauth_03.phpt +++ b/ext/oci8/tests/extauth_03.phpt @@ -142,56 +142,56 @@ Test 7 Warning: oci_pconnect(): ORA-12154: %s in %s on line %d array(4) { - [%u|b%"code"]=> + ["code"]=> int(12154) - [%u|b%"message"]=> - %unicode|string%(%d) "ORA-12154: %s" - [%u|b%"offset"]=> + ["message"]=> + string(%d) "ORA-12154: %s" + ["offset"]=> int(0) - [%u|b%"sqltext"]=> - %unicode|string%(0) "" + ["sqltext"]=> + string(0) "" } bool(false) Test 8 Warning: oci_pconnect(): ORA-12154: %s in %s on line %d array(4) { - [%u|b%"code"]=> + ["code"]=> int(12154) - [%u|b%"message"]=> - %unicode|string%(%d) "ORA-12154: %s" - [%u|b%"offset"]=> + ["message"]=> + string(%d) "ORA-12154: %s" + ["offset"]=> int(0) - [%u|b%"sqltext"]=> - %unicode|string%(0) "" + ["sqltext"]=> + string(0) "" } bool(false) Test 9 Warning: oci_pconnect(): ORA-%d: TNS:%s in %s on line %d array(4) { - [%u|b%"code"]=> + ["code"]=> int(%d) - [%u|b%"message"]=> - %unicode|string%(%d) "ORA-%d: %s" - [%u|b%"offset"]=> + ["message"]=> + string(%d) "ORA-%d: %s" + ["offset"]=> int(0) - [%u|b%"sqltext"]=> - %unicode|string%(0) "" + ["sqltext"]=> + string(0) "" } bool(false) Test 10 Warning: oci_pconnect(): ORA-%d: TNS:%s in %s on line %d array(4) { - [%u|b%"code"]=> + ["code"]=> int(%d) - [%u|b%"message"]=> - %unicode|string%(%d) "ORA-%d: %s" - [%u|b%"offset"]=> + ["message"]=> + string(%d) "ORA-%d: %s" + ["offset"]=> int(0) - [%u|b%"sqltext"]=> - %unicode|string%(0) "" + ["sqltext"]=> + string(0) "" } bool(false) ===DONE=== diff --git a/ext/oci8/tests/fetch.phpt b/ext/oci8/tests/fetch.phpt index e48aeefd87..b968ae4bf6 100644 --- a/ext/oci8/tests/fetch.phpt +++ b/ext/oci8/tests/fetch.phpt @@ -47,10 +47,10 @@ oci8_test_sql_execute($c, $stmtarray); echo "Done\n"; ?> --EXPECTF-- -%unicode|string%(1) "1" -%unicode|string%(1) "1" -%unicode|string%(1) "1" -%unicode|string%(1) "1" -%unicode|string%(1) "1" -%unicode|string%(1) "1" +string(1) "1" +string(1) "1" +string(1) "1" +string(1) "1" +string(1) "1" +string(1) "1" Done diff --git a/ext/oci8/tests/fetch_all.phpt b/ext/oci8/tests/fetch_all.phpt index 4fc41daad4..b8155b170b 100644 --- a/ext/oci8/tests/fetch_all.phpt +++ b/ext/oci8/tests/fetch_all.phpt @@ -51,44 +51,44 @@ echo "Done\n"; --EXPECTF-- int(3) array(2) { - [%u|b%"ID"]=> + ["ID"]=> array(3) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(1) "1" + string(1) "1" [2]=> - %unicode|string%(1) "1" + string(1) "1" } - [%u|b%"VALUE"]=> + ["VALUE"]=> array(3) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(1) "1" + string(1) "1" [2]=> - %unicode|string%(1) "1" + string(1) "1" } } int(3) array(2) { - [%u|b%"ID"]=> + ["ID"]=> array(3) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(1) "1" + string(1) "1" [2]=> - %unicode|string%(1) "1" + string(1) "1" } - [%u|b%"VALUE"]=> + ["VALUE"]=> array(3) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(1) "1" + string(1) "1" [2]=> - %unicode|string%(1) "1" + string(1) "1" } } Done diff --git a/ext/oci8/tests/fetch_all1.phpt b/ext/oci8/tests/fetch_all1.phpt index 4fc41daad4..b8155b170b 100644 --- a/ext/oci8/tests/fetch_all1.phpt +++ b/ext/oci8/tests/fetch_all1.phpt @@ -51,44 +51,44 @@ echo "Done\n"; --EXPECTF-- int(3) array(2) { - [%u|b%"ID"]=> + ["ID"]=> array(3) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(1) "1" + string(1) "1" [2]=> - %unicode|string%(1) "1" + string(1) "1" } - [%u|b%"VALUE"]=> + ["VALUE"]=> array(3) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(1) "1" + string(1) "1" [2]=> - %unicode|string%(1) "1" + string(1) "1" } } int(3) array(2) { - [%u|b%"ID"]=> + ["ID"]=> array(3) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(1) "1" + string(1) "1" [2]=> - %unicode|string%(1) "1" + string(1) "1" } - [%u|b%"VALUE"]=> + ["VALUE"]=> array(3) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(1) "1" + string(1) "1" [2]=> - %unicode|string%(1) "1" + string(1) "1" } } Done diff --git a/ext/oci8/tests/fetch_all3.phpt b/ext/oci8/tests/fetch_all3.phpt index 1748ea5658..4c0be1cc07 100644 --- a/ext/oci8/tests/fetch_all3.phpt +++ b/ext/oci8/tests/fetch_all3.phpt @@ -129,105 +129,105 @@ echo "Done\n"; None int(4) array(2) { - [%u|b%"ID"]=> + ["ID"]=> array(4) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(1) "2" + string(1) "2" [2]=> - %unicode|string%(1) "3" + string(1) "3" [3]=> - %unicode|string%(1) "4" + string(1) "4" } - [%u|b%"VALUE"]=> + ["VALUE"]=> array(4) { [0]=> - %unicode|string%(2) "-1" + string(2) "-1" [1]=> - %unicode|string%(2) "-2" + string(2) "-2" [2]=> - %unicode|string%(2) "-3" + string(2) "-3" [3]=> - %unicode|string%(2) "-4" + string(2) "-4" } } OCI_ASSOC int(4) array(2) { - [%u|b%"ID"]=> + ["ID"]=> array(4) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(1) "2" + string(1) "2" [2]=> - %unicode|string%(1) "3" + string(1) "3" [3]=> - %unicode|string%(1) "4" + string(1) "4" } - [%u|b%"VALUE"]=> + ["VALUE"]=> array(4) { [0]=> - %unicode|string%(2) "-1" + string(2) "-1" [1]=> - %unicode|string%(2) "-2" + string(2) "-2" [2]=> - %unicode|string%(2) "-3" + string(2) "-3" [3]=> - %unicode|string%(2) "-4" + string(2) "-4" } } OCI_FETCHSTATEMENT_BY_COLUMN int(4) array(2) { - [%u|b%"ID"]=> + ["ID"]=> array(4) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(1) "2" + string(1) "2" [2]=> - %unicode|string%(1) "3" + string(1) "3" [3]=> - %unicode|string%(1) "4" + string(1) "4" } - [%u|b%"VALUE"]=> + ["VALUE"]=> array(4) { [0]=> - %unicode|string%(2) "-1" + string(2) "-1" [1]=> - %unicode|string%(2) "-2" + string(2) "-2" [2]=> - %unicode|string%(2) "-3" + string(2) "-3" [3]=> - %unicode|string%(2) "-4" + string(2) "-4" } } OCI_FETCHSTATEMENT_BY_COLUMN|OCI_ASSOC int(4) array(2) { - [%u|b%"ID"]=> + ["ID"]=> array(4) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(1) "2" + string(1) "2" [2]=> - %unicode|string%(1) "3" + string(1) "3" [3]=> - %unicode|string%(1) "4" + string(1) "4" } - [%u|b%"VALUE"]=> + ["VALUE"]=> array(4) { [0]=> - %unicode|string%(2) "-1" + string(2) "-1" [1]=> - %unicode|string%(2) "-2" + string(2) "-2" [2]=> - %unicode|string%(2) "-3" + string(2) "-3" [3]=> - %unicode|string%(2) "-4" + string(2) "-4" } } OCI_FETCHSTATEMENT_BY_COLUMN|OCI_NUM @@ -236,24 +236,24 @@ array(2) { [0]=> array(4) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(1) "2" + string(1) "2" [2]=> - %unicode|string%(1) "3" + string(1) "3" [3]=> - %unicode|string%(1) "4" + string(1) "4" } [1]=> array(4) { [0]=> - %unicode|string%(2) "-1" + string(2) "-1" [1]=> - %unicode|string%(2) "-2" + string(2) "-2" [2]=> - %unicode|string%(2) "-3" + string(2) "-3" [3]=> - %unicode|string%(2) "-4" + string(2) "-4" } } OCI_FETCHSTATEMENT_BY_COLUMN|OCI_NUM|OCI_ASSOC @@ -262,24 +262,24 @@ array(2) { [0]=> array(4) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(1) "2" + string(1) "2" [2]=> - %unicode|string%(1) "3" + string(1) "3" [3]=> - %unicode|string%(1) "4" + string(1) "4" } [1]=> array(4) { [0]=> - %unicode|string%(2) "-1" + string(2) "-1" [1]=> - %unicode|string%(2) "-2" + string(2) "-2" [2]=> - %unicode|string%(2) "-3" + string(2) "-3" [3]=> - %unicode|string%(2) "-4" + string(2) "-4" } } OCI_FETCHSTATEMENT_BY_ROW @@ -287,31 +287,31 @@ int(4) array(4) { [0]=> array(2) { - [%u|b%"ID"]=> - %unicode|string%(1) "1" - [%u|b%"VALUE"]=> - %unicode|string%(2) "-1" + ["ID"]=> + string(1) "1" + ["VALUE"]=> + string(2) "-1" } [1]=> array(2) { - [%u|b%"ID"]=> - %unicode|string%(1) "2" - [%u|b%"VALUE"]=> - %unicode|string%(2) "-2" + ["ID"]=> + string(1) "2" + ["VALUE"]=> + string(2) "-2" } [2]=> array(2) { - [%u|b%"ID"]=> - %unicode|string%(1) "3" - [%u|b%"VALUE"]=> - %unicode|string%(2) "-3" + ["ID"]=> + string(1) "3" + ["VALUE"]=> + string(2) "-3" } [3]=> array(2) { - [%u|b%"ID"]=> - %unicode|string%(1) "4" - [%u|b%"VALUE"]=> - %unicode|string%(2) "-4" + ["ID"]=> + string(1) "4" + ["VALUE"]=> + string(2) "-4" } } OCI_FETCHSTATEMENT_BY_ROW|OCI_ASSOC @@ -319,31 +319,31 @@ int(4) array(4) { [0]=> array(2) { - [%u|b%"ID"]=> - %unicode|string%(1) "1" - [%u|b%"VALUE"]=> - %unicode|string%(2) "-1" + ["ID"]=> + string(1) "1" + ["VALUE"]=> + string(2) "-1" } [1]=> array(2) { - [%u|b%"ID"]=> - %unicode|string%(1) "2" - [%u|b%"VALUE"]=> - %unicode|string%(2) "-2" + ["ID"]=> + string(1) "2" + ["VALUE"]=> + string(2) "-2" } [2]=> array(2) { - [%u|b%"ID"]=> - %unicode|string%(1) "3" - [%u|b%"VALUE"]=> - %unicode|string%(2) "-3" + ["ID"]=> + string(1) "3" + ["VALUE"]=> + string(2) "-3" } [3]=> array(2) { - [%u|b%"ID"]=> - %unicode|string%(1) "4" - [%u|b%"VALUE"]=> - %unicode|string%(2) "-4" + ["ID"]=> + string(1) "4" + ["VALUE"]=> + string(2) "-4" } } OCI_FETCHSTATEMENT_BY_ROW|OCI_FETCHSTATEMENT_BY_COLUMN @@ -351,31 +351,31 @@ int(4) array(4) { [0]=> array(2) { - [%u|b%"ID"]=> - %unicode|string%(1) "1" - [%u|b%"VALUE"]=> - %unicode|string%(2) "-1" + ["ID"]=> + string(1) "1" + ["VALUE"]=> + string(2) "-1" } [1]=> array(2) { - [%u|b%"ID"]=> - %unicode|string%(1) "2" - [%u|b%"VALUE"]=> - %unicode|string%(2) "-2" + ["ID"]=> + string(1) "2" + ["VALUE"]=> + string(2) "-2" } [2]=> array(2) { - [%u|b%"ID"]=> - %unicode|string%(1) "3" - [%u|b%"VALUE"]=> - %unicode|string%(2) "-3" + ["ID"]=> + string(1) "3" + ["VALUE"]=> + string(2) "-3" } [3]=> array(2) { - [%u|b%"ID"]=> - %unicode|string%(1) "4" - [%u|b%"VALUE"]=> - %unicode|string%(2) "-4" + ["ID"]=> + string(1) "4" + ["VALUE"]=> + string(2) "-4" } } OCI_FETCHSTATEMENT_BY_ROW|OCI_FETCHSTATEMENT_BY_COLUMN|OCI_ASSOC @@ -383,31 +383,31 @@ int(4) array(4) { [0]=> array(2) { - [%u|b%"ID"]=> - %unicode|string%(1) "1" - [%u|b%"VALUE"]=> - %unicode|string%(2) "-1" + ["ID"]=> + string(1) "1" + ["VALUE"]=> + string(2) "-1" } [1]=> array(2) { - [%u|b%"ID"]=> - %unicode|string%(1) "2" - [%u|b%"VALUE"]=> - %unicode|string%(2) "-2" + ["ID"]=> + string(1) "2" + ["VALUE"]=> + string(2) "-2" } [2]=> array(2) { - [%u|b%"ID"]=> - %unicode|string%(1) "3" - [%u|b%"VALUE"]=> - %unicode|string%(2) "-3" + ["ID"]=> + string(1) "3" + ["VALUE"]=> + string(2) "-3" } [3]=> array(2) { - [%u|b%"ID"]=> - %unicode|string%(1) "4" - [%u|b%"VALUE"]=> - %unicode|string%(2) "-4" + ["ID"]=> + string(1) "4" + ["VALUE"]=> + string(2) "-4" } } OCI_FETCHSTATEMENT_BY_ROW|OCI_FETCHSTATEMENT_BY_COLUMN|OCI_NUM @@ -416,30 +416,30 @@ array(4) { [0]=> array(2) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(2) "-1" + string(2) "-1" } [1]=> array(2) { [0]=> - %unicode|string%(1) "2" + string(1) "2" [1]=> - %unicode|string%(2) "-2" + string(2) "-2" } [2]=> array(2) { [0]=> - %unicode|string%(1) "3" + string(1) "3" [1]=> - %unicode|string%(2) "-3" + string(2) "-3" } [3]=> array(2) { [0]=> - %unicode|string%(1) "4" + string(1) "4" [1]=> - %unicode|string%(2) "-4" + string(2) "-4" } } OCI_FETCHSTATEMENT_BY_ROW|OCI_FETCHSTATEMENT_BY_COLUMN|OCI_NUM|OCI_ASSOC @@ -448,30 +448,30 @@ array(4) { [0]=> array(2) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(2) "-1" + string(2) "-1" } [1]=> array(2) { [0]=> - %unicode|string%(1) "2" + string(1) "2" [1]=> - %unicode|string%(2) "-2" + string(2) "-2" } [2]=> array(2) { [0]=> - %unicode|string%(1) "3" + string(1) "3" [1]=> - %unicode|string%(2) "-3" + string(2) "-3" } [3]=> array(2) { [0]=> - %unicode|string%(1) "4" + string(1) "4" [1]=> - %unicode|string%(2) "-4" + string(2) "-4" } } OCI_FETCHSTATEMENT_BY_ROW|OCI_NUM @@ -480,30 +480,30 @@ array(4) { [0]=> array(2) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(2) "-1" + string(2) "-1" } [1]=> array(2) { [0]=> - %unicode|string%(1) "2" + string(1) "2" [1]=> - %unicode|string%(2) "-2" + string(2) "-2" } [2]=> array(2) { [0]=> - %unicode|string%(1) "3" + string(1) "3" [1]=> - %unicode|string%(2) "-3" + string(2) "-3" } [3]=> array(2) { [0]=> - %unicode|string%(1) "4" + string(1) "4" [1]=> - %unicode|string%(2) "-4" + string(2) "-4" } } OCI_FETCHSTATEMENT_BY_ROW|OCI_NUM|OCI_ASSOC @@ -512,30 +512,30 @@ array(4) { [0]=> array(2) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(2) "-1" + string(2) "-1" } [1]=> array(2) { [0]=> - %unicode|string%(1) "2" + string(1) "2" [1]=> - %unicode|string%(2) "-2" + string(2) "-2" } [2]=> array(2) { [0]=> - %unicode|string%(1) "3" + string(1) "3" [1]=> - %unicode|string%(2) "-3" + string(2) "-3" } [3]=> array(2) { [0]=> - %unicode|string%(1) "4" + string(1) "4" [1]=> - %unicode|string%(2) "-4" + string(2) "-4" } } OCI_NUM @@ -544,24 +544,24 @@ array(2) { [0]=> array(4) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(1) "2" + string(1) "2" [2]=> - %unicode|string%(1) "3" + string(1) "3" [3]=> - %unicode|string%(1) "4" + string(1) "4" } [1]=> array(4) { [0]=> - %unicode|string%(2) "-1" + string(2) "-1" [1]=> - %unicode|string%(2) "-2" + string(2) "-2" [2]=> - %unicode|string%(2) "-3" + string(2) "-3" [3]=> - %unicode|string%(2) "-4" + string(2) "-4" } } OCI_NUM|OCI_ASSOC @@ -570,24 +570,24 @@ array(2) { [0]=> array(4) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(1) "2" + string(1) "2" [2]=> - %unicode|string%(1) "3" + string(1) "3" [3]=> - %unicode|string%(1) "4" + string(1) "4" } [1]=> array(4) { [0]=> - %unicode|string%(2) "-1" + string(2) "-1" [1]=> - %unicode|string%(2) "-2" + string(2) "-2" [2]=> - %unicode|string%(2) "-3" + string(2) "-3" [3]=> - %unicode|string%(2) "-4" + string(2) "-4" } } Done diff --git a/ext/oci8/tests/fetch_all4.phpt b/ext/oci8/tests/fetch_all4.phpt index 1d3c9677ee..1d4a8df7b7 100644 --- a/ext/oci8/tests/fetch_all4.phpt +++ b/ext/oci8/tests/fetch_all4.phpt @@ -51,10 +51,10 @@ oci8_test_sql_execute($c, $stmtarray); Test 1 int(0) array(2) { - [%u|b%"MYCOL1"]=> + ["MYCOL1"]=> array(0) { } - [%u|b%"MYCOL2"]=> + ["MYCOL2"]=> array(0) { } } diff --git a/ext/oci8/tests/fetch_all5.phpt b/ext/oci8/tests/fetch_all5.phpt index a6bb3c3f18..d82fd30e41 100644 --- a/ext/oci8/tests/fetch_all5.phpt +++ b/ext/oci8/tests/fetch_all5.phpt @@ -62,45 +62,45 @@ oci_close($c); Test 1 int(3) array(2) { - [%u|b%"MYCOL1"]=> + ["MYCOL1"]=> array(3) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(1) "2" + string(1) "2" [2]=> - %unicode|string%(1) "3" + string(1) "3" } - [%u|b%"MYCOL2"]=> + ["MYCOL2"]=> array(3) { [0]=> - %unicode|string%(3) "abc" + string(3) "abc" [1]=> - %unicode|string%(3) "def" + string(3) "def" [2]=> - %unicode|string%(3) "ghi" + string(3) "ghi" } } Test 1 int(3) array(2) { - [%u|b%"MYCOL1"]=> + ["MYCOL1"]=> array(3) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(1) "2" + string(1) "2" [2]=> - %unicode|string%(1) "3" + string(1) "3" } - [%u|b%"MYCOL2"]=> + ["MYCOL2"]=> array(3) { [0]=> - %unicode|string%(3) "abc" + string(3) "abc" [1]=> - %unicode|string%(3) "def" + string(3) "def" [2]=> - %unicode|string%(3) "ghi" + string(3) "ghi" } } Test 3 diff --git a/ext/oci8/tests/fetch_into.phpt b/ext/oci8/tests/fetch_into.phpt index 45a6a8132e..d90c4d95dc 100644 --- a/ext/oci8/tests/fetch_into.phpt +++ b/ext/oci8/tests/fetch_into.phpt @@ -53,19 +53,19 @@ echo "Done\n"; int(2) array(2) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(1) "1" + string(1) "1" } int(2) array(4) { [0]=> - %unicode|string%(1) "1" - [%u|b%"ID"]=> - %unicode|string%(1) "1" + string(1) "1" + ["ID"]=> + string(1) "1" [1]=> - %unicode|string%(1) "1" - [%u|b%"VALUE"]=> - %unicode|string%(1) "1" + string(1) "1" + ["VALUE"]=> + string(1) "1" } Done diff --git a/ext/oci8/tests/fetch_object.phpt b/ext/oci8/tests/fetch_object.phpt index 1c290d5e95..73711baa18 100644 --- a/ext/oci8/tests/fetch_object.phpt +++ b/ext/oci8/tests/fetch_object.phpt @@ -82,28 +82,28 @@ oci8_test_sql_execute($c, $stmtarray); --EXPECTF-- Test 1 object(stdClass)#1 (3) { - [%u|b%"caseSensitive"]=> - %unicode|string%(3) "123" - [%u|b%"SECONDCOL"]=> - %unicode|string%(19) "1st row col2 string" - [%u|b%"ANOTHERCOL"]=> - %unicode|string%(15) "1 more text " + ["caseSensitive"]=> + string(3) "123" + ["SECONDCOL"]=> + string(19) "1st row col2 string" + ["ANOTHERCOL"]=> + string(15) "1 more text " } object(stdClass)#2 (3) { - [%u|b%"caseSensitive"]=> - %unicode|string%(3) "456" - [%u|b%"SECONDCOL"]=> - %unicode|string%(19) "2nd row col2 string" - [%u|b%"ANOTHERCOL"]=> - %unicode|string%(15) "2 more text " + ["caseSensitive"]=> + string(3) "456" + ["SECONDCOL"]=> + string(19) "2nd row col2 string" + ["ANOTHERCOL"]=> + string(15) "2 more text " } object(stdClass)#1 (3) { - [%u|b%"caseSensitive"]=> - %unicode|string%(3) "789" - [%u|b%"SECONDCOL"]=> - %unicode|string%(19) "3rd row col2 string" - [%u|b%"ANOTHERCOL"]=> - %unicode|string%(15) "3 more text " + ["caseSensitive"]=> + string(3) "789" + ["SECONDCOL"]=> + string(19) "3rd row col2 string" + ["ANOTHERCOL"]=> + string(15) "3 more text " } Test 2 123 diff --git a/ext/oci8/tests/fetch_row.phpt b/ext/oci8/tests/fetch_row.phpt index 2b28634ab3..40bc4f893c 100644 --- a/ext/oci8/tests/fetch_row.phpt +++ b/ext/oci8/tests/fetch_row.phpt @@ -46,20 +46,20 @@ echo "Done\n"; --EXPECTF-- array(2) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(1) "1" + string(1) "1" } array(2) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(1) "1" + string(1) "1" } array(2) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(1) "1" + string(1) "1" } Done diff --git a/ext/oci8/tests/field_funcs1.phpt b/ext/oci8/tests/field_funcs1.phpt index c14ee8957e..41d8627ce4 100644 --- a/ext/oci8/tests/field_funcs1.phpt +++ b/ext/oci8/tests/field_funcs1.phpt @@ -85,9 +85,9 @@ echo "Done\n"; --EXPECTF-- array(2) { [0]=> - %unicode|string%(1) "1" + string(1) "1" [1]=> - %unicode|string%(1) "1" + string(1) "1" } Test 1 diff --git a/ext/oci8/tests/function_aliases.phpt b/ext/oci8/tests/function_aliases.phpt index 4c6ce83759..2c890d6403 100644 --- a/ext/oci8/tests/function_aliases.phpt +++ b/ext/oci8/tests/function_aliases.phpt @@ -104,8 +104,6 @@ NULL Warning: ocifreestatement() expects exactly 1 parameter, 0 given in %s on line %d NULL - -Warning: ociinternaldebug() expects exactly 1 parameter, 0 given in %s on line %d NULL Warning: ocinumcols() expects exactly 1 parameter, 0 given in %s on line %d diff --git a/ext/oci8/tests/imp_res_1.phpt b/ext/oci8/tests/imp_res_1.phpt new file mode 100644 index 0000000000..a36f89f4da --- /dev/null +++ b/ext/oci8/tests/imp_res_1.phpt @@ -0,0 +1,630 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: basic test +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$stmtarray = array( + "drop table imp_res_1_tab_1", + "create table imp_res_1_tab_1 (c1 number, c2 varchar2(10))", + "insert into imp_res_1_tab_1 values (1, 'abcde')", + "insert into imp_res_1_tab_1 values (2, 'fghij')", + "insert into imp_res_1_tab_1 values (3, 'klmno')", + + "drop table imp_res_1_tab_2", + "create table imp_res_1_tab_2 (c3 varchar2(1))", + "insert into imp_res_1_tab_2 values ('t')", + "insert into imp_res_1_tab_2 values ('u')", + "insert into imp_res_1_tab_2 values ('v')", + + "create or replace procedure imp_res_1_proc as + c1 sys_refcursor; + begin + open c1 for select * from imp_res_1_tab_1 order by 1; + dbms_sql.return_result(c1); + + open c1 for select * from imp_res_1_tab_2 where rownum < 3 order by 1; + dbms_sql.return_result(c1); + + open c1 for select 99 from dual; + dbms_sql.return_result (c1); + + open c1 for select NULL, 'Z' from dual; + dbms_sql.return_result (c1); + + open c1 for select * from imp_res_1_tab_1 order by 1; + dbms_sql.return_result(c1); + end;" +); + +oci8_test_sql_execute($c, $stmtarray); + +// Run Test + +echo "Test 1 - oci_fetch_assoc\n"; +$s = oci_parse($c, "begin imp_res_1_proc(); end;"); +oci_execute($s); +while (($row = oci_fetch_assoc($s)) != false) + var_dump($row); + +echo "\nTest 2 - oci_fetch_object\n"; +$s = oci_parse($c, "begin imp_res_1_proc(); end;"); +oci_execute($s); +while (($row = oci_fetch_object($s)) != false) + var_dump($row); + +echo "\nTest 3 - oci_fetch_row\n"; +$s = oci_parse($c, "begin imp_res_1_proc(); end;"); +oci_execute($s); +while (($row = oci_fetch_row($s)) != false) + var_dump($row); + +echo "\nTest 4 - oci_fetch_array(OCI_ASSOC+OCI_RETURN_NULLS)\n"; +$s = oci_parse($c, "begin imp_res_1_proc(); end;"); +oci_execute($s); +while (($row = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_NULLS)) != false) + var_dump($row); + +echo "\nTest 5 - oci_fetch_array(OCI_ASSOC)\n"; +$s = oci_parse($c, "begin imp_res_1_proc(); end;"); +oci_execute($s); +while (($row = oci_fetch_array($s, OCI_ASSOC)) != false) + var_dump($row); + +echo "\nTest 6 - oci_fetch_array(OCI_NUM)\n"; +$s = oci_parse($c, "begin imp_res_1_proc(); end;"); +oci_execute($s); +while (($row = oci_fetch_array($s, OCI_NUM)) != false) + var_dump($row); + +echo "\nTest 7 - oci_fetch_array(OCI_BOTH)\n"; +$s = oci_parse($c, "begin imp_res_1_proc(); end;"); +oci_execute($s); +while (($row = oci_fetch_array($s, OCI_BOTH)) != false) + var_dump($row); + +echo "\nTest 8 - oci_fetch_array(OCI_BOTH+OCI_RETURN_NULLS)\n"; +$s = oci_parse($c, "begin imp_res_1_proc(); end;"); +oci_execute($s); +while (($row = oci_fetch_array($s, OCI_BOTH+OCI_RETURN_NULLS)) != false) + var_dump($row); + +// Clean up + +$stmtarray = array( + "drop procedure imp_res_1_proc", + "drop table imp_res_1_tab_1", + "drop table imp_res_1_tab_2" +); + +oci8_test_sql_execute($c, $stmtarray); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 - oci_fetch_assoc +array(2) { + ["C1"]=> + string(1) "1" + ["C2"]=> + string(5) "abcde" +} +array(2) { + ["C1"]=> + string(1) "2" + ["C2"]=> + string(5) "fghij" +} +array(2) { + ["C1"]=> + string(1) "3" + ["C2"]=> + string(5) "klmno" +} +array(1) { + ["C3"]=> + string(1) "t" +} +array(1) { + ["C3"]=> + string(1) "u" +} +array(1) { + [99]=> + string(2) "99" +} +array(2) { + ["NULL"]=> + NULL + ["'Z'"]=> + string(1) "Z" +} +array(2) { + ["C1"]=> + string(1) "1" + ["C2"]=> + string(5) "abcde" +} +array(2) { + ["C1"]=> + string(1) "2" + ["C2"]=> + string(5) "fghij" +} +array(2) { + ["C1"]=> + string(1) "3" + ["C2"]=> + string(5) "klmno" +} + +Test 2 - oci_fetch_object +object(stdClass)#%d (2) { + ["C1"]=> + string(1) "1" + ["C2"]=> + string(5) "abcde" +} +object(stdClass)#%d (2) { + ["C1"]=> + string(1) "2" + ["C2"]=> + string(5) "fghij" +} +object(stdClass)#%d (2) { + ["C1"]=> + string(1) "3" + ["C2"]=> + string(5) "klmno" +} +object(stdClass)#%d (1) { + ["C3"]=> + string(1) "t" +} +object(stdClass)#%d (1) { + ["C3"]=> + string(1) "u" +} +object(stdClass)#%d (1) { + [99]=> + string(2) "99" +} +object(stdClass)#%d (2) { + ["NULL"]=> + NULL + ["'Z'"]=> + string(1) "Z" +} +object(stdClass)#%d (2) { + ["C1"]=> + string(1) "1" + ["C2"]=> + string(5) "abcde" +} +object(stdClass)#%d (2) { + ["C1"]=> + string(1) "2" + ["C2"]=> + string(5) "fghij" +} +object(stdClass)#%d (2) { + ["C1"]=> + string(1) "3" + ["C2"]=> + string(5) "klmno" +} + +Test 3 - oci_fetch_row +array(2) { + [0]=> + string(1) "1" + [1]=> + string(5) "abcde" +} +array(2) { + [0]=> + string(1) "2" + [1]=> + string(5) "fghij" +} +array(2) { + [0]=> + string(1) "3" + [1]=> + string(5) "klmno" +} +array(1) { + [0]=> + string(1) "t" +} +array(1) { + [0]=> + string(1) "u" +} +array(1) { + [0]=> + string(2) "99" +} +array(2) { + [0]=> + NULL + [1]=> + string(1) "Z" +} +array(2) { + [0]=> + string(1) "1" + [1]=> + string(5) "abcde" +} +array(2) { + [0]=> + string(1) "2" + [1]=> + string(5) "fghij" +} +array(2) { + [0]=> + string(1) "3" + [1]=> + string(5) "klmno" +} + +Test 4 - oci_fetch_array(OCI_ASSOC+OCI_RETURN_NULLS) +array(2) { + ["C1"]=> + string(1) "1" + ["C2"]=> + string(5) "abcde" +} +array(2) { + ["C1"]=> + string(1) "2" + ["C2"]=> + string(5) "fghij" +} +array(2) { + ["C1"]=> + string(1) "3" + ["C2"]=> + string(5) "klmno" +} +array(1) { + ["C3"]=> + string(1) "t" +} +array(1) { + ["C3"]=> + string(1) "u" +} +array(1) { + [99]=> + string(2) "99" +} +array(2) { + ["NULL"]=> + NULL + ["'Z'"]=> + string(1) "Z" +} +array(2) { + ["C1"]=> + string(1) "1" + ["C2"]=> + string(5) "abcde" +} +array(2) { + ["C1"]=> + string(1) "2" + ["C2"]=> + string(5) "fghij" +} +array(2) { + ["C1"]=> + string(1) "3" + ["C2"]=> + string(5) "klmno" +} + +Test 5 - oci_fetch_array(OCI_ASSOC) +array(2) { + ["C1"]=> + string(1) "1" + ["C2"]=> + string(5) "abcde" +} +array(2) { + ["C1"]=> + string(1) "2" + ["C2"]=> + string(5) "fghij" +} +array(2) { + ["C1"]=> + string(1) "3" + ["C2"]=> + string(5) "klmno" +} +array(1) { + ["C3"]=> + string(1) "t" +} +array(1) { + ["C3"]=> + string(1) "u" +} +array(1) { + [99]=> + string(2) "99" +} +array(1) { + ["'Z'"]=> + string(1) "Z" +} +array(2) { + ["C1"]=> + string(1) "1" + ["C2"]=> + string(5) "abcde" +} +array(2) { + ["C1"]=> + string(1) "2" + ["C2"]=> + string(5) "fghij" +} +array(2) { + ["C1"]=> + string(1) "3" + ["C2"]=> + string(5) "klmno" +} + +Test 6 - oci_fetch_array(OCI_NUM) +array(2) { + [0]=> + string(1) "1" + [1]=> + string(5) "abcde" +} +array(2) { + [0]=> + string(1) "2" + [1]=> + string(5) "fghij" +} +array(2) { + [0]=> + string(1) "3" + [1]=> + string(5) "klmno" +} +array(1) { + [0]=> + string(1) "t" +} +array(1) { + [0]=> + string(1) "u" +} +array(1) { + [0]=> + string(2) "99" +} +array(1) { + [1]=> + string(1) "Z" +} +array(2) { + [0]=> + string(1) "1" + [1]=> + string(5) "abcde" +} +array(2) { + [0]=> + string(1) "2" + [1]=> + string(5) "fghij" +} +array(2) { + [0]=> + string(1) "3" + [1]=> + string(5) "klmno" +} + +Test 7 - oci_fetch_array(OCI_BOTH) +array(4) { + [0]=> + string(1) "1" + ["C1"]=> + string(1) "1" + [1]=> + string(5) "abcde" + ["C2"]=> + string(5) "abcde" +} +array(4) { + [0]=> + string(1) "2" + ["C1"]=> + string(1) "2" + [1]=> + string(5) "fghij" + ["C2"]=> + string(5) "fghij" +} +array(4) { + [0]=> + string(1) "3" + ["C1"]=> + string(1) "3" + [1]=> + string(5) "klmno" + ["C2"]=> + string(5) "klmno" +} +array(2) { + [0]=> + string(1) "t" + ["C3"]=> + string(1) "t" +} +array(2) { + [0]=> + string(1) "u" + ["C3"]=> + string(1) "u" +} +array(2) { + [0]=> + string(2) "99" + [99]=> + string(2) "99" +} +array(2) { + [1]=> + string(1) "Z" + ["'Z'"]=> + string(1) "Z" +} +array(4) { + [0]=> + string(1) "1" + ["C1"]=> + string(1) "1" + [1]=> + string(5) "abcde" + ["C2"]=> + string(5) "abcde" +} +array(4) { + [0]=> + string(1) "2" + ["C1"]=> + string(1) "2" + [1]=> + string(5) "fghij" + ["C2"]=> + string(5) "fghij" +} +array(4) { + [0]=> + string(1) "3" + ["C1"]=> + string(1) "3" + [1]=> + string(5) "klmno" + ["C2"]=> + string(5) "klmno" +} + +Test 8 - oci_fetch_array(OCI_BOTH+OCI_RETURN_NULLS) +array(4) { + [0]=> + string(1) "1" + ["C1"]=> + string(1) "1" + [1]=> + string(5) "abcde" + ["C2"]=> + string(5) "abcde" +} +array(4) { + [0]=> + string(1) "2" + ["C1"]=> + string(1) "2" + [1]=> + string(5) "fghij" + ["C2"]=> + string(5) "fghij" +} +array(4) { + [0]=> + string(1) "3" + ["C1"]=> + string(1) "3" + [1]=> + string(5) "klmno" + ["C2"]=> + string(5) "klmno" +} +array(2) { + [0]=> + string(1) "t" + ["C3"]=> + string(1) "t" +} +array(2) { + [0]=> + string(1) "u" + ["C3"]=> + string(1) "u" +} +array(2) { + [0]=> + string(2) "99" + [99]=> + string(2) "99" +} +array(4) { + [0]=> + NULL + ["NULL"]=> + NULL + [1]=> + string(1) "Z" + ["'Z'"]=> + string(1) "Z" +} +array(4) { + [0]=> + string(1) "1" + ["C1"]=> + string(1) "1" + [1]=> + string(5) "abcde" + ["C2"]=> + string(5) "abcde" +} +array(4) { + [0]=> + string(1) "2" + ["C1"]=> + string(1) "2" + [1]=> + string(5) "fghij" + ["C2"]=> + string(5) "fghij" +} +array(4) { + [0]=> + string(1) "3" + ["C1"]=> + string(1) "3" + [1]=> + string(5) "klmno" + ["C2"]=> + string(5) "klmno" +} +===DONE=== diff --git a/ext/oci8/tests/imp_res_2.phpt b/ext/oci8/tests/imp_res_2.phpt new file mode 100644 index 0000000000..860a5fbb34 --- /dev/null +++ b/ext/oci8/tests/imp_res_2.phpt @@ -0,0 +1,99 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: Zero Rows +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$stmtarray = array( + "create or replace procedure imp_res_2_proc_a as + c1 sys_refcursor; + begin + open c1 for select * from dual where 1 = 0; + dbms_sql.return_result(c1); + end;", + + "create or replace procedure imp_res_2_proc_b as + c1 sys_refcursor; + begin + open c1 for select * from dual; + dbms_sql.return_result(c1); + open c1 for select * from dual where 1 = 0; + dbms_sql.return_result(c1); + end;", + + "create or replace procedure imp_res_2_proc_c as + c1 sys_refcursor; + begin + open c1 for select * from dual where 1 = 0; + dbms_sql.return_result(c1); + open c1 for select * from dual; + dbms_sql.return_result(c1); + end;" + +); + +oci8_test_sql_execute($c, $stmtarray); + +// Run Test + +echo "Test 1\n"; +$s = oci_parse($c, "begin imp_res_2_proc_a(); end;"); +oci_execute($s); +while (($row = oci_fetch_row($s)) != false) + var_dump($row); + +echo "Test 2\n"; +$s = oci_parse($c, "begin imp_res_2_proc_b(); end;"); +oci_execute($s); +while (($row = oci_fetch_row($s)) != false) + var_dump($row); + +echo "Test 2\n"; +$s = oci_parse($c, "begin imp_res_2_proc_c(); end;"); +oci_execute($s); +while (($row = oci_fetch_row($s)) != false) + var_dump($row); + +// Clean up + +$stmtarray = array( + "drop procedure imp_res_2_proc_a", + "drop procedure imp_res_2_proc_b", + "drop procedure imp_res_2_proc_c" +); + +oci8_test_sql_execute($c, $stmtarray); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 +Test 2 +array(1) { + [0]=> + string(1) "X" +} +Test 2 +array(1) { + [0]=> + string(1) "X" +} +===DONE=== diff --git a/ext/oci8/tests/imp_res_3.phpt b/ext/oci8/tests/imp_res_3.phpt new file mode 100644 index 0000000000..0fc4815893 --- /dev/null +++ b/ext/oci8/tests/imp_res_3.phpt @@ -0,0 +1,1257 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: bigger data size +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$stmtarray = array( + "drop table imp_res_3_tab_1", + "create table imp_res_3_tab_1 (c1 number, c2 varchar2(10))", + "insert into imp_res_3_tab_1 values (1, 'a')", + "insert into imp_res_3_tab_1 values (2, 'f')", + + "drop table imp_res_3_tab_2", + "create table imp_res_3_tab_2 (c3 varchar2(1))", + "insert into imp_res_3_tab_2 values ('t')", + "insert into imp_res_3_tab_2 values ('u')", + "insert into imp_res_3_tab_2 values ('v')", + "insert into imp_res_3_tab_2 values ('w')", + + "create or replace procedure imp_res_3_proc as + c1 sys_refcursor; + i pls_integer; + begin + for i in 1..30 loop -- if this value is too big for Oracle's open_cursors, calling imp_res_3_proc() can fail with ORA-1000 + open c1 for select t1.*, t2.*, t3.*, t4.*, t5.* + from imp_res_3_tab_1 t1, imp_res_3_tab_1 t2, imp_res_3_tab_1 t3, + imp_res_3_tab_1 t4, imp_res_3_tab_1 t5 order by 1,3,5,7,9,2,4,6,8,10; + dbms_sql.return_result(c1); + open c1 for select c2 from imp_res_3_tab_1 order by 1; + dbms_sql.return_result(c1); + open c1 for select * from imp_res_3_tab_2 order by 1; + dbms_sql.return_result(c1); + open c1 for select * from dual; + dbms_sql.return_result (c1); + end loop; + end;" +); + +oci8_test_sql_execute($c, $stmtarray); + +// Run Test + +echo "Test 1\n"; + +$s = oci_parse($c, "begin imp_res_3_proc(); end;"); +oci_execute($s); + +while (($row = oci_fetch_array($s, OCI_NUM+OCI_RETURN_NULLS)) != false) { + foreach ($row as $item) { + echo " ".$item; + } + echo "\n"; +} + +// Clean up + +$stmtarray = array( + "drop procedure imp_res_3_proc", + "drop table imp_res_3_tab_1", + "drop table imp_res_3_tab_2" +); + +oci8_test_sql_execute($c, $stmtarray); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X + 1 a 1 a 1 a 1 a 1 a + 1 a 1 a 1 a 1 a 2 f + 1 a 1 a 1 a 2 f 1 a + 1 a 1 a 1 a 2 f 2 f + 1 a 1 a 2 f 1 a 1 a + 1 a 1 a 2 f 1 a 2 f + 1 a 1 a 2 f 2 f 1 a + 1 a 1 a 2 f 2 f 2 f + 1 a 2 f 1 a 1 a 1 a + 1 a 2 f 1 a 1 a 2 f + 1 a 2 f 1 a 2 f 1 a + 1 a 2 f 1 a 2 f 2 f + 1 a 2 f 2 f 1 a 1 a + 1 a 2 f 2 f 1 a 2 f + 1 a 2 f 2 f 2 f 1 a + 1 a 2 f 2 f 2 f 2 f + 2 f 1 a 1 a 1 a 1 a + 2 f 1 a 1 a 1 a 2 f + 2 f 1 a 1 a 2 f 1 a + 2 f 1 a 1 a 2 f 2 f + 2 f 1 a 2 f 1 a 1 a + 2 f 1 a 2 f 1 a 2 f + 2 f 1 a 2 f 2 f 1 a + 2 f 1 a 2 f 2 f 2 f + 2 f 2 f 1 a 1 a 1 a + 2 f 2 f 1 a 1 a 2 f + 2 f 2 f 1 a 2 f 1 a + 2 f 2 f 1 a 2 f 2 f + 2 f 2 f 2 f 1 a 1 a + 2 f 2 f 2 f 1 a 2 f + 2 f 2 f 2 f 2 f 1 a + 2 f 2 f 2 f 2 f 2 f + a + f + t + u + v + w + X +===DONE=== diff --git a/ext/oci8/tests/imp_res_4.phpt b/ext/oci8/tests/imp_res_4.phpt new file mode 100644 index 0000000000..762ae77224 --- /dev/null +++ b/ext/oci8/tests/imp_res_4.phpt @@ -0,0 +1,82 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: oci_fetch +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$stmtarray = array( + "create or replace procedure imp_res_4_proc as + c1 sys_refcursor; + begin + open c1 for select 1 from dual union select 2 from dual; + dbms_sql.return_result (c1); + end;" +); + +oci8_test_sql_execute($c, $stmtarray); + +// Run Test + +echo "Test 1\n"; +$s = oci_parse($c, "begin imp_res_4_proc(); end;"); +oci_execute($s); +oci_fetch($s); // This will fail with ORA-24374 +var_dump(oci_result($s, 1)); + +echo "\nTest 2\n"; +$s = oci_parse($c, "begin imp_res_4_proc(); end;"); +oci_execute($s); +$r = oci_fetch_row($s); +var_dump($r); +oci_fetch($s); // This will fail with ORA-24374 +var_dump(oci_result($s, 1)); +$r = oci_fetch_row($s); +var_dump($r); + +// Clean up + +$stmtarray = array( + "drop procedure imp_res_4_proc", +); + +oci8_test_sql_execute($c, $stmtarray); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 + +Warning: oci_fetch(): ORA-24374: %s in %simp_res_4.php on line %d +bool(false) + +Test 2 +array(1) { + [0]=> + string(1) "1" +} + +Warning: oci_fetch(): ORA-24374: %s in %simp_res_4.php on line %d +bool(false) +array(1) { + [0]=> + string(1) "2" +} +===DONE=== diff --git a/ext/oci8/tests/imp_res_5.phpt b/ext/oci8/tests/imp_res_5.phpt new file mode 100644 index 0000000000..564a7a3740 --- /dev/null +++ b/ext/oci8/tests/imp_res_5.phpt @@ -0,0 +1,84 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: oci_fetch_all +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$stmtarray = array( + "create or replace procedure imp_res_5_proc as + c1 sys_refcursor; + begin + open c1 for select 1 from dual union select 2 from dual; + dbms_sql.return_result (c1); + end;" +); + +oci8_test_sql_execute($c, $stmtarray); + +// Run Test + +echo "Test 1\n"; +$s = oci_parse($c, "begin imp_res_5_proc(); end;"); +oci_execute($s); +oci_fetch_all($s,$res); // This will fail with ORA-24374 +var_dump($res); + +echo "\nTest 2\n"; +$s = oci_parse($c, "begin imp_res_5_proc(); end;"); +oci_execute($s); +$r = oci_fetch_row($s); +var_dump($r); +oci_fetch_all($s, $res); // This will fail with ORA-24374 +var_dump($res); +$r = oci_fetch_row($s); +var_dump($r); + +// Clean up + +$stmtarray = array( + "drop procedure imp_res_5_proc", +); + +oci8_test_sql_execute($c, $stmtarray); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 + +Warning: oci_fetch_all(): ORA-24374: %s in %simp_res_5.php on line %d +array(0) { +} + +Test 2 +array(1) { + [0]=> + string(1) "1" +} + +Warning: oci_fetch_all(): ORA-24374: %s in %simp_res_5.php on line %d +array(0) { +} +array(1) { + [0]=> + string(1) "2" +} +===DONE=== diff --git a/ext/oci8/tests/imp_res_6.phpt b/ext/oci8/tests/imp_res_6.phpt new file mode 100644 index 0000000000..f94efe70db --- /dev/null +++ b/ext/oci8/tests/imp_res_6.phpt @@ -0,0 +1,118 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: alternating oci_fetch_* calls +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$stmtarray = array( + "drop table imp_res_6_tab", + "create table imp_res_6_tab (c1 number, c2 varchar2(10))", + "insert into imp_res_6_tab values (1, 'a')", + "insert into imp_res_6_tab values (2, 'b')", + "insert into imp_res_6_tab values (3, 'c')", + "insert into imp_res_6_tab values (4, 'd')", + "insert into imp_res_6_tab values (5, 'e')", + "insert into imp_res_6_tab values (6, 'f')", + + "create or replace procedure imp_res_6_proc as + c1 sys_refcursor; + begin + open c1 for select * from imp_res_6_tab order by 1; + dbms_sql.return_result(c1); + end;" +); + +oci8_test_sql_execute($c, $stmtarray); + +// Run Test + +echo "Test 1\n"; +$s = oci_parse($c, "begin imp_res_6_proc(); end;"); +oci_execute($s); + +$row = oci_fetch_assoc($s); +var_dump($row); +$row = oci_fetch_row($s); +var_dump($row); +$row = oci_fetch_object($s); +var_dump($row); +$row = oci_fetch_array($s); +var_dump($row); +$row = oci_fetch_array($s, OCI_NUM); +var_dump($row); +$row = oci_fetch_array($s, OCI_ASSOC); +var_dump($row); + + +// Clean up + +$stmtarray = array( + "drop procedure imp_res_6_proc", + "drop table imp_res_6_tab", +); + +oci8_test_sql_execute($c, $stmtarray); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 +array(2) { + ["C1"]=> + string(1) "1" + ["C2"]=> + string(1) "a" +} +array(2) { + [0]=> + string(1) "2" + [1]=> + string(1) "b" +} +object(stdClass)#%d (2) { + ["C1"]=> + string(1) "3" + ["C2"]=> + string(1) "c" +} +array(4) { + [0]=> + string(1) "4" + ["C1"]=> + string(1) "4" + [1]=> + string(1) "d" + ["C2"]=> + string(1) "d" +} +array(2) { + [0]=> + string(1) "5" + [1]=> + string(1) "e" +} +array(2) { + ["C1"]=> + string(1) "6" + ["C2"]=> + string(1) "f" +} +===DONE=== diff --git a/ext/oci8/tests/imp_res_7.phpt b/ext/oci8/tests/imp_res_7.phpt new file mode 100644 index 0000000000..05ae5e6857 --- /dev/null +++ b/ext/oci8/tests/imp_res_7.phpt @@ -0,0 +1,873 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: bigger data size +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$stmt = + "declare + c1 sys_refcursor; + begin + open c1 for select 1 from dual; + dbms_sql.return_result(c1); + open c1 for select 2 from dual; + dbms_sql.return_result(c1); + open c1 for select 3 from dual; + dbms_sql.return_result(c1); + open c1 for select 4 from dual; + dbms_sql.return_result(c1); + open c1 for select 5 from dual; + dbms_sql.return_result(c1); + open c1 for select 6 from dual; + dbms_sql.return_result(c1); + open c1 for select 7 from dual; + dbms_sql.return_result(c1); + open c1 for select 8 from dual; + dbms_sql.return_result(c1); + open c1 for select 9 from dual; + dbms_sql.return_result(c1); + open c1 for select 10 from dual; + dbms_sql.return_result(c1); + open c1 for select 11 from dual; + dbms_sql.return_result(c1); + open c1 for select 12 from dual; + dbms_sql.return_result(c1); + open c1 for select 13 from dual; + dbms_sql.return_result(c1); + open c1 for select 14 from dual; + dbms_sql.return_result(c1); + open c1 for select 15 from dual; + dbms_sql.return_result(c1); + open c1 for select 16 from dual; + dbms_sql.return_result(c1); + open c1 for select 17 from dual; + dbms_sql.return_result(c1); + open c1 for select 18 from dual; + dbms_sql.return_result(c1); + open c1 for select 19 from dual; + dbms_sql.return_result(c1); + open c1 for select 20 from dual; + dbms_sql.return_result(c1); + open c1 for select 21 from dual; + dbms_sql.return_result(c1); + open c1 for select 22 from dual; + dbms_sql.return_result(c1); + open c1 for select 23 from dual; + dbms_sql.return_result(c1); + open c1 for select 24 from dual; + dbms_sql.return_result(c1); + open c1 for select 25 from dual; + dbms_sql.return_result(c1); + open c1 for select 26 from dual; + dbms_sql.return_result(c1); + open c1 for select 27 from dual; + dbms_sql.return_result(c1); + open c1 for select 28 from dual; + dbms_sql.return_result(c1); + open c1 for select 29 from dual; + dbms_sql.return_result(c1); + open c1 for select 30 from dual; + dbms_sql.return_result(c1); + open c1 for select 31 from dual; + dbms_sql.return_result(c1); + open c1 for select 32 from dual; + dbms_sql.return_result(c1); + open c1 for select 33 from dual; + dbms_sql.return_result(c1); + open c1 for select 34 from dual; + dbms_sql.return_result(c1); + open c1 for select 35 from dual; + dbms_sql.return_result(c1); + open c1 for select 36 from dual; + dbms_sql.return_result(c1); + open c1 for select 37 from dual; + dbms_sql.return_result(c1); + open c1 for select 38 from dual; + dbms_sql.return_result(c1); + open c1 for select 39 from dual; + dbms_sql.return_result(c1); + open c1 for select 40 from dual; + dbms_sql.return_result(c1); + open c1 for select 41 from dual; + dbms_sql.return_result(c1); + open c1 for select 42 from dual; + dbms_sql.return_result(c1); + open c1 for select 43 from dual; + dbms_sql.return_result(c1); + open c1 for select 44 from dual; + dbms_sql.return_result(c1); + open c1 for select 45 from dual; + dbms_sql.return_result(c1); + open c1 for select 46 from dual; + dbms_sql.return_result(c1); + open c1 for select 47 from dual; + dbms_sql.return_result(c1); + open c1 for select 48 from dual; + dbms_sql.return_result(c1); + open c1 for select 49 from dual; + dbms_sql.return_result(c1); + open c1 for select 50 from dual; + dbms_sql.return_result(c1); + open c1 for select 51 from dual; + dbms_sql.return_result(c1); + open c1 for select 52 from dual; + dbms_sql.return_result(c1); + open c1 for select 53 from dual; + dbms_sql.return_result(c1); + open c1 for select 54 from dual; + dbms_sql.return_result(c1); + open c1 for select 55 from dual; + dbms_sql.return_result(c1); + open c1 for select 56 from dual; + dbms_sql.return_result(c1); + open c1 for select 57 from dual; + dbms_sql.return_result(c1); + open c1 for select 58 from dual; + dbms_sql.return_result(c1); + open c1 for select 59 from dual; + dbms_sql.return_result(c1); + open c1 for select 60 from dual; + dbms_sql.return_result(c1); + open c1 for select 61 from dual; + dbms_sql.return_result(c1); + open c1 for select 62 from dual; + dbms_sql.return_result(c1); + open c1 for select 63 from dual; + dbms_sql.return_result(c1); + open c1 for select 64 from dual; + dbms_sql.return_result(c1); + open c1 for select 65 from dual; + dbms_sql.return_result(c1); + open c1 for select 66 from dual; + dbms_sql.return_result(c1); + open c1 for select 67 from dual; + dbms_sql.return_result(c1); + open c1 for select 68 from dual; + dbms_sql.return_result(c1); + open c1 for select 69 from dual; + dbms_sql.return_result(c1); + open c1 for select 70 from dual; + dbms_sql.return_result(c1); + open c1 for select 71 from dual; + dbms_sql.return_result(c1); + open c1 for select 72 from dual; + dbms_sql.return_result(c1); + open c1 for select 73 from dual; + dbms_sql.return_result(c1); + open c1 for select 74 from dual; + dbms_sql.return_result(c1); + open c1 for select 75 from dual; + dbms_sql.return_result(c1); + open c1 for select 76 from dual; + dbms_sql.return_result(c1); + open c1 for select 77 from dual; + dbms_sql.return_result(c1); + open c1 for select 78 from dual; + dbms_sql.return_result(c1); + open c1 for select 79 from dual; + dbms_sql.return_result(c1); + open c1 for select 80 from dual; + dbms_sql.return_result(c1); + open c1 for select 81 from dual; + dbms_sql.return_result(c1); + open c1 for select 82 from dual; + dbms_sql.return_result(c1); + open c1 for select 83 from dual; + dbms_sql.return_result(c1); + open c1 for select 84 from dual; + dbms_sql.return_result(c1); + open c1 for select 85 from dual; + dbms_sql.return_result(c1); + open c1 for select 86 from dual; + dbms_sql.return_result(c1); + open c1 for select 87 from dual; + dbms_sql.return_result(c1); + open c1 for select 88 from dual; + dbms_sql.return_result(c1); + open c1 for select 89 from dual; + dbms_sql.return_result(c1); + open c1 for select 90 from dual; + dbms_sql.return_result(c1); + open c1 for select 91 from dual; + dbms_sql.return_result(c1); + open c1 for select 92 from dual; + dbms_sql.return_result(c1); + open c1 for select 93 from dual; + dbms_sql.return_result(c1); + open c1 for select 94 from dual; + dbms_sql.return_result(c1); + open c1 for select 95 from dual; + dbms_sql.return_result(c1); + open c1 for select 96 from dual; + dbms_sql.return_result(c1); + open c1 for select 97 from dual; + dbms_sql.return_result(c1); + open c1 for select 98 from dual; + dbms_sql.return_result(c1); + open c1 for select 99 from dual; + dbms_sql.return_result(c1); + open c1 for select 100 from dual; + dbms_sql.return_result(c1); + open c1 for select 101 from dual; + dbms_sql.return_result(c1); + open c1 for select 102 from dual; + dbms_sql.return_result(c1); + open c1 for select 103 from dual; + dbms_sql.return_result(c1); + open c1 for select 104 from dual; + dbms_sql.return_result(c1); + open c1 for select 105 from dual; + dbms_sql.return_result(c1); + open c1 for select 106 from dual; + dbms_sql.return_result(c1); + open c1 for select 107 from dual; + dbms_sql.return_result(c1); + open c1 for select 108 from dual; + dbms_sql.return_result(c1); + open c1 for select 109 from dual; + dbms_sql.return_result(c1); + open c1 for select 110 from dual; + dbms_sql.return_result(c1); + open c1 for select 111 from dual; + dbms_sql.return_result(c1); + open c1 for select 112 from dual; + dbms_sql.return_result(c1); + open c1 for select 113 from dual; + dbms_sql.return_result(c1); + open c1 for select 114 from dual; + dbms_sql.return_result(c1); + open c1 for select 115 from dual; + dbms_sql.return_result(c1); + open c1 for select 116 from dual; + dbms_sql.return_result(c1); + open c1 for select 117 from dual; + dbms_sql.return_result(c1); + open c1 for select 118 from dual; + dbms_sql.return_result(c1); + open c1 for select 119 from dual; + dbms_sql.return_result(c1); + open c1 for select 120 from dual; + dbms_sql.return_result(c1); + open c1 for select 121 from dual; + dbms_sql.return_result(c1); + open c1 for select 122 from dual; + dbms_sql.return_result(c1); + open c1 for select 123 from dual; + dbms_sql.return_result(c1); + open c1 for select 124 from dual; + dbms_sql.return_result(c1); + open c1 for select 125 from dual; + dbms_sql.return_result(c1); + open c1 for select 126 from dual; + dbms_sql.return_result(c1); + open c1 for select 127 from dual; + dbms_sql.return_result(c1); + open c1 for select 128 from dual; + dbms_sql.return_result(c1); + open c1 for select 129 from dual; + dbms_sql.return_result(c1); + open c1 for select 130 from dual; + dbms_sql.return_result(c1); + open c1 for select 131 from dual; + dbms_sql.return_result(c1); + open c1 for select 132 from dual; + dbms_sql.return_result(c1); + open c1 for select 133 from dual; + dbms_sql.return_result(c1); + open c1 for select 134 from dual; + dbms_sql.return_result(c1); + open c1 for select 135 from dual; + dbms_sql.return_result(c1); + open c1 for select 136 from dual; + dbms_sql.return_result(c1); + open c1 for select 137 from dual; + dbms_sql.return_result(c1); + open c1 for select 138 from dual; + dbms_sql.return_result(c1); + open c1 for select 139 from dual; + dbms_sql.return_result(c1); + open c1 for select 140 from dual; + dbms_sql.return_result(c1); + open c1 for select 141 from dual; + dbms_sql.return_result(c1); + open c1 for select 142 from dual; + dbms_sql.return_result(c1); + open c1 for select 143 from dual; + dbms_sql.return_result(c1); + open c1 for select 144 from dual; + dbms_sql.return_result(c1); + open c1 for select 145 from dual; + dbms_sql.return_result(c1); + open c1 for select 146 from dual; + dbms_sql.return_result(c1); + open c1 for select 147 from dual; + dbms_sql.return_result(c1); + open c1 for select 148 from dual; + dbms_sql.return_result(c1); + open c1 for select 149 from dual; + dbms_sql.return_result(c1); + open c1 for select 150 from dual; + dbms_sql.return_result(c1); + open c1 for select 151 from dual; + dbms_sql.return_result(c1); + open c1 for select 152 from dual; + dbms_sql.return_result(c1); + open c1 for select 153 from dual; + dbms_sql.return_result(c1); + open c1 for select 154 from dual; + dbms_sql.return_result(c1); + open c1 for select 155 from dual; + dbms_sql.return_result(c1); + open c1 for select 156 from dual; + dbms_sql.return_result(c1); + open c1 for select 157 from dual; + dbms_sql.return_result(c1); + open c1 for select 158 from dual; + dbms_sql.return_result(c1); + open c1 for select 159 from dual; + dbms_sql.return_result(c1); + open c1 for select 160 from dual; + dbms_sql.return_result(c1); + open c1 for select 161 from dual; + dbms_sql.return_result(c1); + open c1 for select 162 from dual; + dbms_sql.return_result(c1); + open c1 for select 163 from dual; + dbms_sql.return_result(c1); + open c1 for select 164 from dual; + dbms_sql.return_result(c1); + open c1 for select 165 from dual; + dbms_sql.return_result(c1); + open c1 for select 166 from dual; + dbms_sql.return_result(c1); + open c1 for select 167 from dual; + dbms_sql.return_result(c1); + open c1 for select 168 from dual; + dbms_sql.return_result(c1); + open c1 for select 169 from dual; + dbms_sql.return_result(c1); + open c1 for select 170 from dual; + dbms_sql.return_result(c1); + open c1 for select 171 from dual; + dbms_sql.return_result(c1); + open c1 for select 172 from dual; + dbms_sql.return_result(c1); + open c1 for select 173 from dual; + dbms_sql.return_result(c1); + open c1 for select 174 from dual; + dbms_sql.return_result(c1); + open c1 for select 175 from dual; + dbms_sql.return_result(c1); + open c1 for select 176 from dual; + dbms_sql.return_result(c1); + open c1 for select 177 from dual; + dbms_sql.return_result(c1); + open c1 for select 178 from dual; + dbms_sql.return_result(c1); + open c1 for select 179 from dual; + dbms_sql.return_result(c1); + open c1 for select 180 from dual; + dbms_sql.return_result(c1); + open c1 for select 181 from dual; + dbms_sql.return_result(c1); + open c1 for select 182 from dual; + dbms_sql.return_result(c1); + open c1 for select 183 from dual; + dbms_sql.return_result(c1); + open c1 for select 184 from dual; + dbms_sql.return_result(c1); + open c1 for select 185 from dual; + dbms_sql.return_result(c1); + open c1 for select 186 from dual; + dbms_sql.return_result(c1); + open c1 for select 187 from dual; + dbms_sql.return_result(c1); + open c1 for select 188 from dual; + dbms_sql.return_result(c1); + open c1 for select 189 from dual; + dbms_sql.return_result(c1); + open c1 for select 190 from dual; + dbms_sql.return_result(c1); + open c1 for select 191 from dual; + dbms_sql.return_result(c1); + open c1 for select 192 from dual; + dbms_sql.return_result(c1); + open c1 for select 193 from dual; + dbms_sql.return_result(c1); + open c1 for select 194 from dual; + dbms_sql.return_result(c1); + open c1 for select 195 from dual; + dbms_sql.return_result(c1); + open c1 for select 196 from dual; + dbms_sql.return_result(c1); + open c1 for select 197 from dual; + dbms_sql.return_result(c1); + open c1 for select 198 from dual; + dbms_sql.return_result(c1); + open c1 for select 199 from dual; + dbms_sql.return_result(c1); + open c1 for select 200 from dual; + dbms_sql.return_result(c1); + open c1 for select 201 from dual; + dbms_sql.return_result(c1); + open c1 for select 202 from dual; + dbms_sql.return_result(c1); + open c1 for select 203 from dual; + dbms_sql.return_result(c1); + open c1 for select 204 from dual; + dbms_sql.return_result(c1); + open c1 for select 205 from dual; + dbms_sql.return_result(c1); + open c1 for select 206 from dual; + dbms_sql.return_result(c1); + open c1 for select 207 from dual; + dbms_sql.return_result(c1); + open c1 for select 208 from dual; + dbms_sql.return_result(c1); + open c1 for select 209 from dual; + dbms_sql.return_result(c1); + open c1 for select 210 from dual; + dbms_sql.return_result(c1); + open c1 for select 211 from dual; + dbms_sql.return_result(c1); + open c1 for select 212 from dual; + dbms_sql.return_result(c1); + open c1 for select 213 from dual; + dbms_sql.return_result(c1); + open c1 for select 214 from dual; + dbms_sql.return_result(c1); + open c1 for select 215 from dual; + dbms_sql.return_result(c1); + open c1 for select 216 from dual; + dbms_sql.return_result(c1); + open c1 for select 217 from dual; + dbms_sql.return_result(c1); + open c1 for select 218 from dual; + dbms_sql.return_result(c1); + open c1 for select 219 from dual; + dbms_sql.return_result(c1); + open c1 for select 220 from dual; + dbms_sql.return_result(c1); + open c1 for select 221 from dual; + dbms_sql.return_result(c1); + open c1 for select 222 from dual; + dbms_sql.return_result(c1); + open c1 for select 223 from dual; + dbms_sql.return_result(c1); + open c1 for select 224 from dual; + dbms_sql.return_result(c1); + open c1 for select 225 from dual; + dbms_sql.return_result(c1); + open c1 for select 226 from dual; + dbms_sql.return_result(c1); + open c1 for select 227 from dual; + dbms_sql.return_result(c1); + open c1 for select 228 from dual; + dbms_sql.return_result(c1); + open c1 for select 229 from dual; + dbms_sql.return_result(c1); + open c1 for select 230 from dual; + dbms_sql.return_result(c1); + open c1 for select 231 from dual; + dbms_sql.return_result(c1); + open c1 for select 232 from dual; + dbms_sql.return_result(c1); + open c1 for select 233 from dual; + dbms_sql.return_result(c1); + open c1 for select 234 from dual; + dbms_sql.return_result(c1); + open c1 for select 235 from dual; + dbms_sql.return_result(c1); + open c1 for select 236 from dual; + dbms_sql.return_result(c1); + open c1 for select 237 from dual; + dbms_sql.return_result(c1); + open c1 for select 238 from dual; + dbms_sql.return_result(c1); + open c1 for select 239 from dual; + dbms_sql.return_result(c1); + open c1 for select 240 from dual; + dbms_sql.return_result(c1); + open c1 for select 241 from dual; + dbms_sql.return_result(c1); + open c1 for select 242 from dual; + dbms_sql.return_result(c1); + open c1 for select 243 from dual; + dbms_sql.return_result(c1); + open c1 for select 244 from dual; + dbms_sql.return_result(c1); + open c1 for select 245 from dual; + dbms_sql.return_result(c1); + open c1 for select 246 from dual; + dbms_sql.return_result(c1); + open c1 for select 247 from dual; + dbms_sql.return_result(c1); + open c1 for select 248 from dual; + dbms_sql.return_result(c1); + open c1 for select 249 from dual; + dbms_sql.return_result(c1); + open c1 for select 250 from dual; + dbms_sql.return_result(c1); + open c1 for select 251 from dual; + dbms_sql.return_result(c1); + open c1 for select 252 from dual; + dbms_sql.return_result(c1); + open c1 for select 253 from dual; + dbms_sql.return_result(c1); + open c1 for select 254 from dual; + dbms_sql.return_result(c1); + open c1 for select 255 from dual; + dbms_sql.return_result(c1); + open c1 for select 256 from dual; + dbms_sql.return_result(c1); + open c1 for select 257 from dual; + dbms_sql.return_result(c1); + open c1 for select 258 from dual; + dbms_sql.return_result(c1); + open c1 for select 259 from dual; + dbms_sql.return_result(c1); + open c1 for select 260 from dual; + dbms_sql.return_result(c1); + open c1 for select 261 from dual; + dbms_sql.return_result(c1); + open c1 for select 262 from dual; + dbms_sql.return_result(c1); + open c1 for select 263 from dual; + dbms_sql.return_result(c1); + open c1 for select 264 from dual; + dbms_sql.return_result(c1); + open c1 for select 265 from dual; + dbms_sql.return_result(c1); + open c1 for select 266 from dual; + dbms_sql.return_result(c1); + open c1 for select 267 from dual; + dbms_sql.return_result(c1); + open c1 for select 268 from dual; + dbms_sql.return_result(c1); + open c1 for select 269 from dual; + dbms_sql.return_result(c1); + open c1 for select 270 from dual; + dbms_sql.return_result(c1); + open c1 for select 271 from dual; + dbms_sql.return_result(c1); + open c1 for select 272 from dual; + dbms_sql.return_result(c1); + open c1 for select 273 from dual; + dbms_sql.return_result(c1); + open c1 for select 274 from dual; + dbms_sql.return_result(c1); + open c1 for select 275 from dual; + dbms_sql.return_result(c1); + end;"; + +// Run Test + +echo "Test 1\n"; +$s = oci_parse($c, $stmt); +oci_execute($s); + +while (($row = oci_fetch_row($s)) != false) { + foreach ($row as $item) { + echo " ".$item; + } + echo "\n"; +} + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100 + 101 + 102 + 103 + 104 + 105 + 106 + 107 + 108 + 109 + 110 + 111 + 112 + 113 + 114 + 115 + 116 + 117 + 118 + 119 + 120 + 121 + 122 + 123 + 124 + 125 + 126 + 127 + 128 + 129 + 130 + 131 + 132 + 133 + 134 + 135 + 136 + 137 + 138 + 139 + 140 + 141 + 142 + 143 + 144 + 145 + 146 + 147 + 148 + 149 + 150 + 151 + 152 + 153 + 154 + 155 + 156 + 157 + 158 + 159 + 160 + 161 + 162 + 163 + 164 + 165 + 166 + 167 + 168 + 169 + 170 + 171 + 172 + 173 + 174 + 175 + 176 + 177 + 178 + 179 + 180 + 181 + 182 + 183 + 184 + 185 + 186 + 187 + 188 + 189 + 190 + 191 + 192 + 193 + 194 + 195 + 196 + 197 + 198 + 199 + 200 + 201 + 202 + 203 + 204 + 205 + 206 + 207 + 208 + 209 + 210 + 211 + 212 + 213 + 214 + 215 + 216 + 217 + 218 + 219 + 220 + 221 + 222 + 223 + 224 + 225 + 226 + 227 + 228 + 229 + 230 + 231 + 232 + 233 + 234 + 235 + 236 + 237 + 238 + 239 + 240 + 241 + 242 + 243 + 244 + 245 + 246 + 247 + 248 + 249 + 250 + 251 + 252 + 253 + 254 + 255 + 256 + 257 + 258 + 259 + 260 + 261 + 262 + 263 + 264 + 265 + 266 + 267 + 268 + 269 + 270 + 271 + 272 + 273 + 274 + 275 +===DONE=== diff --git a/ext/oci8/tests/imp_res_call_error.phpt b/ext/oci8/tests/imp_res_call_error.phpt new file mode 100644 index 0000000000..8b0fa78db9 --- /dev/null +++ b/ext/oci8/tests/imp_res_call_error.phpt @@ -0,0 +1,61 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: using SQL 'CALL' +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$stmtarray = array( + "create or replace procedure imp_res_call_err_proc as + c1 sys_refcursor; + begin + open c1 for select * from dual; + dbms_sql.return_result(c1); + open c1 for select * from dual; + dbms_sql.return_result (c1); + end;"); + +oci8_test_sql_execute($c, $stmtarray); + +// Run Test + +echo "Test 1\n"; + +$s = oci_parse($c, "call imp_res_call_err_proc()"); +oci_execute($s); + +// Clean up + +$stmtarray = array( + "drop procedure imp_res_call_err_proc" +); + +oci8_test_sql_execute($c, $stmtarray); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 + +Warning: oci_execute(): ORA-29478: %s +ORA-06512: at "SYS.DBMS_SQL", line %d +ORA-06512: at "SYS.DBMS_SQL", line %d +ORA-06512: at "SYSTEM.IMP_RES_CALL_ERR_PROC", line %d in %simp_res_call_error.php on line %d +===DONE=== diff --git a/ext/oci8/tests/imp_res_cancel.phpt b/ext/oci8/tests/imp_res_cancel.phpt new file mode 100644 index 0000000000..663d630dfb --- /dev/null +++ b/ext/oci8/tests/imp_res_cancel.phpt @@ -0,0 +1,68 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: oci_cancel +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +$stmtarray = array( + "create or replace procedure imp_res_cancel_proc as + c1 sys_refcursor; + c2 sys_refcursor; + begin + open c1 for select 1 from dual union all select 2 from dual; + dbms_sql.return_result(c1); + open c2 for select 3 from dual; + dbms_sql.return_result (c2); + end;" +); + +oci8_test_sql_execute($c, $stmtarray); + +// Run Test + +echo "Test 1\n"; +$s = oci_parse($c, "begin imp_res_cancel_proc(); end;"); +oci_execute($s); +while (($row = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_NULLS)) != false) { + foreach ($row as $item) { + echo " ".$item; + } + echo "\n"; + var_dump(oci_cancel($s)); +} + +// Clean up + +$stmtarray = array( + "drop procedure imp_res_cancel_proc" +); + +oci8_test_sql_execute($c, $stmtarray); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 + 1 +bool(true) + 2 +bool(true) + 3 +bool(true) +===DONE=== diff --git a/ext/oci8/tests/imp_res_close.phpt b/ext/oci8/tests/imp_res_close.phpt new file mode 100644 index 0000000000..01ac2c75e0 --- /dev/null +++ b/ext/oci8/tests/imp_res_close.phpt @@ -0,0 +1,69 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: oci_free_statement #1 +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$stmtarray = array( + "create or replace procedure imp_res_close_proc as + c1 sys_refcursor; + begin + open c1 for select 1 from dual union all select 2 from dual order by 1; + dbms_sql.return_result(c1); + open c1 for select 3 from dual union all select 4 from dual order by 1; + dbms_sql.return_result(c1); + open c1 for select 5 from dual union all select 6 from dual order by 1; + dbms_sql.return_result(c1); + end;" +); + +oci8_test_sql_execute($c, $stmtarray); + +// Run Test + +echo "Test 1\n"; +$s = oci_parse($c, "begin imp_res_close_proc(); end;"); +oci_execute($s); +while (($row = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_NULLS)) != false) { + foreach ($row as $item) { + echo " ".$item; + } + echo "\n"; + oci_free_statement($s); // Free the implicit result handle +} + +// Clean up + +$stmtarray = array( + "drop procedure imp_res_close_proc" +); + +oci8_test_sql_execute($c, $stmtarray); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 + 1 + 2 + +Warning: oci_fetch_array(): %d is not a valid oci8 statement resource in %simp_res_close.php on line %d +===DONE=== diff --git a/ext/oci8/tests/imp_res_cursor.phpt b/ext/oci8/tests/imp_res_cursor.phpt new file mode 100644 index 0000000000..cac0a5d1c0 --- /dev/null +++ b/ext/oci8/tests/imp_res_cursor.phpt @@ -0,0 +1,99 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: nested cursor +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$stmtarray = array( + "drop table imp_res_cursor_tab_1", + "create table imp_res_cursor_tab_1 (c1 number, c2 varchar2(10))", + "insert into imp_res_cursor_tab_1 values (1, 'abcde')", + "insert into imp_res_cursor_tab_1 values (2, 'fghij')", + "insert into imp_res_cursor_tab_1 values (3, 'klmno')", + + "drop table imp_res_cursor_tab_2", + "create table imp_res_cursor_tab_2 (c3 varchar2(1))", + "insert into imp_res_cursor_tab_2 values ('t')", + "insert into imp_res_cursor_tab_2 values ('u')", + "insert into imp_res_cursor_tab_2 values ('v')", + + "create or replace procedure imp_res_cursor_proc as + c1 sys_refcursor; + begin + open c1 for select * from dual; + dbms_sql.return_result (c1); + + open c1 for select cursor(select c1, c2 from imp_res_cursor_tab_1 order by 1) as curs from dual; + dbms_sql.return_result(c1); + + open c1 for select * from imp_res_cursor_tab_2 where rownum < 3 order by 1; + dbms_sql.return_result(c1); + end;" +); + +oci8_test_sql_execute($c, $stmtarray); + +function do_fetch($s) +{ + while (($row = oci_fetch_assoc($s)) != false) { + foreach ($row as $item) { + if (is_resource($item)) { // Nested cursor + oci_execute($item); + do_fetch($item); + } else { + echo " ".$item; + } + } + echo "\n"; + } +} + +// Run Test + +echo "Test 1\n"; + +$s = oci_parse($c, "begin imp_res_cursor_proc(); end;"); +oci_execute($s); + +do_fetch($s); + +// Clean up + +$stmtarray = array( + "drop procedure imp_res_cursor_proc", + "drop table imp_res_cursor_tab_1", + "drop table imp_res_cursor_tab_2" +); + +oci8_test_sql_execute($c, $stmtarray); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 + X + 1 abcde + 2 fghij + 3 klmno + + t + u +===DONE=== diff --git a/ext/oci8/tests/imp_res_dbmsoutput.phpt b/ext/oci8/tests/imp_res_dbmsoutput.phpt new file mode 100644 index 0000000000..8c9808d96c --- /dev/null +++ b/ext/oci8/tests/imp_res_dbmsoutput.phpt @@ -0,0 +1,136 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: interleaved with DBMS_OUTPUT +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$stmtarray = array( + "drop table imp_res_dbmsoutput_tab_1", + "create table imp_res_dbmsoutput_tab_1 (c1 number, c2 varchar2(10))", + "insert into imp_res_dbmsoutput_tab_1 values (1, 'abcde')", + "insert into imp_res_dbmsoutput_tab_1 values (2, 'fghij')", + "insert into imp_res_dbmsoutput_tab_1 values (3, 'klmno')", + + "drop table imp_res_dbmsoutput_tab_2", + "create table imp_res_dbmsoutput_tab_2 (c3 varchar2(1))", + "insert into imp_res_dbmsoutput_tab_2 values ('t')", + "insert into imp_res_dbmsoutput_tab_2 values ('u')", + "insert into imp_res_dbmsoutput_tab_2 values ('v')", + + "create or replace procedure imp_res_dbmsoutput_proc as + c1 sys_refcursor; + begin + dbms_output.put_line('dbms_output Line 1'); + open c1 for select * from imp_res_dbmsoutput_tab_1 order by 1; + dbms_sql.return_result(c1); + dbms_output.put_line('dbms_output Line 2'); + open c1 for select * from imp_res_dbmsoutput_tab_2 order by 1; + dbms_sql.return_result(c1); + end;" +); + +oci8_test_sql_execute($c, $stmtarray); + +function setserveroutputon($c) +{ + $s = oci_parse($c, "begin dbms_output.enable(null); end;"); + oci_execute($s); +} + +function getdbmsoutput_do($c) +{ + $s = oci_parse($c, "begin dbms_output.get_line(:ln, :st); end;"); + oci_bind_by_name($s, ":ln", $ln, 100); + oci_bind_by_name($s, ":st", $st, -1, SQLT_INT); + $res = false; + while (($succ = oci_execute($s)) && !$st) { + $res[] = $ln; // append each line to the array + } + return $res; +} + +setserveroutputon($c); + +// Run Test + +echo "Test 1\n"; +$s = oci_parse($c, "begin imp_res_dbmsoutput_proc(); end;"); +oci_execute($s); +var_dump(getdbmsoutput_do($c)); +while (($row = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_NULLS)) != false) { + foreach ($row as $item) { + echo " ".$item; + } + echo "\n"; +} + +echo "\nTest 2\n"; +$s = oci_parse($c, "begin imp_res_dbmsoutput_proc(); end;"); +oci_execute($s); +while (($row = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_NULLS)) != false) { + foreach ($row as $item) { + echo " ".$item; + } + echo "\n"; +} +var_dump(getdbmsoutput_do($c)); + +// Clean up + +$stmtarray = array( + "drop procedure imp_res_dbmsoutput_proc", + "drop table imp_res_dbmsoutput_tab_1", + "drop table imp_res_dbmsoutput_tab_2" +); + +oci8_test_sql_execute($c, $stmtarray); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 +array(2) { + [0]=> + string(18) "dbms_output Line 1" + [1]=> + string(18) "dbms_output Line 2" +} + 1 abcde + 2 fghij + 3 klmno + t + u + v + +Test 2 + 1 abcde + 2 fghij + 3 klmno + t + u + v +array(2) { + [0]=> + string(18) "dbms_output Line 1" + [1]=> + string(18) "dbms_output Line 2" +} +===DONE=== diff --git a/ext/oci8/tests/imp_res_field.phpt b/ext/oci8/tests/imp_res_field.phpt new file mode 100644 index 0000000000..54b8295cf9 --- /dev/null +++ b/ext/oci8/tests/imp_res_field.phpt @@ -0,0 +1,227 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: field tests +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$stmtarray = array( + "drop table imp_res_field_tab_1", + "create table imp_res_field_tab_1 (c1_number number, c2_varchar210 varchar2(10))", + "insert into imp_res_field_tab_1 values (1111, 'abcde')", + + "drop table imp_res_field_tab_2", + "create table imp_res_field_tab_2 (c3_varchar21 varchar2(4))", + "insert into imp_res_field_tab_2 values ('tttt')", + + "drop table imp_res_field_tab_3", + "create table imp_res_field_tab_3 (c4_number52 number(5,2))", + "insert into imp_res_field_tab_3 values (33)", + "insert into imp_res_field_tab_3 values (NULL)", + + "create or replace procedure imp_res_field_proc as + c1 sys_refcursor; + begin + open c1 for select * from imp_res_field_tab_1 order by 1; + dbms_sql.return_result(c1); + + open c1 for select * from imp_res_field_tab_2 order by 1; + dbms_sql.return_result(c1); + + open c1 for select * from imp_res_field_tab_3 order by 1; + dbms_sql.return_result(c1); + end;" +); + +oci8_test_sql_execute($c, $stmtarray); + +function print_fields($s) +{ + echo "num fields : " . oci_num_fields($s) . "\n"; + for ($i = 1; $i <= oci_num_fields($s); $i++) { + $is_null = oci_field_is_null($s, $i) ? "T" : "F"; + $name = oci_field_name($s, $i); + $precision = oci_field_precision($s, $i); + $scale = oci_field_scale($s, $i); + $size = oci_field_size($s, $i); + $typeraw = oci_field_type_raw($s, $i); + $type = oci_field_type($s, $i); + echo "$name\t: is_null $is_null, precision $precision, scale $scale, size $size, typeraw $typeraw, type $type\n"; + } +} + +// Run Test + +echo "Test 1 - can't get IRS fields from parent\n"; +$s = oci_parse($c, "begin imp_res_field_proc(); end;"); +oci_execute($s); +print_fields($s); + +echo "\nTest 2 - can't get IRS fields from parent when fetching\n"; +$s = oci_parse($c, "begin imp_res_field_proc(); end;"); +oci_execute($s); +while (($r = oci_fetch_row($s))) { + var_dump($r); + print_fields($s); +} + +echo "\nTest 3 - get IRS fields\n"; +$s = oci_parse($c, "begin imp_res_field_proc(); end;"); +oci_execute($s); +while (($s1 = oci_get_implicit_resultset($s))) { + print_fields($s1); +} + +echo "\nTest 4 - get IRS fields before fetching rows\n"; +$s = oci_parse($c, "begin imp_res_field_proc(); end;"); +oci_execute($s); +$i = 0; +while (($s1 = oci_get_implicit_resultset($s))) { + echo "===> Result set ".++$i."\n"; + print_fields($s1); + while (($r = oci_fetch_row($s1)) !== false) { + var_dump($r); + } +} + +echo "\nTest 5 - get IRS fields when fetching rows\n"; +$s = oci_parse($c, "begin imp_res_field_proc(); end;"); +oci_execute($s); +$i = 0; +while (($s1 = oci_get_implicit_resultset($s))) { + echo "===> Result set ".++$i."\n"; + while (($r = oci_fetch_row($s1)) !== false) { + var_dump($r); + print_fields($s1); + } +} + +// Clean up + +$stmtarray = array( + "drop procedure imp_res_field_proc", + "drop table imp_res_field_tab_1", + "drop table imp_res_field_tab_2", + "drop table imp_res_field_tab_3" +); + +oci8_test_sql_execute($c, $stmtarray); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 - can't get IRS fields from parent +num fields : 0 + +Test 2 - can't get IRS fields from parent when fetching +array(2) { + [0]=> + string(4) "1111" + [1]=> + string(5) "abcde" +} +num fields : 0 +array(1) { + [0]=> + string(4) "tttt" +} +num fields : 0 +array(1) { + [0]=> + string(2) "33" +} +num fields : 0 +array(1) { + [0]=> + NULL +} +num fields : 0 + +Test 3 - get IRS fields +num fields : 2 +C1_NUMBER : is_null F, precision 0, scale -127, size 22, typeraw 2, type NUMBER +C2_VARCHAR210 : is_null F, precision 0, scale 0, size 10, typeraw 1, type VARCHAR2 +num fields : 1 +C3_VARCHAR21 : is_null F, precision 0, scale 0, size 4, typeraw 1, type VARCHAR2 +num fields : 1 +C4_NUMBER52 : is_null F, precision 5, scale 2, size 22, typeraw 2, type NUMBER + +Test 4 - get IRS fields before fetching rows +===> Result set 1 +num fields : 2 +C1_NUMBER : is_null F, precision 0, scale -127, size 22, typeraw 2, type NUMBER +C2_VARCHAR210 : is_null F, precision 0, scale 0, size 10, typeraw 1, type VARCHAR2 +array(2) { + [0]=> + string(4) "1111" + [1]=> + string(5) "abcde" +} +===> Result set 2 +num fields : 1 +C3_VARCHAR21 : is_null F, precision 0, scale 0, size 4, typeraw 1, type VARCHAR2 +array(1) { + [0]=> + string(4) "tttt" +} +===> Result set 3 +num fields : 1 +C4_NUMBER52 : is_null F, precision 5, scale 2, size 22, typeraw 2, type NUMBER +array(1) { + [0]=> + string(2) "33" +} +array(1) { + [0]=> + NULL +} + +Test 5 - get IRS fields when fetching rows +===> Result set 1 +array(2) { + [0]=> + string(4) "1111" + [1]=> + string(5) "abcde" +} +num fields : 2 +C1_NUMBER : is_null F, precision 0, scale -127, size 22, typeraw 2, type NUMBER +C2_VARCHAR210 : is_null F, precision 0, scale 0, size 10, typeraw 1, type VARCHAR2 +===> Result set 2 +array(1) { + [0]=> + string(4) "tttt" +} +num fields : 1 +C3_VARCHAR21 : is_null F, precision 0, scale 0, size 4, typeraw 1, type VARCHAR2 +===> Result set 3 +array(1) { + [0]=> + string(2) "33" +} +num fields : 1 +C4_NUMBER52 : is_null F, precision 5, scale 2, size 22, typeraw 2, type NUMBER +array(1) { + [0]=> + NULL +} +num fields : 1 +C4_NUMBER52 : is_null T, precision 5, scale 2, size 22, typeraw 2, type NUMBER +===DONE=== diff --git a/ext/oci8/tests/imp_res_func_error.phpt b/ext/oci8/tests/imp_res_func_error.phpt new file mode 100644 index 0000000000..73c0557930 --- /dev/null +++ b/ext/oci8/tests/imp_res_func_error.phpt @@ -0,0 +1,67 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: test with a PL/SQL function +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$stmtarray = array( + "create or replace function imp_res_func_error return number as + c1 sys_refcursor; + begin + open c1 for select * from dual; + dbms_sql.return_result(c1); + return 1234; + end;" +); + +oci8_test_sql_execute($c, $stmtarray); + +// Run Test + +echo "Test 1\n"; +$s = oci_parse($c, "select imp_res_func_error from dual"); +$r = oci_execute($s); // This will fail with ORA-29478 in Oracle 12.1 +if ($r) { + while (($row = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_NULLS)) != false) { + foreach ($row as $item) { + echo " ".$item; + } + echo "\n"; + } +} +// Clean up + +$stmtarray = array( + "drop function imp_res_func_error", +); + +oci8_test_sql_execute($c, $stmtarray); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 + +Warning: oci_execute(): ORA-29478: %s +ORA-06512: %s +ORA-06512: %s +ORA-06512: %s +===DONE=== diff --git a/ext/oci8/tests/imp_res_get_1.phpt b/ext/oci8/tests/imp_res_get_1.phpt new file mode 100644 index 0000000000..665f773b57 --- /dev/null +++ b/ext/oci8/tests/imp_res_get_1.phpt @@ -0,0 +1,109 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: basic test +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$stmtarray = array( + "drop table imp_res_get_1_tab_1", + "create table imp_res_get_1_tab_1 (c1 number, c2 varchar2(10))", + "insert into imp_res_get_1_tab_1 values (1, 'abcde')", + "insert into imp_res_get_1_tab_1 values (2, 'fghij')", + "insert into imp_res_get_1_tab_1 values (3, 'klmno')", + + "drop table imp_res_get_1_tab_2", + "create table imp_res_get_1_tab_2 (c3 varchar2(1))", + "insert into imp_res_get_1_tab_2 values ('t')", + "insert into imp_res_get_1_tab_2 values ('u')", + "insert into imp_res_get_1_tab_2 values ('v')", + + "create or replace procedure imp_res_get_1_proc as + c1 sys_refcursor; + begin + open c1 for select * from imp_res_get_1_tab_1 order by 1; + dbms_sql.return_result(c1); + + open c1 for select * from imp_res_get_1_tab_2 where rownum < 3 order by 1; + dbms_sql.return_result(c1); + + open c1 for select * from dual; + dbms_sql.return_result (c1); + end;" +); + +oci8_test_sql_execute($c, $stmtarray); + +// Run Test + +echo "Test 1\n"; +$s = oci_parse($c, "begin imp_res_get_1_proc(); end;"); +oci_execute($s); +while (($s1 = oci_get_implicit_resultset($s))) { + while (($row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS)) != false) { + foreach ($row as $item) { + echo " ".$item; + } + echo "\n"; + } +} + +echo "\nTest 2 - with execute\n"; +$s = oci_parse($c, "begin imp_res_get_1_proc(); end;"); +oci_execute($s); +while (($s1 = oci_get_implicit_resultset($s))) { + oci_execute($s1); // no op + while (($row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS)) != false) { + foreach ($row as $item) { + echo " ".$item; + } + echo "\n"; + } +} + +// Clean up + +$stmtarray = array( + "drop procedure imp_res_get_1_proc", + "drop table imp_res_get_1_tab_1", + "drop table imp_res_get_1_tab_2" +); + +oci8_test_sql_execute($c, $stmtarray); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 + 1 abcde + 2 fghij + 3 klmno + t + u + X + +Test 2 - with execute + 1 abcde + 2 fghij + 3 klmno + t + u + X +===DONE=== diff --git a/ext/oci8/tests/imp_res_get_2.phpt b/ext/oci8/tests/imp_res_get_2.phpt new file mode 100644 index 0000000000..b20b8dd397 --- /dev/null +++ b/ext/oci8/tests/imp_res_get_2.phpt @@ -0,0 +1,107 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: similar to imp_res_get_1 but with unrolled loop +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$stmtarray = array( + "drop table imp_res_get_2_tab_1", + "create table imp_res_get_2_tab_1 (c1 number, c2 varchar2(10))", + "insert into imp_res_get_2_tab_1 values (1, 'abcde')", + "insert into imp_res_get_2_tab_1 values (2, 'fghij')", + "insert into imp_res_get_2_tab_1 values (3, 'klmno')", + + "drop table imp_res_get_2_tab_2", + "create table imp_res_get_2_tab_2 (c3 varchar2(1))", + "insert into imp_res_get_2_tab_2 values ('t')", + "insert into imp_res_get_2_tab_2 values ('u')", + "insert into imp_res_get_2_tab_2 values ('v')", + + "create or replace procedure imp_res_get_2_proc as + c1 sys_refcursor; + begin + open c1 for select * from imp_res_get_2_tab_1 order by 1; + dbms_sql.return_result(c1); + + open c1 for select * from imp_res_get_2_tab_2 where rownum < 3 order by 1; + dbms_sql.return_result(c1); + + open c1 for select * from dual; + dbms_sql.return_result (c1); + end;" +); + +oci8_test_sql_execute($c, $stmtarray); + +// Run Test + +echo "Test 1\n"; + +$s = oci_parse($c, "begin imp_res_get_2_proc(); end;"); +oci_execute($s); + +$s1 = oci_get_implicit_resultset($s); +while (($row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS))) { + foreach ($row as $item) { + echo " ".$item; + } + echo "\n"; +} + +$s2 = oci_get_implicit_resultset($s); +while (($row = oci_fetch_array($s2, OCI_ASSOC+OCI_RETURN_NULLS))) { + foreach ($row as $item) { + echo " ".$item; + } + echo "\n"; +} +oci_free_statement($s2); + +$s3 = oci_get_implicit_resultset($s); +while (($row = oci_fetch_array($s3, OCI_ASSOC+OCI_RETURN_NULLS))) { + foreach ($row as $item) { + echo " ".$item; + } + echo "\n"; +} +oci_free_statement($s3); + +// Clean up + +$stmtarray = array( + "drop procedure imp_res_get_2_proc", + "drop table imp_res_get_2_tab_1", + "drop table imp_res_get_2_tab_2" +); + +oci8_test_sql_execute($c, $stmtarray); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 + 1 abcde + 2 fghij + 3 klmno + t + u + X +===DONE=== diff --git a/ext/oci8/tests/imp_res_get_3.phpt b/ext/oci8/tests/imp_res_get_3.phpt new file mode 100644 index 0000000000..15b2efaef0 --- /dev/null +++ b/ext/oci8/tests/imp_res_get_3.phpt @@ -0,0 +1,267 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: basic test 3 +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--INI-- +oci8.statement_cache_size = 0 +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$stmtarray = array( + "drop table imp_res_get_3_tab_1", + "create table imp_res_get_3_tab_1 (c1 number, c2 varchar2(10))", + "insert into imp_res_get_3_tab_1 values (1, 'abcde')", + "insert into imp_res_get_3_tab_1 values (2, 'fghij')", + "insert into imp_res_get_3_tab_1 values (3, 'klmno')", + + "drop table imp_res_get_3_tab_2", + "create table imp_res_get_3_tab_2 (c3 varchar2(1))", + "insert into imp_res_get_3_tab_2 values ('t')", + "insert into imp_res_get_3_tab_2 values ('u')", + "insert into imp_res_get_3_tab_2 values ('v')", + + "create or replace procedure imp_res_get_3_proc as + c1 sys_refcursor; + i pls_integer; + begin + for i in 1..30 loop -- if this value is too big for Oracle's open_cursors, calling imp_res_get_3_proc() can fail with ORA-1000 + open c1 for select * from imp_res_get_3_tab_1 order by 1; + dbms_sql.return_result(c1); + open c1 for select * from imp_res_get_3_tab_2 where rownum < 3 order by 1; + dbms_sql.return_result(c1); + open c1 for select * from dual; + dbms_sql.return_result (c1); + end loop; + end;" +); + +oci8_test_sql_execute($c, $stmtarray); + +// Run Test + +echo "Test 1\n"; + +$s = oci_parse($c, "begin imp_res_get_3_proc(); end;"); +oci_execute($s); + +while (($s1 = oci_get_implicit_resultset($s))) { + while (($row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS)) != false) { + foreach ($row as $item) { + echo " ".$item; + } + echo "\n"; + } +} + +// Clean up + +$stmtarray = array( + "drop procedure imp_res_get_3_proc", + "drop table imp_res_get_3_tab_1", + "drop table imp_res_get_3_tab_2" +); + +oci8_test_sql_execute($c, $stmtarray); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X + 1 abcde + 2 fghij + 3 klmno + t + u + X +===DONE=== diff --git a/ext/oci8/tests/imp_res_get_4.phpt b/ext/oci8/tests/imp_res_get_4.phpt new file mode 100644 index 0000000000..ea7fb8775a --- /dev/null +++ b/ext/oci8/tests/imp_res_get_4.phpt @@ -0,0 +1,146 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: interleaved fetches +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$stmtarray = array( + "drop table imp_res_get_4_tab_1", + "create table imp_res_get_4_tab_1 (c1 number, c2 varchar2(10))", + "insert into imp_res_get_4_tab_1 values (1, 'abcde')", + "insert into imp_res_get_4_tab_1 values (2, 'fghij')", + "insert into imp_res_get_4_tab_1 values (3, 'klmno')", + + "drop table imp_res_get_4_tab_2", + "create table imp_res_get_4_tab_2 (c3 varchar2(1))", + "insert into imp_res_get_4_tab_2 values ('t')", + "insert into imp_res_get_4_tab_2 values ('u')", + "insert into imp_res_get_4_tab_2 values ('v')", + + "create or replace procedure imp_res_get_4_proc as + c1 sys_refcursor; + begin + open c1 for select * from imp_res_get_4_tab_1 order by 1; + dbms_sql.return_result(c1); + + open c1 for select * from imp_res_get_4_tab_2 order by 1; + dbms_sql.return_result(c1); + end;" +); + +oci8_test_sql_execute($c, $stmtarray); + +function print_row($row) +{ + if ($row === false) { + print "Return is false\n"; + return; + } + foreach ($row as $item) { + echo " ".$item; + } + echo "\n"; +} + +// Run Test + +echo "Test 1\n"; + +$s = oci_parse($c, "begin imp_res_get_4_proc(); end;"); +oci_execute($s); +$s1 = oci_get_implicit_resultset($s); +$s2 = oci_get_implicit_resultset($s); +$row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS); +print_row($row); +$row = oci_fetch_array($s2, OCI_ASSOC+OCI_RETURN_NULLS); +print_row($row); +$row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS); +print_row($row); +$row = oci_fetch_array($s2, OCI_ASSOC+OCI_RETURN_NULLS); +print_row($row); +$row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS); +print_row($row); +$row = oci_fetch_array($s2, OCI_ASSOC+OCI_RETURN_NULLS); +print_row($row); + +echo "Test 2 - too many fetches\n"; + +$s = oci_parse($c, "begin imp_res_get_4_proc(); end;"); +oci_execute($s); +$s1 = oci_get_implicit_resultset($s); +$s2 = oci_get_implicit_resultset($s); +$row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS); +print_row($row); +$row = oci_fetch_array($s2, OCI_ASSOC+OCI_RETURN_NULLS); +print_row($row); +$row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS); +print_row($row); +$row = oci_fetch_array($s2, OCI_ASSOC+OCI_RETURN_NULLS); +print_row($row); +$row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS); +print_row($row); +$row = oci_fetch_array($s2, OCI_ASSOC+OCI_RETURN_NULLS); +print_row($row); +$row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS); +print_row($row); +$row = oci_fetch_array($s2, OCI_ASSOC+OCI_RETURN_NULLS); +print_row($row); +$row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS); +print_row($row); +$row = oci_fetch_array($s2, OCI_ASSOC+OCI_RETURN_NULLS); +print_row($row); + +// Clean up + +$stmtarray = array( + "drop procedure imp_res_get_4_proc", + "drop table imp_res_get_4_tab_1", + "drop table imp_res_get_4_tab_2" +); + +oci8_test_sql_execute($c, $stmtarray); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 + 1 abcde + t + 2 fghij + u + 3 klmno + v +Test 2 - too many fetches + 1 abcde + t + 2 fghij + u + 3 klmno + v +Return is false +Return is false + +Warning: oci_fetch_array(): ORA-01002: %s in %simp_res_get_4.php on line %d +Return is false + +Warning: oci_fetch_array(): ORA-01002: %s in %simp_res_get_4.php on line %d +Return is false +===DONE=== diff --git a/ext/oci8/tests/imp_res_get_5.phpt b/ext/oci8/tests/imp_res_get_5.phpt new file mode 100644 index 0000000000..3cfa0967a2 --- /dev/null +++ b/ext/oci8/tests/imp_res_get_5.phpt @@ -0,0 +1,124 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: get from wrong statement +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +function print_row($row) +{ + foreach ($row as $item) { + echo " ".$item; + } + echo "\n"; +} + +$plsql = + "declare + c1 sys_refcursor; + begin + open c1 for select 1 from dual union all select 2 from dual; + dbms_sql.return_result(c1); + open c1 for select 3 from dual union all select 4 from dual; + dbms_sql.return_result(c1); + open c1 for select 5 from dual union all select 6 from dual; + dbms_sql.return_result(c1); + end;"; + +// Run Test + +echo "Test 1\n"; +// This test effectively discards all the first IRS results +$s = oci_parse($c, $plsql); +oci_execute($s); +while (($s1 = oci_get_implicit_resultset($s))) { // $s1 is never used again so its results are lost + while (($row = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_NULLS)) != false) { // use parent $s instead of $s1 + print_row($row); + } +} +oci_free_statement($s); + +echo "\nTest 2 - fetch first IRS explicitly\n"; +$s = oci_parse($c, $plsql); +oci_execute($s); +$s1 = oci_get_implicit_resultset($s); +while (($row = oci_fetch_row($s1)) != false) { + print_row($row); +} +while (($row = oci_fetch_row($s)) != false) { + print_row($row); +} +oci_free_statement($s); + +echo "\nTest 3 - fetch part of IRS explicitly\n"; +$s = oci_parse($c, $plsql); +oci_execute($s); +$s1 = oci_get_implicit_resultset($s); +while (($row = oci_fetch_row($s1)) != false) { + print_row($row); +} +$row = oci_fetch_row($s); +print_row($row); +$s1 = oci_get_implicit_resultset($s); +while (($row = oci_fetch_row($s1)) != false) { + print_row($row); +} +while (($row = oci_fetch_row($s)) != false) { + print_row($row); +} +oci_free_statement($s); + +echo "\nTest 4 - skip IRSs\n"; +$s = oci_parse($c, $plsql); +oci_execute($s); +$s1 = oci_get_implicit_resultset($s); +$s1 = oci_get_implicit_resultset($s); +while (($row = oci_fetch_row($s)) != false) { // parent + print_row($row); +} +oci_free_statement($s); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 + 3 + 4 + 5 + 6 + +Test 2 - fetch first IRS explicitly + 1 + 2 + 3 + 4 + 5 + 6 + +Test 3 - fetch part of IRS explicitly + 1 + 2 + 3 + 5 + 6 + 4 + +Test 4 - skip IRSs + 5 + 6 +===DONE=== diff --git a/ext/oci8/tests/imp_res_get_all.phpt b/ext/oci8/tests/imp_res_get_all.phpt new file mode 100644 index 0000000000..d2dcbea6c7 --- /dev/null +++ b/ext/oci8/tests/imp_res_get_all.phpt @@ -0,0 +1,120 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: oci_fetch_all +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +$plsql = "declare + c1 sys_refcursor; + begin + open c1 for select 1 from dual union all select 2 from dual; + dbms_sql.return_result(c1); + open c1 for select 3 from dual union all select 4 from dual; + dbms_sql.return_result(c1); + open c1 for select 5 from dual union all select 6 from dual; + dbms_sql.return_result(c1); + end;"; + +// Run Test + +echo "Test 1\n"; +$s = oci_parse($c, $plsql); +oci_execute($s); + +$s1 = oci_get_implicit_resultset($s); +oci_fetch_all($s1, $res); +var_dump($res); + +$s2 = oci_get_implicit_resultset($s); +oci_fetch_all($s2, $res); +var_dump($res); + +$s3 = oci_get_implicit_resultset($s); +oci_fetch_all($s3, $res); +var_dump($res); + +echo "\nTest 2\n"; +$s = oci_parse($c, $plsql); +oci_execute($s); +while (($s1 = oci_get_implicit_resultset($s))) { + $r = oci_fetch_all($s1, $res); + var_dump($res); +} + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 +array(1) { + [1]=> + array(2) { + [0]=> + string(1) "1" + [1]=> + string(1) "2" + } +} +array(1) { + [3]=> + array(2) { + [0]=> + string(1) "3" + [1]=> + string(1) "4" + } +} +array(1) { + [5]=> + array(2) { + [0]=> + string(1) "5" + [1]=> + string(1) "6" + } +} + +Test 2 +array(1) { + [1]=> + array(2) { + [0]=> + string(1) "1" + [1]=> + string(1) "2" + } +} +array(1) { + [3]=> + array(2) { + [0]=> + string(1) "3" + [1]=> + string(1) "4" + } +} +array(1) { + [5]=> + array(2) { + [0]=> + string(1) "5" + [1]=> + string(1) "6" + } +} +===DONE=== diff --git a/ext/oci8/tests/imp_res_get_cancel.phpt b/ext/oci8/tests/imp_res_get_cancel.phpt new file mode 100644 index 0000000000..7dbcecbfe9 --- /dev/null +++ b/ext/oci8/tests/imp_res_get_cancel.phpt @@ -0,0 +1,56 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: oci_cancel +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +$plsql = + "declare + c1 sys_refcursor; + c2 sys_refcursor; + begin + open c1 for select 1 from dual union all select 2 from dual; + dbms_sql.return_result(c1); + open c2 for select 3 from dual; + dbms_sql.return_result (c2); + end;"; + +// Run Test + +echo "Test 1\n"; +$s = oci_parse($c, $plsql); +oci_execute($s); +while (($s1 = oci_get_implicit_resultset($s))) { + while (($row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS)) != false) { + foreach ($row as $item) { + echo " ".$item; + } + echo "\n"; + oci_cancel($s1); + } +} + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 + 1 + 3 +===DONE=== + diff --git a/ext/oci8/tests/imp_res_get_close_1.phpt b/ext/oci8/tests/imp_res_get_close_1.phpt new file mode 100644 index 0000000000..2edc8bf604 --- /dev/null +++ b/ext/oci8/tests/imp_res_get_close_1.phpt @@ -0,0 +1,68 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: oci_free_statement #1 +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$plsql = + "declare + c1 sys_refcursor; + begin + open c1 for select 1 from dual union all select 2 from dual; + dbms_sql.return_result(c1); + open c1 for select 3 from dual union all select 4 from dual; + dbms_sql.return_result(c1); + open c1 for select 5 from dual union all select 6 from dual; + dbms_sql.return_result(c1); + end;"; + +// Run Test + +echo "Test 1\n"; + +$s = oci_parse($c, $plsql); +oci_execute($s); + +while (($s1 = oci_get_implicit_resultset($s))) { + while (($row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS)) != false) { + foreach ($row as $item) { + echo " ".$item; + } + echo "\n"; + oci_free_statement($s1); // Free the implicit result handle + } +} +oci_free_statement($s); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 + 1 + +Warning: oci_fetch_array(): %d is not a valid oci8 statement resource in %s on line %d + 3 + +Warning: oci_fetch_array(): %d is not a valid oci8 statement resource in %s on line %d + 5 + +Warning: oci_fetch_array(): %d is not a valid oci8 statement resource in %s on line %d +===DONE=== diff --git a/ext/oci8/tests/imp_res_get_close_2.phpt b/ext/oci8/tests/imp_res_get_close_2.phpt new file mode 100644 index 0000000000..b3153834ba --- /dev/null +++ b/ext/oci8/tests/imp_res_get_close_2.phpt @@ -0,0 +1,64 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: oci_free_statement #2 +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$plsql = + "declare + c1 sys_refcursor; + begin + open c1 for select 1 from dual union all select 2 from dual; + dbms_sql.return_result(c1); + open c1 for select 3 from dual union all select 4 from dual; + dbms_sql.return_result(c1); + open c1 for select 5 from dual union all select 6 from dual; + dbms_sql.return_result(c1); + end;"; + +// Run Test + +echo "Test 1\n"; + +$s = oci_parse($c, $plsql); +oci_execute($s); + +while (($s1 = oci_get_implicit_resultset($s))) { + while (($row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS)) != false) { + foreach ($row as $item) { + echo " ".$item; + } + echo "\n"; + oci_free_statement($s); // close parent + } +} + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 + 1 + 2 + +Warning: oci_fetch_array(): OCI_INVALID_HANDLE in %s on line %d + +Warning: oci_get_implicit_resultset(): %d is not a valid oci8 statement resource in %s on line %d +===DONE=== diff --git a/ext/oci8/tests/imp_res_get_close_3.phpt b/ext/oci8/tests/imp_res_get_close_3.phpt new file mode 100644 index 0000000000..4793a6c882 --- /dev/null +++ b/ext/oci8/tests/imp_res_get_close_3.phpt @@ -0,0 +1,65 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: oci_free_statement #3 +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$plsql = + "declare + c1 sys_refcursor; + begin + open c1 for select 1 from dual union all select 2 from dual; + dbms_sql.return_result(c1); + open c1 for select 3 from dual union all select 4 from dual; + dbms_sql.return_result(c1); + open c1 for select 5 from dual union all select 6 from dual; + dbms_sql.return_result(c1); + end;"; + +// Run Test + +echo "Test 1\n"; + +$s = oci_parse($c, $plsql); +oci_execute($s); + +while (($s1 = oci_get_implicit_resultset($s))) { + while (($row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS)) != false) { + foreach ($row as $item) { + echo " ".$item; + } + echo "\n"; + } + oci_free_statement($s1); +} +oci_free_statement($s); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 + 1 + 2 + 3 + 4 + 5 + 6 +===DONE=== diff --git a/ext/oci8/tests/imp_res_get_cursor.phpt b/ext/oci8/tests/imp_res_get_cursor.phpt new file mode 100644 index 0000000000..ccdb6f5490 --- /dev/null +++ b/ext/oci8/tests/imp_res_get_cursor.phpt @@ -0,0 +1,101 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: nested cursor +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$stmtarray = array( + "drop table imp_res_get_cursor_tab_1", + "create table imp_res_get_cursor_tab_1 (c1 number, c2 varchar2(10))", + "insert into imp_res_get_cursor_tab_1 values (1, 'abcde')", + "insert into imp_res_get_cursor_tab_1 values (2, 'fghij')", + "insert into imp_res_get_cursor_tab_1 values (3, 'klmno')", + + "drop table imp_res_get_cursor_tab_2", + "create table imp_res_get_cursor_tab_2 (c3 varchar2(1))", + "insert into imp_res_get_cursor_tab_2 values ('t')", + "insert into imp_res_get_cursor_tab_2 values ('u')", + "insert into imp_res_get_cursor_tab_2 values ('v')", + + "create or replace procedure imp_res_get_cursor_proc as + c1 sys_refcursor; + begin + open c1 for select cursor(select c1, c2 from imp_res_get_cursor_tab_1 order by 1) as curs from dual; + dbms_sql.return_result(c1); + + open c1 for select * from imp_res_get_cursor_tab_2 where rownum < 3 order by 1; + dbms_sql.return_result(c1); + + open c1 for select * from dual; + dbms_sql.return_result (c1); + end;" +); + +oci8_test_sql_execute($c, $stmtarray); + +function do_fetch($s) +{ + while (($row = oci_fetch_assoc($s)) != false) { + foreach ($row as $item) { + if (is_resource($item)) { // Nested cursor + oci_execute($item); + do_fetch($item); + } else { + echo " ".$item; + } + } + echo "\n"; + } +} + +// Run Test + +echo "Test 1\n"; + +$s = oci_parse($c, "begin imp_res_get_cursor_proc(); end;"); +oci_execute($s); + +while (($s1 = oci_get_implicit_resultset($s))) { + do_fetch($s1); +} + +// Clean up + +$stmtarray = array( + "drop procedure imp_res_get_cursor_proc", + "drop table imp_res_get_cursor_tab_1", + "drop table imp_res_get_cursor_tab_2" +); + +oci8_test_sql_execute($c, $stmtarray); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 + 1 abcde + 2 fghij + 3 klmno + + t + u + X +===DONE=== diff --git a/ext/oci8/tests/imp_res_get_dbmsoutput.phpt b/ext/oci8/tests/imp_res_get_dbmsoutput.phpt new file mode 100644 index 0000000000..cbc2389e46 --- /dev/null +++ b/ext/oci8/tests/imp_res_get_dbmsoutput.phpt @@ -0,0 +1,156 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: interleaved with DBMS_OUTPUT +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$stmtarray = array( + "drop table imp_res_get_dbmsoutput_tab_1", + "create table imp_res_get_dbmsoutput_tab_1 (c1 number, c2 varchar2(10))", + "insert into imp_res_get_dbmsoutput_tab_1 values (1, 'abcde')", + "insert into imp_res_get_dbmsoutput_tab_1 values (2, 'fghij')", + "insert into imp_res_get_dbmsoutput_tab_1 values (3, 'klmno')", + + "drop table imp_res_get_dbmsoutput_tab_2", + "create table imp_res_get_dbmsoutput_tab_2 (c3 varchar2(1))", + "insert into imp_res_get_dbmsoutput_tab_2 values ('t')", + "insert into imp_res_get_dbmsoutput_tab_2 values ('u')", + "insert into imp_res_get_dbmsoutput_tab_2 values ('v')", + + "create or replace procedure imp_res_get_dbmsoutput_proc as + c1 sys_refcursor; + begin + dbms_output.put_line('Line 1'); + open c1 for select * from imp_res_get_dbmsoutput_tab_1 order by 1; + dbms_sql.return_result(c1); + dbms_output.put_line('Line 2'); + open c1 for select * from imp_res_get_dbmsoutput_tab_2 order by 1; + dbms_sql.return_result(c1); + dbms_output.put_line('Line 3'); + open c1 for select * from dual; + dbms_sql.return_result (c1); + end;" +); + +oci8_test_sql_execute($c, $stmtarray); + +// Turn DBMS_OUTPUT on +function setserveroutputon($c) +{ + $s = oci_parse($c, "begin dbms_output.enable(null); end;"); + oci_execute($s); +} + +function getdbmsoutput_do($c) +{ + $s = oci_parse($c, "begin dbms_output.get_line(:ln, :st); end;"); + oci_bind_by_name($s, ":ln", $ln, 100); + oci_bind_by_name($s, ":st", $st, -1, SQLT_INT); + $res = false; + while (($succ = oci_execute($s)) && !$st) { + $res[] = $ln; // append each line to the array + } + return $res; +} + +setserveroutputon($c); + +// Run Test + +echo "Test 1\n"; + +$s = oci_parse($c, "begin imp_res_get_dbmsoutput_proc(); end;"); +oci_execute($s); + +var_dump(getdbmsoutput_do($c)); + +while (($s1 = oci_get_implicit_resultset($s))) { + while (($row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS)) != false) { + foreach ($row as $item) { + echo " ".$item; + } + echo "\n"; + } +} + +echo "Test 2\n"; + +$s = oci_parse($c, "begin imp_res_get_dbmsoutput_proc(); end;"); +oci_execute($s); + +while (($s1 = oci_get_implicit_resultset($s))) { + while (($row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS)) != false) { + foreach ($row as $item) { + echo " ".$item; + } + echo "\n"; + } +} + +var_dump(getdbmsoutput_do($c)); + +// Clean up + +$stmtarray = array( + "drop procedure imp_res_get_dbmsoutput_proc", + "drop table imp_res_get_dbmsoutput_tab_1", + "drop table imp_res_get_dbmsoutput_tab_2" +); + +oci8_test_sql_execute($c, $stmtarray); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 +array(3) { + [0]=> + string(6) "Line 1" + [1]=> + string(6) "Line 2" + [2]=> + string(6) "Line 3" +} + 1 abcde + 2 fghij + 3 klmno + t + u + v + X +Test 2 + 1 abcde + 2 fghij + 3 klmno + t + u + v + X +array(3) { + [0]=> + string(6) "Line 1" + [1]=> + string(6) "Line 2" + [2]=> + string(6) "Line 3" +} +===DONE=== + diff --git a/ext/oci8/tests/imp_res_get_exec.phpt b/ext/oci8/tests/imp_res_get_exec.phpt new file mode 100644 index 0000000000..dbd8f3ef3a --- /dev/null +++ b/ext/oci8/tests/imp_res_get_exec.phpt @@ -0,0 +1,55 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: Execute twice +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +$plsql = "declare + c1 sys_refcursor; + begin + open c1 for select 1 from dual union all select 2 from dual; + dbms_sql.return_result(c1); + end;"; + +// Run Test + +echo "Test 1\n"; + +$s = oci_parse($c, $plsql); +oci_execute($s); + +$s1 = oci_get_implicit_resultset($s); +oci_execute($s1); +oci_execute($s1); // execute twice; should be NOP +while (($row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS)) != false) { + foreach ($row as $item) { + echo " ".$item; + } + echo "\n"; +} +oci_free_statement($s); + + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 + 1 + 2 +===DONE=== diff --git a/ext/oci8/tests/imp_res_get_none.phpt b/ext/oci8/tests/imp_res_get_none.phpt new file mode 100644 index 0000000000..981f4945e2 --- /dev/null +++ b/ext/oci8/tests/imp_res_get_none.phpt @@ -0,0 +1,46 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: oci_get_implicit_resultset: no implicit results +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Run Test + +echo "Test 1\n"; + +$s = oci_parse($c, "select * from dual"); +oci_execute($s); + +while (($s1 = oci_get_implicit_resultset($s))) { + while (($row = oci_fetch_array($s1, OCI_ASSOC+OCI_RETURN_NULLS)) != false) { + foreach ($row as $item) { + echo " ".$item; + } + echo "\n"; + } +} + +var_dump($s1); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 +bool(false) +===DONE=== diff --git a/ext/oci8/tests/imp_res_insert.phpt b/ext/oci8/tests/imp_res_insert.phpt new file mode 100644 index 0000000000..d9c0705b55 --- /dev/null +++ b/ext/oci8/tests/imp_res_insert.phpt @@ -0,0 +1,152 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: Commit modes +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$c2 = oci_new_connect($user, $password, $dbase); + +$stmtarray = array( + "drop table imp_res_insert_tab", + "create table imp_res_insert_tab (c1 number)", + + "create or replace procedure imp_res_insert_proc_nc (p1 in number) as + c1 sys_refcursor; + begin + execute immediate 'insert into imp_res_insert_tab values ('||p1||')'; + open c1 for select * from imp_res_insert_tab order by 1; + dbms_sql.return_result(c1); + end;", + + "create or replace procedure imp_res_insert_proc_c (p1 in number) as + c1 sys_refcursor; + begin + execute immediate 'insert into imp_res_insert_tab values ('||p1||')'; + commit; + open c1 for select * from imp_res_insert_tab order by 1; + dbms_sql.return_result(c1); + end;" + +); + +oci8_test_sql_execute($c, $stmtarray); + +// Run Test + +echo "Test 1 - No commit in procedure, OCI_COMMIT_ON_SUCCESS mode\n"; +$s = oci_parse($c, "begin imp_res_insert_proc_nc(111); end;"); +oci_execute($s, OCI_COMMIT_ON_SUCCESS); +while (($row = oci_fetch_row($s)) !== false) + echo $row[0], "\n"; +$s2 = oci_parse($c2, "select * from imp_res_insert_tab order by 1"); +oci_execute($s2, OCI_NO_AUTO_COMMIT); +oci_fetch_all($s2, $res); +var_dump($res['C1']); + +echo "\nTest 2 - No commit in procedure, OCI_NO_AUTO_COMMIT mode\n"; +$s = oci_parse($c, "begin imp_res_insert_proc_nc(222); end;"); +oci_execute($s, OCI_NO_AUTO_COMMIT); +while (($row = oci_fetch_row($s)) !== false) + echo $row[0], "\n"; +// The 2nd connection won't see the newly inserted data +$s2 = oci_parse($c2, "select * from imp_res_insert_tab order by 1"); +oci_execute($s2, OCI_NO_AUTO_COMMIT); +oci_fetch_all($s2, $res); +var_dump($res['C1']); + +echo "\nTest 3 - Commit in procedure, OCI_COMMIT_ON_SUCCESS mode\n"; +$s = oci_parse($c, "begin imp_res_insert_proc_c(333); end;"); +oci_execute($s, OCI_COMMIT_ON_SUCCESS); +// The 2nd connection will now see the previously uncommitted data inserted in the previous test +while (($row = oci_fetch_row($s)) !== false) + echo $row[0], "\n"; +$s2 = oci_parse($c2, "select * from imp_res_insert_tab order by 1"); +oci_execute($s2, OCI_NO_AUTO_COMMIT); +oci_fetch_all($s2, $res); +var_dump($res['C1']); + +echo "\nTest 4 - Commit in procedure, OCI_NO_AUTO_COMMIT mode\n"; +$s = oci_parse($c, "begin imp_res_insert_proc_c(444); end;"); +oci_execute($s, OCI_NO_AUTO_COMMIT); +while (($row = oci_fetch_row($s)) !== false) + echo $row[0], "\n"; +$s2 = oci_parse($c2, "select * from imp_res_insert_tab order by 1"); +oci_execute($s2, OCI_NO_AUTO_COMMIT); +oci_fetch_all($s2, $res); +var_dump($res['C1']); + +// Clean up + +$stmtarray = array( + "drop procedure imp_res_insert_proc_nc", + "drop procedure imp_res_insert_proc_c", + "drop table imp_res_insert_tab", +); + +oci8_test_sql_execute($c, $stmtarray); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 - No commit in procedure, OCI_COMMIT_ON_SUCCESS mode +111 +array(1) { + [0]=> + string(3) "111" +} + +Test 2 - No commit in procedure, OCI_NO_AUTO_COMMIT mode +111 +222 +array(1) { + [0]=> + string(3) "111" +} + +Test 3 - Commit in procedure, OCI_COMMIT_ON_SUCCESS mode +111 +222 +333 +array(3) { + [0]=> + string(3) "111" + [1]=> + string(3) "222" + [2]=> + string(3) "333" +} + +Test 4 - Commit in procedure, OCI_NO_AUTO_COMMIT mode +111 +222 +333 +444 +array(4) { + [0]=> + string(3) "111" + [1]=> + string(3) "222" + [2]=> + string(3) "333" + [3]=> + string(3) "444" +} +===DONE=== diff --git a/ext/oci8/tests/imp_res_lob.phpt b/ext/oci8/tests/imp_res_lob.phpt new file mode 100644 index 0000000000..247803581d --- /dev/null +++ b/ext/oci8/tests/imp_res_lob.phpt @@ -0,0 +1,101 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: LOBs +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$stmtarray = array( + "drop table imp_res_lob_tab", + "create table imp_res_lob_tab (c1 number, c2 clob, c3 varchar2(10))", + "insert into imp_res_lob_tab values (1, 'aaaaa', 'a')", + "insert into imp_res_lob_tab values (2, 'bbbbb', 'b')", + "insert into imp_res_lob_tab values (3, 'ccccc', 'c')", + "insert into imp_res_lob_tab values (4, 'ddddd', 'd')", + + "create or replace procedure imp_res_lob_proc as + c1 sys_refcursor; + begin + open c1 for select * from imp_res_lob_tab order by 1; + dbms_sql.return_result(c1); + open c1 for select * from dual; + dbms_sql.return_result(c1); + open c1 for select c2 from imp_res_lob_tab order by c1; + dbms_sql.return_result(c1); + end;" +); + +oci8_test_sql_execute($c, $stmtarray); + +// Run Test + +echo "Test 1\n"; +$s = oci_parse($c, "begin imp_res_lob_proc(); end;"); +oci_execute($s); +while (($row = oci_fetch_row($s)) != false) { + foreach ($row as $item) { + if (is_object($item)) { + echo " " . $item->load(); + } else { + echo " " . $item; + } + } + echo "\n"; +} + +echo "\nTest 2 - don't fetch all rows\n"; +$s = oci_parse($c, "begin imp_res_lob_proc(); end;"); +oci_execute($s); +$row = oci_fetch_row($s); +foreach ($row as $item) { + if (is_object($item)) { + echo " " . $item->load(); + } else { + echo " " . $item; + } +} +echo "\n"; + +// Clean up + +$stmtarray = array( + "drop procedure imp_res_lob_proc", + "drop table imp_res_lob_tab", +); + +oci8_test_sql_execute($c, $stmtarray); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 + 1 aaaaa a + 2 bbbbb b + 3 ccccc c + 4 ddddd d + X + aaaaa + bbbbb + ccccc + ddddd + +Test 2 - don't fetch all rows + 1 aaaaa a +===DONE=== diff --git a/ext/oci8/tests/imp_res_prefetch.phpt b/ext/oci8/tests/imp_res_prefetch.phpt new file mode 100644 index 0000000000..5acdd518e5 --- /dev/null +++ b/ext/oci8/tests/imp_res_prefetch.phpt @@ -0,0 +1,185 @@ +--TEST-- +Oracle Database 12c Implicit Result Sets: basic test +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle Database 12c or greater"); +} +preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +if (!(isset($matches[0]) && $matches[0] >= 12)) { + die("skip works only with Oracle 12c or greater version of Oracle client libraries"); +} +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); + +// Initialization + +$stmtarray = array( + "drop table imp_res_prefetch_tab_1", + "create table imp_res_prefetch_tab_1 (c1 number, c2 varchar2(10))", + "insert into imp_res_prefetch_tab_1 values (1, 'abcde')", + "insert into imp_res_prefetch_tab_1 values (2, 'fghij')", + "insert into imp_res_prefetch_tab_1 values (3, 'klmno')", + + "drop table imp_res_prefetch_tab_2", + "create table imp_res_prefetch_tab_2 (c3 varchar2(1))", + "insert into imp_res_prefetch_tab_2 values ('t')", + "insert into imp_res_prefetch_tab_2 values ('u')", + "insert into imp_res_prefetch_tab_2 values ('v')", + + "create or replace procedure imp_res_prefetch_proc as + c1 sys_refcursor; + begin + open c1 for select * from imp_res_prefetch_tab_1 order by 1; + dbms_sql.return_result(c1); + + open c1 for select * from imp_res_prefetch_tab_2 order by 1; + dbms_sql.return_result(c1); + end;" +); + +oci8_test_sql_execute($c, $stmtarray); + +// Run Test + +echo "Test 1 - prefetch 0\n"; +$s = oci_parse($c, "begin imp_res_prefetch_proc(); end;"); +oci_execute($s); +var_dump(oci_set_prefetch($s, 0)); +while (($row = oci_fetch_row($s)) != false) + var_dump($row); + +echo "\nTest 1 - prefetch 1\n"; +$s = oci_parse($c, "begin imp_res_prefetch_proc(); end;"); +oci_execute($s); +var_dump(oci_set_prefetch($s, 1)); +while (($row = oci_fetch_row($s)) != false) + var_dump($row); + +echo "\nTest 1 - prefetch 2\n"; +$s = oci_parse($c, "begin imp_res_prefetch_proc(); end;"); +oci_execute($s); +var_dump(oci_set_prefetch($s, 2)); +while (($row = oci_fetch_row($s)) != false) + var_dump($row); + +// Clean up + +$stmtarray = array( + "drop procedure imp_res_prefetch_proc", + "drop table imp_res_prefetch_tab_1", + "drop table imp_res_prefetch_tab_2" +); + +oci8_test_sql_execute($c, $stmtarray); + +?> +===DONE=== +<?php exit(0); ?> +--EXPECTF-- +Test 1 - prefetch 0 +bool(true) +array(2) { + [0]=> + string(1) "1" + [1]=> + string(5) "abcde" +} +array(2) { + [0]=> + string(1) "2" + [1]=> + string(5) "fghij" +} +array(2) { + [0]=> + string(1) "3" + [1]=> + string(5) "klmno" +} +array(1) { + [0]=> + string(1) "t" +} +array(1) { + [0]=> + string(1) "u" +} +array(1) { + [0]=> + string(1) "v" +} + +Test 1 - prefetch 1 +bool(true) +array(2) { + [0]=> + string(1) "1" + [1]=> + string(5) "abcde" +} +array(2) { + [0]=> + string(1) "2" + [1]=> + string(5) "fghij" +} +array(2) { + [0]=> + string(1) "3" + [1]=> + string(5) "klmno" +} +array(1) { + [0]=> + string(1) "t" +} +array(1) { + [0]=> + string(1) "u" +} +array(1) { + [0]=> + string(1) "v" +} + +Test 1 - prefetch 2 +bool(true) +array(2) { + [0]=> + string(1) "1" + [1]=> + string(5) "abcde" +} +array(2) { + [0]=> + string(1) "2" + [1]=> + string(5) "fghij" +} +array(2) { + [0]=> + string(1) "3" + [1]=> + string(5) "klmno" +} +array(1) { + [0]=> + string(1) "t" +} +array(1) { + [0]=> + string(1) "u" +} +array(1) { + [0]=> + string(1) "v" +} +===DONE=== diff --git a/ext/oci8/tests/lob_015.phpt b/ext/oci8/tests/lob_015.phpt index b4a19684a3..59e8fec42a 100644 --- a/ext/oci8/tests/lob_015.phpt +++ b/ext/oci8/tests/lob_015.phpt @@ -48,7 +48,7 @@ Warning: oci_bind_by_name() expects at least 3 parameters, 2 given in %s on line Warning: oci_bind_by_name() expects at least 3 parameters, 1 given in %s on line %d -Warning: oci_execute(): ORA-00932: %s NUMBER %s BLOB in %s on line %d +Warning: oci_execute(): ORA-00932: %s on line %d object(OCI-Lob)#%d (1) { ["descriptor"]=> resource(%d) of type (oci8 descriptor) diff --git a/ext/oci8/tests/lob_temp2.phpt b/ext/oci8/tests/lob_temp2.phpt new file mode 100644 index 0000000000..d774b4d724 --- /dev/null +++ b/ext/oci8/tests/lob_temp2.phpt @@ -0,0 +1,40 @@ +--TEST-- +Writing temporary lob before binding +--SKIPIF-- +<?php +if (!extension_loaded('oci8')) die ("skip no oci8 extension"); +$target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +?> +--FILE-- +<?php + +require(dirname(__FILE__).'/connect.inc'); +require(dirname(__FILE__).'/create_table.inc'); + +$ora_sql = "INSERT INTO ".$schema.$table_name." (clob) VALUES (:v_clob)"; + +$clob = oci_new_descriptor($c, OCI_D_LOB); +var_dump($clob->writeTemporary("test")); + +$statement = oci_parse($c, $ora_sql); +oci_bind_by_name($statement, ":v_clob", $clob, -1, OCI_B_CLOB); +oci_execute($statement, OCI_DEFAULT); + +$s = oci_parse($c, "select clob from ". $schema.$table_name); +oci_execute($s); +oci_fetch_all($s, $res); +var_dump($res); + +?> +===DONE=== +--EXPECTF-- +bool(true) +array(1) { + ["CLOB"]=> + array(1) { + [0]=> + string(4) "test" + } +} +===DONE=== diff --git a/ext/oci8/tests/minfo.phpt b/ext/oci8/tests/minfo.phpt index f6b95ff296..34a19ca693 100644 --- a/ext/oci8/tests/minfo.phpt +++ b/ext/oci8/tests/minfo.phpt @@ -8,12 +8,12 @@ Code coverage for PHP_MINFO_FUNCTION(oci) ob_start(); phpinfo(INFO_MODULES); $v = ob_get_clean(); -$r = strpos($v, 'OCI8 Support => enabled'); -var_dump($r); +$r = preg_match('/OCI8 Support .* enabled/', $v); +if ($r !== 1) + var_dump($r); echo "Done\n"; ?> --EXPECTF-- -int(%d) Done diff --git a/ext/oci8/tests/password.phpt b/ext/oci8/tests/password.phpt index 1738702cb6..8ea81d3fc0 100644 --- a/ext/oci8/tests/password.phpt +++ b/ext/oci8/tests/password.phpt @@ -14,28 +14,28 @@ if ($test_drcp) die("skip password change not supported in DRCP Mode"); require(dirname(__FILE__)."/connect.inc"); $stmtarray = array( - "drop user testuser cascade", - "create user testuser identified by testuserpwd", - "grant connect, create session to testuser" + "drop user testuser_pw cascade", + "create user testuser_pw identified by testuserpwd", + "grant connect, create session to testuser_pw" ); oci8_test_sql_execute($c, $stmtarray); // Connect and change the password -$c1 = oci_connect("testuser", "testuserpwd", $dbase); +$c1 = oci_connect("testuser_pw", "testuserpwd", $dbase); var_dump($c1); $rn1 = (int)$c1; -oci_password_change($c1, "testuser", "testuserpwd", "testuserpwd2"); +oci_password_change($c1, "testuser_pw", "testuserpwd", "testuserpwd2"); // Second connect should return a new resource because the hash string will be different from $c1 -$c2 = oci_connect("testuser", "testuserpwd2", $dbase); +$c2 = oci_connect("testuser_pw", "testuserpwd2", $dbase); var_dump($c2); $rn2 = (int)$c2; // Despite using the old password this connect should succeed and return the original resource -$c3 = oci_connect("testuser", "testuserpwd", $dbase); +$c3 = oci_connect("testuser_pw", "testuserpwd", $dbase); var_dump($c3); $rn3 = (int)$c3; @@ -67,7 +67,7 @@ echo "Done\n"; require(dirname(__FILE__)."/connect.inc"); $stmtarray = array( - "drop user testuser cascade" + "drop user testuser_pw cascade" ); oci8_test_sql_execute($c, $stmtarray); diff --git a/ext/oci8/tests/password_2.phpt b/ext/oci8/tests/password_2.phpt index ceba0bba80..13da9ff7b2 100644 --- a/ext/oci8/tests/password_2.phpt +++ b/ext/oci8/tests/password_2.phpt @@ -14,27 +14,27 @@ if ($test_drcp) die("skip password change not supported in DRCP Mode"); require(dirname(__FILE__)."/connect.inc"); $stmtarray = array( - "drop user testuser cascade", - "create user testuser identified by testuserpwd", - "grant connect, create session to testuser" + "drop user testuser_pw2 cascade", + "create user testuser_pw2 identified by testuserpwd", + "grant connect, create session to testuser_pw2" ); oci8_test_sql_execute($c, $stmtarray); // Connect (persistent) and change the password -$c1 = oci_pconnect("testuser", "testuserpwd", $dbase); +$c1 = oci_pconnect("testuser_pw2", "testuserpwd", $dbase); var_dump($c1); $rn1 = (int)$c1; -oci_password_change($c1, "testuser", "testuserpwd", "testuserpwd2"); +oci_password_change($c1, "testuser_pw2", "testuserpwd", "testuserpwd2"); // Second connect should return a new resource because the hash string will be different from $c1 -$c2 = oci_pconnect("testuser", "testuserpwd2", $dbase); +$c2 = oci_pconnect("testuser_pw2", "testuserpwd2", $dbase); var_dump($c2); $rn2 = (int)$c2; // Despite using the old password this connect should succeed and return the original resource -$c3 = oci_pconnect("testuser", "testuserpwd", $dbase); +$c3 = oci_pconnect("testuser_pw2", "testuserpwd", $dbase); var_dump($c3); $rn3 = (int)$c3; @@ -66,7 +66,7 @@ echo "Done\n"; require(dirname(__FILE__)."/connect.inc"); $stmtarray = array( - "drop user testuser cascade" + "drop user testuser_pw2 cascade" ); oci8_test_sql_execute($c, $stmtarray); diff --git a/ext/oci8/tests/password_new.phpt b/ext/oci8/tests/password_new.phpt index c218d904fa..2c66dd94ab 100644 --- a/ext/oci8/tests/password_new.phpt +++ b/ext/oci8/tests/password_new.phpt @@ -3,15 +3,27 @@ oci_password_change() --SKIPIF-- <?php $target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on thes -require(dirname(__FILE__).'/skipif.inc'); +require(dirname(__FILE__).'/connect.inc'); if (empty($dbase)) die ("skip requires database connection string be set"); if ($test_drcp) die("skip password change not supported in DRCP Mode"); -// This test is known to fail with Oracle 10.2.0.4 client libraries -// connecting to Oracle Database 11 (Oracle bug 6277160, fixed 10.2.0.5) -if (preg_match('/Release (11|12)\./', oci_server_version($c), $matches) === 1 && - preg_match('/^10\.2\.0\.[1234]/', oci_client_version()) === 1) { - die ("skip test known to fail using Oracle 10.2.0.4 client libs connecting to Oracle 11 (6277160)"); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches_sv); +if (isset($matches_sv[1]) && $matches_sv[1] >= 11) { + preg_match('/([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); + if (isset($matches[0]) && $matches[1] == 10 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] < 5) { + die ("skip test known to fail using Oracle 10.2.0.4 client libs connecting to Oracle 11 (6277160)"); + } +} + +// This test in Oracle 12c needs a non-CDB or the root container +if (isset($matches_sv[1]) && $matches_sv[1] >= 12) { + $s = oci_parse($c, "select nvl(sys_context('userenv', 'con_name'), 'notacdb') as dbtype from dual"); + $r = @oci_execute($s); + if (!$r) + die('skip could not identify container type'); + $r = oci_fetch_array($s); + if ($r['DBTYPE'] !== 'CDB$ROOT') + die('skip cannot run test using a PDB'); } ?> --FILE-- diff --git a/ext/oci8/tests/password_old.phpt b/ext/oci8/tests/password_old.phpt index fdbb1f9e89..2e186528e3 100644 --- a/ext/oci8/tests/password_old.phpt +++ b/ext/oci8/tests/password_old.phpt @@ -3,18 +3,28 @@ ocipasswordchange() --SKIPIF-- <?php $target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on thes -require(dirname(__FILE__).'/skipif.inc'); +require(dirname(__FILE__).'/connect.inc'); if (empty($dbase)) die ("skip requires database connection string be set"); if ($test_drcp) die("skip password change not supported in DRCP Mode"); -// This test is known to fail with Oracle 10.2.0.4 client libraries -// connecting to Oracle Database 11 (Oracle bug 6277160, fixed 10.2.0.5) -if (preg_match('/Release (11|12)\./', oci_server_version($c), $matches) === 1 && - preg_match('/^10\.2\.0\.[1234]/', oci_client_version()) === 1) { - die ("skip test known to fail using Oracle 10.2.0.4 client libs connecting to Oracle 11 (6277160)"); +preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches_sv); +if (isset($matches_sv[1]) && $matches_sv[1] >= 11) { + preg_match('/([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); + if (isset($matches[0]) && $matches[1] == 10 && $matches[2] == 2 && $matches[3] == 0 && $matches[4] < 5) { + die ("skip test known to fail using Oracle 10.2.0.4 client libs connecting to Oracle 11 (6277160)"); + } } - +// This test in Oracle 12c needs a non-CDB or the root container +if (isset($matches_sv[1]) && $matches_sv[1] >= 12) { + $s = oci_parse($c, "select nvl(sys_context('userenv', 'con_name'), 'notacdb') as dbtype from dual"); + $r = @oci_execute($s); + if (!$r) + die('skip could not identify container type'); + $r = oci_fetch_array($s); + if ($r['DBTYPE'] !== 'CDB$ROOT') + die('skip cannot run test using a PDB'); +} ?> --FILE-- <?php diff --git a/ext/oci8/tests/refcur_prefetch_3.phpt b/ext/oci8/tests/refcur_prefetch_3.phpt index 8c0414042b..974864cbd9 100644 --- a/ext/oci8/tests/refcur_prefetch_3.phpt +++ b/ext/oci8/tests/refcur_prefetch_3.phpt @@ -86,52 +86,52 @@ Test with Nested Cursors Fetch Row using Nested cursor Query array(1) { [0]=> - %unicode|string%(%d) "test0" + string(%d) "test0" } Fetch Row using Nested cursor Query array(1) { [0]=> - %unicode|string%(%d) "test1" + string(%d) "test1" } Fetch Row using Nested cursor Query array(1) { [0]=> - %unicode|string%(%d) "test2" + string(%d) "test2" } Fetch Row using Nested cursor Query array(1) { [0]=> - %unicode|string%(%d) "test3" + string(%d) "test3" } Fetch Row using Nested cursor Query array(1) { [0]=> - %unicode|string%(%d) "test4" + string(%d) "test4" } Fetch Row using Nested cursor Query array(1) { [0]=> - %unicode|string%(%d) "test5" + string(%d) "test5" } Fetch Row using Nested cursor Query array(1) { [0]=> - %unicode|string%(%d) "test6" + string(%d) "test6" } Fetch Row using Nested cursor Query array(1) { [0]=> - %unicode|string%(%d) "test7" + string(%d) "test7" } Fetch Row using Nested cursor Query array(1) { [0]=> - %unicode|string%(%d) "test8" + string(%d) "test8" } Fetch Row using Nested cursor Query array(1) { [0]=> - %unicode|string%(%d) "test9" + string(%d) "test9" } Number of roundtrips made with prefetch count 5 for 10 rows is 3 Done diff --git a/ext/oci8/tests/reflection1.phpt b/ext/oci8/tests/reflection1.phpt index 5f2e73d80b..f76d7261aa 100644 --- a/ext/oci8/tests/reflection1.phpt +++ b/ext/oci8/tests/reflection1.phpt @@ -126,6 +126,7 @@ reflection::export(new reflectionfunction('oci_set_module_name')); reflection::export(new reflectionfunction('oci_set_action')); reflection::export(new reflectionfunction('oci_set_client_info')); reflection::export(new reflectionfunction('oci_set_client_identifier')); +reflection::export(new reflectionfunction('oci_get_implicit_resultset')); ?> ===DONE=== @@ -1093,4 +1094,11 @@ Function [ <internal%s> function oci_set_client_identifier ] { } } +Function [ <internal%s> function oci_get_implicit_resultset ] { + + - Parameters [1] { + Parameter #0 [ <required> $statement_resource ] + } +} + ===DONE=== diff --git a/ext/odbc/config.m4 b/ext/odbc/config.m4 index eaed212cd7..7bc06715dd 100644 --- a/ext/odbc/config.m4 +++ b/ext/odbc/config.m4 @@ -365,7 +365,7 @@ fi if test -z "$ODBC_TYPE"; then PHP_ARG_WITH(iodbc,, -[ --with-iodbc[=DIR] Include iODBC support [/usr/local]]) +[ --with-iodbc[=DIR] Include iODBC support]) if test "$PHP_IODBC" != "no"; then AC_MSG_CHECKING(for iODBC support) 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 795b954173..9309d4b462 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; #if ZEND_EXTENSION_API_NO >= PHP_5_5_X_API_NO diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 1f411d5da8..a058bd73cb 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -24,10 +24,41 @@ #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_5_X_API_NO
static int zend_optimizer_lookup_cv(zend_op_array *op_array, char* name, int name_len)
{
@@ -62,10 +93,7 @@ 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;
@@ -113,8 +141,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)) {
@@ -126,7 +158,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"
@@ -144,12 +175,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"
@@ -158,4 +198,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 827f047cd4..52e9e98443 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -1130,6 +1130,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; } @@ -2754,19 +2758,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 */ @@ -2778,7 +2769,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 361b60b08f..38f2e060f6 100644 --- a/ext/opcache/ZendAccelerator.h +++ b/ext/opcache/ZendAccelerator.h @@ -321,6 +321,7 @@ void accel_shutdown(TSRMLS_D); 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..367331f742 --- /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 "function 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 +) +function 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 4a9fcbc9e3..4aac4e3137 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -394,11 +394,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) @@ -781,6 +805,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) /* {{{ */ { @@ -1325,6 +1350,279 @@ 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 acquire 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()); + + 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 acquire 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/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c index a1a7ffc3f4..d7ef42e0b1 100644 --- a/ext/openssl/xp_ssl.c +++ b/ext/openssl/xp_ssl.c @@ -309,7 +309,7 @@ static inline int php_openssl_setup_crypto(php_stream *stream, php_stream_xport_crypto_param *cparam TSRMLS_DC) { - SSL_METHOD *method; + const SSL_METHOD *method; long ssl_ctx_options = SSL_OP_ALL; if (sslsock->ssl_handle) { @@ -853,7 +853,7 @@ php_stream_ops php_openssl_socket_ops = { php_openssl_sockop_set_option, }; -static char * get_sni(php_stream_context *ctx, char *resourcename, long resourcenamelen, int is_persistent TSRMLS_DC) { +static char * get_sni(php_stream_context *ctx, const char *resourcename, size_t resourcenamelen, int is_persistent TSRMLS_DC) { php_url *url; @@ -900,8 +900,8 @@ static char * get_sni(php_stream_context *ctx, char *resourcename, long resource return NULL; } -php_stream *php_openssl_ssl_socket_factory(const char *proto, long protolen, - char *resourcename, long resourcenamelen, +php_stream *php_openssl_ssl_socket_factory(const char *proto, size_t protolen, + const char *resourcename, size_t resourcenamelen, const char *persistent_id, int options, int flags, struct timeval *timeout, php_stream_context *context STREAMS_DC TSRMLS_DC) 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 d5860b1a1e..aec388c03f 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_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c index ff42514721..b49ad2691f 100644 --- a/ext/pdo_dblib/dblib_driver.c +++ b/ext/pdo_dblib/dblib_driver.c @@ -369,7 +369,7 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ DBSETOPT(H->link, DBTEXTSIZE, "2147483647"); /* allow double quoted indentifiers */ - DBSETOPT(H->link, DBQUOTEDIDENT, "1"); + DBSETOPT(H->link, DBQUOTEDIDENT, NULL); ret = 1; dbh->max_escaped_char_length = 2; diff --git a/ext/pdo_pgsql/pgsql_driver.c b/ext/pdo_pgsql/pgsql_driver.c index 50136430a0..cb89809f02 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; } /* }}} */ @@ -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/pgsql/tests/00version.phpt b/ext/pgsql/tests/00version.phpt new file mode 100644 index 0000000000..d72d9e1f21 --- /dev/null +++ b/ext/pgsql/tests/00version.phpt @@ -0,0 +1,30 @@ +--TEST-- +PostgreSQL version +--SKIPIF-- +<?php include("skipif.inc"); ?> +--FILE-- +<?php +// Get postgresql version for easier debugging. +// Execute run-test.php with --keep-all to get version string in 00version.log or 00version.out +include('config.inc'); + +$db = pg_connect($conn_str); +var_dump(pg_version($db)); +pg_close($db); + +// Get environment vars for debugging +var_dump(serialize($_ENV)); + +echo "OK"; +?> +--EXPECTF-- +array(3) { + ["client"]=> + string(%d) "%s" + ["protocol"]=> + int(%d) + ["server"]=> + string(%d) "%s" +} +string(%d) "%s" +OK diff --git a/ext/pgsql/tests/14pg_update_9.phpt b/ext/pgsql/tests/14pg_update_9.phpt index e766c1f380..c33f1afbd6 100644 --- a/ext/pgsql/tests/14pg_update_9.phpt +++ b/ext/pgsql/tests/14pg_update_9.phpt @@ -1,5 +1,5 @@ --TEST-- -PostgreSQL pg_update() (9.0) +PostgreSQL pg_update() (9.0+) --SKIPIF-- <?php include("skipif.inc"); diff --git a/ext/pgsql/tests/80_bug14383.phpt b/ext/pgsql/tests/80_bug14383.phpt index a736f34c90..cb54aa8dfb 100644 --- a/ext/pgsql/tests/80_bug14383.phpt +++ b/ext/pgsql/tests/80_bug14383.phpt @@ -1,5 +1,5 @@ --TEST-- -Bug #14383 (using postgres with DBA causes DBA not to be able to find any keys) +Bug #14383 (8.0+) (using postgres with DBA causes DBA not to be able to find any keys) --SKIPIF-- <?php require_once(dirname(__FILE__).'/../../dba/tests/skipif.inc'); diff --git a/ext/pgsql/tests/80_bug36625.phpt b/ext/pgsql/tests/80_bug36625.phpt index 9cc8a1d4fd..e1b7fa1b50 100644 --- a/ext/pgsql/tests/80_bug36625.phpt +++ b/ext/pgsql/tests/80_bug36625.phpt @@ -1,5 +1,5 @@ --TEST-- -Bug #36625 (pg_trace() does not work) +Bug #36625 (8.0+) (pg_trace() does not work) --SKIPIF-- <?php require_once('skipif.inc'); diff --git a/ext/pgsql/tests/80_bug39971.phpt b/ext/pgsql/tests/80_bug39971.phpt index 45d26319d3..49f370b88d 100644 --- a/ext/pgsql/tests/80_bug39971.phpt +++ b/ext/pgsql/tests/80_bug39971.phpt @@ -1,5 +1,5 @@ --TEST-- -Bug #39971 (pg_insert/pg_update do not allow now() to be used for timestamp fields) +Bug #39971 (8.0+) (pg_insert/pg_update do not allow now() to be used for timestamp fields) --SKIPIF-- <?php require_once('skipif.inc'); diff --git a/ext/pgsql/tests/config.inc b/ext/pgsql/tests/config.inc index d4bbb33824..ffe31a875e 100644 --- a/ext/pgsql/tests/config.inc +++ b/ext/pgsql/tests/config.inc @@ -2,8 +2,10 @@ // These vars are used to connect db and create test table. // values can be set to meet your environment +// "test" database must be existed. i.e. "createdb test" before testing +// PostgreSQL uses login name as username, user must have access to "test" database. $conn_str = "host=localhost dbname=test port=5432"; // connection string -$table_name = "php_pgsql_test"; // test table that should be exist +$table_name = "php_pgsql_test"; // test table that will be created $num_test_record = 1000; // Number of records to create $table_def = "CREATE TABLE php_pgsql_test (num int, str text, bin bytea);"; // Test table diff --git a/ext/phar/dirstream.c b/ext/phar/dirstream.c index c29ca9d968..b090577306 100644 --- a/ext/phar/dirstream.c +++ b/ext/phar/dirstream.c @@ -319,7 +319,7 @@ PHAR_ADD_ENTRY: /** * Open a directory handle within a phar archive */ -php_stream *phar_wrapper_open_dir(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) /* {{{ */ +php_stream *phar_wrapper_open_dir(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) /* {{{ */ { php_url *resource = NULL; php_stream *ret; @@ -432,7 +432,7 @@ php_stream *phar_wrapper_open_dir(php_stream_wrapper *wrapper, char *path, char /** * Make a new directory within a phar archive */ -int phar_wrapper_mkdir(php_stream_wrapper *wrapper, char *url_from, int mode, int options, php_stream_context *context TSRMLS_DC) /* {{{ */ +int phar_wrapper_mkdir(php_stream_wrapper *wrapper, const char *url_from, int mode, int options, php_stream_context *context TSRMLS_DC) /* {{{ */ { phar_entry_info entry, *e; phar_archive_data *phar = NULL; @@ -564,7 +564,7 @@ int phar_wrapper_mkdir(php_stream_wrapper *wrapper, char *url_from, int mode, in /** * Remove a directory within a phar archive */ -int phar_wrapper_rmdir(php_stream_wrapper *wrapper, char *url, int options, php_stream_context *context TSRMLS_DC) /* {{{ */ +int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options, php_stream_context *context TSRMLS_DC) /* {{{ */ { phar_entry_info *entry; phar_archive_data *phar = NULL; diff --git a/ext/phar/dirstream.h b/ext/phar/dirstream.h index 9b07c9d799..030fe6536e 100644 --- a/ext/phar/dirstream.h +++ b/ext/phar/dirstream.h @@ -20,11 +20,11 @@ /* $Id$ */ BEGIN_EXTERN_C() -int phar_wrapper_mkdir(php_stream_wrapper *wrapper, char *url_from, int mode, int options, php_stream_context *context TSRMLS_DC); -int phar_wrapper_rmdir(php_stream_wrapper *wrapper, char *url, int options, php_stream_context *context TSRMLS_DC); +int phar_wrapper_mkdir(php_stream_wrapper *wrapper, const char *url_from, int mode, int options, php_stream_context *context TSRMLS_DC); +int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options, php_stream_context *context TSRMLS_DC); #ifdef PHAR_DIRSTREAM -php_url* phar_parse_url(php_stream_wrapper *wrapper, char *filename, char *mode, int options TSRMLS_DC); +php_url* phar_parse_url(php_stream_wrapper *wrapper, const char *filename, const char *mode, int options TSRMLS_DC); /* directory handlers */ static size_t phar_dir_write(php_stream *stream, const char *buf, size_t count TSRMLS_DC); @@ -33,7 +33,7 @@ static int phar_dir_close(php_stream *stream, int close_handle TSRMLS_DC); static int phar_dir_flush(php_stream *stream TSRMLS_DC); static int phar_dir_seek( php_stream *stream, off_t offset, int whence, off_t *newoffset TSRMLS_DC); #else -php_stream* phar_wrapper_open_dir(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC); +php_stream* phar_wrapper_open_dir(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC); #endif END_EXTERN_C() diff --git a/ext/phar/phar.c b/ext/phar/phar.c index ec8e5fbde7..e8d1139cfa 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -2251,13 +2251,13 @@ last_time: * * This is used by phar_parse_url() */ -int phar_split_fname(char *filename, int filename_len, char **arch, int *arch_len, char **entry, int *entry_len, int executable, int for_create TSRMLS_DC) /* {{{ */ +int phar_split_fname(const char *filename, int filename_len, char **arch, int *arch_len, char **entry, int *entry_len, int executable, int for_create TSRMLS_DC) /* {{{ */ { const char *ext_str; #ifdef PHP_WIN32 char *save; #endif - int ext_len, free_filename = 0; + int ext_len; if (!strncasecmp(filename, "phar://", 7)) { filename += 7; @@ -2266,7 +2266,6 @@ int phar_split_fname(char *filename, int filename_len, char **arch, int *arch_le ext_len = 0; #ifdef PHP_WIN32 - free_filename = 1; save = filename; filename = estrndup(filename, filename_len); phar_unixify_path_separators(filename, filename_len); @@ -2282,10 +2281,9 @@ int phar_split_fname(char *filename, int filename_len, char **arch, int *arch_le #endif } - if (free_filename) { - efree(filename); - } - +#ifdef PHP_WIN32 + efree(filename); +#endif return FAILURE; } @@ -2308,9 +2306,9 @@ int phar_split_fname(char *filename, int filename_len, char **arch, int *arch_le *entry = estrndup("/", 1); } - if (free_filename) { - efree(filename); - } +#ifdef PHP_WIN32 + efree(filename); +#endif return SUCCESS; } diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h index daa85f1b70..e0a9faf38f 100644 --- a/ext/phar/phar_internal.h +++ b/ext/phar/phar_internal.h @@ -63,9 +63,6 @@ #include "ext/spl/spl_iterators.h" #endif #include "php_phar.h" -#ifdef HAVE_STDINT_H -#include <stdint.h> -#endif #ifdef PHAR_HASH_OK #include "ext/hash/php_hash.h" #include "ext/hash/php_hash_sha.h" @@ -690,11 +687,11 @@ int phar_entry_delref(phar_entry_data *idata TSRMLS_DC); phar_entry_info *phar_get_entry_info(phar_archive_data *phar, char *path, int path_len, char **error, int security TSRMLS_DC); phar_entry_info *phar_get_entry_info_dir(phar_archive_data *phar, char *path, int path_len, char dir, char **error, int security TSRMLS_DC); -phar_entry_data *phar_get_or_create_entry_data(char *fname, int fname_len, char *path, int path_len, char *mode, char allow_dir, char **error, int security TSRMLS_DC); -int phar_get_entry_data(phar_entry_data **ret, char *fname, int fname_len, char *path, int path_len, char *mode, char allow_dir, char **error, int security TSRMLS_DC); +phar_entry_data *phar_get_or_create_entry_data(char *fname, int fname_len, char *path, int path_len, const char *mode, char allow_dir, char **error, int security TSRMLS_DC); +int phar_get_entry_data(phar_entry_data **ret, char *fname, int fname_len, char *path, int path_len, const char *mode, char allow_dir, char **error, int security TSRMLS_DC); int phar_flush(phar_archive_data *archive, char *user_stub, long len, int convert, char **error TSRMLS_DC); int phar_detect_phar_fname_ext(const char *filename, int filename_len, const char **ext_str, int *ext_len, int executable, int for_create, int is_complete TSRMLS_DC); -int phar_split_fname(char *filename, int filename_len, char **arch, int *arch_len, char **entry, int *entry_len, int executable, int for_create TSRMLS_DC); +int phar_split_fname(const char *filename, int filename_len, char **arch, int *arch_len, char **entry, int *entry_len, int executable, int for_create TSRMLS_DC); typedef enum { pcr_use_query, diff --git a/ext/phar/stream.c b/ext/phar/stream.c index 401d81e109..d3d4cd655b 100644 --- a/ext/phar/stream.c +++ b/ext/phar/stream.c @@ -56,7 +56,7 @@ php_stream_wrapper php_stream_phar_wrapper = { /** * Open a phar file for streams API */ -php_url* phar_parse_url(php_stream_wrapper *wrapper, char *filename, char *mode, int options TSRMLS_DC) /* {{{ */ +php_url* phar_parse_url(php_stream_wrapper *wrapper, const char *filename, const char *mode, int options TSRMLS_DC) /* {{{ */ { php_url *resource; char *arch = NULL, *entry = NULL, *error; @@ -155,7 +155,7 @@ php_url* phar_parse_url(php_stream_wrapper *wrapper, char *filename, char *mode, /** * used for fopen('phar://...') and company */ -static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) /* {{{ */ +static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) /* {{{ */ { phar_archive_data *phar; phar_entry_data *idata; @@ -563,7 +563,7 @@ static int phar_stream_stat(php_stream *stream, php_stream_statbuf *ssb TSRMLS_D /** * Stream wrapper stat implementation of stat() */ -static int phar_wrapper_stat(php_stream_wrapper *wrapper, char *url, int flags, +static int phar_wrapper_stat(php_stream_wrapper *wrapper, const char *url, int flags, php_stream_statbuf *ssb, php_stream_context *context TSRMLS_DC) /* {{{ */ { php_url *resource = NULL; @@ -686,7 +686,7 @@ free_resource: /** * Unlink a file within a phar archive */ -static int phar_wrapper_unlink(php_stream_wrapper *wrapper, char *url, int options, php_stream_context *context TSRMLS_DC) /* {{{ */ +static int phar_wrapper_unlink(php_stream_wrapper *wrapper, const char *url, int options, php_stream_context *context TSRMLS_DC) /* {{{ */ { php_url *resource; char *internal_file, *error; @@ -762,7 +762,7 @@ static int phar_wrapper_unlink(php_stream_wrapper *wrapper, char *url, int optio } /* }}} */ -static int phar_wrapper_rename(php_stream_wrapper *wrapper, char *url_from, char *url_to, int options, php_stream_context *context TSRMLS_DC) /* {{{ */ +static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from, const char *url_to, int options, php_stream_context *context TSRMLS_DC) /* {{{ */ { php_url *resource_from, *resource_to; char *error; diff --git a/ext/phar/stream.h b/ext/phar/stream.h index b22b67ab01..0155759d12 100644 --- a/ext/phar/stream.h +++ b/ext/phar/stream.h @@ -21,13 +21,13 @@ BEGIN_EXTERN_C() -php_url* phar_parse_url(php_stream_wrapper *wrapper, char *filename, char *mode, int options TSRMLS_DC); +php_url* phar_parse_url(php_stream_wrapper *wrapper, const char *filename, const char *mode, int options TSRMLS_DC); void phar_entry_remove(phar_entry_data *idata, char **error TSRMLS_DC); -static php_stream* phar_wrapper_open_url(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC); -static int phar_wrapper_rename(php_stream_wrapper *wrapper, char *url_from, char *url_to, int options, php_stream_context *context TSRMLS_DC); -static int phar_wrapper_unlink(php_stream_wrapper *wrapper, char *url, int options, php_stream_context *context TSRMLS_DC); -static int phar_wrapper_stat(php_stream_wrapper *wrapper, char *url, int flags, php_stream_statbuf *ssb, php_stream_context *context TSRMLS_DC); +static php_stream* phar_wrapper_open_url(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC); +static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from, const char *url_to, int options, php_stream_context *context TSRMLS_DC); +static int phar_wrapper_unlink(php_stream_wrapper *wrapper, const char *url, int options, php_stream_context *context TSRMLS_DC); +static int phar_wrapper_stat(php_stream_wrapper *wrapper, const char *url, int flags, php_stream_statbuf *ssb, php_stream_context *context TSRMLS_DC); /* file/stream handlers */ static size_t phar_stream_write(php_stream *stream, const char *buf, size_t count TSRMLS_DC); diff --git a/ext/phar/tests/phpinfo_004.phpt b/ext/phar/tests/phpinfo_004.phpt index 24263f07be..c57e850d82 100644 --- a/ext/phar/tests/phpinfo_004.phpt +++ b/ext/phar/tests/phpinfo_004.phpt @@ -23,9 +23,9 @@ phpinfo(INFO_MODULES); ?> ===DONE=== --EXPECTF-- -%a<br /> +%a <h2><a name="module_Phar">Phar</a></h2> -<table border="0" cellpadding="3" width="600"> +<table> <tr class="h"><th>Phar: PHP Archive support</th><th>enabled</th></tr> <tr><td class="e">Phar EXT version </td><td class="v">%s </td></tr> <tr><td class="e">Phar API version </td><td class="v">1.1.1 </td></tr> @@ -36,20 +36,20 @@ phpinfo(INFO_MODULES); <tr><td class="e">gzip compression </td><td class="v">enabled </td></tr> <tr><td class="e">bzip2 compression </td><td class="v">enabled </td></tr> <tr><td class="e">OpenSSL support </td><td class="v">disabled (install ext/openssl) </td></tr> -</table><br /> -<table border="0" cellpadding="3" width="600"> +</table> +<table> <tr class="v"><td> Phar based on pear/PHP_Archive, original concept by Davey Shafik.<br />Phar fully realized by Gregory Beaver and Marcus Boerger.<br />Portions of tar implementation Copyright (c) %d-%d Tim Kientzle.</td></tr> -</table><br /> -<table border="0" cellpadding="3" width="600"> +</table> +<table> <tr class="h"><th>Directive</th><th>Local Value</th><th>Master Value</th></tr> <tr><td class="e">phar.cache_list</td><td class="v"><i>no value</i></td><td class="v"><i>no value</i></td></tr> <tr><td class="e">phar.readonly</td><td class="v">Off</td><td class="v">Off</td></tr> <tr><td class="e">phar.require_hash</td><td class="v">Off</td><td class="v">Off</td></tr> -</table><br /> -%a<br /> +</table> +%a <h2><a name="module_Phar">Phar</a></h2> -<table border="0" cellpadding="3" width="600"> +<table> <tr class="h"><th>Phar: PHP Archive support</th><th>enabled</th></tr> <tr><td class="e">Phar EXT version </td><td class="v">%s </td></tr> <tr><td class="e">Phar API version </td><td class="v">1.1.1 </td></tr> @@ -60,16 +60,16 @@ Phar based on pear/PHP_Archive, original concept by Davey Shafik.<br />Phar full <tr><td class="e">gzip compression </td><td class="v">enabled </td></tr> <tr><td class="e">bzip2 compression </td><td class="v">enabled </td></tr> <tr><td class="e">OpenSSL support </td><td class="v">disabled (install ext/openssl) </td></tr> -</table><br /> -<table border="0" cellpadding="3" width="600"> +</table> +<table> <tr class="v"><td> Phar based on pear/PHP_Archive, original concept by Davey Shafik.<br />Phar fully realized by Gregory Beaver and Marcus Boerger.<br />Portions of tar implementation Copyright (c) %d-%d Tim Kientzle.</td></tr> -</table><br /> -<table border="0" cellpadding="3" width="600"> +</table> +<table> <tr class="h"><th>Directive</th><th>Local Value</th><th>Master Value</th></tr> <tr><td class="e">phar.cache_list</td><td class="v"><i>no value</i></td><td class="v"><i>no value</i></td></tr> <tr><td class="e">phar.readonly</td><td class="v">On</td><td class="v">Off</td></tr> <tr><td class="e">phar.require_hash</td><td class="v">On</td><td class="v">Off</td></tr> -</table><br /> -%a<br /> +</table> +%a </div></body></html>===DONE=== diff --git a/ext/phar/util.c b/ext/phar/util.c index 8348a47874..38aa549f00 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -572,7 +572,7 @@ not_stream: * appended, truncated, or read. For read, if the entry is marked unmodified, it is * assumed that the file pointer, if present, is opened for reading */ -int phar_get_entry_data(phar_entry_data **ret, char *fname, int fname_len, char *path, int path_len, char *mode, char allow_dir, char **error, int security TSRMLS_DC) /* {{{ */ +int phar_get_entry_data(phar_entry_data **ret, char *fname, int fname_len, char *path, int path_len, const char *mode, char allow_dir, char **error, int security TSRMLS_DC) /* {{{ */ { phar_archive_data *phar; phar_entry_info *entry; @@ -733,7 +733,7 @@ really_get_entry: /** * Create a new dummy file slot within a writeable phar for a newly created file */ -phar_entry_data *phar_get_or_create_entry_data(char *fname, int fname_len, char *path, int path_len, char *mode, char allow_dir, char **error, int security TSRMLS_DC) /* {{{ */ +phar_entry_data *phar_get_or_create_entry_data(char *fname, int fname_len, char *path, int path_len, const char *mode, char allow_dir, char **error, int security TSRMLS_DC) /* {{{ */ { phar_archive_data *phar; phar_entry_info *entry, etemp; diff --git a/ext/session/php_session.h b/ext/session/php_session.h index e8e79f0fa6..4307e6afc5 100644 --- a/ext/session/php_session.h +++ b/ext/session/php_session.h @@ -180,6 +180,7 @@ typedef struct _php_ps_globals { double rfc1867_min_freq; /* session.upload_progress.min_freq */ zend_bool use_strict_mode; /* whether or not PHP accepts unknown session ids */ + unsigned char session_data_hash[16]; /* binary MD5 hash length */ } php_ps_globals; typedef php_ps_globals zend_ps_globals; diff --git a/ext/session/session.c b/ext/session/session.c index 7bb6584621..5b4820a65c 100644 --- a/ext/session/session.c +++ b/ext/session/session.c @@ -505,8 +505,17 @@ static void php_session_initialize(TSRMLS_D) /* {{{ */ */ } if (val) { + PHP_MD5_CTX context; + + /* Store read data's MD5 hash */ + PHP_MD5Init(&context); + PHP_MD5Update(&context, val, vallen); + PHP_MD5Final(PS(session_data_hash), &context); + php_session_decode(val, vallen TSRMLS_CC); efree(val); + } else { + memset(PS(session_data_hash),'\0', 16); } if (!PS(use_cookies) && PS(send_cookie)) { @@ -529,7 +538,19 @@ static void php_session_save_current_state(TSRMLS_D) /* {{{ */ val = php_session_encode(&vallen TSRMLS_CC); if (val) { - ret = PS(mod)->s_write(&PS(mod_data), PS(id), val, vallen TSRMLS_CC); + PHP_MD5_CTX context; + unsigned char digest[16]; + + /* Generate data's MD5 hash */ + PHP_MD5Init(&context); + PHP_MD5Update(&context, val, vallen); + PHP_MD5Final(digest, &context); + /* Write only when save is required */ + if (memcmp(digest, PS(session_data_hash), 16)) { + ret = PS(mod)->s_write(&PS(mod_data), PS(id), val, vallen TSRMLS_CC); + } else { + ret = SUCCESS; + } efree(val); } else { ret = PS(mod)->s_write(&PS(mod_data), PS(id), "", 0 TSRMLS_CC); @@ -727,6 +748,7 @@ static PHP_INI_MH(OnUpdateHashFunc) /* {{{ */ } #endif /* HAVE_HASH_EXT }}} */ + php_error_docref(NULL TSRMLS_CC, E_WARNING, "session.configuration 'session.hash_function' must be existing hash function. %s does not exist.", new_value); return FAILURE; } /* }}} */ @@ -1567,6 +1589,26 @@ static void php_session_flush(TSRMLS_D) /* {{{ */ } /* }}} */ +static void php_session_abort(TSRMLS_D) /* {{{ */ +{ + if (PS(session_status) == php_session_active) { + PS(session_status) = php_session_none; + if (PS(mod_data) || PS(mod_user_implemented)) { + PS(mod)->s_close(&PS(mod_data) TSRMLS_CC); + } + } +} +/* }}} */ + +static void php_session_reset(TSRMLS_D) /* {{{ */ +{ + if (PS(session_status) == php_session_active) { + php_session_initialize(TSRMLS_C); + } +} +/* }}} */ + + PHPAPI void session_adapt_url(const char *url, size_t urllen, char **new, size_t *newlen TSRMLS_DC) /* {{{ */ { if (PS(apply_trans_sid) && (PS(session_status) == php_session_active)) { @@ -1685,6 +1727,31 @@ static PHP_FUNCTION(session_module_name) } /* }}} */ +/* {{{ proto mixed session_serializer_name([string newname]) + Return the current serializer name used for encode/decode session data. If newname is given, the serialzer name is replaced with newname and return bool */ +static PHP_FUNCTION(session_serializer_name) +{ + char *name = NULL; + int name_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &name, &name_len) == FAILURE) { + return; + } + + /* Return serializer name */ + if (!name) { + RETURN_STRING(zend_ini_string("session.serialize_handler", sizeof("session.serialize_handler"), 0), 1); + } + + /* Set serializer name */ + if (zend_alter_ini_entry("session.serialize_handler", sizeof("session.serialize_handler"), name, name_len, PHP_INI_USER, PHP_INI_STAGE_RUNTIME) == SUCCESS) { + RETURN_TRUE; + } else { + RETURN_FALSE; + } +} +/* }}} */ + /* {{{ proto void session_set_save_handler(string open, string close, string read, string write, string destroy, string gc, string create_sid) Sets user-level functions */ static PHP_FUNCTION(session_set_save_handler) @@ -2048,6 +2115,22 @@ static PHP_FUNCTION(session_write_close) } /* }}} */ +/* {{{ proto void session_abort(void) + Abort session and end session. Session data will not be written */ +static PHP_FUNCTION(session_abort) +{ + php_session_abort(TSRMLS_C); +} +/* }}} */ + +/* {{{ proto void session_reset(void) + Reset session data from saved session data */ +static PHP_FUNCTION(session_reset) +{ + php_session_reset(TSRMLS_C); +} +/* }}} */ + /* {{{ proto int session_status(void) Returns the current session status */ static PHP_FUNCTION(session_status) @@ -2060,6 +2143,39 @@ static PHP_FUNCTION(session_status) } /* }}} */ +/* {{{ proto int session_gc([int maxlifetime]) + Execute garbage collection returns number of deleted data */ +static PHP_FUNCTION(session_gc) +{ + int nrdels = -1; + long maxlifetime = PS(gc_maxlifetime); + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &maxlifetime) == FAILURE) { + return; + } + + /* Session must be active to have PS(mod) */ + if (PS(session_status) != php_session_active) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Trying to garbage collect without active session"); + RETURN_FALSE; + } + + if (!PS(mod) || !PS(mod)->s_gc) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Session save handler does not have gc()"); + RETURN_FALSE; + } + PS(mod)->s_gc(&PS(mod_data), maxlifetime, &nrdels TSRMLS_CC); + + if (nrdels < 0) { + /* Files save handler return -1 if there is not a permission to remove. + Save handlder should return negative nrdels when something wrong. */ + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Session gc failed. Check permission or session storage"); + RETURN_FALSE; + } + RETURN_LONG((long)nrdels); +} +/* }}} */ + /* {{{ proto void session_register_shutdown(void) Registers session_write_close() as a shutdown function */ static PHP_FUNCTION(session_register_shutdown) @@ -2106,6 +2222,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_session_module_name, 0, 0, 0) ZEND_ARG_INFO(0, module) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_session_serializer_name, 0, 0, 0) + ZEND_ARG_INFO(0, module) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO_EX(arginfo_session_save_path, 0, 0, 0) ZEND_ARG_INFO(0, path) ZEND_END_ARG_INFO() @@ -2151,6 +2271,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_session_set_cookie_params, 0, 0, 1) ZEND_ARG_INFO(0, httponly) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO(arginfo_session_gc, 0) + ZEND_ARG_INFO(0, maxlifetime) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO(arginfo_session_class_open, 0) ZEND_ARG_INFO(0, save_path) ZEND_ARG_INFO(0, session_name) @@ -2185,6 +2309,7 @@ ZEND_END_ARG_INFO() static const zend_function_entry session_functions[] = { PHP_FE(session_name, arginfo_session_name) PHP_FE(session_module_name, arginfo_session_module_name) + PHP_FE(session_serializer_name, arginfo_session_serializer_name) PHP_FE(session_save_path, arginfo_session_save_path) PHP_FE(session_id, arginfo_session_id) PHP_FE(session_regenerate_id, arginfo_session_regenerate_id) @@ -2199,7 +2324,10 @@ static const zend_function_entry session_functions[] = { PHP_FE(session_set_cookie_params, arginfo_session_set_cookie_params) PHP_FE(session_get_cookie_params, arginfo_session_void) PHP_FE(session_write_close, arginfo_session_void) + PHP_FE(session_abort, arginfo_session_void) + PHP_FE(session_reset, arginfo_session_void) PHP_FE(session_status, arginfo_session_void) + PHP_FE(session_gc, arginfo_session_gc) PHP_FE(session_register_shutdown, arginfo_session_void) PHP_FALIAS(session_commit, session_write_close, arginfo_session_void) PHP_FE_END diff --git a/ext/session/tests/session_abort_basic.phpt b/ext/session/tests/session_abort_basic.phpt new file mode 100644 index 0000000000..4a6702f0dc --- /dev/null +++ b/ext/session/tests/session_abort_basic.phpt @@ -0,0 +1,51 @@ +--TEST-- +Test session_abort() function : basic functionality +--SKIPIF-- +<?php include('skipif.inc'); ?> +--INI-- +session.save_path= +session.name=PHPSESSID +--FILE-- +<?php + +ob_start(); + +/* + * Prototype : void session_abort(void) + * Description : Should abort session. Session data should not be written. + * Source code : ext/session/session.c + */ + +echo "*** Testing session_abort() : basic functionality ***\n"; + +session_start(); +$session_id = session_id(); +$_SESSION['foo'] = 123; +session_commit(); + +session_id($session_id); +session_start(); +$_SESSION['bar'] = 456; +var_dump($_SESSION); +session_abort(); + +session_id($session_id); +session_start(); +var_dump($_SESSION); // Should only have 'foo' + +echo "Done".PHP_EOL; + +?> +--EXPECTF-- +*** Testing session_abort() : basic functionality *** +array(2) { + ["foo"]=> + int(123) + ["bar"]=> + int(456) +} +array(1) { + ["foo"]=> + int(123) +} +Done diff --git a/ext/session/tests/session_gc_basic.phpt b/ext/session/tests/session_gc_basic.phpt new file mode 100644 index 0000000000..f0726ce93b --- /dev/null +++ b/ext/session/tests/session_gc_basic.phpt @@ -0,0 +1,56 @@ +--TEST-- +Test session_gc() function : basic functionality +--SKIPIF-- +<?php include('skipif.inc'); ?> +--INI-- +session.serialize_handler=php +session.save_handler=files +session.maxlifetime=782000 +--FILE-- +<?php +error_reporting(E_ALL); + +ob_start(); + +/* + * Prototype : int session_gc([int maxlifetime]) + * Description : Execute gc and return number of deleted data + * Source code : ext/session/session.c + */ + +echo "*** Testing session_gc() : basic functionality ***\n"; + +// Should fail. It requires active session. +var_dump(session_gc()); + +session_start(); +// Should succeed with some number +var_dump(session_gc()); +// Secound time must be int(0) +var_dump(session_gc()); +session_write_close(); + +// Start&stop session to generate +session_start(); +session_write_close(); +session_start(); +session_write_close(); +session_start(); +session_write_close(); + +session_start(); +$ndeleted = session_gc(0); // Delete all +var_dump($ndeleted >= 3); + +echo "Done".PHP_EOL; + +?> +--EXPECTF-- +*** Testing session_gc() : basic functionality *** + +Warning: session_gc(): Trying to garbage collect without active session in %s on line 15 +bool(false) +int(%d) +int(0) +bool(true) +Done diff --git a/ext/session/tests/session_hash_function_basic.phpt b/ext/session/tests/session_hash_function_basic.phpt new file mode 100644 index 0000000000..663852d9d1 --- /dev/null +++ b/ext/session/tests/session_hash_function_basic.phpt @@ -0,0 +1,52 @@ +--TEST-- +Test session.hash_function ini setting : basic functionality +--SKIPIF-- +<?php include('skipif.inc'); ?> +--INI-- +session.hash_bits_per_character=4 +--FILE-- +<?php + +ob_start(); + +echo "*** Testing session.hash_function : basic functionality ***\n"; + +var_dump(ini_set('session.hash_function', 'md5')); +var_dump(session_start()); +var_dump(!empty(session_id()), session_id()); +var_dump(session_destroy()); + +var_dump(ini_set('session.hash_function', 'sha1')); +var_dump(session_start()); +var_dump(!empty(session_id()), session_id()); +var_dump(session_destroy()); + +var_dump(ini_set('session.hash_function', 'none')); // Should fail +var_dump(session_start()); +var_dump(!empty(session_id()), session_id()); +var_dump(session_destroy()); + + +echo "Done"; +ob_end_flush(); +?> +--EXPECTF-- +*** Testing session.hash_function : basic functionality *** +string(1) "0" +bool(true) +bool(true) +string(32) "%s" +bool(true) +string(3) "md5" +bool(true) +bool(true) +string(40) "%s" +bool(true) + +Warning: ini_set(): session.configuration 'session.hash_function' must be existing hash function. none does not exist. in %s/session_hash_function_basic.php on line 17 +bool(false) +bool(true) +bool(true) +string(40) "%s" +bool(true) +Done diff --git a/ext/session/tests/session_reset_basic.phpt b/ext/session/tests/session_reset_basic.phpt new file mode 100644 index 0000000000..75c6a04119 --- /dev/null +++ b/ext/session/tests/session_reset_basic.phpt @@ -0,0 +1,49 @@ +--TEST-- +Test session_reset() function : basic functionality +--SKIPIF-- +<?php include('skipif.inc'); ?> +--INI-- +session.save_path= +session.name=PHPSESSID +--FILE-- +<?php + +ob_start(); + +/* + * Prototype : void session_reset(void) + * Description : Should abort session. Session data should not be written. + * Source code : ext/session/session.c + */ + +echo "*** Testing session_abort() : basic functionality ***\n"; + +session_start(); +$session_id = session_id(); +$_SESSION['foo'] = 123; +session_commit(); + +session_id($session_id); +session_start(); +$_SESSION['bar'] = 456; +var_dump($_SESSION); +session_reset(); + +var_dump($_SESSION); // Should only have 'foo' + +echo "Done".PHP_EOL; + +?> +--EXPECTF-- +*** Testing session_abort() : basic functionality *** +array(2) { + ["foo"]=> + int(123) + ["bar"]=> + int(456) +} +array(1) { + ["foo"]=> + int(123) +} +Done diff --git a/ext/session/tests/session_serializer_name_basic.phpt b/ext/session/tests/session_serializer_name_basic.phpt new file mode 100644 index 0000000000..ca292dd36f --- /dev/null +++ b/ext/session/tests/session_serializer_name_basic.phpt @@ -0,0 +1,37 @@ +--TEST-- +Test session_serializer_name() function : basic functionality +--SKIPIF-- +<?php include('skipif.inc'); ?> +--FILE-- +<?php + +ob_start(); + +/* + * Prototype : mixed session_serializer_name([string name]) + * Description : Change/get serialize handler name + * Source code : ext/session/session.c + */ + +echo "*** Testing session_serializer_name() : basic functionality ***\n"; + +var_dump(session_serializer_name()); +var_dump(session_serializer_name('php')); +var_dump(session_serializer_name('php_binary')); +var_dump(session_serializer_name('none')); +var_dump(session_serializer_name()); + +echo "Done"; +ob_end_flush(); +?> +--EXPECTF-- +*** Testing session_serializer_name() : basic functionality *** +string(3) "php" +bool(true) +bool(true) + +Warning: session_serializer_name(): Cannot find serialization handler 'none' in %s/session_serializer_name_basic.php on line 16 +bool(false) +string(10) "php_binary" +Done + diff --git a/ext/session/tests/session_set_save_handler_basic.phpt b/ext/session/tests/session_set_save_handler_basic.phpt index 3897ba9a92..e8496e8afb 100644 --- a/ext/session/tests/session_set_save_handler_basic.phpt +++ b/ext/session/tests/session_set_save_handler_basic.phpt @@ -43,6 +43,7 @@ session_id($session_id); session_set_save_handler("open", "close", "read", "write", "destroy", "gc"); session_start(); var_dump($_SESSION); +$_SESSION['Bar'] = 'Foo'; session_write_close(); ob_end_flush(); @@ -91,5 +92,5 @@ array(3) { ["Guff"]=> int(1234567890) } -Write [%s,%s,Blah|s:12:"Hello World!";Foo|b:0;Guff|i:1234567890;] +Write [%s,%s,Blah|s:12:"Hello World!";Foo|b:0;Guff|i:1234567890;Bar|s:3:"Foo";] Close [%s,PHPSESSID] diff --git a/ext/session/tests/session_set_save_handler_class_003.phpt b/ext/session/tests/session_set_save_handler_class_003.phpt index e9a3cc2feb..29b3846851 100644 --- a/ext/session/tests/session_set_save_handler_class_003.phpt +++ b/ext/session/tests/session_set_save_handler_class_003.phpt @@ -58,6 +58,7 @@ session_set_save_handler($handler); session_start(); +$_SESSION['bar'] = 'hello'; session_write_close(); session_unset(); @@ -71,8 +72,10 @@ array(1) { } int(4) string(%d) "%s" -array(1) { +array(2) { ["foo"]=> string(5) "hello" + ["bar"]=> + string(5) "hello" } string(3) "hai" diff --git a/ext/session/tests/session_set_save_handler_class_007.phpt b/ext/session/tests/session_set_save_handler_class_007.phpt index 7344ae1ef3..55f722515e 100644 --- a/ext/session/tests/session_set_save_handler_class_007.phpt +++ b/ext/session/tests/session_set_save_handler_class_007.phpt @@ -56,6 +56,7 @@ $handler = new MySession(2); session_set_save_handler($handler); session_start(); +$_SESSION['abc'] = 'xyz'; // implicit close (called by shutdown function) echo "done\n"; ob_end_flush(); @@ -69,6 +70,6 @@ ob_end_flush(); (#2) constructor called (#1) destructor called done -(#2) writing %s = foo|s:3:"bar"; +(#2) writing %s = foo|s:3:"bar";abc|s:3:"xyz"; (#2) closing %s (#2) destructor called diff --git a/ext/session/tests/session_set_save_handler_closures.phpt b/ext/session/tests/session_set_save_handler_closures.phpt index 21b2c68737..1251886b01 100644 --- a/ext/session/tests/session_set_save_handler_closures.phpt +++ b/ext/session/tests/session_set_save_handler_closures.phpt @@ -42,6 +42,7 @@ echo "Starting session again..!\n"; session_id($session_id); session_set_save_handler($open_closure, $close_closure, $read_closure, $write_closure, $destroy_closure, $gc_closure); session_start(); +$_SESSION['Bar'] = 'Foo'; var_dump($_SESSION); session_write_close(); @@ -83,13 +84,15 @@ array(3) { Starting session again..! Open [%s,PHPSESSID] Read [%s,%s] -array(3) { +array(4) { ["Blah"]=> string(12) "Hello World!" ["Foo"]=> bool(false) ["Guff"]=> int(1234567890) + ["Bar"]=> + string(3) "Foo" } -Write [%s,%s,Blah|s:12:"Hello World!";Foo|b:0;Guff|i:1234567890;] +Write [%s,%s,Blah|s:12:"Hello World!";Foo|b:0;Guff|i:1234567890;Bar|s:3:"Foo";] Close [%s,PHPSESSID] diff --git a/ext/session/tests/session_set_save_handler_write_short_circuit.phpt b/ext/session/tests/session_set_save_handler_write_short_circuit.phpt new file mode 100644 index 0000000000..02ca182ec6 --- /dev/null +++ b/ext/session/tests/session_set_save_handler_write_short_circuit.phpt @@ -0,0 +1,104 @@ +--TEST-- +Test session_set_save_handler() function : test write short circuit +--INI-- +session.save_path= +session.name=PHPSESSID +--SKIPIF-- +<?php include('skipif.inc'); ?> +--FILE-- +<?php + +ob_start(); + +/* + * Prototype : bool session_set_save_handler(callback $open, callback $close, callback $read, callback $write, callback $destroy, callback $gc) + * Description : Sets user-level session storage functions + * Source code : ext/session/session.c + */ + +echo "*** Testing session_set_save_handler() : test write short circuit ***\n"; + +require_once "save_handler.inc"; +$path = dirname(__FILE__); +session_save_path($path); +session_set_save_handler("open", "close", "read", "write", "destroy", "gc"); + +session_start(); +$session_id = session_id(); +$_SESSION["Blah"] = "Hello World!"; +$_SESSION["Foo"] = FALSE; +$_SESSION["Guff"] = 1234567890; +var_dump($_SESSION); + +session_write_close(); +session_unset(); +var_dump($_SESSION); + +echo "Starting session again..!\n"; +session_id($session_id); +session_set_save_handler("open", "close", "read", "write", "destroy", "gc"); +session_start(); +var_dump($_SESSION); +$_SESSION['Bar'] = 'Foo'; +session_write_close(); + +echo "Starting session again..!\n"; +session_id($session_id); +session_set_save_handler("open", "close", "read", "write", "destroy", "gc"); +session_start(); +var_dump($_SESSION); +// $_SESSION should be the same and should skip write() +session_write_close(); + +ob_end_flush(); +?> +--EXPECTF-- +*** Testing session_set_save_handler() : test write short circuit *** + +Open [%s,PHPSESSID] +Read [%s,%s] +array(3) { + ["Blah"]=> + string(12) "Hello World!" + ["Foo"]=> + bool(false) + ["Guff"]=> + int(1234567890) +} +Write [%s,%s,Blah|s:12:"Hello World!";Foo|b:0;Guff|i:1234567890;] +Close [%s,PHPSESSID] +array(3) { + ["Blah"]=> + string(12) "Hello World!" + ["Foo"]=> + bool(false) + ["Guff"]=> + int(1234567890) +} +Starting session again..! +Open [%s,PHPSESSID] +Read [%s,%s] +array(3) { + ["Blah"]=> + string(12) "Hello World!" + ["Foo"]=> + bool(false) + ["Guff"]=> + int(1234567890) +} +Write [%s,%s,Blah|s:12:"Hello World!";Foo|b:0;Guff|i:1234567890;Bar|s:3:"Foo";] +Close [%s,PHPSESSID] +Starting session again..! +Open [%s,PHPSESSID] +Read [%s,%s] +array(4) { + ["Blah"]=> + string(12) "Hello World!" + ["Foo"]=> + bool(false) + ["Guff"]=> + int(1234567890) + ["Bar"]=> + string(3) "Foo" +} +Close [%s,PHPSESSID]
\ No newline at end of file diff --git a/ext/simplexml/config.m4 b/ext/simplexml/config.m4 index 387a24ea21..b06f5b00f0 100644 --- a/ext/simplexml/config.m4 +++ b/ext/simplexml/config.m4 @@ -18,6 +18,7 @@ if test "$PHP_SIMPLEXML" != "no"; then PHP_SETUP_LIBXML(SIMPLEXML_SHARED_LIBADD, [ AC_DEFINE(HAVE_SIMPLEXML,1,[ ]) PHP_NEW_EXTENSION(simplexml, simplexml.c sxe.c, $ext_shared) + PHP_INSTALL_HEADERS([ext/simplexml/php_simplexml.h ext/simplexml/php_simplexml_exports.h]) PHP_SUBST(SIMPLEXML_SHARED_LIBADD) ], [ AC_MSG_ERROR([xml2-config not found. Please check your libxml2 installation.]) diff --git a/ext/simplexml/config.w32 b/ext/simplexml/config.w32 index 2d2ed285eb..a02f3dded3 100644 --- a/ext/simplexml/config.w32 +++ b/ext/simplexml/config.w32 @@ -16,6 +16,7 @@ if (PHP_SIMPLEXML == "yes") { MESSAGE("\tSPL support in simplexml disabled"); } ADD_FLAG("CFLAGS_SIMPLEXML", "/D PHP_SIMPLEXML_EXPORTS "); + PHP_INSTALL_HEADERS("ext/simplexml/", "php_simplexml.h php_simplexml_exports.h"); } else { PHP_SIMPLEXML = "no"; WARNING("simplexml not enabled; libraries and headers not found"); diff --git a/ext/skeleton/php_skeleton.h b/ext/skeleton/php_skeleton.h index 495907bbd1..86836c03e2 100644 --- a/ext/skeleton/php_skeleton.h +++ b/ext/skeleton/php_skeleton.h @@ -18,15 +18,6 @@ extern zend_module_entry extname_module_entry; #include "TSRM.h" #endif -PHP_MINIT_FUNCTION(extname); -PHP_MSHUTDOWN_FUNCTION(extname); -PHP_RINIT_FUNCTION(extname); -PHP_RSHUTDOWN_FUNCTION(extname); -PHP_MINFO_FUNCTION(extname); - -PHP_FUNCTION(confirm_extname_compiled); /* For testing, remove later. */ -/* __function_declarations_here__ */ - /* Declare any global variables you may need between the BEGIN and END macros here: diff --git a/ext/skeleton/skeleton.c b/ext/skeleton/skeleton.c index ee4ea74e16..b9a918806c 100644 --- a/ext/skeleton/skeleton.c +++ b/ext/skeleton/skeleton.c @@ -16,41 +16,6 @@ ZEND_DECLARE_MODULE_GLOBALS(extname) /* True global resources - no need for thread safety here */ static int le_extname; -/* {{{ extname_functions[] - * - * Every user visible function must have an entry in extname_functions[]. - */ -const zend_function_entry extname_functions[] = { - PHP_FE(confirm_extname_compiled, NULL) /* For testing, remove later. */ - /* __function_entries_here__ */ - PHP_FE_END /* Must be the last line in extname_functions[] */ -}; -/* }}} */ - -/* {{{ extname_module_entry - */ -zend_module_entry extname_module_entry = { -#if ZEND_MODULE_API_NO >= 20010901 - STANDARD_MODULE_HEADER, -#endif - "extname", - extname_functions, - PHP_MINIT(extname), - PHP_MSHUTDOWN(extname), - PHP_RINIT(extname), /* Replace with NULL if there's nothing to do at request start */ - PHP_RSHUTDOWN(extname), /* Replace with NULL if there's nothing to do at request end */ - PHP_MINFO(extname), -#if ZEND_MODULE_API_NO >= 20010901 - "0.1", /* Replace with version number for your extension */ -#endif - STANDARD_MODULE_PROPERTIES -}; -/* }}} */ - -#ifdef COMPILE_DL_EXTNAME -ZEND_GET_MODULE(extname) -#endif - /* {{{ PHP_INI */ /* Remove comments and fill if you need to have entries in php.ini @@ -61,6 +26,35 @@ PHP_INI_END() */ /* }}} */ +/* Remove the following function when you have successfully modified config.m4 + so that your module can be compiled into PHP, it exists only for testing + purposes. */ + +/* Every user-visible function in PHP should document itself in the source */ +/* {{{ proto string confirm_extname_compiled(string arg) + Return a string to confirm that the module is compiled in */ +PHP_FUNCTION(confirm_extname_compiled) +{ + char *arg = NULL; + int arg_len, len; + char *strg; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) { + return; + } + + len = spprintf(&strg, 0, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "extname", arg); + RETURN_STRINGL(strg, len, 0); +} +/* }}} */ +/* The previous line is meant for vim and emacs, so it can correctly fold and + unfold functions in source code. See the corresponding marks just before + function definition, where the functions purpose is also documented. Please + follow this convention for the convenience of others editing your code. +*/ + +/* __function_stubs_here__ */ + /* {{{ php_extname_init_globals */ /* Uncomment this function if you have INI entries @@ -126,35 +120,36 @@ PHP_MINFO_FUNCTION(extname) } /* }}} */ +/* {{{ extname_functions[] + * + * Every user visible function must have an entry in extname_functions[]. + */ +const zend_function_entry extname_functions[] = { + PHP_FE(confirm_extname_compiled, NULL) /* For testing, remove later. */ + /* __function_entries_here__ */ + PHP_FE_END /* Must be the last line in extname_functions[] */ +}; +/* }}} */ -/* Remove the following function when you have successfully modified config.m4 - so that your module can be compiled into PHP, it exists only for testing - purposes. */ - -/* Every user-visible function in PHP should document itself in the source */ -/* {{{ proto string confirm_extname_compiled(string arg) - Return a string to confirm that the module is compiled in */ -PHP_FUNCTION(confirm_extname_compiled) -{ - char *arg = NULL; - int arg_len, len; - char *strg; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) { - return; - } - - len = spprintf(&strg, 0, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "extname", arg); - RETURN_STRINGL(strg, len, 0); -} +/* {{{ extname_module_entry + */ +zend_module_entry extname_module_entry = { + STANDARD_MODULE_HEADER, + "extname", + extname_functions, + PHP_MINIT(extname), + PHP_MSHUTDOWN(extname), + PHP_RINIT(extname), /* Replace with NULL if there's nothing to do at request start */ + PHP_RSHUTDOWN(extname), /* Replace with NULL if there's nothing to do at request end */ + PHP_MINFO(extname), + "0.1", /* Replace with version number for your extension */ + STANDARD_MODULE_PROPERTIES +}; /* }}} */ -/* The previous line is meant for vim and emacs, so it can correctly fold and - unfold functions in source code. See the corresponding marks just before - function definition, where the functions purpose is also documented. Please - follow this convention for the convenience of others editing your code. -*/ -/* __function_stubs_here__ */ +#ifdef COMPILE_DL_EXTNAME +ZEND_GET_MODULE(extname) +#endif /* * Local variables: 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/spl/php_spl.h b/ext/spl/php_spl.h index 4794f12443..28aa19def3 100644 --- a/ext/spl/php_spl.h +++ b/ext/spl/php_spl.h @@ -20,11 +20,6 @@ #define PHP_SPL_H #include "php.h" -#if defined(PHP_WIN32) -# include "win32/php_stdint.h" -#elif defined(HAVE_STDINT_H) -# include <stdint.h> -#endif #include <stdarg.h> #if 0 diff --git a/ext/standard/array.c b/ext/standard/array.c index 51972033ee..ae6e5d266f 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -830,7 +830,7 @@ PHP_FUNCTION(end) RETURN_FALSE; } - RETURN_ZVAL(*entry, 1, 0); + RETURN_ZVAL_FAST(*entry); } } /* }}} */ @@ -853,7 +853,7 @@ PHP_FUNCTION(prev) RETURN_FALSE; } - RETURN_ZVAL(*entry, 1, 0); + RETURN_ZVAL_FAST(*entry); } } /* }}} */ @@ -876,7 +876,7 @@ PHP_FUNCTION(next) RETURN_FALSE; } - RETURN_ZVAL(*entry, 1, 0); + RETURN_ZVAL_FAST(*entry); } } /* }}} */ @@ -899,7 +899,7 @@ PHP_FUNCTION(reset) RETURN_FALSE; } - RETURN_ZVAL(*entry, 1, 0); + RETURN_ZVAL_FAST(*entry); } } /* }}} */ @@ -918,7 +918,8 @@ PHP_FUNCTION(current) if (zend_hash_get_current_data(array, (void **) &entry) == FAILURE) { RETURN_FALSE; } - RETURN_ZVAL(*entry, 1, 0); + + RETURN_ZVAL_FAST(*entry); } /* }}} */ @@ -958,7 +959,7 @@ PHP_FUNCTION(min) RETVAL_NULL(); } else { if (zend_hash_minmax(Z_ARRVAL_PP(args[0]), php_array_data_compare, 0, (void **) &result TSRMLS_CC) == SUCCESS) { - RETVAL_ZVAL(*result, 1, 0); + RETVAL_ZVAL_FAST(*result); } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Array must contain at least one element"); RETVAL_FALSE; @@ -978,7 +979,7 @@ PHP_FUNCTION(min) } } - RETVAL_ZVAL(*min, 1, 0); + RETVAL_ZVAL_FAST(*min); } if (args) { @@ -1009,7 +1010,7 @@ PHP_FUNCTION(max) RETVAL_NULL(); } else { if (zend_hash_minmax(Z_ARRVAL_PP(args[0]), php_array_data_compare, 1, (void **) &result TSRMLS_CC) == SUCCESS) { - RETVAL_ZVAL(*result, 1, 0); + RETVAL_ZVAL_FAST(*result); } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Array must contain at least one element"); RETVAL_FALSE; @@ -1029,7 +1030,7 @@ PHP_FUNCTION(max) } } - RETVAL_ZVAL(*max, 1, 0); + RETVAL_ZVAL_FAST(*max); } if (args) { @@ -1955,7 +1956,7 @@ static void _phpi_pop(INTERNAL_FUNCTION_PARAMETERS, int off_the_end) zend_hash_internal_pointer_reset(Z_ARRVAL_P(stack)); } zend_hash_get_current_data(Z_ARRVAL_P(stack), (void **)&val); - RETVAL_ZVAL(*val, 1, 0); + RETVAL_ZVAL_FAST(*val); /* Delete the first or last value */ zend_hash_get_current_key_ex(Z_ARRVAL_P(stack), &key, &key_len, &index, 0, NULL); diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index eca7d90368..3e5084e837 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/crypt_freesec.h b/ext/standard/crypt_freesec.h index a87663d4fe..860462a2dd 100644 --- a/ext/standard/crypt_freesec.h +++ b/ext/standard/crypt_freesec.h @@ -4,26 +4,13 @@ #define _CRYPT_FREESEC_H #if PHP_WIN32 -# include "win32/php_stdint.h" # ifndef inline # define inline __inline # endif -#else -# include "php_config.h" -# if HAVE_INTTYPES_H -# include <inttypes.h> -# elif HAVE_STDINT_H -# include <stdint.h> -# endif -# ifndef HAVE_UINT32_T -# if SIZEOF_INT == 4 -typedef unsigned int uint32_t; -# elif SIZEOF_LONG == 4 -typedef unsigned long int uint32_t; -# endif -# endif #endif +#include "php_stdint.h" + #define MD5_HASH_MAX_LEN 120 struct php_crypt_extended_data { diff --git a/ext/standard/crypt_sha256.c b/ext/standard/crypt_sha256.c index d334e3d477..ccfa66bd60 100644 --- a/ext/standard/crypt_sha256.c +++ b/ext/standard/crypt_sha256.c @@ -9,15 +9,9 @@ #include <limits.h> #ifdef PHP_WIN32 -# include "win32/php_stdint.h" # define __alignof__ __alignof # define alloca _alloca #else -# if HAVE_INTTYPES_H -# include <inttypes.h> -# elif HAVE_STDINT_H -# include <stdint.h> -# endif # ifndef HAVE_ALIGNOF # include <stddef.h> # define __alignof__(type) offsetof (struct { char c; type member;}, member) diff --git a/ext/standard/crypt_sha512.c b/ext/standard/crypt_sha512.c index 0955532131..ebabed9d24 100644 --- a/ext/standard/crypt_sha512.c +++ b/ext/standard/crypt_sha512.c @@ -8,15 +8,9 @@ #include <errno.h> #include <limits.h> #ifdef PHP_WIN32 -# include "win32/php_stdint.h" # define __alignof__ __alignof # define alloca _alloca #else -# if HAVE_INTTYPES_H -# include <inttypes.h> -# elif HAVE_STDINT_H -# include <stdint.h> -# endif # ifndef HAVE_ALIGNOF # include <stddef.h> # define __alignof__(type) offsetof (struct { char c; type member;}, member) diff --git a/ext/standard/css.c b/ext/standard/css.c index d76f9ee662..459a7bfc30 100644 --- a/ext/standard/css.c +++ b/ext/standard/css.c @@ -1,4 +1,4 @@ -/* +/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ @@ -12,7 +12,7 @@ | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ - | Authors: Colin Viebrock <colin@easydns.com> | + | Authors: Colin Viebrock <colin@viebrock.ca> | +----------------------------------------------------------------------+ */ @@ -23,25 +23,24 @@ PHPAPI void php_info_print_css(TSRMLS_D) /* {{{ */ { - PUTS("body {background-color: #ffffff; color: #000000;}\n"); - PUTS("body, td, th, h1, h2 {font-family: sans-serif;}\n"); - PUTS("pre {margin: 0px; font-family: monospace;}\n"); - PUTS("a:link {color: #000099; text-decoration: none; background-color: #ffffff;}\n"); + PUTS("body {background-color: #fff; color: #222; font-family: sans-serif;}\n"); + PUTS("pre {margin: 0; font-family: monospace;}\n"); + PUTS("a:link {color: #009; text-decoration: none; background-color: #fff;}\n"); PUTS("a:hover {text-decoration: underline;}\n"); - PUTS("table {border-collapse: collapse;}\n"); + PUTS("table {border-collapse: collapse; border: 0; width: 934px; box-shadow: 1px 2px 3px #ccc;}\n"); PUTS(".center {text-align: center;}\n"); - PUTS(".center table { margin-left: auto; margin-right: auto; text-align: left;}\n"); - PUTS(".center th { text-align: center !important; }\n"); - PUTS("td, th { border: 1px solid #000000; font-size: 75%; vertical-align: baseline;}\n"); + PUTS(".center table {margin: 1em auto; text-align: left;}\n"); + PUTS(".center th {text-align: center !important;}\n"); + PUTS("td, th {border: 1px solid #666; font-size: 75%; vertical-align: baseline; padding: 4px 5px;}\n"); PUTS("h1 {font-size: 150%;}\n"); PUTS("h2 {font-size: 125%;}\n"); PUTS(".p {text-align: left;}\n"); - PUTS(".e {background-color: #ccccff; font-weight: bold; color: #000000;}\n"); - PUTS(".h {background-color: #9999cc; font-weight: bold; color: #000000;}\n"); - PUTS(".v {background-color: #cccccc; color: #000000;}\n"); - PUTS(".vr {background-color: #cccccc; text-align: right; color: #000000;}\n"); - PUTS("img {float: right; border: 0px;}\n"); - PUTS("hr {width: 600px; background-color: #cccccc; border: 0px; height: 1px; color: #000000;}\n"); + PUTS(".e {background-color: #ccf; width: 300px; font-weight: bold;}\n"); + PUTS(".h {background-color: #99c; font-weight: bold;}\n"); + PUTS(".v {background-color: #ddd; max-width: 300px; overflow-x: auto;}\n"); + PUTS(".v i {color: #999;}\n"); + PUTS("img {float: right; border: 0;}\n"); + PUTS("hr {width: 934px; background-color: #ccc; border: 0; height: 1px;}\n"); } /* }}} */ diff --git a/ext/standard/css.h b/ext/standard/css.h index d7275e08ef..0b3ae87cbd 100644 --- a/ext/standard/css.h +++ b/ext/standard/css.h @@ -1,4 +1,4 @@ -/* +/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ @@ -12,7 +12,7 @@ | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ - | Authors: Colin Viebrock <colin@easydns.com> | + | Authors: Colin Viebrock <colin@viebrock.ca> | +----------------------------------------------------------------------+ */ diff --git a/ext/standard/dir.c b/ext/standard/dir.c index ef28e9feaf..ca7e576c92 100644 --- a/ext/standard/dir.c +++ b/ext/standard/dir.c @@ -491,13 +491,18 @@ PHP_FUNCTION(glob) /* now catch the FreeBSD style of "no matches" */ if (!globbuf.gl_pathc || !globbuf.gl_pathv) { no_results: +#ifndef PHP_WIN32 + /* Paths containing '*', '?' and some other chars are + illegal on Windows but legit on other platforms. For + this reason the direct basedir check against the glob + query is senseless on windows. For instance while *.txt + is a pretty valid filename on EXT3, it's invalid on NTFS. */ 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; } } +#endif array_init(return_value); return; } diff --git a/ext/standard/file.c b/ext/standard/file.c index ad6bdad34f..1ec6a74f3f 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -1284,7 +1284,7 @@ PHPAPI PHP_FUNCTION(fseek) */ /* DEPRECATED APIs: Use php_stream_mkdir() instead */ -PHPAPI int php_mkdir_ex(char *dir, long mode, int options TSRMLS_DC) +PHPAPI int php_mkdir_ex(const char *dir, long mode, int options TSRMLS_DC) { int ret; @@ -1299,7 +1299,7 @@ PHPAPI int php_mkdir_ex(char *dir, long mode, int options TSRMLS_DC) return ret; } -PHPAPI int php_mkdir(char *dir, long mode TSRMLS_DC) +PHPAPI int php_mkdir(const char *dir, long mode TSRMLS_DC) { return php_mkdir_ex(dir, mode, REPORT_ERRORS TSRMLS_CC); } @@ -1623,7 +1623,7 @@ PHP_FUNCTION(copy) /* {{{ php_copy_file */ -PHPAPI int php_copy_file(char *src, char *dest TSRMLS_DC) +PHPAPI int php_copy_file(const char *src, const char *dest TSRMLS_DC) { return php_copy_file_ctx(src, dest, 0, NULL TSRMLS_CC); } @@ -1631,7 +1631,7 @@ PHPAPI int php_copy_file(char *src, char *dest TSRMLS_DC) /* {{{ php_copy_file_ex */ -PHPAPI int php_copy_file_ex(char *src, char *dest, int src_flg TSRMLS_DC) +PHPAPI int php_copy_file_ex(const char *src, const char *dest, int src_flg TSRMLS_DC) { return php_copy_file_ctx(src, dest, 0, NULL TSRMLS_CC); } @@ -1639,7 +1639,7 @@ PHPAPI int php_copy_file_ex(char *src, char *dest, int src_flg TSRMLS_DC) /* {{{ php_copy_file_ctx */ -PHPAPI int php_copy_file_ctx(char *src, char *dest, int src_flg, php_stream_context *ctx TSRMLS_DC) +PHPAPI int php_copy_file_ctx(const char *src, const char *dest, int src_flg, php_stream_context *ctx TSRMLS_DC) { php_stream *srcstream = NULL, *deststream = NULL; int ret = FAILURE; diff --git a/ext/standard/file.h b/ext/standard/file.h index 2bcdfd64bf..d6f142a769 100644 --- a/ext/standard/file.h +++ b/ext/standard/file.h @@ -74,11 +74,11 @@ PHP_MINIT_FUNCTION(user_streams); PHPAPI int php_le_stream_context(TSRMLS_D); PHPAPI int php_set_sock_blocking(int socketd, int block TSRMLS_DC); -PHPAPI int php_copy_file(char *src, char *dest TSRMLS_DC); -PHPAPI int php_copy_file_ex(char *src, char *dest, int src_chk TSRMLS_DC); -PHPAPI int php_copy_file_ctx(char *src, char *dest, int src_chk, php_stream_context *ctx TSRMLS_DC); -PHPAPI int php_mkdir_ex(char *dir, long mode, int options TSRMLS_DC); -PHPAPI int php_mkdir(char *dir, long mode TSRMLS_DC); +PHPAPI int php_copy_file(const char *src, const char *dest TSRMLS_DC); +PHPAPI int php_copy_file_ex(const char *src, const char *dest, int src_chk TSRMLS_DC); +PHPAPI int php_copy_file_ctx(const char *src, const char *dest, int src_chk, php_stream_context *ctx TSRMLS_DC); +PHPAPI int php_mkdir_ex(const char *dir, long mode, int options TSRMLS_DC); +PHPAPI int php_mkdir(const char *dir, long mode TSRMLS_DC); PHPAPI void php_fgetcsv(php_stream *stream, char delimiter, char enclosure, char escape_char, size_t buf_len, char *buf, zval *return_value TSRMLS_DC); PHPAPI int php_fputcsv(php_stream *stream, zval *fields, char delimiter, char enclosure, char escape_char TSRMLS_DC); @@ -121,7 +121,7 @@ typedef struct { long default_socket_timeout; char *user_agent; /* for the http wrapper */ char *from_address; /* for the ftp and http wrappers */ - char *user_stream_current_filename; /* for simple recursion protection */ + const char *user_stream_current_filename; /* for simple recursion protection */ php_stream_context *default_context; HashTable *stream_wrappers; /* per-request copy of url_stream_wrappers_hash */ HashTable *stream_filters; /* per-request copy of stream_filters_hash */ diff --git a/ext/standard/filestat.c b/ext/standard/filestat.c index 2713d23f1d..0b40e7319b 100644 --- a/ext/standard/filestat.c +++ b/ext/standard/filestat.c @@ -857,7 +857,7 @@ PHPAPI void php_stat(const char *filename, php_stat_len filename_length, int typ "dev", "ino", "mode", "nlink", "uid", "gid", "rdev", "size", "atime", "mtime", "ctime", "blksize", "blocks" }; - char *local; + const char *local; php_stream_wrapper *wrapper; if (!filename_length) { diff --git a/ext/standard/ftp_fopen_wrapper.c b/ext/standard/ftp_fopen_wrapper.c index 86975d7f5b..d04ef52be7 100644 --- a/ext/standard/ftp_fopen_wrapper.c +++ b/ext/standard/ftp_fopen_wrapper.c @@ -130,8 +130,9 @@ static int php_stream_ftp_stream_close(php_stream_wrapper *wrapper, php_stream * /* {{{ php_ftp_fopen_connect */ -static php_stream *php_ftp_fopen_connect(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path, php_stream_context *context, - php_stream **preuseid, php_url **presource, int *puse_ssl, int *puse_ssl_on_data TSRMLS_DC) +static php_stream *php_ftp_fopen_connect(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, + char **opened_path, php_stream_context *context, php_stream **preuseid, + php_url **presource, int *puse_ssl, int *puse_ssl_on_data TSRMLS_DC) { php_stream *stream = NULL, *reuseid = NULL; php_url *resource = NULL; @@ -410,7 +411,8 @@ static unsigned short php_fopen_do_pasv(php_stream *stream, char *ip, size_t ip_ /* {{{ php_fopen_url_wrap_ftp */ -php_stream * php_stream_url_wrap_ftp(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) +php_stream * php_stream_url_wrap_ftp(php_stream_wrapper *wrapper, const char *path, const char *mode, + int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) { php_stream *stream = NULL, *datastream = NULL; php_url *resource = NULL; @@ -691,7 +693,8 @@ static php_stream_ops php_ftp_dirstream_ops = { /* {{{ php_stream_ftp_opendir */ -php_stream * php_stream_ftp_opendir(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) +php_stream * php_stream_ftp_opendir(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, + char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) { php_stream *stream, *reuseid, *datastream = NULL; php_ftp_dirstream_data *dirsdata; @@ -780,7 +783,7 @@ opendir_errexit: /* {{{ php_stream_ftp_url_stat */ -static int php_stream_ftp_url_stat(php_stream_wrapper *wrapper, char *url, int flags, php_stream_statbuf *ssb, php_stream_context *context TSRMLS_DC) +static int php_stream_ftp_url_stat(php_stream_wrapper *wrapper, const char *url, int flags, php_stream_statbuf *ssb, php_stream_context *context TSRMLS_DC) { php_stream *stream = NULL; php_url *resource = NULL; @@ -903,7 +906,7 @@ stat_errexit: /* {{{ php_stream_ftp_unlink */ -static int php_stream_ftp_unlink(php_stream_wrapper *wrapper, char *url, int options, php_stream_context *context TSRMLS_DC) +static int php_stream_ftp_unlink(php_stream_wrapper *wrapper, const char *url, int options, php_stream_context *context TSRMLS_DC) { php_stream *stream = NULL; php_url *resource = NULL; @@ -953,7 +956,7 @@ unlink_errexit: /* {{{ php_stream_ftp_rename */ -static int php_stream_ftp_rename(php_stream_wrapper *wrapper, char *url_from, char *url_to, int options, php_stream_context *context TSRMLS_DC) +static int php_stream_ftp_rename(php_stream_wrapper *wrapper, const char *url_from, const char *url_to, int options, php_stream_context *context TSRMLS_DC) { php_stream *stream = NULL; php_url *resource_from = NULL, *resource_to = NULL; @@ -1032,7 +1035,7 @@ rename_errexit: /* {{{ php_stream_ftp_mkdir */ -static int php_stream_ftp_mkdir(php_stream_wrapper *wrapper, char *url, int mode, int options, php_stream_context *context TSRMLS_DC) +static int php_stream_ftp_mkdir(php_stream_wrapper *wrapper, const char *url, int mode, int options, php_stream_context *context TSRMLS_DC) { php_stream *stream = NULL; php_url *resource = NULL; @@ -1126,7 +1129,7 @@ mkdir_errexit: /* {{{ php_stream_ftp_rmdir */ -static int php_stream_ftp_rmdir(php_stream_wrapper *wrapper, char *url, int options, php_stream_context *context TSRMLS_DC) +static int php_stream_ftp_rmdir(php_stream_wrapper *wrapper, const char *url, int options, php_stream_context *context TSRMLS_DC) { php_stream *stream = NULL; php_url *resource = NULL; diff --git a/ext/standard/http_fopen_wrapper.c b/ext/standard/http_fopen_wrapper.c index b8676bbba4..ac6fdad4fe 100644 --- a/ext/standard/http_fopen_wrapper.c +++ b/ext/standard/http_fopen_wrapper.c @@ -84,7 +84,8 @@ #define HTTP_WRAPPER_HEADER_INIT 1 #define HTTP_WRAPPER_REDIRECTED 2 -php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path, php_stream_context *context, int redirect_max, int flags STREAMS_DC TSRMLS_DC) /* {{{ */ +php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, + char **opened_path, php_stream_context *context, int redirect_max, int flags STREAMS_DC TSRMLS_DC) /* {{{ */ { php_stream *stream = NULL; php_url *resource = NULL; @@ -921,7 +922,7 @@ out: } /* }}} */ -php_stream *php_stream_url_wrap_http(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) /* {{{ */ +php_stream *php_stream_url_wrap_http(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) /* {{{ */ { return php_stream_url_wrap_http_ex(wrapper, path, mode, options, opened_path, context, PHP_URL_REDIRECT_MAX, HTTP_WRAPPER_HEADER_INIT STREAMS_CC TSRMLS_CC); } diff --git a/ext/standard/info.c b/ext/standard/info.c index 48e0e85cc5..cfff023afa 100644 --- a/ext/standard/info.c +++ b/ext/standard/info.c @@ -1,4 +1,4 @@ -/* +/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ @@ -14,7 +14,7 @@ +----------------------------------------------------------------------+ | Authors: Rasmus Lerdorf <rasmus@php.net> | | Zeev Suraski <zeev@zend.com> | - | Colin Viebrock <colin@easydns.com> | + | Colin Viebrock <colin@viebrock.ca> | +----------------------------------------------------------------------+ */ @@ -67,7 +67,7 @@ static int php_info_print_html_esc(const char *str, int len) /* {{{ */ int written; char *new_str; TSRMLS_FETCH(); - + new_str = php_escape_html_entities((unsigned char *) str, len, &new_len, 0, ENT_QUOTES, "utf-8" TSRMLS_CC); written = php_output_write(new_str, new_len TSRMLS_CC); efree(new_str); @@ -81,11 +81,11 @@ static int php_info_printf(const char *fmt, ...) /* {{{ */ int len, written; va_list argv; TSRMLS_FETCH(); - + va_start(argv, fmt); len = vspprintf(&buf, 0, fmt, argv); va_end(argv); - + written = php_output_write(buf, len TSRMLS_CC); efree(buf); return written; @@ -103,7 +103,7 @@ static void php_info_print_stream_hash(const char *name, HashTable *ht TSRMLS_DC { char *key; uint len; - + if (ht) { if (zend_hash_num_elements(ht)) { HashPosition pos; @@ -113,7 +113,7 @@ static void php_info_print_stream_hash(const char *name, HashTable *ht TSRMLS_DC } else { php_info_printf("\nRegistered %s => ", name); } - + zend_hash_internal_pointer_reset_ex(ht, &pos); while (zend_hash_get_current_key_ex(ht, &key, &len, NULL, 0, &pos) == HASH_KEY_IS_STRING) { @@ -129,7 +129,7 @@ static void php_info_print_stream_hash(const char *name, HashTable *ht TSRMLS_DC break; } } - + if (!sapi_module.phpinfo_as_text) { php_info_print("</td></tr>\n"); } @@ -164,10 +164,10 @@ PHPAPI void php_info_print_module(zend_module_entry *zend_module TSRMLS_DC) /* { } } else { if (!sapi_module.phpinfo_as_text) { - php_info_printf("<tr><td>%s</td></tr>\n", zend_module->name); + php_info_printf("<tr><td class=\"v\">%s</td></tr>\n", zend_module->name); } else { php_info_printf("%s\n", zend_module->name); - } + } } } /* }}} */ @@ -212,7 +212,7 @@ static void php_print_gpcse_array(char *name, uint name_length TSRMLS_DC) php_info_print(name); php_info_print("[\""); - + switch (zend_hash_get_current_key_ex(Z_ARRVAL_PP(data), &string_key, &string_len, &num_key, 0, NULL)) { case HASH_KEY_IS_STRING: if (!sapi_module.phpinfo_as_text) { @@ -442,7 +442,7 @@ char* php_get_windows_name() sub = "Web Edition"; else sub = "Standard Edition"; } - } + } } if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 ) { @@ -535,7 +535,7 @@ PHPAPI char *php_get_uname(char mode) DWORD dwWindowsMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion))); DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1; char ComputerName[MAX_COMPUTERNAME_LENGTH + 1]; - + GetComputerName(ComputerName, &dwSize); if (mode == 's') { @@ -584,7 +584,7 @@ PHPAPI char *php_get_uname(char mode) if (mode == 's') { php_uname = buf.sysname; } else if (mode == 'r') { - snprintf(tmp_uname, sizeof(tmp_uname), "%d.%d.%d", + snprintf(tmp_uname, sizeof(tmp_uname), "%d.%d.%d", buf.netware_major, buf.netware_minor, buf.netware_revision); php_uname = tmp_uname; } else if (mode == 'n') { @@ -674,7 +674,7 @@ PHPAPI void php_print_info(int flag TSRMLS_DC) char temp_api[10]; php_uname = php_get_uname('a'); - + if (!sapi_module.phpinfo_as_text) { php_info_print_box_start(1); } @@ -698,7 +698,7 @@ PHPAPI void php_print_info(int flag TSRMLS_DC) php_info_printf("<h1 class=\"p\">PHP Version %s</h1>\n", PHP_VERSION); } else { php_info_print_table_row(2, "PHP Version", PHP_VERSION); - } + } php_info_print_box_end(); php_info_print_table_start(); php_info_print_table_row(2, "System", php_uname ); @@ -783,7 +783,7 @@ PHPAPI void php_print_info(int flag TSRMLS_DC) #else php_info_print_table_row(2, "DTrace Support", "disabled" ); #endif - + php_info_print_stream_hash("PHP Streams", php_stream_get_url_stream_wrappers_hash() TSRMLS_CC); php_info_print_stream_hash("Stream Socket Transports", php_stream_xport_get_hash() TSRMLS_CC); php_info_print_stream_hash("Stream Filters", php_get_stream_filters_hash() TSRMLS_CC); @@ -815,7 +815,7 @@ PHPAPI void php_print_info(int flag TSRMLS_DC) php_info_print("<h1>Configuration</h1>\n"); } else { SECTION("Configuration"); - } + } if (!(flag & PHP_INFO_MODULES)) { SECTION("PHP Core"); display_ini_entries(NULL); @@ -889,7 +889,7 @@ PHPAPI void php_print_info(int flag TSRMLS_DC) } - if ((flag & PHP_INFO_CREDITS) && !sapi_module.phpinfo_as_text) { + if ((flag & PHP_INFO_CREDITS) && !sapi_module.phpinfo_as_text) { php_info_print_hr(); php_print_credits(PHP_CREDITS_ALL & ~PHP_CREDITS_FULLPAGE TSRMLS_CC); } @@ -930,24 +930,24 @@ PHPAPI void php_print_info(int flag TSRMLS_DC) if (!sapi_module.phpinfo_as_text) { php_info_print("</div></body></html>"); - } + } } /* }}} */ PHPAPI void php_info_print_table_start(void) /* {{{ */ { if (!sapi_module.phpinfo_as_text) { - php_info_print("<table border=\"0\" cellpadding=\"3\" width=\"600\">\n"); + php_info_print("<table>\n"); } else { php_info_print("\n"); - } + } } /* }}} */ PHPAPI void php_info_print_table_end(void) /* {{{ */ { if (!sapi_module.phpinfo_as_text) { - php_info_print("</table><br />\n"); + php_info_print("</table>\n"); } } @@ -965,7 +965,7 @@ PHPAPI void php_info_print_box_start(int flag) /* {{{ */ php_info_print("<tr class=\"v\"><td>\n"); } else { php_info_print("\n"); - } + } } } /* }}} */ @@ -998,7 +998,7 @@ PHPAPI void php_info_print_table_colspan_header(int num_cols, char *header) /* { } else { spaces = (74 - strlen(header)); php_info_printf("%*s%s%*s\n", (int)(spaces/2), " ", header, (int)(spaces/2), " "); - } + } } /* }}} */ @@ -1013,7 +1013,7 @@ PHPAPI void php_info_print_table_header(int num_cols, ...) va_start(row_elements, num_cols); if (!sapi_module.phpinfo_as_text) { php_info_print("<tr class=\"h\">"); - } + } for (i=0; i<num_cols; i++) { row_element = va_arg(row_elements, char *); if (!row_element || !*row_element) { @@ -1042,7 +1042,7 @@ PHPAPI void php_info_print_table_header(int num_cols, ...) /* {{{ php_info_print_table_row_internal */ -static void php_info_print_table_row_internal(int num_cols, +static void php_info_print_table_row_internal(int num_cols, const char *value_class, va_list row_elements) { int i; @@ -1050,13 +1050,13 @@ static void php_info_print_table_row_internal(int num_cols, if (!sapi_module.phpinfo_as_text) { php_info_print("<tr>"); - } + } for (i=0; i<num_cols; i++) { if (!sapi_module.phpinfo_as_text) { php_info_printf("<td class=\"%s\">", (i==0 ? "e" : value_class ) ); - } + } row_element = va_arg(row_elements, char *); if (!row_element || !*row_element) { if (!sapi_module.phpinfo_as_text) { @@ -1071,7 +1071,7 @@ static void php_info_print_table_row_internal(int num_cols, php_info_print(row_element); if (i < num_cols-1) { php_info_print(" => "); - } + } } } if (!sapi_module.phpinfo_as_text) { @@ -1091,7 +1091,7 @@ static void php_info_print_table_row_internal(int num_cols, PHPAPI void php_info_print_table_row(int num_cols, ...) { va_list row_elements; - + va_start(row_elements, num_cols); php_info_print_table_row_internal(num_cols, "v", row_elements); va_end(row_elements); @@ -1100,11 +1100,11 @@ PHPAPI void php_info_print_table_row(int num_cols, ...) /* {{{ php_info_print_table_row_ex */ -PHPAPI void php_info_print_table_row_ex(int num_cols, const char *value_class, +PHPAPI void php_info_print_table_row_ex(int num_cols, const char *value_class, ...) { va_list row_elements; - + va_start(row_elements, value_class); php_info_print_table_row_internal(num_cols, value_class, row_elements); va_end(row_elements); @@ -1232,7 +1232,7 @@ PHP_FUNCTION(php_ini_scanned_files) if (zend_parse_parameters_none() == FAILURE) { return; } - + if (strlen(PHP_CONFIG_FILE_SCAN_DIR) && php_ini_scanned_files) { RETURN_STRING(php_ini_scanned_files, 1); } else { @@ -1248,7 +1248,7 @@ PHP_FUNCTION(php_ini_loaded_file) if (zend_parse_parameters_none() == FAILURE) { return; } - + if (php_ini_opened_path) { RETURN_STRING(php_ini_opened_path, 1); } else { diff --git a/ext/standard/info.h b/ext/standard/info.h index 46a0dfc240..b616204b30 100644 --- a/ext/standard/info.h +++ b/ext/standard/info.h @@ -1,4 +1,4 @@ -/* +/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ @@ -14,6 +14,7 @@ +----------------------------------------------------------------------+ | Authors: Rasmus Lerdorf <rasmus@php.net> | | Zeev Suraski <zeev@zend.com> | + | Colin Viebrock <colin@viebrock.ca> | +----------------------------------------------------------------------+ */ @@ -22,9 +23,9 @@ #ifndef INFO_H #define INFO_H -#define PHP_ENTRY_NAME_COLOR "#ccccff" -#define PHP_CONTENTS_COLOR "#cccccc" -#define PHP_HEADER_COLOR "#9999cc" +#define PHP_ENTRY_NAME_COLOR "#ccf" +#define PHP_CONTENTS_COLOR "#ccc" +#define PHP_HEADER_COLOR "#99c" #define PHP_INFO_GENERAL (1<<0) #define PHP_INFO_CREDITS (1<<1) @@ -50,9 +51,9 @@ #endif /* HAVE_CREDITS_DEFS */ -#define PHP_LOGO_DATA_URI "data:image/gif;base64,R0lGODlheABDAOZqAH+CuDk3RyglKszN4qGky9PV57K01ENCWIOGuYKDs1JScpCSwsLE3qqs0ExLY1tcg93e7Ds4PG5xpWptnWFjjXV5sXt+teXm8JmcxoyNwbm62Wtrkk5Oa3F0qXp6o4iLvXJ0o3RzmI6QwVpbfuLj73t9raSl0G1wonJ2rJWWyLu92XR4roWIu5KVw9jZ6pKSxGRmkmtun6WozpSWxS4rL1NRaLO012xqjFxbdoqNv2ZolmhqmpyfyDEuOa6w05yczVVWeJ6hypaZxYGCr2dplz89ULy+2l5giZiZyIyOv4mKuldYfLa319XX6CIeIGxvns7Q5L/A3Hd7tHZ4p19efZmZzG5vmHN3riIeH////5COj1lWV8fGx+7u9dXU1fb2+oKAgayqq3Ryc/Hw8Z6cnePi40tISbm4uWdkZYmJtgD/AEdGX9/g7ZuczGlrnG9zp4yMuri52bi615qbzKeqz9vc65qcyWZkhGhniaeo0m5woIuLucbH4MfJ4WlsnJeYyyH5BAEAAGoALAAAAAB4AEMAAAf/gGqCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXlm0/bXOYnp+gP3l5Nj4acUwaGkwGPj4NMgRBPBhCLQtJIjkfGTkiLymgwqENGgx9TQVQUAN9fAxRUSpyrK90sbNCMy26HwgAFhYVVyglFgkZwcPrjCZxfC5sbBAQdS7JA9QysyIf/iwAEQgEQLDgN4LhpKxA8UbCCT87nkwZkoSdRTVBbAxgQ+KCRxIk8jUQskCKyZMoU6pceXJcBwkTduiAQeEIBStDRFzEFIQJFI4eL7gwQqcFy6NIk6K88iYGjCNHHoxYcsSDzp2Qfmh0AYEjBCMEWCgdSzbplRM6HiwBokDBiCkz/7AuMqGhQBMXdQoYSFK2r1+kHWAsUcCBgwM8CeQayhNlAJQCA3zk+LtyAYbLmDF8oJz0DQUFDtasUeBBsZo8Rvj0GcBkBueVH7JwmU2bS5fXSt0sWXPggIMQO91FYcCgAQLcKzFwwcK8uZnbyJN22F2kyJrSw374kGNEBQ8L0VeqINO8uZgC4ZVeeXAgQAAOcECZMMBEDgEA6VcWEFOeORkV+Sn1hgLu9XAHJnPQ4YMBMhwXoEpdmNEfFlwQ8KBSMazRQw8H7FHJDzI00EBJF6YEQBYTYpHFZiUm9UAAGwInSRsE7ONgiycpN6EZX+ColB9F0EADFZHYEQQBM4CH1P8HmTXZJItHqRDGhGJc0CSJLDHp5Jb4jYWCAzQIUMMjSGAQBJRHffBFFmy26eabWXRRQANdolQAGBOSAWebFwxg4UkL7Ckom10M0IBSQAgggAONzCAEBmIpRcByKVZqBhhcfAEgSl1sUWmKNGyhRRldkGjAlJ9OuAUYXnRxKFIjCOAEo4psI8SNSY2X6qdbeAFBlyfu+ikYY2AgxQB4CqtqGQMkNYITTuCQSAoitIBmUhDwp2yKYUBgEgZebJsiGrdd4Km45dHgRbNIrQEtdoX84ctkZX0hIbr9eQGglPjm2wCK/TZHQxl/HhWAEwIsYEg/9JIVW8DlbdHjnRAzp8X/BeFWjIUY0B3VgaxjEpICAh/UOdakO8I5xhnaTugFAZ1OyMWbY3CBRopaZIFqxHCWcca5E5aBJUsKQJsGId7gOpau/YnhLUoLNNAFeRNqwQDA/a2IEgYNfBFB1VloUTW7gBrwRbL9hWGAUjTMOsgfACCgZFnZ5rmpiVl83XQWGZfH40oQAN1czoIzd8baKn0wBs53H7UEtAqrIYIFJpNlr8wFpxS4qjpT+XRKMfd3RhY0BG3sSqGXp0XjLHUA7Q2CsJBQXw9POMa1J23eHxpZoN3cfyoFG3QZE9KQxVGpD846S0W4rUY4c5OFcn8R9MjS5f0RjrlK4BafxRmqXnAU/9blAa8UB070IEgFlDFdHhqfp1R72uQ3d7tK/Pa3Rdhjs4QB8dtTCgWgJYgVUKZu2VueSQwAvqD1rTnV04/vmAOGLBQOC4djCQOo1p/7CZCAKbgC+/yCvfJUiCXJY04EOre7+J0khVgIA+lMtxIAeG1C5CLLAJ0gCBQYsC/C6yDujkWp7PWuassLYnm8AMB0HU8/HCxPGBS4kh0KogMoGCFZdES9J6LkAwXwQun6Q4MxfOGCJ0xJ9yb0vfBxDwJinFD1KncUK6phIVpcWhSZQy4V+FEFEOjCGLQwRtENoH7M8SBK8sczsWWvC38EZBfK4EiZUXEl6FPf8zpwhb7sR/9VWghlKMVwrxSJ4QsEeKAKvWinCWKhghcUlSi1QMphia8szaPVB97Qgb5ESGNo+MICToVDF5rEXBOSYSEDdsqhSed1gkiBBN7wQ6UosV/NPJYrrbYSRGKBiRoDgzD78jgnRO55EujlWNbYLxqcYZxSQGZ/uPCqramSOW0MWATOcAFnss15gnjBCSTQSaUwUlxmIMMYBlCnGXbQn8TUH//wZQYZMoCOSSmaE45GiCGc4A1joZj+ZjlLMnBhDIVCU6BIGkpWnkQFXGDp6C4oBpaG0qQoZcAQpQMyQ6TgBCdQJ1JgyIUL0IMeBfgjAfxpEkAe9aiZA9QAnkqPQy6TOV7/MOpRk+pHAux0LAdL2CGSEIMToAAp10wkU30khQU0sTxZwChy3OUEeBkiAWUtaHLuuUK2sqQBDYxYx/JTTmkpogR5ZclB+WhMv0qBAZVsDhjQE6By0moRiDWrBKvGAMeqRHdSvCRlNHpZRpRgAjHoQB6lQNR6etYkeXPZ6aLTgQNAq7SNSABqJaDFtGJhDGv10QIWx0a5+oUIPYCWYSOhhCdMQLNS+N8Wpktd3r3WntSlLhgG+xoFyEoAMprEC0DghxjwFgAFoCo9EHddKaBXvRBwLWWIcDAnRICjlkiAG1D7htW2168nsK1yQfGCKfgBtar9r19RwAFZOaEI+AWF/xL04IYD91fBJTrBGhzcg/CygwUUPrAEzorh8BzhAIoSQA9gpxgWgGAHbnBDDKhZYsr4gQMBCJMAAsBi0wgiCSUgwg5gPAEa1zgpEyBQD4QkJrv6eBApSIAedEAEIbshqP7F8BuOgOMNLbkIeHjBkxfxAinr4Mxn3sFHSXzdHRxBAe2B0YYOcAMPjfkRL0DAFIgAgz77mQh++KhQ8zMBIjwANNVxj6JxEAI735kSIhjCnilA6UpT+gh9rnCg38BpTkvg058GKlCJcGm2iKY3B6hOEQJwABxsIDGPFkYKPlACEFgBKlB5gK53PZUlrAUIbGkLYQpjmNCcujdFUAAVbjgwBDHHWjEpUAICPOCBDWwgLb4GdrDbQmzDcIAKIxiBFaxQgmY/+9yLEEEaEHAVdLv73fCOd7wDAQA7AA==" -#define PHP_EGG_LOGO_DATA_URI "data:image/gif;base64,R0lGODlheABDAOf/ABIZISAeIhwhLA8jRwYlVSUoLyIpNSkoKwkvbR4tRBUwVDMuNysxOx87Yg89gDo3RTI5SgBCkDg6PDY7RyBCcTxBQz9BVD9ETxxPkQ9SoktIYkROVkpNWDJSeilVhkxObEZTZQVevgBfxVZQZRxcn1BUYFNTc1FXWRZht1ZYVQBm0ghlzBhksVVafyNlqSpkn1hcZwBr2EVfhABs0lRdcF5adRJpyWBcaVlgYl5dh15efh5q0gdw3iFsxhBy2Rtxxhhx0Ttsn2BkigB45SxwtDFwq0dslGNoc1pqfRtz6GRmkypzwFZuiQl772psaWlpiiF25Ax94zB10BB+3iV44BR96yN71TJ5vit7zih73GluoDt6tk53nix66QOG+nBwl0l7r3F2cjOAzSKB9guI9SKC8HF1lW90pm93jTCC3SaE6zWC12F8knR6fHV5gzaC5SmH6ESC3y6H9kGGyiqJ8UuDzXx5oWV9v1aA0nl6qWmAnXl6tHJ8tV6AyVGGuS6K/EyHwyKO/D6J5T+K2SGQ9zqL3ziN9jaP6jmP8WaHwYGCsHqIkC6U/C2V9naFv0GS50mS2IGFuYeHnEWU4iyZ/16P2ISIr1iSz4mLiF2SxV+TvImLlmiSsnqPrIeLvzmc/kOa9Uaa74aNtHWRyXiSvk+a6YyNvIGQwo6OsImTnFib3lKd5l2d2kKi/WSd0k2h9zeo/1Gi8ZSUw5GVyn+czE2m/46bsY2ZyHugwUmr/12n8GCn6pieoGWn5Hekzpueq26n25yby1ms/ICk25ejrlGy/56iymav+V2y+2yv7Wex9KaopWG2/1e5/5Wu2H216265/HW3/qus0aavxWe+/66wvYy33YC4+Hi7+bO0uHPB/aq3wa6112vF/4e/9pfA27u31YDF/XnK/5PG77y/25TI/MDBxYbN/qvH7LfH2qPP+47V/57T/cPN2abT9c3M5Jna/77S7LrU57HV+KLg/7zd+tbb3dbb6a7l/sbh99Hi+Lrp++Pm7+Hx/P3//P///yH5BAEKAP8ALAAAAAB4AEMAAAj+AP8JHEiwoMGDCBMqXMiwocOHECNKnEixosWLFoNpDIaxo8ePwaRJ4yaNHDhw5EySFCnNmEtjt2TJMmXKk01PpmbN+sgTZEly7+7de0eUaMqj4FaKfBlzps1IkfZI3cMnzx5Fnnb23MrQGLig/PgJHTvUZEtjNZ9CXcu2bVSpfPicOaOlrpY8ikxx3fvPGLd3YQOHfUdOWkw+jkaNEjVtquPHkCNLnVtXieUcSr7k5YvRK2DB9wrLctSnUi9dxYpRo6atEy/JsGM7pqskh+0WLXLY0csZYrC/QsOGNubplrNkxWq1Wp6rObNu53y5kU2dupbaLUxob5FHVu+Fxsj+kb3HzdTUc/TonWtWrLnqXMWaiQvnC031+7LPKMn+4YOGJ4p8Z1BJRA0ljSeQ1XMOPOt00wx7xYhDjWrinDNOEFzQwgd+HEamnwkahGiCHQL+QyBR4MgSWzjw0CNOM+4xKN868FhjhB/PqIMON844c8spp6zlSSSexIXYUx06pkULGlhggQZfcObVUdK8FRs70NCzDnvNUeNgN+vQ4w4XfvSizDHIQAMNM8LooosyaWqDDTbhhOPNnc9g88www/RIHH5nMOmkBiT2FNJRxuBXjzAMTghLK/IVAyY843TgAhaHIKIpIXDQgUgjhwjySCijllLKKrqssssuqaqaTDL+e57CYQ4WPPDAB7x15BdKxlgp2zi9JBPLOetQkwsssBTTYDPwwMMOBSRYgQghdMhRxrVl0AHHG9xuO0UWghRSyCOlTCJuIZNAoq4qwMh63xkm2LrAExiFNFKV96GzyyOICPNIOfRQs9wnucCjTTf07OMOBREAQQcZZXhRxcTYUmExFVFEkUUWaXTscRqhlDuIGGJA0ssoHGqhwQILWJCrRPZKo+J9z5xpCBnUNtrKJwTjc4426bHTQQQzVHFtFU00AUUXEw8BxRBUDBHFtnAIksYUVpOLzDGpTjLIIJA40mEOD7AcJczGtORrbJ48E8orn8jhhRyv4AMPMrBQAkv+M14ijI/QRHeBLdJdMA3F0jzwAIUPb2iKCBwbTwHHI6PqEoub6c6xYcoWHHCADhEF49LM1UWyCyigEMIIIYY0EY56xeycCzO5NAP0PoDPEDG2XSR9eBeHQ8GDD3CUk4862AgD+cZZwAHHIY/EEssqkGjeIR8aeD7CQ6L/eZ8jlWg6hxVkQFxFi8bunOze4tCDzzgNOFB0E9c2UcUYSRd++BA++JCFPm5wwjLKcQjnZcEHQJjcuB6BKl2oQmwdMoHnNNAQWdyiV/iJRB2yoAY1vOEFVbBWFegBD3HkYjmtaI+X4PG++PmgfnKIobXKEDWnDWF4abgHBwzgBG/AQXL+kANCGg6RBitYAQtrgMQqVgFBDrXgAAGgoEJkcou1xeYWdZjCFKKghiqQQAr4o0N61hG7T+gtF+IQBz7wYQ0FEG0M12IEz0DBM001QlNU8EEa2nEBA7QBG5ATxLeAgMRChGINP0jkD7AghkQ08T4tCEAAapCQWZhCFgi6zyjWIAhr2MIFQ5DaD4bQBUS4Dx7NeJQZYQGdfdDjGQOIQAzo14h5yCMf+ahHPfIhj3ZsQx7QgMMg2jEBAbQBecd4xSOIuIZmkguJWFDkJWiRJA1IslAFmQVOMkmdSFxiDYfQhz/8gYQodMFpwAsFPlzZjJ0xohVoPMc+4OEKAkSACnL+IMQxsnGBC3DgnyXgwAYusIFslGMV1SjmAU6AAzfwIh3YCMUkelEKcj0CXWuI5hzmYA0ryuYBATiAdwqSlvvwQRVYyMI8xumPVKTBaEgrwzHWCI/YMeKdxdBG+9jBBQJkoAqBQAQ2NlECGJSABjCgwVEDygBzeGMTEyiAAUrQTwYUIAzeCIUtiPGNZ+jCVI9Iww/EcAlX+OIWHDoDFLdHkFkQyaORuURKB5GCaoxTD4gog7WaMAZvjJE9rUjWg9JTKQKggAyMaEQ53FDUauAyl/r4RQkY0AZ+HOECASBGNX7BWAEAYBGlYAJBcRAGTGBiG8oQK1kzwQpSbK46JpD+5MuGBFfI3AELQKBCEAxQgHbYwwWNKB+22JEeF7WHldQIEzy8kQAEZOETO5sHDU5Qgm08QxiNgEMhzFGCAlTgHiWYgATycad52KKYJ3gGCATAgA1woJ8GwEQpevCDQQACEHMwqzPuA0Up/sOttX0MH3oAhBn4wAPTOAANNpEFMuyVfuxoETy6cSxJSXgdroglHGbXCnnQwA1HSIcyJhaFQqSjuwzYBgcYcIRywCENkPhFAQBwAmJ+Nh7TIAYaeAsMIPRADHPwwxKuAAhXkOIUpJNMJAMwUvMEeCoDtsEKVjADEhQgAAIggRrIUIXCNYEM7KARPNIHC3Gs48zhkIH+YUEhDIGlgwM3cIMtjlEFKrzhEe1Y8QIka4BFxEINgngGGjy7iGp4Fhe64Fo8DAAATkyhB1iYQxBcsAQiXGELW8iENcwjmTNIkl7/ePJUPLEEKatABTsAAgUSgAE43OxavVMDO85h5mZANxfJPbM3GoCANLyiGMyAxDQ4AINNWEMYhEDEIdTxiwsU4AhouIAAqoEINWTBGRAAAAC2MWgGJEOZj7hEAgDAhTSgAAtXeIELWMBuEpCACJl2RqIiY4EoCsSkgOjBCmIQgx34GwiF4CAhhHutRqwjjetABnRhQawzZ2IAGXiFMNqjilT8MxvooAYzoMGObBxhAgywBxL++oiODmahE4xmQDuyvQFtvCIUhfCDZzlxiB8sYQ5bIAG7WeBuF5CgCGDwAy6SLJUPBGAB967OKbBggx3wIAYq4PcOfBAFOljdwVXwAjPCcY5uSCgXyulGs8rRAQLUgRlsyoU30MCBEpjjHubYBjGcQGwIpOIeMJjABp5BBzVYAQmePcI0ZkwMbQgjFpDoxKHhIIYrXKEIL3gBEdTtbgz8HNOcgIwSJCmQ18LGE3MAwgpUwIMh8LvfPqBCsgcOMTLQ6WDnmBB75lOODDsgFhpnRivmAYK2X4AGE7hA8IvqhnhUY8Vt8IYa6FAHC2h7G0gAwAbkMQ49pYMGAJAAKwT+MYgrECEIHog8vOHt7hcUYQuZf8zmA/Df6owCC1OOOg/KUIWnx2AIjYCbIT5BBkNwHRoVcg7MkFPUcA7eUHZigAy0Iwy5IA8QAGdHAGJHAAMw4AbbMA+PIAkcMAG8UA5UoAaJwGgXkA7ZJgG8cIK8AAOYlQrmMgiWFgQyAAZbQAQu4AKRB35BEARbgAvqx3n/EBeyUQdSIAKoFgM+MARkoAZPFwWH8AqtMC37Bw3noCZmdg51Uid+AHG6gAwMWAu5sA0TcAMlwA+5VA/zEA/qcAyIUArtQAzEcA/XQAVwgAsW0Ge2IAEAwADvBVAX0AbPUAhgA29GgAZ2wARgAHn+JPACYLAhlsAFXOAr6ycQZ+B5kDEKPzADoxcDw/OBZaAGqfcKyAAKzNEKwhAOycMiB5cM4QAMCuAAk6ANtOOF0PALxOYG/XAMn9B3VmcI1vYK0VAO0QAKQwAH4xAP98APSMBb9rANqbAIbpAK1gU9I+MCWyADViEVXAAGL+ABMiAKsBGJP0iJjnEKYtB0UcdvPEAFj1MGQ6AGsRAO0KANasIMyKAM2nAMUpgMu6AKl0ABCPADCrgzlNAKi1UCJbAJ/SAMhlAG+1M+VJAtjUAIVMADnggEVkAKHCAAOOANwrAL3lAOyhAKhyAujQdvLeAYkZAJWwAGRgAGcGV0SPf+D3twBrBBCz+wbzvQb5rYjocACogQCsKgDcmgDXUiDtCADLrQC7twCYDgARRAAAhgA8sBC59wU69QDzTQdsSQD7kgQkNQBWRAB1FTOFUwAxTpAzbQA53AAABADNAACj8EB8o2koUwB5dABGBwkpDhB2DABeIoFfUmRZ4wF5FhCnNgAyIweudYenCgBqUQC6FwDMpwCZcQDuIgj/QoBhjgAAiAABGAAoeAQq1ACYxACbnQD8SQCr/AD+wACnJgOF0gB0l4Q1BABTuAhFQABGswaAXwDcIACm8ABEAgOWmALqswB98nBJEBhJ32aQIxC3MhjqfwAzbgA5mYOFDzBnD+AIqxIAzQoApqgg0AGA7FgJRr0ANWIIrKwTNVeVOtcA7lwA7qUA6toFdlADwhlIRwIDw8MAO46QOq4EvtgA1PSAVU9i1TAIjdRwQyQJMdsmQjJZOE+RiJgJgr4G85eYRcBAehoAxvogtzIJnHsHU/U570CAqUMJDtGQgsGghyEAipwQgLKTiFwwP0Y3VUUAVQwG/0wz9AEAq6IAwF6gMxMAPDmQZYMDLw9gFJsgf91VZa4KCOIQYhMGX+dkOpJwiv0ITSswu9sAXKoAxrwnVT2Aq0U5Us6gVj4AV/4AVuOgayWQZKMzFQwJD2Uwaf0nemN0sMOQPVyYSgoAZRMAT+MzADWWBESep9QWACSRJbAfAy/6AIUeoYjrAEISACiTkDVAAFHVQ1QJoqqpAJXHAJpRCPxGKFDLgzaKqmY7Cmc+OirZo099llWVcGhNAIPlkFQ5CTE8MDK2ADUfAKjaAGX9mffmoDRyQGRFAEMpAkahUAbAWlkyoVpmCpU9ZviVMFzgMKoTA9quAHIAABMgAJukAnVmh4yqGqjOCmavoHbeqmMeQFhuAFSUM/clAFt5o6N6QCsUkGUGCkbNYKXMY/MxACBktfiiql+AFSInUQplAXm3MLV2ChM8BvnKpsoCA9q8AKIBB8MNAJvYCU0BAOsEg7N0WagcCmf7CmcqP+pl4AMU3AA0nQBHNDBqCAq4SgBjwKMTxgA3Bws2QQCOwIBDZgsCGAAijAAkSgBNV0TQkhqVowFXOgb5m4A3KIOofQravgCv2EBlFxCqzwJtigDfIopGj6B4HgroHACHLQpoaAPxGTOE0gm4QgiohQBToLBS/bBf0JBy5KCOzoA/SFAkeLtCwQBEmyZJSkEHlQF1LhCjeZiUaoBoggCC9WCKWgCRNgBo7BB6OwC8rAdfLoTmzrru46BmjLqknjBUkws0GLq69QbVRQNLLZBLs6BNlSBVNjBT2AtL7LAi7AtE4kSf7FuHWRB7TAdIrJb4VKdVlwCLqgCRcQGZ+rU/D+eEJoOgaBsKauCqdkUK/1ijOgkAtwmUcvVD4xW3p0ADxRAASYerRLkAEZcLgRRLwP0bhaUK02UKinJzwW8wbQK72SMQracK4Tdyw8Q7ot6qJyUK9dVgafAAqxCwdRcIQvS69OYzQ8oAJWWqg2sAQukAFXcI3VcQb1Zm8QIamKMLGYuJMTmXocmgycML2S8QxXCA0a1x7tWQvIgAyyA13r6gVlkITQlSkV/JDcGzx1+nSh5KOEdAUukAj4oQQLIEmLGxGm8AWQ0AP7u2+lJ4eI8AqSKcCScQrnYIXUIAxww6JoGwitADe31go3VZVPyK2QY2CqI1zAMwR0QH+h9IH+U1CckxBk3ghbUHQAZzMRwcAKkXuhBna1r/AmmUDDNUyy2oAMuVCVbfsHhCAHhvAHMbS2awu7W3oIUmADWYAIrdAImlwGjdAIgWAIA2d1zyNRG8uD1KEEIBUAEgCpEjEOa4CJ+5Z6VysM9QgMG/CXUvEM2kANOCwMtcAIaXtT0iw3oMyilEAwuRAKoVBEaTC+ckzNN5VPrEctcNAIo7IKyYDLsKEFJzxJHjEIUubFX6nKbaIMwEADlgAbySMMbCIM0tyiN+WibhrL7vnGsaAMkDAIsXAMwgCUzQE30izN5UMHyQYqDJQMvgAbfPABUBQALvMRqmAFhXqbH6jKDo3+DL2ABJIgGXygDasskC1qCIbwogu8ttCVQuWpDZegCvdYCkRZtlXpYMJl0VGgbJfTC8DwGKjAByrz0QuQyB6RDGlQqM2rBuf8CpezC5xwBPy8xmRwzS4a0HLzou7phWhXjy/ACspQCshAlOGgxmgaCLOJt3J4CKai1L5CK55zAPPCFX/opzPgb1RXy6WwC5oAA9z0GL0Qzg7WtgtsCGlr0+8kDJYdJx6wBazQCw7NDNpQC+tJCSwqm4aAMbU8CaowCuahBR/wAH39AKC2F5NAtBc6dVQXBYJwKq4AA5bwl6uQOgHNrnJQzaBs1gMZ0bmgDcrQAAPgAZcgppg5MIb+cFMQcy1yuAZ9cAd7oAXxsgB9PQLYxBeQUGAVW7H9EwVTcNjAUAJfYBdS6gmlgAhBG7RuSgij3bY2nc21wIC58ArQoAsNoAAYAAbQIJ7Q0B7qKt9VkAXYLRc50Nos490W8ARa8R2qQJ3XqpPEk9DJgARmYBkgXheTeAd9sAZxoAbWPDdqet9yBE8nlAv/TQEUcAWqMLbNDM2fQDl4kN3bnQMmUCtlwzIT7su9AbnzvLw+MAXKgA3JwAZu4FZ5AOJSrgQifgYk3gd4YOLc4jgRLJqX45R2yQp8MgqOsCHX4eNNAuS28gA18AVEXiLleKmJqQIGlgXlus4wQBCmoAjAUT7lII4ZVO7eczHohG4X13EZ2hEiTrLotWIBbR4gJaIQl0C4mBp/SV4KSQkMOIAQ2pQHefAFthHqop4DuIEb2nHq2tEf/REirM7oJqADAFLhkc4QlI6pdH6kupAMu+0QlhQJdmAHX/AF2JEdqJ7qqq4BH6ADuBHseCHrs/4QkEu4iJlqFrkGk8AKrrABPEETkfDmz94RgEC4IWCkVpAG4eKlmiAB377uFeEKS4ACNvADQpQG5LILwMAE7J7vAhEQADs=" -#define ZEND_LOGO_DATA_URI "data:image/gif;base64,R0lGODlhcQBIANUAAA0NDgEDBgIFCS5EXhUdJwUPGgQKER0rOgABAgkZKiZpqxhDbQ0kOwobLQkZKSNgnSBXjh1PghpGchQ2Vx1NfAoaKiJYjQoYJgsaKQECAzdQaS0/UTE1OQUPGAkaKh5ViiFclRpJdQocLSBZjh5UhhpIcw8qQxc+YwwgMwcVIQkaKQgXIwcZJTM6PwIEBRkaGjEyMv9mAP///8zMzMfHx7+/v6urq5KSknNzc1VVVTw8PDc3NyYmJgcHBwMDAwAAACwAAAAAcQBIAAAG/8CZcEgsGo/IpHJ5/DGf0KiU+Ks6p9Kr0KrFer9GbReM7IrJ6O95Zt262durUy5uD8/rtL58h7vlf3+AcHlsdoR7iU12eIhzbXVVfpOTgGOKiWNrkpKUhZ99iJijl4d5kFSdXKmdb6OvsFOXsbS1oba4ubq7vL1DNjg6ODW+xVg3OTw/AisCOMbQSsA6AD8FDAsjIwwv0d5DNcnLIhMU2uclPzbf3jwC2Ofx585MwTfssD8n8vwjKDpLcggo8OMZPkw8GPSTN6HKCxg5hhHJ8WOCv4IHFeEwsDAeiQULJjBYUQXGM4oWtTU0mDGNjR/mOi48gcJKynMrW+oBcFNmP/8SJnri/JFDJ5kaL0T4XLqwYVGjWGy8MFCCqVWGRKFKsQGgAImrYIc+1bqEq9ewaEc0vEc2CdKzacOmY9vWxjoiMAx81Sajr9+/MhaE2Iu2hAAexPraJUbGxo3HkB/f/XKjCgBhwH5kOwcYsAoU5dKSMIBYSN8cOSZvxRGjtevXOnREZDwFhogSE1AYqKIwXl8VBlKoUNHXgAEUJwhfJVGgtGkZsek+Afa6uvUY0bFUjEdhgnJtIUwwmLDAb4cU3tM2pz2jb/YnN67Lr/4eSuWYPkmEGDyiL4MODITgm1+CkdBZgSh00xkMOkiHRHzWxSahDvNJyN4SG6HV1wSfJcf/GWAMdObfCQv8IOILDUoj34QTrhgbS0zAgEJYfqGgQnp8yXACA8N9NkFfHQRX4wl+6cADDH2h6KBdz7jIYosRShjFdmD5B6CAH/JIHkgh9JUCeuXJAOBpPDTYF4MO4mDCAU5KmMMNxNDAWpSx2QdTlTJwiNxeIhbYnwzDZeMlcTLAAAOc7qVIxAsVsrjkdRNCkeFVNd5ImIgqmCDgbyoICiihZd5gQ189KDoDDTcYcN1lE+JAgxE2QCrlEzLi+V+Af+4XpnHCafpnoL8SWugNOwD5gqg4oMbDCtahkAGD9RUBIX2xjbUElUyJ6BcDJoQJ2AldfuppoCJe0IEOB5hw/wIEKFRQnQgesJrDhUTI+iJ8d2arbXGdjhDub6BxOm6nJvzVwMEMSCDBAw+AwIAHr3kgQgdl5vAqEjXYq4NqSeAgAFjd2djjyL7qJ9JwDCQXnq/+mqBpCQXsWIEHKVPwQcMgOOyAaw4k0EAKGCmhsbVKVLbCBFUtte+GC+ylH5df6cffCFIbKAMJJ5A4GARcdz2BA2CH3YAIDABA7y8aO1g0NeOEttDSgLJMowwuh9D13VwDFTbYCZjQMEBIDO3FNACY0NFvwY3M72ZoLWCACRTgLfnXYTPwAQgKmFAUDjjQ1SbHtfXWz29gggSSSHKHRcIKJkAAguR4R/C1CJFD8P+AAiykABoCQrQJoxc4FHC4uPLod+DUfxI4mF8O/AhYgXj/JdjNEUSgwAMY1ECDxjpcDEZl330IrDzapvyViCn7FUD5yXXdWcqXg3D7CdPCNqHaWNSA7YDPIw+kkH1BTo3OA6QA9UUAIvhfCoZEAgj0ZUdhA03tRvAAEvhuDzpQCj8wJTcvgamAVgqYDIQTpgIkcIQfFFOAHCgDBjTPdFvj2gPaRDQy4CBf5JMBr4bTQeINinTe+U0BCiYDBzSgL2BbAAtT4IA+xbBrIODe2cDwghltEIVb8p8PPyWwPxlAAERsgAeQ6AAlklFEDtAUFKNIp9iADlXJQs2bbuA9Jdz/ED/i69eHwgUsTvkFPVb7QQUk0BcPNLGIZWRhEsPFqzTazXUzbKOphBCrNnaujkUwS/jgFqItkqszCKDdGRFpRlJa7VuDiaQliVBJ7t0LVl0JX/K0ZYAuCuyUfrEGBUaZREUmEgL/KiJoIqBKagljCPUz5pN+N4MaxLIj4RmZNINSN/BUE2s86gsADBABEJSgbit7ZDjzFgKRgC1lEJgPdiw2g2Ta70lvOkINeACXhTzNdPgUDAX24zR+asN4MjiSAS73AX5WjZxPhMA9Q/ABdbYGVY1aJuiGsBFZxqUjhhFGDlwgP4aN4HWwC2nXLOjQiLJIInbUy0Wt4pQa2IUH/ydQwARmKr8RiDSkJW3T/TCJMXpadKX/ZEBWKEqAFgDgBjCYgAJAetO75VSZjuKpEuYpgKQBlR8lYqZdhsCBhTG1qSR96pMkREcvUNWq/CBPXOixBA5QIGdN5dpTsTPWBkk1CmftR0N+YACkhUUEgJOGD0jwVa7l7LCvy2ld33TXKeQ1HiuxQQ5eUIUVoEBdS5kAAJ7gghM84G45Y9jtSgCCCHjAA2PzwGHqOqF4KuKxagkaJTmngxcIzycU+AH+iFADFCwVtCAgTwRQEIALQEAEIlBBB15QJtbKZrdpqAEMqhrbGiIThx0pgHWJgAMJ/NawDxhADzj3DBioSwQGAIfADpyLUloIpCbbHQJPlsIAGCxhBxa4HcM6at865qCcRFlsWXORA5MwIYMyWQADBBBfIdzgBRpAwVtvpzkjhCM1lHQMZKb4DY/xozsiEMAPeNDeJNDAMT/YwAkkwICJcpgsL9mMgglyGRxMlAmiAoCN2zIFeoZ4xK6NLo+nYIMX3XjISNZKEAAAOw==" +#define PHP_LOGO_DATA_URI "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHkAAABACAYAAAA+j9gsAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAD4BJREFUeNrsnXtwXFUdx8/dBGihmE21QCrQDY6oZZykon/gY5qizjgM2KQMfzFAOioOA5KEh+j4R9oZH7zT6MAMKrNphZFSQreKHRgZmspLHSCJ2Co6tBtJk7Zps7tJs5t95F5/33PvWU4293F29ybdlPzaM3df2XPv+Zzf4/zOuWc1tkjl+T0HQ3SQC6SBSlD6WKN4rusGm9F1ps/o5mPriOf8dd0YoNfi0nt4ntB1PT4zYwzQkf3kR9/sW4xtpS0CmE0SyPUFUJXFMIxZcM0jAZ4xrKMudQT7963HBF0n6EaUjkP0vI9K9OEHWqJLkNW1s8mC2WgVTwGAqWTafJzTWTKZmQuZ/k1MpAi2+eys6mpWfVaAPzcILu8EVKoCAaYFtPxrAXo8qyNwzZc7gSgzgN9Hx0Ecn3j8xr4lyHOhNrlpaJIgptM5DjCdzrJ0Jmce6bWFkOpqs0MErA4gXIBuAmY53gFmOPCcdaTXCbq+n16PPLXjewMfGcgEttECeouTpk5MplhyKsPBTiXNYyULtwIW7Cx1vlwuJyDLR9L0mQiVPb27fhA54yBbGttMpc1OWwF1cmKaH2FSF7vAjGezOZZJZ9j0dIZlMhnuRiToMO0c+N4X7oksasgEt9XS2KZCHzoem2Ixq5zpAuDTqTR14FMslZyepeEI4Ogj26n0vLj33uiigExgMWRpt+CGCsEePZqoePM738BPTaJzT7CpU0nu1yXpAXCC3VeRkCW4bfJYFZo6dmJyQTW2tvZc1nb719iyZWc5fmZ6Osu6H3uVzit52oBnMll2YizGxk8muFZLAshb/YKtzQdcaO3Y2CQ7eiy+YNGvLN+4+nJetm3bxhKJxJz316xZw1pbW9kLew+w1944XBEaPj6eYCeOx1gqNe07bK1MwIDbKcOFOR49GuePT5fcfOMX2drPXcQ0zf7y2tvbWVdXF/v1k2+yQ4dPVpQ5P0Um/NjoCX6UBMFZR6k+u7qMYVBYDIEqBW7eXAfPZX19zp2/oaGBHysNMGTFinPZik9fWggbI5Omb13zUDeB3lLsdwaK/YPeyAFU0i8Aw9/2Dwyx4SPjFQEYUlf3MTYw4Jx7CIVCbHR0oqIDNMD+FMG+ZE0dO/tsHlvAWnYS6H4qjfMC+Zld/wg92/tuv2WeeYT87j+H2aFDxysGLuSy+o/z49DQkONnmpqa2MjRyoYsZOXKGnb5Z+vZqlUrxUsAvI9At/oK+elnBpoNw+Dai9TekSMxDrgSh0KrSYshTprc2NhoRf1JtlikqirAVl98AddsSavDBDrsC+QdT7/TSoB344tzOZ39+70RbporVerqasyw1MEnC8iV6I9VTDi0uqbmfPFSq2W+gyUHXuEdb3WR5rab5jnD3i/BNMN8ChNaqsTiKa55KmBWX+Tuj0XQdQVF307nhTH0CPls+O0UPbaT5TQG/8qX68u6LpV67LQ6dNknaYgaYyPDx2TzvYGCsnhRkH8b/rsF2GDj1MCInkvxvRjOuCUlipWD/zrKx7ZOwBF0vfSSM2ShyaqAAOC1Nw+zt9/5YNbrN1zfwIdpfgnqebv/A6pnWAn4qlW1HPgHQ6OeoG3N9RO/+StMdDtmV2LxJPfBpQCGfwTgrVu38jFrKaW2tpZt2LCBdXR0sEgkwhv21u9cxQsyW3ZB1+DgoOM54btU6tu8eTPr6elhy5fr7IZNDey+e76e9/fCLcAllHpdKKinpaUlX8+111xB9VzNrYxqUAY/XVVVJYMOekLu2fFGM8VWYQRYiYkU9bD4vPlHFYnH4/zvkb1CgwACHgMoUpdyw3sFXcXUh4YHaNSHDqaxdL5jwVTXBpeXVY9oF3RcUQ+O09NT7Cayfld+4RJlP42gTIq8w66Qf/X4a6FTSSMMDcaE/NhYecMM+MdyG90OAhodWoAGkTUaSZByO5WdiA4GqwStrrM6k5vFKEXQserr63l7oR5V0NBojKctaSZtbneErOtGmFxwkGewjk0UzpCUlJSIRqMcjN8CkHLDqyRByq0PEGBBhDmdj7rQVujAaLfrrlk7xyW5gUaxpEtOmOQDr0e799NYmDVBi0+OT7FcbsaXxEQk8qprEBQMBm0vVKUBRcNjskFE8W71lSt79uzhda1d6w4ZGTUUp3NWAQ3TvW/fPvbVq+rZH/ceULOcF1/I06CY3QJohCCzNJnYdgEwwvpUKuNbUsLNpO3evZtfSGHp7+/nS2pw3LLFPVWLoA5yHQUtXvXFYjH+vU4F5yOibzsRUL38MTqC3XWh8GCWziMcDjt2BNEZUIfoUOpJkwvziT3S5ua8Jj/4yD5E0yERbPkhKv4RF4mhkN1wCMHN2rWfYZ2dnWz9+vXchNkJzBoaQ8Bxqg91wWo41YdO2dzczD+3bt06Rw0rBG4nOF8oi9M0Jsw9OgLqQ124BifLgeuHyVbN0NXUrODBmDWxgRR0pNrUYqMNgDOZGZbNzvgCuc4j0kX+GPJ2//CcMagQmKkbrm/knwVEp++SIXulM1+nhj9AY207QRDnpsnye24WA59DkuPlV/5j+z5eB2hE0W1tbTyQdNJmDpksRzFp2E9csFJAboRvDvz8gZdJgw2ek55KZphfAv+Inu8UdKnmkEUHQK93EjEZ4Rbkifq8JiactEpYAy9Nli2Gm6CjIZPn1qlKFWizleOG3BIwdKNZ+KRMxr9VHKvr1NKLXo2BhlAVFRPq1qlWW6MBr3NWyY2rTGXO5ySJlN9uDuiGsV7XTVPtl8CHYGizf/9+V5Om0hAwVV4ahuU8qia03HP26kyqFkMOTudDzjs/P/QKBUiBYa5ZNucfZJUkCG/0IhpCxYyqBF3lnLOII8q1GKqdStQ3rTh5MStwXX5O/nE1metGQzPHUH6JatA1OppQ8u1eUbpX44tO4GY5vM5Z9sduFgOfG1GwUOK6VFzaSAmrWCSfzGCuuT/O+bi6QwRdTtqXN2keJ4/ejgkJ5HedRARkbkGe6ARulgMWQ+Wc3cDAWohhoZdcue7ifJ7crfP6Me8dELd0Mv8U2begC2k9SHd3t+NnNm7cqKwRbiYUkykqvlZlmOYVLIq5bHRep46JzotOc9BhuFc0ZHGLph+CJIaXr1FZSIfxsdBiN1+LpALEK2By61Aqs0rwtV7DNBU3BMCYixYTLU6C8bM5hBwum0k1mesBpmPtlj+qXFenFsAgCVLon9DYeIxUnmh05HCdBIkCVRP6ussiepVZJZXIutCHwt2I0YGY2Kiz3AIyeG5aLNooVULQBbHy1/nAK2oEtEanheil+GO3aFg0FnwSilNC4q6OrXzywc0XCy1WMaFu/tgrCBLRuWpHuP+n1zqmRXFN0GAnwKgHeW1E1C/86UDJHFKptATZMPZTafbLXHtN3OPixKRC4ev4GwB2Gy6JxhQNEYul+KoKp79RMaGqKzy9ovzt27c7pidVZtYAGJMYOP7u6bdK1mLI1GQ+/ogSZBahwKuLO2jSZt0odw65xrUhAMNrZskLsGiIXz72F3bTjV+ixvtbWcMQr3NWCbog5VyXAIy63PLrqpJITIqHkcD9P7suSiYbG53wvTLKDbr8WBbjZqIF4F3PD3ItRn1eQd5CBF3lCM5RAIYfVp0/dgZ8SvbJ2/l8MmlvNw+8qJTjm+drWQwaAXO9KMuWncc1GBMXKkGeV/pU5ZxFIsTvzovOCu3HvDnOE7NTu3rLr+PE8fy6+IEX9947YM4n/+LbPT/88R8QqoYAuVSDrZLFKcYso2AcLBIeGDPu6h3M+yqvIE/4Y6w4LdUfi+jcr86L75KvC9+PcbVfd1hCi6U7Innwk1/+Q5rcoetsdyBg3s9aCmivBsNFifGfG9zCJUFiztmpEXAbqhMgr6SLWBPu9R1enRfm1ktrC6cVYWH+/Mqg43x6sYK1edaCex7vkRZHZkF+6P6NkXvvi/TpLNBUaqTtdcsoLtIrVTcem2EHDh7m2uq0ikMINBvafOmazzt+BkGMW9CF70DndPsOaJqb38Y1oXjdCYHOiqwbPofrKid6thMAlnxxPtMy6w4K0ubNhq73U5wd5PtVleCTd+50D2CEafLloqixyv0ufMcOGq64CVaMYN2119gfAdPpuscKOxWgCMDwxfm0pvzBhx9siRLoFt3ca7Ikf+x2yygaYzHdTSi7IT9y8fMJ2Lpdhg+ZCPA2+f05d1A88mBLHzQaoA1dL6ohVLJGi+1uQj8XQMyHIMgaGT6eDxuozMkD294LRaB7CPI27DLHQSskSFRvGa30O/zndF4fF0DMhwa//9//iZ2DcILqN7xBHn1oUweNn7eJ3WO9QHvdMlrMsphKEj8XQPgpuHVVMtGOgF0hC9CGTqbb2kHOzXx73aKiuiymEv2x22ICMYYeWSALBQ7RQ0fkoZIr4DnRtS3ohzf1dNzTG9d0PcwMLahZO8UyKTMm38wteratSVtkplq4oWj0PcfrEinPhYg14H+hvdIwCVs1bvb6O+UBMYFGl90d0LRGLRDgoHEUwYnXDniQStocTVUwfPLaKQGA/RoWOmkvtnsaG8unK+PWMKlH5e+Lznp03N27RdO0TkxmYNZKszYBlyfI3RpjsQkmMOo8ls4Wsx1EKcEVAEvayyNoeRzsO2RI+93PNRLesGYtNpBhL4l/prlgZz5ob0mbtZVFhWC301d0EuQgAHPgS7D9hssTHKyMbRfLptF213NBDRuoaqxNA2yh2VUBDnxJ1M1yRW6gOgt2x64gqXK7ht1yOWyW1+wl7bYXvhUygQXgit4KuVDuBGzSbA2bmmtayNzpRgJOGu7XosHFChZzvrGTiUKt5UMiVsmbmtsCb3+2lZmwm3hFNsA/CiYdKyfhYx3Aws8urp8nsJM72naGCG8zYwZMecjk/WHVVRbsMwU6tBVQsWJS2sNDlrgVTO0RE/vzKQtuN2+/85k5PxlUaL75D3BZwKss+JUqSFRAO/F7Eqlkmj+2gbrgYE8rZFluu+P3pOGsyWCG/Y9/GR8exC+vYfc5flxgzRdDGsDEz/8AJsxwQcBUKPCtmKOMFJO8OKMgF8r3b3sKkAm69TN+2OZCAm5ID/g9XPypwX29ufWgudq0urrKes/8nPkxgy1bdg6z/or/SFc2mzV/xs+6HwySTmdYJp2dpaWKEregYrVfn9/B0xkD2U6+e+sOaHqImTfLrycUOIZM1hJwC3oemPXbi/y5PnsrJ136bUa8pxu69BklmANWwDRkgR1wmwVaglyi3Nz6JLQ+ZG5NxQsgNdAhmIfJN7wxgoWg9fxzPQ+c/g9YAIXgeUKCyipJO4uR/wswAOIwB/5IgxvbAAAAAElFTkSuQmCC" +#define PHP_EGG_LOGO_DATA_URI "data:image/gif;base64,R0lGODlheQBAAOZ/AB0BAHB0r0xPkMmMdtjXu9CYh2sxAquv1pJsTmUCAKyQaaVnA6lwVYOGvJM1ANvbwYlPMJubzVYCAGgRAJhqLm9BCq99aLetkqpMAKJCAJdvYqtzHZZWAnNsmIUjAHdKNW8bALqST3ABAJpjEVYnA08xU5JLBG1FU8fKtIhcS4d0kYJFBLiQgkABAIQwAd3h0eDm2sXCpdXYxIiKwG05M7CtuH4UAVNGdNPWwJ5dAcB+ZOjv6NrdxqRMAN7ZuH1qeXZYYszQunp9toxRBJ2dz5yHaa6ANoVYHrWgebK54M28jdfbxpGTxpWWyY8tAJqFl6hHANzUr5J+UqOm0Z47AI9eG9LKolo1IEASAkNIjJSczVkUAYyPw1NNTqSdrYNgZ3hMGK9XAa5KAJNKGaGdv3k6BVgZE6BTGmVopNrezIJhNGgeFpJCKFogM9DTvpiQrm1afpiYxZxQClZZmKJSBaNGAWsnItLQscC8p7NaEI47BpdhQGwVFy0bH18LAJmZzCH5BAEAAH8ALAAAAAB5AEAAAAf/gH+Cg4SFhoeIiYIRRERTj48HkgeQU40Rf3FNm5yLEZ+YhnFeTYqmp6ipioyOU5OSSbGys0mTkERaTUxcM729XExMpaCYTTU+NaWqy8yoo3Gtk7SxlGRvT08qPz9f3UBAX0A/KuQNXOfnMw0NQu3t5n+YNQ9RXs33+IOfeFE1B7MHyGTjdoLGGjN+JChcyLChHz981tixQ+MEEDhwOgRoFyAAmo1C3rh5gEdZvpOnHB2Y56ZGkilvfpyws6WFzRYMH+rcOaGnz58+/UwQ2lPiiYxokqLpgIKHlSeXUEolpPLfgRgv8KQw6CdBAoU3cUp4OHanWbNA06aleOIGGjw8/x4gQSOkCZFQU+9FcPWv1hsvBF4g6fpwKNiwDRMvPMu4sdk1F+IqgZNFABoujPDmTemK2pOZWyKnKVK4Z8KwYhXnHLvYsWudSNLQ+5KltoA5Qv7c3axIZSwyKuwstBMkLgKipv2gVpjw9Vm1yNWajv3gAYUtbW7UzoLbLm9DRGAleUIjYQKyCNLwwKEG6OmbzBlLTwtiPlAQ+CdQ5xGiPog1JWwngBCMfKdbZweoUF5ZO8XGwx0QIEcWYqVF9xMILtyHX349bejhh/ghERcPSHjgIYDacdfAJ5t1Np5w551lRwxpLGEFGNG9J5aFaq2wAYge+gQkkBfI9oASZXw4VP+AtaHhHUrhxfIGDa2ZJcEHbvBgI44/6cicWkFWYcSQHE5ApodlxLBEdVasoGRXZjA54G74IPiFYlYisISWN+YoAXxjgbnhBBT0ZyaQQx16JghgBFHdA3dU8eZXEmTX5JPMdPbEGsw15NWnEmjAQ1wQJpCcjjgVxhNQRoRggIb1NafokBMggMMDa95BwZtfgsDkHDMQscxektzZqQSfeoWsskUYecceySrbAgA2MRhtshO0WoYEIng1galDyXpmTwrI8AAPBBBAQYemLXRoAm3Y1oCwqBBLBg2pqdYQC6M+QAAD0f5J4bXRghBCCCssS3CgIPbUrVcX4IruvwG7G6v/QiUIkIUQ9JriSBxt5JvQQoAudMGe/iqQ2HJdUaqYAQeboNBXyi503qz1PfzVGjFInC4CoDaUn8tMzmvKXm/wIYIIEzDdU9AuM3dyXAQM1tByyJJc7UJlGLEBByNrXa1QSlJqEwIEnLsEAVEgIHa1Zo58U8Ybd3wIEW+wYYMHfPftgQ2ABy444HigTIASeizddIw6PV1z1BKUscACOYBwNXxEefjVTWZckLaWBDx7GLXUtlDf6DYFKAAXdg8ShxZxsOGEA7TX7sTtuOeOux6F93uHER444ffwfA8uOAhl5LBB5QnYIILzDzO9oYlDK5uCGwTsuQQOpb5NFKo2aTdH/xOa/bGJFinMXvv66jvQvu28S+wvEnrYjrv77Ot++wqFhrCBCSAI3u36pjsXuGCAfkNC2s4lAxzEYAzG6xDfQGCDpz0kAXzQDhpaxwQtaOB96wuhCGmnh5OtyV9WoID6bjfCEbqgAmBQgxQUoIYKkAALIGwh+xhwh8+thwB4GIP+cHdA3fmNBrUxmiCCMYO/8c2AUDQg3+7nAD1Y8YoXkIHhohAC/OVOh7SjggGwcAUjrIAEN7yhC6gARhGeQQnpekCNcIAD+rURjOIjn/m4oIUTLG1pftjCFu4zqydKEQky0GJ1CJDCvf3NkQSkogNWYAADgEEKBiiDCVZgAgNgqP+NbGSjHhT4uTm6QQE5vGPtylAbjkVgFypQWAKmBYDSoQZrCtFAIlHmgygowQM6+9QfB5dJTnLABENYAAdykIMVlMGTASTeFIXnBAX0sDppSIMM3BAECghQdyS84gipQIUTZGGDfwDGCa5Wy1rS0p3tbOdNUoADLcall1ycwJ/2abMELC0BWzCACUzAzMkpcwQcoMMxDbCFlkXrYR6wQA8/94LtuSEGegPch55oABd0NIDRdEEVkbi6JsyAC21gpzzjyVKWXgEFu6wOPkNwy5IF1Jg5MKgyc8CBZXLgjDWpaQs+cIEoxPEBL3hBA4OABH1m7ZZYiKpUWyBVQYKABNr/CQAvhOBQf4pAJ6wRGE5ustIWZNGe94xCFJCAr5pKIKBlOMIQlpnTyXFgBENg5k9dQIKatNMMNEAAEqxg1AWmAQZL2GYQ9gCod7b0se0MEBp6oQLBCXB4FOxJBSvYpYQgwA27vCc+rRCCD5hBrG8lQRlWMIS5Us6gd6XrT58pyCsUAQlKIGwvCeCD6vAABtrEgRsusIZbQva4tezDbRowgy+Q87nQfa77vjhCJ4whBvVcAsoe4IPu9tIKSkACEsZw1UyWYa50hS1e9brJZ5YBCdxVa3cXeC4YKFW4QUBATZF7XOUKYB3OzYCAB0xgAUe3wASmAhLckN1+ydS7vVXC/wIqUIFiznUIIzBCMimHUMod05mrDQF3e/soXB0Wsfi9QBlq9jaBwROyfagMgKmA4BrbuMBUoAAKGIzWuDy4u0agwAoqvNqecqAKajDA5HiazGNucgWsNcKtSoyrF+xgB4nFQRBQsAf9+S2a1PMQ4CZQwYfE678NCPCN12zjBdezxz5GqhKMgAAwEBkMHEjmCI4wgg0sYAQddjKUh3CEDVghLtrdEwyuHFxu0i/BNM5AdKVbO3LSDnckXccPqFCHTnu6DgMGNZsLfIYY8BjOcYEBEqRAATBU0gAryPMCNkBrP+N1BMoc6KCrQIEi7SkNL1g0lhvIzQuMIdI2FnUGQP/d6Rt/gDszEEIH9NCDalv72tX+tLa3DWoG7PjN2h0VD9QjBSkcwYYGqEAVWjvrWucA0Lh28mqHUIUqKGAJSRU2YokdBDzswQFrbnaoPW1jc86BCe2ggR4GynCGy8EEcpADtieO7TooIAinTvQSYBCDctuQBOmWKwfaTWtAVyGnFAYxvdWAABRc+cr7xq+/HaDsAn9awNyucVb/IIQGlEBRJuooFMtQBhdcUQ9QbnjDHy4HJGCcx4lWtRTUcIU+AMCS6+ZArUsO6MlVGOQkgKEMLwDzRgeh3/+GArc9rfZtt13tOK8DFNhQmxlEINpw8OofFee0n1Rwo5W8KsgreXH/jGd3CaMpQpLRmO5193kDXtvACCjA668N4eNhl2ERkppI/AbhAhAAOIHrQPHSX5vtUDD4JxAuhDbofe+wj33sN1c6P7TcDbiXQRpQUO4roLECZahAax9vBK8hNAdVQOgQKPn7GEoBBdrk5pYVYIdDmcgDRh9oxOVAh+7TYfveD3/45aAdjgmiHR1owetlz/7Zw6cFKbjA2d2QBjyUGwxXgOERKECBIVCA1sW3AYVCAUbQZ3jlTBQGBmBAVGlwdp+HAEFFISBQSURXBkd3gWNgAhmYgQxnTgLABJjwSu1QAgDALe13grH3fmZQBDEQBDJwAWpQQxUGQzBUBZLHa17D/2uUdwRHAAaU9GowpIB4cFFFYAaP9X5YECiD8zyD4zc2YAcaY36L0AAdYXUmmCwoyH4lcyVFgAJFgEaMl3IrMAL1FgL8t3WS11o/CIZYgEZqUAQf4Fjy9H7IkoWyJz6agQntgAbU4k8EQzB/tH4SQC0MgRMfAAFt2IbpBgaERnlqQEMh0CqRRwE5sHzPBIYkcAWl8ydHmC92KHt0wzqFEAFN0A5zgBN/mIrC9EeDaEtjFTljBHL6t39HQGeCFV5IEIn8VwVQdolYAAZGYAC21IoshRjr94nxkgVKNIpcsBFwsCzBpIoPNUvFeBMhcASKGENqoIBgcARqQAEIgAD8h/8AVcCDdvZ1NwQGFIAF7mQTR0g66vdPWPh6WNgGGhMArUMIEdCMQgAHLuCExrNZ7ceJLTVUaOR7QdiNPMhy4RiOu1iOllhJNxRVAIAFQdWJ7uRVgBiNCcAkAcAiiXB3G6ECxyZpk8ZG04VAxIMfVlUfE7AFUZV5e7AHDMAAFnCTLJCTOWkBNbkHEPCTdiaR7EhVQ+mO03JLsiSNXkE3aACSq9CMGwEBUDCVVAkFGHCVVZmVU3lzBQYCZJQCNqkDOjAAZEmWBXCWaHmWAyCWOsCTDIAAKQAGE7kYp0IWwqSUXuEHKYKP5ROSCNcRKQAFYmCVV1mYhjmVhpmYislXYGn/AWwplmWZlgVQlo8pljX5llcQVSAgSbkDkIHzPLJnKXPCDKQoBCMplYqZmqqpmCZwBY3pmGUZmWpplmSpAwzAlpe5B5qIBVQgBoO5lYSZlaJ2kuSkB+YEbflYLxFAhR3xBWcgBqsZnalpAGAZjrc5AJKZnWt5mbfJkzO5m78JnNKplWJQBx+QIk6SnKpQmh0RACmAAdApnfK5AofIcimQAjSJnZJpmxqwBw2JADTplhBgdSQQnlQpn4Q5mBCQIv9FJyeBCdHWER2QAnIQn/KZmnnwAR9wnxrQoRoKlpFpARqQAh9AAynQoXAJljWpiR/AABmglYIZnb6JAQtqGwGA/ylTgQnMCZjPaaEXepUZ+gEacJMpEA5AwKFrWQA8eZ9F2qE3qQE2iYgAcJts8KJZuZq+CQU12iRM4KC8QYo7GgA/sAcx+qMYEAZlkAIsYAE0IA5X0AVF0KFoKaL3+QNv2gU0wAAswAA0AAEf0Ad7oANsQAVZ6aNX6ZtiMAZtYRuX4aUG8glNEKYTegY9YKiqGQYGIKQIoKFf0AU/0KEpYAGTeZ/hqAKe+gUfgAAaYKIWgIhUSqhVGZ+IigFjsKWV0ah9aSCekE6m2Z4d8AUQQAfwGZ1jQKIMsAcc2qEasKEDwABCKqKqOqIpgACOaZt+OpmDGp6I6puKmiK10R2Oqv+rh7B67NCeAfCrM3kGYbCu7LquNokANnmT8moBV8AAa+ma88qTN1kAlgkBGjCZepAB21oHtbqo2zEHaLAi4SquIUmuHfERH9EB3CCOW2cEPXmbY0mWzmqvOnCiZKmTFoAAYymWezAGgcoAhFoHbPABBnuwAWB3jcCw+MAiTBChSqEUErsNnzqvbbmWPmmZNJmxssmvx/oB4AAEbeGt30oXDaAb6imzpEmz5XqzVNsBHUAOKoAN3XCZRWoB2PC124ARAqAx2yEglvGydhEVUPsdoPAHuxChHoEGczC3dFu3c3sbY0u2Zbu3t/ERQnBSaeuUayuzoLAbTcALU6sUdnsSt2Nrt0mxETPABE57Cbmqq4EAADs=" +#define ZEND_LOGO_DATA_URI "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPoAAAAvCAYAAADKH9ehAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAEWJJREFUeNrsXQl0VNUZvjNJSAgEAxHCGsNitSBFxB1l0boUW1pp3VAUrKLWKgUPUlEB13K0Yq1alaXWuh5EadWK1F0s1gJaoaCgQDRKBBJDVhKSzPR+zPfg5vLevCUzmZnwvnP+k8ybN3fevfff73/vBAJTHxc+khL5kr6T1ODk5nAgTRTWloghFVtEg/zfh2PkSvq9pJGSKiX9SdKittbJoD/PSYkrJD0vKeB4IsNNotfuUtHk/CM+IvijpF9KGiDpGEkLJZ3lC7qPeKKTpD9IWiDpUOfWPCi61ZeLvD2VIhTwp9QlTjK5NsIXdB/xxHmSpvD/OucWPSAyQw2+LfeG1SbXVra1Tqb785xUaNdMel0g7Iu5V1zPv6dJqpD0kKR/+ILuI55o8oeg1bFT0kWSOkraQxK+oPvw0TZR3ZY758foyQXf//ZxUFh0Q/GEfNf9gHkaJ6m7pHJJSyTt9tnXhxtBR2EGlnHCMbZMaHuHzX19JZ0u6VRJh0k6hM+BpMjnklZIelPSNhff3V5StkNlEWBMFm+3LcC+BW3GuZP2GvfmiEiCCMUzxZIKRGSt9zeML/fdGAW9JB3O8c6SlMZ+b5f0qaQiF7EpnieXY1auvZfG7zhSUk8RSS428F7M5xfsh1eAV/vxOzoq16sklZBqbdpo5H2qDPRQXoP3Ki0+20FSFyrZUgt+Rt/7KH2vZb8/t/iMG2Sy/0dI6sbvgHGoV8a3xErQb5Q0iTfHCplkzlkW7w+VNF3ST7QJUzFK0pVkDFiw+yV95uC7r5Z0k3CW2ApwIkrJ9B9IelfSh2SIlqC/pDFUZAVk0rQoMhk2GYswx+AtWvMKPtcyEckW37pPwsIHNAuBniDpYhEpBMmJwvibJL0gIlVh39r0C8UlczkXQ/mM6OtEzuf3RfPVAxUY47f5PStcGKPxpOMldbbxiBptPMavJX1PuQ/P/olyz12S7rD4PLyqBTQ8gyXVSOot6VK+dxR53wyl7POjkv7pkpcwpleJSCHP4eQjM0BB/ZuG4Hl9EO8mQx4ZQ0FfL+k+k+t4wNlULpkO24IGnSzpQklzKPDRAMvZ1eXz9uXfH/Pvx5Ie44C5zYQXUgDPj6LEnMCQ3AFkjjupjGF9/kJmxPw1oiquz+6dalXcCRSmYxwK0kDSRI71azb3Y+6GiMi6P/5ey3F3YpExjxdQoG61uX8gBetkh2OWFkUIVGUT1pS9yosZNu1nkl8uZH+mikhxkx1wz7mkB0WkXsKJFw1ZuSWKotY9wjNJS6mUy41JK5P0c2qCnBgIeQWZvEK7Dnf6WUljTT5TS7d0KwezkJShdWIeGeuKKJo7FktUQylcl0i6RtL/HH4OjP+wB0UTLTGHfubRDWyi1g7SaoZQ495z9w7RpaHKqHEfLeklEyWzk+7dl3TTu1KQCpV7+pBB4IWstFFAgvOpJnTL6DoW0xPbw3k/nIYkW+kbmHeXhUEABklazrBDBdzTDfyuBo5DPq1eoUk7ZbSk70l6n3MZjUdCDpQvMF/rezn7/hX7Xs8wsj/7rsrWdQxnZtrwwENUosJkDDZxTjOUkEH1ds6lzJyDZzGScRsonGNcMCIG+WgRKTRQ8Su2p7uRi/mlKjZKekREChS2KIOcTvfqp3RZDlM+cxnfv8Thc75Pt8kqo92VzNTbxBqcQlceivAdByHDIxbvFTMOLovyHAGGK3qc/jJDoDc4hpjABzBm4UAglBFqEAOqt8mB29ss4uJnNCHfSK/tVZMYEfMykt7Bcco1eDLDHCT8gmzzRdLHZL6wRSgzg6GIgVl8Xj2uhPA+oQn53yTdK2mVMC8NzuJ8zaSyM/ApxyzWCFJRvUQ3eQ29BTNFcRgt+FTl2g30zDZZtD/ZRMifE5ES6Y9MxqAHQ7XZikI9nd97j5p1f83GZTPr6Crt2sOcOB1zTYT8HrqjVRZx4wbSAt47SXn/YsZV9zp4zuvJgNGQRaszmoN1rBY6IH4dHiVHcA5dZd2zeIbPv8ZBkghYTQFTx/h1WvSz6c3kM5ewGG8Prvxc5DZWS2u+dypnM5Y3sIJMXmbxfXW0misZN56oxITnWsyl2fg+6+C+zWTefMWr68RwaYF271htHBZqCsKqL28wB/ACjYShrE9nUjfWmEU33A7woqbR4k5UlNk4yoYOzOHvtGs30KO1QgnlZC2VohGOIGn7WEvW0ZdoMeCHfBgdo8X++m3V+s2wEHKzJMblJom92+ne2SHDwT1gknUispPpJLrrVZqwLxTmy5F5jOdVS72F/b6UwlbrcEytrD00+a8l/ZUM82jEZd8peu8uNYS8JxNWqis5IYqQCy1rPUULh8Y7fOYal3zzmPb6aJN7zlf+32bBV9ESclNE85WUX4j4oNbl/fM1b2eoxX3jyXNqiDTP4Xe8Rm9ItfSjvAr6DM0d+o5MXW/CuHO0a7eZTLYT3KF9LktYZ/WdCI+IkoV+lFZ6l3J9OF14HdM0F3MrhXxFjJmqhh5FBera24XqxaCqL0UosK97Z2ku+yJaEqf4D62ByoROcjZuN78Xaa9zTBSzKvxvC+vlrmgWVPU2h4j4FCO5lZ+vNBnpYHHfOOX/PfR83eApTaGM8CLop5l88WSLWAOu4AiNme5owcBO1xhlLGO/eGAFkyYqrtFe5zKzqU7KBE5o/BAIiv7VJSK7qV4GhEF1XtSk0YseWl6lWYI+cXj6pigJLkH3Vk0qfebxe4q0JGOGSDxCWn/Nchk9qJgMfGKS87LDes1IHeVW0LszgaC6sPMYE5lBt4CzRcuy4lVMLKlWfWwcJ+YpxtcGjtOYfzRjTgNIlv0rnpyCveeHNFSJ/jUlonH/3nNYqyOU28qYhHOLbzVPqFc81JQDKxnQ5twLdmjfmQzlxU6eoZ/mma3y8D3VonlhUr6bElhMwJ81RseSxW+jfOYULdYGAw5s4WBtpeU0ijKwxnp/HCfn70piCNlMFEUU8/WpmnZe1Bq80r96m5yMkIwx9nnNHTWFs114q0ArM1HsiUY7j5/rKFIThdrrzR7agHyoy9vd3Ag64uEfKa+xjIKlLqtTUBB7FWgJrQ9joFl1d2cQ2wzHaeDXa6/ztO9Wx+OT+FrzSAKuV12ptOZp+ljnaVawk8uxDpnMZXYCGB3PXqe5sl7QQ5ubhhQR9B4mQpvjIR+gJgrbOxV0rK/rVUyXmyRWdI2a2YLEhVP3BwmN9sJ9BtQpKkxiSDOrUeUhaeQaPevKzKQ3oIVTSGatcynoRl29sIkh440a8pURNoz00Ab4Ts1obxCps1FKl8k5IpKbcmsgu6nz6ETQC+iSqoKKOPmVJBmYnDjHX4EozB9s7TgwykkyYS13URAHpmstYIloOP/HEi6Wx5a4+DwSpH2V18tTyHUPm3iQeS1s09ai4/0ntVgNRQmzHTRulGwaQNnei3FgHqPcMBEJlXrNioAaE8AcupKBd7ElBu1uTxCzg+dmKB4TahiQNX/OxssAb00Uzdeci4S3FYhEQdfkWCrc1cI2K+2EDhsP1OUxZGUnOWTmcgphV0UgZ4jUR1hLlBiuJfqJpb61CXimOrq8RqiEeu6TU3iMwdzYgWhUnWHDDKr0ptLar6USqmOfYYiGMMTUN/KgziGVTo+pNJHBBfF0zVAQc6N2DUL+tcO2Yc1Rk2ss+yBmOko43yCSCljJXAWA7PD4eAt6MBy2yiNACRvVVN05t40pPLYPsT+zlRDpOLG/Jt8OSGKhmnBpivV7q/Y6JkucVgkyWKb52rVZwl0tvNDi+AzRvKjfK1Dnjvpd1FhPEc1LBVsbqENXN35cFaPY2BIVGdlWYZKqgPPj/RythNtpcNycpoOxwAae0bGwhAkAQg01cfiDWDRqZtHhCqFQ5FAtOXKXh/Yh6Ci2N5YMUDW2SHg/N3scn02N++cnMIZCBdwS9gtApRxqDc6OlzWtSrdc8cJGlzP5fzZDri1tQNixISWL/5fSQvcVzfe/wzXfSG8Kuw03pHB/t5KMik+EYJ1EC1d0zCw6fofqRI2ZJwpvyxN4uPs0q/6UR2szyESobxatf3aa7jvfrT0DGPNpYV3H3CI0BYLGllQdy7TX14rUP/zzDHpuRp0EPLnJvH68Qij/RXnyIyku5Ea+5S3NO7s01q77eMY1qqY8T7Qs+4qtq+o2UWhjZO6HuWhjJBlZXWbAHvbFSTAxqMW+RbuG3VfviAP36tshujINh6Tr3kE0BNMl5x8Qq6+mVTdwrMlzpRrGaGPzVpw9NDNFngjoFZZzRCS/FRPXHRZT31X2MgfYTQYX1WE1moaaQJfKEFTs/camkXnUwt9YtNWPiuc67VmRlb0yiRgS/cAe7is0QXuTAm9kikM2DNc5OkeGRaMU8tq0TJHbUCOtezMeRfITiSv1PLLbGE5gb/NOB/1AuR1KlLETDltidyR4XIPasyEnc6eIbRa9kfNifFeXJOAnVJBiKfFCvobcLKccLHWojHJpIPH3iXQlpoNLrdcH44sucvmQOHHjZ9rDrGdbixVmbk/XGy4mtiKuoQDjmQpFJLs6wuSZvqKmL0ky6zOZLry+420UKUaue5ooyeqy9+iopgM989cp1Dcp16bSU1tOJbyFyjedTID5wOk6OAUFFXUDKFRLkmBM3xH7fzIJwPLsxexDMWP2b8g38DqN45ywCuH0VNuv+XmjwOYCjtUakbg6AkGlNoQGBMB5A9g8hh2g7zFE2U4F35FxfHfmwwbxcz3Yl32C/oAwPwDAS6UXdpOhXPZ27Trc9R/SLTla0zzGoXl2QAexnLVZJB/CZMpV7HthfL4lJIrb54u+tdv3/rCiSbw+k88yM9ZxXgKwlHmZycq13iSr0KeMHmUZw6r1VICrLT4D5fy4wq/5DAvfjaWC9oAd9KxwTNUJynUjL+EqpwSTME1zOWMBuIxmZ7p9RCsNq+NmdxW09I1MdNkJeYZNHsIt0qKEO2Z4kvmHadS+Xqv2cqzc93rpuhdl54tg2DISuJljBW3uZjMHrAPqHOYK6zPIM23G2+14Rts4cyLbdxo3Y667UskOo/W/m/PwRhQBwZFkT2vXzDbTtLMZCyfP1155bbfDrpjKZoYH41bO+d97jmEgMPVxFMF0iHESIkiNtDhKuwV058cw0dBZNP+lFsSU/6VWf0E4P/x+IF2eJnokr4uW/2jAKPYjjRb7Cxef70c3qsCl0im1Gj/Uu2eF6sWo0rUiTQq7zS+pYjywnXYwcyOZfI4mKgHj9N2ttHqbRfSlQXhjw5XXy4S7ZbzOovkxVRsphHp8ia3HlyleZS1zHcvoVrdjuNFdEe7edGHzSbpSria/WZ3+cxYV5DCx/4w7FUfyfTW0WO+i7x2YrzKUXZFw/sut+OxJDGkHUxEZPwgCquQcIgxZR9oXekDQk8FF60bqwocupaIoEz6EmaC3C+0Ro6Wgp4eb2tpPJqN+4xXFXQ3TfUfCc5PDNnLZDpLIV1NADKyjZa87mHgmWX57bYdIfIY3pdCGf43xQUXI62kBn3fZxi4SPC8crIjDQ4yzFAaz/XcPJn7xf03VRzIB5Z7qCbBzPQi5jga2E9bCD+ELug8ficEZCk/Cmj8Ro3aLtLxDR1/QffhIHNRTUZCf+S5G7SJBp2b7G31B9+EjcVAFEInZQ2LU7jiN1zf4gu7DR+KwTvkfO9bGx6BNnEQ8XXmN5cT3fEH34SNxwN4A9dgknIEwyWNbeRTwV7WYHBVwFQfbwKb7vOUjiYAiKVT1PczXqCLD/n5UbuLcNxTKoCgExSFNmsFCHI6iJBQFnUbqqbWPHyFceDAOrC/oPpIN+FVaVLrNUa6dLPbvoEQdO4pd1OUylBVkCutsOkqosbNvwcE6qL6g+0hG3MY4ejots1pT3kE4P9QDdfuLKeDfHswD6gu6j2TF2yQcLoqEGurre9EdP1QTfmxJRdn0NlrvD+jmY69Egz+UQvxfgAEALJ4EcRDa/toAAAAASUVORK5CYII=" BEGIN_EXTERN_C() PHP_FUNCTION(phpversion); @@ -84,3 +85,4 @@ void register_phpinfo_constants(INIT_FUNC_ARGS); END_EXTERN_C() #endif /* INFO_H */ + diff --git a/ext/standard/php_fopen_wrapper.c b/ext/standard/php_fopen_wrapper.c index f8d7bda482..0fb27baacd 100644 --- a/ext/standard/php_fopen_wrapper.c +++ b/ext/standard/php_fopen_wrapper.c @@ -157,7 +157,8 @@ static void php_stream_apply_filter_list(php_stream *stream, char *filterlist, i } /* }}} */ -php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) /* {{{ */ +php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, + char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) /* {{{ */ { int fd = -1; int mode_rw = 0; diff --git a/ext/standard/php_fopen_wrappers.h b/ext/standard/php_fopen_wrappers.h index 5f78256bcb..366a1295b3 100644 --- a/ext/standard/php_fopen_wrappers.h +++ b/ext/standard/php_fopen_wrappers.h @@ -23,8 +23,8 @@ #ifndef PHP_FOPEN_WRAPPERS_H #define PHP_FOPEN_WRAPPERS_H -php_stream *php_stream_url_wrap_http(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC); -php_stream *php_stream_url_wrap_ftp(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC); +php_stream *php_stream_url_wrap_http(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC); +php_stream *php_stream_url_wrap_ftp(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC); extern PHPAPI php_stream_wrapper php_stream_http_wrapper; extern PHPAPI php_stream_wrapper php_stream_ftp_wrapper; extern php_stream_wrapper php_stream_php_wrapper; diff --git a/ext/standard/string.c b/ext/standard/string.c index b9d7427eb9..2f05b65bb9 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -13,7 +13,7 @@ | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Rasmus Lerdorf <rasmus@php.net> | - | Stig Sæther Bakken <ssb@php.net> | + | Stig S�ther Bakken <ssb@php.net> | | Zeev Suraski <zeev@zend.com> | +----------------------------------------------------------------------+ */ @@ -23,11 +23,6 @@ /* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */ #include <stdio.h> -#ifdef PHP_WIN32 -# include "win32/php_stdint.h" -#else -# include <stdint.h> -#endif #include "php.h" #include "php_rand.h" #include "php_string.h" diff --git a/ext/standard/tests/file/glob_variation3.phpt b/ext/standard/tests/file/glob_variation3.phpt index 9e1e28baf9..c50f8a81b8 100644 --- a/ext/standard/tests/file/glob_variation3.phpt +++ b/ext/standard/tests/file/glob_variation3.phpt @@ -5,15 +5,29 @@ Test glob() function: ensure no platform difference $path = dirname(__FILE__); ini_set('open_basedir', NULL); -var_dump(glob("$path/*.none")); -ini_set('open_basedir', $path); var_dump(glob("$path/*.none")); +var_dump(glob("$path/?.none")); +var_dump(glob("$path/*{hello,world}.none")); +var_dump(glob("$path/*/nothere")); +var_dump(glob("$path/[aoeu]*.none")); +var_dump(glob("$path/directly_not_exists")); +var_dump(empty(ini_get('open_basedir'))); ?> ==DONE== --EXPECT-- array(0) { } -bool(false) +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +bool(true) ==DONE== diff --git a/ext/standard/tests/file/glob_variation4.phpt b/ext/standard/tests/file/glob_variation4.phpt new file mode 100644 index 0000000000..00d8f648aa --- /dev/null +++ b/ext/standard/tests/file/glob_variation4.phpt @@ -0,0 +1,33 @@ +--TEST-- +Test glob() function: ensure no platform difference, variation 2 +--FILE-- +<?php +$path = dirname(__FILE__); + +ini_set('open_basedir', $path); + +var_dump(glob("$path/*.none")); +var_dump(glob("$path/?.none")); +var_dump(glob("$path/*{hello,world}.none")); +var_dump(glob("$path/*/nothere")); +var_dump(glob("$path/[aoeu]*.none")); +var_dump(glob("$path/directly_not_exists")); + +var_dump($path == ini_get('open_basedir')); +?> +==DONE== +--EXPECT-- +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +bool(true) +==DONE== diff --git a/ext/standard/tests/file/glob_variation5.phpt b/ext/standard/tests/file/glob_variation5.phpt new file mode 100644 index 0000000000..10db40099b --- /dev/null +++ b/ext/standard/tests/file/glob_variation5.phpt @@ -0,0 +1,29 @@ +--TEST-- +Test glob() function: ensure no platform difference, variation 3 +--SKIPIF-- +<?php if( substr(PHP_OS, 0, 3) == "WIN" ) {die('skip not valid on Windows');} ?> +--FILE-- +<?php +$path = dirname(__FILE__); + +ini_set('open_basedir', '/tmp'); + +var_dump(glob("$path/*.none")); +var_dump(glob("$path/?.none")); +var_dump(glob("$path/*{hello,world}.none")); +var_dump(glob("$path/*/nothere")); +var_dump(glob("$path/[aoeu]*.none")); +var_dump(glob("$path/directly_not_exists")); + +var_dump('/tmp' == ini_get('open_basedir')); +?> +==DONE== +--EXPECT-- +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +bool(false) +bool(true) +==DONE== diff --git a/ext/standard/tests/file/glob_variation6.phpt b/ext/standard/tests/file/glob_variation6.phpt new file mode 100644 index 0000000000..9cd9c2b353 --- /dev/null +++ b/ext/standard/tests/file/glob_variation6.phpt @@ -0,0 +1,35 @@ +--TEST-- +Test glob() function: ensure no platform difference, variation 4 +--SKIPIF-- +<?php if( substr(PHP_OS, 0, 3) != "WIN" ) {die('skip only valid on Windows');} ?> +--FILE-- +<?php +$path = dirname(__FILE__); + +ini_set('open_basedir', 'c:\\windows'); + +var_dump(glob("$path/*.none")); +var_dump(glob("$path/?.none")); +var_dump(glob("$path/*{hello,world}.none")); +var_dump(glob("$path/*/nothere")); +var_dump(glob("$path/[aoeu]*.none")); +var_dump(glob("$path/directly_not_exists")); + +var_dump('c:\\windows' == ini_get('open_basedir')); +?> +==DONE== +--EXPECT-- +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +array(0) { +} +bool(true) +==DONE== 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 cd868bb50f..c1e7c2f3ee 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/lib/zipconf.h b/ext/zip/lib/zipconf.h index 2b4340c861..646c0bde53 100644 --- a/ext/zip/lib/zipconf.h +++ b/ext/zip/lib/zipconf.h @@ -13,11 +13,7 @@ #define LIBZIP_VERSION_MINOR 10 #define LIBZIP_VERSION_MICRO 0 -#ifdef PHP_WIN32 -#include <win32/php_stdint.h> -#else -#include <inttypes.h> -#endif +#include <php_stdint.h> typedef int8_t zip_int8_t; #define ZIP_INT8_MIN INT8_MIN diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index 7297523aaa..969bac1aa6 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/zip/php_zip.h b/ext/zip/php_zip.h index 7dd9ff09d0..dace407d14 100644 --- a/ext/zip/php_zip.h +++ b/ext/zip/php_zip.h @@ -81,8 +81,8 @@ typedef struct _ze_zip_object { int filename_len; } ze_zip_object; -php_stream *php_stream_zip_opener(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC); -php_stream *php_stream_zip_open(char *filename, char *path, char *mode STREAMS_DC TSRMLS_DC); +php_stream *php_stream_zip_opener(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC); +php_stream *php_stream_zip_open(const char *filename, const char *path, const char *mode STREAMS_DC TSRMLS_DC); extern php_stream_wrapper php_stream_zip_wrapper; #endif diff --git a/ext/zip/zip_stream.c b/ext/zip/zip_stream.c index 400edd6e6c..79b54cbbb0 100644 --- a/ext/zip/zip_stream.c +++ b/ext/zip/zip_stream.c @@ -185,7 +185,7 @@ php_stream_ops php_stream_zipio_ops = { }; /* {{{ php_stream_zip_open */ -php_stream *php_stream_zip_open(char *filename, char *path, char *mode STREAMS_DC TSRMLS_DC) +php_stream *php_stream_zip_open(const char *filename, const char *path, const char *mode STREAMS_DC TSRMLS_DC) { struct zip_file *zf = NULL; int err = 0; @@ -235,8 +235,8 @@ php_stream *php_stream_zip_open(char *filename, char *path, char *mode STREAMS_D /* {{{ php_stream_zip_opener */ php_stream *php_stream_zip_opener(php_stream_wrapper *wrapper, - char *path, - char *mode, + const char *path, + const char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) diff --git a/ext/zlib/php_zlib.h b/ext/zlib/php_zlib.h index 6b1d0cd80c..3e4b9381e7 100644 --- a/ext/zlib/php_zlib.h +++ b/ext/zlib/php_zlib.h @@ -58,7 +58,7 @@ ZEND_BEGIN_MODULE_GLOBALS(zlib) zend_bool handler_registered; ZEND_END_MODULE_GLOBALS(zlib); -php_stream *php_stream_gzopen(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC); +php_stream *php_stream_gzopen(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC); extern php_stream_ops php_stream_gzio_ops; extern php_stream_wrapper php_stream_gzip_wrapper; extern php_stream_filter_factory php_zlib_filter_factory; diff --git a/ext/zlib/tests/bug65391.phpt b/ext/zlib/tests/bug65391.phpt index 3ba5350810..439473fc5d 100644 --- a/ext/zlib/tests/bug65391.phpt +++ b/ext/zlib/tests/bug65391.phpt @@ -25,4 +25,3 @@ Array [2] => Vary: Accept-Encoding ) Done - 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/ext/zlib/zlib_fopen_wrapper.c b/ext/zlib/zlib_fopen_wrapper.c index 1b00eb8713..2fd9dc7766 100644 --- a/ext/zlib/zlib_fopen_wrapper.c +++ b/ext/zlib/zlib_fopen_wrapper.c @@ -106,7 +106,7 @@ php_stream_ops php_stream_gzio_ops = { NULL /* set_option */ }; -php_stream *php_stream_gzopen(php_stream_wrapper *wrapper, char *path, char *mode, int options, +php_stream *php_stream_gzopen(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) { struct php_gz_stream_data_t *self; diff --git a/main/SAPI.h b/main/SAPI.h index 92b7329dbc..6fc60c8865 100644 --- a/main/SAPI.h +++ b/main/SAPI.h @@ -27,6 +27,7 @@ #include "zend_operators.h" #ifdef PHP_WIN32 #include "win95nt.h" +#include "win32/php_stdint.h" #endif #include <sys/stat.h> @@ -82,7 +83,7 @@ typedef struct { char *post_data, *raw_post_data; char *cookie_data; long content_length; - uint post_data_length, raw_post_data_length; + int64_t post_data_length, raw_post_data_length; char *path_translated; char *request_uri; @@ -119,7 +120,7 @@ typedef struct _sapi_globals_struct { void *server_context; sapi_request_info request_info; sapi_headers_struct sapi_headers; - int read_post_bytes; + int64_t read_post_bytes; unsigned char headers_sent; struct stat global_stat; char *default_mimetype; diff --git a/main/fopen_wrappers.c b/main/fopen_wrappers.c index 6f11cf3f32..eb33ac7ba1 100644 --- a/main/fopen_wrappers.c +++ b/main/fopen_wrappers.c @@ -475,7 +475,7 @@ PHPAPI char *php_resolve_path(const char *filename, int filename_length, const c char resolved_path[MAXPATHLEN]; char trypath[MAXPATHLEN]; const char *ptr, *end, *p; - char *actual_path; + const char *actual_path; php_stream_wrapper *wrapper; if (!filename || CHECK_NULL_PATH(filename, filename_length)) { diff --git a/main/main.c b/main/main.c index 5942b23f72..2f56afa03a 100644 --- a/main/main.c +++ b/main/main.c @@ -1340,7 +1340,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 @@ -2192,7 +2192,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.h b/main/php.h index 7c1f8fd0c7..17ac8b4fd2 100644 --- a/main/php.h +++ b/main/php.h @@ -180,6 +180,8 @@ typedef unsigned int socklen_t; # endif #endif +#include "php_stdint.h" + #include "zend_hash.h" #include "zend_alloc.h" #include "zend_stack.h" diff --git a/main/php_stdint.h b/main/php_stdint.h new file mode 100644 index 0000000000..87edb0fde0 --- /dev/null +++ b/main/php_stdint.h @@ -0,0 +1,206 @@ +/* + +----------------------------------------------------------------------+ + | 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: Michael Wallner <mike@php.net> | + +----------------------------------------------------------------------+ +*/ + +#ifndef PHP_STDINT_H +#define PHP_STDINT_H + +#if defined(_MSC_VER) +/* Make sure the regular stdint.h wasn't included already and prevent it to be + included afterwards. Though if some other library needs some stuff from + stdint.h included afterwards and misses it, we'd have to extend ours. On + the other hand, if stdint.h was included before, some conflicts might + happen so we'd likewise have to fix ours. */ +# if !defined(_STDINT) +# define _STDINT +# include "win32/php_stdint.h" +# endif +# define HAVE_INT8_T 1 +# define HAVE_UINT8_T 1 +# define HAVE_INT16_T 1 +# define HAVE_UINT16_T 1 +# define HAVE_INT32_T 1 +# define HAVE_UINT32_T 1 +# define HAVE_INT64_T 1 +# define HAVE_UINT64_T 1 +#else + +#include "php_config.h" + +#if HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif + +#if HAVE_INTTYPES_H +# include <inttypes.h> +#endif + +#if HAVE_STDINT_H +# include <stdint.h> +#endif + +#ifndef HAVE_INT8_T +# ifdef HAVE_INT8 +typedef int8 int8_t; +# else +typedef signed char int8_t; +# endif +#endif + +#ifndef INT8_C +# define INT8_C(c) c +#endif + +#ifndef HAVE_UINT8_T +# ifdef HAVE_UINT8 +typedef uint8 uint8_t +# elif HAVE_U_INT8_T +typedef u_int8_t uint8_t; +# else +typedef unsigned char uint8_t; +# endif +#endif + +#ifndef UINT8_C +# define UINT8_C(c) c +#endif + +#ifndef HAVE_INT16_T +# ifdef HAVE_INT16 +typedef int16 int16_t; +# elif SIZEOF_SHORT >= 2 +typedef signed short int16_t; +# else +# error "No suitable 16bit integer type found" +# endif +#endif + +#ifndef INT16_C +# define INT16_C(c) c +#endif + +#ifndef HAVE_UINT16_T +# ifdef HAVE_UINT16 +typedef uint16 uint16_t +# elif HAVE_U_INT16_T +typedef u_int16_t uint16_t; +# elif SIZEOF_SHORT >= 2 +typedef unsigned short uint16_t; +# else +# error "No suitable 16bit integer type found" +# endif +#endif + +#ifndef UINT16_C +# define UINT16_C(c) c +#endif + +#ifndef HAVE_INT32_T +# ifdef HAVE_INT32 +typedef int32 int32_t; +# elif SIZEOF_INT >= 4 +typedef int int32_t; +# elif SIZEOF_LONG >= 4 +typedef long int32_t; +# else +# error "No suitable 32bit integer type found" +# endif +#endif + +#ifndef INT32_C +# define INT32_C(c) c +#endif + +#ifndef HAVE_UINT32_T +# ifdef HAVE_UINT32 +typedef uint32 uint32_t +# elif HAVE_U_INT32_T +typedef u_int32_t uint32_t; +# elif SIZEOF_INT >= 4 +typedef unsigned int uint32_t; +# elif SIZEOF_LONG >= 4 +typedef unsigned long uint32_t; +# else +# error "No suitable 32bit integer type found" +# endif +#endif + +#ifndef UINT32_C +# define UINT32_C(c) c ## U +#endif + +#ifndef HAVE_INT64_T +# ifdef HAVE_INT64 +typedef int64 int64_t; +# elif SIZEOF_INT >= 8 +typedef int int64_t; +# elif SIZEOF_LONG >= 8 +typedef long int64_t; +# elif SIZEOF_LONG_LONG >= 8 +typedef long long int64_t; +# else +# error "No suitable 64bit integer type found" +# endif +#endif + +#ifndef INT64_C +# if SIZEOF_INT >= 8 +# define INT64_C(c) c +# elif SIZEOF_LONG >= 8 +# define INT64_C(c) c ## L +# elif SIZEOF_LONG_LONG >= 8 +# define INT64_C(c) c ## LL +# endif +#endif + +#ifndef HAVE_UINT64_T +# ifdef HAVE_UINT64 +typedef uint64 uint64_t +# elif HAVE_U_INT64_T +typedef u_int64_t uint64_t; +# elif SIZEOF_INT >= 8 +typedef unsigned int uint64_t; +# elif SIZEOF_LONG >= 8 +typedef unsigned long uint64_t; +# elif SIZEOF_LONG_LONG >= 8 +typedef unsigned long long uint64_t; +# else +# error "No suitable 64bit integer type found" +# endif +#endif + +#ifndef UINT64_C +# if SIZEOF_INT >= 8 +# define UINT64_C(c) c ## U +# elif SIZEOF_LONG >= 8 +# define UINT64_C(c) c ## UL +# elif SIZEOF_LONG_LONG >= 8 +# define UINT64_C(c) c ## ULL +# endif +#endif + +#endif /* !PHP_WIN32 */ +#endif /* PHP_STDINT_H */ + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 fdm=marker + * vim<600: sw=4 ts=4 + */ diff --git a/main/php_streams.h b/main/php_streams.h index 5acf942e43..c56014c62e 100644 --- a/main/php_streams.h +++ b/main/php_streams.h @@ -131,31 +131,31 @@ typedef struct _php_stream_ops { typedef struct _php_stream_wrapper_ops { /* open/create a wrapped stream */ - php_stream *(*stream_opener)(php_stream_wrapper *wrapper, char *filename, char *mode, + php_stream *(*stream_opener)(php_stream_wrapper *wrapper, const char *filename, const char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC); /* close/destroy a wrapped stream */ int (*stream_closer)(php_stream_wrapper *wrapper, php_stream *stream TSRMLS_DC); /* stat a wrapped stream */ int (*stream_stat)(php_stream_wrapper *wrapper, php_stream *stream, php_stream_statbuf *ssb TSRMLS_DC); /* stat a URL */ - int (*url_stat)(php_stream_wrapper *wrapper, char *url, int flags, php_stream_statbuf *ssb, php_stream_context *context TSRMLS_DC); + int (*url_stat)(php_stream_wrapper *wrapper, const char *url, int flags, php_stream_statbuf *ssb, php_stream_context *context TSRMLS_DC); /* open a "directory" stream */ - php_stream *(*dir_opener)(php_stream_wrapper *wrapper, char *filename, char *mode, + php_stream *(*dir_opener)(php_stream_wrapper *wrapper, const char *filename, const char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC); const char *label; /* delete a file */ - int (*unlink)(php_stream_wrapper *wrapper, char *url, int options, php_stream_context *context TSRMLS_DC); + int (*unlink)(php_stream_wrapper *wrapper, const char *url, int options, php_stream_context *context TSRMLS_DC); /* rename a file */ - int (*rename)(php_stream_wrapper *wrapper, char *url_from, char *url_to, int options, php_stream_context *context TSRMLS_DC); + int (*rename)(php_stream_wrapper *wrapper, const char *url_from, const char *url_to, int options, php_stream_context *context TSRMLS_DC); /* Create/Remove directory */ - int (*stream_mkdir)(php_stream_wrapper *wrapper, char *url, int mode, int options, php_stream_context *context TSRMLS_DC); - int (*stream_rmdir)(php_stream_wrapper *wrapper, char *url, int options, php_stream_context *context TSRMLS_DC); + int (*stream_mkdir)(php_stream_wrapper *wrapper, const char *url, int mode, int options, php_stream_context *context TSRMLS_DC); + int (*stream_rmdir)(php_stream_wrapper *wrapper, const char *url, int options, php_stream_context *context TSRMLS_DC); /* Metadata handling */ - int (*stream_metadata)(php_stream_wrapper *wrapper, char *url, int options, void *value, php_stream_context *context TSRMLS_DC); + int (*stream_metadata)(php_stream_wrapper *wrapper, const char *url, int options, void *value, php_stream_context *context TSRMLS_DC); } php_stream_wrapper_ops; struct _php_stream_wrapper { @@ -322,26 +322,26 @@ PHPAPI char *_php_stream_get_line(php_stream *stream, char *buf, size_t maxlen, #define php_stream_gets(stream, buf, maxlen) _php_stream_get_line((stream), (buf), (maxlen), NULL TSRMLS_CC) #define php_stream_get_line(stream, buf, maxlen, retlen) _php_stream_get_line((stream), (buf), (maxlen), (retlen) TSRMLS_CC) -PHPAPI char *php_stream_get_record(php_stream *stream, size_t maxlen, size_t *returned_len, char *delim, size_t delim_len TSRMLS_DC); +PHPAPI char *php_stream_get_record(php_stream *stream, size_t maxlen, size_t *returned_len, const char *delim, size_t delim_len TSRMLS_DC); /* CAREFUL! this is equivalent to puts NOT fputs! */ -PHPAPI int _php_stream_puts(php_stream *stream, char *buf TSRMLS_DC); +PHPAPI int _php_stream_puts(php_stream *stream, const char *buf TSRMLS_DC); #define php_stream_puts(stream, buf) _php_stream_puts((stream), (buf) TSRMLS_CC) PHPAPI int _php_stream_stat(php_stream *stream, php_stream_statbuf *ssb TSRMLS_DC); #define php_stream_stat(stream, ssb) _php_stream_stat((stream), (ssb) TSRMLS_CC) -PHPAPI int _php_stream_stat_path(char *path, int flags, php_stream_statbuf *ssb, php_stream_context *context TSRMLS_DC); +PHPAPI int _php_stream_stat_path(const char *path, int flags, php_stream_statbuf *ssb, php_stream_context *context TSRMLS_DC); #define php_stream_stat_path(path, ssb) _php_stream_stat_path((path), 0, (ssb), NULL TSRMLS_CC) #define php_stream_stat_path_ex(path, flags, ssb, context) _php_stream_stat_path((path), (flags), (ssb), (context) TSRMLS_CC) -PHPAPI int _php_stream_mkdir(char *path, int mode, int options, php_stream_context *context TSRMLS_DC); +PHPAPI int _php_stream_mkdir(const char *path, int mode, int options, php_stream_context *context TSRMLS_DC); #define php_stream_mkdir(path, mode, options, context) _php_stream_mkdir(path, mode, options, context TSRMLS_CC) -PHPAPI int _php_stream_rmdir(char *path, int options, php_stream_context *context TSRMLS_DC); +PHPAPI int _php_stream_rmdir(const char *path, int options, php_stream_context *context TSRMLS_DC); #define php_stream_rmdir(path, options, context) _php_stream_rmdir(path, options, context TSRMLS_CC) -PHPAPI php_stream *_php_stream_opendir(char *path, int options, php_stream_context *context STREAMS_DC TSRMLS_DC); +PHPAPI php_stream *_php_stream_opendir(const char *path, int options, php_stream_context *context STREAMS_DC TSRMLS_DC); #define php_stream_opendir(path, options, context) _php_stream_opendir((path), (options), (context) STREAMS_CC TSRMLS_CC) PHPAPI php_stream_dirent *_php_stream_readdir(php_stream *dirstream, php_stream_dirent *ent TSRMLS_DC); #define php_stream_readdir(dirstream, dirent) _php_stream_readdir((dirstream), (dirent) TSRMLS_CC) @@ -351,7 +351,7 @@ PHPAPI php_stream_dirent *_php_stream_readdir(php_stream *dirstream, php_stream_ PHPAPI int php_stream_dirent_alphasort(const char **a, const char **b); PHPAPI int php_stream_dirent_alphasortr(const char **a, const char **b); -PHPAPI int _php_stream_scandir(char *dirname, char **namelist[], int flags, php_stream_context *context, +PHPAPI int _php_stream_scandir(const char *dirname, char **namelist[], int flags, php_stream_context *context, int (*compare) (const char **a, const char **b) TSRMLS_DC); #define php_stream_scandir(dirname, namelist, context, compare) _php_stream_scandir((dirname), (namelist), 0, (context), (compare) TSRMLS_CC) @@ -540,13 +540,13 @@ void php_shutdown_stream_hashes(TSRMLS_D); PHP_RSHUTDOWN_FUNCTION(streams); BEGIN_EXTERN_C() -PHPAPI int php_register_url_stream_wrapper(char *protocol, php_stream_wrapper *wrapper TSRMLS_DC); -PHPAPI int php_unregister_url_stream_wrapper(char *protocol TSRMLS_DC); -PHPAPI int php_register_url_stream_wrapper_volatile(char *protocol, php_stream_wrapper *wrapper TSRMLS_DC); -PHPAPI int php_unregister_url_stream_wrapper_volatile(char *protocol TSRMLS_DC); -PHPAPI php_stream *_php_stream_open_wrapper_ex(char *path, char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC); -PHPAPI php_stream_wrapper *php_stream_locate_url_wrapper(const char *path, char **path_for_open, int options TSRMLS_DC); -PHPAPI char *php_stream_locate_eol(php_stream *stream, char *buf, size_t buf_len TSRMLS_DC); +PHPAPI int php_register_url_stream_wrapper(const char *protocol, php_stream_wrapper *wrapper TSRMLS_DC); +PHPAPI int php_unregister_url_stream_wrapper(const char *protocol TSRMLS_DC); +PHPAPI int php_register_url_stream_wrapper_volatile(const char *protocol, php_stream_wrapper *wrapper TSRMLS_DC); +PHPAPI int php_unregister_url_stream_wrapper_volatile(const char *protocol TSRMLS_DC); +PHPAPI php_stream *_php_stream_open_wrapper_ex(const char *path, const char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC); +PHPAPI php_stream_wrapper *php_stream_locate_url_wrapper(const char *path, const char **path_for_open, int options TSRMLS_DC); +PHPAPI const char *php_stream_locate_eol(php_stream *stream, const char *buf, size_t buf_len TSRMLS_DC); #define php_stream_open_wrapper(path, mode, options, opened) _php_stream_open_wrapper_ex((path), (mode), (options), (opened), NULL STREAMS_CC TSRMLS_CC) #define php_stream_open_wrapper_ex(path, mode, options, opened, context) _php_stream_open_wrapper_ex((path), (mode), (options), (opened), (context) STREAMS_CC TSRMLS_CC) diff --git a/main/php_version.h b/main/php_version.h index d9ea4aab3c..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 5 +#define PHP_MINOR_VERSION 6 +#define PHP_RELEASE_VERSION 0 #define PHP_EXTRA_VERSION "-dev" -#define PHP_VERSION "5.5.5-dev" -#define PHP_VERSION_ID 50505 +#define PHP_VERSION "5.6.0-dev" +#define PHP_VERSION_ID 50600 diff --git a/main/rfc1867.c b/main/rfc1867.c index 7c208c368c..4adc25767d 100644 --- a/main/rfc1867.c +++ b/main/rfc1867.c @@ -34,6 +34,10 @@ #include "rfc1867.h" #include "ext/standard/php_string.h" +#if defined(PHP_WIN32) && !defined(HAVE_ATOLL) +# define atoll(s) _atoi64(s) +#endif + #define DEBUG_FILE_UPLOAD ZEND_DEBUG static int dummy_encoding_translation(TSRMLS_D) @@ -676,8 +680,9 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) /* {{{ */ { char *boundary, *s = NULL, *boundary_end = NULL, *start_arr = NULL, *array_index = NULL; char *temp_filename = NULL, *lbuf = NULL, *abuf = NULL; - int boundary_len = 0, total_bytes = 0, cancel_upload = 0, is_arr_upload = 0, array_len = 0; - int max_file_size = 0, skip_upload = 0, anonindex = 0, is_anonymous; + int boundary_len = 0, cancel_upload = 0, is_arr_upload = 0, array_len = 0; + int64_t total_bytes = 0, max_file_size = 0; + int skip_upload = 0, anonindex = 0, is_anonymous; zval *http_post_files = NULL; HashTable *uploaded_files = NULL; multipart_buffer *mbuff; @@ -898,7 +903,7 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) /* {{{ */ } if (!strcasecmp(param, "MAX_FILE_SIZE")) { - max_file_size = atol(value); + max_file_size = atoll(value); } efree(param); @@ -1210,17 +1215,32 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) /* {{{ */ { zval file_size, error_type; + int size_overflow = 0; + char file_size_buf[65]; - error_type.value.lval = cancel_upload; - error_type.type = IS_LONG; + ZVAL_LONG(&error_type, cancel_upload); /* Add $foo[error] */ if (cancel_upload) { - file_size.value.lval = 0; - file_size.type = IS_LONG; + ZVAL_LONG(&file_size, 0); } else { - file_size.value.lval = total_bytes; - file_size.type = IS_LONG; + if (total_bytes > LONG_MAX) { +#ifdef PHP_WIN32 + if (_i64toa_s(total_bytes, file_size_buf, 65, 10)) { + file_size_buf[0] = '0'; + file_size_buf[1] = '\0'; + } +#else + { + int __len = snprintf(file_size_buf, 65, "%lld", total_bytes); + file_size_buf[__len] = '\0'; + } +#endif + size_overflow = 1; + + } else { + ZVAL_LONG(&file_size, total_bytes); + } } if (is_arr_upload) { @@ -1237,7 +1257,10 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) /* {{{ */ snprintf(lbuf, llen, "%s_size", param); } if (!is_anonymous) { - safe_php_register_variable_ex(lbuf, &file_size, NULL, 0 TSRMLS_CC); + if (size_overflow) { + ZVAL_STRING(&file_size, file_size_buf, 1); + } + safe_php_register_variable_ex(lbuf, &file_size, NULL, size_overflow TSRMLS_CC); } /* Add $foo[size] */ @@ -1246,7 +1269,10 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler) /* {{{ */ } else { snprintf(lbuf, llen, "%s[size]", param); } - register_http_post_files_variable_ex(lbuf, &file_size, http_post_files, 0 TSRMLS_CC); + if (size_overflow) { + ZVAL_STRING(&file_size, file_size_buf, 1); + } + register_http_post_files_variable_ex(lbuf, &file_size, http_post_files, size_overflow TSRMLS_CC); } efree(param); } diff --git a/main/streams/glob_wrapper.c b/main/streams/glob_wrapper.c index 9c051a5921..8c3836fea0 100644 --- a/main/streams/glob_wrapper.c +++ b/main/streams/glob_wrapper.c @@ -109,9 +109,9 @@ PHPAPI int _php_glob_stream_get_count(php_stream *stream, int *pflags STREAMS_DC } /* }}} */ -static void php_glob_stream_path_split(glob_s_t *pglob, char *path, int get_path, char **p_file TSRMLS_DC) /* {{{ */ +static void php_glob_stream_path_split(glob_s_t *pglob, const char *path, int get_path, const char **p_file TSRMLS_DC) /* {{{ */ { - char *pos, *gpath = path; + const char *pos, *gpath = path; if ((pos = strrchr(path, '/')) != NULL) { path = pos+1; @@ -141,7 +141,7 @@ static size_t php_glob_stream_read(php_stream *stream, char *buf, size_t count T { glob_s_t *pglob = (glob_s_t *)stream->abstract; php_stream_dirent *ent = (php_stream_dirent*)buf; - char *path; + const char *path; /* avoid problems if someone mis-uses the stream */ if (count == sizeof(php_stream_dirent) && pglob) { @@ -206,12 +206,12 @@ php_stream_ops php_glob_stream_ops = { }; /* {{{ php_glob_stream_opener */ -static php_stream *php_glob_stream_opener(php_stream_wrapper *wrapper, char *path, char *mode, +static php_stream *php_glob_stream_opener(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) { glob_s_t *pglob; int ret; - char *tmp, *pos; + const char *tmp, *pos; if (((options & STREAM_DISABLE_OPEN_BASEDIR) == 0) && php_check_open_basedir(path TSRMLS_CC)) { return NULL; diff --git a/main/streams/memory.c b/main/streams/memory.c index 328d3be399..90780ea78f 100644 --- a/main/streams/memory.c +++ b/main/streams/memory.c @@ -598,7 +598,9 @@ PHPAPI php_stream_ops php_stream_rfc2397_ops = { php_stream_temp_set_option }; -static php_stream * php_stream_url_wrap_rfc2397(php_stream_wrapper *wrapper, char *path, char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) /* {{{ */ +static php_stream * php_stream_url_wrap_rfc2397(php_stream_wrapper *wrapper, const char *path, + const char *mode, int options, char **opened_path, + php_stream_context *context STREAMS_DC TSRMLS_DC) /* {{{ */ { php_stream *stream; php_stream_temp_data *ts; @@ -640,11 +642,11 @@ static php_stream * php_stream_url_wrap_rfc2397(php_stream_wrapper *wrapper, cha MAKE_STD_ZVAL(meta); array_init(meta); if (!semi) { /* there is only a mime type */ - add_assoc_stringl(meta, "mediatype", path, mlen, 1); + add_assoc_stringl(meta, "mediatype", (char *) path, mlen, 1); mlen = 0; } else if (sep && sep < semi) { /* there is a mime type */ plen = semi - path; - add_assoc_stringl(meta, "mediatype", path, plen, 1); + add_assoc_stringl(meta, "mediatype", (char *) path, plen, 1); mlen -= plen; path += plen; } else if (semi != path || mlen != sizeof(";base64")-1 || memcmp(path, ";base64", sizeof(";base64")-1)) { /* must be error since parameters are only allowed after mediatype */ diff --git a/main/streams/php_stream_plain_wrapper.h b/main/streams/php_stream_plain_wrapper.h index d88b30c479..6700df0b29 100644 --- a/main/streams/php_stream_plain_wrapper.h +++ b/main/streams/php_stream_plain_wrapper.h @@ -30,7 +30,7 @@ BEGIN_EXTERN_C() PHPAPI php_stream *_php_stream_fopen(const char *filename, const char *mode, char **opened_path, int options STREAMS_DC TSRMLS_DC); #define php_stream_fopen(filename, mode, opened) _php_stream_fopen((filename), (mode), (opened), 0 STREAMS_CC TSRMLS_CC) -PHPAPI php_stream *_php_stream_fopen_with_path(char *filename, char *mode, char *path, char **opened_path, int options STREAMS_DC TSRMLS_DC); +PHPAPI php_stream *_php_stream_fopen_with_path(const char *filename, const char *mode, const char *path, char **opened_path, int options STREAMS_DC TSRMLS_DC); #define php_stream_fopen_with_path(filename, mode, path, opened) _php_stream_fopen_with_path((filename), (mode), (path), (opened), 0 STREAMS_CC TSRMLS_CC) PHPAPI php_stream *_php_stream_fopen_from_file(FILE *file, const char *mode STREAMS_DC TSRMLS_DC); diff --git a/main/streams/php_stream_transport.h b/main/streams/php_stream_transport.h index c2d911032e..52df73d731 100644 --- a/main/streams/php_stream_transport.h +++ b/main/streams/php_stream_transport.h @@ -26,16 +26,16 @@ # include <sys/socket.h> #endif -typedef php_stream *(php_stream_transport_factory_func)(const char *proto, long protolen, - char *resourcename, long resourcenamelen, +typedef php_stream *(php_stream_transport_factory_func)(const char *proto, size_t protolen, + const char *resourcename, size_t resourcenamelen, const char *persistent_id, int options, int flags, struct timeval *timeout, php_stream_context *context STREAMS_DC TSRMLS_DC); typedef php_stream_transport_factory_func *php_stream_transport_factory; BEGIN_EXTERN_C() -PHPAPI int php_stream_xport_register(char *protocol, php_stream_transport_factory factory TSRMLS_DC); -PHPAPI int php_stream_xport_unregister(char *protocol TSRMLS_DC); +PHPAPI int php_stream_xport_register(const char *protocol, php_stream_transport_factory factory TSRMLS_DC); +PHPAPI int php_stream_xport_unregister(const char *protocol TSRMLS_DC); #define STREAM_XPORT_CLIENT 0 #define STREAM_XPORT_SERVER 1 @@ -46,7 +46,7 @@ PHPAPI int php_stream_xport_unregister(char *protocol TSRMLS_DC); #define STREAM_XPORT_CONNECT_ASYNC 16 /* Open a client or server socket connection */ -PHPAPI php_stream *_php_stream_xport_create(const char *name, long namelen, int options, +PHPAPI php_stream *_php_stream_xport_create(const char *name, size_t namelen, int options, int flags, const char *persistent_id, struct timeval *timeout, php_stream_context *context, @@ -59,13 +59,13 @@ PHPAPI php_stream *_php_stream_xport_create(const char *name, long namelen, int /* Bind the stream to a local address */ PHPAPI int php_stream_xport_bind(php_stream *stream, - const char *name, long namelen, + const char *name, size_t namelen, char **error_text TSRMLS_DC); /* Connect to a remote address */ PHPAPI int php_stream_xport_connect(php_stream *stream, - const char *name, long namelen, + const char *name, size_t namelen, int asynchronous, struct timeval *timeout, char **error_text, @@ -141,7 +141,7 @@ typedef struct _php_stream_xport_param { struct { char *name; - long namelen; + size_t namelen; int backlog; struct timeval *timeout; struct sockaddr *addr; diff --git a/main/streams/plain_wrapper.c b/main/streams/plain_wrapper.c index 39df31a170..949b827679 100644 --- a/main/streams/plain_wrapper.c +++ b/main/streams/plain_wrapper.c @@ -851,7 +851,7 @@ static php_stream_ops php_plain_files_dirstream_ops = { NULL /* set_option */ }; -static php_stream *php_plain_files_dir_opener(php_stream_wrapper *wrapper, char *path, char *mode, +static php_stream *php_plain_files_dir_opener(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) { DIR *dir = NULL; @@ -989,7 +989,7 @@ PHPAPI php_stream *_php_stream_fopen(const char *filename, const char *mode, cha /* }}} */ -static php_stream *php_plain_files_stream_opener(php_stream_wrapper *wrapper, char *path, char *mode, +static php_stream *php_plain_files_stream_opener(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) { if (((options & STREAM_DISABLE_OPEN_BASEDIR) == 0) && php_check_open_basedir(path TSRMLS_CC)) { @@ -999,7 +999,7 @@ static php_stream *php_plain_files_stream_opener(php_stream_wrapper *wrapper, ch return php_stream_fopen_rel(path, mode, opened_path, options); } -static int php_plain_files_url_stater(php_stream_wrapper *wrapper, char *url, int flags, php_stream_statbuf *ssb, php_stream_context *context TSRMLS_DC) +static int php_plain_files_url_stater(php_stream_wrapper *wrapper, const char *url, int flags, php_stream_statbuf *ssb, php_stream_context *context TSRMLS_DC) { char *p; @@ -1029,7 +1029,7 @@ static int php_plain_files_url_stater(php_stream_wrapper *wrapper, char *url, in return VCWD_STAT(url, &ssb->sb); } -static int php_plain_files_unlink(php_stream_wrapper *wrapper, char *url, int options, php_stream_context *context TSRMLS_DC) +static int php_plain_files_unlink(php_stream_wrapper *wrapper, const char *url, int options, php_stream_context *context TSRMLS_DC) { char *p; int ret; @@ -1058,7 +1058,7 @@ static int php_plain_files_unlink(php_stream_wrapper *wrapper, char *url, int op return 1; } -static int php_plain_files_rename(php_stream_wrapper *wrapper, char *url_from, char *url_to, int options, php_stream_context *context TSRMLS_DC) +static int php_plain_files_rename(php_stream_wrapper *wrapper, const char *url_from, const char *url_to, int options, php_stream_context *context TSRMLS_DC) { char *p; int ret; @@ -1147,7 +1147,7 @@ static int php_plain_files_rename(php_stream_wrapper *wrapper, char *url_from, c return 1; } -static int php_plain_files_mkdir(php_stream_wrapper *wrapper, char *dir, int mode, int options, php_stream_context *context TSRMLS_DC) +static int php_plain_files_mkdir(php_stream_wrapper *wrapper, const char *dir, int mode, int options, php_stream_context *context TSRMLS_DC) { int ret, recursive = options & PHP_STREAM_MKDIR_RECURSIVE; char *p; @@ -1235,7 +1235,7 @@ static int php_plain_files_mkdir(php_stream_wrapper *wrapper, char *dir, int mod } } -static int php_plain_files_rmdir(php_stream_wrapper *wrapper, char *url, int options, php_stream_context *context TSRMLS_DC) +static int php_plain_files_rmdir(php_stream_wrapper *wrapper, const char *url, int options, php_stream_context *context TSRMLS_DC) { #if PHP_WIN32 int url_len = strlen(url); @@ -1262,7 +1262,7 @@ static int php_plain_files_rmdir(php_stream_wrapper *wrapper, char *url, int opt return 1; } -static int php_plain_files_metadata(php_stream_wrapper *wrapper, char *url, int option, void *value, php_stream_context *context TSRMLS_DC) +static int php_plain_files_metadata(php_stream_wrapper *wrapper, const char *url, int option, void *value, php_stream_context *context TSRMLS_DC) { struct utimbuf *newtime; char *p; @@ -1371,10 +1371,11 @@ php_stream_wrapper php_plain_files_wrapper = { }; /* {{{ php_stream_fopen_with_path */ -PHPAPI php_stream *_php_stream_fopen_with_path(char *filename, char *mode, char *path, char **opened_path, int options STREAMS_DC TSRMLS_DC) +PHPAPI php_stream *_php_stream_fopen_with_path(const char *filename, const char *mode, const char *path, char **opened_path, int options STREAMS_DC TSRMLS_DC) { /* code ripped off from fopen_wrappers.c */ - char *pathbuf, *ptr, *end; + char *pathbuf, *end; + const char *ptr; const char *exec_fname; char trypath[MAXPATHLEN]; php_stream *stream; diff --git a/main/streams/streams.c b/main/streams/streams.c index 823b8859bf..d74f9fd04a 100644 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -803,7 +803,7 @@ PHPAPI int _php_stream_getc(php_stream *stream TSRMLS_DC) return EOF; } -PHPAPI int _php_stream_puts(php_stream *stream, char *buf TSRMLS_DC) +PHPAPI int _php_stream_puts(php_stream *stream, const char *buf TSRMLS_DC) { int len; char newline[2] = "\n"; /* is this OK for Win? */ @@ -835,11 +835,11 @@ PHPAPI int _php_stream_stat(php_stream *stream, php_stream_statbuf *ssb TSRMLS_D return (stream->ops->stat)(stream, ssb TSRMLS_CC); } -PHPAPI char *php_stream_locate_eol(php_stream *stream, char *buf, size_t buf_len TSRMLS_DC) +PHPAPI const char *php_stream_locate_eol(php_stream *stream, const char *buf, size_t buf_len TSRMLS_DC) { size_t avail; - char *cr, *lf, *eol = NULL; - char *readptr; + const char *cr, *lf, *eol = NULL; + const char *readptr; if (!buf) { readptr = stream->readbuf + stream->readpos; @@ -911,7 +911,7 @@ PHPAPI char *_php_stream_get_line(php_stream *stream, char *buf, size_t maxlen, if (avail > 0) { size_t cpysz = 0; char *readptr; - char *eol; + const char *eol; int done = 0; readptr = stream->readbuf + stream->readpos; @@ -994,11 +994,11 @@ PHPAPI char *_php_stream_get_line(php_stream *stream, char *buf, size_t maxlen, #define STREAM_BUFFERED_AMOUNT(stream) \ ((size_t)(((stream)->writepos) - (stream)->readpos)) -static char *_php_stream_search_delim(php_stream *stream, - size_t maxlen, - size_t skiplen, - char *delim, /* non-empty! */ - size_t delim_len TSRMLS_DC) +static const char *_php_stream_search_delim(php_stream *stream, + size_t maxlen, + size_t skiplen, + const char *delim, /* non-empty! */ + size_t delim_len TSRMLS_DC) { size_t seek_len; @@ -1018,10 +1018,10 @@ static char *_php_stream_search_delim(php_stream *stream, } } -PHPAPI char *php_stream_get_record(php_stream *stream, size_t maxlen, size_t *returned_len, char *delim, size_t delim_len TSRMLS_DC) +PHPAPI char *php_stream_get_record(php_stream *stream, size_t maxlen, size_t *returned_len, const char *delim, size_t delim_len TSRMLS_DC) { - char *ret_buf, /* returned buffer */ - *found_delim = NULL; + char *ret_buf; /* returned buffer */ + const char *found_delim = NULL; size_t buffered_len, tent_ret_len; /* tentative returned length */ int has_delim = delim_len > 0; @@ -1676,9 +1676,9 @@ int php_shutdown_stream_wrappers(int module_number TSRMLS_DC) /* Validate protocol scheme names during registration * Must conform to /^[a-zA-Z0-9+.-]+$/ */ -static inline int php_stream_wrapper_scheme_validate(char *protocol, int protocol_len) +static inline int php_stream_wrapper_scheme_validate(const char *protocol, unsigned int protocol_len) { - int i; + unsigned int i; for(i = 0; i < protocol_len; i++) { if (!isalnum((int)protocol[i]) && @@ -1693,9 +1693,9 @@ static inline int php_stream_wrapper_scheme_validate(char *protocol, int protoco } /* API for registering GLOBAL wrappers */ -PHPAPI int php_register_url_stream_wrapper(char *protocol, php_stream_wrapper *wrapper TSRMLS_DC) +PHPAPI int php_register_url_stream_wrapper(const char *protocol, php_stream_wrapper *wrapper TSRMLS_DC) { - int protocol_len = strlen(protocol); + unsigned int protocol_len = strlen(protocol); if (php_stream_wrapper_scheme_validate(protocol, protocol_len) == FAILURE) { return FAILURE; @@ -1704,7 +1704,7 @@ PHPAPI int php_register_url_stream_wrapper(char *protocol, php_stream_wrapper *w return zend_hash_add(&url_stream_wrappers_hash, protocol, protocol_len + 1, &wrapper, sizeof(wrapper), NULL); } -PHPAPI int php_unregister_url_stream_wrapper(char *protocol TSRMLS_DC) +PHPAPI int php_unregister_url_stream_wrapper(const char *protocol TSRMLS_DC) { return zend_hash_del(&url_stream_wrappers_hash, protocol, strlen(protocol) + 1); } @@ -1719,9 +1719,9 @@ static void clone_wrapper_hash(TSRMLS_D) } /* API for registering VOLATILE wrappers */ -PHPAPI int php_register_url_stream_wrapper_volatile(char *protocol, php_stream_wrapper *wrapper TSRMLS_DC) +PHPAPI int php_register_url_stream_wrapper_volatile(const char *protocol, php_stream_wrapper *wrapper TSRMLS_DC) { - int protocol_len = strlen(protocol); + unsigned int protocol_len = strlen(protocol); if (php_stream_wrapper_scheme_validate(protocol, protocol_len) == FAILURE) { return FAILURE; @@ -1734,7 +1734,7 @@ PHPAPI int php_register_url_stream_wrapper_volatile(char *protocol, php_stream_w return zend_hash_add(FG(stream_wrappers), protocol, protocol_len + 1, &wrapper, sizeof(wrapper), NULL); } -PHPAPI int php_unregister_url_stream_wrapper_volatile(char *protocol TSRMLS_DC) +PHPAPI int php_unregister_url_stream_wrapper_volatile(const char *protocol TSRMLS_DC) { if (!FG(stream_wrappers)) { clone_wrapper_hash(TSRMLS_C); @@ -1745,7 +1745,7 @@ PHPAPI int php_unregister_url_stream_wrapper_volatile(char *protocol TSRMLS_DC) /* }}} */ /* {{{ php_stream_locate_url_wrapper */ -PHPAPI php_stream_wrapper *php_stream_locate_url_wrapper(const char *path, char **path_for_open, int options TSRMLS_DC) +PHPAPI php_stream_wrapper *php_stream_locate_url_wrapper(const char *path, const char **path_for_open, int options TSRMLS_DC) { HashTable *wrapper_hash = (FG(stream_wrappers) ? FG(stream_wrappers) : &url_stream_wrappers_hash); php_stream_wrapper **wrapperpp = NULL; @@ -1880,7 +1880,7 @@ PHPAPI php_stream_wrapper *php_stream_locate_url_wrapper(const char *path, char /* {{{ _php_stream_mkdir */ -PHPAPI int _php_stream_mkdir(char *path, int mode, int options, php_stream_context *context TSRMLS_DC) +PHPAPI int _php_stream_mkdir(const char *path, int mode, int options, php_stream_context *context TSRMLS_DC) { php_stream_wrapper *wrapper = NULL; @@ -1895,7 +1895,7 @@ PHPAPI int _php_stream_mkdir(char *path, int mode, int options, php_stream_conte /* {{{ _php_stream_rmdir */ -PHPAPI int _php_stream_rmdir(char *path, int options, php_stream_context *context TSRMLS_DC) +PHPAPI int _php_stream_rmdir(const char *path, int options, php_stream_context *context TSRMLS_DC) { php_stream_wrapper *wrapper = NULL; @@ -1909,10 +1909,10 @@ PHPAPI int _php_stream_rmdir(char *path, int options, php_stream_context *contex /* }}} */ /* {{{ _php_stream_stat_path */ -PHPAPI int _php_stream_stat_path(char *path, int flags, php_stream_statbuf *ssb, php_stream_context *context TSRMLS_DC) +PHPAPI int _php_stream_stat_path(const char *path, int flags, php_stream_statbuf *ssb, php_stream_context *context TSRMLS_DC) { php_stream_wrapper *wrapper = NULL; - char *path_to_open = path; + const char *path_to_open = path; int ret; /* Try to hit the cache first */ @@ -1954,12 +1954,12 @@ PHPAPI int _php_stream_stat_path(char *path, int flags, php_stream_statbuf *ssb, /* }}} */ /* {{{ php_stream_opendir */ -PHPAPI php_stream *_php_stream_opendir(char *path, int options, +PHPAPI php_stream *_php_stream_opendir(const char *path, int options, php_stream_context *context STREAMS_DC TSRMLS_DC) { php_stream *stream = NULL; php_stream_wrapper *wrapper = NULL; - char *path_to_open; + const char *path_to_open; if (!path || !*path) { return NULL; @@ -2003,12 +2003,12 @@ PHPAPI php_stream_dirent *_php_stream_readdir(php_stream *dirstream, php_stream_ /* }}} */ /* {{{ php_stream_open_wrapper_ex */ -PHPAPI php_stream *_php_stream_open_wrapper_ex(char *path, char *mode, int options, +PHPAPI php_stream *_php_stream_open_wrapper_ex(const char *path, const char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) { php_stream *stream = NULL; php_stream_wrapper *wrapper = NULL; - char *path_to_open; + const char *path_to_open; int persistent = options & STREAM_OPEN_PERSISTENT; char *resolved_path = NULL; char *copy_of_path = NULL; @@ -2264,7 +2264,7 @@ PHPAPI int php_stream_dirent_alphasortr(const char **a, const char **b) /* {{{ php_stream_scandir */ -PHPAPI int _php_stream_scandir(char *dirname, char **namelist[], int flags, php_stream_context *context, +PHPAPI int _php_stream_scandir(const char *dirname, char **namelist[], int flags, php_stream_context *context, int (*compare) (const char **a, const char **b) TSRMLS_DC) { php_stream *stream; diff --git a/main/streams/transports.c b/main/streams/transports.c index c24bf97ce6..2d31074ded 100644 --- a/main/streams/transports.c +++ b/main/streams/transports.c @@ -29,12 +29,12 @@ PHPAPI HashTable *php_stream_xport_get_hash(void) return &xport_hash; } -PHPAPI int php_stream_xport_register(char *protocol, php_stream_transport_factory factory TSRMLS_DC) +PHPAPI int php_stream_xport_register(const char *protocol, php_stream_transport_factory factory TSRMLS_DC) { return zend_hash_update(&xport_hash, protocol, strlen(protocol) + 1, &factory, sizeof(factory), NULL); } -PHPAPI int php_stream_xport_unregister(char *protocol TSRMLS_DC) +PHPAPI int php_stream_xport_unregister(const char *protocol TSRMLS_DC) { return zend_hash_del(&xport_hash, protocol, strlen(protocol) + 1); } @@ -49,7 +49,7 @@ PHPAPI int php_stream_xport_unregister(char *protocol TSRMLS_DC) if (local_err) { efree(local_err); local_err = NULL; } \ } -PHPAPI php_stream *_php_stream_xport_create(const char *name, long namelen, int options, +PHPAPI php_stream *_php_stream_xport_create(const char *name, size_t namelen, int options, int flags, const char *persistent_id, struct timeval *timeout, php_stream_context *context, @@ -194,7 +194,7 @@ PHPAPI php_stream *_php_stream_xport_create(const char *name, long namelen, int /* Bind the stream to a local address */ PHPAPI int php_stream_xport_bind(php_stream *stream, - const char *name, long namelen, + const char *name, size_t namelen, char **error_text TSRMLS_DC) { @@ -222,7 +222,7 @@ PHPAPI int php_stream_xport_bind(php_stream *stream, /* Connect to a remote address */ PHPAPI int php_stream_xport_connect(php_stream *stream, - const char *name, long namelen, + const char *name, size_t namelen, int asynchronous, struct timeval *timeout, char **error_text, diff --git a/main/streams/userspace.c b/main/streams/userspace.c index 69edbaafa9..1e626e4b4c 100644 --- a/main/streams/userspace.c +++ b/main/streams/userspace.c @@ -45,14 +45,14 @@ struct php_user_stream_wrapper { php_stream_wrapper wrapper; }; -static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, char *filename, char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC); -static int user_wrapper_stat_url(php_stream_wrapper *wrapper, char *url, int flags, php_stream_statbuf *ssb, php_stream_context *context TSRMLS_DC); -static int user_wrapper_unlink(php_stream_wrapper *wrapper, char *url, int options, php_stream_context *context TSRMLS_DC); -static int user_wrapper_rename(php_stream_wrapper *wrapper, char *url_from, char *url_to, int options, php_stream_context *context TSRMLS_DC); -static int user_wrapper_mkdir(php_stream_wrapper *wrapper, char *url, int mode, int options, php_stream_context *context TSRMLS_DC); -static int user_wrapper_rmdir(php_stream_wrapper *wrapper, char *url, int options, php_stream_context *context TSRMLS_DC); -static int user_wrapper_metadata(php_stream_wrapper *wrapper, char *url, int option, void *value, php_stream_context *context TSRMLS_DC); -static php_stream *user_wrapper_opendir(php_stream_wrapper *wrapper, char *filename, char *mode, +static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, const char *filename, const char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC); +static int user_wrapper_stat_url(php_stream_wrapper *wrapper, const char *url, int flags, php_stream_statbuf *ssb, php_stream_context *context TSRMLS_DC); +static int user_wrapper_unlink(php_stream_wrapper *wrapper, const char *url, int options, php_stream_context *context TSRMLS_DC); +static int user_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from, const char *url_to, int options, php_stream_context *context TSRMLS_DC); +static int user_wrapper_mkdir(php_stream_wrapper *wrapper, const char *url, int mode, int options, php_stream_context *context TSRMLS_DC); +static int user_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options, php_stream_context *context TSRMLS_DC); +static int user_wrapper_metadata(php_stream_wrapper *wrapper, const char *url, int option, void *value, php_stream_context *context TSRMLS_DC); +static php_stream *user_wrapper_opendir(php_stream_wrapper *wrapper, const char *filename, const char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC); static php_stream_wrapper_ops user_stream_wops = { @@ -332,7 +332,8 @@ static zval *user_stream_create_object(struct php_user_stream_wrapper *uwrap, ph return object; } -static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, char *filename, char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) +static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, const char *filename, const char *mode, + int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) { struct php_user_stream_wrapper *uwrap = (struct php_user_stream_wrapper*)wrapper->abstract; php_userstream_data_t *us; @@ -437,7 +438,7 @@ static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, char *filena return stream; } -static php_stream *user_wrapper_opendir(php_stream_wrapper *wrapper, char *filename, char *mode, +static php_stream *user_wrapper_opendir(php_stream_wrapper *wrapper, const char *filename, const char *mode, int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC) { struct php_user_stream_wrapper *uwrap = (struct php_user_stream_wrapper*)wrapper->abstract; @@ -1151,7 +1152,7 @@ static int php_userstreamop_set_option(php_stream *stream, int option, int value } -static int user_wrapper_unlink(php_stream_wrapper *wrapper, char *url, int options, php_stream_context *context TSRMLS_DC) +static int user_wrapper_unlink(php_stream_wrapper *wrapper, const char *url, int options, php_stream_context *context TSRMLS_DC) { struct php_user_stream_wrapper *uwrap = (struct php_user_stream_wrapper*)wrapper->abstract; zval *zfilename, *zfuncname, *zretval; @@ -1198,7 +1199,8 @@ static int user_wrapper_unlink(php_stream_wrapper *wrapper, char *url, int optio return ret; } -static int user_wrapper_rename(php_stream_wrapper *wrapper, char *url_from, char *url_to, int options, php_stream_context *context TSRMLS_DC) +static int user_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from, const char *url_to, + int options, php_stream_context *context TSRMLS_DC) { struct php_user_stream_wrapper *uwrap = (struct php_user_stream_wrapper*)wrapper->abstract; zval *zold_name, *znew_name, *zfuncname, *zretval; @@ -1250,7 +1252,8 @@ static int user_wrapper_rename(php_stream_wrapper *wrapper, char *url_from, char return ret; } -static int user_wrapper_mkdir(php_stream_wrapper *wrapper, char *url, int mode, int options, php_stream_context *context TSRMLS_DC) +static int user_wrapper_mkdir(php_stream_wrapper *wrapper, const char *url, int mode, + int options, php_stream_context *context TSRMLS_DC) { struct php_user_stream_wrapper *uwrap = (struct php_user_stream_wrapper*)wrapper->abstract; zval *zfilename, *zmode, *zoptions, *zfuncname, *zretval; @@ -1308,7 +1311,8 @@ static int user_wrapper_mkdir(php_stream_wrapper *wrapper, char *url, int mode, return ret; } -static int user_wrapper_rmdir(php_stream_wrapper *wrapper, char *url, int options, php_stream_context *context TSRMLS_DC) +static int user_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, + int options, php_stream_context *context TSRMLS_DC) { struct php_user_stream_wrapper *uwrap = (struct php_user_stream_wrapper*)wrapper->abstract; zval *zfilename, *zoptions, *zfuncname, *zretval; @@ -1361,7 +1365,8 @@ static int user_wrapper_rmdir(php_stream_wrapper *wrapper, char *url, int option return ret; } -static int user_wrapper_metadata(php_stream_wrapper *wrapper, char *url, int option, void *value, php_stream_context *context TSRMLS_DC) +static int user_wrapper_metadata(php_stream_wrapper *wrapper, const char *url, int option, + void *value, php_stream_context *context TSRMLS_DC) { struct php_user_stream_wrapper *uwrap = (struct php_user_stream_wrapper*)wrapper->abstract; zval *zfilename, *zoption, *zvalue, *zfuncname, *zretval; @@ -1444,7 +1449,8 @@ static int user_wrapper_metadata(php_stream_wrapper *wrapper, char *url, int opt } -static int user_wrapper_stat_url(php_stream_wrapper *wrapper, char *url, int flags, php_stream_statbuf *ssb, php_stream_context *context TSRMLS_DC) +static int user_wrapper_stat_url(php_stream_wrapper *wrapper, const char *url, int flags, + php_stream_statbuf *ssb, php_stream_context *context TSRMLS_DC) { struct php_user_stream_wrapper *uwrap = (struct php_user_stream_wrapper*)wrapper->abstract; zval *zfilename, *zfuncname, *zretval, *zflags; diff --git a/main/streams/xp_socket.c b/main/streams/xp_socket.c index a9c050f267..4edc68b015 100644 --- a/main/streams/xp_socket.c +++ b/main/streams/xp_socket.c @@ -230,7 +230,7 @@ static int php_sockop_stat(php_stream *stream, php_stream_statbuf *ssb TSRMLS_DC #endif } -static inline int sock_sendto(php_netstream_data_t *sock, char *buf, size_t buflen, int flags, +static inline int sock_sendto(php_netstream_data_t *sock, const char *buf, size_t buflen, int flags, struct sockaddr *addr, socklen_t addrlen TSRMLS_DC) { @@ -521,7 +521,7 @@ static inline int parse_unix_address(php_stream_xport_param *xparam, struct sock } #endif -static inline char *parse_ip_address_ex(const char *str, int str_len, int *portno, int get_err, char **err TSRMLS_DC) +static inline char *parse_ip_address_ex(const char *str, size_t str_len, int *portno, int get_err, char **err TSRMLS_DC) { char *colon; char *host = NULL; @@ -774,8 +774,8 @@ static int php_tcp_sockop_set_option(php_stream *stream, int option, int value, } -PHPAPI php_stream *php_stream_generic_socket_factory(const char *proto, long protolen, - char *resourcename, long resourcenamelen, +PHPAPI php_stream *php_stream_generic_socket_factory(const char *proto, size_t protolen, + const char *resourcename, size_t resourcenamelen, const char *persistent_id, int options, int flags, struct timeval *timeout, php_stream_context *context STREAMS_DC TSRMLS_DC) diff --git a/php.ini-development b/php.ini-development index 43ab1de26a..99532d20d9 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 @@ -1379,9 +1381,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. @@ -1416,7 +1418,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 @@ -1489,14 +1491,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 @@ -1541,7 +1543,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 0014c4e251..33d8bb635a 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 @@ -1379,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. @@ -1416,7 +1419,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 @@ -1489,14 +1492,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 @@ -1541,7 +1544,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/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c index 4c78fcafec..221b002175 100644 --- a/sapi/cgi/cgi_main.c +++ b/sapi/cgi/cgi_main.c @@ -508,7 +508,7 @@ static int sapi_cgi_read_post(char *buffer, uint count_bytes TSRMLS_DC) uint read_bytes = 0; int tmp_read_bytes; - count_bytes = MIN(count_bytes, (uint) SG(request_info).content_length - SG(read_post_bytes)); + count_bytes = MIN(count_bytes, SG(request_info).content_length - SG(read_post_bytes)); while (read_bytes < count_bytes) { tmp_read_bytes = read(STDIN_FILENO, buffer + read_bytes, count_bytes - read_bytes); if (tmp_read_bytes <= 0) { diff --git a/sapi/cli/php_http_parser.h b/sapi/cli/php_http_parser.h index 2bf2356725..31502e213a 100644 --- a/sapi/cli/php_http_parser.h +++ b/sapi/cli/php_http_parser.h @@ -29,15 +29,13 @@ extern "C" { #include <sys/types.h> #if defined(_WIN32) && !defined(__MINGW32__) # include <windows.h> -# include "win32/php_stdint.h" # include "config.w32.h" #else # include "php_config.h" -# ifdef HAVE_STDINT_H -# include <stdint.h> -# endif #endif +#include "php_stdint.h" + /* Compile with -DPHP_HTTP_PARSER_STRICT=0 to make less checks, but run * faster */ diff --git a/sapi/cli/tests/php_cli_server.inc b/sapi/cli/tests/php_cli_server.inc index 40c5361995..77a79e0f04 100644 --- a/sapi/cli/tests/php_cli_server.inc +++ b/sapi/cli/tests/php_cli_server.inc @@ -3,7 +3,7 @@ define ("PHP_CLI_SERVER_HOSTNAME", "localhost"); define ("PHP_CLI_SERVER_PORT", 8964); define ("PHP_CLI_SERVER_ADDRESS", PHP_CLI_SERVER_HOSTNAME.":".PHP_CLI_SERVER_PORT); -function php_cli_server_start($code = 'echo "Hello world";', $no_router = FALSE) { +function php_cli_server_start($code = 'echo "Hello world";', $no_router = FALSE, $cmd_args = null) { $php_executable = getenv('TEST_PHP_EXECUTABLE'); $doc_root = __DIR__; $router = "index.php"; @@ -19,14 +19,14 @@ function php_cli_server_start($code = 'echo "Hello world";', $no_router = FALSE) ); if (substr(PHP_OS, 0, 3) == 'WIN') { - $cmd = "{$php_executable} -t {$doc_root} -n -S " . PHP_CLI_SERVER_ADDRESS; + $cmd = "{$php_executable} -t {$doc_root} -n {$cmd_args} -S " . PHP_CLI_SERVER_ADDRESS; if (!$no_router) { $cmd .= " {$router}"; } $handle = proc_open(addslashes($cmd), $descriptorspec, $pipes, $doc_root, NULL, array("bypass_shell" => true, "suppress_errors" => true)); } else { - $cmd = "exec {$php_executable} -t {$doc_root} -n -S " . PHP_CLI_SERVER_ADDRESS; + $cmd = "exec {$php_executable} -t {$doc_root} -n {$cmd_args} -S " . PHP_CLI_SERVER_ADDRESS; if (!$no_router) { $cmd .= " {$router}"; } diff --git a/sapi/cli/tests/upload_2G.phpt b/sapi/cli/tests/upload_2G.phpt new file mode 100644 index 0000000000..fe13d90007 --- /dev/null +++ b/sapi/cli/tests/upload_2G.phpt @@ -0,0 +1,99 @@ +--TEST-- +file upload greater than 2G +--SKIPIF-- +<?php +include "skipif.inc"; + +if (PHP_INT_SIZE < 8) { + die("skip need PHP_INT_SIZE>=8"); +} + +if ($f = fopen("/proc/meminfo","r")) { + while (!feof($f)) { + if (!strncmp($line = fgets($f), "MemFree", 7)) { + if (substr($line,8)/1024/1024 > 3) { + $enough_free_ram = true; + } + } + } +} + +if (empty($enough_free_ram)) { + die("need +3G free RAM"); +} +?> +--FILE-- +<?php + +echo "Test\n"; + +include "php_cli_server.inc"; + +php_cli_server_start("var_dump(\$_FILES);", false, + "-d post_max_size=3G -d upload_max_filesize=3G"); + +list($host, $port) = explode(':', PHP_CLI_SERVER_ADDRESS); +$port = intval($port)?:80; +$length = 2150000000; +$output = ""; + +$fp = fsockopen($host, $port, $errno, $errstr, 0.5); +if (!$fp) { + die("connect failed"); +} + +$prev = "----123 +Content-Type: text/plain +Content-Disposition: form-data; name=\"file1\"; filename=\"file1.txt\"\n\n"; +$post = "\n----123--\n"; +$total = $length + strlen($prev) + strlen($post); + +fwrite($fp, <<<EOF +POST /index.php HTTP/1.1 +Host: {$host} +Content-Type: multipart/form-data; boundary=--123 +Content-Length: {$total} + +{$prev} +EOF +) or die("write prev failed"); + +$data = str_repeat("0123456789", 10000); +for ($i = 0; $i < $length; $i += 10000 * 10) { + fwrite($fp, $data) or die("write failed @ ($i)"); +} + +fwrite($fp, $post) or die("write post failed"); + +while (!feof($fp)) { + $output .= fgets($fp); +} +echo $output; +fclose($fp); +?> +Done +--EXPECTF-- +Test + +HTTP/1.1 200 OK +Host: %s +Connection: close +X-Powered-By: PHP/%s +Content-type: text/html + +array(1) { + ["file1"]=> + array(5) { + ["name"]=> + string(9) "file1.txt" + ["type"]=> + string(10) "text/plain" + ["tmp_name"]=> + string(14) "/tmp/php%s" + ["error"]=> + int(0) + ["size"]=> + int(2150000000) + } +} +Done diff --git a/scripts/dev/conv_proto b/scripts/dev/conv_proto deleted file mode 100755 index fad9cfaa83..0000000000 --- a/scripts/dev/conv_proto +++ /dev/null @@ -1,30 +0,0 @@ -#! /bin/sh -# -# do some automatic conversion of prototypes -# - -if test "$1" = "" ; then - echo "usage: $0 list-of-files" - exit 1 -fi - -tmpfile=`mktemp -q /tmp/asd.XXXXXX` - -if test "$?" != "0" ; then - echo "$0: cannot create temporary file" - exit 1 -fi - -for file in ${1+"$@"} ; do - echo "working on $file" - cat $file | \ - sed -e \ - 's/void php3_\(.*\)(INTERNAL_FUNCTION_PARAMETERS)/PHP_FUNCTION(\1)/' \ - -e 's/^extern void /void /' \ - -e 's/^extern PHP_FUNCTION/PHP_FUNCTION/' > $tmpfile - cp $tmpfile $file -done - -rm -f $tmpfile - -exit 0 diff --git a/scripts/dev/conv_z_macros b/scripts/dev/conv_z_macros deleted file mode 100755 index ea45bc2ef9..0000000000 --- a/scripts/dev/conv_z_macros +++ /dev/null @@ -1,61 +0,0 @@ -#! /bin/sh -# -# +----------------------------------------------------------------------+ -# | PHP Version 5 | -# +----------------------------------------------------------------------+ -# | Copyright (c) 1997-2007 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: Sascha Schumann <sascha@schumann.cx> | -# +----------------------------------------------------------------------+ -# -# $Id$ - -for i in $@; do - echo -n "Processing $i... " - sed \ - -e 's/(\*\([^()]\+\))->type/Z_TYPE_PP(\1)/g' \ - -e 's/\([a-z_][]a-z_0-9\[]*\)->type/Z_TYPE_P(\1)/g' \ - -e 's/\([a-z_][]a-z_0-9\[]*\)\.type/Z_TYPE(\1)/g' \ - -e 's/(\*\([^()]\+\))->value\.dval/Z_DVAL_PP(\1)/g' \ - -e 's/\([a-z_][]a-z_0-9\[]*\)->value\.dval/Z_DVAL_P(\1)/g' \ - -e 's/\([a-z_][]a-z_0-9\[]*\)\.value\.dval/Z_DVAL(\1)/g' \ - -e 's/(\*\([^()]\+\))->value\.lval/Z_LVAL_PP(\1)/g' \ - -e 's/\([a-z_][]a-z_0-9\[]*\)->value\.lval/Z_LVAL_P(\1)/g' \ - -e 's/\([a-z_][]a-z_0-9\[]*\)\.value\.lval/Z_LVAL(\1)/g' \ - -e 's/(\*\([^()]\+\))->value\.ht/Z_ARRVAL_PP(\1)/g' \ - -e 's/\([a-z_][]a-z_0-9\[]*\)->value\.ht/Z_ARRVAL_P(\1)/g' \ - -e 's/\([a-z_][]a-z_0-9\[]*\)\.value\.ht/Z_ARRVAL(\1)/g' \ - -e 's/(\*\([^()]\+\))->value\.str\.val/Z_STRVAL_PP(\1)/g' \ - -e 's/\([a-z_][]a-z_0-9\[]*\)->value\.str\.val/Z_STRVAL_P(\1)/g' \ - -e 's/\([a-z_][]a-z_0-9\[]*\)\.value\.str\.val/Z_STRVAL(\1)/g' \ - -e 's/(\*\([^()]\+\))->value\.str\.len/Z_STRLEN_PP(\1)/g' \ - -e 's/\([a-z_][]a-z_0-9\[]*\)->value\.str\.len/Z_STRLEN_P(\1)/g' \ - -e 's/\([a-z_][]a-z_0-9\[]*\)\.value\.str\.len/Z_STRLEN(\1)/g' \ - -e 's/(\*\([^()]\+\))->value\.obj\.properties/Z_OBJPROP_PP(\1)/g' \ - -e 's/\([a-z_][]a-z_0-9\[]*\)->value\.obj\.properties/Z_OBJPROP_P(\1)/g' \ - -e 's/\([a-z_][]a-z_0-9\[]*\)\.value\.obj\.properties/Z_OBJPROP(\1)/g' \ - -e 's/(\*\([^()]\+\))->value\.obj\.ce/Z_OBJCE_PP(\1)/g' \ - -e 's/\([a-z_][]a-z_0-9\[]*\)->value\.obj\.ce/Z_OBJCE_P(\1)/g' \ - -e 's/\([a-z_][]a-z_0-9\[]*\)\.value\.obj\.ce/Z_OBJCE(\1)/g' \ - -e 's/(\*\([^()]\+\))->value\.obj/Z_OBJ_PP(\1)/g' \ - -e 's/\([a-z_][]a-z_0-9\[]*\)->value\.obj/Z_OBJ_P(\1)/g' \ - -e 's/\([a-z_][]a-z_0-9\[]*\)\.value\.obj/Z_OBJ(\1)/g' \ - -e 's/\([a-zA-Z_][a-zA-Z_0-9]*\)->Z_\([A-Z_]\+\)(/Z_\2(\1->/g' \ - -e 's/\([a-zA-Z_][a-zA-Z_0-9]*\)->Z_\([A-Z_]\+\)(/Z_\2(\1->/g' \ - -e 's/\([a-zA-Z_][a-zA-Z_0-9]*\)->Z_\([A-Z_]\+\)(/Z_\2(\1->/g' \ - -e 's/\([a-zA-Z_][a-zA-Z_0-9]*\)\.Z_\([A-Z_]\+\)(/Z_\2(\1./g' \ - -e 's/\([a-zA-Z_][a-zA-Z_0-9]*\)\.Z_\([A-Z_]\+\)(/Z_\2(\1./g' \ - -e 's/\([a-zA-Z_][a-zA-Z_0-9]*\)\.Z_\([A-Z_]\+\)(/Z_\2(\1./g' \ - < $i > tmp && cp tmp $i - echo "DONE" -done - -rm -f tmp diff --git a/scripts/dev/extern_c.php b/scripts/dev/extern_c.php deleted file mode 100644 index 72c7edcd32..0000000000 --- a/scripts/dev/extern_c.php +++ /dev/null @@ -1,45 +0,0 @@ -<?php - -function scan_dir($dir) { - if (!is_dir($dir)) return; - - foreach (glob("$dir/*") as $file) { - if (is_dir($file)) { - if (basename($file) != "CVS") { - scan_dir($file); - } - } else if (fnmatch("*.h", $file)) { - scan_file($file); - } - } -} - -function scan_file($file) { - $flag = false; - - foreach (file($file) as $nr => $line) { - if (ereg("^[[:space:]]*BEGIN_EXTERN_C", $line)) { -# echo "$file:".($nr+1)." $line"; - $flag = true; - } else if (ereg("^[[:space:]]*END_EXTERN_C", $line)) { -# echo "$file:".($nr+1)." $line"; - $flag = false; - } else if ( (ereg("^[[:space:]]*PHPAPI[[:space:]]*", $line)) - ||(ereg("^[[:space:]]*ZEND_API[[:space:]]*", $line))) { - if (strstr($line,"(")) { - if (!$flag) echo "$file:".($nr+1)." $line"; - } - } - } -} - -array_shift($_SERVER["argv"]); - -if (count($_SERVER["argv"])) { - foreach ($_SERVER["argv"] as $dir) { - scan_dir($dir); - } -} else { - scan_dir("."); -} -?>
\ No newline at end of file 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 |
