From 3fd5a4055634a62efa7a635d29f9b19e440d842b Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Wed, 20 Feb 2013 18:53:17 +0100 Subject: [PATCH 001/400] Dont reset other counters when incrementing slow_rq --- sapi/fpm/fpm/fpm_php_trace.c | 2 +- sapi/fpm/fpm/fpm_scoreboard.c | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/sapi/fpm/fpm/fpm_php_trace.c b/sapi/fpm/fpm/fpm_php_trace.c index d95d66a754c3e..925f2de64e93f 100644 --- a/sapi/fpm/fpm/fpm_php_trace.c +++ b/sapi/fpm/fpm/fpm_php_trace.c @@ -138,7 +138,7 @@ static int fpm_php_trace_dump(struct fpm_child_s *child, FILE *slowlog TSRMLS_DC void fpm_php_trace(struct fpm_child_s *child) /* {{{ */ { TSRMLS_FETCH(); - fpm_scoreboard_update(0, 0, 0, 0, 0, 0, 1, FPM_SCOREBOARD_ACTION_SET, child->wp->scoreboard); + fpm_scoreboard_update(0, 0, 0, 0, 0, 0, 1, FPM_SCOREBOARD_ACTION_INC, child->wp->scoreboard); FILE *slowlog; zlog(ZLOG_NOTICE, "about to trace %d", (int) child->pid); diff --git a/sapi/fpm/fpm/fpm_scoreboard.c b/sapi/fpm/fpm/fpm_scoreboard.c index 24463a90dddfd..8d0868182d763 100644 --- a/sapi/fpm/fpm/fpm_scoreboard.c +++ b/sapi/fpm/fpm/fpm_scoreboard.c @@ -111,7 +111,7 @@ void fpm_scoreboard_update(int idle, int active, int lq, int lq_len, int request scoreboard->max_children_reached = max_children_reached; } if (slow_rq > 0) { - scoreboard->slow_rq += slow_rq; + scoreboard->slow_rq = slow_rq; } } else { if (scoreboard->idle + idle > 0) { @@ -137,6 +137,12 @@ void fpm_scoreboard_update(int idle, int active, int lq, int lq_len, int request } else { scoreboard->max_children_reached = 0; } + + if (scoreboard->slow_rq + slow_rq > 0) { + scoreboard->slow_rq += slow_rq; + } else { + scoreboard->slow_rq = 0; + } } if (scoreboard->active > scoreboard->active_max) { From a8dc4f0b18ea2fba0df6a627210beea0c5eda80f Mon Sep 17 00:00:00 2001 From: Alexander Moskalev Date: Wed, 10 Apr 2013 00:12:39 +0400 Subject: [PATCH 002/400] Fix DateInterval->days value when object was created not from DateTime::diff() --- ext/date/php_date.c | 6 +++++- ext/date/tests/DateInterval_days_prop1.phpt | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 ext/date/tests/DateInterval_days_prop1.phpt diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 13e7b753d38fa..ce891d96ae48c 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -3470,7 +3470,11 @@ zval *date_interval_read_property(zval *object, zval *member, int type, const ze ALLOC_INIT_ZVAL(retval); Z_SET_REFCOUNT_P(retval, 0); - ZVAL_LONG(retval, value); + if (value != -99999) { + ZVAL_LONG(retval, value); + } else { + ZVAL_FALSE(retval); + } if (member == &tmp_member) { zval_dtor(member); diff --git a/ext/date/tests/DateInterval_days_prop1.phpt b/ext/date/tests/DateInterval_days_prop1.phpt new file mode 100644 index 0000000000000..3907974e7b63a --- /dev/null +++ b/ext/date/tests/DateInterval_days_prop1.phpt @@ -0,0 +1,10 @@ +--TEST-- +Wrong var_dump(DateInterval->days) value +--FILE-- +days); +--EXPECT-- +bool(false) From 488318591792944148468529ab6731068354167f Mon Sep 17 00:00:00 2001 From: Alexander Moskaliov Date: Wed, 10 Apr 2013 11:06:05 +0400 Subject: [PATCH 003/400] Remove semicolon --- ext/date/tests/DateInterval_days_prop1.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/date/tests/DateInterval_days_prop1.phpt b/ext/date/tests/DateInterval_days_prop1.phpt index 3907974e7b63a..627b8f0b27f32 100644 --- a/ext/date/tests/DateInterval_days_prop1.phpt +++ b/ext/date/tests/DateInterval_days_prop1.phpt @@ -3,7 +3,7 @@ Wrong var_dump(DateInterval->days) value --FILE-- days); --EXPECT-- From da04b2e28c6ccc73bfab542ed4dd5eada343e592 Mon Sep 17 00:00:00 2001 From: Ralf Lang Date: Fri, 28 Jun 2013 08:32:10 +0200 Subject: [PATCH 004/400] Patch for https://bugs.php.net/bug.php?id=44522 to allow uploading files above 2G. This is essentially the same as the patch "uploads_larger_than_2g_HEAD_v2 (last revision 2012-03-26 03:59 UTC) by jason at infininull dot com)" but using off_t instead of signed long (originally: uint) I tested this on 64bit linux and succeeded uploading a file of 4.8 G. The File did not get corrupted or truncated in any way. I did not yet test this under windows or 32 bit linux Note that there are still limitations: * Did not test for files > 8 G * php does not yet reject absurdly high values * Still limited by underlying file system specific limits and free space * in upload * tmp dir and destination dir --- main/SAPI.h | 4 ++-- main/rfc1867.c | 5 +++-- sapi/cgi/cgi_main.c | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/main/SAPI.h b/main/SAPI.h index 92b7329dbc16c..c3cacb515c78f 100644 --- a/main/SAPI.h +++ b/main/SAPI.h @@ -82,7 +82,7 @@ typedef struct { char *post_data, *raw_post_data; char *cookie_data; long content_length; - uint post_data_length, raw_post_data_length; + off_t post_data_length, raw_post_data_length; char *path_translated; char *request_uri; @@ -119,7 +119,7 @@ typedef struct _sapi_globals_struct { void *server_context; sapi_request_info request_info; sapi_headers_struct sapi_headers; - int read_post_bytes; + off_t read_post_bytes; unsigned char headers_sent; struct stat global_stat; char *default_mimetype; diff --git a/main/rfc1867.c b/main/rfc1867.c index ed7ce9c0c172b..78a7ad27946b0 100644 --- a/main/rfc1867.c +++ b/main/rfc1867.c @@ -676,8 +676,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; + off_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; diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c index 9e6b74ac6164e..ec7b963339263 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) { From f978f11e2e599258cdbdc699cfccd5d961eb8c36 Mon Sep 17 00:00:00 2001 From: Ralf Lang Date: Fri, 28 Jun 2013 08:38:34 +0200 Subject: [PATCH 005/400] ws --- main/rfc1867.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/rfc1867.c b/main/rfc1867.c index 78a7ad27946b0..452b6a332fd2c 100644 --- a/main/rfc1867.c +++ b/main/rfc1867.c @@ -677,7 +677,7 @@ 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, cancel_upload = 0, is_arr_upload = 0, array_len = 0; - off_t total_bytes = 0, max_file_size = 0; + off_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; From a2394df90e86a24a61f1267b5767017e2e769b2a Mon Sep 17 00:00:00 2001 From: Ralf Lang Date: Mon, 22 Jul 2013 18:03:11 +0200 Subject: [PATCH 006/400] Use int64_t and atoll() after discussion with johannes --- main/SAPI.h | 4 ++-- main/rfc1867.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/main/SAPI.h b/main/SAPI.h index c3cacb515c78f..6d5434d141b54 100644 --- a/main/SAPI.h +++ b/main/SAPI.h @@ -82,7 +82,7 @@ typedef struct { char *post_data, *raw_post_data; char *cookie_data; long content_length; - off_t post_data_length, raw_post_data_length; + int64_t post_data_length, raw_post_data_length; char *path_translated; char *request_uri; @@ -119,7 +119,7 @@ typedef struct _sapi_globals_struct { void *server_context; sapi_request_info request_info; sapi_headers_struct sapi_headers; - off_t read_post_bytes; + int64_t read_post_bytes; unsigned char headers_sent; struct stat global_stat; char *default_mimetype; diff --git a/main/rfc1867.c b/main/rfc1867.c index 452b6a332fd2c..d3adf4711407f 100644 --- a/main/rfc1867.c +++ b/main/rfc1867.c @@ -677,7 +677,7 @@ 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, cancel_upload = 0, is_arr_upload = 0, array_len = 0; - off_t total_bytes = 0, max_file_size = 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; @@ -899,7 +899,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); From b07e55fdeba5d3e415671c0981e3041841b2485e Mon Sep 17 00:00:00 2001 From: Ralf Lang Date: Mon, 22 Jul 2013 21:26:38 +0200 Subject: [PATCH 007/400] make this work in vc11 too --- main/SAPI.h | 1 + main/rfc1867.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/main/SAPI.h b/main/SAPI.h index 6d5434d141b54..6fc60c886513e 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 diff --git a/main/rfc1867.c b/main/rfc1867.c index d3adf4711407f..8460929108e10 100644 --- a/main/rfc1867.c +++ b/main/rfc1867.c @@ -34,6 +34,10 @@ #include "rfc1867.h" #include "ext/standard/php_string.h" +#if defined(_MSC_VER) +# define atoll(s) _atoi64(s) +#endif + #define DEBUG_FILE_UPLOAD ZEND_DEBUG static int dummy_encoding_translation(TSRMLS_D) From d80a91018dc0d7b771cf8517f788a408f3a4f473 Mon Sep 17 00:00:00 2001 From: Ralf Lang Date: Tue, 23 Jul 2013 07:39:36 +0200 Subject: [PATCH 008/400] more precise condition --- main/rfc1867.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/rfc1867.c b/main/rfc1867.c index 8460929108e10..3c160702aef9c 100644 --- a/main/rfc1867.c +++ b/main/rfc1867.c @@ -34,7 +34,7 @@ #include "rfc1867.h" #include "ext/standard/php_string.h" -#if defined(_MSC_VER) +#if defined(PHP_WIN32) && !defined(HAVE_ATOLL) # define atoll(s) _atoi64(s) #endif From 15c351cc52971eb9a1a6c16a760cc0f7777681c5 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Mon, 5 Aug 2013 13:53:35 +0200 Subject: [PATCH 009/400] add NEWS entry; add simple test --- NEWS | 1 + sapi/cli/tests/php_cli_server.inc | 6 +- sapi/cli/tests/upload_2G.phpt | 99 +++++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 sapi/cli/tests/upload_2G.phpt diff --git a/NEWS b/NEWS index c679b90a65369..3ef4a979f1aed 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,7 @@ PHP NEWS . Improved IS_VAR operands fetching. (Laruence, Dmitry) . Implemented internal operator overloading (RFC: https://wiki.php.net/rfc/operator_overloading_gmp). (Nikita) + . Enabled file uploads greater than 2G (Ralf Lang, Mike) - mysqlnd: . Disabled flag for SP OUT variables for 5.5+ servers as they are not natively diff --git a/sapi/cli/tests/php_cli_server.inc b/sapi/cli/tests/php_cli_server.inc index 40c53619957fd..77a79e0f0493e 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 0000000000000..c7ae5c62bb785 --- /dev/null +++ b/sapi/cli/tests/upload_2G.phpt @@ -0,0 +1,99 @@ +--TEST-- +file upload greater than 2G +--SKIPIF-- +=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-- + +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 From 5201a2d56696f1a019722e3b00d905d5f05807bb Mon Sep 17 00:00:00 2001 From: Michael M Slusarz Date: Tue, 20 Aug 2013 01:07:26 -0600 Subject: [PATCH 010/400] Fix #65483: quoted-printable encode stream filter incorrectly encoding spaces --- ext/standard/filters.c | 4 +++- ext/standard/tests/streams/bug65483.phpt | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 ext/standard/tests/streams/bug65483.phpt diff --git a/ext/standard/filters.c b/ext/standard/filters.c index 0a59039635881..15dae1bee69d7 100644 --- a/ext/standard/filters.c +++ b/ext/standard/filters.c @@ -951,7 +951,9 @@ static php_conv_err_t php_conv_qprint_encode_convert(php_conv_qprint_encode *ins *(pd++) = qp_digits[(c & 0x0f)]; ocnt -= 3; line_ccnt -= 3; - trail_ws--; + if (trail_ws > 0) { + trail_ws--; + } CONSUME_CHAR(ps, icnt, lb_ptr, lb_cnt); } } diff --git a/ext/standard/tests/streams/bug65483.phpt b/ext/standard/tests/streams/bug65483.phpt new file mode 100644 index 0000000000000..d214bbbbcc4a4 --- /dev/null +++ b/ext/standard/tests/streams/bug65483.phpt @@ -0,0 +1,19 @@ +--TEST-- +Bug #65483: quoted-printable encode stream filter incorrectly encoding spaces +--FILE-- + +--EXPECT-- +string(9) "a b=3Dc d" From e3619778c949f6e71ca907351dc052a3f231ea04 Mon Sep 17 00:00:00 2001 From: Ole Markus With Date: Thu, 22 Aug 2013 08:59:33 +0200 Subject: [PATCH 011/400] Stricter libc-client symlink check --- ext/imap/config.m4 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/imap/config.m4 b/ext/imap/config.m4 index 3efc245901695..d7deae102662a 100644 --- a/ext/imap/config.m4 +++ b/ext/imap/config.m4 @@ -198,9 +198,9 @@ if test "$PHP_IMAP" != "no"; then AC_MSG_ERROR(Cannot find rfc822.h. Please check your c-client installation.) fi - if test -r "$IMAP_DIR/c-client/c-client.a"; then + if test ! -r "$IMAP_DIR/c-client/libc-client.a" && -r "$IMAP_DIR/c-client/c-client.a" ; then ln -s "$IMAP_DIR/c-client/c-client.a" "$IMAP_DIR/c-client/libc-client.a" >/dev/null 2>&1 - elif test -r "$IMAP_DIR/$PHP_LIBDIR/c-client.a"; then + elif test ! -r "$IMAP_DIR/$PHP_LIBDIR/libc-client.a" && -r "$IMAP_DIR/$PHP_LIBDIR/c-client.a"; then ln -s "$IMAP_DIR/$PHP_LIBDIR/c-client.a" "$IMAP_DIR/$PHP_LIBDIR/libc-client.a" >/dev/null 2>&1 fi From c0d99fd76a37785d357ffe7a0fee8715108d3dd5 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 22 Aug 2013 14:02:55 +0200 Subject: [PATCH 012/400] Apply pgsql notice test fixes to PHP-5.5 --- ext/pgsql/tests/09notice.phpt | 5 +++++ ext/pgsql/tests/80_bug32223.phpt | 6 +++++- ext/pgsql/tests/80_bug32223b.phpt | 6 +++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/ext/pgsql/tests/09notice.phpt b/ext/pgsql/tests/09notice.phpt index 67ef262fcade7..db671016e3b55 100644 --- a/ext/pgsql/tests/09notice.phpt +++ b/ext/pgsql/tests/09notice.phpt @@ -20,6 +20,9 @@ $db = pg_connect($conn_str); _set_lc_messages(); +$res = pg_query($db, 'SET client_min_messages TO NOTICE;'); +var_dump($res); + pg_query($db, "BEGIN;"); pg_query($db, "BEGIN;"); @@ -33,6 +36,8 @@ echo "pg_last_notice() is Ok\n"; ?> --EXPECTF-- +resource(%d) of type (pgsql result) + Notice: pg_query(): %s already a transaction in progress in %s on line %d %s already a transaction in progress pg_last_notice() is Ok diff --git a/ext/pgsql/tests/80_bug32223.phpt b/ext/pgsql/tests/80_bug32223.phpt index cad5fb3a123da..b9bbbf86edf15 100644 --- a/ext/pgsql/tests/80_bug32223.phpt +++ b/ext/pgsql/tests/80_bug32223.phpt @@ -37,8 +37,10 @@ begin end; ' LANGUAGE plpgsql;"); - +$res = pg_query($dbh, 'SET client_min_messages TO NOTICE;'); +var_dump($res); $res = pg_query($dbh, 'SELECT test_notice()'); +var_dump($res); $row = pg_fetch_row($res, 0); var_dump($row); pg_free_result($res); @@ -52,6 +54,8 @@ pg_close($dbh); ?> ===DONE=== --EXPECTF-- +resource(%d) of type (pgsql result) +resource(%d) of type (pgsql result) array(1) { [0]=> string(1) "f" diff --git a/ext/pgsql/tests/80_bug32223b.phpt b/ext/pgsql/tests/80_bug32223b.phpt index e79685c43dabb..418ccfc9aebaa 100644 --- a/ext/pgsql/tests/80_bug32223b.phpt +++ b/ext/pgsql/tests/80_bug32223b.phpt @@ -37,10 +37,13 @@ begin end; ' LANGUAGE plpgsql;"); +$res = pg_query(dbh, 'SET client_min_messages TO NOTICE;'); +var_dump($res); + function tester() { $res = pg_query(dbh, 'SELECT test_notice()'); $row = pg_fetch_row($res, 0); - var_dump($row); + var_dump($row); pg_free_result($res); if ($row[0] == 'f') { @@ -54,6 +57,7 @@ pg_close(dbh); ?> ===DONE=== --EXPECTF-- +resource(%d) of type (pgsql result) array(1) { [0]=> string(1) "f" From d5987478a8fd566775510c08993cc933267a3765 Mon Sep 17 00:00:00 2001 From: Matteo Beccati Date: Thu, 22 Aug 2013 15:33:12 +0200 Subject: [PATCH 013/400] Fixed other compiler warnings --- ext/pdo/pdo_dbh.c | 2 +- ext/pdo/pdo_stmt.c | 2 +- ext/pgsql/pgsql.c | 5 ++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c index ee763571c0730..d5860b1a1eb02 100644 --- a/ext/pdo/pdo_dbh.c +++ b/ext/pdo/pdo_dbh.c @@ -997,7 +997,7 @@ static PHP_METHOD(PDO, lastInsertId) pdo_raise_impl_error(dbh, NULL, "IM001", "driver does not support lastInsertId()" TSRMLS_CC); RETURN_FALSE; } else { - Z_STRVAL_P(return_value) = dbh->methods->last_id(dbh, name, &Z_STRLEN_P(return_value) TSRMLS_CC); + Z_STRVAL_P(return_value) = dbh->methods->last_id(dbh, name, (unsigned int *)&Z_STRLEN_P(return_value) TSRMLS_CC); if (!Z_STRVAL_P(return_value)) { PDO_HANDLE_DBH_ERR(); RETURN_FALSE; diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index 81224ab51a7de..9622cb3cc296e 100644 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -1146,7 +1146,7 @@ static int do_fetch(pdo_stmt_t *stmt, int do_bind, zval *return_value, zval_ptr_dtor(&val); pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "cannot unserialize class" TSRMLS_CC); return 0; - } else if (ce->unserialize(&return_value, ce, Z_TYPE_P(val) == IS_STRING ? Z_STRVAL_P(val) : "", Z_TYPE_P(val) == IS_STRING ? Z_STRLEN_P(val) : 0, NULL TSRMLS_CC) == FAILURE) { + } else if (ce->unserialize(&return_value, ce, (unsigned char *)(Z_TYPE_P(val) == IS_STRING ? Z_STRVAL_P(val) : ""), Z_TYPE_P(val) == IS_STRING ? Z_STRLEN_P(val) : 0, NULL TSRMLS_CC) == FAILURE) { zval_ptr_dtor(&val); pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "cannot unserialize class" TSRMLS_CC); zval_dtor(return_value); diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index 41e304fd3154b..f4c4cb37e785c 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -63,6 +63,7 @@ #define PGSQL_MAX_LENGTH_OF_LONG 30 #define PGSQL_MAX_LENGTH_OF_DOUBLE 60 +#if LONG_MAX < UINT_MAX #define PGSQL_RETURN_OID(oid) do { \ if (oid > LONG_MAX) { \ smart_str s = {0}; \ @@ -72,7 +73,9 @@ } \ RETURN_LONG((long)oid); \ } while(0) - +#else +#define PGSQL_RETURN_OID(oid) (RETURN_LONG((long)oid)) +#endif #if HAVE_PQSETNONBLOCKING #define PQ_SETNONBLOCKING(pg_link, flag) PQsetnonblocking(pg_link, flag) From a61f5bf925837ad39962f5d128b748f1c0c3b321 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Thu, 22 Aug 2013 08:57:18 -0700 Subject: [PATCH 014/400] =?UTF-8?q?Revert=20"Suppress=20compliation=20warn?= =?UTF-8?q?ing=20"warning:=20passing=20argument=201=20of=20=E2=80=98=5Fefr?= =?UTF-8?q?ee=E2=80=99=20discards=20qualifiers=20from=20pointer=20target?= =?UTF-8?q?=20type""?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit f38bd22ed2c5f710f72e719d7ab2a41ce30541fc. --- ext/intl/intl_data.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/intl/intl_data.h b/ext/intl/intl_data.h index 6966dc289100b..66ca27ae79682 100644 --- a/ext/intl/intl_data.h +++ b/ext/intl/intl_data.h @@ -79,7 +79,7 @@ typedef struct _intl_data { int u8len; \ intl_convert_utf16_to_utf8(&u8value, &u8len, ustring, ulen, &INTL_DATA_ERROR_CODE((obj))); \ if((free_it)) { \ - efree((void *)ustring); \ + efree(ustring); \ } \ INTL_METHOD_CHECK_STATUS((obj), "Error converting value to UTF-8"); \ RETVAL_STRINGL(u8value, u8len, 0); \ From f2ceb4963e1ecce4535d3a9b1e3dfa6960aff2c6 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Thu, 22 Aug 2013 08:58:24 -0700 Subject: [PATCH 015/400] =?UTF-8?q?Revert=20"Suppress=20compliation=20warn?= =?UTF-8?q?ing=20"warning:=20passing=20argument=201=20of=20=E2=80=98=5Fefr?= =?UTF-8?q?ee=E2=80=99=20discards=20qualifiers=20from=20pointer=20target?= =?UTF-8?q?=20type""?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit f38bd22ed2c5f710f72e719d7ab2a41ce30541fc. --- ext/intl/intl_data.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/intl/intl_data.h b/ext/intl/intl_data.h index 6966dc289100b..66ca27ae79682 100644 --- a/ext/intl/intl_data.h +++ b/ext/intl/intl_data.h @@ -79,7 +79,7 @@ typedef struct _intl_data { int u8len; \ intl_convert_utf16_to_utf8(&u8value, &u8len, ustring, ulen, &INTL_DATA_ERROR_CODE((obj))); \ if((free_it)) { \ - efree((void *)ustring); \ + efree(ustring); \ } \ INTL_METHOD_CHECK_STATUS((obj), "Error converting value to UTF-8"); \ RETVAL_STRINGL(u8value, u8len, 0); \ From 18282f42c5d39e6b1790dfa7b2e18becc21d2f23 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Thu, 22 Aug 2013 08:58:35 -0700 Subject: [PATCH 016/400] =?UTF-8?q?Revert=20"Suppress=20compliation=20warn?= =?UTF-8?q?ing=20"warning:=20passing=20argument=201=20of=20=E2=80=98=5Fefr?= =?UTF-8?q?ee=E2=80=99=20discards=20qualifiers=20from=20pointer=20target?= =?UTF-8?q?=20type""?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit f38bd22ed2c5f710f72e719d7ab2a41ce30541fc. --- ext/intl/intl_data.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/intl/intl_data.h b/ext/intl/intl_data.h index 6966dc289100b..66ca27ae79682 100644 --- a/ext/intl/intl_data.h +++ b/ext/intl/intl_data.h @@ -79,7 +79,7 @@ typedef struct _intl_data { int u8len; \ intl_convert_utf16_to_utf8(&u8value, &u8len, ustring, ulen, &INTL_DATA_ERROR_CODE((obj))); \ if((free_it)) { \ - efree((void *)ustring); \ + efree(ustring); \ } \ INTL_METHOD_CHECK_STATUS((obj), "Error converting value to UTF-8"); \ RETVAL_STRINGL(u8value, u8len, 0); \ From 7109f369e848384444a852cd0f0c591fd58a1bc4 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Thu, 22 Aug 2013 09:05:52 -0700 Subject: [PATCH 017/400] =?UTF-8?q?Suppress=20compliation=20warning=20"war?= =?UTF-8?q?ning:=20passing=20argument=201=20of=20=E2=80=98=5Fefree?= =?UTF-8?q?=E2=80=99=20discards=20qualifiers=20from=20pointer=20target=20t?= =?UTF-8?q?ype"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ext/intl/resourcebundle/resourcebundle.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/intl/resourcebundle/resourcebundle.c b/ext/intl/resourcebundle/resourcebundle.c index 6d39dfb7e082e..f5475faf1c5a3 100644 --- a/ext/intl/resourcebundle/resourcebundle.c +++ b/ext/intl/resourcebundle/resourcebundle.c @@ -41,7 +41,7 @@ void resourcebundle_extract_value( zval *return_value, ResourceBundle_object *so case URES_STRING: ufield = ures_getString( source->child, &ilen, &INTL_DATA_ERROR_CODE(source) ); INTL_METHOD_CHECK_STATUS(source, "Failed to retrieve string value"); - INTL_METHOD_RETVAL_UTF8(source, ufield, ilen, 0); + INTL_METHOD_RETVAL_UTF8(source, (UChar *)ufield, ilen, 0); break; case URES_BINARY: From a4de9c03976310fb587099072a834d9b6cea546d Mon Sep 17 00:00:00 2001 From: root Date: Fri, 23 Aug 2013 01:06:58 +0000 Subject: [PATCH 018/400] Test extension xmlrpc encode type double and string decode type string and int --- ext/xmlrpc/tests/005.phpt | 47 +++++++++++++++++++++++++++++++++++++++ ext/xmlrpc/tests/006.phpt | 29 ++++++++++++++++++++++++ ext/xmlrpc/tests/007.phpt | 29 ++++++++++++++++++++++++ 3 files changed, 105 insertions(+) create mode 100644 ext/xmlrpc/tests/005.phpt create mode 100644 ext/xmlrpc/tests/006.phpt create mode 100644 ext/xmlrpc/tests/007.phpt diff --git a/ext/xmlrpc/tests/005.phpt b/ext/xmlrpc/tests/005.phpt new file mode 100644 index 0000000000000..613dfde249910 --- /dev/null +++ b/ext/xmlrpc/tests/005.phpt @@ -0,0 +1,47 @@ +--TEST-- +xmlrpc_encode() Simple test encode type double and String + +--CREDITS-- +Michel Araujo +#PHPSP 2013-08-22 + +--SKIPIF-- + + +--FILE-- + + + + + 3.24234 + + + + + + + + -3.24234 + + + + + + + + Is string + + + \ No newline at end of file diff --git a/ext/xmlrpc/tests/006.phpt b/ext/xmlrpc/tests/006.phpt new file mode 100644 index 0000000000000..f33932d5a210f --- /dev/null +++ b/ext/xmlrpc/tests/006.phpt @@ -0,0 +1,29 @@ +--TEST-- +xmlrpc_decode() Simple test decode type string + +--CREDITS-- +Michel Araujo +#PHPSP 2013-08-22 + +--SKIPIF-- + + +--FILE-- + + + + + Is string + + + +XML; + +$response = xmlrpc_decode($xml); +echo $response; + +--EXPECT-- +Is string \ No newline at end of file diff --git a/ext/xmlrpc/tests/007.phpt b/ext/xmlrpc/tests/007.phpt new file mode 100644 index 0000000000000..84c15a7d8a36c --- /dev/null +++ b/ext/xmlrpc/tests/007.phpt @@ -0,0 +1,29 @@ +--TEST-- +xmlrpc_decode() Simple test decode type int + +--CREDITS-- +Michel Araujo +#PHPSP 2013-08-22 + +--SKIPIF-- + + +--FILE-- + + + + + 1 + + + +XML; + +$response = xmlrpc_decode($xml); +echo $response; + +--EXPECT-- +1 \ No newline at end of file From 5ab6d215fca55a33b0f144c69afdcf9121d248eb Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Tue, 20 Aug 2013 16:32:53 -0700 Subject: [PATCH 019/400] Remove duplicate calls to set filename & lineno for the DTRACE_FUNCTION_ENTRY/RETURN cases --- Zend/zend_dtrace.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/Zend/zend_dtrace.c b/Zend/zend_dtrace.c index 88468931252f7..65c0193850313 100644 --- a/Zend/zend_dtrace.c +++ b/Zend/zend_dtrace.c @@ -58,10 +58,8 @@ ZEND_API void dtrace_execute(zend_op_array *op_array TSRMLS_DC) } if (DTRACE_FUNCTION_ENTRY_ENABLED() || DTRACE_FUNCTION_RETURN_ENABLED()) { - filename = dtrace_get_executed_filename(TSRMLS_C); classname = get_active_class_name(&scope TSRMLS_CC); funcname = get_active_function_name(TSRMLS_C); - lineno = zend_get_executed_lineno(TSRMLS_C); } if (DTRACE_EXECUTE_ENTRY_ENABLED()) { From a2b1546f3b59095b65a5624494c778078cb5a87f Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Fri, 23 Aug 2013 16:40:28 +0200 Subject: [PATCH 020/400] ensure the test doesn't fail because of tz warning --- ext/date/tests/bug65184.phpt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ext/date/tests/bug65184.phpt b/ext/date/tests/bug65184.phpt index adfd8d8124609..9bb68558aae83 100644 --- a/ext/date/tests/bug65184.phpt +++ b/ext/date/tests/bug65184.phpt @@ -6,6 +6,8 @@ if (strtoupper(substr(PHP_OS, 0, 3)) != 'WIN') { die("skip Test is valid for Windows"); } ?> +--INI-- +date.timezone = UTC --FILE-- Date: Fri, 23 Aug 2013 08:13:59 -0700 Subject: [PATCH 021/400] Update NEWS --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index 1218c5069aba8..d73cf3e997f95 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,8 @@ PHP NEWS ?? ??? 2013, PHP 5.4.20 - Core: + . Fixed bug #65490 (Duplicate calls to get lineno & filename for + DTRACE_FUNCTION_*). (Chris Jones) . Fixed bug #65481 (shutdown segfault due to serialize) (Mike) . Fixed bug #65470 (Segmentation fault in zend_error() with --enable-dtrace). (Chris Jones, Kris Van Hees) From 38f9c515cdee7c7c0e1c204ba24027de04e3936e Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Fri, 23 Aug 2013 08:18:33 -0700 Subject: [PATCH 022/400] Update NEWS --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index 6d62951e75d8c..5ff378b1a94f6 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,8 @@ PHP NEWS ?? ??? 2013, PHP 5.5.4 - Core: + . Fixed bug #65490 (Duplicate calls to get lineno & filename for + DTRACE_FUNCTION_*). (Chris Jones) . 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) From 716fc80fda937bedba786445d6b1854c48af12f8 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Fri, 23 Aug 2013 17:41:07 +0200 Subject: [PATCH 023/400] Suppress static analyzer warnings in specialized executor As things like if(0) will be removed by the compiler, no need to see that tons of warnings with static analyzer enabled. --- Zend/zend_vm_execute.h | 7 +++++++ Zend/zend_vm_gen.php | 20 +++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index a80d9a453ba20..2ba6bfef1d93b 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -20,6 +20,13 @@ #ifdef ZEND_WIN32 # pragma warning(once : 4101) +# pragma warning(once : 6235) +# pragma warning(once : 6237) +# pragma warning(once : 6239) +# pragma warning(once : 6240) +# pragma warning(once : 6285) +# pragma warning(once : 6286) +# pragma warning(once : 6326) #endif static user_opcode_handler_t zend_user_opcode_handlers[256] = { (user_opcode_handler_t)NULL, diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index 9a757114780b5..9b2877b9968f9 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -1189,8 +1189,26 @@ function gen_vm($def, $skel) { // Insert header out($f, $GLOBALS['header_text']); + out($f, "#ifdef ZEND_WIN32\n"); // Suppress free_op1 warnings on Windows - out($f, "#ifdef ZEND_WIN32\n# pragma warning(once : 4101)\n#endif\n"); + out($f, "# pragma warning(once : 4101)\n"); + if (ZEND_VM_SPEC) { + // Suppress ( || ) warnings on windows + out($f, "# pragma warning(once : 6235)\n"); + // Suppress ( && ) warnings on windows + out($f, "# pragma warning(once : 6237)\n"); + // Suppress ( && ) warnings on windows + out($f, "# pragma warning(once : 6239)\n"); + // Suppress ( && ) warnings on windows + out($f, "# pragma warning(once : 6240)\n"); + // Suppress ( || ) warnings on windows + out($f, "# pragma warning(once : 6285)\n"); + // Suppress ( || ) warnings on windows + out($f, "# pragma warning(once : 6286)\n"); + // Suppress constant with constant comparsion warnings on windows + out($f, "# pragma warning(once : 6326)\n"); + } + out($f, "#endif\n"); // Support for ZEND_USER_OPCODE out($f, "static user_opcode_handler_t zend_user_opcode_handlers[256] = {\n"); From f31d6bc0d9c91b04597769f357f0be9ccc527cdd Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Mon, 12 Aug 2013 22:57:06 -0700 Subject: [PATCH 024/400] add mysql settings --- .travis.yml | 9 ++++++++- travis/ext/mysql/setup.sh | 2 +- travis/ext/mysqli/setup.sh | 2 +- travis/ext/pdo_mysql/setup.sh | 2 +- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4d127fe020164..bda282b077dab 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,14 @@ notifications: email: false env: - - REPORT_EXIT_STATUS=1 + global: + - MYSQL_TEST_HOST=127.0.0.1 + - MYSQL_TEST_USER=travis + - PDO_MYSQL_TEST_DSN=mysql:host=127.0.0.1;dbname=test + - PDO_MYSQL_TEST_USER=travis + - PDO_MYSQL_TEST_PASS= + matrix: + - REPORT_EXIT_STATUS=1 before_script: # Compile PHP diff --git a/travis/ext/mysql/setup.sh b/travis/ext/mysql/setup.sh index 994fad13766d8..a3ba75cb2d837 100755 --- a/travis/ext/mysql/setup.sh +++ b/travis/ext/mysql/setup.sh @@ -1,2 +1,2 @@ #!/bin/bash -mysql -u root -e "CREATE DATABASE IF NOT EXISTS test" +mysql -e "CREATE DATABASE IF NOT EXISTS test" diff --git a/travis/ext/mysqli/setup.sh b/travis/ext/mysqli/setup.sh index 994fad13766d8..a3ba75cb2d837 100755 --- a/travis/ext/mysqli/setup.sh +++ b/travis/ext/mysqli/setup.sh @@ -1,2 +1,2 @@ #!/bin/bash -mysql -u root -e "CREATE DATABASE IF NOT EXISTS test" +mysql -e "CREATE DATABASE IF NOT EXISTS test" diff --git a/travis/ext/pdo_mysql/setup.sh b/travis/ext/pdo_mysql/setup.sh index 994fad13766d8..a3ba75cb2d837 100755 --- a/travis/ext/pdo_mysql/setup.sh +++ b/travis/ext/pdo_mysql/setup.sh @@ -1,2 +1,2 @@ #!/bin/bash -mysql -u root -e "CREATE DATABASE IF NOT EXISTS test" +mysql -e "CREATE DATABASE IF NOT EXISTS test" From f57a722c8539434e56e301469d9bf580897a6de5 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Tue, 13 Aug 2013 00:17:21 -0700 Subject: [PATCH 025/400] add openssl --- travis/compile.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/travis/compile.sh b/travis/compile.sh index a56db63c127a0..2b53099651c30 100755 --- a/travis/compile.sh +++ b/travis/compile.sh @@ -33,5 +33,6 @@ --with-gettext \ --enable-sockets \ --with-bz2 \ +--with-openssl \ --enable-bcmath make --quiet From 817eebc733ab64852534b33bdd2868fae2c1a1d8 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Tue, 13 Aug 2013 09:01:17 -0700 Subject: [PATCH 026/400] fix mysql init --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index bda282b077dab..b614940631e4d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,7 @@ env: global: - MYSQL_TEST_HOST=127.0.0.1 - MYSQL_TEST_USER=travis - - PDO_MYSQL_TEST_DSN=mysql:host=127.0.0.1;dbname=test + - PDO_MYSQL_TEST_DSN="mysql:host=127.0.0.1;dbname=test" - PDO_MYSQL_TEST_USER=travis - PDO_MYSQL_TEST_PASS= matrix: From 3f9af558e78c9904f72933dfb3c735a9d2119b52 Mon Sep 17 00:00:00 2001 From: Michael M Slusarz Date: Tue, 20 Aug 2013 01:07:26 -0600 Subject: [PATCH 027/400] Fix #65483: quoted-printable encode stream filter incorrectly encoding spaces --- NEWS | 2 ++ ext/standard/filters.c | 4 +++- ext/standard/tests/streams/bug65483.phpt | 19 +++++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 ext/standard/tests/streams/bug65483.phpt diff --git a/NEWS b/NEWS index d73cf3e997f95..ef046fd794415 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,8 @@ PHP NEWS - Core: . 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 #65481 (shutdown segfault due to serialize) (Mike) . Fixed bug #65470 (Segmentation fault in zend_error() with --enable-dtrace). (Chris Jones, Kris Van Hees) diff --git a/ext/standard/filters.c b/ext/standard/filters.c index 0a59039635881..15dae1bee69d7 100644 --- a/ext/standard/filters.c +++ b/ext/standard/filters.c @@ -951,7 +951,9 @@ static php_conv_err_t php_conv_qprint_encode_convert(php_conv_qprint_encode *ins *(pd++) = qp_digits[(c & 0x0f)]; ocnt -= 3; line_ccnt -= 3; - trail_ws--; + if (trail_ws > 0) { + trail_ws--; + } CONSUME_CHAR(ps, icnt, lb_ptr, lb_cnt); } } diff --git a/ext/standard/tests/streams/bug65483.phpt b/ext/standard/tests/streams/bug65483.phpt new file mode 100644 index 0000000000000..d214bbbbcc4a4 --- /dev/null +++ b/ext/standard/tests/streams/bug65483.phpt @@ -0,0 +1,19 @@ +--TEST-- +Bug #65483: quoted-printable encode stream filter incorrectly encoding spaces +--FILE-- + +--EXPECT-- +string(9) "a b=3Dc d" From 2139d2702d26e62f220f24e268d8ea1e09a9ee64 Mon Sep 17 00:00:00 2001 From: Joey Smith Date: Thu, 13 Sep 2012 12:37:48 -0600 Subject: [PATCH 028/400] Expose fputcsv's escape_char to userland Allows users to assert that something other than the backslash should be considered an escape char; also follows the RFC 4180 recommendation that fields containing a " be enclosed. --- NEWS | 1 + UPGRADING | 3 + ext/standard/file.c | 34 ++++-- ext/standard/tests/file/fputcsv_error.phpt | 2 +- .../tests/file/fputcsv_variation15.phpt | 107 ++++++++++++++++++ 5 files changed, 135 insertions(+), 12 deletions(-) create mode 100755 ext/standard/tests/file/fputcsv_variation15.phpt diff --git a/NEWS b/NEWS index d0843d6dd4c68..d5c5b8e3fe3e2 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,7 @@ PHP NEWS ?? ??? 2013, PHP 5.5.4 - Core: + . 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 diff --git a/UPGRADING b/UPGRADING index eb3bf999a490c..39fe2d736929f 100755 --- a/UPGRADING +++ b/UPGRADING @@ -186,6 +186,9 @@ PHP 5.5 UPGRADE NOTES 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. + ======================================== 5. New Functions ======================================== diff --git a/ext/standard/file.c b/ext/standard/file.c index 106f5c1004ec9..ad6bdad34f2ed 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -818,7 +818,7 @@ PHP_FUNCTION(tempnam) if (p_len > 64) { p[63] = '\0'; } - + RETVAL_FALSE; if ((fd = php_open_temporary_fd_ex(dir, p, &opened_path, 1 TSRMLS_CC)) >= 0) { @@ -1380,13 +1380,13 @@ PHP_FUNCTION(umask) { long arg1 = 0; int oldumask; - + oldumask = umask(077); if (BG(umask) == -1) { BG(umask) = oldumask; } - + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &arg1) == FAILURE) { RETURN_FALSE; } @@ -1799,22 +1799,23 @@ static const char *php_fgetcsv_lookup_trailing_spaces(const char *ptr, size_t le #define FPUTCSV_FLD_CHK(c) memchr(Z_STRVAL(field), c, Z_STRLEN(field)) -/* {{{ proto int fputcsv(resource fp, array fields [, string delimiter [, string enclosure]]) +/* {{{ proto int fputcsv(resource fp, array fields [, string delimiter [, string enclosure [, string escape_char]]]) Format line as CSV and write to file pointer */ PHP_FUNCTION(fputcsv) { - char delimiter = ','; /* allow this to be set as parameter */ - char enclosure = '"'; /* allow this to be set as parameter */ - const char escape_char = '\\'; + char delimiter = ','; /* allow this to be set as parameter */ + char enclosure = '"'; /* allow this to be set as parameter */ + char escape_char = '\\'; /* allow this to be set as parameter */ php_stream *stream; zval *fp = NULL, *fields = NULL; int ret; - char *delimiter_str = NULL, *enclosure_str = NULL; - int delimiter_str_len = 0, enclosure_str_len = 0; + char *delimiter_str = NULL, *enclosure_str = NULL, *escape_str = NULL; + int delimiter_str_len = 0, enclosure_str_len = 0, escape_str_len = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ra|ss", + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ra|sss", &fp, &fields, &delimiter_str, &delimiter_str_len, - &enclosure_str, &enclosure_str_len) == FAILURE) { + &enclosure_str, &enclosure_str_len, + &escape_str, &escape_str_len) == FAILURE) { return; } @@ -1842,6 +1843,17 @@ PHP_FUNCTION(fputcsv) enclosure = *enclosure_str; } + if (escape_str != NULL) { + if (escape_str_len < 1) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "escape must be a character"); + RETURN_FALSE; + } else if (escape_str_len > 1) { + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "escape must be a single character"); + } + /* use first character from string */ + escape_char = *escape_str; + } + PHP_STREAM_TO_ZVAL(stream, &fp); ret = php_fputcsv(stream, fields, delimiter, enclosure, escape_char TSRMLS_CC); diff --git a/ext/standard/tests/file/fputcsv_error.phpt b/ext/standard/tests/file/fputcsv_error.phpt index 9403cf446a3df..ebffd454259cf 100644 --- a/ext/standard/tests/file/fputcsv_error.phpt +++ b/ext/standard/tests/file/fputcsv_error.phpt @@ -48,7 +48,7 @@ Warning: fputcsv() expects at least 2 parameters, 0 given in %s on line %d NULL -- Testing fputcsv() with more than expected number of arguments -- -Warning: fputcsv() expects at most 4 parameters, 5 given in %s on line %d +Warning: fputcsv() expects parameter 5 to be string, resource given in %s on line %d NULL -- Testing fputcsv() with invalid arguments -- -- Iteration 1 -- diff --git a/ext/standard/tests/file/fputcsv_variation15.phpt b/ext/standard/tests/file/fputcsv_variation15.phpt new file mode 100755 index 0000000000000..dc4a9e2dbdfe3 --- /dev/null +++ b/ext/standard/tests/file/fputcsv_variation15.phpt @@ -0,0 +1,107 @@ +--TEST-- +various fputcsv() functionality tests +--CREDITS-- +Lee Leathers +--FILE-- + 'aaa,bbb', + 1 => 'aaa,"bbb"', + 2 => '"aaa","bbb"', + 3 => 'aaa,bbb', + 4 => '"aaa",bbb', + 5 => '"aaa", "bbb"', + 6 => ',', + 7 => 'aaa,', + 8 => ',"aaa"', + 9 => '"",""', + 10 => '"""""",', + 11 => '""""",aaa', + 12 => 'aaa,bbb ', + 13 => 'aaa,"bbb "', + 14 => 'aaa"aaa","bbb"bbb', + 15 => 'aaa"aaa""",bbb', + 16 => 'aaa,"/"bbb,ccc', + 17 => 'aaa"/"a","bbb"', + 18 => '"/"","aaa"', + 19 => '"/""",aaa', +); + +$file = dirname(__FILE__) . 'fgetcsv.csv'; +@unlink($file); + +$fp = fopen($file, "w"); +foreach ($list as $v) { + fputcsv($fp, explode(',', $v), ',', '"', '/'); +} +fclose($fp); + +$res = file($file); +foreach($res as &$val) +{ + $val = substr($val, 0, -1); +} +echo '$list = ';var_export($res);echo ";\n"; + +$fp = fopen($file, "r"); +$res = array(); +while($l=fgetcsv($fp, 0, ',', '"', '/')) +{ + $res[] = join(',',$l); +} +fclose($fp); + +echo '$list = ';var_export($res);echo ";\n"; + +@unlink($file); + +?> +===DONE=== + +--EXPECT-- +$list = array ( + 0 => 'aaa,bbb', + 1 => 'aaa,"""bbb"""', + 2 => '"""aaa""","""bbb"""', + 3 => 'aaa,bbb', + 4 => '"""aaa""",bbb', + 5 => '"""aaa"""," ""bbb"""', + 6 => ',', + 7 => 'aaa,', + 8 => ',"""aaa"""', + 9 => '"""""",""""""', + 10 => '"""""""""""""",', + 11 => '"""""""""""",aaa', + 12 => 'aaa,"bbb "', + 13 => 'aaa,"""bbb """', + 14 => '"aaa""aaa""","""bbb""bbb"', + 15 => '"aaa""aaa""""""",bbb', + 16 => 'aaa,"""/"bbb",ccc', + 17 => '"aaa""/"a""","""bbb"""', + 18 => '"""/"""","""aaa"""', + 19 => '"""/"""""",aaa', +); +$list = array ( + 0 => 'aaa,bbb', + 1 => 'aaa,"bbb"', + 2 => '"aaa","bbb"', + 3 => 'aaa,bbb', + 4 => '"aaa",bbb', + 5 => '"aaa", "bbb"', + 6 => ',', + 7 => 'aaa,', + 8 => ',"aaa"', + 9 => '"",""', + 10 => '"""""",', + 11 => '""""",aaa', + 12 => 'aaa,bbb ', + 13 => 'aaa,"bbb "', + 14 => 'aaa"aaa","bbb"bbb', + 15 => 'aaa"aaa""",bbb', + 16 => 'aaa,"/"bbb,ccc', + 17 => 'aaa"/"a","bbb"', + 18 => '"/"","aaa"', + 19 => '"/""",aaa', +); +===DONE=== From 6b8dade6dc7709cbd890b3e7bbf447c6bb241637 Mon Sep 17 00:00:00 2001 From: Ole Markus With Date: Thu, 22 Aug 2013 08:59:33 +0200 Subject: [PATCH 029/400] Stricter libc-client symlink check --- ext/imap/config.m4 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/imap/config.m4 b/ext/imap/config.m4 index 3ad7c107ddac1..d4dcd4c8adc02 100644 --- a/ext/imap/config.m4 +++ b/ext/imap/config.m4 @@ -198,9 +198,9 @@ if test "$PHP_IMAP" != "no"; then AC_MSG_ERROR(Cannot find rfc822.h. Please check your c-client installation.) fi - if test -r "$IMAP_DIR/c-client/c-client.a"; then + if test ! -r "$IMAP_DIR/c-client/libc-client.a" && -r "$IMAP_DIR/c-client/c-client.a" ; then ln -s "$IMAP_DIR/c-client/c-client.a" "$IMAP_DIR/c-client/libc-client.a" >/dev/null 2>&1 - elif test -r "$IMAP_DIR/$PHP_LIBDIR/c-client.a"; then + elif test ! -r "$IMAP_DIR/$PHP_LIBDIR/libc-client.a" && -r "$IMAP_DIR/$PHP_LIBDIR/c-client.a"; then ln -s "$IMAP_DIR/$PHP_LIBDIR/c-client.a" "$IMAP_DIR/$PHP_LIBDIR/libc-client.a" >/dev/null 2>&1 fi From e22c139fe09db7e74ad027db49d76921fc1a19fd Mon Sep 17 00:00:00 2001 From: root Date: Fri, 23 Aug 2013 01:06:58 +0000 Subject: [PATCH 030/400] Test extension xmlrpc encode type double and string decode type string and int --- ext/xmlrpc/tests/005.phpt | 47 +++++++++++++++++++++++++++++++++++++++ ext/xmlrpc/tests/006.phpt | 29 ++++++++++++++++++++++++ ext/xmlrpc/tests/007.phpt | 29 ++++++++++++++++++++++++ 3 files changed, 105 insertions(+) create mode 100644 ext/xmlrpc/tests/005.phpt create mode 100644 ext/xmlrpc/tests/006.phpt create mode 100644 ext/xmlrpc/tests/007.phpt diff --git a/ext/xmlrpc/tests/005.phpt b/ext/xmlrpc/tests/005.phpt new file mode 100644 index 0000000000000..613dfde249910 --- /dev/null +++ b/ext/xmlrpc/tests/005.phpt @@ -0,0 +1,47 @@ +--TEST-- +xmlrpc_encode() Simple test encode type double and String + +--CREDITS-- +Michel Araujo +#PHPSP 2013-08-22 + +--SKIPIF-- + + +--FILE-- + + + + + 3.24234 + + + + + + + + -3.24234 + + + + + + + + Is string + + + \ No newline at end of file diff --git a/ext/xmlrpc/tests/006.phpt b/ext/xmlrpc/tests/006.phpt new file mode 100644 index 0000000000000..f33932d5a210f --- /dev/null +++ b/ext/xmlrpc/tests/006.phpt @@ -0,0 +1,29 @@ +--TEST-- +xmlrpc_decode() Simple test decode type string + +--CREDITS-- +Michel Araujo +#PHPSP 2013-08-22 + +--SKIPIF-- + + +--FILE-- + + + + + Is string + + + +XML; + +$response = xmlrpc_decode($xml); +echo $response; + +--EXPECT-- +Is string \ No newline at end of file diff --git a/ext/xmlrpc/tests/007.phpt b/ext/xmlrpc/tests/007.phpt new file mode 100644 index 0000000000000..84c15a7d8a36c --- /dev/null +++ b/ext/xmlrpc/tests/007.phpt @@ -0,0 +1,29 @@ +--TEST-- +xmlrpc_decode() Simple test decode type int + +--CREDITS-- +Michel Araujo +#PHPSP 2013-08-22 + +--SKIPIF-- + + +--FILE-- + + + + + 1 + + + +XML; + +$response = xmlrpc_decode($xml); +echo $response; + +--EXPECT-- +1 \ No newline at end of file From b378b0b081c2c3dd4a7aa25ce4d37bad48db752e Mon Sep 17 00:00:00 2001 From: Alexander Moskalev Date: Wed, 10 Apr 2013 00:12:39 +0400 Subject: [PATCH 031/400] Fix DateInterval->days value when object was created not from DateTime::diff() --- ext/date/php_date.c | 6 +++++- ext/date/tests/DateInterval_days_prop1.phpt | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 ext/date/tests/DateInterval_days_prop1.phpt diff --git a/ext/date/php_date.c b/ext/date/php_date.c index f091fed182995..1c97781763553 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -3568,7 +3568,11 @@ zval *date_interval_read_property(zval *object, zval *member, int type, const ze ALLOC_INIT_ZVAL(retval); Z_SET_REFCOUNT_P(retval, 0); - ZVAL_LONG(retval, value); + if (value != -99999) { + ZVAL_LONG(retval, value); + } else { + ZVAL_FALSE(retval); + } if (member == &tmp_member) { zval_dtor(member); diff --git a/ext/date/tests/DateInterval_days_prop1.phpt b/ext/date/tests/DateInterval_days_prop1.phpt new file mode 100644 index 0000000000000..627b8f0b27f32 --- /dev/null +++ b/ext/date/tests/DateInterval_days_prop1.phpt @@ -0,0 +1,10 @@ +--TEST-- +Wrong var_dump(DateInterval->days) value +--FILE-- +days); +--EXPECT-- +bool(false) From a2d8ae9a1fa9704707ac9dcc293de639d4824eab Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sat, 24 Aug 2013 23:14:48 -0700 Subject: [PATCH 032/400] fix mysql tests & mark nextRowset problematic tests --- .travis.yml | 1 + ext/mysql/tests/bug55473.phpt | 8 ++++++++ ext/pdo_mysql/tests/bug_39858.phpt | 2 ++ ext/pdo_mysql/tests/bug_41997.phpt | 2 ++ ext/pdo_mysql/tests/pdo_mysql___construct.phpt | 11 ++++++----- ext/pdo_mysql/tests/pdo_mysql_pconnect.phpt | 4 ++-- ext/pdo_mysql/tests/pdo_mysql_stmt_nextrowset.phpt | 4 +++- .../tests/pdo_mysql_stmt_variable_columncount.phpt | 4 +++- 8 files changed, 27 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index b614940631e4d..d149772e3144c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,6 +14,7 @@ env: - PDO_MYSQL_TEST_DSN="mysql:host=127.0.0.1;dbname=test" - PDO_MYSQL_TEST_USER=travis - PDO_MYSQL_TEST_PASS= + - PDO_MYSQL_TEST_HOST=127.0.0.1 matrix: - REPORT_EXIT_STATUS=1 diff --git a/ext/mysql/tests/bug55473.phpt b/ext/mysql/tests/bug55473.phpt index 1cc2dc928251c..98fd0091dcd16 100644 --- a/ext/mysql/tests/bug55473.phpt +++ b/ext/mysql/tests/bug55473.phpt @@ -69,18 +69,26 @@ mysql.allow_persistent=1 ?> --EXPECTF-- Deprecated: mysql_pconnect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in %s on line %d + +Warning: mysql_ping(): MySQL server has gone away in %s on line %d [003] reconnect 0 Deprecated: mysql_pconnect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in %s on line %d [005] Setting openened files... + +Warning: mysql_ping(): MySQL server has gone away in %s on line %d [003] reconnect 1 Deprecated: mysql_pconnect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in %s on line %d [007] Opened files as expected + +Warning: mysql_ping(): MySQL server has gone away in %s on line %d [003] reconnect 2 Deprecated: mysql_pconnect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in %s on line %d [007] Opened files as expected + +Warning: mysql_ping(): MySQL server has gone away in %s on line %d [003] reconnect 3 Deprecated: mysql_pconnect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in %s on line %d diff --git a/ext/pdo_mysql/tests/bug_39858.phpt b/ext/pdo_mysql/tests/bug_39858.phpt index 47457180a5b60..cb9cafd9f59b6 100644 --- a/ext/pdo_mysql/tests/bug_39858.phpt +++ b/ext/pdo_mysql/tests/bug_39858.phpt @@ -18,6 +18,8 @@ if ($version < 50000) die(sprintf("skip Need MySQL Server 5.0.0+, found %d.%02d.%02d (%d)\n", $matches[0], $matches[1], $matches[2], $version)); ?> +--XFAIL-- +nextRowset() problem with stored proc & emulation mode & mysqlnd --FILE-- fetch(PDO::FETCH_ASSOC); $con1 = $tmp['_con1']; - $db2 = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true)); + @$db2 = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true)); $stmt = $db2->query('SELECT CONNECTION_ID() as _con2'); $tmp = $stmt->fetch(PDO::FETCH_ASSOC); $con2 = $tmp['_con2']; @@ -94,4 +94,4 @@ MySQLPDOTest::skip(); print "done!"; ?> --EXPECTF-- -done! \ No newline at end of file +done! diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_nextrowset.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_nextrowset.phpt index 799624543141d..9165e70551f3e 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_nextrowset.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_nextrowset.phpt @@ -1,5 +1,7 @@ --TEST-- MySQL PDOStatement->nextRowSet() +--XFAIL-- +nextRowset() problem with stored proc & emulation mode & mysqlnd --SKIPIF-- --EXPECTF-- -done! \ No newline at end of file +done! From e6424d89e9419e610ea95484081b9c26b0a7c044 Mon Sep 17 00:00:00 2001 From: gron1987 Date: Wed, 28 Nov 2012 12:19:42 +0200 Subject: [PATCH 033/400] Fix bug #65554 in DateTime, when use it with D/l in format and textual day have dot at the end --- NEWS | 4 + ext/date/lib/parse_date.c | 201 +++++++++--------- ext/date/lib/parse_date.re | 5 +- .../tests/DateTime_fix_createFromFormat.phpt | 29 +++ 4 files changed, 137 insertions(+), 102 deletions(-) create mode 100644 ext/date/tests/DateTime_fix_createFromFormat.phpt diff --git a/NEWS b/NEWS index ef046fd794415..093fa20626c8b 100644 --- a/NEWS +++ b/NEWS @@ -27,6 +27,10 @@ PHP NEWS - 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). + - Openssl: . Fixed bug #64802 (openssl_x509_parse fails to parse subject properly in some cases). (Mark Jones) diff --git a/ext/date/lib/parse_date.c b/ext/date/lib/parse_date.c index 5d43efe1e38bd..2ad4d31edb984 100644 --- a/ext/date/lib/parse_date.c +++ b/ext/date/lib/parse_date.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 on Sun Sep 30 20:14:42 2012 */ +/* Generated by re2c 0.13.5 on Sun Aug 25 14:46:08 2013 */ #line 1 "ext/date/lib/parse_date.re" /* +----------------------------------------------------------------------+ @@ -651,7 +651,8 @@ static const timelib_relunit* timelib_lookup_relunit(char **ptr) char *begin = *ptr, *end; const timelib_relunit *tp, *value = NULL; - while (**ptr != '\0' && **ptr != ' ' && **ptr != ',' && **ptr != '\t') { + while (**ptr != '\0' && **ptr != ' ' && **ptr != ',' && **ptr != '\t' && **ptr != ';' && **ptr != ':' && + **ptr != '/' && **ptr != '.' && **ptr != '-' && **ptr != '(' && **ptr != ')' ) { ++*ptr; } end = *ptr; @@ -871,11 +872,11 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) std: s->tok = cursor; s->len = 0; -#line 997 "ext/date/lib/parse_date.re" +#line 998 "ext/date/lib/parse_date.re" -#line 879 "ext/date/lib/parse_date.c" +#line 880 "ext/date/lib/parse_date.c" { YYCTYPE yych; unsigned int yyaccept = 0; @@ -995,7 +996,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy2: YYDEBUG(2, *YYCURSOR); -#line 1083 "ext/date/lib/parse_date.re" +#line 1084 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("firstdayof | lastdayof"); TIMELIB_INIT; @@ -1011,7 +1012,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_LF_DAY_OF_MONTH; } -#line 1015 "ext/date/lib/parse_date.c" +#line 1016 "ext/date/lib/parse_date.c" yy3: YYDEBUG(3, *YYCURSOR); ++YYCURSOR; @@ -1034,7 +1035,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy4: YYDEBUG(4, *YYCURSOR); -#line 1677 "ext/date/lib/parse_date.re" +#line 1678 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("tzcorrection | tz"); @@ -1047,7 +1048,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_TIMEZONE; } -#line 1051 "ext/date/lib/parse_date.c" +#line 1052 "ext/date/lib/parse_date.c" yy5: YYDEBUG(5, *YYCURSOR); yych = *++YYCURSOR; @@ -1358,12 +1359,12 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) if (yych <= '9') goto yy1385; yy13: YYDEBUG(13, *YYCURSOR); -#line 1772 "ext/date/lib/parse_date.re" +#line 1773 "ext/date/lib/parse_date.re" { add_error(s, "Unexpected character"); goto std; } -#line 1367 "ext/date/lib/parse_date.c" +#line 1368 "ext/date/lib/parse_date.c" yy14: YYDEBUG(14, *YYCURSOR); yych = *++YYCURSOR; @@ -2420,11 +2421,11 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) if (yych <= '9') goto yy55; yy50: YYDEBUG(50, *YYCURSOR); -#line 1761 "ext/date/lib/parse_date.re" +#line 1762 "ext/date/lib/parse_date.re" { goto std; } -#line 2428 "ext/date/lib/parse_date.c" +#line 2429 "ext/date/lib/parse_date.c" yy51: YYDEBUG(51, *YYCURSOR); yych = *++YYCURSOR; @@ -2433,12 +2434,12 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) YYDEBUG(52, *YYCURSOR); ++YYCURSOR; YYDEBUG(53, *YYCURSOR); -#line 1766 "ext/date/lib/parse_date.re" +#line 1767 "ext/date/lib/parse_date.re" { s->pos = cursor; s->line++; goto std; } -#line 2442 "ext/date/lib/parse_date.c" +#line 2443 "ext/date/lib/parse_date.c" yy54: YYDEBUG(54, *YYCURSOR); yych = *++YYCURSOR; @@ -2825,7 +2826,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) if (yych == 's') goto yy74; yy73: YYDEBUG(73, *YYCURSOR); -#line 1745 "ext/date/lib/parse_date.re" +#line 1746 "ext/date/lib/parse_date.re" { timelib_ull i; DEBUG_OUTPUT("relative"); @@ -2840,7 +2841,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 2844 "ext/date/lib/parse_date.c" +#line 2845 "ext/date/lib/parse_date.c" yy74: YYDEBUG(74, *YYCURSOR); yych = *++YYCURSOR; @@ -3602,7 +3603,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy167: YYDEBUG(167, *YYCURSOR); -#line 1608 "ext/date/lib/parse_date.re" +#line 1609 "ext/date/lib/parse_date.re" { const timelib_relunit* relunit; DEBUG_OUTPUT("daytext"); @@ -3619,7 +3620,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_WEEKDAY; } -#line 3623 "ext/date/lib/parse_date.c" +#line 3624 "ext/date/lib/parse_date.c" yy168: YYDEBUG(168, *YYCURSOR); yych = *++YYCURSOR; @@ -4139,7 +4140,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy194: YYDEBUG(194, *YYCURSOR); -#line 1667 "ext/date/lib/parse_date.re" +#line 1668 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("monthtext"); TIMELIB_INIT; @@ -4148,7 +4149,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_DATE_TEXT; } -#line 4152 "ext/date/lib/parse_date.c" +#line 4153 "ext/date/lib/parse_date.c" yy195: YYDEBUG(195, *YYCURSOR); ++YYCURSOR; @@ -4199,7 +4200,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy199: YYDEBUG(199, *YYCURSOR); -#line 1413 "ext/date/lib/parse_date.re" +#line 1414 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("datetextual | datenoyear"); @@ -4212,7 +4213,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_DATE_TEXT; } -#line 4216 "ext/date/lib/parse_date.c" +#line 4217 "ext/date/lib/parse_date.c" yy200: YYDEBUG(200, *YYCURSOR); yyaccept = 6; @@ -4481,7 +4482,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy223: YYDEBUG(223, *YYCURSOR); -#line 1715 "ext/date/lib/parse_date.re" +#line 1716 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("dateshortwithtimeshort | dateshortwithtimelong | dateshortwithtimelongtz"); @@ -4510,7 +4511,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_SHORTDATE_WITH_TIME; } -#line 4514 "ext/date/lib/parse_date.c" +#line 4515 "ext/date/lib/parse_date.c" yy224: YYDEBUG(224, *YYCURSOR); yyaccept = 7; @@ -5208,7 +5209,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) YYDEBUG(278, *YYCURSOR); ++YYCURSOR; YYDEBUG(279, *YYCURSOR); -#line 1691 "ext/date/lib/parse_date.re" +#line 1692 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("dateshortwithtimeshort12 | dateshortwithtimelong12"); TIMELIB_INIT; @@ -5231,7 +5232,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_SHORTDATE_WITH_TIME; } -#line 5235 "ext/date/lib/parse_date.c" +#line 5236 "ext/date/lib/parse_date.c" yy280: YYDEBUG(280, *YYCURSOR); yych = *++YYCURSOR; @@ -5409,7 +5410,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) ++YYCURSOR; yy295: YYDEBUG(295, *YYCURSOR); -#line 1385 "ext/date/lib/parse_date.re" +#line 1386 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("datenoday"); @@ -5422,7 +5423,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_DATE_NO_DAY; } -#line 5426 "ext/date/lib/parse_date.c" +#line 5427 "ext/date/lib/parse_date.c" yy296: YYDEBUG(296, *YYCURSOR); yych = *++YYCURSOR; @@ -6642,7 +6643,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) if (yych <= '9') goto yy365; yy364: YYDEBUG(364, *YYCURSOR); -#line 1529 "ext/date/lib/parse_date.re" +#line 1530 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("pgtextshort"); @@ -6655,7 +6656,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 6659 "ext/date/lib/parse_date.c" +#line 6660 "ext/date/lib/parse_date.c" yy365: YYDEBUG(365, *YYCURSOR); yych = *++YYCURSOR; @@ -7293,7 +7294,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy393: YYDEBUG(393, *YYCURSOR); -#line 1587 "ext/date/lib/parse_date.re" +#line 1588 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("ago"); TIMELIB_INIT; @@ -7313,7 +7314,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_AGO; } -#line 7317 "ext/date/lib/parse_date.c" +#line 7318 "ext/date/lib/parse_date.c" yy394: YYDEBUG(394, *YYCURSOR); yyaccept = 5; @@ -9063,7 +9064,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) ++YYCURSOR; yy455: YYDEBUG(455, *YYCURSOR); -#line 1290 "ext/date/lib/parse_date.re" +#line 1291 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("iso8601date4 | iso8601date2 | iso8601dateslash | dateslash"); TIMELIB_INIT; @@ -9074,7 +9075,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 9078 "ext/date/lib/parse_date.c" +#line 9079 "ext/date/lib/parse_date.c" yy456: YYDEBUG(456, *YYCURSOR); yyaccept = 0; @@ -9634,7 +9635,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy476: YYDEBUG(476, *YYCURSOR); -#line 1427 "ext/date/lib/parse_date.re" +#line 1428 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("datenoyearrev"); TIMELIB_INIT; @@ -9645,7 +9646,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_DATE_TEXT; } -#line 9649 "ext/date/lib/parse_date.c" +#line 9650 "ext/date/lib/parse_date.c" yy477: YYDEBUG(477, *YYCURSOR); yyaccept = 10; @@ -9786,7 +9787,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) YYDEBUG(488, *YYCURSOR); ++YYCURSOR; YYDEBUG(489, *YYCURSOR); -#line 1145 "ext/date/lib/parse_date.re" +#line 1146 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("timetiny12 | timeshort12 | timelong12"); TIMELIB_INIT; @@ -9802,7 +9803,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_TIME12; } -#line 9806 "ext/date/lib/parse_date.c" +#line 9807 "ext/date/lib/parse_date.c" yy490: YYDEBUG(490, *YYCURSOR); yyaccept = 11; @@ -9815,7 +9816,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy491: YYDEBUG(491, *YYCURSOR); -#line 1182 "ext/date/lib/parse_date.re" +#line 1183 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("timeshort24 | timelong24 | iso8601long"); @@ -9840,7 +9841,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_TIME24_WITH_ZONE; } -#line 9844 "ext/date/lib/parse_date.c" +#line 9845 "ext/date/lib/parse_date.c" yy492: YYDEBUG(492, *YYCURSOR); yyaccept = 11; @@ -10150,7 +10151,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) YYDEBUG(523, *YYCURSOR); ++YYCURSOR; YYDEBUG(524, *YYCURSOR); -#line 1162 "ext/date/lib/parse_date.re" +#line 1163 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("mssqltime"); TIMELIB_INIT; @@ -10169,7 +10170,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_TIME24_WITH_ZONE; } -#line 10173 "ext/date/lib/parse_date.c" +#line 10174 "ext/date/lib/parse_date.c" yy525: YYDEBUG(525, *YYCURSOR); yyaccept = 11; @@ -10275,7 +10276,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) if (yych <= '9') goto yy541; yy535: YYDEBUG(535, *YYCURSOR); -#line 1344 "ext/date/lib/parse_date.re" +#line 1345 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("datefull"); @@ -10289,7 +10290,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_DATE_FULL; } -#line 10293 "ext/date/lib/parse_date.c" +#line 10294 "ext/date/lib/parse_date.c" yy536: YYDEBUG(536, *YYCURSOR); yych = *++YYCURSOR; @@ -11026,7 +11027,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) YYDEBUG(606, *YYCURSOR); ++YYCURSOR; YYDEBUG(607, *YYCURSOR); -#line 1359 "ext/date/lib/parse_date.re" +#line 1360 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("pointed date YYYY"); TIMELIB_INIT; @@ -11037,7 +11038,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_DATE_FULL_POINTED; } -#line 11041 "ext/date/lib/parse_date.c" +#line 11042 "ext/date/lib/parse_date.c" yy608: YYDEBUG(608, *YYCURSOR); yyaccept = 11; @@ -11073,7 +11074,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) if (yych <= '9') goto yy605; yy612: YYDEBUG(612, *YYCURSOR); -#line 1371 "ext/date/lib/parse_date.re" +#line 1372 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("pointed date YY"); @@ -11086,7 +11087,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_DATE_FULL_POINTED; } -#line 11090 "ext/date/lib/parse_date.c" +#line 11091 "ext/date/lib/parse_date.c" yy613: YYDEBUG(613, *YYCURSOR); yyaccept = 11; @@ -11727,7 +11728,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy657: YYDEBUG(657, *YYCURSOR); -#line 1330 "ext/date/lib/parse_date.re" +#line 1331 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("gnudateshort"); @@ -11740,7 +11741,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 11744 "ext/date/lib/parse_date.c" +#line 11745 "ext/date/lib/parse_date.c" yy658: YYDEBUG(658, *YYCURSOR); yyaccept = 13; @@ -11846,7 +11847,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy667: YYDEBUG(667, *YYCURSOR); -#line 1274 "ext/date/lib/parse_date.re" +#line 1275 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("americanshort | american"); @@ -11861,7 +11862,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_AMERICAN; } -#line 11865 "ext/date/lib/parse_date.c" +#line 11866 "ext/date/lib/parse_date.c" yy668: YYDEBUG(668, *YYCURSOR); yyaccept = 14; @@ -12094,7 +12095,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) if (yych <= ':') goto yy704; yy701: YYDEBUG(701, *YYCURSOR); -#line 1557 "ext/date/lib/parse_date.re" +#line 1558 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("clf"); @@ -12114,7 +12115,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_CLF; } -#line 12118 "ext/date/lib/parse_date.c" +#line 12119 "ext/date/lib/parse_date.c" yy702: YYDEBUG(702, *YYCURSOR); yych = *++YYCURSOR; @@ -12666,7 +12667,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy764: YYDEBUG(764, *YYCURSOR); -#line 1302 "ext/date/lib/parse_date.re" +#line 1303 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("iso8601date2"); @@ -12679,7 +12680,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 12683 "ext/date/lib/parse_date.c" +#line 12684 "ext/date/lib/parse_date.c" yy765: YYDEBUG(765, *YYCURSOR); yych = *++YYCURSOR; @@ -12718,7 +12719,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) YYDEBUG(771, *YYCURSOR); ++YYCURSOR; YYDEBUG(772, *YYCURSOR); -#line 1543 "ext/date/lib/parse_date.re" +#line 1544 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("pgtextreverse"); @@ -12731,7 +12732,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 12735 "ext/date/lib/parse_date.c" +#line 12736 "ext/date/lib/parse_date.c" yy773: YYDEBUG(773, *YYCURSOR); yych = *++YYCURSOR; @@ -12869,7 +12870,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy784: YYDEBUG(784, *YYCURSOR); -#line 1578 "ext/date/lib/parse_date.re" +#line 1579 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("year4"); TIMELIB_INIT; @@ -12877,7 +12878,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_CLF; } -#line 12881 "ext/date/lib/parse_date.c" +#line 12882 "ext/date/lib/parse_date.c" yy785: YYDEBUG(785, *YYCURSOR); yych = *++YYCURSOR; @@ -13028,7 +13029,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy794: YYDEBUG(794, *YYCURSOR); -#line 1399 "ext/date/lib/parse_date.re" +#line 1400 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("datenodayrev"); @@ -13041,7 +13042,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_DATE_NO_DAY; } -#line 13045 "ext/date/lib/parse_date.c" +#line 13046 "ext/date/lib/parse_date.c" yy795: YYDEBUG(795, *YYCURSOR); yych = *++YYCURSOR; @@ -13256,7 +13257,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) if (yych <= '7') goto yy817; yy815: YYDEBUG(815, *YYCURSOR); -#line 1510 "ext/date/lib/parse_date.re" +#line 1511 "ext/date/lib/parse_date.re" { timelib_sll w, d; DEBUG_OUTPUT("isoweek"); @@ -13274,7 +13275,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 13278 "ext/date/lib/parse_date.c" +#line 13279 "ext/date/lib/parse_date.c" yy816: YYDEBUG(816, *YYCURSOR); yych = *++YYCURSOR; @@ -13284,7 +13285,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) YYDEBUG(817, *YYCURSOR); ++YYCURSOR; YYDEBUG(818, *YYCURSOR); -#line 1491 "ext/date/lib/parse_date.re" +#line 1492 "ext/date/lib/parse_date.re" { timelib_sll w, d; DEBUG_OUTPUT("isoweekday"); @@ -13302,7 +13303,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 13306 "ext/date/lib/parse_date.c" +#line 13307 "ext/date/lib/parse_date.c" yy819: YYDEBUG(819, *YYCURSOR); yych = *++YYCURSOR; @@ -13366,7 +13367,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy822: YYDEBUG(822, *YYCURSOR); -#line 1477 "ext/date/lib/parse_date.re" +#line 1478 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("pgydotd"); @@ -13379,7 +13380,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_PG_YEARDAY; } -#line 13383 "ext/date/lib/parse_date.c" +#line 13384 "ext/date/lib/parse_date.c" yy823: YYDEBUG(823, *YYCURSOR); yych = *++YYCURSOR; @@ -13482,7 +13483,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) ++YYCURSOR; yy843: YYDEBUG(843, *YYCURSOR); -#line 1451 "ext/date/lib/parse_date.re" +#line 1452 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("xmlrpc | xmlrpcnocolon | soap | wddx | exif"); @@ -13507,7 +13508,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_XMLRPC_SOAP; } -#line 13511 "ext/date/lib/parse_date.c" +#line 13512 "ext/date/lib/parse_date.c" yy844: YYDEBUG(844, *YYCURSOR); yych = *++YYCURSOR; @@ -13769,7 +13770,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy849: YYDEBUG(849, *YYCURSOR); -#line 1439 "ext/date/lib/parse_date.re" +#line 1440 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("datenocolon"); TIMELIB_INIT; @@ -13780,7 +13781,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_DATE_NOCOLON; } -#line 13784 "ext/date/lib/parse_date.c" +#line 13785 "ext/date/lib/parse_date.c" yy850: YYDEBUG(850, *YYCURSOR); yych = *++YYCURSOR; @@ -14700,7 +14701,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) if (yych <= '9') goto yy996; yy974: YYDEBUG(974, *YYCURSOR); -#line 1316 "ext/date/lib/parse_date.re" +#line 1317 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("gnudateshorter"); @@ -14713,7 +14714,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 14717 "ext/date/lib/parse_date.c" +#line 14718 "ext/date/lib/parse_date.c" yy975: YYDEBUG(975, *YYCURSOR); yyaccept = 22; @@ -15722,7 +15723,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy1068: YYDEBUG(1068, *YYCURSOR); -#line 1208 "ext/date/lib/parse_date.re" +#line 1209 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("gnunocolon"); TIMELIB_INIT; @@ -15744,7 +15745,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_GNU_NOCOLON; } -#line 15748 "ext/date/lib/parse_date.c" +#line 15749 "ext/date/lib/parse_date.c" yy1069: YYDEBUG(1069, *YYCURSOR); yych = *++YYCURSOR; @@ -15836,7 +15837,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy1076: YYDEBUG(1076, *YYCURSOR); -#line 1254 "ext/date/lib/parse_date.re" +#line 1255 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("iso8601nocolon"); @@ -15855,7 +15856,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_ISO_NOCOLON; } -#line 15859 "ext/date/lib/parse_date.c" +#line 15860 "ext/date/lib/parse_date.c" yy1077: YYDEBUG(1077, *YYCURSOR); yyaccept = 25; @@ -16753,7 +16754,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy1118: YYDEBUG(1118, *YYCURSOR); -#line 1650 "ext/date/lib/parse_date.re" +#line 1651 "ext/date/lib/parse_date.re" { timelib_sll i; int behavior = 0; @@ -16769,7 +16770,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 16773 "ext/date/lib/parse_date.c" +#line 16774 "ext/date/lib/parse_date.c" yy1119: YYDEBUG(1119, *YYCURSOR); ++YYCURSOR; @@ -16820,7 +16821,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) YYDEBUG(1126, *YYCURSOR); ++YYCURSOR; YYDEBUG(1127, *YYCURSOR); -#line 1123 "ext/date/lib/parse_date.re" +#line 1124 "ext/date/lib/parse_date.re" { timelib_sll i; int behavior = 0; @@ -16841,7 +16842,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_WEEK_DAY_OF_MONTH; } -#line 16845 "ext/date/lib/parse_date.c" +#line 16846 "ext/date/lib/parse_date.c" yy1128: YYDEBUG(1128, *YYCURSOR); yyaccept = 26; @@ -16949,7 +16950,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy1142: YYDEBUG(1142, *YYCURSOR); -#line 1626 "ext/date/lib/parse_date.re" +#line 1627 "ext/date/lib/parse_date.re" { timelib_sll i; int behavior = 0; @@ -16972,7 +16973,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 16976 "ext/date/lib/parse_date.c" +#line 16977 "ext/date/lib/parse_date.c" yy1143: YYDEBUG(1143, *YYCURSOR); yych = *++YYCURSOR; @@ -19649,7 +19650,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) goto yy1298; yy1295: YYDEBUG(1295, *YYCURSOR); -#line 1100 "ext/date/lib/parse_date.re" +#line 1101 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("backof | frontof"); TIMELIB_INIT; @@ -19671,7 +19672,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_LF_DAY_OF_MONTH; } -#line 19675 "ext/date/lib/parse_date.c" +#line 19676 "ext/date/lib/parse_date.c" yy1296: YYDEBUG(1296, *YYCURSOR); yyaccept = 28; @@ -21362,7 +21363,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) if (yych <= '9') goto yy1385; yy1387: YYDEBUG(1387, *YYCURSOR); -#line 1057 "ext/date/lib/parse_date.re" +#line 1058 "ext/date/lib/parse_date.re" { timelib_ull i; @@ -21387,7 +21388,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 21391 "ext/date/lib/parse_date.c" +#line 21392 "ext/date/lib/parse_date.c" yy1388: YYDEBUG(1388, *YYCURSOR); yych = *++YYCURSOR; @@ -21823,7 +21824,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) ++YYCURSOR; yy1417: YYDEBUG(1417, *YYCURSOR); -#line 1045 "ext/date/lib/parse_date.re" +#line 1046 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("tomorrow"); TIMELIB_INIT; @@ -21834,7 +21835,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 21838 "ext/date/lib/parse_date.c" +#line 21839 "ext/date/lib/parse_date.c" yy1418: YYDEBUG(1418, *YYCURSOR); yych = *++YYCURSOR; @@ -21869,7 +21870,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy1420: YYDEBUG(1420, *YYCURSOR); -#line 1035 "ext/date/lib/parse_date.re" +#line 1036 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("midnight | today"); TIMELIB_INIT; @@ -21878,7 +21879,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 21882 "ext/date/lib/parse_date.c" +#line 21883 "ext/date/lib/parse_date.c" yy1421: YYDEBUG(1421, *YYCURSOR); yych = *++YYCURSOR; @@ -23890,7 +23891,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy1500: YYDEBUG(1500, *YYCURSOR); -#line 1014 "ext/date/lib/parse_date.re" +#line 1015 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("now"); TIMELIB_INIT; @@ -23898,7 +23899,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 23902 "ext/date/lib/parse_date.c" +#line 23903 "ext/date/lib/parse_date.c" yy1501: YYDEBUG(1501, *YYCURSOR); yych = *++YYCURSOR; @@ -24037,7 +24038,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy1508: YYDEBUG(1508, *YYCURSOR); -#line 1023 "ext/date/lib/parse_date.re" +#line 1024 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("noon"); TIMELIB_INIT; @@ -24048,7 +24049,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 24052 "ext/date/lib/parse_date.c" +#line 24053 "ext/date/lib/parse_date.c" yy1509: YYDEBUG(1509, *YYCURSOR); yyaccept = 0; @@ -24581,7 +24582,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) ++YYCURSOR; yy1531: YYDEBUG(1531, *YYCURSOR); -#line 1002 "ext/date/lib/parse_date.re" +#line 1003 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("yesterday"); TIMELIB_INIT; @@ -24592,7 +24593,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 24596 "ext/date/lib/parse_date.c" +#line 24597 "ext/date/lib/parse_date.c" yy1532: YYDEBUG(1532, *YYCURSOR); yyaccept = 0; @@ -24765,7 +24766,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) goto yy1531; } } -#line 1776 "ext/date/lib/parse_date.re" +#line 1777 "ext/date/lib/parse_date.re" } @@ -25123,7 +25124,7 @@ timelib_time *timelib_parse_from_format(char *format, char *string, int len, tim break; case '\\': /* escaped char */ - *fptr++; + fptr++; if (*ptr == *fptr) { ++ptr; } else { diff --git a/ext/date/lib/parse_date.re b/ext/date/lib/parse_date.re index 8e1972d99f106..f874682ce6922 100644 --- a/ext/date/lib/parse_date.re +++ b/ext/date/lib/parse_date.re @@ -649,7 +649,8 @@ static const timelib_relunit* timelib_lookup_relunit(char **ptr) char *begin = *ptr, *end; const timelib_relunit *tp, *value = NULL; - while (**ptr != '\0' && **ptr != ' ' && **ptr != ',' && **ptr != '\t') { + while (**ptr != '\0' && **ptr != ' ' && **ptr != ',' && **ptr != '\t' && **ptr != ';' && **ptr != ':' && + **ptr != '/' && **ptr != '.' && **ptr != '-' && **ptr != '(' && **ptr != ')' ) { ++*ptr; } end = *ptr; @@ -2130,7 +2131,7 @@ timelib_time *timelib_parse_from_format(char *format, char *string, int len, tim break; case '\\': /* escaped char */ - *fptr++; + fptr++; if (*ptr == *fptr) { ++ptr; } else { diff --git a/ext/date/tests/DateTime_fix_createFromFormat.phpt b/ext/date/tests/DateTime_fix_createFromFormat.phpt new file mode 100644 index 0000000000000..abde292775de4 --- /dev/null +++ b/ext/date/tests/DateTime_fix_createFromFormat.phpt @@ -0,0 +1,29 @@ +--TEST-- +Test fix for DateTime when date have textual day with dot or other special char at end +--FILE-- +format("D., M. j, Y g:iA") . "\n"; +echo "createFromFormat method: " . $fromFormat->format("D., M. j, Y g:iA") . "\n"; + +?> +===DONE=== +--EXPECTF-- +*** Testing clone on DateTime objects *** +Format method: Thu., Nov. 29, 2012 5:00PM +createFromFormat method: Thu., Nov. 29, 2012 5:00PM +===DONE=== From 1c67a9940a7855bf485ae628d739d8c78ac6d1da Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 26 Aug 2013 09:48:10 +0400 Subject: [PATCH 034/400] Fixed compilation warning --- ext/opcache/Optimizer/block_pass.c | 1 - 1 file changed, 1 deletion(-) diff --git a/ext/opcache/Optimizer/block_pass.c b/ext/opcache/Optimizer/block_pass.c index 7f874e7a4b89f..43ae30419fee9 100644 --- a/ext/opcache/Optimizer/block_pass.c +++ b/ext/opcache/Optimizer/block_pass.c @@ -562,7 +562,6 @@ static void strip_nop(zend_code_block *block) { zend_op *opline = block->start_opline; zend_op *end, *new_end; - int new_len = 0; /* remove leading NOPs */ while (block->len > 0 && block->start_opline->opcode == ZEND_NOP) { From d18b9698585820ef0b4adb9efd814d2ca26310a8 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 26 Aug 2013 19:57:14 +0200 Subject: [PATCH 035/400] Evaluate ZVAL_ZVAL arguments only once Also remove some isref/refcount assignments, which are no longer necessary (as ZVAL_COPY_VALUE is used now). --- Zend/zend_API.h | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/Zend/zend_API.h b/Zend/zend_API.h index ecc8d9acd9f43..1a7c66e906d02 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) From 8aca4e45bb26d0e9c43db6d0ed18a0dfb00b978a Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Mon, 26 Aug 2013 14:20:58 -0700 Subject: [PATCH 036/400] Leave it to DTrace FBT to trace underlying library calls --- ext/oci8/oci8.c | 144 ++++++++++++++++----------------- ext/oci8/oci8_collection.c | 70 ++++++++-------- ext/oci8/oci8_dtrace.d | 161 ------------------------------------- ext/oci8/oci8_interface.c | 8 +- ext/oci8/oci8_lob.c | 54 ++++++------- ext/oci8/oci8_statement.c | 94 +++++++++++----------- ext/oci8/php_oci8_int.h | 36 +-------- 7 files changed, 188 insertions(+), 379 deletions(-) diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index ad00c02d72860..f717caa713e64 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -1115,10 +1115,10 @@ static void php_oci_init_global_handles(TSRMLS_D) */ OCICPool *cpoolh; ub4 cpoolmode = 0x80000000; /* Pass invalid mode to OCIConnectionPoolCreate */ - PHP_OCI_CALL(OCIHANDLEALLOC, OCIHandleAlloc, (OCI_G(env), (dvoid **) &cpoolh, OCI_HTYPE_CPOOL, (size_t) 0, (dvoid **) 0)); - PHP_OCI_CALL(OCICONNECTIONPOOLCREATE, OCIConnectionPoolCreate, (OCI_G(env), OCI_G(err), cpoolh, NULL, 0, NULL, 0, 0, 0, 0, NULL, 0, NULL, 0, cpoolmode)); - PHP_OCI_CALL(OCICONNECTIONPOOLDESTROY, OCIConnectionPoolDestroy, (cpoolh, OCI_G(err), OCI_DEFAULT)); - PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, (cpoolh, OCI_HTYPE_CPOOL)); + PHP_OCI_CALL(OCIHandleAlloc, (OCI_G(env), (dvoid **) &cpoolh, OCI_HTYPE_CPOOL, (size_t) 0, (dvoid **) 0)); + PHP_OCI_CALL(OCIConnectionPoolCreate, (OCI_G(env), OCI_G(err), cpoolh, NULL, 0, NULL, 0, 0, 0, 0, NULL, 0, NULL, 0, cpoolmode)); + PHP_OCI_CALL(OCIConnectionPoolDestroy, (cpoolh, OCI_G(err), OCI_DEFAULT)); + PHP_OCI_CALL(OCIHandleFree, (cpoolh, OCI_HTYPE_CPOOL)); #endif } else { OCIErrorGet(OCI_G(env), (ub4)1, NULL, &ora_error_code, tmp_buf, (ub4)OCI_ERROR_MAXMSG_SIZE, (ub4)OCI_HTYPE_ERROR); @@ -1152,12 +1152,12 @@ static void php_oci_init_global_handles(TSRMLS_D) static void php_oci_cleanup_global_handles(TSRMLS_D) { if (OCI_G(err)) { - PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) OCI_G(err), OCI_HTYPE_ERROR)); + PHP_OCI_CALL(OCIHandleFree, ((dvoid *) OCI_G(err), OCI_HTYPE_ERROR)); OCI_G(err) = NULL; } if (OCI_G(env)) { - PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) OCI_G(env), OCI_HTYPE_ENV)); + PHP_OCI_CALL(OCIHandleFree, ((dvoid *) OCI_G(env), OCI_HTYPE_ENV)); OCI_G(env) = NULL; } } @@ -1707,7 +1707,7 @@ sb4 php_oci_fetch_errmsg(OCIError *error_handle, text **error_buf TSRMLS_DC) text err_buf[PHP_OCI_ERRBUF_LEN]; memset(err_buf, 0, sizeof(err_buf)); - PHP_OCI_CALL(OCIERRORGET, OCIErrorGet, (error_handle, (ub4)1, NULL, &error_code, err_buf, (ub4)PHP_OCI_ERRBUF_LEN, (ub4)OCI_HTYPE_ERROR)); + PHP_OCI_CALL(OCIErrorGet, (error_handle, (ub4)1, NULL, &error_code, err_buf, (ub4)PHP_OCI_ERRBUF_LEN, (ub4)OCI_HTYPE_ERROR)); if (error_code) { int err_buf_len = strlen((char *)err_buf); @@ -1734,7 +1734,7 @@ int php_oci_fetch_sqltext_offset(php_oci_statement *statement, text **sqltext, u *sqltext = NULL; *error_offset = 0; - PHP_OCI_CALL_RETURN(OCIATTRGET, errstatus, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (dvoid *) sqltext, (ub4 *)0, OCI_ATTR_STATEMENT, statement->err)); + PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (dvoid *) sqltext, (ub4 *)0, OCI_ATTR_STATEMENT, statement->err)); if (errstatus != OCI_SUCCESS) { statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC); @@ -1742,7 +1742,7 @@ int php_oci_fetch_sqltext_offset(php_oci_statement *statement, text **sqltext, u return 1; } - PHP_OCI_CALL_RETURN(OCIATTRGET, errstatus, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (ub2 *)error_offset, (ub4 *)0, OCI_ATTR_PARSE_ERROR_OFFSET, statement->err)); + PHP_OCI_CALL_RETURN(errstatus, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (ub2 *)error_offset, (ub4 *)0, OCI_ATTR_PARSE_ERROR_OFFSET, statement->err)); if (errstatus != OCI_SUCCESS) { statement->errcode = php_oci_error(statement->err, errstatus TSRMLS_CC); @@ -1904,7 +1904,7 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char smart_str_appendl_ex(&hashed_details, "**", sizeof("**") - 1, 0); if (charset && *charset) { - PHP_OCI_CALL_RETURN(OCINLSCHARSETNAMETOID, charsetid, OCINlsCharSetNameToId, (OCI_G(env), (CONST oratext *)charset)); + PHP_OCI_CALL_RETURN(charsetid, OCINlsCharSetNameToId, (OCI_G(env), (CONST oratext *)charset)); if (!charsetid) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid character set name: %s", charset); } else { @@ -1917,7 +1917,7 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char size_t rsize = 0; sword result; - PHP_OCI_CALL_RETURN(OCINLSENVIRONMENTVARIABLEGET, result, OCINlsEnvironmentVariableGet, (&charsetid_nls_lang, 0, OCI_NLS_CHARSET_ID, 0, &rsize)); + PHP_OCI_CALL_RETURN(result, OCINlsEnvironmentVariableGet, (&charsetid_nls_lang, 0, OCI_NLS_CHARSET_ID, 0, &rsize)); if (result != OCI_SUCCESS) { charsetid_nls_lang = 0; } @@ -2208,11 +2208,11 @@ static int php_oci_connection_ping(php_oci_connection *connection TSRMLS_DC) * 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(OCIPING, OCI_G(errcode), OCIPing, (connection->svc, OCI_G(err), OCI_DEFAULT)); + PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIPing, (connection->svc, OCI_G(err), OCI_DEFAULT)); #else char version[256]; /* use good old OCIServerVersion() */ - PHP_OCI_CALL_RETURN(OCISERVERVERSION, OCI_G(errcode), OCIServerVersion, (connection->svc, OCI_G(err), (text *)version, sizeof(version), OCI_HTYPE_SVCCTX)); + PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIServerVersion, (connection->svc, OCI_G(err), (text *)version, sizeof(version), OCI_HTYPE_SVCCTX)); #endif if (OCI_G(errcode) == OCI_SUCCESS) { @@ -2243,7 +2243,7 @@ static int php_oci_connection_status(php_oci_connection *connection TSRMLS_DC) ub4 ss = 0; /* get OCI_ATTR_SERVER_STATUS */ - PHP_OCI_CALL_RETURN(OCIATTRGET, 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(OCI_G(errcode), 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) { return 1; @@ -2261,7 +2261,7 @@ 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(OCITRANSROLLBACK, connection->errcode, OCITransRollback, (connection->svc, connection->err, (ub4) 0)); + PHP_OCI_CALL_RETURN(connection->errcode, OCITransRollback, (connection->svc, connection->err, (ub4) 0)); connection->rb_on_disconnect = 0; if (connection->errcode != OCI_SUCCESS) { @@ -2279,7 +2279,7 @@ 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(OCITRANSCOMMIT, connection->errcode, OCITransCommit, (connection->svc, connection->err, (ub4) 0)); + PHP_OCI_CALL_RETURN(connection->errcode, OCITransCommit, (connection->svc, connection->err, (ub4) 0)); connection->rb_on_disconnect = 0; if (connection->errcode != OCI_SUCCESS) { @@ -2306,36 +2306,36 @@ static int php_oci_connection_close(php_oci_connection *connection TSRMLS_DC) } if (!connection->using_spool && connection->svc) { - PHP_OCI_CALL(OCISESSIONEND, OCISessionEnd, (connection->svc, connection->err, connection->session, (ub4) 0)); + PHP_OCI_CALL(OCISessionEnd, (connection->svc, connection->err, connection->session, (ub4) 0)); } if (connection->err) { - PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) connection->err, (ub4) OCI_HTYPE_ERROR)); + PHP_OCI_CALL(OCIHandleFree, ((dvoid *) connection->err, (ub4) OCI_HTYPE_ERROR)); } if (connection->authinfo) { - PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) connection->authinfo, (ub4) OCI_HTYPE_AUTHINFO)); + PHP_OCI_CALL(OCIHandleFree, ((dvoid *) connection->authinfo, (ub4) OCI_HTYPE_AUTHINFO)); } /* No Handlefrees for session pool connections */ if (!connection->using_spool) { if (connection->session) { - PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) connection->session, OCI_HTYPE_SESSION)); + PHP_OCI_CALL(OCIHandleFree, ((dvoid *) connection->session, OCI_HTYPE_SESSION)); } if (connection->is_attached) { - PHP_OCI_CALL(OCISERVERDETACH, OCIServerDetach, (connection->server, OCI_G(err), OCI_DEFAULT)); + PHP_OCI_CALL(OCIServerDetach, (connection->server, OCI_G(err), OCI_DEFAULT)); } if (connection->svc) { - PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) connection->svc, (ub4) OCI_HTYPE_SVCCTX)); + PHP_OCI_CALL(OCIHandleFree, ((dvoid *) connection->svc, (ub4) OCI_HTYPE_SVCCTX)); } if (connection->server) { - PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) connection->server, (ub4) OCI_HTYPE_SERVER)); + PHP_OCI_CALL(OCIHandleFree, ((dvoid *) connection->server, (ub4) OCI_HTYPE_SERVER)); } if (connection->env) { - PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) connection->env, OCI_HTYPE_ENV)); + PHP_OCI_CALL(OCIHandleFree, ((dvoid *) connection->env, OCI_HTYPE_ENV)); } } else if (connection->private_spool) { /* Keep this as the last member to be freed, as there are dependencies @@ -2424,7 +2424,7 @@ int php_oci_connection_release(php_oci_connection *connection TSRMLS_DC) #endif if (connection->svc) { - PHP_OCI_CALL(OCISESSIONRELEASE, OCISessionRelease, (connection->svc, connection->err, NULL, + PHP_OCI_CALL(OCISessionRelease, (connection->svc, connection->err, NULL, 0, rlsMode)); } /* It no longer has relation with the database session. However authinfo and env are @@ -2454,7 +2454,7 @@ 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(OCIPASSWORDCHANGE, 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)); + 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)); if (connection->errcode != OCI_SUCCESS) { connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); @@ -2480,7 +2480,7 @@ void php_oci_client_get_version(char **version TSRMLS_DC) sword patch_num = 0; sword port_update_num = 0; - PHP_OCI_CALL(OCICLIENTVERSION, OCIClientVersion, (&major_version, &minor_version, &update_num, &patch_num, &port_update_num)); + 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")); @@ -2497,7 +2497,7 @@ int php_oci_server_get_version(php_oci_connection *connection, char **version TS { char version_buff[256]; - PHP_OCI_CALL_RETURN(OCISERVERVERSION, connection->errcode, OCIServerVersion, (connection->svc, connection->err, (text *)version_buff, sizeof(version_buff), OCI_HTYPE_SVCCTX)); + PHP_OCI_CALL_RETURN(connection->errcode, 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); @@ -2669,7 +2669,7 @@ void php_oci_fetch_row (INTERNAL_FUNCTION_PARAMETERS, int mode, int expected_arg sword errstatus; /* Check for an Implicit Result Set on this statement handle */ - PHP_OCI_CALL_RETURN(OCIATTRGET, errstatus, OCIAttrGet, ((dvoid *)invokedstatement->stmt, OCI_HTYPE_STMT, + 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) { @@ -2822,7 +2822,7 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha } /* Allocate the pool handle */ - PHP_OCI_CALL_RETURN(OCIHANDLEALLOC, OCI_G(errcode), OCIHandleAlloc, (session_pool->env, (dvoid **) &session_pool->poolh, OCI_HTYPE_SPOOL, (size_t) 0, (dvoid **) 0)); + PHP_OCI_CALL_RETURN(OCI_G(errcode), 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); @@ -2834,7 +2834,7 @@ 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(OCIHANDLEALLOC, 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(OCI_G(errcode), 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); @@ -2851,7 +2851,7 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha #if ((OCI_MAJOR_VERSION > 11) || ((OCI_MAJOR_VERSION == 11) && (OCI_MINOR_VERSION >= 2))) /* {{{ Allocate auth handle for session pool */ - PHP_OCI_CALL_RETURN(OCIHANDLEALLOC, OCI_G(errcode), OCIHandleAlloc, (session_pool->env, (dvoid **)&(spoolAuth), OCI_HTYPE_AUTHINFO, 0, NULL)); + PHP_OCI_CALL_RETURN(OCI_G(errcode), 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); @@ -2862,7 +2862,7 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha /* {{{ Set the edition attribute on the auth handle */ if (OCI_G(edition)) { - PHP_OCI_CALL_RETURN(OCIATTRSET, 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(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))); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); @@ -2873,7 +2873,7 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha /* }}} */ /* {{{ Set the driver name attribute on the auth handle */ - PHP_OCI_CALL_RETURN(OCIATTRSET, 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))); + 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))); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); @@ -2883,7 +2883,7 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha /* }}} */ /* {{{ Set the auth handle on the session pool */ - PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode),OCIAttrSet, ((dvoid *) (session_pool->poolh),(ub4) OCI_HTYPE_SPOOL, (dvoid *) spoolAuth, (ub4)0, (ub4)OCI_ATTR_SPOOL_AUTH, OCI_G(err))); + 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))); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); @@ -2896,7 +2896,7 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha /* Create the homogeneous session pool - We have different session pools for every different * username, password, charset and dbname. */ - PHP_OCI_CALL_RETURN(OCISESSIONPOOLCREATE, 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(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)); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); @@ -2910,7 +2910,7 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha } if (spoolAuth) { - PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) spoolAuth, (ub4) OCI_HTYPE_AUTHINFO)); + PHP_OCI_CALL(OCIHandleFree, ((dvoid *) spoolAuth, (ub4) OCI_HTYPE_AUTHINFO)); } #ifdef HAVE_DTRACE @@ -3005,7 +3005,7 @@ static OCIEnv *php_oci_create_env(ub2 charsetid TSRMLS_DC) OCIEnv *retenv = NULL; /* create an environment using the character set id */ - PHP_OCI_CALL_RETURN(OCIENVNLSCREATE, OCI_G(errcode), OCIEnvNlsCreate, (&retenv, OCI_G(events) ? PHP_OCI_INIT_MODE | OCI_EVENTS : PHP_OCI_INIT_MODE, 0, NULL, NULL, NULL, 0, NULL, charsetid, charsetid)); + PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIEnvNlsCreate, (&retenv, OCI_G(events) ? PHP_OCI_INIT_MODE | OCI_EVENTS : PHP_OCI_INIT_MODE, 0, NULL, NULL, NULL, 0, NULL, charsetid, charsetid)); if (OCI_G(errcode) != OCI_SUCCESS) { sb4 ora_error_code = 0; @@ -3043,7 +3043,7 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna } /* {{{ Allocate our server handle */ - PHP_OCI_CALL_RETURN(OCIHANDLEALLOC, OCI_G(errcode), OCIHandleAlloc, (connection->env, (dvoid **)&(connection->server), OCI_HTYPE_SERVER, 0, NULL)); + 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); @@ -3052,7 +3052,7 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna /* }}} */ /* {{{ Attach to the server */ - PHP_OCI_CALL_RETURN(OCISERVERATTACH, OCI_G(errcode), OCIServerAttach, (connection->server, OCI_G(err), (text *)dbname, dbname_len, (ub4) OCI_DEFAULT)); + 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); @@ -3062,7 +3062,7 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna connection->is_attached = 1; /* {{{ Allocate our session handle */ - PHP_OCI_CALL_RETURN(OCIHANDLEALLOC, OCI_G(errcode), OCIHandleAlloc, (connection->env, (dvoid **)&(connection->session), OCI_HTYPE_SESSION, 0, NULL)); + 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); @@ -3071,7 +3071,7 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna /* }}} */ /* {{{ Allocate our private error-handle */ - PHP_OCI_CALL_RETURN(OCIHANDLEALLOC, OCI_G(errcode), OCIHandleAlloc, (connection->env, (dvoid **)&(connection->err), OCI_HTYPE_ERROR, 0, NULL)); + 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); @@ -3080,7 +3080,7 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna /* }}} */ /* {{{ Allocate our service-context */ - PHP_OCI_CALL_RETURN(OCIHANDLEALLOC, OCI_G(errcode), OCIHandleAlloc, (connection->env, (dvoid **)&(connection->svc), OCI_HTYPE_SVCCTX, 0, NULL)); + 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); @@ -3090,7 +3090,7 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna /* {{{ Set the username */ if (username) { - PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) username, (ub4) username_len, (ub4) OCI_ATTR_USERNAME, OCI_G(err))); + 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))); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); @@ -3101,7 +3101,7 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna /* {{{ Set the password */ if (password) { - PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) password, (ub4) password_len, (ub4) OCI_ATTR_PASSWORD, OCI_G(err))); + 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))); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); @@ -3113,7 +3113,7 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna /* {{{ 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(OCIATTRSET, 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))); + 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))); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); @@ -3125,7 +3125,7 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna /* {{{ Set the driver name attribute on the session handle */ #if (OCI_MAJOR_VERSION >= 11) - PHP_OCI_CALL_RETURN(OCIATTRSET, 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))); + 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))); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); @@ -3135,7 +3135,7 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna /* }}} */ /* {{{ Set the server handle in the service handle */ - PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode), OCIAttrSet, (connection->svc, OCI_HTYPE_SVCCTX, connection->server, 0, OCI_ATTR_SERVER, OCI_G(err))); + 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); @@ -3144,7 +3144,7 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna /* }}} */ /* {{{ Set the authentication handle in the service handle */ - PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode), OCIAttrSet, (connection->svc, OCI_HTYPE_SVCCTX, connection->session, 0, OCI_ATTR_SESSION, OCI_G(err))); + 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); @@ -3154,14 +3154,14 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna if (new_password) { /* {{{ Try to change password if new one was provided */ - PHP_OCI_CALL_RETURN(OCIPASSWORDCHANGE, 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)); + 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) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); return 1; } - PHP_OCI_CALL_RETURN(OCIATTRGET, 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))); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); @@ -3180,7 +3180,7 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna session_mode |= OCI_STMT_CACHE; - PHP_OCI_CALL_RETURN(OCISESSIONBEGIN, OCI_G(errcode), OCISessionBegin, (connection->svc, OCI_G(err), connection->session, (ub4) cred_type, (ub4) session_mode)); + PHP_OCI_CALL_RETURN(OCI_G(errcode), OCISessionBegin, (connection->svc, OCI_G(err), connection->session, (ub4) cred_type, (ub4) session_mode)); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); @@ -3200,7 +3200,7 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna return 1; } - PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->svc, (ub4) OCI_HTYPE_SVCCTX, (ub4 *) &statement_cache_size, 0, (ub4) OCI_ATTR_STMTCACHESIZE, OCI_G(err))); + PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->svc, (ub4) OCI_HTYPE_SVCCTX, (ub4 *) &statement_cache_size, 0, (ub4) OCI_ATTR_STMTCACHESIZE, OCI_G(err))); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); @@ -3252,7 +3252,7 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool */ if (!connection->err) { - PHP_OCI_CALL_RETURN(OCIHANDLEALLOC, OCI_G(errcode), OCIHandleAlloc, (connection->env, (dvoid **)&(connection->err), OCI_HTYPE_ERROR, 0, NULL)); + 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); @@ -3262,7 +3262,7 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool /* {{{ Allocate and initialize the connection-private authinfo handle if not allocated yet */ if (!connection->authinfo) { - PHP_OCI_CALL_RETURN(OCIHANDLEALLOC, OCI_G(errcode), OCIHandleAlloc, (connection->env, (dvoid **)&(connection->authinfo), OCI_HTYPE_AUTHINFO, 0, NULL)); + PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIHandleAlloc, (connection->env, (dvoid **)&(connection->authinfo), OCI_HTYPE_AUTHINFO, 0, NULL)); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); @@ -3271,7 +3271,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(OCIATTRSET, 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); @@ -3283,7 +3283,7 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool else purity = OCI_ATTR_PURITY_NEW; - PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode),OCIAttrSet, ((dvoid *) connection->authinfo,(ub4) OCI_HTYPE_AUTHINFO, (dvoid *) &purity, (ub4)0, (ub4)OCI_ATTR_PURITY, OCI_G(err))); + PHP_OCI_CALL_RETURN(OCI_G(errcode),OCIAttrSet, ((dvoid *) connection->authinfo,(ub4) OCI_HTYPE_AUTHINFO, (dvoid *) &purity, (ub4)0, (ub4)OCI_ATTR_PURITY, OCI_G(err))); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); @@ -3297,8 +3297,8 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool #ifdef HAVE_DTRACE if (DTRACE_OCI8_SESSPOOL_STATS_ENABLED()) { ub4 numfree = 0, numbusy = 0, numopen = 0; - PHP_OCI_CALL_RETURN(OCIATTRGET, 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(OCIATTRGET, OCI_G(errcode), OCIAttrGet, ((dvoid *)actual_spool->poolh, OCI_HTYPE_SPOOL, (dvoid *)&numbusy, (ub4 *)0, OCI_ATTR_SPOOL_BUSY_COUNT, OCI_G(err))); + 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 */ DTRACE_OCI8_SESSPOOL_STATS(numfree, numbusy, numopen); } @@ -3313,7 +3313,7 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool */ do { /* Continue to use the global error handle as the connection is closed when an error occurs */ - PHP_OCI_CALL_RETURN(OCISESSIONGET, OCI_G(errcode),OCISessionGet, (connection->env, OCI_G(err), &(connection->svc), (OCIAuthInfo *)connection->authinfo, (OraText *)actual_spool->poolname, (ub4)actual_spool->poolname_len, NULL, 0, NULL, NULL, NULL, OCI_SESSGET_SPOOL)); + PHP_OCI_CALL_RETURN(OCI_G(errcode),OCISessionGet, (connection->env, OCI_G(err), &(connection->svc), (OCIAuthInfo *)connection->authinfo, (OraText *)actual_spool->poolname, (ub4)actual_spool->poolname_len, NULL, 0, NULL, NULL, NULL, OCI_SESSGET_SPOOL)); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); @@ -3328,12 +3328,12 @@ 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(OCIATTRGET, 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->server), (ub4 *)0, OCI_ATTR_SERVER, OCI_G(err))); - PHP_OCI_CALL_RETURN(OCIATTRGET, 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(OCICONTEXTGETVALUE, OCI_G(errcode), OCIContextGetValue, (connection->session, OCI_G(err), (ub1 *)"NEXT_PING", (ub1)sizeof("NEXT_PING"), (void **)&(connection->next_pingp))); + 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) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); return 1; @@ -3351,7 +3351,7 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool *(connection->next_pingp) = timestamp + OCI_G(ping_interval); } else { /* Bad connection - remove from pool */ - PHP_OCI_CALL(OCISESSIONRELEASE, OCISessionRelease, (connection->svc, connection->err, NULL,0, (ub4) OCI_SESSRLS_DROPSESS)); + PHP_OCI_CALL(OCISessionRelease, (connection->svc, connection->err, NULL,0, (ub4) OCI_SESSRLS_DROPSESS)); connection->svc = NULL; connection->server = NULL; connection->session = NULL; @@ -3359,7 +3359,7 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool } /* If ping applicable */ } while (!(connection->svc)); - PHP_OCI_CALL_RETURN(OCIATTRSET, OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->svc, (ub4) OCI_HTYPE_SVCCTX, (ub4 *) &statement_cache_size, 0, (ub4) OCI_ATTR_STMTCACHESIZE, OCI_G(err))); + PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->svc, (ub4) OCI_HTYPE_SVCCTX, (ub4 *) &statement_cache_size, 0, (ub4) OCI_ATTR_STMTCACHESIZE, OCI_G(err))); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); @@ -3397,20 +3397,20 @@ static void php_oci_spool_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC) static void php_oci_spool_close(php_oci_spool *session_pool TSRMLS_DC) { if (session_pool->poolname_len) { - PHP_OCI_CALL(OCISESSIONPOOLDESTROY, OCISessionPoolDestroy, ((dvoid *) session_pool->poolh, + PHP_OCI_CALL(OCISessionPoolDestroy, ((dvoid *) session_pool->poolh, (dvoid *) session_pool->err, OCI_SPD_FORCE)); } if (session_pool->poolh) { - PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) session_pool->poolh, OCI_HTYPE_SPOOL)); + PHP_OCI_CALL(OCIHandleFree, ((dvoid *) session_pool->poolh, OCI_HTYPE_SPOOL)); } if (session_pool->err) { - PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) session_pool->err, OCI_HTYPE_ERROR)); + PHP_OCI_CALL(OCIHandleFree, ((dvoid *) session_pool->err, OCI_HTYPE_ERROR)); } if (session_pool->env) { - PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) session_pool->env, OCI_HTYPE_ENV)); + PHP_OCI_CALL(OCIHandleFree, ((dvoid *) session_pool->env, OCI_HTYPE_ENV)); } if (session_pool->spool_hash_key) { @@ -3431,14 +3431,14 @@ static sword php_oci_ping_init(php_oci_connection *connection, OCIError *errh TS { time_t *next_pingp = NULL; - PHP_OCI_CALL_RETURN(OCICONTEXTGETVALUE, OCI_G(errcode), OCIContextGetValue, (connection->session, errh, (ub1 *)"NEXT_PING", (ub1)sizeof("NEXT_PING"), (void **)&next_pingp)); + PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIContextGetValue, (connection->session, errh, (ub1 *)"NEXT_PING", (ub1)sizeof("NEXT_PING"), (void **)&next_pingp)); if (OCI_G(errcode) != OCI_SUCCESS) { return OCI_G(errcode); } /* This must be a brand-new connection. Allocate memory for the ping */ if (!next_pingp) { - PHP_OCI_CALL_RETURN(OCIMEMORYALLOC, OCI_G(errcode), OCIMemoryAlloc, (connection->session, errh, (void **)&next_pingp, OCI_DURATION_SESSION, sizeof(time_t), OCI_MEMORY_CLEARED)); + PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIMemoryAlloc, (connection->session, errh, (void **)&next_pingp, OCI_DURATION_SESSION, sizeof(time_t), OCI_MEMORY_CLEARED)); if (OCI_G(errcode) != OCI_SUCCESS) { return OCI_G(errcode); } @@ -3452,7 +3452,7 @@ static sword php_oci_ping_init(php_oci_connection *connection, OCIError *errh TS } /* Set the new ping value into the connection */ - PHP_OCI_CALL_RETURN(OCICONTEXTSETVALUE, OCI_G(errcode), OCIContextSetValue, (connection->session, errh, OCI_DURATION_SESSION, (ub1 *)"NEXT_PING", (ub1)sizeof("NEXT_PING"), next_pingp)); + PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIContextSetValue, (connection->session, errh, OCI_DURATION_SESSION, (ub1 *)"NEXT_PING", (ub1)sizeof("NEXT_PING"), next_pingp)); if (OCI_G(errcode) != OCI_SUCCESS) { OCIMemoryFree(connection->session, errh, next_pingp); return OCI_G(errcode); diff --git a/ext/oci8/oci8_collection.c b/ext/oci8/oci8_collection.c index 27430e8823801..4abfbd6cfd58c 100644 --- a/ext/oci8/oci8_collection.c +++ b/ext/oci8/oci8_collection.c @@ -58,7 +58,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c zend_list_addref(collection->connection->id); /* get type handle by name */ - PHP_OCI_CALL_RETURN(OCITYPEBYNAME, connection->errcode, OCITypeByName, + PHP_OCI_CALL_RETURN(connection->errcode, OCITypeByName, ( connection->env, connection->err, @@ -80,14 +80,14 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c } /* allocate describe handle */ - PHP_OCI_CALL_RETURN(OCIHANDLEALLOC, connection->errcode, OCIHandleAlloc, (connection->env, (dvoid **) &dschp1, (ub4) OCI_HTYPE_DESCRIBE, (size_t) 0, (dvoid **) 0)); + PHP_OCI_CALL_RETURN(connection->errcode, OCIHandleAlloc, (connection->env, (dvoid **) &dschp1, (ub4) OCI_HTYPE_DESCRIBE, (size_t) 0, (dvoid **) 0)); if (connection->errcode != OCI_SUCCESS) { goto CLEANUP; } /* describe TDO */ - PHP_OCI_CALL_RETURN(OCIDESCRIBEANY, connection->errcode, OCIDescribeAny, + PHP_OCI_CALL_RETURN(connection->errcode, OCIDescribeAny, ( connection->svc, connection->err, @@ -105,14 +105,14 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c } /* get first parameter handle */ - PHP_OCI_CALL_RETURN(OCIATTRGET, connection->errcode, OCIAttrGet, ((dvoid *) dschp1, (ub4) OCI_HTYPE_DESCRIBE, (dvoid *)&parmp1, (ub4 *)0, (ub4)OCI_ATTR_PARAM, connection->err)); + PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet, ((dvoid *) dschp1, (ub4) OCI_HTYPE_DESCRIBE, (dvoid *)&parmp1, (ub4 *)0, (ub4)OCI_ATTR_PARAM, connection->err)); if (connection->errcode != OCI_SUCCESS) { goto CLEANUP; } /* get the collection type code of the attribute */ - PHP_OCI_CALL_RETURN(OCIATTRGET, connection->errcode, OCIAttrGet, + PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet, ( (dvoid*) parmp1, (ub4) OCI_DTYPE_PARAM, @@ -131,7 +131,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(OCIATTRGET, connection->errcode, OCIAttrGet, + PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet, ( (dvoid*) parmp1, (ub4) OCI_DTYPE_PARAM, @@ -147,7 +147,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c } /* get REF of the TDO for the type */ - PHP_OCI_CALL_RETURN(OCIATTRGET, connection->errcode, OCIAttrGet, + PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet, ( (dvoid*) parmp2, (ub4) OCI_DTYPE_PARAM, @@ -163,7 +163,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c } /* get the TDO (only header) */ - PHP_OCI_CALL_RETURN(OCITYPEBYREF, connection->errcode, OCITypeByRef, + PHP_OCI_CALL_RETURN(connection->errcode, OCITypeByRef, ( connection->env, connection->err, @@ -179,7 +179,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c } /* get typecode */ - PHP_OCI_CALL_RETURN(OCIATTRGET, connection->errcode, OCIAttrGet, + PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet, ( (dvoid*) parmp2, (ub4) OCI_DTYPE_PARAM, @@ -201,7 +201,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c } /* Create object to hold return table */ - PHP_OCI_CALL_RETURN(OCIOBJECTNEW, connection->errcode, OCIObjectNew, + PHP_OCI_CALL_RETURN(connection->errcode, OCIObjectNew, ( connection->env, connection->err, @@ -220,7 +220,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c } /* free the describe handle (Bug #44113) */ - PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) dschp1, OCI_HTYPE_DESCRIBE)); + PHP_OCI_CALL(OCIHandleFree, ((dvoid *) dschp1, OCI_HTYPE_DESCRIBE)); PHP_OCI_REGISTER_RESOURCE(collection, le_collection); return collection; @@ -228,7 +228,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c if (dschp1) { /* free the describe handle (Bug #44113) */ - PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, ((dvoid *) dschp1, OCI_HTYPE_DESCRIBE)); + PHP_OCI_CALL(OCIHandleFree, ((dvoid *) dschp1, OCI_HTYPE_DESCRIBE)); } connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); @@ -243,7 +243,7 @@ int php_oci_collection_size(php_oci_collection *collection, sb4 *size TSRMLS_DC) { php_oci_connection *connection = collection->connection; - PHP_OCI_CALL_RETURN(OCICOLLSIZE, connection->errcode, OCICollSize, (connection->env, connection->err, collection->collection, (sb4 *)size)); + PHP_OCI_CALL_RETURN(connection->errcode, 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); @@ -260,7 +260,7 @@ int php_oci_collection_max(php_oci_collection *collection, long *max TSRMLS_DC) { php_oci_connection *connection = collection->connection; - PHP_OCI_CALL_RETURN(OCICOLLMAX, *max, OCICollMax, (connection->env, collection->collection)); + PHP_OCI_CALL_RETURN(*max, OCICollMax, (connection->env, collection->collection)); /* error handling is not necessary here? */ return 0; @@ -273,7 +273,7 @@ int php_oci_collection_trim(php_oci_collection *collection, long trim_size TSRML { php_oci_connection *connection = collection->connection; - PHP_OCI_CALL_RETURN(OCICOLLTRIM, connection->errcode, OCICollTrim, (connection->env, connection->err, trim_size, collection->collection)); + PHP_OCI_CALL_RETURN(connection->errcode, 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); @@ -292,7 +292,7 @@ int php_oci_collection_append_null(php_oci_collection *collection TSRMLS_DC) php_oci_connection *connection = collection->connection; /* append NULL element */ - PHP_OCI_CALL_RETURN(OCICOLLAPPEND, connection->errcode, OCICollAppend, (connection->env, connection->err, (dvoid *)0, &null_index, collection->collection)); + PHP_OCI_CALL_RETURN(connection->errcode, 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); @@ -312,7 +312,7 @@ int php_oci_collection_append_date(php_oci_collection *collection, char *date, i php_oci_connection *connection = collection->connection; /* format and language are NULLs, so format is "DD-MON-YY" and language is the default language of the session */ - PHP_OCI_CALL_RETURN(OCIDATEFROMTEXT, connection->errcode, OCIDateFromText, (connection->err, (CONST text *)date, date_len, NULL, 0, NULL, 0, &oci_date)); + PHP_OCI_CALL_RETURN(connection->errcode, OCIDateFromText, (connection->err, (CONST text *)date, date_len, NULL, 0, NULL, 0, &oci_date)); if (connection->errcode != OCI_SUCCESS) { /* failed to convert string to date */ @@ -321,7 +321,7 @@ int php_oci_collection_append_date(php_oci_collection *collection, char *date, i return 1; } - PHP_OCI_CALL_RETURN(OCICOLLAPPEND, connection->errcode, OCICollAppend, + PHP_OCI_CALL_RETURN(connection->errcode, OCICollAppend, ( connection->env, connection->err, @@ -358,7 +358,7 @@ int php_oci_collection_append_number(php_oci_collection *collection, char *numbe element_double = zend_strtod(number, NULL); #endif - PHP_OCI_CALL_RETURN(OCINUMBERFROMREAL, connection->errcode, OCINumberFromReal, (connection->err, &element_double, sizeof(double), &oci_number)); + PHP_OCI_CALL_RETURN(connection->errcode, 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); @@ -366,7 +366,7 @@ int php_oci_collection_append_number(php_oci_collection *collection, char *numbe return 1; } - PHP_OCI_CALL_RETURN(OCICOLLAPPEND, connection->errcode, OCICollAppend, + PHP_OCI_CALL_RETURN(connection->errcode, OCICollAppend, ( connection->env, connection->err, @@ -394,7 +394,7 @@ int php_oci_collection_append_string(php_oci_collection *collection, char *eleme OCIString *ocistr = (OCIString *)0; php_oci_connection *connection = collection->connection; - PHP_OCI_CALL_RETURN(OCISTRINGASSIGNTEXT, connection->errcode, OCIStringAssignText, (connection->env, connection->err, (CONST oratext *)element, element_len, &ocistr)); + PHP_OCI_CALL_RETURN(connection->errcode, 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); @@ -402,7 +402,7 @@ int php_oci_collection_append_string(php_oci_collection *collection, char *eleme return 1; } - PHP_OCI_CALL_RETURN(OCICOLLAPPEND, connection->errcode, OCICollAppend, + PHP_OCI_CALL_RETURN(connection->errcode, OCICollAppend, ( connection->env, connection->err, @@ -477,7 +477,7 @@ int php_oci_collection_element_get(php_oci_collection *collection, long index, z MAKE_STD_ZVAL(*result_element); ZVAL_NULL(*result_element); - PHP_OCI_CALL_RETURN(OCICOLLGETELEM, connection->errcode, OCICollGetElem, + PHP_OCI_CALL_RETURN(connection->errcode, OCICollGetElem, ( connection->env, connection->err, @@ -509,7 +509,7 @@ 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(OCIDATETOTEXT, connection->errcode, OCIDateToText, (connection->err, element, 0, 0, 0, 0, &buff_len, buff)); + PHP_OCI_CALL_RETURN(connection->errcode, 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); @@ -529,7 +529,7 @@ int php_oci_collection_element_get(php_oci_collection *collection, long index, z OCIString *oci_string = *(OCIString **)element; text *str; - PHP_OCI_CALL_RETURN(OCISTRINGPTR, str, OCIStringPtr, (connection->env, oci_string)); + PHP_OCI_CALL_RETURN(str, OCIStringPtr, (connection->env, oci_string)); if (str) { ZVAL_STRING(*result_element, (char *)str, 1); @@ -552,7 +552,7 @@ int php_oci_collection_element_get(php_oci_collection *collection, long index, z { double double_number; - PHP_OCI_CALL_RETURN(OCINUMBERTOREAL, connection->errcode, OCINumberToReal, (connection->err, (CONST OCINumber *) element, (uword) sizeof(double), (dvoid *) &double_number)); + PHP_OCI_CALL_RETURN(connection->errcode, 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); @@ -585,7 +585,7 @@ int php_oci_collection_element_set_null(php_oci_collection *collection, long ind php_oci_connection *connection = collection->connection; /* set NULL element */ - PHP_OCI_CALL_RETURN(OCICOLLASSIGNELEM, connection->errcode, OCICollAssignElem, (connection->env, connection->err, (ub4) index, (dvoid *)"", &null_index, collection->collection)); + PHP_OCI_CALL_RETURN(connection->errcode, 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); @@ -605,7 +605,7 @@ int php_oci_collection_element_set_date(php_oci_collection *collection, long ind php_oci_connection *connection = collection->connection; /* format and language are NULLs, so format is "DD-MON-YY" and language is the default language of the session */ - PHP_OCI_CALL_RETURN(OCIDATEFROMTEXT, connection->errcode, OCIDateFromText, (connection->err, (CONST text *)date, date_len, NULL, 0, NULL, 0, &oci_date)); + PHP_OCI_CALL_RETURN(connection->errcode, OCIDateFromText, (connection->err, (CONST text *)date, date_len, NULL, 0, NULL, 0, &oci_date)); if (connection->errcode != OCI_SUCCESS) { /* failed to convert string to date */ @@ -614,7 +614,7 @@ int php_oci_collection_element_set_date(php_oci_collection *collection, long ind return 1; } - PHP_OCI_CALL_RETURN(OCICOLLASSIGNELEM, connection->errcode, OCICollAssignElem, + PHP_OCI_CALL_RETURN(connection->errcode, OCICollAssignElem, ( connection->env, connection->err, @@ -652,7 +652,7 @@ int php_oci_collection_element_set_number(php_oci_collection *collection, long i element_double = zend_strtod(number, NULL); #endif - PHP_OCI_CALL_RETURN(OCINUMBERFROMREAL, connection->errcode, OCINumberFromReal, (connection->err, &element_double, sizeof(double), &oci_number)); + PHP_OCI_CALL_RETURN(connection->errcode, 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); @@ -660,7 +660,7 @@ int php_oci_collection_element_set_number(php_oci_collection *collection, long i return 1; } - PHP_OCI_CALL_RETURN(OCICOLLASSIGNELEM, connection->errcode, OCICollAssignElem, + PHP_OCI_CALL_RETURN(connection->errcode, OCICollAssignElem, ( connection->env, connection->err, @@ -689,7 +689,7 @@ int php_oci_collection_element_set_string(php_oci_collection *collection, long i OCIString *ocistr = (OCIString *)0; php_oci_connection *connection = collection->connection; - PHP_OCI_CALL_RETURN(OCISTRINGASSIGNTEXT, connection->errcode, OCIStringAssignText, (connection->env, connection->err, (CONST oratext *)element, element_len, &ocistr)); + PHP_OCI_CALL_RETURN(connection->errcode, 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); @@ -697,7 +697,7 @@ int php_oci_collection_element_set_string(php_oci_collection *collection, long i return 1; } - PHP_OCI_CALL_RETURN(OCICOLLASSIGNELEM, connection->errcode, OCICollAssignElem, + PHP_OCI_CALL_RETURN(connection->errcode, OCICollAssignElem, ( connection->env, connection->err, @@ -765,7 +765,7 @@ int php_oci_collection_assign(php_oci_collection *collection_dest, php_oci_colle { php_oci_connection *connection = collection_dest->connection; - PHP_OCI_CALL_RETURN(OCICOLLASSIGN, connection->errcode, OCICollAssign, (connection->env, connection->err, collection_from->collection, collection_dest->collection)); + PHP_OCI_CALL_RETURN(connection->errcode, 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); @@ -783,7 +783,7 @@ void php_oci_collection_close(php_oci_collection *collection TSRMLS_DC) php_oci_connection *connection = collection->connection; if (collection->collection) { - PHP_OCI_CALL_RETURN(OCIOBJECTFREE, connection->errcode, OCIObjectFree, (connection->env, connection->err, (dvoid *)collection->collection, (ub2)OCI_OBJECTFREE_FORCE)); + PHP_OCI_CALL_RETURN(connection->errcode, 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); diff --git a/ext/oci8/oci8_dtrace.d b/ext/oci8/oci8_dtrace.d index 61f42ae17c85e..dfb92bc57e91b 100644 --- a/ext/oci8/oci8_dtrace.d +++ b/ext/oci8/oci8_dtrace.d @@ -31,165 +31,4 @@ provider php { 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); - - probe oci8__ociattrget_start(); - probe oci8__ociattrget_done(); - probe oci8__ociattrset_start(); - probe oci8__ociattrset_done(); - probe oci8__ocibindbyname_start(); - probe oci8__ocibindbyname_done(); - probe oci8__ocibinddynamic_start(); - probe oci8__ocibinddynamic_done(); - probe oci8__ocibindobject_start(); - probe oci8__ocibindobject_done(); - probe oci8__ociclientversion_start(); - probe oci8__ociclientversion_done(); - probe oci8__ocicollappend_start(); - probe oci8__ocicollappend_done(); - probe oci8__ocicollassign_start(); - probe oci8__ocicollassign_done(); - probe oci8__ocicollassignelem_start(); - probe oci8__ocicollassignelem_done(); - probe oci8__ocicollgetelem_start(); - probe oci8__ocicollgetelem_done(); - probe oci8__ocicollmax_start(); - probe oci8__ocicollmax_done(); - probe oci8__ocicollsize_start(); - probe oci8__ocicollsize_done(); - probe oci8__ocicolltrim_start(); - probe oci8__ocicolltrim_done(); - probe oci8__ocicontextgetvalue_start(); - probe oci8__ocicontextgetvalue_done(); - probe oci8__ocicontextsetvalue_start(); - probe oci8__ocicontextsetvalue_done(); - probe oci8__ocidatefromtext_start(); - probe oci8__ocidatefromtext_done(); - probe oci8__ocidatetotext_start(); - probe oci8__ocidatetotext_done(); - probe oci8__ocidefinebypos_start(); - probe oci8__ocidefinebypos_done(); - probe oci8__ocidefinedynamic_start(); - probe oci8__ocidefinedynamic_done(); - probe oci8__ocidescribeany_start(); - probe oci8__ocidescribeany_done(); - probe oci8__ocidescriptoralloc_start(); - probe oci8__ocidescriptoralloc_done(); - probe oci8__ocidescriptorfree_start(); - probe oci8__ocidescriptorfree_done(); - probe oci8__ocienvnlscreate_start(); - probe oci8__ocienvnlscreate_done(); - probe oci8__ocierrorget_start(); - probe oci8__ocierrorget_done(); - probe oci8__ocihandlealloc_start(); - probe oci8__ocihandlealloc_done(); - probe oci8__ocihandlefree_start(); - probe oci8__ocihandlefree_done(); - probe oci8__ocilobappend_start(); - probe oci8__ocilobappend_done(); - probe oci8__ocilobcharsetid_start(); - probe oci8__ocilobcharsetid_done(); - probe oci8__ocilobclose_start(); - probe oci8__ocilobclose_done(); - probe oci8__ocilobcopy_start(); - probe oci8__ocilobcopy_done(); - probe oci8__ocilobcreatetemporary_start(); - probe oci8__ocilobcreatetemporary_done(); - probe oci8__ocilobdisablebuffering_start(); - probe oci8__ocilobdisablebuffering_done(); - probe oci8__ocilobenablebuffering_start(); - probe oci8__ocilobenablebuffering_done(); - probe oci8__ociloberase_start(); - probe oci8__ociloberase_done(); - probe oci8__ocilobfileclose_start(); - probe oci8__ocilobfileclose_done(); - probe oci8__ocilobfileopen_start(); - probe oci8__ocilobfileopen_done(); - probe oci8__ocilobflushbuffer_start(); - probe oci8__ocilobflushbuffer_done(); - probe oci8__ocilobfreetemporary_start(); - probe oci8__ocilobfreetemporary_done(); - probe oci8__ocilobgetchunksize_start(); - probe oci8__ocilobgetchunksize_done(); - probe oci8__ocilobgetlength_start(); - probe oci8__ocilobgetlength_done(); - probe oci8__ocilobisequal_start(); - probe oci8__ocilobisequal_done(); - probe oci8__ocilobistemporary_start(); - probe oci8__ocilobistemporary_done(); - probe oci8__ocilobopen_start(); - probe oci8__ocilobopen_done(); - probe oci8__ocilobread2_start(); - probe oci8__ocilobread2_done(); - probe oci8__ocilobtrim_start(); - probe oci8__ocilobtrim_done(); - probe oci8__ocilobwrite_start(); - probe oci8__ocilobwrite_done(); - probe oci8__ocimemoryalloc_start(); - probe oci8__ocimemoryalloc_done(); - probe oci8__ocimemoryfree_start(); - probe oci8__ocimemoryfree_done(); - probe oci8__ocinlscharsetnametoid_start(); - probe oci8__ocinlscharsetnametoid_done(); - probe oci8__ocinlsenvironmentvariableget_start(); - probe oci8__ocinlsenvironmentvariableget_done(); - probe oci8__ocinlsnumericinfoget_start(); - probe oci8__ocinlsnumericinfoget_done(); - probe oci8__ocinumberfromreal_start(); - probe oci8__ocinumberfromreal_done(); - probe oci8__ocinumbertoreal_start(); - probe oci8__ocinumbertoreal_done(); - probe oci8__ociobjectfree_start(); - probe oci8__ociobjectfree_done(); - probe oci8__ociobjectnew_start(); - probe oci8__ociobjectnew_done(); - probe oci8__ociparamget_start(); - probe oci8__ociparamget_done(); - probe oci8__ocipasswordchange_start(); - probe oci8__ocipasswordchange_done(); - probe oci8__ociping_start(); - probe oci8__ociping_done(); - probe oci8__ociserverattach_start(); - probe oci8__ociserverattach_done(); - probe oci8__ociserverdetach_start(); - probe oci8__ociserverdetach_done(); - probe oci8__ociserverversion_start(); - probe oci8__ociserverversion_done(); - probe oci8__ocisessionbegin_start(); - probe oci8__ocisessionbegin_done(); - probe oci8__ocisessionend_start(); - probe oci8__ocisessionend_done(); - probe oci8__ocisessionget_start(); - probe oci8__ocisessionget_done(); - probe oci8__ocisessionpoolcreate_start(); - probe oci8__ocisessionpoolcreate_done(); - probe oci8__ocisessionpooldestroy_start(); - probe oci8__ocisessionpooldestroy_done(); - probe oci8__ocisessionrelease_start(); - probe oci8__ocisessionrelease_done(); - probe oci8__ocistmtexecute_start(); - probe oci8__ocistmtexecute_done(); - probe oci8__ocistmtfetch_start(); - probe oci8__ocistmtfetch_done(); - probe oci8__ocistmtgetnextresult_start(); - probe oci8__ocistmtgetnextresult_done(); - probe oci8__ocistmtgetpieceinfo_start(); - probe oci8__ocistmtgetpieceinfo_done(); - probe oci8__ocistmtprepare2_start(); - probe oci8__ocistmtprepare2_done(); - probe oci8__ocistmtrelease_start(); - probe oci8__ocistmtrelease_done(); - probe oci8__ocistmtsetpieceinfo_start(); - probe oci8__ocistmtsetpieceinfo_done(); - probe oci8__ocistringassigntext_start(); - probe oci8__ocistringassigntext_done(); - probe oci8__ocistringptr_start(); - probe oci8__ocistringptr_done(); - probe oci8__ocitranscommit_start(); - probe oci8__ocitranscommit_done(); - probe oci8__ocitransrollback_start(); - probe oci8__ocitransrollback_done(); - probe oci8__ocitypebyname_start(); - probe oci8__ocitypebyname_done(); - probe oci8__ocitypebyref_start(); - probe oci8__ocitypebyref_done(); }; diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c index 70ec4b5093cfd..aee876d736954 100644 --- a/ext/oci8/oci8_interface.c +++ b/ext/oci8/oci8_interface.c @@ -1771,7 +1771,7 @@ PHP_FUNCTION(oci_set_client_identifier) PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); - PHP_OCI_CALL_RETURN(OCIATTRSET, 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(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))); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); @@ -1829,7 +1829,7 @@ PHP_FUNCTION(oci_set_module_name) PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); - PHP_OCI_CALL_RETURN(OCIATTRSET, 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(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) module, (ub4) module_len, (ub4) OCI_ATTR_MODULE, OCI_G(err))); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); @@ -1860,7 +1860,7 @@ PHP_FUNCTION(oci_set_action) PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); - PHP_OCI_CALL_RETURN(OCIATTRSET, 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(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) action, (ub4) action_len, (ub4) OCI_ATTR_ACTION, OCI_G(err))); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); @@ -1891,7 +1891,7 @@ PHP_FUNCTION(oci_set_client_info) PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); - PHP_OCI_CALL_RETURN(OCIATTRSET, 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(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))); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); diff --git a/ext/oci8/oci8_lob.c b/ext/oci8/oci8_lob.c index bd5b7065f431e..87ce84843f809 100644 --- a/ext/oci8/oci8_lob.c +++ b/ext/oci8/oci8_lob.c @@ -72,7 +72,7 @@ php_oci_descriptor *php_oci_lob_create (php_oci_connection *connection, long typ descriptor->connection = connection; zend_list_addref(descriptor->connection->id); - PHP_OCI_CALL_RETURN(OCIDESCRIPTORALLOC, OCI_G(errcode), OCIDescriptorAlloc, (connection->env, (dvoid*)&(descriptor->descriptor), descriptor->type, (size_t) 0, (dvoid **) 0)); + PHP_OCI_CALL_RETURN(OCI_G(errcode), 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); @@ -125,7 +125,7 @@ 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(OCILOBFILEOPEN, connection->errcode, OCILobFileOpen, (connection->svc, connection->err, descriptor->descriptor, OCI_FILE_READONLY)); + 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_HANDLE_ERROR(connection, connection->errcode); @@ -133,7 +133,7 @@ int php_oci_lob_get_length (php_oci_descriptor *descriptor, ub4 *length TSRMLS_D } } - PHP_OCI_CALL_RETURN(OCILOBGETLENGTH, connection->errcode, OCILobGetLength, (connection->svc, connection->err, descriptor->descriptor, (ub4 *)length)); + PHP_OCI_CALL_RETURN(connection->errcode, 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); @@ -144,7 +144,7 @@ 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(OCILOBFILECLOSE, connection->errcode, OCILobFileClose, (connection->svc, connection->err, descriptor->descriptor)); + PHP_OCI_CALL_RETURN(connection->errcode, OCILobFileClose, (connection->svc, connection->err, descriptor->descriptor)); if (connection->errcode != OCI_SUCCESS) { connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); @@ -217,7 +217,7 @@ static inline int php_oci_lob_calculate_buffer(php_oci_descriptor *descriptor, l } if (!descriptor->chunk_size) { - PHP_OCI_CALL_RETURN(OCILOBGETCHUNKSIZE, connection->errcode, OCILobGetChunkSize, (connection->svc, connection->err, descriptor->descriptor, &chunk_size)); + PHP_OCI_CALL_RETURN(connection->errcode, 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); @@ -289,7 +289,7 @@ 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(OCILOBFILEOPEN, connection->errcode, OCILobFileOpen, (connection->svc, connection->err, descriptor->descriptor, OCI_FILE_READONLY)); + 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); @@ -299,7 +299,7 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini } else { ub2 charset_id = 0; - PHP_OCI_CALL_RETURN(OCILOBCHARSETID, connection->errcode, OCILobCharSetId, (connection->env, connection->err, descriptor->descriptor, &charset_id)); + PHP_OCI_CALL_RETURN(connection->errcode, 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); @@ -313,7 +313,7 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini } if (is_clob) { - PHP_OCI_CALL_RETURN(OCINLSNUMERICINFOGET, connection->errcode, OCINlsNumericInfoGet, (connection->env, connection->err, &bytes_per_char, OCI_NLS_CHARSET_MAXBYTESZ)); + PHP_OCI_CALL_RETURN(connection->errcode, 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); @@ -340,7 +340,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(OCILOBREAD2, connection->errcode, OCILobRead2, + PHP_OCI_CALL_RETURN(connection->errcode, OCILobRead2, ( connection->svc, connection->err, @@ -373,7 +373,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(OCILOBREAD, connection->errcode, OCILobRead, + PHP_OCI_CALL_RETURN(connection->errcode, OCILobRead, ( connection->svc, connection->err, @@ -408,7 +408,7 @@ 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(OCILOBFILECLOSE, connection->errcode, OCILobFileClose, (connection->svc, connection->err, descriptor->descriptor)); + PHP_OCI_CALL_RETURN(connection->errcode, OCILobFileClose, (connection->svc, connection->err, descriptor->descriptor)); if (connection->errcode != OCI_SUCCESS) { connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); @@ -451,7 +451,7 @@ int php_oci_lob_write (php_oci_descriptor *descriptor, ub4 offset, char *data, i offset = descriptor->lob_current_position; } - PHP_OCI_CALL_RETURN(OCILOBWRITE, connection->errcode, OCILobWrite, + PHP_OCI_CALL_RETURN(connection->errcode, OCILobWrite, ( connection->svc, connection->err, @@ -507,9 +507,9 @@ int php_oci_lob_set_buffering (php_oci_descriptor *descriptor, int on_off TSRMLS } if (on_off) { - PHP_OCI_CALL_RETURN(OCILOBENABLEBUFFERING, connection->errcode, OCILobEnableBuffering, (connection->svc, connection->err, descriptor->descriptor)); + PHP_OCI_CALL_RETURN(connection->errcode, OCILobEnableBuffering, (connection->svc, connection->err, descriptor->descriptor)); } else { - PHP_OCI_CALL_RETURN(OCILOBDISABLEBUFFERING, connection->errcode, OCILobDisableBuffering, (connection->svc, connection->err, descriptor->descriptor)); + PHP_OCI_CALL_RETURN(connection->errcode, OCILobDisableBuffering, (connection->svc, connection->err, descriptor->descriptor)); } if (connection->errcode != OCI_SUCCESS) { @@ -560,7 +560,7 @@ int php_oci_lob_copy (php_oci_descriptor *descriptor_dest, php_oci_descriptor *d return 1; } - PHP_OCI_CALL_RETURN(OCILOBCOPY, connection->errcode, OCILobCopy, + PHP_OCI_CALL_RETURN(connection->errcode, OCILobCopy, ( connection->svc, connection->err, @@ -589,7 +589,7 @@ int php_oci_lob_close (php_oci_descriptor *descriptor TSRMLS_DC) php_oci_connection *connection = descriptor->connection; if (descriptor->is_open) { - PHP_OCI_CALL_RETURN(OCILOBCLOSE, connection->errcode, OCILobClose, (connection->svc, connection->err, descriptor->descriptor)); + PHP_OCI_CALL_RETURN(connection->errcode, OCILobClose, (connection->svc, connection->err, descriptor->descriptor)); } if (connection->errcode != OCI_SUCCESS) { @@ -613,7 +613,7 @@ int php_oci_temp_lob_close (php_oci_descriptor *descriptor TSRMLS_DC) php_oci_connection *connection = descriptor->connection; int is_temporary; - PHP_OCI_CALL_RETURN(OCILOBISTEMPORARY, connection->errcode, OCILobIsTemporary, (connection->env,connection->err, descriptor->descriptor, &is_temporary)); + PHP_OCI_CALL_RETURN(connection->errcode, 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); @@ -622,7 +622,7 @@ int php_oci_temp_lob_close (php_oci_descriptor *descriptor TSRMLS_DC) } if (is_temporary) { - PHP_OCI_CALL_RETURN(OCILOBFREETEMPORARY, connection->errcode, OCILobFreeTemporary, (connection->svc, connection->err, descriptor->descriptor)); + PHP_OCI_CALL_RETURN(connection->errcode, OCILobFreeTemporary, (connection->svc, connection->err, descriptor->descriptor)); if (connection->errcode != OCI_SUCCESS) { connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); @@ -663,7 +663,7 @@ int php_oci_lob_flush(php_oci_descriptor *descriptor, long flush_flag TSRMLS_DC) return 0; } - PHP_OCI_CALL_RETURN(OCILOBFLUSHBUFFER, connection->errcode, OCILobFlushBuffer, (connection->svc, connection->err, lob, flush_flag)); + PHP_OCI_CALL_RETURN(connection->errcode, OCILobFlushBuffer, (connection->svc, connection->err, lob, flush_flag)); if (connection->errcode != OCI_SUCCESS) { connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); @@ -717,7 +717,7 @@ void php_oci_lob_free (php_oci_descriptor *descriptor TSRMLS_DC) php_oci_temp_lob_close(descriptor TSRMLS_CC); } - PHP_OCI_CALL(OCIDESCRIPTORFREE, OCIDescriptorFree, (descriptor->descriptor, descriptor->type)); + PHP_OCI_CALL(OCIDescriptorFree, (descriptor->descriptor, descriptor->type)); zend_list_delete(descriptor->connection->id); efree(descriptor); @@ -750,7 +750,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(OCILOBWRITE, connection->errcode, + PHP_OCI_CALL_RETURN(connection->errcode, OCILobWrite, ( connection->svc, @@ -803,7 +803,7 @@ int php_oci_lob_append (php_oci_descriptor *descriptor_dest, php_oci_descriptor return 0; } - PHP_OCI_CALL_RETURN(OCILOBAPPEND, connection->errcode, OCILobAppend, (connection->svc, connection->err, lob_dest, lob_from)); + PHP_OCI_CALL_RETURN(connection->errcode, 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); @@ -840,7 +840,7 @@ int php_oci_lob_truncate (php_oci_descriptor *descriptor, long new_lob_length TS return 1; } - PHP_OCI_CALL_RETURN(OCILOBTRIM, connection->errcode, OCILobTrim, (connection->svc, connection->err, lob, new_lob_length)); + PHP_OCI_CALL_RETURN(connection->errcode, 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); @@ -875,7 +875,7 @@ int php_oci_lob_erase (php_oci_descriptor *descriptor, long offset, ub4 length, length = lob_length; } - PHP_OCI_CALL_RETURN(OCILOBERASE, connection->errcode, OCILobErase, (connection->svc, connection->err, lob, (ub4 *)&length, offset+1)); + PHP_OCI_CALL_RETURN(connection->errcode, 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); @@ -896,7 +896,7 @@ int php_oci_lob_is_equal (php_oci_descriptor *descriptor_first, php_oci_descript OCILobLocator *first_lob = descriptor_first->descriptor; OCILobLocator *second_lob = descriptor_second->descriptor; - PHP_OCI_CALL_RETURN(OCILOBISEQUAL, connection->errcode, OCILobIsEqual, (connection->env, first_lob, second_lob, result)); + PHP_OCI_CALL_RETURN(connection->errcode, OCILobIsEqual, (connection->env, first_lob, second_lob, result)); if (connection->errcode) { connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); @@ -930,7 +930,7 @@ int php_oci_lob_write_tmp (php_oci_descriptor *descriptor, long type, char *data return 1; } - PHP_OCI_CALL_RETURN(OCILOBCREATETEMPORARY, connection->errcode, OCILobCreateTemporary, + PHP_OCI_CALL_RETURN(connection->errcode, OCILobCreateTemporary, ( connection->svc, connection->err, @@ -949,7 +949,7 @@ int php_oci_lob_write_tmp (php_oci_descriptor *descriptor, long type, char *data return 1; } - PHP_OCI_CALL_RETURN(OCILOBOPEN, connection->errcode, OCILobOpen, (connection->svc, connection->err, lob, OCI_LOB_READWRITE)); + PHP_OCI_CALL_RETURN(connection->errcode, OCILobOpen, (connection->svc, connection->err, lob, OCI_LOB_READWRITE)); if (connection->errcode) { connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); diff --git a/ext/oci8/oci8_statement.c b/ext/oci8/oci8_statement.c index feec0568540ea..cf8d23dc882a8 100644 --- a/ext/oci8/oci8_statement.c +++ b/ext/oci8/oci8_statement.c @@ -51,7 +51,7 @@ php_oci_statement *php_oci_statement_create(php_oci_connection *connection, char if (!query_len) { /* do not allocate stmt handle for refcursors, we'll get it from OCIStmtPrepare2() */ - PHP_OCI_CALL(OCIHANDLEALLOC, OCIHandleAlloc, (connection->env, (dvoid **)&(statement->stmt), OCI_HTYPE_STMT, 0, NULL)); + PHP_OCI_CALL(OCIHandleAlloc, (connection->env, (dvoid **)&(statement->stmt), OCI_HTYPE_STMT, 0, NULL)); } else { #ifdef HAVE_DTRACE if (DTRACE_OCI8_SQLTEXT_ENABLED()) { @@ -60,10 +60,10 @@ php_oci_statement *php_oci_statement_create(php_oci_connection *connection, char #endif /* HAVE_DTRACE */ } - PHP_OCI_CALL(OCIHANDLEALLOC, OCIHandleAlloc, (connection->env, (dvoid **)&(statement->err), OCI_HTYPE_ERROR, 0, NULL)); + PHP_OCI_CALL(OCIHandleAlloc, (connection->env, (dvoid **)&(statement->err), OCI_HTYPE_ERROR, 0, NULL)); if (query_len > 0) { - PHP_OCI_CALL_RETURN(OCISTMTPREPARE2, connection->errcode, OCIStmtPrepare2, + PHP_OCI_CALL_RETURN(connection->errcode, OCIStmtPrepare2, ( connection->svc, &(statement->stmt), @@ -79,8 +79,8 @@ php_oci_statement *php_oci_statement_create(php_oci_connection *connection, char if (connection->errcode != OCI_SUCCESS) { connection->errcode = php_oci_error(connection->err, connection->errcode TSRMLS_CC); - PHP_OCI_CALL(OCISTMTRELEASE, OCIStmtRelease, (statement->stmt, statement->err, NULL, 0, statement->errcode ? OCI_STRLS_CACHE_DELETE : OCI_DEFAULT)); - PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree,(statement->err, OCI_HTYPE_ERROR)); + PHP_OCI_CALL(OCIStmtRelease, (statement->stmt, statement->err, NULL, 0, statement->errcode ? OCI_STRLS_CACHE_DELETE : OCI_DEFAULT)); + PHP_OCI_CALL(OCIHandleFree,(statement->err, OCI_HTYPE_ERROR)); efree(statement); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); @@ -132,7 +132,7 @@ php_oci_statement *php_oci_get_implicit_resultset(php_oci_statement *statement T ub4 rtype; php_oci_statement *statement2; /* implicit result set statement handle */ - PHP_OCI_CALL_RETURN(OCISTMTGETNEXTRESULT, statement->errcode, OCIStmtGetNextResult, (statement->stmt, statement->err, &result, &rtype, OCI_DEFAULT)); + PHP_OCI_CALL_RETURN(statement->errcode, OCIStmtGetNextResult, (statement->stmt, statement->err, &result, &rtype, OCI_DEFAULT)); if (statement->errcode == OCI_NO_DATA) { return NULL; } @@ -144,7 +144,7 @@ php_oci_statement *php_oci_get_implicit_resultset(php_oci_statement *statement T } else { statement2 = ecalloc(1,sizeof(php_oci_statement)); - PHP_OCI_CALL(OCIHANDLEALLOC, OCIHandleAlloc, (statement->connection->env, (dvoid **)&(statement2->err), OCI_HTYPE_ERROR, 0, NULL)); + 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; @@ -186,7 +186,7 @@ int php_oci_statement_set_prefetch(php_oci_statement *statement, ub4 prefetch T prefetch = 20000; /* keep it somewhat sane */ } - PHP_OCI_CALL_RETURN(OCIATTRSET, statement->errcode, 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); @@ -249,7 +249,7 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC) zend_hash_apply(statement->columns, (apply_func_t) php_oci_cleanup_pre_fetch TSRMLS_CC); } - PHP_OCI_CALL_RETURN(OCISTMTFETCH, statement->errcode, OCIStmtFetch, (statement->stmt, statement->err, nrows, OCI_FETCH_NEXT, OCI_DEFAULT)); + PHP_OCI_CALL_RETURN(statement->errcode, OCIStmtFetch, (statement->stmt, statement->err, nrows, OCI_FETCH_NEXT, OCI_DEFAULT)); if ( statement->errcode == OCI_NO_DATA || nrows == 0 ) { if (statement->last_query == NULL) { @@ -284,7 +284,7 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC) while (statement->errcode == OCI_NEED_DATA) { if (piecewisecols) { - PHP_OCI_CALL_RETURN(OCISTMTGETPIECEINFO,statement->errcode, + PHP_OCI_CALL_RETURN(statement->errcode, OCIStmtGetPieceInfo, ( statement->stmt, @@ -310,7 +310,7 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC) column->cb_retlen = PHP_OCI_PIECE_SIZE; /* and instruct fetch to fetch waiting piece into our buffer */ - PHP_OCI_CALL(OCISTMTSETPIECEINFO, OCIStmtSetPieceInfo, + PHP_OCI_CALL(OCIStmtSetPieceInfo, ( (void *) column->oci_define, OCI_HTYPE_DEFINE, @@ -326,7 +326,7 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC) } } - PHP_OCI_CALL_RETURN(OCISTMTFETCH, statement->errcode, OCIStmtFetch, (statement->stmt, statement->err, nrows, OCI_FETCH_NEXT, OCI_DEFAULT)); + PHP_OCI_CALL_RETURN(statement->errcode, OCIStmtFetch, (statement->stmt, statement->err, nrows, OCI_FETCH_NEXT, OCI_DEFAULT)); if (piecewisecols) { for (i = 0; i < statement->ncolumns; i++) { @@ -502,7 +502,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) if (!statement->stmttype) { /* get statement type */ - PHP_OCI_CALL_RETURN(OCIATTRGET, statement->errcode, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (ub2 *)&statement->stmttype, (ub4 *)0, OCI_ATTR_STMT_TYPE, statement->err)); + PHP_OCI_CALL_RETURN(statement->errcode, 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); @@ -528,7 +528,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) } /* execute statement */ - PHP_OCI_CALL_RETURN(OCISTMTEXECUTE, statement->errcode, OCIStmtExecute, (statement->connection->svc, statement->stmt, statement->err, iters, 0, NULL, NULL, mode)); + PHP_OCI_CALL_RETURN(statement->errcode, 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); @@ -565,7 +565,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) counter = 1; /* get number of columns */ - PHP_OCI_CALL_RETURN(OCIATTRGET, statement->errcode, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (dvoid *)&colcount, (ub4 *)0, OCI_ATTR_PARAM_COUNT, statement->err)); + PHP_OCI_CALL_RETURN(statement->errcode, 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); @@ -585,7 +585,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) } /* get column */ - PHP_OCI_CALL_RETURN(OCIPARAMGET, statement->errcode, OCIParamGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, statement->err, (dvoid**)¶m, counter)); + PHP_OCI_CALL_RETURN(statement->errcode, 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); @@ -594,40 +594,40 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) } /* get column datatype */ - PHP_OCI_CALL_RETURN(OCIATTRGET, statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->data_type, (ub4 *)0, OCI_ATTR_DATA_TYPE, statement->err)); + PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->data_type, (ub4 *)0, OCI_ATTR_DATA_TYPE, statement->err)); if (statement->errcode != OCI_SUCCESS) { - PHP_OCI_CALL(OCIDESCRIPTORFREE, OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); + PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; } /* get character set form */ - PHP_OCI_CALL_RETURN(OCIATTRGET, statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->charset_form, (ub4 *)0, OCI_ATTR_CHARSET_FORM, statement->err)); + PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->charset_form, (ub4 *)0, OCI_ATTR_CHARSET_FORM, statement->err)); if (statement->errcode != OCI_SUCCESS) { - PHP_OCI_CALL(OCIDESCRIPTORFREE, OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); + PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; } /* get character set id */ - PHP_OCI_CALL_RETURN(OCIATTRGET, statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->charset_id, (ub4 *)0, OCI_ATTR_CHARSET_ID, statement->err)); + PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->charset_id, (ub4 *)0, OCI_ATTR_CHARSET_ID, statement->err)); if (statement->errcode != OCI_SUCCESS) { - PHP_OCI_CALL(OCIDESCRIPTORFREE, OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); + PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; } /* get size of the column */ - PHP_OCI_CALL_RETURN(OCIATTRGET, statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->data_size, (dvoid *)0, OCI_ATTR_DATA_SIZE, statement->err)); + PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->data_size, (dvoid *)0, OCI_ATTR_DATA_SIZE, statement->err)); if (statement->errcode != OCI_SUCCESS) { - PHP_OCI_CALL(OCIDESCRIPTORFREE, OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); + PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; @@ -637,35 +637,35 @@ 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(OCIATTRGET, statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->scale, (dvoid *)0, OCI_ATTR_SCALE, statement->err)); + PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->scale, (dvoid *)0, OCI_ATTR_SCALE, statement->err)); if (statement->errcode != OCI_SUCCESS) { - PHP_OCI_CALL(OCIDESCRIPTORFREE, OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); + PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; } /* get precision of the column */ - PHP_OCI_CALL_RETURN(OCIATTRGET, statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->precision, (dvoid *)0, OCI_ATTR_PRECISION, statement->err)); + PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->precision, (dvoid *)0, OCI_ATTR_PRECISION, statement->err)); if (statement->errcode != OCI_SUCCESS) { - PHP_OCI_CALL(OCIDESCRIPTORFREE, OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); + PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; } /* get name of the column */ - PHP_OCI_CALL_RETURN(OCIATTRGET, statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid **)&colname, (ub4 *)&outcol->name_len, (ub4)OCI_ATTR_NAME, statement->err)); + PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid **)&colname, (ub4 *)&outcol->name_len, (ub4)OCI_ATTR_NAME, statement->err)); if (statement->errcode != OCI_SUCCESS) { - PHP_OCI_CALL(OCIDESCRIPTORFREE, OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); + PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); return 1; } - PHP_OCI_CALL(OCIDESCRIPTORFREE, OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); + PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); outcol->name = estrndup((char*) colname, outcol->name_len); @@ -757,7 +757,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) } if (dynamic == OCI_DYNAMIC_FETCH) { - PHP_OCI_CALL_RETURN(OCIDEFINEBYPOS, statement->errcode, + PHP_OCI_CALL_RETURN(statement->errcode, OCIDefineByPos, ( statement->stmt, /* IN/OUT handle to the requested SQL query */ @@ -775,7 +775,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) ); } else { - PHP_OCI_CALL_RETURN(OCIDEFINEBYPOS, statement->errcode, + PHP_OCI_CALL_RETURN(statement->errcode, OCIDefineByPos, ( statement->stmt, /* IN/OUT handle to the requested SQL query */ @@ -807,7 +807,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(OCIDEFINEDYNAMIC, statement->errcode, + PHP_OCI_CALL_RETURN(statement->errcode, OCIDefineDynamic, ( outcol->oci_define, @@ -840,15 +840,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, 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, statement->errcode ? OCI_STRLS_CACHE_DELETE : OCI_DEFAULT)); } else if (statement->impres_flag != PHP_OCI_IMPRES_IS_CHILD) { /* Oracle doc says don't free Implicit Result Set handles */ - PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, (statement->stmt, OCI_HTYPE_STMT)); + PHP_OCI_CALL(OCIHandleFree, (statement->stmt, OCI_HTYPE_STMT)); } statement->stmt = NULL; } if (statement->err) { - PHP_OCI_CALL(OCIHANDLEFREE, OCIHandleFree, (statement->err, OCI_HTYPE_ERROR)); + PHP_OCI_CALL(OCIHandleFree, (statement->err, OCI_HTYPE_ERROR)); statement->err = NULL; } @@ -1009,7 +1009,7 @@ 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(OCIDATETOTEXT, connection->errcode, OCIDateToText, (connection->err, &(((OCIDate *)(bind->array.elements))[i]), 0, 0, 0, 0, &buff_len, buff)); + PHP_OCI_CALL_RETURN(connection->errcode, OCIDateToText, (connection->err, &(((OCIDate *)(bind->array.elements))[i]), 0, 0, 0, 0, &buff_len, buff)); zval_dtor(*entry); if (connection->errcode != OCI_SUCCESS) { @@ -1021,7 +1021,7 @@ int php_oci_bind_post_exec(void *data TSRMLS_DC) } zend_hash_move_forward(hash); } else { - PHP_OCI_CALL_RETURN(OCIDATETOTEXT, connection->errcode, OCIDateToText, (connection->err, &(((OCIDate *)(bind->array.elements))[i]), 0, 0, 0, 0, &buff_len, buff)); + 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_HANDLE_ERROR(connection, connection->errcode); @@ -1195,7 +1195,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(OCIBINDBYNAME, statement->errcode, + PHP_OCI_CALL_RETURN(statement->errcode, OCIBindByName, ( statement->stmt, /* statement handle */ @@ -1222,7 +1222,7 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, } if (mode == OCI_DATA_AT_EXEC) { - PHP_OCI_CALL_RETURN(OCIBINDDYNAMIC, statement->errcode, OCIBindDynamic, + PHP_OCI_CALL_RETURN(statement->errcode, OCIBindDynamic, ( bindp->bind, statement->err, @@ -1242,7 +1242,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(OCIBINDOBJECT, statement->errcode, OCIBindObject, + PHP_OCI_CALL_RETURN(statement->errcode, OCIBindObject, ( bindp->bind, statement->err, @@ -1449,7 +1449,7 @@ int php_oci_statement_get_type(php_oci_statement *statement, ub2 *type TSRMLS_DC *type = 0; - PHP_OCI_CALL_RETURN(OCIATTRGET, statement->errcode, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (ub2 *)&statement_type, (ub4 *)0, OCI_ATTR_STMT_TYPE, statement->err)); + PHP_OCI_CALL_RETURN(statement->errcode, 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); @@ -1471,7 +1471,7 @@ int php_oci_statement_get_numrows(php_oci_statement *statement, ub4 *numrows TSR *numrows = 0; - PHP_OCI_CALL_RETURN(OCIATTRGET, statement->errcode, OCIAttrGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, (ub4 *)&statement_numrows, (ub4 *)0, OCI_ATTR_ROW_COUNT, statement->err)); + PHP_OCI_CALL_RETURN(statement->errcode, 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); @@ -1553,7 +1553,7 @@ int php_oci_bind_array_by_name(php_oci_statement *statement, char *name, int nam zval_add_ref(&var); - PHP_OCI_CALL_RETURN(OCIBINDBYNAME, statement->errcode, + PHP_OCI_CALL_RETURN(statement->errcode, OCIBindByName, ( statement->stmt, @@ -1762,7 +1762,7 @@ 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(OCIDATEFROMTEXT, 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(connection->errcode, OCIDateFromText, (connection->err, (CONST text *)Z_STRVAL_PP(entry), Z_STRLEN_PP(entry), NULL, 0, NULL, 0, &oci_date)); if (connection->errcode != OCI_SUCCESS) { /* failed to convert string to date */ @@ -1777,7 +1777,7 @@ 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(OCIDATEFROMTEXT, 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(connection->errcode, OCIDateFromText, (connection->err, (CONST text *)"01-JAN-00", sizeof("01-JAN-00")-1, NULL, 0, NULL, 0, &oci_date)); if (connection->errcode != OCI_SUCCESS) { /* failed to convert string to date */ diff --git a/ext/oci8/php_oci8_int.h b/ext/oci8/php_oci8_int.h index d1aa1ae70c6eb..daf649b0cf55b 100644 --- a/ext/oci8/php_oci8_int.h +++ b/ext/oci8/php_oci8_int.h @@ -285,49 +285,19 @@ typedef struct { /* {{{ macros */ -#ifdef HAVE_DTRACE -#define PHP_OCI_CALL(func_uc, func, params) \ - do { \ - if (DTRACE_OCI8_ ## func_uc ## _START_ENABLED()) { \ - DTRACE_OCI8_ ## func_uc ## _START(); \ - } \ - OCI_G(in_call) = 1; \ - func params; \ - OCI_G(in_call) = 0; \ - if (DTRACE_OCI8_ ## func_uc ## _DONE_ENABLED()) { \ - DTRACE_OCI8_ ## func_uc ## _DONE(); \ - } \ - } while (0) -#else /* HAVE_DTRACE */ -#define PHP_OCI_CALL(func_uc, func, params) \ +#define PHP_OCI_CALL(func, params) \ do { \ OCI_G(in_call) = 1; \ func params; \ OCI_G(in_call) = 0; \ } while (0) -#endif /* HAVE_DTRACE */ -#ifdef HAVE_DTRACE -#define PHP_OCI_CALL_RETURN(func_uc, __retval, func, params) \ - do { \ - if (DTRACE_OCI8_ ## func_uc ## _START_ENABLED()) { \ - DTRACE_OCI8_ ## func_uc ## _START(); \ - } \ - OCI_G(in_call) = 1; \ - __retval = func params; \ - OCI_G(in_call) = 0; \ - if (DTRACE_OCI8_ ## func_uc ## _DONE_ENABLED()) { \ - DTRACE_OCI8_ ## func_uc ## _DONE(); \ - } \ - } while (0) -#else /* HAVE_DTRACE */ -#define PHP_OCI_CALL_RETURN(func_uc, __retval, func, params) \ +#define PHP_OCI_CALL_RETURN(__retval, func, params) \ do { \ OCI_G(in_call) = 1; \ __retval = func params; \ OCI_G(in_call) = 0; \ } while (0) -#endif /* HAVE_DTRACE */ /* Check for errors that indicate the connection to the DB is no * longer valid. If it isn't, then the PHP connection is marked to be @@ -370,7 +340,7 @@ typedef struct { default: \ { \ ub4 serverStatus = OCI_SERVER_NORMAL; \ - PHP_OCI_CALL(OCIATTRGET, OCIAttrGet, ((dvoid *)(connection)->server, OCI_HTYPE_SERVER, (dvoid *)&serverStatus, \ + 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) { \ (connection)->is_open = 0; \ From 4b67c781f3fdd93e6a602ee980176720f1ace10e Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Mon, 26 Aug 2013 15:42:57 -0700 Subject: [PATCH 037/400] Use "__" consistently in OCI8 DTrace probe definitions. It maps to "-" in the probe name. --- ext/oci8/oci8_dtrace.d | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/ext/oci8/oci8_dtrace.d b/ext/oci8/oci8_dtrace.d index dfb92bc57e91b..2773f78218134 100644 --- a/ext/oci8/oci8_dtrace.d +++ b/ext/oci8/oci8_dtrace.d @@ -17,18 +17,18 @@ */ provider php { - probe oci8__connect_start(char *username, char *dbname, char *charset, long session_mode, int persistent, int exclusive); - probe oci8__connect_done(); + probe oci8__connect__start(char *username, char *dbname, char *charset, long session_mode, int persistent, int exclusive); + probe oci8__connect__done(); probe oci8__sqltext(char *sql); probe oci8__error(int status, long errcode); - probe oci8__execute_mode(unsigned int mode); + probe oci8__execute__mode(unsigned int mode); - 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, time_t idle_expiry, time_t timestamp); - probe oci8__connect_type(int is_persistent, int exclusive, void *connection, long num_persistent, long num_links); - 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); + 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, time_t idle_expiry, time_t timestamp); + probe oci8__connect__type(int is_persistent, int exclusive, void *connection, long num_persistent, long num_links); + 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); }; From 0119bbba6b97e8657a92b0dc6327b04aad9532e7 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Tue, 27 Aug 2013 15:44:30 +0800 Subject: [PATCH 038/400] Fixed compiler warnings warning: 'local_dval' may be used uninitialized in this function [-Wmaybe-uninitialized] warning: 'dval2' may be used uninitialized in this function [-Wmaybe-uninitialized] --- Zend/zend_operators.c | 4 ++-- Zend/zend_operators.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 88995c46b68d7..5c84deb26850b 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -2138,8 +2138,8 @@ ZEND_API void zendi_smart_strcmp(zval *result, zval *s1, zval *s2) /* {{{ */ { int ret1, ret2; int oflow1, oflow2; - long lval1, lval2; - double dval1, dval2; + long lval1 = 0, lval2 = 0; + double dval1 = 0.0, dval2 = 0.0; if ((ret1=is_numeric_string_ex(Z_STRVAL_P(s1), Z_STRLEN_P(s1), &lval1, &dval1, 0, &oflow1)) && (ret2=is_numeric_string_ex(Z_STRVAL_P(s2), Z_STRLEN_P(s2), &lval2, &dval2, 0, &oflow2))) { diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index 0b890ff48cc56..6e7c1c01df3f7 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -132,7 +132,7 @@ static inline zend_uchar is_numeric_string_ex(const char *str, int length, long { const char *ptr; int base = 10, digits = 0, dp_or_e = 0; - double local_dval; + double local_dval = 0.0; zend_uchar type; if (!length) { From 2438490addfbfba51e12246a74588b2382caa08a Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Wed, 14 Aug 2013 14:42:36 +0200 Subject: [PATCH 039/400] slim post data --- ext/mbstring/mb_gpc.c | 6 +- ext/soap/soap.c | 59 +++++++------- ext/standard/php_fopen_wrapper.c | 62 +++++++-------- main/SAPI.c | 77 ++++++++++--------- main/SAPI.h | 7 +- main/main.c | 1 - main/php_content_types.c | 23 ------ main/php_globals.h | 1 - main/php_streams.h | 2 +- main/php_variables.c | 128 ++++++++++++++++++++++++------- sapi/cli/php_cli_server.c | 3 +- tests/basic/024.phpt | 28 ------- tests/basic/026.phpt | 15 ---- 13 files changed, 205 insertions(+), 207 deletions(-) delete mode 100644 tests/basic/024.phpt delete mode 100644 tests/basic/026.phpt diff --git a/ext/mbstring/mb_gpc.c b/ext/mbstring/mb_gpc.c index 5ecc8f365e8ae..30764dc8076d3 100644 --- a/ext/mbstring/mb_gpc.c +++ b/ext/mbstring/mb_gpc.c @@ -364,6 +364,7 @@ SAPI_POST_HANDLER_FUNC(php_mb_post_handler) { const mbfl_encoding *detected; php_mb_encoding_handler_info_t info; + char *post_data_str = NULL; MBSTRG(http_input_identify_post) = NULL; @@ -376,7 +377,10 @@ SAPI_POST_HANDLER_FUNC(php_mb_post_handler) info.num_from_encodings = MBSTRG(http_input_list_size); info.from_language = MBSTRG(language); - detected = _php_mb_encoding_handler_ex(&info, arg, SG(request_info).post_data TSRMLS_CC); + php_stream_rewind(SG(request_info).request_body); + php_stream_copy_to_mem(SG(request_info).request_body, &post_data_str, PHP_STREAM_COPY_ALL, 0); + detected = _php_mb_encoding_handler_ex(&info, arg, post_data_str TSRMLS_CC); + STR_FREE(post_data_str); MBSTRG(http_input_identify) = detected; if (detected) { diff --git a/ext/soap/soap.c b/ext/soap/soap.c index 00e80efbcbca4..d10c17e218189 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -1560,48 +1560,45 @@ PHP_METHOD(SoapServer, handle) } if (ZEND_NUM_ARGS() == 0) { - if (SG(request_info).raw_post_data) { - char *post_data = SG(request_info).raw_post_data; - int post_data_length = SG(request_info).raw_post_data_length; + if (SG(request_info).request_body && 0 == php_stream_rewind(SG(request_info).request_body)) { zval **server_vars, **encoding; + php_stream_filter *zf = NULL; zend_is_auto_global("_SERVER", sizeof("_SERVER")-1 TSRMLS_CC); if (zend_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void **) &server_vars) == SUCCESS && Z_TYPE_PP(server_vars) == IS_ARRAY && zend_hash_find(Z_ARRVAL_PP(server_vars), "HTTP_CONTENT_ENCODING", sizeof("HTTP_CONTENT_ENCODING"), (void **) &encoding)==SUCCESS && Z_TYPE_PP(encoding) == IS_STRING) { - zval func; - zval retval; - zval param; - zval *params[1]; - - if ((strcmp(Z_STRVAL_PP(encoding),"gzip") == 0 || - strcmp(Z_STRVAL_PP(encoding),"x-gzip") == 0) && - zend_hash_exists(EG(function_table), "gzinflate", sizeof("gzinflate"))) { - ZVAL_STRING(&func, "gzinflate", 0); - params[0] = ¶m; - ZVAL_STRINGL(params[0], post_data+10, post_data_length-10, 0); - INIT_PZVAL(params[0]); - } else if (strcmp(Z_STRVAL_PP(encoding),"deflate") == 0 && - zend_hash_exists(EG(function_table), "gzuncompress", sizeof("gzuncompress"))) { - ZVAL_STRING(&func, "gzuncompress", 0); - params[0] = ¶m; - ZVAL_STRINGL(params[0], post_data, post_data_length, 0); - INIT_PZVAL(params[0]); + + if (strcmp(Z_STRVAL_PP(encoding),"gzip") == 0 + || strcmp(Z_STRVAL_PP(encoding),"x-gzip") == 0 + || strcmp(Z_STRVAL_PP(encoding),"deflate") == 0 + ) { + zval filter_params; + + INIT_PZVAL(&filter_params); + array_init_size(&filter_params, 1); + add_assoc_long_ex(&filter_params, ZEND_STRS("window"), 0x2f); /* ANY WBITS */ + + zf = php_stream_filter_create("zlib.inflate", &filter_params, 0); + zval_dtor(&filter_params); + + if (zf) { + php_stream_filter_append(&SG(request_info).request_body->readfilters, zf); + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING,"Can't uncompress compressed request"); + return; + } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING,"Request is compressed with unknown compression '%s'",Z_STRVAL_PP(encoding)); return; } - if (call_user_function(CG(function_table), (zval**)NULL, &func, &retval, 1, params TSRMLS_CC) == SUCCESS && - Z_TYPE(retval) == IS_STRING) { - doc_request = soap_xmlParseMemory(Z_STRVAL(retval),Z_STRLEN(retval)); - zval_dtor(&retval); - } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING,"Can't uncompress compressed request"); - return; - } - } else { - doc_request = soap_xmlParseMemory(post_data, post_data_length); + } + + doc_request = soap_xmlParseFile("php://input"); + + if (zf) { + php_stream_filter_remove(zf, 1); } } else { zval_ptr_dtor(&retval); diff --git a/ext/standard/php_fopen_wrapper.c b/ext/standard/php_fopen_wrapper.c index 0fb27baacd8e5..ca0b92ebdefc5 100644 --- a/ext/standard/php_fopen_wrapper.c +++ b/ext/standard/php_fopen_wrapper.c @@ -71,43 +71,20 @@ static size_t php_stream_input_write(php_stream *stream, const char *buf, size_t static size_t php_stream_input_read(php_stream *stream, char *buf, size_t count TSRMLS_DC) /* {{{ */ { - off_t *position = (off_t*)stream->abstract; - size_t read_bytes = 0; - - if (!stream->eof) { - if (SG(request_info).raw_post_data) { /* data has already been read by a post handler */ - read_bytes = SG(request_info).raw_post_data_length - *position; - if (read_bytes <= count) { - stream->eof = 1; - } else { - read_bytes = count; - } - if (read_bytes) { - memcpy(buf, SG(request_info).raw_post_data + *position, read_bytes); - } - } else if (sapi_module.read_post) { - read_bytes = sapi_module.read_post(buf, count TSRMLS_CC); - if (read_bytes <= 0) { - stream->eof = 1; - read_bytes = 0; - } - /* Increment SG(read_post_bytes) only when something was actually read. */ - SG(read_post_bytes) += read_bytes; - } else { - stream->eof = 1; - } - } + php_stream *inner = stream->abstract; - *position += read_bytes; + if (inner && inner->ops->read) { + size_t read = inner->ops->read(inner, buf, count TSRMLS_CC); + stream->eof = inner->eof; + return read; + } - return read_bytes; + return -1; } /* }}} */ static int php_stream_input_close(php_stream *stream, int close_handle TSRMLS_DC) /* {{{ */ { - efree(stream->abstract); - return 0; } /* }}} */ @@ -118,13 +95,25 @@ static int php_stream_input_flush(php_stream *stream TSRMLS_DC) /* {{{ */ } /* }}} */ +static int php_stream_input_seek(php_stream *stream, off_t offset, int whence, off_t *newoffset TSRMLS_DC) /* {{{ */ +{ + php_stream *inner = stream->abstract; + + if (inner && inner->ops->seek) { + return inner->ops->seek(inner, offset, whence, newoffset TSRMLS_CC); + } + + return -1; +} +/* }}} */ + php_stream_ops php_stream_input_ops = { php_stream_input_write, php_stream_input_read, php_stream_input_close, php_stream_input_flush, "Input", - NULL, /* seek */ + php_stream_input_seek, NULL, /* cast */ NULL, /* stat */ NULL /* set_option */ @@ -210,7 +199,12 @@ php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, const char *pa } return NULL; } - return php_stream_alloc(&php_stream_input_ops, ecalloc(1, sizeof(off_t)), 0, "rb"); + if (SG(request_info).request_body) { + php_stream_rewind(SG(request_info).request_body); + } else { + sapi_read_standard_form_data(TSRMLS_C); + } + return php_stream_alloc(&php_stream_input_ops, SG(request_info).request_body, 0, "rb"); } if (!strcasecmp(path, "stdin")) { @@ -259,8 +253,8 @@ php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, const char *pa fd = dup(STDERR_FILENO); } } else if (!strncasecmp(path, "fd/", 3)) { - char *start, - *end; + const char *start; + char *end; long fildes_ori; int dtablesize; diff --git a/main/SAPI.c b/main/SAPI.c index dcb2da629a03b..ccfb1e507d85f 100644 --- a/main/SAPI.c +++ b/main/SAPI.c @@ -180,10 +180,10 @@ SAPI_API void sapi_handle_post(void *arg TSRMLS_DC) { if (SG(request_info).post_entry && SG(request_info).content_type_dup) { SG(request_info).post_entry->post_handler(SG(request_info).content_type_dup, arg TSRMLS_CC); - if (SG(request_info).post_data) { - efree(SG(request_info).post_data); - SG(request_info).post_data = NULL; - } + /*if (SG(request_info).request_body) { + php_stream_close(SG(request_info).request_body); + SG(request_info).request_body = NULL; + }*/ efree(SG(request_info).content_type_dup); SG(request_info).content_type_dup = NULL; } @@ -253,35 +253,40 @@ static void sapi_read_post_data(TSRMLS_D) SAPI_API SAPI_POST_READER_FUNC(sapi_read_standard_form_data) { int read_bytes; - int allocated_bytes=SAPI_POST_BLOCK_SIZE+1; if ((SG(post_max_size) > 0) && (SG(request_info).content_length > SG(post_max_size))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "POST Content-Length of %ld bytes exceeds the limit of %ld bytes", SG(request_info).content_length, SG(post_max_size)); return; } - SG(request_info).post_data = emalloc(allocated_bytes); + SG(request_info).request_body = php_stream_temp_create(TEMP_STREAM_DEFAULT, SAPI_POST_BLOCK_SIZE); - for (;;) { - read_bytes = sapi_module.read_post(SG(request_info).post_data+SG(read_post_bytes), SAPI_POST_BLOCK_SIZE TSRMLS_CC); - if (read_bytes<=0) { - break; - } - SG(read_post_bytes) += read_bytes; - if ((SG(post_max_size) > 0) && (SG(read_post_bytes) > SG(post_max_size))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Actual POST length does not match Content-Length, and exceeds %ld bytes", SG(post_max_size)); - break; - } - if (read_bytes < SAPI_POST_BLOCK_SIZE) { - break; - } - if (SG(read_post_bytes)+SAPI_POST_BLOCK_SIZE >= allocated_bytes) { - allocated_bytes = SG(read_post_bytes)+SAPI_POST_BLOCK_SIZE+1; - SG(request_info).post_data = erealloc(SG(request_info).post_data, allocated_bytes); + if (sapi_module.read_post) { + for (;;) { + char buffer[SAPI_POST_BLOCK_SIZE]; + + read_bytes = sapi_module.read_post(buffer, SAPI_POST_BLOCK_SIZE TSRMLS_CC); + if (read_bytes<=0) { + /* failure */ + break; + } + SG(read_post_bytes) += read_bytes; + + if ((SG(post_max_size) > 0) && (SG(read_post_bytes) > SG(post_max_size))) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Actual POST length does not match Content-Length, and exceeds %ld bytes", SG(post_max_size)); + break; + } + + php_stream_write(SG(request_info).request_body, buffer, read_bytes); + + if (read_bytes < SAPI_POST_BLOCK_SIZE) { + /* done */ + break; + } } + + php_stream_rewind(SG(request_info).request_body); } - SG(request_info).post_data[SG(read_post_bytes)] = 0; /* terminating NULL */ - SG(request_info).post_data_length = SG(read_post_bytes); } @@ -387,8 +392,7 @@ SAPI_API void sapi_activate_headers_only(TSRMLS_D) SG(sapi_headers).http_status_line = NULL; SG(sapi_headers).mimetype = NULL; SG(read_post_bytes) = 0; - SG(request_info).post_data = NULL; - SG(request_info).raw_post_data = NULL; + SG(request_info).request_body = NULL; SG(request_info).current_user = NULL; SG(request_info).current_user_length = 0; SG(request_info).no_headers = 0; @@ -433,8 +437,7 @@ SAPI_API void sapi_activate(TSRMLS_D) SG(callback_run) = 0; SG(callback_func) = NULL; SG(read_post_bytes) = 0; - SG(request_info).post_data = NULL; - SG(request_info).raw_post_data = NULL; + SG(request_info).request_body = NULL; SG(request_info).current_user = NULL; SG(request_info).current_user_length = 0; SG(request_info).no_headers = 0; @@ -452,14 +455,15 @@ SAPI_API void sapi_activate(TSRMLS_D) /* Handle request method */ if (SG(server_context)) { - if (PG(enable_post_data_reading) && SG(request_info).request_method) { - if (SG(request_info).content_type && !strcmp(SG(request_info).request_method, "POST")) { + if (SG(request_info).request_method) { + if (PG(enable_post_data_reading) + && SG(request_info).content_type + && !strcmp(SG(request_info).request_method, "POST")) { /* HTTP POST may contain form data to be processed into variables * depending on given content type */ sapi_read_post_data(TSRMLS_C); } else { - /* Any other method with content payload will fill $HTTP_RAW_POST_DATA - * if it is enabled by always_populate_raw_post_data. + /* Any other method with content payload will fill php://input stream. * It's up to the webserver to decide whether to allow a method or not. */ SG(request_info).content_type_dup = NULL; if (sapi_module.default_post_reader) { @@ -494,9 +498,9 @@ static void sapi_send_headers_free(TSRMLS_D) SAPI_API void sapi_deactivate(TSRMLS_D) { zend_llist_destroy(&SG(sapi_headers).headers); - if (SG(request_info).post_data) { - efree(SG(request_info).post_data); - } else if (SG(server_context)) { + if (SG(request_info).request_body) { + SG(request_info).request_body = NULL; + } else if (SG(server_context)) { if(sapi_module.read_post) { /* make sure we've consumed all request input data */ char dummy[SAPI_POST_BLOCK_SIZE]; @@ -507,9 +511,6 @@ SAPI_API void sapi_deactivate(TSRMLS_D) } } } - if (SG(request_info).raw_post_data) { - efree(SG(request_info).raw_post_data); - } if (SG(request_info).auth_user) { efree(SG(request_info).auth_user); } diff --git a/main/SAPI.h b/main/SAPI.h index 6fc60c886513e..ed6b0494f4a30 100644 --- a/main/SAPI.h +++ b/main/SAPI.h @@ -32,8 +32,7 @@ #include #define SAPI_OPTION_NO_CHDIR 1 - -#define SAPI_POST_BLOCK_SIZE 4000 +#define SAPI_POST_BLOCK_SIZE 0x4000 #ifdef PHP_WIN32 # ifdef SAPI_EXPORTS @@ -80,14 +79,14 @@ END_EXTERN_C() typedef struct { const char *request_method; char *query_string; - char *post_data, *raw_post_data; char *cookie_data; long content_length; - int64_t post_data_length, raw_post_data_length; char *path_translated; char *request_uri; + struct _php_stream *request_body; + const char *content_type; zend_bool headers_only; diff --git a/main/main.c b/main/main.c index de794ace995f7..ba5159619b7cc 100644 --- a/main/main.c +++ b/main/main.c @@ -557,7 +557,6 @@ PHP_INI_BEGIN() STD_PHP_INI_BOOLEAN("allow_url_fopen", "1", PHP_INI_SYSTEM, OnUpdateBool, allow_url_fopen, php_core_globals, core_globals) STD_PHP_INI_BOOLEAN("allow_url_include", "0", PHP_INI_SYSTEM, OnUpdateBool, allow_url_include, php_core_globals, core_globals) STD_PHP_INI_BOOLEAN("enable_post_data_reading", "1", PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateBool, enable_post_data_reading, php_core_globals, core_globals) - STD_PHP_INI_BOOLEAN("always_populate_raw_post_data", "0", PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateBool, always_populate_raw_post_data, php_core_globals, core_globals) STD_PHP_INI_ENTRY("realpath_cache_size", "16K", PHP_INI_SYSTEM, OnUpdateLong, realpath_cache_size_limit, virtual_cwd_globals, cwd_globals) STD_PHP_INI_ENTRY("realpath_cache_ttl", "120", PHP_INI_SYSTEM, OnUpdateLong, realpath_cache_ttl, virtual_cwd_globals, cwd_globals) diff --git a/main/php_content_types.c b/main/php_content_types.c index c4433978ed2be..3346efc50ec6e 100644 --- a/main/php_content_types.c +++ b/main/php_content_types.c @@ -37,34 +37,11 @@ static sapi_post_entry php_post_entries[] = { */ SAPI_API SAPI_POST_READER_FUNC(php_default_post_reader) { - char *data; - int length; - - /* $HTTP_RAW_POST_DATA registration */ if (!strcmp(SG(request_info).request_method, "POST")) { if (NULL == SG(request_info).post_entry) { /* no post handler registered, so we just swallow the data */ sapi_read_standard_form_data(TSRMLS_C); } - - /* For unknown content types we create HTTP_RAW_POST_DATA even if always_populate_raw_post_data off, - * this is in-effecient, but we need to keep doing it for BC reasons (for now) */ - if ((PG(always_populate_raw_post_data) || NULL == SG(request_info).post_entry) && SG(request_info).post_data) { - length = SG(request_info).post_data_length; - data = estrndup(SG(request_info).post_data, length); - SET_VAR_STRINGL("HTTP_RAW_POST_DATA", data, length); - } - } - - /* for php://input stream: - some post handlers modify the content of request_info.post_data - so for now we need a copy for the php://input stream - in the long run post handlers should be changed to not touch - request_info.post_data for memory preservation reasons - */ - if (SG(request_info).post_data) { - SG(request_info).raw_post_data = estrndup(SG(request_info).post_data, SG(request_info).post_data_length); - SG(request_info).raw_post_data_length = SG(request_info).post_data_length; } } /* }}} */ diff --git a/main/php_globals.h b/main/php_globals.h index 256765d665a53..fa2fe3b232962 100644 --- a/main/php_globals.h +++ b/main/php_globals.h @@ -131,7 +131,6 @@ struct _php_core_globals { zend_bool during_request_startup; zend_bool allow_url_fopen; zend_bool enable_post_data_reading; - zend_bool always_populate_raw_post_data; zend_bool report_zend_debug; int last_error_type; diff --git a/main/php_streams.h b/main/php_streams.h index c56014c62e17f..c9732b484849a 100644 --- a/main/php_streams.h +++ b/main/php_streams.h @@ -242,7 +242,7 @@ PHPAPI php_stream *_php_stream_alloc(php_stream_ops *ops, void *abstract, END_EXTERN_C() #define php_stream_alloc(ops, thisptr, persistent_id, mode) _php_stream_alloc((ops), (thisptr), (persistent_id), (mode) STREAMS_CC TSRMLS_CC) -#define php_stream_get_resource_id(stream) (stream)->rsrc_id +#define php_stream_get_resource_id(stream) ((php_stream *)(stream))->rsrc_id #if ZEND_DEBUG /* use this to tell the stream that it is OK if we don't explicitly close it */ # define php_stream_auto_cleanup(stream) { (stream)->__exposed++; } diff --git a/main/php_variables.c b/main/php_variables.c index fd52f311d17df..fe8ae9904fe9e 100644 --- a/main/php_variables.c +++ b/main/php_variables.c @@ -23,6 +23,7 @@ #include "php.h" #include "ext/standard/php_standard.h" #include "ext/standard/credits.h" +#include "ext/standard/php_smart_str.h" #include "php_variables.h" #include "php_globals.h" #include "php_content_types.h" @@ -228,44 +229,115 @@ PHPAPI void php_register_variable_ex(char *var_name, zval *val, zval *track_vars free_alloca(var_orig, use_heap); } +typedef struct post_var_data { + smart_str str; + char *ptr; + char *end; + uint64_t cnt; +} post_var_data_t; + +static zend_bool add_post_var(zval *arr, post_var_data_t *var, zend_bool eof TSRMLS_DC) +{ + char *ksep, *vsep; + size_t klen, vlen; + /* FIXME: string-size_t */ + unsigned int new_vlen; + + if (var->ptr >= var->end) { + return 0; + } + + vsep = memchr(var->ptr, '&', var->end - var->ptr); + if (!vsep) { + if (!eof) { + return 0; + } else { + vsep = var->end; + } + } + + ksep = memchr(var->ptr, '=', vsep - var->ptr); + if (ksep) { + *ksep = '\0'; + /* "foo=bar&" or "foo=&" */ + klen = ksep - var->ptr; + vlen = vsep - ++ksep; + } else { + ksep = ""; + /* "foo&" */ + klen = vsep - var->ptr; + vlen = 0; + } + + + php_url_decode(var->ptr, klen); + if (vlen) { + vlen = php_url_decode(ksep, vlen); + } + + if (sapi_module.input_filter(PARSE_POST, var->ptr, &ksep, vlen, &new_vlen TSRMLS_CC)) { + php_register_variable_safe(var->ptr, ksep, new_vlen, arr TSRMLS_CC); + } + + var->ptr = vsep + (vsep != var->end); + return 1; +} + +static inline int add_post_vars(zval *arr, post_var_data_t *vars, zend_bool eof TSRMLS_DC) +{ + uint64_t max_vars = PG(max_input_vars); + + vars->ptr = vars->str.c; + vars->end = vars->str.c + vars->str.len; + while (add_post_var(arr, vars, eof TSRMLS_CC)) { + if (++vars->cnt > max_vars) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, + "Input variables exceeded %" PRIu64 ". " + "To increase the limit change max_input_vars in php.ini.", + max_vars); + return FAILURE; + } + } + + if (!eof) { + memmove(vars->str.c, vars->ptr, vars->str.len = vars->end - vars->ptr); + } + return SUCCESS; +} + SAPI_API SAPI_POST_HANDLER_FUNC(php_std_post_handler) { - char *var, *val, *e, *s, *p; - zval *array_ptr = (zval *) arg; - long count = 0; + zval *arr = (zval *) arg; + php_stream *s = SG(request_info).request_body; + post_var_data_t post_data; - if (SG(request_info).post_data == NULL) { - return; - } + if (s && SUCCESS == php_stream_rewind(s)) { + memset(&post_data, 0, sizeof(post_data)); - s = SG(request_info).post_data; - e = s + SG(request_info).post_data_length; + while (!php_stream_eof(s)) { + char buf[BUFSIZ] = {0}; + size_t len = php_stream_read(s, buf, BUFSIZ); - while (s < e && (p = memchr(s, '&', (e - s)))) { -last_value: - if ((val = memchr(s, '=', (p - s)))) { /* have a value */ - unsigned int val_len, new_val_len; + if (len && len != (size_t) -1) { + smart_str_appendl(&post_data.str, buf, len); - if (++count > PG(max_input_vars)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Input variables exceeded %ld. To increase the limit change max_input_vars in php.ini.", PG(max_input_vars)); - return; + if (SUCCESS != add_post_vars(arr, &post_data, 0 TSRMLS_CC)) { + if (post_data.str.c) { + efree(post_data.str.c); + } + return; + } } - var = s; - php_url_decode(var, (val - s)); - val++; - val_len = php_url_decode(val, (p - val)); - val = estrndup(val, val_len); - if (sapi_module.input_filter(PARSE_POST, var, &val, val_len, &new_val_len TSRMLS_CC)) { - php_register_variable_safe(var, val, new_val_len, array_ptr TSRMLS_CC); + if (len != BUFSIZ){ + break; } - efree(val); } - s = p + 1; - } - if (s < e) { - p = e; - goto last_value; + + add_post_vars(arr, &post_data, 1 TSRMLS_CC); + if (post_data.str.c) { + efree(post_data.str.c); + } } } diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c index a1bae67e745c9..5ec4143ad0999 100644 --- a/sapi/cli/php_cli_server.c +++ b/sapi/cli/php_cli_server.c @@ -1726,8 +1726,7 @@ static void php_cli_server_client_populate_request_info(const php_cli_server_cli request_info->request_uri = client->request.request_uri; request_info->path_translated = client->request.path_translated; request_info->query_string = client->request.query_string; - request_info->post_data = client->request.content; - request_info->content_length = request_info->post_data_length = client->request.content_len; + request_info->content_length = client->request.content_len; request_info->auth_user = request_info->auth_password = request_info->auth_digest = NULL; if (SUCCESS == zend_hash_find(&client->request.headers, "Content-Type", sizeof("Content-Type"), (void**)&val)) { request_info->content_type = *val; diff --git a/tests/basic/024.phpt b/tests/basic/024.phpt deleted file mode 100644 index bf8a206b3ac9d..0000000000000 --- a/tests/basic/024.phpt +++ /dev/null @@ -1,28 +0,0 @@ ---TEST-- -Test HTTP_RAW_POST_DATA creation ---INI-- -always_populate_raw_post_data=1 -max_input_vars=1000 ---POST-- -a=ABC&y=XYZ&c[]=1&c[]=2&c[a]=3 ---FILE-- - ---EXPECT-- -array(3) { - ["a"]=> - string(3) "ABC" - ["y"]=> - string(3) "XYZ" - ["c"]=> - array(3) { - [0]=> - string(1) "1" - [1]=> - string(1) "2" - ["a"]=> - string(1) "3" - } -} -string(30) "a=ABC&y=XYZ&c[]=1&c[]=2&c[a]=3" diff --git a/tests/basic/026.phpt b/tests/basic/026.phpt deleted file mode 100644 index b98a31f430772..0000000000000 --- a/tests/basic/026.phpt +++ /dev/null @@ -1,15 +0,0 @@ ---TEST-- -Registration of HTTP_RAW_POST_DATA due to unknown content-type ---INI-- -always_populate_raw_post_data=0 ---POST_RAW-- -Content-Type: unknown/type -a=1&b=ZYX ---FILE-- - ---EXPECT-- -array(0) { -} -string(9) "a=1&b=ZYX" From bb1f9d3826c968ce0c099598ded6f646b3da6429 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Wed, 14 Aug 2013 14:42:36 +0200 Subject: [PATCH 040/400] slim post data --- ext/mbstring/mb_gpc.c | 6 +- ext/soap/soap.c | 59 +++++++------- ext/standard/php_fopen_wrapper.c | 62 +++++++-------- main/SAPI.c | 77 ++++++++++--------- main/SAPI.h | 7 +- main/main.c | 1 - main/php_content_types.c | 23 ------ main/php_globals.h | 1 - main/php_streams.h | 2 +- main/php_variables.c | 128 ++++++++++++++++++++++++------- sapi/cli/php_cli_server.c | 3 +- tests/basic/024.phpt | 28 ------- tests/basic/026.phpt | 15 ---- 13 files changed, 205 insertions(+), 207 deletions(-) delete mode 100644 tests/basic/024.phpt delete mode 100644 tests/basic/026.phpt diff --git a/ext/mbstring/mb_gpc.c b/ext/mbstring/mb_gpc.c index 5ecc8f365e8ae..30764dc8076d3 100644 --- a/ext/mbstring/mb_gpc.c +++ b/ext/mbstring/mb_gpc.c @@ -364,6 +364,7 @@ SAPI_POST_HANDLER_FUNC(php_mb_post_handler) { const mbfl_encoding *detected; php_mb_encoding_handler_info_t info; + char *post_data_str = NULL; MBSTRG(http_input_identify_post) = NULL; @@ -376,7 +377,10 @@ SAPI_POST_HANDLER_FUNC(php_mb_post_handler) info.num_from_encodings = MBSTRG(http_input_list_size); info.from_language = MBSTRG(language); - detected = _php_mb_encoding_handler_ex(&info, arg, SG(request_info).post_data TSRMLS_CC); + php_stream_rewind(SG(request_info).request_body); + php_stream_copy_to_mem(SG(request_info).request_body, &post_data_str, PHP_STREAM_COPY_ALL, 0); + detected = _php_mb_encoding_handler_ex(&info, arg, post_data_str TSRMLS_CC); + STR_FREE(post_data_str); MBSTRG(http_input_identify) = detected; if (detected) { diff --git a/ext/soap/soap.c b/ext/soap/soap.c index 00e80efbcbca4..d10c17e218189 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -1560,48 +1560,45 @@ PHP_METHOD(SoapServer, handle) } if (ZEND_NUM_ARGS() == 0) { - if (SG(request_info).raw_post_data) { - char *post_data = SG(request_info).raw_post_data; - int post_data_length = SG(request_info).raw_post_data_length; + if (SG(request_info).request_body && 0 == php_stream_rewind(SG(request_info).request_body)) { zval **server_vars, **encoding; + php_stream_filter *zf = NULL; zend_is_auto_global("_SERVER", sizeof("_SERVER")-1 TSRMLS_CC); if (zend_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void **) &server_vars) == SUCCESS && Z_TYPE_PP(server_vars) == IS_ARRAY && zend_hash_find(Z_ARRVAL_PP(server_vars), "HTTP_CONTENT_ENCODING", sizeof("HTTP_CONTENT_ENCODING"), (void **) &encoding)==SUCCESS && Z_TYPE_PP(encoding) == IS_STRING) { - zval func; - zval retval; - zval param; - zval *params[1]; - - if ((strcmp(Z_STRVAL_PP(encoding),"gzip") == 0 || - strcmp(Z_STRVAL_PP(encoding),"x-gzip") == 0) && - zend_hash_exists(EG(function_table), "gzinflate", sizeof("gzinflate"))) { - ZVAL_STRING(&func, "gzinflate", 0); - params[0] = ¶m; - ZVAL_STRINGL(params[0], post_data+10, post_data_length-10, 0); - INIT_PZVAL(params[0]); - } else if (strcmp(Z_STRVAL_PP(encoding),"deflate") == 0 && - zend_hash_exists(EG(function_table), "gzuncompress", sizeof("gzuncompress"))) { - ZVAL_STRING(&func, "gzuncompress", 0); - params[0] = ¶m; - ZVAL_STRINGL(params[0], post_data, post_data_length, 0); - INIT_PZVAL(params[0]); + + if (strcmp(Z_STRVAL_PP(encoding),"gzip") == 0 + || strcmp(Z_STRVAL_PP(encoding),"x-gzip") == 0 + || strcmp(Z_STRVAL_PP(encoding),"deflate") == 0 + ) { + zval filter_params; + + INIT_PZVAL(&filter_params); + array_init_size(&filter_params, 1); + add_assoc_long_ex(&filter_params, ZEND_STRS("window"), 0x2f); /* ANY WBITS */ + + zf = php_stream_filter_create("zlib.inflate", &filter_params, 0); + zval_dtor(&filter_params); + + if (zf) { + php_stream_filter_append(&SG(request_info).request_body->readfilters, zf); + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING,"Can't uncompress compressed request"); + return; + } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING,"Request is compressed with unknown compression '%s'",Z_STRVAL_PP(encoding)); return; } - if (call_user_function(CG(function_table), (zval**)NULL, &func, &retval, 1, params TSRMLS_CC) == SUCCESS && - Z_TYPE(retval) == IS_STRING) { - doc_request = soap_xmlParseMemory(Z_STRVAL(retval),Z_STRLEN(retval)); - zval_dtor(&retval); - } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING,"Can't uncompress compressed request"); - return; - } - } else { - doc_request = soap_xmlParseMemory(post_data, post_data_length); + } + + doc_request = soap_xmlParseFile("php://input"); + + if (zf) { + php_stream_filter_remove(zf, 1); } } else { zval_ptr_dtor(&retval); diff --git a/ext/standard/php_fopen_wrapper.c b/ext/standard/php_fopen_wrapper.c index 0fb27baacd8e5..ca0b92ebdefc5 100644 --- a/ext/standard/php_fopen_wrapper.c +++ b/ext/standard/php_fopen_wrapper.c @@ -71,43 +71,20 @@ static size_t php_stream_input_write(php_stream *stream, const char *buf, size_t static size_t php_stream_input_read(php_stream *stream, char *buf, size_t count TSRMLS_DC) /* {{{ */ { - off_t *position = (off_t*)stream->abstract; - size_t read_bytes = 0; - - if (!stream->eof) { - if (SG(request_info).raw_post_data) { /* data has already been read by a post handler */ - read_bytes = SG(request_info).raw_post_data_length - *position; - if (read_bytes <= count) { - stream->eof = 1; - } else { - read_bytes = count; - } - if (read_bytes) { - memcpy(buf, SG(request_info).raw_post_data + *position, read_bytes); - } - } else if (sapi_module.read_post) { - read_bytes = sapi_module.read_post(buf, count TSRMLS_CC); - if (read_bytes <= 0) { - stream->eof = 1; - read_bytes = 0; - } - /* Increment SG(read_post_bytes) only when something was actually read. */ - SG(read_post_bytes) += read_bytes; - } else { - stream->eof = 1; - } - } + php_stream *inner = stream->abstract; - *position += read_bytes; + if (inner && inner->ops->read) { + size_t read = inner->ops->read(inner, buf, count TSRMLS_CC); + stream->eof = inner->eof; + return read; + } - return read_bytes; + return -1; } /* }}} */ static int php_stream_input_close(php_stream *stream, int close_handle TSRMLS_DC) /* {{{ */ { - efree(stream->abstract); - return 0; } /* }}} */ @@ -118,13 +95,25 @@ static int php_stream_input_flush(php_stream *stream TSRMLS_DC) /* {{{ */ } /* }}} */ +static int php_stream_input_seek(php_stream *stream, off_t offset, int whence, off_t *newoffset TSRMLS_DC) /* {{{ */ +{ + php_stream *inner = stream->abstract; + + if (inner && inner->ops->seek) { + return inner->ops->seek(inner, offset, whence, newoffset TSRMLS_CC); + } + + return -1; +} +/* }}} */ + php_stream_ops php_stream_input_ops = { php_stream_input_write, php_stream_input_read, php_stream_input_close, php_stream_input_flush, "Input", - NULL, /* seek */ + php_stream_input_seek, NULL, /* cast */ NULL, /* stat */ NULL /* set_option */ @@ -210,7 +199,12 @@ php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, const char *pa } return NULL; } - return php_stream_alloc(&php_stream_input_ops, ecalloc(1, sizeof(off_t)), 0, "rb"); + if (SG(request_info).request_body) { + php_stream_rewind(SG(request_info).request_body); + } else { + sapi_read_standard_form_data(TSRMLS_C); + } + return php_stream_alloc(&php_stream_input_ops, SG(request_info).request_body, 0, "rb"); } if (!strcasecmp(path, "stdin")) { @@ -259,8 +253,8 @@ php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, const char *pa fd = dup(STDERR_FILENO); } } else if (!strncasecmp(path, "fd/", 3)) { - char *start, - *end; + const char *start; + char *end; long fildes_ori; int dtablesize; diff --git a/main/SAPI.c b/main/SAPI.c index dcb2da629a03b..ccfb1e507d85f 100644 --- a/main/SAPI.c +++ b/main/SAPI.c @@ -180,10 +180,10 @@ SAPI_API void sapi_handle_post(void *arg TSRMLS_DC) { if (SG(request_info).post_entry && SG(request_info).content_type_dup) { SG(request_info).post_entry->post_handler(SG(request_info).content_type_dup, arg TSRMLS_CC); - if (SG(request_info).post_data) { - efree(SG(request_info).post_data); - SG(request_info).post_data = NULL; - } + /*if (SG(request_info).request_body) { + php_stream_close(SG(request_info).request_body); + SG(request_info).request_body = NULL; + }*/ efree(SG(request_info).content_type_dup); SG(request_info).content_type_dup = NULL; } @@ -253,35 +253,40 @@ static void sapi_read_post_data(TSRMLS_D) SAPI_API SAPI_POST_READER_FUNC(sapi_read_standard_form_data) { int read_bytes; - int allocated_bytes=SAPI_POST_BLOCK_SIZE+1; if ((SG(post_max_size) > 0) && (SG(request_info).content_length > SG(post_max_size))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "POST Content-Length of %ld bytes exceeds the limit of %ld bytes", SG(request_info).content_length, SG(post_max_size)); return; } - SG(request_info).post_data = emalloc(allocated_bytes); + SG(request_info).request_body = php_stream_temp_create(TEMP_STREAM_DEFAULT, SAPI_POST_BLOCK_SIZE); - for (;;) { - read_bytes = sapi_module.read_post(SG(request_info).post_data+SG(read_post_bytes), SAPI_POST_BLOCK_SIZE TSRMLS_CC); - if (read_bytes<=0) { - break; - } - SG(read_post_bytes) += read_bytes; - if ((SG(post_max_size) > 0) && (SG(read_post_bytes) > SG(post_max_size))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Actual POST length does not match Content-Length, and exceeds %ld bytes", SG(post_max_size)); - break; - } - if (read_bytes < SAPI_POST_BLOCK_SIZE) { - break; - } - if (SG(read_post_bytes)+SAPI_POST_BLOCK_SIZE >= allocated_bytes) { - allocated_bytes = SG(read_post_bytes)+SAPI_POST_BLOCK_SIZE+1; - SG(request_info).post_data = erealloc(SG(request_info).post_data, allocated_bytes); + if (sapi_module.read_post) { + for (;;) { + char buffer[SAPI_POST_BLOCK_SIZE]; + + read_bytes = sapi_module.read_post(buffer, SAPI_POST_BLOCK_SIZE TSRMLS_CC); + if (read_bytes<=0) { + /* failure */ + break; + } + SG(read_post_bytes) += read_bytes; + + if ((SG(post_max_size) > 0) && (SG(read_post_bytes) > SG(post_max_size))) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Actual POST length does not match Content-Length, and exceeds %ld bytes", SG(post_max_size)); + break; + } + + php_stream_write(SG(request_info).request_body, buffer, read_bytes); + + if (read_bytes < SAPI_POST_BLOCK_SIZE) { + /* done */ + break; + } } + + php_stream_rewind(SG(request_info).request_body); } - SG(request_info).post_data[SG(read_post_bytes)] = 0; /* terminating NULL */ - SG(request_info).post_data_length = SG(read_post_bytes); } @@ -387,8 +392,7 @@ SAPI_API void sapi_activate_headers_only(TSRMLS_D) SG(sapi_headers).http_status_line = NULL; SG(sapi_headers).mimetype = NULL; SG(read_post_bytes) = 0; - SG(request_info).post_data = NULL; - SG(request_info).raw_post_data = NULL; + SG(request_info).request_body = NULL; SG(request_info).current_user = NULL; SG(request_info).current_user_length = 0; SG(request_info).no_headers = 0; @@ -433,8 +437,7 @@ SAPI_API void sapi_activate(TSRMLS_D) SG(callback_run) = 0; SG(callback_func) = NULL; SG(read_post_bytes) = 0; - SG(request_info).post_data = NULL; - SG(request_info).raw_post_data = NULL; + SG(request_info).request_body = NULL; SG(request_info).current_user = NULL; SG(request_info).current_user_length = 0; SG(request_info).no_headers = 0; @@ -452,14 +455,15 @@ SAPI_API void sapi_activate(TSRMLS_D) /* Handle request method */ if (SG(server_context)) { - if (PG(enable_post_data_reading) && SG(request_info).request_method) { - if (SG(request_info).content_type && !strcmp(SG(request_info).request_method, "POST")) { + if (SG(request_info).request_method) { + if (PG(enable_post_data_reading) + && SG(request_info).content_type + && !strcmp(SG(request_info).request_method, "POST")) { /* HTTP POST may contain form data to be processed into variables * depending on given content type */ sapi_read_post_data(TSRMLS_C); } else { - /* Any other method with content payload will fill $HTTP_RAW_POST_DATA - * if it is enabled by always_populate_raw_post_data. + /* Any other method with content payload will fill php://input stream. * It's up to the webserver to decide whether to allow a method or not. */ SG(request_info).content_type_dup = NULL; if (sapi_module.default_post_reader) { @@ -494,9 +498,9 @@ static void sapi_send_headers_free(TSRMLS_D) SAPI_API void sapi_deactivate(TSRMLS_D) { zend_llist_destroy(&SG(sapi_headers).headers); - if (SG(request_info).post_data) { - efree(SG(request_info).post_data); - } else if (SG(server_context)) { + if (SG(request_info).request_body) { + SG(request_info).request_body = NULL; + } else if (SG(server_context)) { if(sapi_module.read_post) { /* make sure we've consumed all request input data */ char dummy[SAPI_POST_BLOCK_SIZE]; @@ -507,9 +511,6 @@ SAPI_API void sapi_deactivate(TSRMLS_D) } } } - if (SG(request_info).raw_post_data) { - efree(SG(request_info).raw_post_data); - } if (SG(request_info).auth_user) { efree(SG(request_info).auth_user); } diff --git a/main/SAPI.h b/main/SAPI.h index 6fc60c886513e..ed6b0494f4a30 100644 --- a/main/SAPI.h +++ b/main/SAPI.h @@ -32,8 +32,7 @@ #include #define SAPI_OPTION_NO_CHDIR 1 - -#define SAPI_POST_BLOCK_SIZE 4000 +#define SAPI_POST_BLOCK_SIZE 0x4000 #ifdef PHP_WIN32 # ifdef SAPI_EXPORTS @@ -80,14 +79,14 @@ END_EXTERN_C() typedef struct { const char *request_method; char *query_string; - char *post_data, *raw_post_data; char *cookie_data; long content_length; - int64_t post_data_length, raw_post_data_length; char *path_translated; char *request_uri; + struct _php_stream *request_body; + const char *content_type; zend_bool headers_only; diff --git a/main/main.c b/main/main.c index 2f56afa03a3fc..1cc842b212944 100644 --- a/main/main.c +++ b/main/main.c @@ -562,7 +562,6 @@ PHP_INI_BEGIN() STD_PHP_INI_BOOLEAN("allow_url_fopen", "1", PHP_INI_SYSTEM, OnUpdateBool, allow_url_fopen, php_core_globals, core_globals) STD_PHP_INI_BOOLEAN("allow_url_include", "0", PHP_INI_SYSTEM, OnUpdateBool, allow_url_include, php_core_globals, core_globals) STD_PHP_INI_BOOLEAN("enable_post_data_reading", "1", PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateBool, enable_post_data_reading, php_core_globals, core_globals) - STD_PHP_INI_BOOLEAN("always_populate_raw_post_data", "0", PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateBool, always_populate_raw_post_data, php_core_globals, core_globals) STD_PHP_INI_ENTRY("realpath_cache_size", "16K", PHP_INI_SYSTEM, OnUpdateLong, realpath_cache_size_limit, virtual_cwd_globals, cwd_globals) STD_PHP_INI_ENTRY("realpath_cache_ttl", "120", PHP_INI_SYSTEM, OnUpdateLong, realpath_cache_ttl, virtual_cwd_globals, cwd_globals) diff --git a/main/php_content_types.c b/main/php_content_types.c index c4433978ed2be..3346efc50ec6e 100644 --- a/main/php_content_types.c +++ b/main/php_content_types.c @@ -37,34 +37,11 @@ static sapi_post_entry php_post_entries[] = { */ SAPI_API SAPI_POST_READER_FUNC(php_default_post_reader) { - char *data; - int length; - - /* $HTTP_RAW_POST_DATA registration */ if (!strcmp(SG(request_info).request_method, "POST")) { if (NULL == SG(request_info).post_entry) { /* no post handler registered, so we just swallow the data */ sapi_read_standard_form_data(TSRMLS_C); } - - /* For unknown content types we create HTTP_RAW_POST_DATA even if always_populate_raw_post_data off, - * this is in-effecient, but we need to keep doing it for BC reasons (for now) */ - if ((PG(always_populate_raw_post_data) || NULL == SG(request_info).post_entry) && SG(request_info).post_data) { - length = SG(request_info).post_data_length; - data = estrndup(SG(request_info).post_data, length); - SET_VAR_STRINGL("HTTP_RAW_POST_DATA", data, length); - } - } - - /* for php://input stream: - some post handlers modify the content of request_info.post_data - so for now we need a copy for the php://input stream - in the long run post handlers should be changed to not touch - request_info.post_data for memory preservation reasons - */ - if (SG(request_info).post_data) { - SG(request_info).raw_post_data = estrndup(SG(request_info).post_data, SG(request_info).post_data_length); - SG(request_info).raw_post_data_length = SG(request_info).post_data_length; } } /* }}} */ diff --git a/main/php_globals.h b/main/php_globals.h index 256765d665a53..fa2fe3b232962 100644 --- a/main/php_globals.h +++ b/main/php_globals.h @@ -131,7 +131,6 @@ struct _php_core_globals { zend_bool during_request_startup; zend_bool allow_url_fopen; zend_bool enable_post_data_reading; - zend_bool always_populate_raw_post_data; zend_bool report_zend_debug; int last_error_type; diff --git a/main/php_streams.h b/main/php_streams.h index c56014c62e17f..c9732b484849a 100644 --- a/main/php_streams.h +++ b/main/php_streams.h @@ -242,7 +242,7 @@ PHPAPI php_stream *_php_stream_alloc(php_stream_ops *ops, void *abstract, END_EXTERN_C() #define php_stream_alloc(ops, thisptr, persistent_id, mode) _php_stream_alloc((ops), (thisptr), (persistent_id), (mode) STREAMS_CC TSRMLS_CC) -#define php_stream_get_resource_id(stream) (stream)->rsrc_id +#define php_stream_get_resource_id(stream) ((php_stream *)(stream))->rsrc_id #if ZEND_DEBUG /* use this to tell the stream that it is OK if we don't explicitly close it */ # define php_stream_auto_cleanup(stream) { (stream)->__exposed++; } diff --git a/main/php_variables.c b/main/php_variables.c index 7018eae57bbd8..af3a6aae7b7d4 100644 --- a/main/php_variables.c +++ b/main/php_variables.c @@ -23,6 +23,7 @@ #include "php.h" #include "ext/standard/php_standard.h" #include "ext/standard/credits.h" +#include "ext/standard/php_smart_str.h" #include "php_variables.h" #include "php_globals.h" #include "php_content_types.h" @@ -228,44 +229,115 @@ PHPAPI void php_register_variable_ex(char *var_name, zval *val, zval *track_vars free_alloca(var_orig, use_heap); } +typedef struct post_var_data { + smart_str str; + char *ptr; + char *end; + uint64_t cnt; +} post_var_data_t; + +static zend_bool add_post_var(zval *arr, post_var_data_t *var, zend_bool eof TSRMLS_DC) +{ + char *ksep, *vsep; + size_t klen, vlen; + /* FIXME: string-size_t */ + unsigned int new_vlen; + + if (var->ptr >= var->end) { + return 0; + } + + vsep = memchr(var->ptr, '&', var->end - var->ptr); + if (!vsep) { + if (!eof) { + return 0; + } else { + vsep = var->end; + } + } + + ksep = memchr(var->ptr, '=', vsep - var->ptr); + if (ksep) { + *ksep = '\0'; + /* "foo=bar&" or "foo=&" */ + klen = ksep - var->ptr; + vlen = vsep - ++ksep; + } else { + ksep = ""; + /* "foo&" */ + klen = vsep - var->ptr; + vlen = 0; + } + + + php_url_decode(var->ptr, klen); + if (vlen) { + vlen = php_url_decode(ksep, vlen); + } + + if (sapi_module.input_filter(PARSE_POST, var->ptr, &ksep, vlen, &new_vlen TSRMLS_CC)) { + php_register_variable_safe(var->ptr, ksep, new_vlen, arr TSRMLS_CC); + } + + var->ptr = vsep + (vsep != var->end); + return 1; +} + +static inline int add_post_vars(zval *arr, post_var_data_t *vars, zend_bool eof TSRMLS_DC) +{ + uint64_t max_vars = PG(max_input_vars); + + vars->ptr = vars->str.c; + vars->end = vars->str.c + vars->str.len; + while (add_post_var(arr, vars, eof TSRMLS_CC)) { + if (++vars->cnt > max_vars) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, + "Input variables exceeded %" PRIu64 ". " + "To increase the limit change max_input_vars in php.ini.", + max_vars); + return FAILURE; + } + } + + if (!eof) { + memmove(vars->str.c, vars->ptr, vars->str.len = vars->end - vars->ptr); + } + return SUCCESS; +} + SAPI_API SAPI_POST_HANDLER_FUNC(php_std_post_handler) { - char *var, *val, *e, *s, *p; - zval *array_ptr = (zval *) arg; - long count = 0; + zval *arr = (zval *) arg; + php_stream *s = SG(request_info).request_body; + post_var_data_t post_data; - if (SG(request_info).post_data == NULL) { - return; - } + if (s && SUCCESS == php_stream_rewind(s)) { + memset(&post_data, 0, sizeof(post_data)); - s = SG(request_info).post_data; - e = s + SG(request_info).post_data_length; + while (!php_stream_eof(s)) { + char buf[BUFSIZ] = {0}; + size_t len = php_stream_read(s, buf, BUFSIZ); - while (s < e && (p = memchr(s, '&', (e - s)))) { -last_value: - if ((val = memchr(s, '=', (p - s)))) { /* have a value */ - unsigned int val_len, new_val_len; + if (len && len != (size_t) -1) { + smart_str_appendl(&post_data.str, buf, len); - if (++count > PG(max_input_vars)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Input variables exceeded %ld. To increase the limit change max_input_vars in php.ini.", PG(max_input_vars)); - return; + if (SUCCESS != add_post_vars(arr, &post_data, 0 TSRMLS_CC)) { + if (post_data.str.c) { + efree(post_data.str.c); + } + return; + } } - var = s; - php_url_decode(var, (val - s)); - val++; - val_len = php_url_decode(val, (p - val)); - val = estrndup(val, val_len); - if (sapi_module.input_filter(PARSE_POST, var, &val, val_len, &new_val_len TSRMLS_CC)) { - php_register_variable_safe(var, val, new_val_len, array_ptr TSRMLS_CC); + if (len != BUFSIZ){ + break; } - efree(val); } - s = p + 1; - } - if (s < e) { - p = e; - goto last_value; + + add_post_vars(arr, &post_data, 1 TSRMLS_CC); + if (post_data.str.c) { + efree(post_data.str.c); + } } } diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c index cbe9c7bd66180..dbd861a945c11 100644 --- a/sapi/cli/php_cli_server.c +++ b/sapi/cli/php_cli_server.c @@ -1726,8 +1726,7 @@ static void php_cli_server_client_populate_request_info(const php_cli_server_cli request_info->request_uri = client->request.request_uri; request_info->path_translated = client->request.path_translated; request_info->query_string = client->request.query_string; - request_info->post_data = client->request.content; - request_info->content_length = request_info->post_data_length = client->request.content_len; + request_info->content_length = client->request.content_len; request_info->auth_user = request_info->auth_password = request_info->auth_digest = NULL; if (SUCCESS == zend_hash_find(&client->request.headers, "Content-Type", sizeof("Content-Type"), (void**)&val)) { request_info->content_type = *val; diff --git a/tests/basic/024.phpt b/tests/basic/024.phpt deleted file mode 100644 index bf8a206b3ac9d..0000000000000 --- a/tests/basic/024.phpt +++ /dev/null @@ -1,28 +0,0 @@ ---TEST-- -Test HTTP_RAW_POST_DATA creation ---INI-- -always_populate_raw_post_data=1 -max_input_vars=1000 ---POST-- -a=ABC&y=XYZ&c[]=1&c[]=2&c[a]=3 ---FILE-- - ---EXPECT-- -array(3) { - ["a"]=> - string(3) "ABC" - ["y"]=> - string(3) "XYZ" - ["c"]=> - array(3) { - [0]=> - string(1) "1" - [1]=> - string(1) "2" - ["a"]=> - string(1) "3" - } -} -string(30) "a=ABC&y=XYZ&c[]=1&c[]=2&c[a]=3" diff --git a/tests/basic/026.phpt b/tests/basic/026.phpt deleted file mode 100644 index b98a31f430772..0000000000000 --- a/tests/basic/026.phpt +++ /dev/null @@ -1,15 +0,0 @@ ---TEST-- -Registration of HTTP_RAW_POST_DATA due to unknown content-type ---INI-- -always_populate_raw_post_data=0 ---POST_RAW-- -Content-Type: unknown/type -a=1&b=ZYX ---FILE-- - ---EXPECT-- -array(0) { -} -string(9) "a=1&b=ZYX" From d4b673a34c873a7d732507ce5f83385acff8a59c Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Tue, 27 Aug 2013 14:01:59 +0200 Subject: [PATCH 041/400] fix ZTS build --- ext/soap/soap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/soap/soap.c b/ext/soap/soap.c index d10c17e218189..c5900dc645af4 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -1580,7 +1580,7 @@ PHP_METHOD(SoapServer, handle) array_init_size(&filter_params, 1); add_assoc_long_ex(&filter_params, ZEND_STRS("window"), 0x2f); /* ANY WBITS */ - zf = php_stream_filter_create("zlib.inflate", &filter_params, 0); + zf = php_stream_filter_create("zlib.inflate", &filter_params, 0 TSRMLS_CC); zval_dtor(&filter_params); if (zf) { @@ -1595,10 +1595,10 @@ PHP_METHOD(SoapServer, handle) } } - doc_request = soap_xmlParseFile("php://input"); + doc_request = soap_xmlParseFile("php://input" TSRMLS_CC); if (zf) { - php_stream_filter_remove(zf, 1); + php_stream_filter_remove(zf, 1 TSRMLS_CC); } } else { zval_ptr_dtor(&retval); From 49cd21e71cc6d18bbe601e5e2ae07f7c0ae143ec Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Tue, 27 Aug 2013 16:41:02 -0700 Subject: [PATCH 042/400] OCI8 2.0: add oci8-check-connection probe and do some renaming --- ext/oci8/config.m4 | 3 +-- ext/oci8/oci8.c | 22 ++++++++++++++++++---- ext/oci8/oci8_dtrace.d | 7 ++++--- ext/oci8/php_oci8_int.h | 4 +++- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/ext/oci8/config.m4 b/ext/oci8/config.m4 index b76db64638544..2af75a27f3e49 100644 --- a/ext/oci8/config.m4 +++ b/ext/oci8/config.m4 @@ -154,8 +154,7 @@ if test "$PHP_OCI8" != "no"; then AC_MSG_ERROR([You need at least PHP 5.4 to be able to use DTrace with PHP OCI8]) else AC_CHECK_HEADERS([sys/sdt.h], [ - PHP_INIT_DTRACE([ext/oci8/oci8_dtrace.d],[ext/oci8/oci8_dtrace_gen.h],[ext/oci8/oci8.c \ - ext/oci8/oci8_interface.c ext/oci8/oci8_collection.c ext/oci8/oci8_lob.c ext/oci8/oci8_statement.c]) + PHP_INIT_DTRACE([ext/oci8/oci8_dtrace.d],[ext/oci8/oci8_dtrace_gen.h],[ext/oci8/oci8.c ext/oci8/oci8_statement.c]) ], [ AC_MSG_ERROR( [Cannot find sys/sdt.h which is required for DTrace support]) diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index f717caa713e64..b30fb4bef45d9 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -1772,8 +1772,8 @@ void php_oci_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent, int exclus } #ifdef HAVE_DTRACE - if (DTRACE_OCI8_CONNECT_START_ENABLED()) { - DTRACE_OCI8_CONNECT_START(username, dbname, charset, session_mode, persistent, exclusive); + if (DTRACE_OCI8_CONNECT_ENTRY_ENABLED()) { + DTRACE_OCI8_CONNECT_ENTRY(username, dbname, charset, session_mode, persistent, exclusive); } #endif /* HAVE_DTRACE */ @@ -1784,8 +1784,8 @@ void php_oci_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent, int exclus 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_DTRACE - if (DTRACE_OCI8_CONNECT_DONE_ENABLED()) { - DTRACE_OCI8_CONNECT_DONE(); + if (DTRACE_OCI8_CONNECT_RETURN_ENABLED()) { + DTRACE_OCI8_CONNECT_RETURN(connection); } #endif /* HAVE_DTRACE */ @@ -3465,6 +3465,20 @@ static sword php_oci_ping_init(php_oci_connection *connection, OCIError *errh TS } /* }}} */ +/* {{{ 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, sword errcode, ub4 serverStatus) +{ +#ifdef HAVE_DTRACE + if (DTRACE_OCI8_CHECK_CONNECTION_ENABLED()) { + DTRACE_OCI8_CHECK_CONNECTION(connection, connection && connection->is_open ? 1 : 0, (int)errcode, (unsigned long)serverStatus); + } +#endif /* HAVE_DTRACE */ +} +/* }}} */ + #endif /* HAVE_OCI8 */ /* diff --git a/ext/oci8/oci8_dtrace.d b/ext/oci8/oci8_dtrace.d index 2773f78218134..15d210cf6dfbc 100644 --- a/ext/oci8/oci8_dtrace.d +++ b/ext/oci8/oci8_dtrace.d @@ -17,8 +17,9 @@ */ provider php { - probe oci8__connect__start(char *username, char *dbname, char *charset, long session_mode, int persistent, int exclusive); - probe oci8__connect__done(); + 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__check__connection(void *connection, int is_open, int errcode, unsigned long serverstatus); probe oci8__sqltext(char *sql); probe oci8__error(int status, long errcode); probe oci8__execute__mode(unsigned int mode); @@ -27,7 +28,7 @@ provider php { 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, time_t idle_expiry, time_t timestamp); - probe oci8__connect__type(int is_persistent, int exclusive, void *connection, long num_persistent, long num_links); + 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/php_oci8_int.h b/ext/oci8/php_oci8_int.h index daf649b0cf55b..ac58145f44957 100644 --- a/ext/oci8/php_oci8_int.h +++ b/ext/oci8/php_oci8_int.h @@ -310,6 +310,7 @@ typedef struct { */ #define PHP_OCI_HANDLE_ERROR(connection, errcode) \ do { \ + ub4 serverStatus = OCI_SERVER_NORMAL; \ switch (errcode) { \ case 1013: \ zend_bailout(); \ @@ -339,7 +340,6 @@ typedef struct { 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) { \ @@ -348,6 +348,7 @@ typedef struct { } \ break; \ } \ + php_oci_dtrace_check_connection(connection, errcode, serverStatus); \ } while (0) #define PHP_OCI_REGISTER_RESOURCE(resource, le_resource) \ @@ -411,6 +412,7 @@ 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, sword errcode, ub4 serverStatus); /* }}} */ From 51016262a7ea8d0fad2edc0305484ff47f4ba9d7 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Wed, 28 Aug 2013 14:25:39 +0200 Subject: [PATCH 043/400] updated lib versions, the vc11 ones only matter now --- win32/build/libs_version.txt | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/win32/build/libs_version.txt b/win32/build/libs_version.txt index 096d723a9c3ce..123a75d783090 100644 --- a/win32/build/libs_version.txt +++ b/win32/build/libs_version.txt @@ -1,25 +1,17 @@ bz2-1.0.6 -cclient-2007e cclient-2007f freetype-2.4.10 -icu-49.1.2 icu-50.1.2 -jpeglib-8 jpeglib-9 libcurl-7.30.0 libiconv-1.14 libmcrypt-2.5.8 libmpir-2.5.1 libmpir-2.6.0 -libpng-1.2.50 -libpng-1.5.13 -libpq-8.3.6 +libpng-1.5.14 libpq-9.2.2 libssh2-1.4.2 -libtidy-20090325 libtidy-20090406 libxslt-1.1.27 -libxml-2.7.8 libxml-2.9.1 -openssl-0.9.8y openssl-1.0.1e From 3745bdadc03a146fd37a3528658abc86bc8494df Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Wed, 28 Aug 2013 14:43:00 +0200 Subject: [PATCH 044/400] updated lib versions --- win32/build/libs_version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/win32/build/libs_version.txt b/win32/build/libs_version.txt index 897d77b0bec8e..ddbd9259346d4 100644 --- a/win32/build/libs_version.txt +++ b/win32/build/libs_version.txt @@ -1,6 +1,6 @@ bz2-1.0.6 cclient-2007e -freetype-2.4.3 +freetype-2.4.10 icu-49.1.2 jpeglib-8 libcurl-7.30.0 From bd677b43a78ebc0779ed64781172225d15b35671 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Wed, 28 Aug 2013 15:10:05 +0200 Subject: [PATCH 045/400] removed the /Wp64 switch as we use true 64 bit compiler now --- win32/build/config.w32 | 2 +- win32/build/config.w32.phpize.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/win32/build/config.w32 b/win32/build/config.w32 index 3face08a8c2b5..3401205c8fc1e 100644 --- a/win32/build/config.w32 +++ b/win32/build/config.w32 @@ -155,7 +155,7 @@ if (VCVERS >= 1400) { // disable annoying warnings. In addition, time_t defaults // to 64-bit. Ask for 32-bit. if (X64) { - ADD_FLAG('CFLAGS', ' /wd4996 /Wp64 '); + ADD_FLAG('CFLAGS', ' /wd4996 '); } else { ADD_FLAG('CFLAGS', ' /wd4996 /D_USE_32BIT_TIME_T=1 '); } diff --git a/win32/build/config.w32.phpize.in b/win32/build/config.w32.phpize.in index b8bf45ea5779d..7b3b40633b980 100644 --- a/win32/build/config.w32.phpize.in +++ b/win32/build/config.w32.phpize.in @@ -134,7 +134,7 @@ if (VCVERS >= 1400) { // disable annoying warnings. In addition, time_t defaults // to 64-bit. Ask for 32-bit. if (X64) { - ADD_FLAG('CFLAGS', ' /wd4996 /Wp64 '); + ADD_FLAG('CFLAGS', ' /wd4996 '); } else { ADD_FLAG('CFLAGS', ' /wd4996 /D_USE_32BIT_TIME_T=1 '); } From 72027cd0848f1a5c580c601573448cdea9b095ca Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Wed, 28 Aug 2013 20:33:42 -0700 Subject: [PATCH 046/400] Fix bug #65579 (Using traits with get_class_methods causes segfault). Specifically, this checks if there are trait aliases defined in the class scope before attempting to dereference the first trait alias. This handles the case where a trait alias was used in a child trait but no aliases exist in the concrete class. --- NEWS | 2 ++ Zend/tests/bug65579.phpt | 29 +++++++++++++++++++++++++++++ Zend/zend_API.c | 17 +++++++++-------- 3 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 Zend/tests/bug65579.phpt diff --git a/NEWS b/NEWS index 093fa20626c8b..b718a74e45120 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,8 @@ PHP NEWS ?? ??? 2013, PHP 5.4.20 - Core: + . Fixed bug #65579 (Using traits with get_class_methods causes segfault). + (Adam) . Fixed bug #65490 (Duplicate calls to get lineno & filename for DTRACE_FUNCTION_*). (Chris Jones) . Fixed bug #65483 (quoted-printable encode stream filter incorrectly encoding diff --git a/Zend/tests/bug65579.phpt b/Zend/tests/bug65579.phpt new file mode 100644 index 0000000000000..25d74ed4f5ee4 --- /dev/null +++ b/Zend/tests/bug65579.phpt @@ -0,0 +1,29 @@ +--TEST-- +Bug #65579 (Using traits with get_class_methods causes segfault) +--FILE-- + +--EXPECT-- +array(2) { + [0]=> + string(10) "testMethod" + [1]=> + string(25) "testmethodfromparenttrait" +} diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 90d27b79878b7..870a9b6480187 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3917,15 +3917,16 @@ ZEND_API const char* zend_find_alias_name(zend_class_entry *ce, const char *name { zend_trait_alias *alias, **alias_ptr; - alias_ptr = ce->trait_aliases; - alias = *alias_ptr; - while (alias) { - if (alias->alias_len == len && - !strncasecmp(name, alias->alias, alias->alias_len)) { - return alias->alias; - } - alias_ptr++; + if (alias_ptr = ce->trait_aliases) { alias = *alias_ptr; + while (alias) { + if (alias->alias_len == len && + !strncasecmp(name, alias->alias, alias->alias_len)) { + return alias->alias; + } + alias_ptr++; + alias = *alias_ptr; + } } return name; From 747daa53546bfa2c4a0fd88d2d3dffd30356c1ad Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Thu, 29 Aug 2013 14:02:15 +0800 Subject: [PATCH 047/400] Avoid compiler warning --- Zend/zend_API.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 870a9b6480187..620a8f0a27ce1 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3917,7 +3917,7 @@ ZEND_API const char* zend_find_alias_name(zend_class_entry *ce, const char *name { zend_trait_alias *alias, **alias_ptr; - if (alias_ptr = ce->trait_aliases) { + if ((alias_ptr = ce->trait_aliases)) { alias = *alias_ptr; while (alias) { if (alias->alias_len == len && From 790db9ff9b95d9dfaf6720593517dc0368f1fe7f Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 29 Aug 2013 10:29:48 +0400 Subject: [PATCH 048/400] Fixed bug #65561 (Zend Opcache on Solaris 11 x86 needs ZEND_MM_ALIGNMENT=4). (Terry Ellison) --- NEWS | 4 ++++ ext/opcache/Optimizer/zend_optimizer_internal.h | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index dead9c78ea303..f695ada3df281 100644 --- a/NEWS +++ b/NEWS @@ -22,6 +22,10 @@ PHP NEWS . Fixed bug #65554 (createFromFormat broken when weekday name is followed by some delimiters). (Valentin Logvinskiy, Stas). +- OPCache: + . Fixed bug #65561 (Zend Opcache on Solaris 11 x86 needs ZEND_MM_ALIGNMENT=4). + (Terry Ellison) + - Openssl: . Fixed bug #64802 (openssl_x509_parse fails to parse subject properly in some cases). (Mark Jones) diff --git a/ext/opcache/Optimizer/zend_optimizer_internal.h b/ext/opcache/Optimizer/zend_optimizer_internal.h index a9bad01be3bf6..0b1afba285b0a 100644 --- a/ext/opcache/Optimizer/zend_optimizer_internal.h +++ b/ext/opcache/Optimizer/zend_optimizer_internal.h @@ -28,8 +28,8 @@ # define VAR_NUM(v) ((zend_uint)(EX_TMP_VAR_NUM(0, 0) - EX_TMP_VAR(0, v))) # define NUM_VAR(v) ((zend_uint)(zend_uintptr_t)EX_TMP_VAR_NUM(0, v)) #else -# define VAR_NUM(v) ((v)/(sizeof(temp_variable))) -# define NUM_VAR(v) ((v)*(sizeof(temp_variable))) +# define VAR_NUM(v) ((v)/ZEND_MM_ALIGNED_SIZE(sizeof(temp_variable))) +# define NUM_VAR(v) ((v)*ZEND_MM_ALIGNED_SIZE(sizeof(temp_variable))) #endif #define INV_COND(op) ((op) == ZEND_JMPZ ? ZEND_JMPNZ : ZEND_JMPZ) From 94816ed9bfe16bd1507a1abc708793e41c06ad79 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 29 Aug 2013 10:44:07 +0400 Subject: [PATCH 049/400] Fixed compatibility with php-5.2 --- ext/opcache/Optimizer/zend_optimizer_internal.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ext/opcache/Optimizer/zend_optimizer_internal.h b/ext/opcache/Optimizer/zend_optimizer_internal.h index 0b1afba285b0a..616bdf74f6e6b 100644 --- a/ext/opcache/Optimizer/zend_optimizer_internal.h +++ b/ext/opcache/Optimizer/zend_optimizer_internal.h @@ -27,9 +27,12 @@ #if ZEND_EXTENSION_API_NO > PHP_5_4_X_API_NO # define VAR_NUM(v) ((zend_uint)(EX_TMP_VAR_NUM(0, 0) - EX_TMP_VAR(0, v))) # define NUM_VAR(v) ((zend_uint)(zend_uintptr_t)EX_TMP_VAR_NUM(0, v)) -#else +#elif ZEND_EXTENSION_API_NO > PHP_5_2_X_API_NO # define VAR_NUM(v) ((v)/ZEND_MM_ALIGNED_SIZE(sizeof(temp_variable))) # define NUM_VAR(v) ((v)*ZEND_MM_ALIGNED_SIZE(sizeof(temp_variable))) +#else +# define VAR_NUM(v) ((v)/(sizeof(temp_variable))) +# define NUM_VAR(v) ((v)*(sizeof(temp_variable))) #endif #define INV_COND(op) ((op) == ZEND_JMPZ ? ZEND_JMPNZ : ZEND_JMPZ) From 15694f66b2732962b760463803a68a1fa3bb098f Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 29 Aug 2013 11:12:06 +0400 Subject: [PATCH 050/400] Fixed bug #61759 (class_alias() should accept classes with leading backslashes). (Julien) --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index b718a74e45120..6169cd0902352 100644 --- a/NEWS +++ b/NEWS @@ -20,6 +20,8 @@ PHP NEWS . Fixed bug #65225 (PHP_BINARY incorrectly set). (Patrick Allaert) . Improved fix for bug #63186 (compile failure on netbsd). (Matteo) . 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 #61345 (CGI mode - make install don't work). (Michael Heimpold) . Cherry-picked some DTrace build commits (allowing builds on Linux, bug #62691, and bug #63706) from PHP 5.5 branch From dfc6feb6e84f27094e6a2e3947caa094f7c35d26 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 29 Aug 2013 11:16:56 +0400 Subject: [PATCH 051/400] Fixed bug #61759 (class_alias() should accept classes with leading backslashes). (Julien) --- Zend/zend_API.c | 7 ++++++- Zend/zend_builtin_functions.c | 9 +-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 620a8f0a27ce1..125a1a2564793 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -2514,7 +2514,12 @@ ZEND_API int zend_register_class_alias_ex(const char *name, int name_len, zend_c char *lcname = zend_str_tolower_dup(name, name_len); int ret; - ret = zend_hash_add(CG(class_table), lcname, name_len+1, &ce, sizeof(zend_class_entry *), NULL); + if (lcname[0] == '\\') { + ret = zend_hash_add(CG(class_table), lcname+1, name_len, &ce, sizeof(zend_class_entry *), NULL); + } else { + ret = zend_hash_add(CG(class_table), lcname, name_len+1, &ce, sizeof(zend_class_entry *), NULL); + } + efree(lcname); if (ret == SUCCESS) { ce->refcount++; diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 72d905848a1b1..04f4ebec26ab0 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -1399,15 +1399,8 @@ ZEND_FUNCTION(class_alias) return; } - if (!autoload) { - lc_name = do_alloca(class_name_len + 1, use_heap); - zend_str_tolower_copy(lc_name, class_name, class_name_len); + found = zend_lookup_class_ex(class_name, class_name_len, NULL, autoload, &ce TSRMLS_CC); - found = zend_hash_find(EG(class_table), lc_name, class_name_len+1, (void **) &ce); - free_alloca(lc_name, use_heap); - } else { - found = zend_lookup_class(class_name, class_name_len, &ce TSRMLS_CC); - } if (found == SUCCESS) { if ((*ce)->type == ZEND_USER_CLASS) { if (zend_register_class_alias_ex(alias_name, alias_name_len, *ce TSRMLS_CC) == SUCCESS) { From 5015c4af6c1d2af992e0525f10e93b01043730e1 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 29 Aug 2013 11:56:01 +0400 Subject: [PATCH 052/400] Fixed bug #65510 (5.5.2 crashes in _get_zval_ptr_ptr_var) --- NEWS | 1 + ext/opcache/Optimizer/pass1_5.c | 32 ++++++++++++++++++++++++-------- ext/opcache/tests/bug65510.phpt | 20 ++++++++++++++++++++ 3 files changed, 45 insertions(+), 8 deletions(-) create mode 100644 ext/opcache/tests/bug65510.phpt diff --git a/NEWS b/NEWS index 86eb571210160..518c9977b4161 100644 --- a/NEWS +++ b/NEWS @@ -27,6 +27,7 @@ PHP NEWS - 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 diff --git a/ext/opcache/Optimizer/pass1_5.c b/ext/opcache/Optimizer/pass1_5.c index 46406c383e600..795b954173e7b 100644 --- a/ext/opcache/Optimizer/pass1_5.c +++ b/ext/opcache/Optimizer/pass1_5.c @@ -408,6 +408,7 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) { int var = opline->result.var; int level = 0; zend_op *op = opline + 1; + zend_op *use = NULL; while (op < end) { if (op->opcode == ZEND_BEGIN_SILENCE) { @@ -420,21 +421,36 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) { } } if (op->op1_type == IS_VAR && op->op1.var == var) { - op->op1_type = IS_CV; - op->op1.var = zend_optimizer_lookup_cv(op_array, + if (use) { + /* used more than once */ + use = NULL; + break; + } + use = op; + } else if (op->op2_type == IS_VAR && op->op2.var == var) { + if (use) { + /* used more than once */ + use = NULL; + break; + } + use = op; + } + op++; + } + if (use) { + if (use->op1_type == IS_VAR && use->op1.var == var) { + use->op1_type = IS_CV; + use->op1.var = zend_optimizer_lookup_cv(op_array, Z_STRVAL(ZEND_OP1_LITERAL(opline)), Z_STRLEN(ZEND_OP1_LITERAL(opline))); MAKE_NOP(opline); - break; - } else if (op->op2_type == IS_VAR && op->op2.var == var) { - op->op2_type = IS_CV; - op->op2.var = zend_optimizer_lookup_cv(op_array, + } else if (use->op2_type == IS_VAR && use->op2.var == var) { + use->op2_type = IS_CV; + use->op2.var = zend_optimizer_lookup_cv(op_array, Z_STRVAL(ZEND_OP1_LITERAL(opline)), Z_STRLEN(ZEND_OP1_LITERAL(opline))); MAKE_NOP(opline); - break; } - op++; } } break; diff --git a/ext/opcache/tests/bug65510.phpt b/ext/opcache/tests/bug65510.phpt new file mode 100644 index 0000000000000..ba19d27d6ff2a --- /dev/null +++ b/ext/opcache/tests/bug65510.phpt @@ -0,0 +1,20 @@ +--TEST-- +Bug #65510 (5.5.2 crashes in _get_zval_ptr_ptr_var) +--INI-- +allow_url_include=1 +opcache.enable=1 +opcache.enable_cli=1 +--SKIPIF-- + +--FILE-- + Date: Fri, 30 Aug 2013 11:46:16 +0900 Subject: [PATCH 053/400] Remove ini dependency in test --- ext/session/tests/session_hash_function_basic.phpt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ext/session/tests/session_hash_function_basic.phpt b/ext/session/tests/session_hash_function_basic.phpt index 45b8bc0710a1f..663852d9d1a1c 100644 --- a/ext/session/tests/session_hash_function_basic.phpt +++ b/ext/session/tests/session_hash_function_basic.phpt @@ -2,6 +2,8 @@ Test session.hash_function ini setting : basic functionality --SKIPIF-- +--INI-- +session.hash_bits_per_character=4 --FILE-- Date: Fri, 30 Aug 2013 11:20:24 +0800 Subject: [PATCH 054/400] Fixed bug #60598 (cli/apache sapi segfault on objects manipulation) --- NEWS | 2 ++ Zend/tests/bug60598.phpt | 30 ++++++++++++++++++++++++++++++ Zend/zend_objects_API.c | 5 +++++ 3 files changed, 37 insertions(+) create mode 100644 Zend/tests/bug60598.phpt diff --git a/NEWS b/NEWS index 6169cd0902352..42b69f535dd77 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,8 @@ PHP NEWS ?? ??? 2013, PHP 5.4.20 - Core: + . Fixed bug #60598 (cli/apache sapi segfault on objects manipulation). + (Laruence) . Fixed bug #65579 (Using traits with get_class_methods causes segfault). (Adam) . Fixed bug #65490 (Duplicate calls to get lineno & filename for diff --git a/Zend/tests/bug60598.phpt b/Zend/tests/bug60598.phpt new file mode 100644 index 0000000000000..eeee75a19d9ce --- /dev/null +++ b/Zend/tests/bug60598.phpt @@ -0,0 +1,30 @@ +--TEST-- +Bug #60598 (cli/apache sapi segfault on objects manipulation) +--FILE-- +guid = 1; + $containers[spl_object_hash($this)] = $this; + } + public function __destruct() { + global $containers; + $containers[spl_object_hash($this)] = NULL; + } +} + +for ($i = 0; $i < OBJECT_COUNT; ++$i) { + new Object(); +} + +// You probably won't see this because of the "zend_mm_heap corrupted" +?> +If you see this, try to increase OBJECT_COUNT to 100,000 +--EXPECT-- +If you see this, try to increase OBJECT_COUNT to 100,000 diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index 1fe5d0c1994cd..b5dd48f798455 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -57,6 +57,11 @@ ZEND_API void zend_objects_store_call_destructors(zend_objects_store *objects TS obj->dtor(obj->object, i TSRMLS_CC); obj = &objects->object_buckets[i].bucket.obj; obj->refcount--; + + if (obj->refcount == 0) { + /* in case gc_collect_cycle is triggered before free_storage */ + GC_REMOVE_ZOBJ_FROM_BUFFER(obj); + } } } } From 4e3de606b54425029cc4617215a3360bb8550b2f Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Fri, 30 Aug 2013 11:22:58 +0800 Subject: [PATCH 055/400] Update NEWS --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index 518c9977b4161..d637d0ac03909 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,8 @@ PHP NEWS ?? ??? 2013, PHP 5.5.4 - 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) From d69513afecf3d82c6bfba35ef1634b3b7c377d87 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Fri, 30 Aug 2013 10:42:08 +0200 Subject: [PATCH 056/400] Fixed Bug #65564 stack-buffer-overflow in DateTimeZone stuff caught by AddressSanitizer --- NEWS | 2 ++ ext/date/php_date.c | 10 +++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index 42b69f535dd77..76eb1faa0d07d 100644 --- a/NEWS +++ b/NEWS @@ -36,6 +36,8 @@ PHP NEWS - 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). - Openssl: . Fixed bug #64802 (openssl_x509_parse fails to parse subject properly in diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 1c97781763553..70960b161f627 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -2113,13 +2113,13 @@ static HashTable *date_object_get_properties(zval *object TSRMLS_DC) /* first we add the date and time in ISO format */ MAKE_STD_ZVAL(zv); ZVAL_STRING(zv, date_format("Y-m-d H:i:s", 12, dateobj->time, 1), 0); - zend_hash_update(props, "date", 5, &zv, sizeof(zval), NULL); + zend_hash_update(props, "date", 5, &zv, sizeof(zv), NULL); /* then we add the timezone name (or similar) */ if (dateobj->time->is_localtime) { MAKE_STD_ZVAL(zv); ZVAL_LONG(zv, dateobj->time->zone_type); - zend_hash_update(props, "timezone_type", 14, &zv, sizeof(zval), NULL); + zend_hash_update(props, "timezone_type", 14, &zv, sizeof(zv), NULL); MAKE_STD_ZVAL(zv); switch (dateobj->time->zone_type) { @@ -2142,7 +2142,7 @@ static HashTable *date_object_get_properties(zval *object TSRMLS_DC) ZVAL_STRING(zv, dateobj->time->tz_abbr, 1); break; } - zend_hash_update(props, "timezone", 9, &zv, sizeof(zval), NULL); + zend_hash_update(props, "timezone", 9, &zv, sizeof(zv), NULL); } return props; @@ -2265,7 +2265,7 @@ static HashTable *date_object_get_properties_interval(zval *object TSRMLS_DC) #define PHP_DATE_INTERVAL_ADD_PROPERTY(n,f) \ MAKE_STD_ZVAL(zv); \ ZVAL_LONG(zv, (long)intervalobj->diff->f); \ - zend_hash_update(props, n, strlen(n) + 1, &zv, sizeof(zval), NULL); + zend_hash_update(props, n, strlen(n) + 1, &zv, sizeof(zv), NULL); PHP_DATE_INTERVAL_ADD_PROPERTY("y", y); PHP_DATE_INTERVAL_ADD_PROPERTY("m", m); @@ -2282,7 +2282,7 @@ static HashTable *date_object_get_properties_interval(zval *object TSRMLS_DC) } else { MAKE_STD_ZVAL(zv); ZVAL_FALSE(zv); - zend_hash_update(props, "days", 5, &zv, sizeof(zval), NULL); + zend_hash_update(props, "days", 5, &zv, sizeof(zv), NULL); } PHP_DATE_INTERVAL_ADD_PROPERTY("special_type", special.type); PHP_DATE_INTERVAL_ADD_PROPERTY("special_amount", special.amount); From 6fab1caa4100cf05fcf485ef0917830ae9f57563 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Fri, 30 Aug 2013 10:45:33 +0200 Subject: [PATCH 057/400] Fixed bug #65564 stack-buffer-overflow in DateTimeZone stuff caught by AddressSanitizer --- NEWS | 2 ++ ext/date/php_date.c | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index d637d0ac03909..ab1b5caeefc75 100644 --- a/NEWS +++ b/NEWS @@ -25,6 +25,8 @@ PHP NEWS - 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). - OPCache: . Fixed bug #65561 (Zend Opcache on Solaris 11 x86 needs ZEND_MM_ALIGNMENT=4). diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 997038a030d17..95c68f1a78ca6 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -2305,7 +2305,7 @@ static HashTable *date_object_get_properties_timezone(zval *object TSRMLS_DC) MAKE_STD_ZVAL(zv); ZVAL_LONG(zv, tzobj->type); - zend_hash_update(props, "timezone_type", 14, &zv, sizeof(zval), NULL); + zend_hash_update(props, "timezone_type", 14, &zv, sizeof(zv), NULL); MAKE_STD_ZVAL(zv); switch (tzobj->type) { @@ -2327,7 +2327,7 @@ static HashTable *date_object_get_properties_timezone(zval *object TSRMLS_DC) ZVAL_STRING(zv, tzobj->tzi.z.abbr, 1); break; } - zend_hash_update(props, "timezone", 9, &zv, sizeof(zval), NULL); + zend_hash_update(props, "timezone", 9, &zv, sizeof(zv), NULL); return props; } From e6053acd78259cc8bab396ede42cebc04de9157d Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Fri, 30 Aug 2013 11:14:20 -0700 Subject: [PATCH 058/400] OCI8 whitespace: remove tabs embedded in code --- ext/oci8/oci8.c | 2 +- ext/oci8/oci8_collection.c | 2 +- ext/oci8/oci8_statement.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index b30fb4bef45d9..dc4737ffd5747 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -2327,7 +2327,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) { diff --git a/ext/oci8/oci8_collection.c b/ext/oci8/oci8_collection.c index 4abfbd6cfd58c..ae9361435404e 100644 --- a/ext/oci8/oci8_collection.c +++ b/ext/oci8/oci8_collection.c @@ -105,7 +105,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c } /* 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(connection->errcode, OCIAttrGet, ((dvoid *) dschp1, (ub4) OCI_HTYPE_DESCRIBE, (dvoid *)&parmp1, (ub4 *)0, (ub4)OCI_ATTR_PARAM, connection->err)); if (connection->errcode != OCI_SUCCESS) { goto CLEANUP; diff --git a/ext/oci8/oci8_statement.c b/ext/oci8/oci8_statement.c index cf8d23dc882a8..752a45bcb8107 100644 --- a/ext/oci8/oci8_statement.c +++ b/ext/oci8/oci8_statement.c @@ -502,7 +502,7 @@ 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(statement->errcode, 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); @@ -528,7 +528,7 @@ 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(statement->errcode, 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); From 82da51bbce7e25a7f24d97522617c62060423776 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Fri, 30 Aug 2013 11:15:56 -0700 Subject: [PATCH 059/400] OCI8: remove unused ext/oci8/config.m4 macro --- ext/oci8/config.m4 | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/ext/oci8/config.m4 b/ext/oci8/config.m4 index 2af75a27f3e49..311579fd7fff3 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 -#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 From d7ffca590b4ee188a5dcdbafb036e6541f3c79be Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Fri, 30 Aug 2013 17:37:44 -0700 Subject: [PATCH 060/400] Allow OCI8 to be DTrace-enabled independently of core PHP's DTrace status. The proviso is OCI8 must be built "shared" when DTrace is enabled. This implementation (i) works around an incomplete core PHP solution for extension tracing (ii) avoid any issues with DOF section location and the complexities of needing to merge all provider .d files for static builds (iii) allows OCI8 to be DTrace-enabled when doing PECL installs of OCI8 on PHP versions without core PHP DTrace support. This is an initial patch i.e. it will undergo further testing. --- ext/oci8/config.m4 | 126 +++++++++++++++++++++++++++++++++----- ext/oci8/oci8.c | 56 +++++++++-------- ext/oci8/oci8_statement.c | 8 +-- ext/oci8/package.xml | 26 ++++---- ext/oci8/php_oci8_int.h | 2 +- 5 files changed, 161 insertions(+), 57 deletions(-) diff --git a/ext/oci8/config.m4 b/ext/oci8/config.m4 index 311579fd7fff3..49998d18f08ba 100644 --- a/ext/oci8/config.m4 +++ b/ext/oci8/config.m4 @@ -82,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< \$[]@ + +\$(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< \$[]@ + @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<is_stub ? 1 : 0); } -#endif /* HAVE_DTRACE */ +#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 @@ -2186,11 +2194,11 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char OCI_G(num_links)++; } -#ifdef HAVE_DTRACE +#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_DTRACE */ +#endif /* HAVE_OCI8_DTRACE */ return connection; } @@ -2773,11 +2781,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) { -#ifdef HAVE_DTRACE +#ifdef HAVE_OCI8_DTRACE if (DTRACE_OCI8_CONNECT_EXPIRY_ENABLED()) { DTRACE_OCI8_CONNECT_EXPIRY(connection, connection->is_stub ? 1 : 0, connection->idle_expiry, timestamp); } -#endif /* HAVE_DTRACE */ +#endif /* HAVE_OCI8_DTRACE */ if (connection->idle_expiry < timestamp) { /* connection has timed out */ return ZEND_HASH_APPLY_REMOVE; @@ -2913,11 +2921,11 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha PHP_OCI_CALL(OCIHandleFree, ((dvoid *) spoolAuth, (ub4) OCI_HTYPE_AUTHINFO)); } -#ifdef HAVE_DTRACE +#ifdef HAVE_OCI8_DTRACE if (DTRACE_OCI8_SESSPOOL_CREATE_ENABLED()) { DTRACE_OCI8_SESSPOOL_CREATE(session_pool); } -#endif /* HAVE_DTRACE */ +#endif /* HAVE_OCI8_DTRACE */ return session_pool; } @@ -3241,11 +3249,11 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool connection->using_spool = 1; } -#ifdef HAVE_DTRACE +#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_DTRACE */ +#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 @@ -3294,7 +3302,7 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool /* }}} */ /* {{{ Debug statements */ -#ifdef HAVE_DTRACE +#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))); @@ -3302,7 +3310,7 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool numfree = numopen - numbusy; /* number of free connections in the pool */ DTRACE_OCI8_SESSPOOL_STATS(numfree, numbusy, numopen); } -#endif /* HAVE_DTRACE */ +#endif /* HAVE_OCI8_DTRACE */ /* }}} */ /* Ping loop: Ping and loop till we get a good connection. When a database instance goes @@ -3471,11 +3479,11 @@ static sword php_oci_ping_init(php_oci_connection *connection, OCIError *errh TS */ void php_oci_dtrace_check_connection(php_oci_connection *connection, sword errcode, ub4 serverStatus) { -#ifdef HAVE_DTRACE +#ifdef HAVE_OCI8_DTRACE if (DTRACE_OCI8_CHECK_CONNECTION_ENABLED()) { DTRACE_OCI8_CHECK_CONNECTION(connection, connection && connection->is_open ? 1 : 0, (int)errcode, (unsigned long)serverStatus); } -#endif /* HAVE_DTRACE */ +#endif /* HAVE_OCI8_DTRACE */ } /* }}} */ diff --git a/ext/oci8/oci8_statement.c b/ext/oci8/oci8_statement.c index 752a45bcb8107..2e6fdabee3ca4 100644 --- a/ext/oci8/oci8_statement.c +++ b/ext/oci8/oci8_statement.c @@ -53,11 +53,11 @@ php_oci_statement *php_oci_statement_create(php_oci_connection *connection, char /* 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_DTRACE +#ifdef HAVE_OCI8_DTRACE if (DTRACE_OCI8_SQLTEXT_ENABLED()) { DTRACE_OCI8_SQLTEXT(query); } -#endif /* HAVE_DTRACE */ +#endif /* HAVE_OCI8_DTRACE */ } PHP_OCI_CALL(OCIHandleAlloc, (connection->env, (dvoid **)&(statement->err), OCI_HTYPE_ERROR, 0, NULL)); @@ -488,11 +488,11 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) case OCI_DESCRIBE_ONLY: case OCI_DEFAULT: /* only these are allowed */ -#ifdef HAVE_DTRACE +#ifdef HAVE_OCI8_DTRACE if (DTRACE_OCI8_EXECUTE_MODE_ENABLED()) { DTRACE_OCI8_EXECUTE_MODE(mode); } -#endif /* HAVE_DTRACE */ +#endif /* HAVE_OCI8_DTRACE */ break; default: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid execute mode given: %d", mode); diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index 4dc78d4983774..f18e7afeead50 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -40,7 +40,7 @@ http://pear.php.net/dtd/package-2.0.xsd"> no - 2013-07-24 + 2013-08-30 @@ -53,8 +53,10 @@ http://pear.php.net/dtd/package-2.0.xsd"> PHP - Fixed --enable-maintainer-zts mode - Allow Implicit Result Set statement resources to inherit the parent's current prefetch count + 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. @@ -468,21 +470,21 @@ http://pear.php.net/dtd/package-2.0.xsd"> - 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. + 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. + 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: diff --git a/ext/oci8/php_oci8_int.h b/ext/oci8/php_oci8_int.h index ac58145f44957..24d80a8163480 100644 --- a/ext/oci8/php_oci8_int.h +++ b/ext/oci8/php_oci8_int.h @@ -44,7 +44,7 @@ # endif # endif /* osf alpha */ -#ifdef HAVE_DTRACE +#ifdef HAVE_OCI8_DTRACE #include "oci8_dtrace_gen.h" #endif From 08567145763f25aae3882f682d41d1b50cd9e666 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 26 Aug 2013 19:06:36 +0200 Subject: [PATCH 061/400] Always pass return_value_ptr to internal functions Previous some places passed return_value_ptr only if the function returned by reference. Now return_value_ptr is always set, even for functions returning by-value. This allows you to return zvals without copying their contents. For this purpose two new macros RETVAL_ZVAL_FAST and RETURN_ZVAL_FAST are added: RETVAL_ZVAL_FAST(zv); /* Analog to RETVAL_ZVAL(zv, 1, 0) */ RETURN_ZVAL_FAST(zv); /* Analog to RETURN_ZVAL(zv, 1, 0) */ These macros behave similarly to the non-FAST versions with copy=1 and dtor=0, with the difference that the FAST versions will try return the zval without copying by utilizing return_value_ptr. --- UPGRADING.INTERNALS | 15 +++++++++++++++ Zend/zend_API.h | 12 ++++++++++++ Zend/zend_execute.c | 16 +++++++++------- Zend/zend_execute_API.c | 4 ++-- Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 2 +- 6 files changed, 40 insertions(+), 11 deletions(-) diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index 566f310998738..7cb5539fc1c22 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -4,6 +4,7 @@ UPGRADE NOTES - PHP X.Y 1. Internal API changes 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 @@ -43,6 +44,20 @@ UPGRADE NOTES - PHP X.Y 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 ======================== diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 1a7c66e906d02..16e766d8a51ea 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -636,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_execute.c b/Zend/zend_execute.c index 3c3dd8e3b0b57..048c1fc18495d 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1487,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 83c221798416f..0b29086a0d5d0 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_vm_def.h b/Zend/zend_vm_def.h index 7e4f7a897d2db..4ab212923575f 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1990,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); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 5f2c8055a02de..0ea5fc485928f 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -551,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); } From 47ee470992014c738891d05b5acc89c2de90f2ac Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 26 Aug 2013 19:14:34 +0200 Subject: [PATCH 062/400] Make use of direct returns in some places --- Zend/zend_closures.c | 10 ++-------- Zend/zend_generators.c | 8 ++++---- Zend/zend_object_handlers.c | 14 ++++---------- ext/standard/array.c | 21 +++++++++++---------- 4 files changed, 21 insertions(+), 32 deletions(-) diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index 5faefbd2241a4..fcad86f171058 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_generators.c b/Zend/zend_generators.c index 1a805bbd6d61c..c6b211ae4d7ae 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_object_handlers.c b/Zend/zend_object_handlers.c index 921e0d798a069..8beacdfd352b4 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 */ diff --git a/ext/standard/array.c b/ext/standard/array.c index 51972033ee711..ae6e5d266fa29 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); From d515455589d836e709a65590e14d85575bdd2766 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustavo=20Andr=C3=A9=20dos=20Santos=20Lopes?= Date: Mon, 2 Sep 2013 01:53:06 +0200 Subject: [PATCH 063/400] Implement phase 1 of rfc/incompat_ctx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Just changing the error level of the message from E_STRICT to E_DEPRECATED. This comes one version later than the timeline mentioned in the RFC. Oddly, there were no tests for this ‘feature’. I added a simple one. --- Zend/tests/incompat_ctx_user.phpt | 20 ++++++++++++++++++++ Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 20 ++++++++++---------- 3 files changed, 31 insertions(+), 11 deletions(-) create mode 100644 Zend/tests/incompat_ctx_user.phpt diff --git a/Zend/tests/incompat_ctx_user.phpt b/Zend/tests/incompat_ctx_user.phpt new file mode 100644 index 0000000000000..2d9b59c1e8030 --- /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-- +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/zend_vm_def.h b/Zend/zend_vm_def.h index 4ab212923575f..2bc80faa4e841 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2609,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); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 0ea5fc485928f..08fb84738298d 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -3661,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); @@ -4654,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); @@ -5512,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); @@ -6232,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); @@ -7092,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); @@ -15561,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); @@ -17914,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); @@ -20227,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); @@ -21667,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); @@ -23685,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); From ed038d2ee330f827e24dc865ec8963175c1bfc2e Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Mon, 2 Sep 2013 16:02:24 +0800 Subject: [PATCH 064/400] Add a XFAIL test for #64896 --- Zend/tests/bug64896.phpt | 47 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 Zend/tests/bug64896.phpt diff --git a/Zend/tests/bug64896.phpt b/Zend/tests/bug64896.phpt new file mode 100644 index 0000000000000..e3e9f056321c1 --- /dev/null +++ b/Zend/tests/bug64896.phpt @@ -0,0 +1,47 @@ +--TEST-- +Bug #64896 (Segfault with gc_collect_cycles using unserialize on certain objects) +--XFAIL-- +We can not fix this bug with a significant (performace slow down) change to gc +--FILE-- +_private[] = 'php'; + } + + public function __destruct() + { + global $bar; + $bar = $this; + } +} + +$foo = new stdclass; +$foo->foo = $foo; +$foo->bad = new bad; + +gc_disable(); + +unserialize(serialize($foo)); +gc_collect_cycles(); +var_dump($bar); +/* will output: +object(bad)#4 (1) { + ["_private":"bad":private]=> + &UNKNOWN:0 +} +*/ +?> +--EXPECTF-- +bject(bad)#%d (1) { + ["_private":"bad":private]=> + array(1) { + [0]=> + string(3) "php" + } +} From 6c48c6bc789e4a2f5bf480bd2c62070ee1152e62 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Mon, 2 Sep 2013 16:15:52 +0800 Subject: [PATCH 065/400] Typo.... --- Zend/tests/bug64896.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/tests/bug64896.phpt b/Zend/tests/bug64896.phpt index e3e9f056321c1..3e955bbece7de 100644 --- a/Zend/tests/bug64896.phpt +++ b/Zend/tests/bug64896.phpt @@ -1,7 +1,7 @@ --TEST-- Bug #64896 (Segfault with gc_collect_cycles using unserialize on certain objects) --XFAIL-- -We can not fix this bug with a significant (performace slow down) change to gc +We can not fix this bug without a significant (performace slow down) change to gc --FILE-- Date: Mon, 2 Sep 2013 23:19:53 +0200 Subject: [PATCH 066/400] Update NEWS/UPGRADING with info about incompat ctx --- NEWS | 3 +++ UPGRADING | 3 +++ 2 files changed, 6 insertions(+) diff --git a/NEWS b/NEWS index 0c94ea23e12c7..29b5c9c0d0b57 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,9 @@ PHP NEWS . 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 #65315 (session.hash_function silently fallback to default md5) diff --git a/UPGRADING b/UPGRADING index 431ad79e999b9..f392edd54d655 100755 --- a/UPGRADING +++ b/UPGRADING @@ -35,6 +35,9 @@ PHP X.Y UPGRADE NOTES 3. Deprecated Functionality ======================================== +- 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 From 5ffaf95d3f6d8634cdc218ea6bfdb24c7887148c Mon Sep 17 00:00:00 2001 From: Tim Strehle Date: Tue, 3 Sep 2013 14:38:52 +0200 Subject: [PATCH 067/400] run-tests.php: Adding support for sections EXPECT_EXTERNAL, EXPECTF_EXTERNAL and EXPECTREGEX_EXTERNAL. (Issue 55736) --- run-tests.php | 22 +++++++++++++--------- tests/run-test/test011.phpt | 6 ++++++ tests/run-test/test011.txt | 1 + tests/run-test/test012.phpt | 12 ++++++++++++ tests/run-test/test012.txt | 7 +++++++ tests/run-test/test013.phpt | 6 ++++++ tests/run-test/test013.txt | 1 + 7 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 tests/run-test/test011.phpt create mode 100644 tests/run-test/test011.txt create mode 100644 tests/run-test/test012.phpt create mode 100644 tests/run-test/test012.txt create mode 100644 tests/run-test/test013.phpt create mode 100644 tests/run-test/test013.txt diff --git a/run-tests.php b/run-tests.php index 54a12a177d043..dc88ddffedf71 100755 --- a/run-tests.php +++ b/run-tests.php @@ -1289,16 +1289,20 @@ function run_test($php, $file, $env) unset($section_text['FILEEOF']); } - if (@count($section_text['FILE_EXTERNAL']) == 1) { - // don't allow tests to retrieve files from anywhere but this subdirectory - $section_text['FILE_EXTERNAL'] = dirname($file) . '/' . trim(str_replace('..', '', $section_text['FILE_EXTERNAL'])); + foreach (array( 'FILE', 'EXPECT', 'EXPECTF', 'EXPECTREGEX' ) as $prefix) { + $key = $prefix . '_EXTERNAL'; - if (file_exists($section_text['FILE_EXTERNAL'])) { - $section_text['FILE'] = file_get_contents($section_text['FILE_EXTERNAL'], FILE_BINARY); - unset($section_text['FILE_EXTERNAL']); - } else { - $bork_info = "could not load --FILE_EXTERNAL-- " . dirname($file) . '/' . trim($section_text['FILE_EXTERNAL']); - $borked = true; + if (@count($section_text[$key]) == 1) { + // don't allow tests to retrieve files from anywhere but this subdirectory + $section_text[$key] = dirname($file) . '/' . trim(str_replace('..', '', $section_text[$key])); + + if (file_exists($section_text[$key])) { + $section_text[$prefix] = file_get_contents($section_text[$key], FILE_BINARY); + unset($section_text[$key]); + } else { + $bork_info = "could not load --" . $key . "-- " . dirname($file) . '/' . trim($section_text[$key]); + $borked = true; + } } } diff --git a/tests/run-test/test011.phpt b/tests/run-test/test011.phpt new file mode 100644 index 0000000000000..17f1f7aee6c9e --- /dev/null +++ b/tests/run-test/test011.phpt @@ -0,0 +1,6 @@ +--TEST-- +EXPECT_EXTERNAL +--FILE-- +abc +--EXPECT_EXTERNAL-- +test011.txt diff --git a/tests/run-test/test011.txt b/tests/run-test/test011.txt new file mode 100644 index 0000000000000..8baef1b4abc47 --- /dev/null +++ b/tests/run-test/test011.txt @@ -0,0 +1 @@ +abc diff --git a/tests/run-test/test012.phpt b/tests/run-test/test012.phpt new file mode 100644 index 0000000000000..8213aa2a5610e --- /dev/null +++ b/tests/run-test/test012.phpt @@ -0,0 +1,12 @@ +--TEST-- +EXPECTF_EXTERNAL +--FILE-- +123 +-123 ++123 ++1.1 +abc +0abc +x +--EXPECTF_EXTERNAL-- +test012.txt diff --git a/tests/run-test/test012.txt b/tests/run-test/test012.txt new file mode 100644 index 0000000000000..bb293214b1da9 --- /dev/null +++ b/tests/run-test/test012.txt @@ -0,0 +1,7 @@ +%d +%i +%i +%f +%s +%x +%c diff --git a/tests/run-test/test013.phpt b/tests/run-test/test013.phpt new file mode 100644 index 0000000000000..79ccd20de218c --- /dev/null +++ b/tests/run-test/test013.phpt @@ -0,0 +1,6 @@ +--TEST-- +EXPECTREGEX_EXTERNAL +--FILE-- +abcde12314235xyz34264768286abcde +--EXPECTREGEX_EXTERNAL-- +test013.txt diff --git a/tests/run-test/test013.txt b/tests/run-test/test013.txt new file mode 100644 index 0000000000000..6c280ece4d44f --- /dev/null +++ b/tests/run-test/test013.txt @@ -0,0 +1 @@ +[abcde]+[0-5]*xyz[2-8]+abcde From 7beef74a827f393753852f7239af75af236fb4f8 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Tue, 3 Sep 2013 13:38:15 -0700 Subject: [PATCH 068/400] 5.4.21 now --- NEWS | 2 ++ configure.in | 2 +- main/php_version.h | 6 +++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 76eb1faa0d07d..486ccb2a88845 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,7 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +?? ??? 2013, PHP 5.4.21 + ?? ??? 2013, PHP 5.4.20 - Core: diff --git a/configure.in b/configure.in index 9a99680a47129..30de2c3aaa803 100644 --- a/configure.in +++ b/configure.in @@ -119,7 +119,7 @@ int zend_sprintf(char *buffer, const char *format, ...); PHP_MAJOR_VERSION=5 PHP_MINOR_VERSION=4 -PHP_RELEASE_VERSION=20 +PHP_RELEASE_VERSION=21 PHP_EXTRA_VERSION="-dev" PHP_VERSION="$PHP_MAJOR_VERSION.$PHP_MINOR_VERSION.$PHP_RELEASE_VERSION$PHP_EXTRA_VERSION" PHP_VERSION_ID=`expr [$]PHP_MAJOR_VERSION \* 10000 + [$]PHP_MINOR_VERSION \* 100 + [$]PHP_RELEASE_VERSION` diff --git a/main/php_version.h b/main/php_version.h index 9dc00237feaba..e30528ed51d00 100644 --- a/main/php_version.h +++ b/main/php_version.h @@ -2,7 +2,7 @@ /* edit configure.in to change version number */ #define PHP_MAJOR_VERSION 5 #define PHP_MINOR_VERSION 4 -#define PHP_RELEASE_VERSION 20 +#define PHP_RELEASE_VERSION 21 #define PHP_EXTRA_VERSION "-dev" -#define PHP_VERSION "5.4.20-dev" -#define PHP_VERSION_ID 50420 +#define PHP_VERSION "5.4.21-dev" +#define PHP_VERSION_ID 50421 From 6ece5503942a1d8c4a78504161f9466e9e14fed2 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Tue, 3 Sep 2013 15:17:36 -0700 Subject: [PATCH 069/400] Cast time_t since some "dtrace -G" invocations fail on time_t arguments --- ext/oci8/oci8.c | 2 +- ext/oci8/oci8_dtrace.d | 2 +- ext/oci8/package.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index b183e480af358..2ff52b8eda577 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -2783,7 +2783,7 @@ static int php_oci_persistent_helper(zend_rsrc_list_entry *le TSRMLS_DC) if (!connection->used_this_request && OCI_G(persistent_timeout) != -1) { #ifdef HAVE_OCI8_DTRACE if (DTRACE_OCI8_CONNECT_EXPIRY_ENABLED()) { - DTRACE_OCI8_CONNECT_EXPIRY(connection, connection->is_stub ? 1 : 0, connection->idle_expiry, timestamp); + 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) { diff --git a/ext/oci8/oci8_dtrace.d b/ext/oci8/oci8_dtrace.d index 15d210cf6dfbc..d6982f030c3bf 100644 --- a/ext/oci8/oci8_dtrace.d +++ b/ext/oci8/oci8_dtrace.d @@ -27,7 +27,7 @@ provider php { 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, time_t idle_expiry, time_t timestamp); + 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); diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index f18e7afeead50..f2c59a1dc1d77 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -40,7 +40,7 @@ http://pear.php.net/dtd/package-2.0.xsd"> no - 2013-08-30 + 2013-09-03 From 0e10f26e277b8916b2a8eee2b975cd9e436a8fb7 Mon Sep 17 00:00:00 2001 From: Julien Pauli Date: Wed, 4 Sep 2013 11:22:23 +0200 Subject: [PATCH 070/400] 5.5.5 now --- NEWS | 2 ++ configure.in | 2 +- main/php_version.h | 6 +++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index ab1b5caeefc75..817f9f74db690 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,7 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +?? ??? 2013, PHP 5.5.5 + ?? ??? 2013, PHP 5.5.4 - Core: diff --git a/configure.in b/configure.in index 47ce23c520fa1..40130626cb9f9 100644 --- a/configure.in +++ b/configure.in @@ -119,7 +119,7 @@ int zend_sprintf(char *buffer, const char *format, ...); PHP_MAJOR_VERSION=5 PHP_MINOR_VERSION=5 -PHP_RELEASE_VERSION=4 +PHP_RELEASE_VERSION=5 PHP_EXTRA_VERSION="-dev" PHP_VERSION="$PHP_MAJOR_VERSION.$PHP_MINOR_VERSION.$PHP_RELEASE_VERSION$PHP_EXTRA_VERSION" PHP_VERSION_ID=`expr [$]PHP_MAJOR_VERSION \* 10000 + [$]PHP_MINOR_VERSION \* 100 + [$]PHP_RELEASE_VERSION` diff --git a/main/php_version.h b/main/php_version.h index 4a538a4138a10..d9ea4aab3cd61 100644 --- a/main/php_version.h +++ b/main/php_version.h @@ -2,7 +2,7 @@ /* edit configure.in to change version number */ #define PHP_MAJOR_VERSION 5 #define PHP_MINOR_VERSION 5 -#define PHP_RELEASE_VERSION 4 +#define PHP_RELEASE_VERSION 5 #define PHP_EXTRA_VERSION "-dev" -#define PHP_VERSION "5.5.4-dev" -#define PHP_VERSION_ID 50504 +#define PHP_VERSION "5.5.5-dev" +#define PHP_VERSION_ID 50505 From 8ca43527e8b7e076779560f1472518bd1fe4d6ca Mon Sep 17 00:00:00 2001 From: Manuel Mausz Date: Thu, 5 Sep 2013 01:04:25 +0200 Subject: [PATCH 071/400] Add support for CryptoPro S-box for GOST This adds a new hash identifier "gost-crypto" which uses the CryptoPro S-box tables as specified by RFC 4357, section 11.2. --- ext/hash/hash.c | 1 + ext/hash/hash_gost.c | 71 ++++++++++------ ext/hash/php_hash.h | 1 + ext/hash/php_hash_gost.h | 1 + ext/hash/php_hash_gost_tables.h | 141 +++++++++++++++++++++++++++++++- ext/hash/tests/gost.phpt | 13 +++ 6 files changed, 200 insertions(+), 28 deletions(-) diff --git a/ext/hash/hash.c b/ext/hash/hash.c index 117221484e363..87f19c5cacb1e 100644 --- a/ext/hash/hash.c +++ b/ext/hash/hash.c @@ -986,6 +986,7 @@ PHP_MINIT_FUNCTION(hash) php_hash_register_algo("snefru", &php_hash_snefru_ops); php_hash_register_algo("snefru256", &php_hash_snefru_ops); php_hash_register_algo("gost", &php_hash_gost_ops); + php_hash_register_algo("gost-crypto", &php_hash_gost_crypto_ops); php_hash_register_algo("adler32", &php_hash_adler32_ops); php_hash_register_algo("crc32", &php_hash_crc32_ops); php_hash_register_algo("crc32b", &php_hash_crc32b_ops); diff --git a/ext/hash/hash_gost.c b/ext/hash/hash_gost.c index 3961c4f2d5c36..7546c8d333dd4 100644 --- a/ext/hash/hash_gost.c +++ b/ext/hash/hash_gost.c @@ -27,7 +27,7 @@ * derived from gost_compress() by Markku-Juhani Saarinen */ -#define round(k1, k2) \ +#define round(tables, k1, k2) \ t = (k1) + r; \ l ^= tables[0][t & 0xff] ^ tables[1][(t >> 8) & 0xff] ^ \ tables[2][(t >> 16) & 0xff] ^ tables[3][t >> 24]; \ @@ -35,25 +35,25 @@ r ^= tables[0][t & 0xff] ^ tables[1][(t >> 8) & 0xff] ^ \ tables[2][(t >> 16) & 0xff] ^ tables[3][t >> 24]; -#define R(key, h, i, t, l, r) \ +#define R(tables, key, h, i, t, l, r) \ r = h[i]; \ l = h[i + 1]; \ - round(key[0], key[1]) \ - round(key[2], key[3]) \ - round(key[4], key[5]) \ - round(key[6], key[7]) \ - round(key[0], key[1]) \ - round(key[2], key[3]) \ - round(key[4], key[5]) \ - round(key[6], key[7]) \ - round(key[0], key[1]) \ - round(key[2], key[3]) \ - round(key[4], key[5]) \ - round(key[6], key[7]) \ - round(key[7], key[6]) \ - round(key[5], key[4]) \ - round(key[3], key[2]) \ - round(key[1], key[0]) \ + round(tables, key[0], key[1]) \ + round(tables, key[2], key[3]) \ + round(tables, key[4], key[5]) \ + round(tables, key[6], key[7]) \ + round(tables, key[0], key[1]) \ + round(tables, key[2], key[3]) \ + round(tables, key[4], key[5]) \ + round(tables, key[6], key[7]) \ + round(tables, key[0], key[1]) \ + round(tables, key[2], key[3]) \ + round(tables, key[4], key[5]) \ + round(tables, key[6], key[7]) \ + round(tables, key[7], key[6]) \ + round(tables, key[5], key[4]) \ + round(tables, key[3], key[2]) \ + round(tables, key[1], key[0]) \ t = r; \ r = l; \ l = t; \ @@ -194,10 +194,10 @@ (v[3] >> 16) ^ v[3] ^ (v[4] << 16) ^ v[4] ^ (v[5] >> 16) ^ v[5] ^ \ (v[6] << 16) ^ (v[6] >> 16) ^ (v[7] << 16) ^ v[7]; -#define PASS \ +#define PASS(tables) \ X(w, u, v); \ P(key, w); \ - R(key, h, i, t, l, r); \ + R((tables), key, h, i, t, l, r); \ S(s, l, r); \ if (i != 6) { \ A(u, l, r); \ @@ -207,16 +207,16 @@ AA(v, l, r); \ } -static inline void Gost(php_hash_uint32 state[8], php_hash_uint32 data[8]) +static inline void Gost(PHP_GOST_CTX *context, php_hash_uint32 data[8]) { int i; - php_hash_uint32 l, r, t, key[8], u[8], v[8], w[8], s[8], *h = state, *m = data; + php_hash_uint32 l, r, t, key[8], u[8], v[8], w[8], s[8], *h = context->state, *m = data; - memcpy(u, state, sizeof(u)); + memcpy(u, context->state, sizeof(u)); memcpy(v, data, sizeof(v)); for (i = 0; i < 8; i += 2) { - PASS; + PASS(*context->tables); } SHIFT12(u, m, s); SHIFT16(h, v, u); @@ -237,12 +237,19 @@ static inline void GostTransform(PHP_GOST_CTX *context, const unsigned char inpu temp = ((context->state[i + 8] < data[i]) || (context->state[i + 8] < save)) ? 1 : 0; } - Gost(context->state, data); + Gost(context, data); } PHP_HASH_API void PHP_GOSTInit(PHP_GOST_CTX *context) { memset(context, 0, sizeof(*context)); + context->tables = &tables_test; +} + +PHP_HASH_API void PHP_GOSTInitCrypto(PHP_GOST_CTX *context) +{ + PHP_GOSTInit(context); + context->tables = &tables_crypto; } static const php_hash_uint32 MAX32 = 0xffffffffLU; @@ -288,9 +295,9 @@ PHP_HASH_API void PHP_GOSTFinal(unsigned char digest[32], PHP_GOST_CTX *context) } memcpy(l, context->count, sizeof(context->count)); - Gost(context->state, l); + Gost(context, l); memcpy(l, &context->state[8], sizeof(l)); - Gost(context->state, l); + Gost(context, l); for (i = 0, j = 0; j < 32; i++, j += 4) { digest[j] = (unsigned char) (context->state[i] & 0xff); @@ -312,6 +319,16 @@ const php_hash_ops php_hash_gost_ops = { sizeof(PHP_GOST_CTX) }; +const php_hash_ops php_hash_gost_crypto_ops = { + (php_hash_init_func_t) PHP_GOSTInitCrypto, + (php_hash_update_func_t) PHP_GOSTUpdate, + (php_hash_final_func_t) PHP_GOSTFinal, + (php_hash_copy_func_t) php_hash_copy, + 32, + 32, + sizeof(PHP_GOST_CTX) +}; + /* * Local variables: * tab-width: 4 diff --git a/ext/hash/php_hash.h b/ext/hash/php_hash.h index 3f5e7ced3a19b..e92572216aea4 100644 --- a/ext/hash/php_hash.h +++ b/ext/hash/php_hash.h @@ -80,6 +80,7 @@ extern const php_hash_ops php_hash_4tiger160_ops; extern const php_hash_ops php_hash_4tiger192_ops; extern const php_hash_ops php_hash_snefru_ops; extern const php_hash_ops php_hash_gost_ops; +extern const php_hash_ops php_hash_gost_crypto_ops; extern const php_hash_ops php_hash_adler32_ops; extern const php_hash_ops php_hash_crc32_ops; extern const php_hash_ops php_hash_crc32b_ops; diff --git a/ext/hash/php_hash_gost.h b/ext/hash/php_hash_gost.h index 6a4af310dc64c..a9c137530c4ae 100644 --- a/ext/hash/php_hash_gost.h +++ b/ext/hash/php_hash_gost.h @@ -29,6 +29,7 @@ typedef struct { php_hash_uint32 count[2]; unsigned char length; unsigned char buffer[32]; + const php_hash_uint32 (*tables)[4][256]; } PHP_GOST_CTX; PHP_HASH_API void PHP_GOSTInit(PHP_GOST_CTX *); diff --git a/ext/hash/php_hash_gost_tables.h b/ext/hash/php_hash_gost_tables.h index 5d05e593cb13a..a00d8b74907d2 100644 --- a/ext/hash/php_hash_gost_tables.h +++ b/ext/hash/php_hash_gost_tables.h @@ -1,4 +1,4 @@ -static const php_hash_uint32 tables[4][256] = { +static const php_hash_uint32 tables_test[4][256] = { { /* table 1 */ 0x00072000LU, 0x00075000LU, 0x00074800LU, 0x00071000LU, 0x00076800LU, 0x00074000LU, 0x00070000LU, 0x00077000LU, 0x00073000LU, 0x00075800LU, 0x00070800LU, 0x00076000LU, 0x00073800LU, 0x00077800LU, 0x00072800LU, 0x00071800LU, @@ -136,3 +136,142 @@ static const php_hash_uint32 tables[4][256] = { 0x00000600LU, 0x00000650LU, 0x00000670LU, 0x00000638LU, 0x00000630LU, 0x00000640LU, 0x00000610LU, 0x00000660LU, }, }; + +static const php_hash_uint32 tables_crypto[4][256] = { + { /* table 1 */ + 0x0002d000LU, 0x0002a000LU, 0x0002a800LU, 0x0002b000LU, 0x0002c000LU, 0x00028800LU, 0x00029800LU, 0x0002b800LU, + 0x0002e800LU, 0x0002e000LU, 0x0002f000LU, 0x00028000LU, 0x0002c800LU, 0x00029000LU, 0x0002d800LU, 0x0002f800LU, + 0x0007d000LU, 0x0007a000LU, 0x0007a800LU, 0x0007b000LU, 0x0007c000LU, 0x00078800LU, 0x00079800LU, 0x0007b800LU, + 0x0007e800LU, 0x0007e000LU, 0x0007f000LU, 0x00078000LU, 0x0007c800LU, 0x00079000LU, 0x0007d800LU, 0x0007f800LU, + 0x00025000LU, 0x00022000LU, 0x00022800LU, 0x00023000LU, 0x00024000LU, 0x00020800LU, 0x00021800LU, 0x00023800LU, + 0x00026800LU, 0x00026000LU, 0x00027000LU, 0x00020000LU, 0x00024800LU, 0x00021000LU, 0x00025800LU, 0x00027800LU, + 0x00005000LU, 0x00002000LU, 0x00002800LU, 0x00003000LU, 0x00004000LU, 0x00000800LU, 0x00001800LU, 0x00003800LU, + 0x00006800LU, 0x00006000LU, 0x00007000LU, 0x00000000LU, 0x00004800LU, 0x00001000LU, 0x00005800LU, 0x00007800LU, + 0x00015000LU, 0x00012000LU, 0x00012800LU, 0x00013000LU, 0x00014000LU, 0x00010800LU, 0x00011800LU, 0x00013800LU, + 0x00016800LU, 0x00016000LU, 0x00017000LU, 0x00010000LU, 0x00014800LU, 0x00011000LU, 0x00015800LU, 0x00017800LU, + 0x0006d000LU, 0x0006a000LU, 0x0006a800LU, 0x0006b000LU, 0x0006c000LU, 0x00068800LU, 0x00069800LU, 0x0006b800LU, + 0x0006e800LU, 0x0006e000LU, 0x0006f000LU, 0x00068000LU, 0x0006c800LU, 0x00069000LU, 0x0006d800LU, 0x0006f800LU, + 0x0005d000LU, 0x0005a000LU, 0x0005a800LU, 0x0005b000LU, 0x0005c000LU, 0x00058800LU, 0x00059800LU, 0x0005b800LU, + 0x0005e800LU, 0x0005e000LU, 0x0005f000LU, 0x00058000LU, 0x0005c800LU, 0x00059000LU, 0x0005d800LU, 0x0005f800LU, + 0x0004d000LU, 0x0004a000LU, 0x0004a800LU, 0x0004b000LU, 0x0004c000LU, 0x00048800LU, 0x00049800LU, 0x0004b800LU, + 0x0004e800LU, 0x0004e000LU, 0x0004f000LU, 0x00048000LU, 0x0004c800LU, 0x00049000LU, 0x0004d800LU, 0x0004f800LU, + 0x0000d000LU, 0x0000a000LU, 0x0000a800LU, 0x0000b000LU, 0x0000c000LU, 0x00008800LU, 0x00009800LU, 0x0000b800LU, + 0x0000e800LU, 0x0000e000LU, 0x0000f000LU, 0x00008000LU, 0x0000c800LU, 0x00009000LU, 0x0000d800LU, 0x0000f800LU, + 0x0003d000LU, 0x0003a000LU, 0x0003a800LU, 0x0003b000LU, 0x0003c000LU, 0x00038800LU, 0x00039800LU, 0x0003b800LU, + 0x0003e800LU, 0x0003e000LU, 0x0003f000LU, 0x00038000LU, 0x0003c800LU, 0x00039000LU, 0x0003d800LU, 0x0003f800LU, + 0x00035000LU, 0x00032000LU, 0x00032800LU, 0x00033000LU, 0x00034000LU, 0x00030800LU, 0x00031800LU, 0x00033800LU, + 0x00036800LU, 0x00036000LU, 0x00037000LU, 0x00030000LU, 0x00034800LU, 0x00031000LU, 0x00035800LU, 0x00037800LU, + 0x0001d000LU, 0x0001a000LU, 0x0001a800LU, 0x0001b000LU, 0x0001c000LU, 0x00018800LU, 0x00019800LU, 0x0001b800LU, + 0x0001e800LU, 0x0001e000LU, 0x0001f000LU, 0x00018000LU, 0x0001c800LU, 0x00019000LU, 0x0001d800LU, 0x0001f800LU, + 0x00065000LU, 0x00062000LU, 0x00062800LU, 0x00063000LU, 0x00064000LU, 0x00060800LU, 0x00061800LU, 0x00063800LU, + 0x00066800LU, 0x00066000LU, 0x00067000LU, 0x00060000LU, 0x00064800LU, 0x00061000LU, 0x00065800LU, 0x00067800LU, + 0x00075000LU, 0x00072000LU, 0x00072800LU, 0x00073000LU, 0x00074000LU, 0x00070800LU, 0x00071800LU, 0x00073800LU, + 0x00076800LU, 0x00076000LU, 0x00077000LU, 0x00070000LU, 0x00074800LU, 0x00071000LU, 0x00075800LU, 0x00077800LU, + 0x00055000LU, 0x00052000LU, 0x00052800LU, 0x00053000LU, 0x00054000LU, 0x00050800LU, 0x00051800LU, 0x00053800LU, + 0x00056800LU, 0x00056000LU, 0x00057000LU, 0x00050000LU, 0x00054800LU, 0x00051000LU, 0x00055800LU, 0x00057800LU, + 0x00045000LU, 0x00042000LU, 0x00042800LU, 0x00043000LU, 0x00044000LU, 0x00040800LU, 0x00041800LU, 0x00043800LU, + 0x00046800LU, 0x00046000LU, 0x00047000LU, 0x00040000LU, 0x00044800LU, 0x00041000LU, 0x00045800LU, 0x00047800LU, + }, + { /* table 2 */ + 0x02380000LU, 0x02780000LU, 0x02600000LU, 0x02700000LU, 0x02480000LU, 0x02200000LU, 0x02080000LU, 0x02000000LU, + 0x02180000LU, 0x02580000LU, 0x02280000LU, 0x02100000LU, 0x02300000LU, 0x02500000LU, 0x02400000LU, 0x02680000LU, + 0x05380000LU, 0x05780000LU, 0x05600000LU, 0x05700000LU, 0x05480000LU, 0x05200000LU, 0x05080000LU, 0x05000000LU, + 0x05180000LU, 0x05580000LU, 0x05280000LU, 0x05100000LU, 0x05300000LU, 0x05500000LU, 0x05400000LU, 0x05680000LU, + 0x03b80000LU, 0x03f80000LU, 0x03e00000LU, 0x03f00000LU, 0x03c80000LU, 0x03a00000LU, 0x03880000LU, 0x03800000LU, + 0x03980000LU, 0x03d80000LU, 0x03a80000LU, 0x03900000LU, 0x03b00000LU, 0x03d00000LU, 0x03c00000LU, 0x03e80000LU, + 0x06380000LU, 0x06780000LU, 0x06600000LU, 0x06700000LU, 0x06480000LU, 0x06200000LU, 0x06080000LU, 0x06000000LU, + 0x06180000LU, 0x06580000LU, 0x06280000LU, 0x06100000LU, 0x06300000LU, 0x06500000LU, 0x06400000LU, 0x06680000LU, + 0x00380000LU, 0x00780000LU, 0x00600000LU, 0x00700000LU, 0x00480000LU, 0x00200000LU, 0x00080000LU, 0x00000000LU, + 0x00180000LU, 0x00580000LU, 0x00280000LU, 0x00100000LU, 0x00300000LU, 0x00500000LU, 0x00400000LU, 0x00680000LU, + 0x07b80000LU, 0x07f80000LU, 0x07e00000LU, 0x07f00000LU, 0x07c80000LU, 0x07a00000LU, 0x07880000LU, 0x07800000LU, + 0x07980000LU, 0x07d80000LU, 0x07a80000LU, 0x07900000LU, 0x07b00000LU, 0x07d00000LU, 0x07c00000LU, 0x07e80000LU, + 0x01380000LU, 0x01780000LU, 0x01600000LU, 0x01700000LU, 0x01480000LU, 0x01200000LU, 0x01080000LU, 0x01000000LU, + 0x01180000LU, 0x01580000LU, 0x01280000LU, 0x01100000LU, 0x01300000LU, 0x01500000LU, 0x01400000LU, 0x01680000LU, + 0x04380000LU, 0x04780000LU, 0x04600000LU, 0x04700000LU, 0x04480000LU, 0x04200000LU, 0x04080000LU, 0x04000000LU, + 0x04180000LU, 0x04580000LU, 0x04280000LU, 0x04100000LU, 0x04300000LU, 0x04500000LU, 0x04400000LU, 0x04680000LU, + 0x07380000LU, 0x07780000LU, 0x07600000LU, 0x07700000LU, 0x07480000LU, 0x07200000LU, 0x07080000LU, 0x07000000LU, + 0x07180000LU, 0x07580000LU, 0x07280000LU, 0x07100000LU, 0x07300000LU, 0x07500000LU, 0x07400000LU, 0x07680000LU, + 0x00b80000LU, 0x00f80000LU, 0x00e00000LU, 0x00f00000LU, 0x00c80000LU, 0x00a00000LU, 0x00880000LU, 0x00800000LU, + 0x00980000LU, 0x00d80000LU, 0x00a80000LU, 0x00900000LU, 0x00b00000LU, 0x00d00000LU, 0x00c00000LU, 0x00e80000LU, + 0x03380000LU, 0x03780000LU, 0x03600000LU, 0x03700000LU, 0x03480000LU, 0x03200000LU, 0x03080000LU, 0x03000000LU, + 0x03180000LU, 0x03580000LU, 0x03280000LU, 0x03100000LU, 0x03300000LU, 0x03500000LU, 0x03400000LU, 0x03680000LU, + 0x02b80000LU, 0x02f80000LU, 0x02e00000LU, 0x02f00000LU, 0x02c80000LU, 0x02a00000LU, 0x02880000LU, 0x02800000LU, + 0x02980000LU, 0x02d80000LU, 0x02a80000LU, 0x02900000LU, 0x02b00000LU, 0x02d00000LU, 0x02c00000LU, 0x02e80000LU, + 0x06b80000LU, 0x06f80000LU, 0x06e00000LU, 0x06f00000LU, 0x06c80000LU, 0x06a00000LU, 0x06880000LU, 0x06800000LU, + 0x06980000LU, 0x06d80000LU, 0x06a80000LU, 0x06900000LU, 0x06b00000LU, 0x06d00000LU, 0x06c00000LU, 0x06e80000LU, + 0x05b80000LU, 0x05f80000LU, 0x05e00000LU, 0x05f00000LU, 0x05c80000LU, 0x05a00000LU, 0x05880000LU, 0x05800000LU, + 0x05980000LU, 0x05d80000LU, 0x05a80000LU, 0x05900000LU, 0x05b00000LU, 0x05d00000LU, 0x05c00000LU, 0x05e80000LU, + 0x04b80000LU, 0x04f80000LU, 0x04e00000LU, 0x04f00000LU, 0x04c80000LU, 0x04a00000LU, 0x04880000LU, 0x04800000LU, + 0x04980000LU, 0x04d80000LU, 0x04a80000LU, 0x04900000LU, 0x04b00000LU, 0x04d00000LU, 0x04c00000LU, 0x04e80000LU, + 0x01b80000LU, 0x01f80000LU, 0x01e00000LU, 0x01f00000LU, 0x01c80000LU, 0x01a00000LU, 0x01880000LU, 0x01800000LU, + 0x01980000LU, 0x01d80000LU, 0x01a80000LU, 0x01900000LU, 0x01b00000LU, 0x01d00000LU, 0x01c00000LU, 0x01e80000LU, + }, + { /* table 3 */ + 0xb8000003LU, 0xb0000003LU, 0xa0000003LU, 0xd8000003LU, 0xc8000003LU, 0xe0000003LU, 0x90000003LU, 0xd0000003LU, + 0x88000003LU, 0xc0000003LU, 0x80000003LU, 0xf0000003LU, 0xf8000003LU, 0xe8000003LU, 0x98000003LU, 0xa8000003LU, + 0x38000003LU, 0x30000003LU, 0x20000003LU, 0x58000003LU, 0x48000003LU, 0x60000003LU, 0x10000003LU, 0x50000003LU, + 0x08000003LU, 0x40000003LU, 0x00000003LU, 0x70000003LU, 0x78000003LU, 0x68000003LU, 0x18000003LU, 0x28000003LU, + 0x38000001LU, 0x30000001LU, 0x20000001LU, 0x58000001LU, 0x48000001LU, 0x60000001LU, 0x10000001LU, 0x50000001LU, + 0x08000001LU, 0x40000001LU, 0x00000001LU, 0x70000001LU, 0x78000001LU, 0x68000001LU, 0x18000001LU, 0x28000001LU, + 0x38000002LU, 0x30000002LU, 0x20000002LU, 0x58000002LU, 0x48000002LU, 0x60000002LU, 0x10000002LU, 0x50000002LU, + 0x08000002LU, 0x40000002LU, 0x00000002LU, 0x70000002LU, 0x78000002LU, 0x68000002LU, 0x18000002LU, 0x28000002LU, + 0xb8000006LU, 0xb0000006LU, 0xa0000006LU, 0xd8000006LU, 0xc8000006LU, 0xe0000006LU, 0x90000006LU, 0xd0000006LU, + 0x88000006LU, 0xc0000006LU, 0x80000006LU, 0xf0000006LU, 0xf8000006LU, 0xe8000006LU, 0x98000006LU, 0xa8000006LU, + 0xb8000004LU, 0xb0000004LU, 0xa0000004LU, 0xd8000004LU, 0xc8000004LU, 0xe0000004LU, 0x90000004LU, 0xd0000004LU, + 0x88000004LU, 0xc0000004LU, 0x80000004LU, 0xf0000004LU, 0xf8000004LU, 0xe8000004LU, 0x98000004LU, 0xa8000004LU, + 0xb8000007LU, 0xb0000007LU, 0xa0000007LU, 0xd8000007LU, 0xc8000007LU, 0xe0000007LU, 0x90000007LU, 0xd0000007LU, + 0x88000007LU, 0xc0000007LU, 0x80000007LU, 0xf0000007LU, 0xf8000007LU, 0xe8000007LU, 0x98000007LU, 0xa8000007LU, + 0x38000000LU, 0x30000000LU, 0x20000000LU, 0x58000000LU, 0x48000000LU, 0x60000000LU, 0x10000000LU, 0x50000000LU, + 0x08000000LU, 0x40000000LU, 0x00000000LU, 0x70000000LU, 0x78000000LU, 0x68000000LU, 0x18000000LU, 0x28000000LU, + 0x38000005LU, 0x30000005LU, 0x20000005LU, 0x58000005LU, 0x48000005LU, 0x60000005LU, 0x10000005LU, 0x50000005LU, + 0x08000005LU, 0x40000005LU, 0x00000005LU, 0x70000005LU, 0x78000005LU, 0x68000005LU, 0x18000005LU, 0x28000005LU, + 0xb8000000LU, 0xb0000000LU, 0xa0000000LU, 0xd8000000LU, 0xc8000000LU, 0xe0000000LU, 0x90000000LU, 0xd0000000LU, + 0x88000000LU, 0xc0000000LU, 0x80000000LU, 0xf0000000LU, 0xf8000000LU, 0xe8000000LU, 0x98000000LU, 0xa8000000LU, + 0xb8000002LU, 0xb0000002LU, 0xa0000002LU, 0xd8000002LU, 0xc8000002LU, 0xe0000002LU, 0x90000002LU, 0xd0000002LU, + 0x88000002LU, 0xc0000002LU, 0x80000002LU, 0xf0000002LU, 0xf8000002LU, 0xe8000002LU, 0x98000002LU, 0xa8000002LU, + 0xb8000005LU, 0xb0000005LU, 0xa0000005LU, 0xd8000005LU, 0xc8000005LU, 0xe0000005LU, 0x90000005LU, 0xd0000005LU, + 0x88000005LU, 0xc0000005LU, 0x80000005LU, 0xf0000005LU, 0xf8000005LU, 0xe8000005LU, 0x98000005LU, 0xa8000005LU, + 0x38000004LU, 0x30000004LU, 0x20000004LU, 0x58000004LU, 0x48000004LU, 0x60000004LU, 0x10000004LU, 0x50000004LU, + 0x08000004LU, 0x40000004LU, 0x00000004LU, 0x70000004LU, 0x78000004LU, 0x68000004LU, 0x18000004LU, 0x28000004LU, + 0x38000007LU, 0x30000007LU, 0x20000007LU, 0x58000007LU, 0x48000007LU, 0x60000007LU, 0x10000007LU, 0x50000007LU, + 0x08000007LU, 0x40000007LU, 0x00000007LU, 0x70000007LU, 0x78000007LU, 0x68000007LU, 0x18000007LU, 0x28000007LU, + 0x38000006LU, 0x30000006LU, 0x20000006LU, 0x58000006LU, 0x48000006LU, 0x60000006LU, 0x10000006LU, 0x50000006LU, + 0x08000006LU, 0x40000006LU, 0x00000006LU, 0x70000006LU, 0x78000006LU, 0x68000006LU, 0x18000006LU, 0x28000006LU, + 0xb8000001LU, 0xb0000001LU, 0xa0000001LU, 0xd8000001LU, 0xc8000001LU, 0xe0000001LU, 0x90000001LU, 0xd0000001LU, + 0x88000001LU, 0xc0000001LU, 0x80000001LU, 0xf0000001LU, 0xf8000001LU, 0xe8000001LU, 0x98000001LU, 0xa8000001LU, + }, + { /* table 4 */ + 0x000000e8LU, 0x000000f0LU, 0x000000a0LU, 0x00000088LU, 0x000000b8LU, 0x00000080LU, 0x000000a8LU, 0x000000d0LU, + 0x00000098LU, 0x000000e0LU, 0x000000c0LU, 0x000000f8LU, 0x000000b0LU, 0x00000090LU, 0x000000c8LU, 0x000000d8LU, + 0x000001e8LU, 0x000001f0LU, 0x000001a0LU, 0x00000188LU, 0x000001b8LU, 0x00000180LU, 0x000001a8LU, 0x000001d0LU, + 0x00000198LU, 0x000001e0LU, 0x000001c0LU, 0x000001f8LU, 0x000001b0LU, 0x00000190LU, 0x000001c8LU, 0x000001d8LU, + 0x00000568LU, 0x00000570LU, 0x00000520LU, 0x00000508LU, 0x00000538LU, 0x00000500LU, 0x00000528LU, 0x00000550LU, + 0x00000518LU, 0x00000560LU, 0x00000540LU, 0x00000578LU, 0x00000530LU, 0x00000510LU, 0x00000548LU, 0x00000558LU, + 0x000004e8LU, 0x000004f0LU, 0x000004a0LU, 0x00000488LU, 0x000004b8LU, 0x00000480LU, 0x000004a8LU, 0x000004d0LU, + 0x00000498LU, 0x000004e0LU, 0x000004c0LU, 0x000004f8LU, 0x000004b0LU, 0x00000490LU, 0x000004c8LU, 0x000004d8LU, + 0x000002e8LU, 0x000002f0LU, 0x000002a0LU, 0x00000288LU, 0x000002b8LU, 0x00000280LU, 0x000002a8LU, 0x000002d0LU, + 0x00000298LU, 0x000002e0LU, 0x000002c0LU, 0x000002f8LU, 0x000002b0LU, 0x00000290LU, 0x000002c8LU, 0x000002d8LU, + 0x000005e8LU, 0x000005f0LU, 0x000005a0LU, 0x00000588LU, 0x000005b8LU, 0x00000580LU, 0x000005a8LU, 0x000005d0LU, + 0x00000598LU, 0x000005e0LU, 0x000005c0LU, 0x000005f8LU, 0x000005b0LU, 0x00000590LU, 0x000005c8LU, 0x000005d8LU, + 0x00000268LU, 0x00000270LU, 0x00000220LU, 0x00000208LU, 0x00000238LU, 0x00000200LU, 0x00000228LU, 0x00000250LU, + 0x00000218LU, 0x00000260LU, 0x00000240LU, 0x00000278LU, 0x00000230LU, 0x00000210LU, 0x00000248LU, 0x00000258LU, + 0x000007e8LU, 0x000007f0LU, 0x000007a0LU, 0x00000788LU, 0x000007b8LU, 0x00000780LU, 0x000007a8LU, 0x000007d0LU, + 0x00000798LU, 0x000007e0LU, 0x000007c0LU, 0x000007f8LU, 0x000007b0LU, 0x00000790LU, 0x000007c8LU, 0x000007d8LU, + 0x00000468LU, 0x00000470LU, 0x00000420LU, 0x00000408LU, 0x00000438LU, 0x00000400LU, 0x00000428LU, 0x00000450LU, + 0x00000418LU, 0x00000460LU, 0x00000440LU, 0x00000478LU, 0x00000430LU, 0x00000410LU, 0x00000448LU, 0x00000458LU, + 0x00000368LU, 0x00000370LU, 0x00000320LU, 0x00000308LU, 0x00000338LU, 0x00000300LU, 0x00000328LU, 0x00000350LU, + 0x00000318LU, 0x00000360LU, 0x00000340LU, 0x00000378LU, 0x00000330LU, 0x00000310LU, 0x00000348LU, 0x00000358LU, + 0x000003e8LU, 0x000003f0LU, 0x000003a0LU, 0x00000388LU, 0x000003b8LU, 0x00000380LU, 0x000003a8LU, 0x000003d0LU, + 0x00000398LU, 0x000003e0LU, 0x000003c0LU, 0x000003f8LU, 0x000003b0LU, 0x00000390LU, 0x000003c8LU, 0x000003d8LU, + 0x00000768LU, 0x00000770LU, 0x00000720LU, 0x00000708LU, 0x00000738LU, 0x00000700LU, 0x00000728LU, 0x00000750LU, + 0x00000718LU, 0x00000760LU, 0x00000740LU, 0x00000778LU, 0x00000730LU, 0x00000710LU, 0x00000748LU, 0x00000758LU, + 0x000006e8LU, 0x000006f0LU, 0x000006a0LU, 0x00000688LU, 0x000006b8LU, 0x00000680LU, 0x000006a8LU, 0x000006d0LU, + 0x00000698LU, 0x000006e0LU, 0x000006c0LU, 0x000006f8LU, 0x000006b0LU, 0x00000690LU, 0x000006c8LU, 0x000006d8LU, + 0x00000068LU, 0x00000070LU, 0x00000020LU, 0x00000008LU, 0x00000038LU, 0x00000000LU, 0x00000028LU, 0x00000050LU, + 0x00000018LU, 0x00000060LU, 0x00000040LU, 0x00000078LU, 0x00000030LU, 0x00000010LU, 0x00000048LU, 0x00000058LU, + 0x00000168LU, 0x00000170LU, 0x00000120LU, 0x00000108LU, 0x00000138LU, 0x00000100LU, 0x00000128LU, 0x00000150LU, + 0x00000118LU, 0x00000160LU, 0x00000140LU, 0x00000178LU, 0x00000130LU, 0x00000110LU, 0x00000148LU, 0x00000158LU, + 0x00000668LU, 0x00000670LU, 0x00000620LU, 0x00000608LU, 0x00000638LU, 0x00000600LU, 0x00000628LU, 0x00000650LU, + 0x00000618LU, 0x00000660LU, 0x00000640LU, 0x00000678LU, 0x00000630LU, 0x00000610LU, 0x00000648LU, 0x00000658LU, + }, +}; diff --git a/ext/hash/tests/gost.phpt b/ext/hash/tests/gost.phpt index b800e112e85c3..6ce00242b1a40 100644 --- a/ext/hash/tests/gost.phpt +++ b/ext/hash/tests/gost.phpt @@ -10,6 +10,13 @@ echo hash('gost', 'The quick brown fox jumps over the lazy cog'), "\n"; echo hash('gost', str_repeat('a', 31)), "\n"; echo hash('gost', str_repeat('a', 32)), "\n"; echo hash('gost', str_repeat('a', 33)), "\n"; + +echo hash('gost-crypto', ''), "\n"; +echo hash('gost-crypto', 'The quick brown fox jumps over the lazy dog'), "\n"; +echo hash('gost-crypto', 'The quick brown fox jumps over the lazy cog'), "\n"; +echo hash('gost-crypto', str_repeat('a', 31)), "\n"; +echo hash('gost-crypto', str_repeat('a', 32)), "\n"; +echo hash('gost-crypto', str_repeat('a', 33)), "\n"; ?> --EXPECT-- ce85b99cc46752fffee35cab9a7b0278abb4c2d2055cff685af4912c49490f8d @@ -18,3 +25,9 @@ a3ebc4daaab78b0be131dab5737a7f67e602670d543521319150d2e14eeec445 03840d6348763f11e28e7b1ecc4da0cdf7f898fa555b928ef684c6c5b8f46d9f fd1b746d9397e78edd311baef391450434271e02816caa37680d6d7381c79d4e 715e59cdc8ebde9fdf0fe2a2e811b3bf7f48209a01505e467d2cd2aa2bbb5ecf +981e5f3ca30c841487830f84fb433e13ac1101569b9c13584ac483234cd656c0 +9004294a361a508c586fe53d1f1b02746765e71b765472786e4770d565830a76 +a93124f5bf2c6d83c3bbf722bc55569310245ca5957541f4dbd7dfaf8137e6f2 +8978e06b0ecf54ea81ec51ca4e02bcb4eb390b3f04cb5f65ee8de195ffae591b +e121e3740ae94ca6d289e6d653ff31695783efff3dd960417a1098a0130fa720 +d3e8f22d9762a148ddfc84a6043d97a608604dae7c05baee72b55f559d03dd74 From 0be6ecb8621e32f6bb039dd178f4db17220de6e9 Mon Sep 17 00:00:00 2001 From: Manuel Mausz Date: Thu, 5 Sep 2013 01:19:00 +0200 Subject: [PATCH 072/400] fix indention --- ext/hash/hash_gost.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/hash/hash_gost.c b/ext/hash/hash_gost.c index 7546c8d333dd4..da65bb5903e62 100644 --- a/ext/hash/hash_gost.c +++ b/ext/hash/hash_gost.c @@ -243,13 +243,13 @@ static inline void GostTransform(PHP_GOST_CTX *context, const unsigned char inpu PHP_HASH_API void PHP_GOSTInit(PHP_GOST_CTX *context) { memset(context, 0, sizeof(*context)); - context->tables = &tables_test; + context->tables = &tables_test; } PHP_HASH_API void PHP_GOSTInitCrypto(PHP_GOST_CTX *context) { - PHP_GOSTInit(context); - context->tables = &tables_crypto; + PHP_GOSTInit(context); + context->tables = &tables_crypto; } static const php_hash_uint32 MAX32 = 0xffffffffLU; From 7dbb1bba64c8a90df683e1a69df03cb2931f547a Mon Sep 17 00:00:00 2001 From: Manuel Mausz Date: Thu, 5 Sep 2013 09:32:12 +0200 Subject: [PATCH 073/400] fix failing tests --- ext/hash/tests/hash_algos.phpt | 6 ++++-- ext/hash/tests/hash_copy_001.phpt | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/ext/hash/tests/hash_algos.phpt b/ext/hash/tests/hash_algos.phpt index 55796ecbce9aa..7773fe979a72d 100644 --- a/ext/hash/tests/hash_algos.phpt +++ b/ext/hash/tests/hash_algos.phpt @@ -18,7 +18,7 @@ var_dump(hash_algos()); ===Done=== --EXPECTF-- *** Testing hash_algos() : basic functionality *** -array(43) { +array(44) { [%d]=> string(3) "md2" [%d]=> @@ -64,6 +64,8 @@ array(43) { [%d]=> string(4) "gost" [%d]=> + string(11) "gost-crypto" + [%d]=> string(7) "adler32" [%d]=> string(5) "crc32" @@ -106,4 +108,4 @@ array(43) { [%d]=> string(10) "haval256,5" } -===Done=== \ No newline at end of file +===Done=== diff --git a/ext/hash/tests/hash_copy_001.phpt b/ext/hash/tests/hash_copy_001.phpt index 638b7f5fc109a..bb4a49da89712 100644 --- a/ext/hash/tests/hash_copy_001.phpt +++ b/ext/hash/tests/hash_copy_001.phpt @@ -97,6 +97,9 @@ string(64) "fbe88daa74c89b9e29468fa3cd3a657d31845e21bb58dd3f8d806f5179a85c26" string(4) "gost" string(64) "5820c7c4a0650587538b30ef4099f2b5993069758d5c847a552e6ef7360766a5" string(64) "5820c7c4a0650587538b30ef4099f2b5993069758d5c847a552e6ef7360766a5" +string(11) "gost-crypto" +string(64) "f7c4e35548d66aabe2b106f20515d289fde90969225d3d7b83f6dd12d694f043" +string(64) "f7c4e35548d66aabe2b106f20515d289fde90969225d3d7b83f6dd12d694f043" string(7) "adler32" string(8) "6f7c0928" string(8) "6f7c0928" @@ -226,6 +229,9 @@ string(64) "614ca924864fa0e8fa309aa0944e047d5edbfd4964a35858f4d8ec66a0fb88b0" string(4) "gost" string(64) "5820c7c4a0650587538b30ef4099f2b5993069758d5c847a552e6ef7360766a5" string(64) "a00961e371287c71c527a41c14564f13b6ed12ac7cd9d5f5dfb3542a25e28d3b" +string(11) "gost-crypto" +string(64) "f7c4e35548d66aabe2b106f20515d289fde90969225d3d7b83f6dd12d694f043" +string(64) "68ca9aea6729dc07d995fbe071a4b5c6490bb27fc4dc65ec0e96200d5e082996" string(7) "adler32" string(8) "6f7c0928" string(8) "d9141747" From 4b778faa8014947390d55dbc71e15ae0d7aca53a Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Thu, 5 Sep 2013 18:18:29 -0700 Subject: [PATCH 074/400] Make oci_set_*($connection,...) errors retrievable via oci_error($connection). Improve some error handling to produce error text on some rare edge cases. Disambiguate the Oracle library function call return status values from ORA error numbers. Review and unify error data types. --- ext/oci8/oci8.c | 114 +++++++++++--------- ext/oci8/oci8_collection.c | 203 ++++++++++++++++++++--------------- ext/oci8/oci8_dtrace.d | 2 +- ext/oci8/oci8_interface.c | 40 +++---- ext/oci8/oci8_lob.c | 194 +++++++++++++++++++-------------- ext/oci8/oci8_statement.c | 213 +++++++++++++++++++++---------------- ext/oci8/package.xml | 155 +++++++++++++++------------ ext/oci8/php_oci8_int.h | 8 +- 8 files changed, 527 insertions(+), 402 deletions(-) diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index 2ff52b8eda577..468bdaf610676 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -1643,12 +1643,12 @@ void php_oci_connection_descriptors_free(php_oci_connection *connection TSRMLS_D * 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: @@ -1691,13 +1691,13 @@ 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(status, errcode); + DTRACE_OCI8_ERROR((int)errstatus, (long)errcode); } #endif /* HAVE_OCI8_DTRACE */ @@ -2210,20 +2210,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; @@ -2234,10 +2238,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; } /* }}} */ @@ -2248,17 +2251,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; } /* }}} */ @@ -2269,14 +2272,17 @@ 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)); + 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; } /* }}} */ @@ -2287,14 +2293,17 @@ 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)); + 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; } /* }}} */ @@ -2462,13 +2471,16 @@ 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; } @@ -2503,12 +2515,13 @@ 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; } @@ -2806,6 +2819,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)); @@ -2830,10 +2844,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; } @@ -2842,10 +2856,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; } @@ -2859,10 +2873,10 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha #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)); + 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; } @@ -2870,10 +2884,10 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha /* {{{ 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; } @@ -2881,20 +2895,20 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha /* }}} */ /* {{{ 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))); + 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))); + 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; } @@ -2904,10 +2918,10 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha /* 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; } @@ -3477,11 +3491,11 @@ static sword php_oci_ping_init(php_oci_connection *connection, OCIError *errh TS * * DTrace output for connections that may have become invalid and marked for reopening */ -void php_oci_dtrace_check_connection(php_oci_connection *connection, sword errcode, ub4 serverStatus) +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, (int)errcode, (unsigned long)serverStatus); + DTRACE_OCI8_CHECK_CONNECTION(connection, connection && connection->is_open ? 1 : 0, (long)errcode, (unsigned long)serverStatus); } #endif /* HAVE_OCI8_DTRACE */ } diff --git a/ext/oci8/oci8_collection.c b/ext/oci8/oci8_collection.c index ae9361435404e..320e90a5b8999 100644 --- a/ext/oci8/oci8_collection.c +++ b/ext/oci8/oci8_collection.c @@ -44,12 +44,13 @@ /* {{{ 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)); @@ -58,7 +59,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c 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,7 +232,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c /* 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; @@ -242,14 +244,16 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c 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; } /* }}} */ @@ -272,14 +276,16 @@ 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) { 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; } /* }}} */ @@ -290,15 +296,17 @@ 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; } /* }}} */ @@ -310,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, @@ -331,12 +340,13 @@ 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; } /* }}} */ @@ -349,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 */ @@ -358,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, @@ -376,12 +387,13 @@ 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; } /* }}} */ @@ -393,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, @@ -412,12 +425,13 @@ 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; } /* }}} */ @@ -473,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, @@ -489,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; @@ -509,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; @@ -552,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; @@ -583,15 +600,17 @@ 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; } /* }}} */ @@ -603,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, @@ -625,12 +645,13 @@ 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; } /* }}} */ @@ -643,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 */ @@ -652,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, @@ -671,12 +693,13 @@ 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; } /* }}} */ @@ -688,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, @@ -708,12 +732,13 @@ 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; } /* }}} */ @@ -764,14 +789,16 @@ int php_oci_collection_element_set(php_oci_collection *collection, long index, c 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; } /* }}} */ @@ -781,18 +808,20 @@ int php_oci_collection_assign(php_oci_collection *collection_dest, php_oci_colle 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->id); - efree(collection); return; } diff --git a/ext/oci8/oci8_dtrace.d b/ext/oci8/oci8_dtrace.d index d6982f030c3bf..15b4a96263420 100644 --- a/ext/oci8/oci8_dtrace.d +++ b/ext/oci8/oci8_dtrace.d @@ -19,7 +19,7 @@ provider php { 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__check__connection(void *connection, int is_open, int errcode, unsigned long serverstatus); + probe oci8__check__connection(void *connection, int is_open, long errcode, unsigned long serverstatus); probe oci8__sqltext(char *sql); probe oci8__error(int status, long errcode); probe oci8__execute__mode(unsigned int mode); diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c index aee876d736954..6042ca5a73dd8 100644 --- a/ext/oci8/oci8_interface.c +++ b/ext/oci8/oci8_interface.c @@ -1624,7 +1624,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 +1634,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 +1647,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; } @@ -1764,6 +1762,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; @@ -1771,10 +1770,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; } @@ -1822,6 +1821,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; @@ -1829,10 +1829,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; } @@ -1853,6 +1853,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; @@ -1860,10 +1861,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; } @@ -1884,6 +1885,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; @@ -1891,10 +1893,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; } diff --git a/ext/oci8/oci8_lob.c b/ext/oci8/oci8_lob.c index 87ce84843f809..8d14dc3f503aa 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: @@ -72,13 +73,15 @@ php_oci_descriptor *php_oci_lob_create (php_oci_connection *connection, long typ descriptor->connection = connection; 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); @@ -117,6 +120,7 @@ php_oci_descriptor *php_oci_lob_create (php_oci_connection *connection, long typ int php_oci_lob_get_length (php_oci_descriptor *descriptor, ub4 *length TSRMLS_DC) { php_oci_connection *connection = descriptor->connection; + sword errstatus; *length = 0; @@ -125,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; } @@ -144,14 +148,16 @@ 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; } @@ -211,20 +217,22 @@ static inline int php_oci_lob_calculate_buffer(php_oci_descriptor *descriptor, l { 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) { @@ -253,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; @@ -289,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; } @@ -313,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; } @@ -340,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, @@ -373,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, @@ -394,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); @@ -408,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); @@ -422,6 +431,7 @@ 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; } /* }}} */ @@ -433,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)) { @@ -451,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, @@ -468,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; @@ -486,6 +497,7 @@ 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; } /* }}} */ @@ -495,6 +507,7 @@ int php_oci_lob_write (php_oci_descriptor *descriptor, ub4 offset, char *data, i 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 */ @@ -507,17 +520,18 @@ 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; } /* }}} */ @@ -540,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; @@ -560,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, @@ -572,12 +587,13 @@ 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; } /* }}} */ @@ -587,15 +603,17 @@ int php_oci_lob_copy (php_oci_descriptor *descriptor_dest, php_oci_descriptor *d 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)) { @@ -612,24 +630,26 @@ 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; } /* }}} */ @@ -640,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; } @@ -663,16 +684,17 @@ 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; } /* }}} */ @@ -734,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 */ @@ -750,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, @@ -768,11 +791,13 @@ 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; } @@ -790,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; @@ -803,13 +829,14 @@ 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; } /* }}} */ @@ -821,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; @@ -840,15 +868,17 @@ 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; } /* }}} */ @@ -860,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; @@ -875,15 +906,16 @@ 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; } /* }}} */ @@ -895,14 +927,16 @@ 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; } /* }}} */ @@ -914,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: @@ -930,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, @@ -943,21 +978,22 @@ 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); } diff --git a/ext/oci8/oci8_statement.c b/ext/oci8/oci8_statement.c index 2e6fdabee3ca4..b2fa8ca881734 100644 --- a/ext/oci8/oci8_statement.c +++ b/ext/oci8/oci8_statement.c @@ -46,7 +46,10 @@ 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) { @@ -63,7 +66,7 @@ php_oci_statement *php_oci_statement_create(php_oci_connection *connection, char 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), @@ -76,14 +79,13 @@ php_oci_statement *php_oci_statement_create(php_oci_connection *connection, char 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; } } @@ -131,9 +133,10 @@ php_oci_statement *php_oci_get_implicit_resultset(php_oci_statement *statement T void *result; ub4 rtype; php_oci_statement *statement2; /* implicit result set statement handle */ + sword errstatus; - PHP_OCI_CALL_RETURN(statement->errcode, OCIStmtGetNextResult, (statement->stmt, statement->err, &result, &rtype, OCI_DEFAULT)); - if (statement->errcode == OCI_NO_DATA) { + PHP_OCI_CALL_RETURN(errstatus, OCIStmtGetNextResult, (statement->stmt, statement->err, &result, &rtype, OCI_DEFAULT)); + if (errstatus == OCI_NO_DATA) { return NULL; } @@ -182,19 +185,22 @@ php_oci_statement *php_oci_get_implicit_resultset(php_oci_statement *statement T Set prefetch buffer size for the statement */ int php_oci_statement_set_prefetch(php_oci_statement *statement, ub4 prefetch TSRMLS_DC) { + sword errstatus; + if (prefetch > 20000) { prefetch = 20000; /* keep it somewhat sane */ } - PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrSet, (statement->stmt, OCI_HTYPE_STMT, &prefetch, 0, OCI_ATTR_PREFETCH_ROWS, statement->err)); + PHP_OCI_CALL_RETURN(errstatus, 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; } /* }}} */ @@ -242,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) { @@ -263,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) { @@ -282,9 +289,9 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC) } } - 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, @@ -326,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++) { @@ -338,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 */ @@ -359,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; @@ -482,6 +489,7 @@ 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: @@ -502,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 */ } } @@ -528,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; } @@ -553,6 +563,8 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) * 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) { @@ -565,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; } @@ -585,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; } @@ -637,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; } @@ -757,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 */ @@ -775,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 */ @@ -794,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 */ @@ -807,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, @@ -817,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; @@ -950,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; @@ -1009,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); } } @@ -1072,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: @@ -1195,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 */ @@ -1215,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, @@ -1233,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; } @@ -1242,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, @@ -1254,13 +1276,14 @@ 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; } /* }}} */ @@ -1446,17 +1469,18 @@ php_oci_out_column *php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAME 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; @@ -1468,17 +1492,18 @@ 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) { 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; @@ -1490,6 +1515,7 @@ int php_oci_statement_get_numrows(php_oci_statement *statement, ub4 *numrows TSR 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); @@ -1553,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, @@ -1574,12 +1600,13 @@ 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; } @@ -1741,6 +1768,7 @@ php_oci_bind *php_oci_bind_array_helper_date(zval *var, long max_table_length, p ub4 i; HashTable *hash; zval **entry; + sword errstatus; hash = HASH_OF(var); @@ -1762,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; } @@ -1777,20 +1805,21 @@ 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); diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index f2c59a1dc1d77..90c187bfb6341 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -44,19 +44,17 @@ http://pear.php.net/dtd/package-2.0.xsd"> - 2.0.1 - 2.0.1 + 2.0.2 + 2.0.2 devel devel PHP - - 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. + +Review and improve error handling code and data types. +Fix oci_set_*($connection, ...) error handling so oci_error($connection) works. @@ -455,6 +453,23 @@ http://pear.php.net/dtd/package-2.0.xsd"> + + + 2.0.1 + 2.0.1 + + + devel + devel + + PHP + +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. + + @@ -467,69 +482,69 @@ http://pear.php.net/dtd/package-2.0.xsd"> PHP - - 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. +- 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. diff --git a/ext/oci8/php_oci8_int.h b/ext/oci8/php_oci8_int.h index 24d80a8163480..7c8485800fb8b 100644 --- a/ext/oci8/php_oci8_int.h +++ b/ext/oci8/php_oci8_int.h @@ -141,7 +141,7 @@ typedef struct { 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 */ @@ -213,7 +213,7 @@ typedef struct { 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 recieved from Oracle */ @@ -412,7 +412,7 @@ 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, sword errcode, ub4 serverStatus); +void php_oci_dtrace_check_connection(php_oci_connection *connection, sb4 errcode, ub4 serverStatus); /* }}} */ @@ -493,7 +493,7 @@ php_oci_bind *php_oci_bind_array_helper_date(zval *var, long max_table_length, p /* }}} */ ZEND_BEGIN_MODULE_GLOBALS(oci) /* {{{ Module globals */ - sword errcode; /* global last error code (used when connect fails, for example) */ + 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 */ From e504ed66a84815d3e2e9fd0e3679c787c14b2691 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Fri, 6 Sep 2013 08:14:18 -0700 Subject: [PATCH 075/400] Add test for oci_set_* error changes --- ext/oci8/tests/error_set.phpt | 72 +++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 ext/oci8/tests/error_set.phpt diff --git a/ext/oci8/tests/error_set.phpt b/ext/oci8/tests/error_set.phpt new file mode 100644 index 0000000000000..ad56e8aefadb1 --- /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-- + +--FILE-- + +===DONE=== + +--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=== From ca4d122adcab8703f63cf8ed95a28a1fbc6e2b47 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Fri, 6 Sep 2013 08:54:19 -0700 Subject: [PATCH 076/400] Update DTrace probes --- ext/oci8/oci8.c | 6 ++++++ ext/oci8/oci8_dtrace.d | 7 ++++--- ext/oci8/oci8_statement.c | 4 ++-- ext/oci8/package.xml | 4 +++- ext/oci8/php_oci8.h | 2 +- 5 files changed, 16 insertions(+), 7 deletions(-) diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index 468bdaf610676..8b6a38945110a 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -2317,6 +2317,12 @@ 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); diff --git a/ext/oci8/oci8_dtrace.d b/ext/oci8/oci8_dtrace.d index 15b4a96263420..8ac94105c13cd 100644 --- a/ext/oci8/oci8_dtrace.d +++ b/ext/oci8/oci8_dtrace.d @@ -17,12 +17,13 @@ */ 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__check__connection(void *connection, int is_open, long errcode, unsigned long serverstatus); - probe oci8__sqltext(char *sql); + probe oci8__connection__close(void *connection); probe oci8__error(int status, long errcode); - probe oci8__execute__mode(unsigned int mode); + 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); diff --git a/ext/oci8/oci8_statement.c b/ext/oci8/oci8_statement.c index b2fa8ca881734..274c4e9e33b40 100644 --- a/ext/oci8/oci8_statement.c +++ b/ext/oci8/oci8_statement.c @@ -58,7 +58,7 @@ php_oci_statement *php_oci_statement_create(php_oci_connection *connection, char } else { #ifdef HAVE_OCI8_DTRACE if (DTRACE_OCI8_SQLTEXT_ENABLED()) { - DTRACE_OCI8_SQLTEXT(query); + DTRACE_OCI8_SQLTEXT(connection, query); } #endif /* HAVE_OCI8_DTRACE */ } @@ -498,7 +498,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) /* only these are allowed */ #ifdef HAVE_OCI8_DTRACE if (DTRACE_OCI8_EXECUTE_MODE_ENABLED()) { - DTRACE_OCI8_EXECUTE_MODE(mode); + DTRACE_OCI8_EXECUTE_MODE(statement->connection, mode); } #endif /* HAVE_OCI8_DTRACE */ break; diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index 90c187bfb6341..fcab20cc4544b 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -40,7 +40,7 @@ http://pear.php.net/dtd/package-2.0.xsd"> no - 2013-09-03 + 2013-09-06 @@ -55,6 +55,8 @@ http://pear.php.net/dtd/package-2.0.xsd"> 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. diff --git a/ext/oci8/php_oci8.h b/ext/oci8/php_oci8.h index f10f01db52d42..8c5fba9ab0873 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 "2.0.1-dev" +#define PHP_OCI8_VERSION "2.0.2-dev" extern zend_module_entry oci8_module_entry; #define phpext_oci8_ptr &oci8_module_entry From 43289d664ccde3813c10c745687a7674067f9856 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Fri, 6 Sep 2013 10:12:16 -0700 Subject: [PATCH 077/400] Remove obsolete flag --- ext/oci8/oci8.c | 1 - ext/oci8/oci8_interface.c | 7 +------ ext/oci8/php_oci8_int.h | 2 -- ext/oci8/tests/function_aliases.phpt | 2 -- 4 files changed, 1 insertion(+), 11 deletions(-) diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index 8b6a38945110a..bccaa529b0c93 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -1306,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; diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c index 6042ca5a73dd8..8d70aff9c2b42 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 */ } /* }}} */ diff --git a/ext/oci8/php_oci8_int.h b/ext/oci8/php_oci8_int.h index 7c8485800fb8b..6155a883b02e1 100644 --- a/ext/oci8/php_oci8_int.h +++ b/ext/oci8/php_oci8_int.h @@ -496,8 +496,6 @@ 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/function_aliases.phpt b/ext/oci8/tests/function_aliases.phpt index 4c6ce8375965c..2c890d6403ca2 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 From a911fbc80a8e29aa1d58d8e8a86c4fa3f6c7bf92 Mon Sep 17 00:00:00 2001 From: Dylan Arnold Date: Mon, 9 Sep 2013 13:06:38 +1200 Subject: [PATCH 078/400] Call php_module_shutdown() for php-fpm child processes --- sapi/fpm/fpm/fpm_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sapi/fpm/fpm/fpm_main.c b/sapi/fpm/fpm/fpm_main.c index 043e0e00a47c0..4b20e632dd361 100644 --- a/sapi/fpm/fpm/fpm_main.c +++ b/sapi/fpm/fpm/fpm_main.c @@ -1982,8 +1982,9 @@ consult the installation file that came with this distribution, or visit \n\ out: SG(server_context) = NULL; + php_module_shutdown(TSRMLS_C); + if (parent) { - php_module_shutdown(TSRMLS_C); sapi_shutdown(); } From 8d860c121810d6a10380241a0a51387966a503ca Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 9 Sep 2013 10:05:59 +0400 Subject: [PATCH 079/400] Fixed issue #128 (opcache_invalidate segmentation fault) --- ext/opcache/ZendAccelerator.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index b5474c050761d..827f047cd4f65 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -1062,6 +1062,10 @@ int zend_accel_invalidate(const char *filename, int filename_len, zend_bool forc realpath = accelerator_orig_zend_resolve_path(filename, filename_len TSRMLS_CC); #endif + if (!realpath) { + return FAILURE; + } + persistent_script = zend_accel_hash_find(&ZCSG(hash), realpath, strlen(realpath) + 1); if (persistent_script && !persistent_script->corrupted) { zend_file_handle file_handle; From b54b6e30a4e46d9dd1f1bf0cbc0d4539c0f7d51d Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 9 Sep 2013 11:56:05 +0200 Subject: [PATCH 080/400] ensure that the defined interpolation method is used by the generic scaling functions --- NEWS | 3 +++ ext/gd/libgd/gd_interpolation.c | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 817f9f74db690..865557198e571 100644 --- a/NEWS +++ b/NEWS @@ -30,6 +30,9 @@ PHP NEWS . 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) diff --git a/ext/gd/libgd/gd_interpolation.c b/ext/gd/libgd/gd_interpolation.c index e3247a78c1bf7..3643535f2eed3 100644 --- a/ext/gd/libgd/gd_interpolation.c +++ b/ext/gd/libgd/gd_interpolation.c @@ -1065,6 +1065,7 @@ gdImagePtr gdImageScaleTwoPass(const gdImagePtr src, const unsigned int src_widt if (tmp_im == NULL) { return NULL; } + gdImageSetInterpolationMethod(tmp_im, src->interpolation_id); _gdScaleHoriz(src, src_width, src_height, tmp_im, new_width, src_height); dst = gdImageCreateTrueColor(new_width, new_height); @@ -1072,6 +1073,7 @@ gdImagePtr gdImageScaleTwoPass(const gdImagePtr src, const unsigned int src_widt gdFree(tmp_im); return NULL; } + gdImageSetInterpolationMethod(dst, src->interpolation_id); _gdScaleVert(tmp_im, new_width, src_height, dst, new_width, new_height); gdFree(tmp_im); @@ -1086,8 +1088,9 @@ gdImagePtr Scale(const gdImagePtr src, const unsigned int src_width, const unsig if (tmp_im == NULL) { return NULL; } - _gdScaleHoriz(src, src_width, src_height, tmp_im, new_width, src_height); + gdImageSetInterpolationMethod(tmp_im, src->interpolation_id); + _gdScaleHoriz(src, src_width, src_height, tmp_im, new_width, src_height); _gdScaleVert(tmp_im, new_width, src_height, dst, new_width, new_height); gdFree(tmp_im); From 3c3b2b5bdc8e2bcff4d0e7d09375ad7af760b32a Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Mon, 9 Sep 2013 16:24:49 -0700 Subject: [PATCH 081/400] Handle CLI server request headers case insensitively. Fixes bug #65633 (built-in server treat some http headers as case-sensitive). --- NEWS | 4 +++ sapi/cli/php_cli_server.c | 17 ++++++------- sapi/cli/tests/bug65633.phpt | 48 ++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 10 deletions(-) create mode 100644 sapi/cli/tests/bug65633.phpt diff --git a/NEWS b/NEWS index 486ccb2a88845..e05b24042b80c 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2013, PHP 5.4.21 +- CLI server: + . Fixed bug #65633 (built-in server treat some http headers as + case-sensitive). (Adam) + ?? ??? 2013, PHP 5.4.20 - Core: diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c index 5a12134a91003..4da55acc6c2bc 100644 --- a/sapi/cli/php_cli_server.c +++ b/sapi/cli/php_cli_server.c @@ -408,7 +408,7 @@ static void append_essential_headers(smart_str* buffer, php_cli_server_client *c { { char **val; - if (SUCCESS == zend_hash_find(&client->request.headers, "Host", sizeof("Host"), (void**)&val)) { + if (SUCCESS == zend_hash_find(&client->request.headers, "host", sizeof("host"), (void**)&val)) { smart_str_appendl_ex(buffer, "Host", sizeof("Host") - 1, persistent); smart_str_appendl_ex(buffer, ": ", sizeof(": ") - 1, persistent); smart_str_appends_ex(buffer, *val, persistent); @@ -558,7 +558,7 @@ static char *sapi_cli_server_read_cookies(TSRMLS_D) /* {{{ */ { php_cli_server_client *client = SG(server_context); char **val; - if (FAILURE == zend_hash_find(&client->request.headers, "Cookie", sizeof("Cookie"), (void**)&val)) { + if (FAILURE == zend_hash_find(&client->request.headers, "cookie", sizeof("cookie"), (void**)&val)) { return NULL; } return *val; @@ -1556,12 +1556,9 @@ static int php_cli_server_client_read_request_on_header_value(php_http_parser *p return 1; } { - char *header_name = client->current_header_name; - size_t header_name_len = client->current_header_name_len; - char c = header_name[header_name_len]; - header_name[header_name_len] = '\0'; - zend_hash_add(&client->request.headers, header_name, header_name_len + 1, &value, sizeof(char *), NULL); - header_name[header_name_len] = c; + char *header_name = zend_str_tolower_dup(client->current_header_name, client->current_header_name_len); + zend_hash_add(&client->request.headers, header_name, client->current_header_name_len + 1, &value, sizeof(char *), NULL); + efree(header_name); } if (client->current_header_name_allocated) { @@ -1719,7 +1716,7 @@ static void php_cli_server_client_populate_request_info(const php_cli_server_cli request_info->post_data = client->request.content; request_info->content_length = request_info->post_data_length = client->request.content_len; request_info->auth_user = request_info->auth_password = request_info->auth_digest = NULL; - if (SUCCESS == zend_hash_find(&client->request.headers, "Content-Type", sizeof("Content-Type"), (void**)&val)) { + if (SUCCESS == zend_hash_find(&client->request.headers, "content-type", sizeof("content-type"), (void**)&val)) { request_info->content_type = *val; } } /* }}} */ @@ -1957,7 +1954,7 @@ static int php_cli_server_begin_send_static(php_cli_server *server, php_cli_serv static int php_cli_server_request_startup(php_cli_server *server, php_cli_server_client *client TSRMLS_DC) { /* {{{ */ char **auth; php_cli_server_client_populate_request_info(client, &SG(request_info)); - if (SUCCESS == zend_hash_find(&client->request.headers, "Authorization", sizeof("Authorization"), (void**)&auth)) { + if (SUCCESS == zend_hash_find(&client->request.headers, "authorization", sizeof("authorization"), (void**)&auth)) { php_handle_auth_data(*auth TSRMLS_CC); } SG(sapi_headers).http_response_code = 200; diff --git a/sapi/cli/tests/bug65633.phpt b/sapi/cli/tests/bug65633.phpt new file mode 100644 index 0000000000000..55834095b1877 --- /dev/null +++ b/sapi/cli/tests/bug65633.phpt @@ -0,0 +1,48 @@ +--TEST-- +Bug #65633 (built-in server treat some http headers as case-sensitive) +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +HTTP/1.1 200 OK +Connection: close +X-Powered-By: %s +Content-type: text/html + +array(1) { + ["foo"]=> + string(3) "bar" +} +string(3) "bar" From 144f2f1773c9f2ca6ce65ddc11568869aa81b038 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Mon, 9 Sep 2013 16:46:14 -0700 Subject: [PATCH 082/400] Fix NEWS: these commits were after 5.5.4 was branched and will be in 5.5.5. --- NEWS | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 73214b3506777..df7f9d5729d32 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,13 @@ PHP NEWS . Fixed bug #65633 (built-in server treat some http headers as case-sensitive). (Adam) +- GD + . Ensure that the defined interpolation method is used with the generic + scaling methods. (Pierre) + +- OPcache: + . Fixed bug #65510 (5.5.2 crashes in _get_zval_ptr_ptr_var). (Dmitry) + ?? ??? 2013, PHP 5.5.4 - Core: @@ -34,13 +41,9 @@ PHP NEWS . 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 From 160cd8d0a7205cacab9800318abb63a540587c4f Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Mon, 9 Sep 2013 16:56:57 -0700 Subject: [PATCH 083/400] Tinker with the wording of the short_open_tag description. I'm still not thrilled with this, but it's a bit better and addresses the issues noted in bug #65644. Plus, it now mentions the decoupling of 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 tag combination. With the wide spread 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. +; tags as PHP source which should be processed as such. It is +; generally recommended that should be used and that this feature +; should be disabled, as enabling it may result in issues when generating XML +; documents, however this remains supported for backward compatibility reasons. +; Note that this directive does not control the 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 tag combination. With the wide spread 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. +; tags as PHP source which should be processed as such. It is +; generally recommended that should be used and that this feature +; should be disabled, as enabling it may result in issues when generating XML +; documents, however this remains supported for backward compatibility reasons. +; Note that this directive does not control the Date: Tue, 10 Sep 2013 13:13:09 +0200 Subject: [PATCH 084/400] revert stream cast --- main/php_streams.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/php_streams.h b/main/php_streams.h index c9732b484849a..c56014c62e17f 100644 --- a/main/php_streams.h +++ b/main/php_streams.h @@ -242,7 +242,7 @@ PHPAPI php_stream *_php_stream_alloc(php_stream_ops *ops, void *abstract, END_EXTERN_C() #define php_stream_alloc(ops, thisptr, persistent_id, mode) _php_stream_alloc((ops), (thisptr), (persistent_id), (mode) STREAMS_CC TSRMLS_CC) -#define php_stream_get_resource_id(stream) ((php_stream *)(stream))->rsrc_id +#define php_stream_get_resource_id(stream) (stream)->rsrc_id #if ZEND_DEBUG /* use this to tell the stream that it is OK if we don't explicitly close it */ # define php_stream_auto_cleanup(stream) { (stream)->__exposed++; } From 449d4c0b1c6ea0f5dfe7b56c99d9fc4f2033d27c Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Tue, 10 Sep 2013 13:13:33 +0200 Subject: [PATCH 085/400] make reading php://input JIT if enable_post_data_reading=0 --- ext/standard/php_fopen_wrapper.c | 55 ++++++++++++++++++++--- main/SAPI.c | 76 +++++++++++++++++--------------- main/SAPI.h | 3 +- 3 files changed, 92 insertions(+), 42 deletions(-) diff --git a/ext/standard/php_fopen_wrapper.c b/ext/standard/php_fopen_wrapper.c index ca0b92ebdefc5..aa7924d211ddf 100644 --- a/ext/standard/php_fopen_wrapper.c +++ b/ext/standard/php_fopen_wrapper.c @@ -63,6 +63,12 @@ php_stream_ops php_stream_output_ops = { NULL /* set_option */ }; +typedef struct php_stream_input { /* {{{ */ + php_stream **body_ptr; + off_t position; +} php_stream_input_t; +/* }}} */ + static size_t php_stream_input_write(php_stream *stream, const char *buf, size_t count TSRMLS_DC) /* {{{ */ { return -1; @@ -71,20 +77,52 @@ static size_t php_stream_input_write(php_stream *stream, const char *buf, size_t static size_t php_stream_input_read(php_stream *stream, char *buf, size_t count TSRMLS_DC) /* {{{ */ { - php_stream *inner = stream->abstract; + php_stream_input_t *input = stream->abstract; + size_t read; + //fprintf(stderr, "Attempt to read %lu bytes (%lu)\n", count, SG(read_post_bytes)); + + if (!SG(post_read) && SG(read_post_bytes) < input->position + count) { + /* read requested data from SAPI */ + int read_bytes = sapi_read_post_block(buf, count TSRMLS_CC); + + //fprintf(stderr, "Did read %d bytes\n", read_bytes); + if (read_bytes > 0) { + php_stream_seek(*input->body_ptr, 0, SEEK_END); + php_stream_write(*input->body_ptr, buf, read_bytes); + } + } + + php_stream_seek(*input->body_ptr, input->position, SEEK_SET); + read = (*input->body_ptr)->ops->read(*input->body_ptr, buf, count TSRMLS_CC); + + if (!read || read == (size_t) -1) { + stream->eof = 1; + } else { + input->position += read; + } + + return read; +} +/* }}} */ + +static size_t php_stream_input_read_x(php_stream *stream, char *buf, size_t count TSRMLS_DC) /* {{{ */ +{ + php_stream_input_t *input = stream->abstract; + php_stream *inner = *input->body_ptr; if (inner && inner->ops->read) { size_t read = inner->ops->read(inner, buf, count TSRMLS_CC); stream->eof = inner->eof; return read; } - return -1; } /* }}} */ static int php_stream_input_close(php_stream *stream, int close_handle TSRMLS_DC) /* {{{ */ { + efree(stream->abstract); + return 0; } /* }}} */ @@ -193,18 +231,23 @@ php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, const char *pa } if (!strcasecmp(path, "input")) { + php_stream_input_t *input; + if ((options & STREAM_OPEN_FOR_INCLUDE) && !PG(allow_url_include) ) { if (options & REPORT_ERRORS) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "URL file-access is disabled in the server configuration"); } return NULL; } - if (SG(request_info).request_body) { - php_stream_rewind(SG(request_info).request_body); + + input = ecalloc(1, sizeof(*input)); + if (*(input->body_ptr = &SG(request_info).request_body)) { + php_stream_rewind(*input->body_ptr); } else { - sapi_read_standard_form_data(TSRMLS_C); + *input->body_ptr = php_stream_temp_create(TEMP_STREAM_DEFAULT, SAPI_POST_BLOCK_SIZE); } - return php_stream_alloc(&php_stream_input_ops, SG(request_info).request_body, 0, "rb"); + + return php_stream_alloc(&php_stream_input_ops, input, 0, "rb"); } if (!strcasecmp(path, "stdin")) { diff --git a/main/SAPI.c b/main/SAPI.c index ccfb1e507d85f..9c8bcb1420cab 100644 --- a/main/SAPI.c +++ b/main/SAPI.c @@ -180,10 +180,6 @@ SAPI_API void sapi_handle_post(void *arg TSRMLS_DC) { if (SG(request_info).post_entry && SG(request_info).content_type_dup) { SG(request_info).post_entry->post_handler(SG(request_info).content_type_dup, arg TSRMLS_CC); - /*if (SG(request_info).request_body) { - php_stream_close(SG(request_info).request_body); - SG(request_info).request_body = NULL; - }*/ efree(SG(request_info).content_type_dup); SG(request_info).content_type_dup = NULL; } @@ -249,43 +245,61 @@ static void sapi_read_post_data(TSRMLS_D) } } - -SAPI_API SAPI_POST_READER_FUNC(sapi_read_standard_form_data) +SAPI_API int sapi_read_post_block(char *buffer, size_t buflen TSRMLS_DC) { int read_bytes; + if (!sapi_module.read_post) { + return -1; + } + + read_bytes = sapi_module.read_post(buffer, buflen TSRMLS_CC); + + if (read_bytes > 0) { + /* gogo */ + SG(read_post_bytes) += read_bytes; + } + if (read_bytes < buflen) { + /* done */ + SG(post_read) = 1; + } + + return read_bytes; +} + +SAPI_API SAPI_POST_READER_FUNC(sapi_read_standard_form_data) +{ if ((SG(post_max_size) > 0) && (SG(request_info).content_length > SG(post_max_size))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "POST Content-Length of %ld bytes exceeds the limit of %ld bytes", SG(request_info).content_length, SG(post_max_size)); return; } + SG(request_info).request_body = php_stream_temp_create(TEMP_STREAM_DEFAULT, SAPI_POST_BLOCK_SIZE); if (sapi_module.read_post) { + int read_bytes; + for (;;) { char buffer[SAPI_POST_BLOCK_SIZE]; - read_bytes = sapi_module.read_post(buffer, SAPI_POST_BLOCK_SIZE TSRMLS_CC); - if (read_bytes<=0) { - /* failure */ - break; + read_bytes = sapi_read_post_block(buffer, SAPI_POST_BLOCK_SIZE TSRMLS_CC); + + if (read_bytes > 0) { + php_stream_write(SG(request_info).request_body, buffer, read_bytes); } - SG(read_post_bytes) += read_bytes; if ((SG(post_max_size) > 0) && (SG(read_post_bytes) > SG(post_max_size))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Actual POST length does not match Content-Length, and exceeds %ld bytes", SG(post_max_size)); break; } - php_stream_write(SG(request_info).request_body, buffer, read_bytes); - if (read_bytes < SAPI_POST_BLOCK_SIZE) { /* done */ break; } } - - php_stream_rewind(SG(request_info).request_body); + php_stream_rewind(SG(request_info).request_body); } } @@ -455,21 +469,13 @@ SAPI_API void sapi_activate(TSRMLS_D) /* Handle request method */ if (SG(server_context)) { - if (SG(request_info).request_method) { - if (PG(enable_post_data_reading) - && SG(request_info).content_type - && !strcmp(SG(request_info).request_method, "POST")) { - /* HTTP POST may contain form data to be processed into variables - * depending on given content type */ - sapi_read_post_data(TSRMLS_C); - } else { - /* Any other method with content payload will fill php://input stream. - * It's up to the webserver to decide whether to allow a method or not. */ - SG(request_info).content_type_dup = NULL; - if (sapi_module.default_post_reader) { - sapi_module.default_post_reader(TSRMLS_C); - } - } + if (PG(enable_post_data_reading) + && SG(request_info).content_type + && SG(request_info).request_method + && !strcmp(SG(request_info).request_method, "POST")) { + /* HTTP POST may contain form data to be processed into variables + * depending on given content type */ + sapi_read_post_data(TSRMLS_C); } else { SG(request_info).content_type_dup = NULL; } @@ -500,15 +506,15 @@ SAPI_API void sapi_deactivate(TSRMLS_D) zend_llist_destroy(&SG(sapi_headers).headers); if (SG(request_info).request_body) { SG(request_info).request_body = NULL; - } else if (SG(server_context)) { - if(sapi_module.read_post) { + } else if (SG(server_context)) { + if (!SG(post_read)) { /* make sure we've consumed all request input data */ char dummy[SAPI_POST_BLOCK_SIZE]; int read_bytes; - while((read_bytes = sapi_module.read_post(dummy, sizeof(dummy)-1 TSRMLS_CC)) > 0) { - SG(read_post_bytes) += read_bytes; - } + do { + read_bytes = sapi_read_post_block(dummy, SAPI_POST_BLOCK_SIZE TSRMLS_CC); + } while (SAPI_POST_BLOCK_SIZE == read_bytes); } } if (SG(request_info).auth_user) { diff --git a/main/SAPI.h b/main/SAPI.h index ed6b0494f4a30..5525a2aabd418 100644 --- a/main/SAPI.h +++ b/main/SAPI.h @@ -120,6 +120,7 @@ typedef struct _sapi_globals_struct { sapi_request_info request_info; sapi_headers_struct sapi_headers; int64_t read_post_bytes; + unsigned char post_read; unsigned char headers_sent; struct stat global_stat; char *default_mimetype; @@ -188,7 +189,7 @@ SAPI_API int sapi_add_header_ex(char *header_line, uint header_line_len, zend_bo SAPI_API int sapi_send_headers(TSRMLS_D); SAPI_API void sapi_free_header(sapi_header_struct *sapi_header); SAPI_API void sapi_handle_post(void *arg TSRMLS_DC); - +SAPI_API int sapi_read_post_block(char *buffer, size_t buflen TSRMLS_DC); SAPI_API int sapi_register_post_entries(sapi_post_entry *post_entry TSRMLS_DC); SAPI_API int sapi_register_post_entry(sapi_post_entry *post_entry TSRMLS_DC); SAPI_API void sapi_unregister_post_entry(sapi_post_entry *post_entry TSRMLS_DC); From 832e2d0d8c8bb11644fe34ec1685fc68d9b3a475 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Tue, 10 Sep 2013 13:14:02 +0200 Subject: [PATCH 086/400] tests --- tests/basic/enable_post_data_reading_01.phpt | 2 + tests/basic/enable_post_data_reading_02.phpt | 7 + tests/basic/enable_post_data_reading_03.phpt | 2 + tests/basic/enable_post_data_reading_04.phpt | 2 + tests/basic/enable_post_data_reading_05.phpt | 26 ++ tests/basic/enable_post_data_reading_06.phpt | 271 +++++++++++++++++++ 6 files changed, 310 insertions(+) create mode 100644 tests/basic/enable_post_data_reading_05.phpt create mode 100644 tests/basic/enable_post_data_reading_06.phpt diff --git a/tests/basic/enable_post_data_reading_01.phpt b/tests/basic/enable_post_data_reading_01.phpt index 1a0e33f617480..19ee5d583f762 100644 --- a/tests/basic/enable_post_data_reading_01.phpt +++ b/tests/basic/enable_post_data_reading_01.phpt @@ -11,6 +11,7 @@ var_dump($_FILES); var_dump($_POST); var_dump($HTTP_RAW_POST_DATA); var_dump(file_get_contents("php://input")); +var_dump(file_get_contents("php://input")); --EXPECTF-- array(0) { } @@ -20,3 +21,4 @@ array(0) { Notice: Undefined variable: HTTP_RAW_POST_DATA in %s on line %d NULL string(9) "a=1&b=ZYX" +string(9) "a=1&b=ZYX" diff --git a/tests/basic/enable_post_data_reading_02.phpt b/tests/basic/enable_post_data_reading_02.phpt index dc7f6b127ad8e..4e1643ebd02d5 100644 --- a/tests/basic/enable_post_data_reading_02.phpt +++ b/tests/basic/enable_post_data_reading_02.phpt @@ -15,6 +15,7 @@ Content-Type: text/plain-file var_dump($_FILES); var_dump($_POST); var_dump(file_get_contents("php://input")); +var_dump(file_get_contents("php://input")); --EXPECTF-- array(0) { } @@ -26,3 +27,9 @@ Content-Type: text/plain-file 1 -----------------------------20896060251896012921717172737--" +string(%d) "-----------------------------20896060251896012921717172737 +Content-Disposition: form-data; name="file1"; filename="file1.txt" +Content-Type: text/plain-file + +1 +-----------------------------20896060251896012921717172737--" diff --git a/tests/basic/enable_post_data_reading_03.phpt b/tests/basic/enable_post_data_reading_03.phpt index cdabe910ca45c..6a62282ea2e56 100644 --- a/tests/basic/enable_post_data_reading_03.phpt +++ b/tests/basic/enable_post_data_reading_03.phpt @@ -12,6 +12,7 @@ var_dump($_FILES); var_dump($_POST); var_dump($HTTP_RAW_POST_DATA); var_dump(file_get_contents("php://input")); +var_dump(file_get_contents("php://input")); --EXPECTF-- array(0) { } @@ -21,3 +22,4 @@ array(0) { Notice: Undefined variable: HTTP_RAW_POST_DATA in %s on line %d NULL string(9) "a=1&b=ZYX" +string(9) "a=1&b=ZYX" diff --git a/tests/basic/enable_post_data_reading_04.phpt b/tests/basic/enable_post_data_reading_04.phpt index a1685040bb957..a7c7e496d8c16 100644 --- a/tests/basic/enable_post_data_reading_04.phpt +++ b/tests/basic/enable_post_data_reading_04.phpt @@ -12,6 +12,7 @@ var_dump($_FILES); var_dump($_POST); var_dump($HTTP_RAW_POST_DATA); var_dump(file_get_contents("php://input")); +var_dump(file_get_contents("php://input")); --EXPECTF-- array(0) { } @@ -21,3 +22,4 @@ array(0) { Notice: Undefined variable: HTTP_RAW_POST_DATA in %s on line %d NULL string(9) "a=1&b=ZYX" +string(9) "a=1&b=ZYX" diff --git a/tests/basic/enable_post_data_reading_05.phpt b/tests/basic/enable_post_data_reading_05.phpt new file mode 100644 index 0000000000000..d8efa0129eaae --- /dev/null +++ b/tests/basic/enable_post_data_reading_05.phpt @@ -0,0 +1,26 @@ +--TEST-- +enable_post_data_reading: using multiple input streams +--INI-- +enable_post_data_reading=0 +max_execution_time=2 +--POST_RAW-- +Content-Type: application/unknown +One line of data +--FILE-- + + +Done +--EXPECT-- +Test +OOnnee lliinnee ooff ddaattaa +Done diff --git a/tests/basic/enable_post_data_reading_06.phpt b/tests/basic/enable_post_data_reading_06.phpt new file mode 100644 index 0000000000000..fbed195c03d1e --- /dev/null +++ b/tests/basic/enable_post_data_reading_06.phpt @@ -0,0 +1,271 @@ +--TEST-- +enable_post_data_reading: using multiple input streams (more than 8k data) +--INI-- +enable_post_data_reading=0 +--POST_RAW-- +Content-Type: application/unknown +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +. +--FILE-- + + +Done +--EXPECT-- +Test +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +.. +Done From 71bee63fad5418642c87c588cc9e22ca44186ce6 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Tue, 10 Sep 2013 13:16:24 +0200 Subject: [PATCH 087/400] remove unused code --- ext/standard/php_fopen_wrapper.c | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/ext/standard/php_fopen_wrapper.c b/ext/standard/php_fopen_wrapper.c index aa7924d211ddf..27acb28f52971 100644 --- a/ext/standard/php_fopen_wrapper.c +++ b/ext/standard/php_fopen_wrapper.c @@ -79,13 +79,11 @@ static size_t php_stream_input_read(php_stream *stream, char *buf, size_t count { php_stream_input_t *input = stream->abstract; size_t read; - //fprintf(stderr, "Attempt to read %lu bytes (%lu)\n", count, SG(read_post_bytes)); if (!SG(post_read) && SG(read_post_bytes) < input->position + count) { /* read requested data from SAPI */ int read_bytes = sapi_read_post_block(buf, count TSRMLS_CC); - //fprintf(stderr, "Did read %d bytes\n", read_bytes); if (read_bytes > 0) { php_stream_seek(*input->body_ptr, 0, SEEK_END); php_stream_write(*input->body_ptr, buf, read_bytes); @@ -105,20 +103,6 @@ static size_t php_stream_input_read(php_stream *stream, char *buf, size_t count } /* }}} */ -static size_t php_stream_input_read_x(php_stream *stream, char *buf, size_t count TSRMLS_DC) /* {{{ */ -{ - php_stream_input_t *input = stream->abstract; - php_stream *inner = *input->body_ptr; - - if (inner && inner->ops->read) { - size_t read = inner->ops->read(inner, buf, count TSRMLS_CC); - stream->eof = inner->eof; - return read; - } - return -1; -} -/* }}} */ - static int php_stream_input_close(php_stream *stream, int close_handle TSRMLS_DC) /* {{{ */ { efree(stream->abstract); From fba290c061027c24e4c8effdba37addd3430c3d4 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Tue, 10 Sep 2013 11:42:42 -0700 Subject: [PATCH 088/400] Allow CURLOPT_FOLLOWLOCATION to be used with open_basedir. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Newer versions of libcurl prevent file:// location response headers by default, which means that the open_basedir check is unnecessary — the fact CURLOPT_REDIR_PROTOCOLS can't set CURLPROTO_FILE with open_basedir enabled means that there's no possibility of breaching the open_basedir restriction, and this allows HTTP redirects to be followed automatically. Implements FR #65646 (re-enable CURLOPT_FOLLOWLOCATION with open_basedir or safe_mode). --- NEWS | 4 +++ ext/curl/interface.c | 2 ++ ext/curl/tests/bug65646.phpt | 15 +++++++++++ ext/curl/tests/bug65646_open_basedir_new.phpt | 25 +++++++++++++++++++ ext/curl/tests/bug65646_open_basedir_old.phpt | 18 +++++++++++++ ...t_CURLOPT_FOLLOWLOCATION_open_basedir.phpt | 22 ---------------- 6 files changed, 64 insertions(+), 22 deletions(-) create mode 100644 ext/curl/tests/bug65646.phpt create mode 100644 ext/curl/tests/bug65646_open_basedir_new.phpt create mode 100644 ext/curl/tests/bug65646_open_basedir_old.phpt delete mode 100644 ext/curl/tests/curl_setopt_CURLOPT_FOLLOWLOCATION_open_basedir.phpt diff --git a/NEWS b/NEWS index 29b5c9c0d0b57..bc3912602b4dc 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,10 @@ PHP NEWS of E_STRICT (phase 1 of RFC: https://wiki.php.net/rfc/incompat_ctx). (Gustavo) +- cURL: + . Implemented FR #65646 (re-enable CURLOPT_FOLLOWLOCATION with open_basedir + or safe_mode). (Adam) + - Session: . Fixed Bug #65315 (session.hash_function silently fallback to default md5) (Yasuo) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index ac872dfbc2ca9..591315973ce20 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -2504,6 +2504,7 @@ static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *retu case CURLOPT_FOLLOWLOCATION: convert_to_long_ex(zvalue); +#if LIBCURL_VERSION_NUM < 0x071304 if (PG(open_basedir) && *PG(open_basedir)) { if (Z_LVAL_PP(zvalue) != 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "CURLOPT_FOLLOWLOCATION cannot be activated when an open_basedir is set"); @@ -2511,6 +2512,7 @@ static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *retu return 1; } } +#endif error = curl_easy_setopt(ch->cp, option, Z_LVAL_PP(zvalue)); break; diff --git a/ext/curl/tests/bug65646.phpt b/ext/curl/tests/bug65646.phpt new file mode 100644 index 0000000000000..f244f7238fc7d --- /dev/null +++ b/ext/curl/tests/bug65646.phpt @@ -0,0 +1,15 @@ +--TEST-- +Bug #65646 (re-enable CURLOPT_FOLLOWLOCATION with open_basedir or safe_mode): open_basedir disabled +--SKIPIF-- + +--FILE-- + +--EXPECT-- +bool(true) diff --git a/ext/curl/tests/bug65646_open_basedir_new.phpt b/ext/curl/tests/bug65646_open_basedir_new.phpt new file mode 100644 index 0000000000000..991c4a2b8a562 --- /dev/null +++ b/ext/curl/tests/bug65646_open_basedir_new.phpt @@ -0,0 +1,25 @@ +--TEST-- +Bug #65646 (re-enable CURLOPT_FOLLOWLOCATION with open_basedir or safe_mode): open_basedir enabled; curl >= 7.19.4 +--INI-- +open_basedir=. +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +bool(true) + +Warning: curl_setopt(): CURLPROTO_FILE cannot be activated when an open_basedir is set in %s on line %d +bool(false) + +Warning: curl_setopt(): CURLPROTO_FILE cannot be activated when an open_basedir is set in %s on line %d +bool(false) diff --git a/ext/curl/tests/bug65646_open_basedir_old.phpt b/ext/curl/tests/bug65646_open_basedir_old.phpt new file mode 100644 index 0000000000000..cf11d21a200a2 --- /dev/null +++ b/ext/curl/tests/bug65646_open_basedir_old.phpt @@ -0,0 +1,18 @@ +--TEST-- +Bug #65646 (re-enable CURLOPT_FOLLOWLOCATION with open_basedir or safe_mode): open_basedir enabled; curl < 7.19.4 +--INI-- +open_basedir=. +--SKIPIF-- +=')) exit("skip curl version is too new"); +?> +--FILE-- + +--EXPECTF-- +Warning: curl_setopt(): CURLOPT_FOLLOWLOCATION cannot be activated when an open_basedir is set in %s on line %d +bool(false) diff --git a/ext/curl/tests/curl_setopt_CURLOPT_FOLLOWLOCATION_open_basedir.phpt b/ext/curl/tests/curl_setopt_CURLOPT_FOLLOWLOCATION_open_basedir.phpt deleted file mode 100644 index 7a778f36924db..0000000000000 --- a/ext/curl/tests/curl_setopt_CURLOPT_FOLLOWLOCATION_open_basedir.phpt +++ /dev/null @@ -1,22 +0,0 @@ ---TEST-- -CURLOPT_FOLLOWLOCATION case check open_basedir ---CREDITS-- -WHITE new media architects - Dennis ---INI-- -open_basedir = DIRECTORY_SEPARATOR."tmp"; ---SKIPIF-- - ---FILE-- - ---EXPECTF-- -Warning: curl_setopt(): CURLOPT_FOLLOWLOCATION cannot be activated when an open_basedir is set in %s.php on line %d -bool(false) - From 8983a38d5130c11bd96643dfa2b2f1393ac5969d Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Wed, 11 Sep 2013 14:11:29 -0700 Subject: [PATCH 089/400] Request non-keep-alive connections by default in HTTP 1.1 requests. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As noted in FR #65634, at present we don't send a Connection request header when the protocol version is set to 1.1, which means that RFC-compliant Web servers should respond with keep-alive connections. Since there's no way of reusing the HTTP connection at present, this simply means that PHP will appear to hang until the remote server hits its connection timeout, which may be quite some time. This commit sends a "Connection: close" header by default when HTTP 1.1 (or later) is requested by the user via the context options. It can be overridden by specifying a Connection header in the context options. It isn't possible to disable sending of the Connection header, but given "Connection: keep-alive" is the same as the default HTTP 1.1 behaviour, I don't see this as a significant issue — users who want to opt in for that still can. As a note, although I've removed an efree(protocol_version), this doesn't result in a memory leak: protocol_version is freed in the out: block at the end of the function anyway, and there are no returns between the removed efree() and the later call. Yes, I ran the tests with valgrind to check that. ☺ Implements FR #65634 (HTTP wrapper is very slow with protocol_version 1.1). --- NEWS | 4 ++ UPGRADING | 4 ++ ext/standard/http_fopen_wrapper.c | 18 +++++- ext/standard/tests/http/bug65634.phpt | 81 +++++++++++++++++++++++++++ 4 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 ext/standard/tests/http/bug65634.phpt diff --git a/NEWS b/NEWS index bc3912602b4dc..3848161f97c3a 100644 --- a/NEWS +++ b/NEWS @@ -44,4 +44,8 @@ PHP NEWS improvements based on this. (RFC: https://wiki.php.net/rfc/operator_overloading_gmp). (Nikita) +- Standard: + . Implemented FR #65634 (HTTP wrapper is very slow with protocol_version + 1.1). (Adam) + <<< NOTE: Insert NEWS from last stable release here prior to actual release! >>> diff --git a/UPGRADING b/UPGRADING index f392edd54d655..e9fba517d45b6 100755 --- a/UPGRADING +++ b/UPGRADING @@ -98,3 +98,7 @@ PHP X.Y UPGRADE NOTES - File upload: Uploads equal or greater than 2GB in size are now accepted. + +- HTTP stream wrapper: + HTTP 1.1 requests now include a Connection: close header unless explicitly + overridden by setting a Connection header via the header context option. diff --git a/ext/standard/http_fopen_wrapper.c b/ext/standard/http_fopen_wrapper.c index ac6fdad4fef3a..8762fa4849db1 100644 --- a/ext/standard/http_fopen_wrapper.c +++ b/ext/standard/http_fopen_wrapper.c @@ -80,6 +80,7 @@ #define HTTP_HEADER_FROM 8 #define HTTP_HEADER_CONTENT_LENGTH 16 #define HTTP_HEADER_TYPE 32 +#define HTTP_HEADER_CONNECTION 64 #define HTTP_WRAPPER_HEADER_INIT 1 #define HTTP_WRAPPER_REDIRECTED 2 @@ -386,8 +387,6 @@ php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper, const char strlcat(scratch, " HTTP/", scratch_len); strlcat(scratch, protocol_version, scratch_len); strlcat(scratch, "\r\n", scratch_len); - efree(protocol_version); - protocol_version = NULL; } else { strlcat(scratch, " HTTP/1.0\r\n", scratch_len); } @@ -490,6 +489,11 @@ php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper, const char *(s-1) == '\t' || *(s-1) == ' ')) { have_header |= HTTP_HEADER_TYPE; } + if ((s = strstr(tmp, "connection:")) && + (s == tmp || *(s-1) == '\r' || *(s-1) == '\n' || + *(s-1) == '\t' || *(s-1) == ' ')) { + have_header |= HTTP_HEADER_CONNECTION; + } /* remove Proxy-Authorization header */ if (use_proxy && use_ssl && (s = strstr(tmp, "proxy-authorization:")) && (s == tmp || *(s-1) == '\r' || *(s-1) == '\n' || @@ -563,6 +567,16 @@ php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper, const char } } + /* Send a Connection: close header when using HTTP 1.1 or later to avoid + * hanging when the server interprets the RFC literally and establishes a + * keep-alive connection, unless the user specifically requests something + * else by specifying a Connection header in the context options. */ + if (protocol_version && + ((have_header & HTTP_HEADER_CONNECTION) == 0) && + (strncmp(protocol_version, "1.0", MIN(protocol_version_len, 3)) > 0)) { + php_stream_write_string(stream, "Connection: close\r\n"); + } + if (context && php_stream_context_get_option(context, "http", "user_agent", &ua_zval) == SUCCESS && Z_TYPE_PP(ua_zval) == IS_STRING) { diff --git a/ext/standard/tests/http/bug65634.phpt b/ext/standard/tests/http/bug65634.phpt new file mode 100644 index 0000000000000..8f358cc6cfc84 --- /dev/null +++ b/ext/standard/tests/http/bug65634.phpt @@ -0,0 +1,81 @@ +--TEST-- +Bug #65634 (HTTP wrapper is very slow with protocol_version 1.1) +--INI-- +allow_url_fopen=1 +--SKIPIF-- + +--FILE-- + [ + 'protocol_version' => $version, + ], + ]; + + if ($connection) { + $options['http']['header'] = "Connection: $connection"; + } + + $ctx = stream_context_create($options); + + $responses = ["data://text/plain,HTTP/$version 204 No Content\r\n\r\n"]; + $pid = http_server('tcp://127.0.0.1:12342', $responses, $output); + + $fd = fopen('http://127.0.0.1:12342/', 'rb', false, $ctx); + fseek($output, 0, SEEK_SET); + echo stream_get_contents($output); + + http_server_kill($pid); +} + +echo "HTTP/1.0, default behaviour:\n"; +do_test('1.0', null); + +echo "HTTP/1.0, connection: close:\n"; +do_test('1.0', 'close'); + +echo "HTTP/1.0, connection: keep-alive:\n"; +do_test('1.0', 'keep-alive'); + +echo "HTTP/1.1, default behaviour:\n"; +do_test('1.1', null); + +echo "HTTP/1.1, connection: close:\n"; +do_test('1.1', 'close'); + +echo "HTTP/1.1, connection: keep-alive:\n"; +do_test('1.1', 'keep-alive'); +?> +--EXPECT-- +HTTP/1.0, default behaviour: +GET / HTTP/1.0 +Host: 127.0.0.1:12342 + +HTTP/1.0, connection: close: +GET / HTTP/1.0 +Host: 127.0.0.1:12342 +Connection: close + +HTTP/1.0, connection: keep-alive: +GET / HTTP/1.0 +Host: 127.0.0.1:12342 +Connection: keep-alive + +HTTP/1.1, default behaviour: +GET / HTTP/1.1 +Host: 127.0.0.1:12342 +Connection: close + +HTTP/1.1, connection: close: +GET / HTTP/1.1 +Host: 127.0.0.1:12342 +Connection: close + +HTTP/1.1, connection: keep-alive: +GET / HTTP/1.1 +Host: 127.0.0.1:12342 +Connection: keep-alive + From 59e2ce9ff19540dd85ebe25278a6d5b24a0fac64 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Wed, 11 Sep 2013 14:37:07 -0700 Subject: [PATCH 090/400] Sort the NEWS file alphabetically. Insert OCD otter meme here. --- NEWS | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/NEWS b/NEWS index 3848161f97c3a..64ca9a5df30b2 100644 --- a/NEWS +++ b/NEWS @@ -14,14 +14,10 @@ PHP NEWS . Implemented FR #65646 (re-enable CURLOPT_FOLLOWLOCATION with open_basedir or safe_mode). (Adam) -- Session: - . Fixed Bug #65315 (session.hash_function silently fallback to default md5) - (Yasuo) - . 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) +- 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) - mysqlnd: . Disabled flag for SP OUT variables for 5.5+ servers as they are not natively @@ -39,10 +35,14 @@ PHP NEWS . Fixed Bug #63657 (pgsqlCopyFromFile, pgsqlCopyToArray use Postgres < 7.3 syntax). (Matteo) -- 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) +- Session: + . Fixed Bug #65315 (session.hash_function silently fallback to default md5) + (Yasuo) + . 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) - Standard: . Implemented FR #65634 (HTTP wrapper is very slow with protocol_version From d7f5f1ef35c32d6943cd76a3c51752e8d64c5e5e Mon Sep 17 00:00:00 2001 From: Boro Sitnikovski Date: Thu, 12 Sep 2013 01:15:54 +0200 Subject: [PATCH 091/400] Fix bug #65548: Comparison for DateTimeImmutable doesn't work --- NEWS | 2 ++ ext/date/php_date.c | 32 +++++++++++++------------------- ext/date/tests/bug65548.phpt | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 19 deletions(-) create mode 100644 ext/date/tests/bug65548.phpt diff --git a/NEWS b/NEWS index df7f9d5729d32..6575bd904510f 100644 --- a/NEWS +++ b/NEWS @@ -36,6 +36,8 @@ PHP NEWS . Fixed bug #65458 (curl memory leak). (Adam) - Datetime: + . Fixed bug #65548 (Comparison for DateTimeImmutable doesn't work). + (Boro Sitnikovski) . 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 diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 95c68f1a78ca6..bb96227c261c2 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -2142,27 +2142,21 @@ static zval* date_clone_immutable(zval *object TSRMLS_DC) static int date_object_compare_date(zval *d1, zval *d2 TSRMLS_DC) { - if (Z_TYPE_P(d1) == IS_OBJECT && Z_TYPE_P(d2) == IS_OBJECT && - instanceof_function(Z_OBJCE_P(d1), date_ce_date TSRMLS_CC) && - instanceof_function(Z_OBJCE_P(d2), date_ce_date TSRMLS_CC)) { - php_date_obj *o1 = zend_object_store_get_object(d1 TSRMLS_CC); - php_date_obj *o2 = zend_object_store_get_object(d2 TSRMLS_CC); - - if (!o1->time || !o2->time) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Trying to compare an incomplete DateTime object"); - return 1; - } - if (!o1->time->sse_uptodate) { - timelib_update_ts(o1->time, o1->time->tz_info); - } - if (!o2->time->sse_uptodate) { - timelib_update_ts(o2->time, o2->time->tz_info); - } - - return (o1->time->sse == o2->time->sse) ? 0 : ((o1->time->sse < o2->time->sse) ? -1 : 1); + php_date_obj *o1 = zend_object_store_get_object(d1 TSRMLS_CC); + php_date_obj *o2 = zend_object_store_get_object(d2 TSRMLS_CC); + + if (!o1->time || !o2->time) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Trying to compare an incomplete DateTime or DateTimeImmutable object"); + return 1; + } + if (!o1->time->sse_uptodate) { + timelib_update_ts(o1->time, o1->time->tz_info); + } + if (!o2->time->sse_uptodate) { + timelib_update_ts(o2->time, o2->time->tz_info); } - return 1; + return (o1->time->sse == o2->time->sse) ? 0 : ((o1->time->sse < o2->time->sse) ? -1 : 1); } static HashTable *date_object_get_gc(zval *object, zval ***table, int *n TSRMLS_DC) diff --git a/ext/date/tests/bug65548.phpt b/ext/date/tests/bug65548.phpt new file mode 100644 index 0000000000000..53f2519f6d371 --- /dev/null +++ b/ext/date/tests/bug65548.phpt @@ -0,0 +1,34 @@ +--TEST-- +Test for bug #65548: Comparison for DateTimeImmutable doesn't work +--CREDITS-- +Boro Sitnikovski +--INI-- +date.timezone = UTC +--FILE-- + $iTomorrow); + +var_dump($iToday == $mToday); +var_dump($iToday === $mToday); + +var_dump($iToday < $mTomorrow); +var_dump($iToday == $mTomorrow); +var_dump($iToday > $mTomorrow); +?> +--EXPECT-- +bool(true) +bool(false) +bool(false) +bool(true) +bool(false) +bool(true) +bool(false) +bool(false) From 165f544ae9a3ac674a533a45ad8a8d5dccfa2536 Mon Sep 17 00:00:00 2001 From: Boro Sitnikovski Date: Thu, 12 Sep 2013 01:50:52 +0200 Subject: [PATCH 092/400] Fix bug #65502: DateTimeImmutable::createFromFormat returns DateTime DateTimeImmutable::createFromFormat should call date_create_immutable_from_format instead of date_create_from_format --- NEWS | 2 ++ ext/date/php_date.c | 2 +- ext/date/tests/bug65502.phpt | 12 ++++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 ext/date/tests/bug65502.phpt diff --git a/NEWS b/NEWS index 6575bd904510f..22cd0120e5864 100644 --- a/NEWS +++ b/NEWS @@ -36,6 +36,8 @@ PHP NEWS . Fixed bug #65458 (curl memory leak). (Adam) - Datetime: + . Fixed bug #65502 (DateTimeImmutable::createFromFormat returns DateTime). + (Boro Sitnikovski) . Fixed bug #65548 (Comparison for DateTimeImmutable doesn't work). (Boro Sitnikovski) . Fixed bug #65554 (createFromFormat broken when weekday name is followed diff --git a/ext/date/php_date.c b/ext/date/php_date.c index bb96227c261c2..7d3d1d739e113 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -480,7 +480,7 @@ const zend_function_entry date_funcs_immutable[] = { PHP_ME(DateTimeImmutable, __construct, arginfo_date_create, ZEND_ACC_CTOR|ZEND_ACC_PUBLIC) PHP_ME(DateTime, __wakeup, NULL, ZEND_ACC_PUBLIC) PHP_ME(DateTimeImmutable, __set_state, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - PHP_ME_MAPPING(createFromFormat, date_create_from_format, arginfo_date_create_from_format, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + PHP_ME_MAPPING(createFromFormat, date_create_immutable_from_format, arginfo_date_create_from_format, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) PHP_ME_MAPPING(getLastErrors, date_get_last_errors, arginfo_date_get_last_errors, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) PHP_ME_MAPPING(format, date_format, arginfo_date_method_format, 0) PHP_ME_MAPPING(getTimezone, date_timezone_get, arginfo_date_method_timezone_get, 0) diff --git a/ext/date/tests/bug65502.phpt b/ext/date/tests/bug65502.phpt new file mode 100644 index 0000000000000..8819c1ff745f2 --- /dev/null +++ b/ext/date/tests/bug65502.phpt @@ -0,0 +1,12 @@ +--TEST-- +Test for bug #65502: DateTimeImmutable::createFromFormat returns DateTime +--CREDITS-- +Boro Sitnikovski +--INI-- +date.timezone = UTC +--FILE-- + +--EXPECT-- +DateTimeImmutable From 074385cb33228c2bfcab0c252b5727fd9153a566 Mon Sep 17 00:00:00 2001 From: Popa Adrian Marius Date: Thu, 12 Sep 2013 17:47:05 +0300 Subject: [PATCH 093/400] Prepare pdo_firebird for a pecl release also --- ext/pdo_firebird/CREDITS | 2 +- ext/pdo_firebird/package2.xml | 21 ++++++++++----------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/ext/pdo_firebird/CREDITS b/ext/pdo_firebird/CREDITS index a33294b69c0e6..60b917415db69 100644 --- a/ext/pdo_firebird/CREDITS +++ b/ext/pdo_firebird/CREDITS @@ -1,2 +1,2 @@ -Firebird/InterBase driver for PDO +Firebird driver for PDO Ard Biesheuvel diff --git a/ext/pdo_firebird/package2.xml b/ext/pdo_firebird/package2.xml index 5b5984c80fa56..b744d388bc0d5 100644 --- a/ext/pdo_firebird/package2.xml +++ b/ext/pdo_firebird/package2.xml @@ -5,9 +5,9 @@ http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd"> PDO_FIREBIRD pecl.php.net - Firebird/InterBase 6 driver for PDO - This extension provides a Firebird/InterBase driver for PDO. It supports -all versions of Firebird and InterBase versions 6 and up. + Firebird driver for PDO + This extension provides a Firebird driver for PDO. It supports +all versions of Firebird 2.1 and up. Ard Biesheuvel @@ -15,18 +15,17 @@ all versions of Firebird and InterBase versions 6 and up. abies@php.net yes - 2006-05-01 + 2013-09-01 - 0.3 - 0.3 + 1.0 + 1.0 - beta - beta + stable + stable PHP - To compile and run this module, you will need to have the main PDO module and Firebird's -or InterBase's client library installed on your system. + To compile and run this module, you will need to have the main PDO module and Firebird's client library installed on your system. Hope it works! @@ -49,7 +48,7 @@ Hope it works! - 5.0.3 + 5.3.27 1.4.0 From ad976d82405ad25fb424328c5b9bdca7b734cca4 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 12 Sep 2013 17:46:14 +0200 Subject: [PATCH 094/400] Fix bug #64782: SplFileObject constructor make $context optional --- NEWS | 4 ++++ ext/spl/spl_directory.c | 2 +- ext/spl/tests/bug64782.phpt | 21 +++++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 ext/spl/tests/bug64782.phpt diff --git a/NEWS b/NEWS index 22cd0120e5864..c907c1bc3015b 100644 --- a/NEWS +++ b/NEWS @@ -59,6 +59,10 @@ PHP NEWS . Fixed bug #51127/#65359 Request #25630/#43980/#54383 (Added php_serialize session serialize handler that uses plain serialize()). (Yasuo) +- SPL: + . Fix bug #64782 (SplFileObject constructor make $context optional / give it + a default value). (Nikita) + - Standard: . Fix issue with return types of password API helper functions. Found via static analysis by cjones. (Anthony Ferrara) diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 1a417d0f5850a..3dc7b7925c949 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -2290,7 +2290,7 @@ SPL_METHOD(SplFileObject, __construct) intern->u.file.open_mode = NULL; intern->u.file.open_mode_len = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|sbr", + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|sbr!", &intern->file_name, &intern->file_name_len, &intern->u.file.open_mode, &intern->u.file.open_mode_len, &use_include_path, &intern->u.file.zcontext) == FAILURE) { diff --git a/ext/spl/tests/bug64782.phpt b/ext/spl/tests/bug64782.phpt new file mode 100644 index 0000000000000..2b225cd043718 --- /dev/null +++ b/ext/spl/tests/bug64782.phpt @@ -0,0 +1,21 @@ +--TEST-- +Bug #64782: SplFileObject constructor make $context optional / give it a default value +--FILE-- + +--EXPECTF-- +object(SplFileObject)#1 (%d) { + ["pathName":"SplFileInfo":private]=> + string(50) "%s/bug64782.php" + ["fileName":"SplFileInfo":private]=> + string(12) "bug64782.php" + ["openMode":"SplFileObject":private]=> + string(1) "r" + ["delimiter":"SplFileObject":private]=> + string(1) "," + ["enclosure":"SplFileObject":private]=> + string(1) """ +} From 506a61549fd9b1ab3f3d84c23cdacb3a28c7ecc7 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 12 Sep 2013 18:23:53 +0200 Subject: [PATCH 095/400] Move NEWS entries to correct version Accidentially inserted NEWS entries in previous release. --- NEWS | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/NEWS b/NEWS index c907c1bc3015b..5ec672eeda0e4 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,12 @@ PHP NEWS . Fixed bug #65633 (built-in server treat some http headers as case-sensitive). (Adam) +- Datetime: + . Fixed bug #65502 (DateTimeImmutable::createFromFormat returns DateTime). + (Boro Sitnikovski) + . Fixed bug #65548 (Comparison for DateTimeImmutable doesn't work). + (Boro Sitnikovski) + - GD . Ensure that the defined interpolation method is used with the generic scaling methods. (Pierre) @@ -13,6 +19,10 @@ PHP NEWS - OPcache: . Fixed bug #65510 (5.5.2 crashes in _get_zval_ptr_ptr_var). (Dmitry) +- SPL: + . Fix bug #64782 (SplFileObject constructor make $context optional / give it + a default value). (Nikita) + ?? ??? 2013, PHP 5.5.4 - Core: @@ -36,10 +46,6 @@ PHP NEWS . Fixed bug #65458 (curl memory leak). (Adam) - Datetime: - . Fixed bug #65502 (DateTimeImmutable::createFromFormat returns DateTime). - (Boro Sitnikovski) - . Fixed bug #65548 (Comparison for DateTimeImmutable doesn't work). - (Boro Sitnikovski) . 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 @@ -59,13 +65,9 @@ PHP NEWS . Fixed bug #51127/#65359 Request #25630/#43980/#54383 (Added php_serialize session serialize handler that uses plain serialize()). (Yasuo) -- SPL: - . Fix bug #64782 (SplFileObject constructor make $context optional / give it - a default value). (Nikita) - - Standard: - . Fix issue with return types of password API helper functions. Found via static - analysis by cjones. (Anthony Ferrara) + . 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 From d76959a3b976a0d9f0be994451fd7d5a6def3204 Mon Sep 17 00:00:00 2001 From: Levi Morrison Date: Thu, 12 Sep 2013 15:26:51 -0600 Subject: [PATCH 096/400] Fixed minor bug in test. --- ext/spl/tests/bug64782.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/spl/tests/bug64782.phpt b/ext/spl/tests/bug64782.phpt index 2b225cd043718..ac5d08d7d1e97 100644 --- a/ext/spl/tests/bug64782.phpt +++ b/ext/spl/tests/bug64782.phpt @@ -9,7 +9,7 @@ var_dump(new SplFileObject(__FILE__, "r", false, null)); --EXPECTF-- object(SplFileObject)#1 (%d) { ["pathName":"SplFileInfo":private]=> - string(50) "%s/bug64782.php" + string(%d) "%s/bug64782.php" ["fileName":"SplFileInfo":private]=> string(12) "bug64782.php" ["openMode":"SplFileObject":private]=> From ef9e003b0c30e704073f125632e916e927363426 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 13 Sep 2013 12:18:39 +0200 Subject: [PATCH 097/400] Small cleanup in class name resolution of compiler * The fetch_type and check_ns_name parameters of zend_resolve_class_name were unused and are now removed. * ZEND_FETCH_CLASS_GLOBAL is no longer used (no code actually checking for it). * The checks for usage of "namespace" as class name were unnecessary as that situation can't occur anyways. --- Zend/zend_compile.c | 44 +++++++++++-------------------------- Zend/zend_compile.h | 6 ++--- Zend/zend_language_parser.y | 4 ++-- 3 files changed, 18 insertions(+), 36 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index f250b2be20879..a592586290a05 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -723,7 +723,7 @@ void zend_do_fetch_static_member(znode *result, znode *class_name TSRMLS_DC) /* if (class_name->op_type == IS_CONST && ZEND_FETCH_CLASS_DEFAULT == zend_get_class_fetch_type(Z_STRVAL(class_name->u.constant), Z_STRLEN(class_name->u.constant))) { - zend_resolve_class_name(class_name, ZEND_FETCH_CLASS_GLOBAL, 1 TSRMLS_CC); + zend_resolve_class_name(class_name TSRMLS_CC); class_node = *class_name; } else { zend_do_fetch_class(&class_node, class_name TSRMLS_CC); @@ -1840,15 +1840,6 @@ void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, con zend_arg_info *cur_arg_info; znode var; - if (class_type->op_type == IS_CONST && - Z_TYPE(class_type->u.constant) == IS_STRING && - Z_STRLEN(class_type->u.constant) == 0) { - /* Usage of namespace as class name not in namespace */ - zval_dtor(&class_type->u.constant); - zend_error(E_COMPILE_ERROR, "Cannot use 'namespace' as a class name"); - return; - } - if (zend_is_auto_global_quick(Z_STRVAL(varname->u.constant), Z_STRLEN(varname->u.constant), 0 TSRMLS_CC)) { zend_error(E_COMPILE_ERROR, "Cannot re-assign auto-global variable %s", Z_STRVAL(varname->u.constant)); } else { @@ -1913,7 +1904,7 @@ void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, con } else { cur_arg_info->type_hint = IS_OBJECT; if (ZEND_FETCH_CLASS_DEFAULT == zend_get_class_fetch_type(Z_STRVAL(class_type->u.constant), Z_STRLEN(class_type->u.constant))) { - zend_resolve_class_name(class_type, opline->extended_value, 1 TSRMLS_CC); + zend_resolve_class_name(class_type TSRMLS_CC); } Z_STRVAL(class_type->u.constant) = (char*)zend_new_interned_string(class_type->u.constant.value.str.val, class_type->u.constant.value.str.len + 1, 1 TSRMLS_CC); cur_arg_info->class_name = class_type->u.constant.value.str.val; @@ -2164,7 +2155,7 @@ void zend_do_resolve_class_name(znode *result, znode *class_name, int is_static zend_do_fetch_constant(result, class_name, &constant_name, ZEND_RT, 1 TSRMLS_CC); break; case ZEND_FETCH_CLASS_DEFAULT: - zend_resolve_class_name(class_name, ZEND_FETCH_CLASS_GLOBAL, 1 TSRMLS_CC); + zend_resolve_class_name(class_name TSRMLS_CC); *result = *class_name; break; } @@ -2174,7 +2165,7 @@ void zend_do_resolve_class_name(znode *result, znode *class_name, int is_static } /* }}} */ -void zend_resolve_class_name(znode *class_name, ulong fetch_type, int check_ns_name TSRMLS_DC) /* {{{ */ +void zend_resolve_class_name(znode *class_name TSRMLS_DC) /* {{{ */ { char *compound; char *lcname; @@ -2253,21 +2244,12 @@ void zend_do_fetch_class(znode *result, znode *class_name TSRMLS_DC) /* {{{ */ long fetch_class_op_number; zend_op *opline; - if (class_name->op_type == IS_CONST && - Z_TYPE(class_name->u.constant) == IS_STRING && - Z_STRLEN(class_name->u.constant) == 0) { - /* Usage of namespace as class name not in namespace */ - zval_dtor(&class_name->u.constant); - zend_error(E_COMPILE_ERROR, "Cannot use 'namespace' as a class name"); - return; - } - fetch_class_op_number = get_next_op_number(CG(active_op_array)); opline = get_next_op(CG(active_op_array) TSRMLS_CC); opline->opcode = ZEND_FETCH_CLASS; SET_UNUSED(opline->op1); - opline->extended_value = ZEND_FETCH_CLASS_GLOBAL; + opline->extended_value = ZEND_FETCH_CLASS_DEFAULT; CG(catch_begin) = fetch_class_op_number; if (class_name->op_type == IS_CONST) { int fetch_type; @@ -2282,7 +2264,7 @@ void zend_do_fetch_class(znode *result, znode *class_name TSRMLS_DC) /* {{{ */ zval_dtor(&class_name->u.constant); break; default: - zend_resolve_class_name(class_name, opline->extended_value, 0 TSRMLS_CC); + zend_resolve_class_name(class_name TSRMLS_CC); opline->op2_type = IS_CONST; opline->op2.constant = zend_add_class_name_literal(CG(active_op_array), &class_name->u.constant TSRMLS_CC); @@ -2458,7 +2440,7 @@ int zend_do_begin_class_member_function_call(znode *class_name, znode *method_na if (class_name->op_type == IS_CONST && ZEND_FETCH_CLASS_DEFAULT == zend_get_class_fetch_type(Z_STRVAL(class_name->u.constant), Z_STRLEN(class_name->u.constant))) { - zend_resolve_class_name(class_name, ZEND_FETCH_CLASS_GLOBAL, 1 TSRMLS_CC); + zend_resolve_class_name(class_name TSRMLS_CC); class_node = *class_name; opline = get_next_op(CG(active_op_array) TSRMLS_CC); } else { @@ -2896,7 +2878,7 @@ void zend_do_begin_catch(znode *catch_token, znode *class_name, znode *catch_var if (class_name->op_type == IS_CONST && ZEND_FETCH_CLASS_DEFAULT == zend_get_class_fetch_type(Z_STRVAL(class_name->u.constant), Z_STRLEN(class_name->u.constant))) { - zend_resolve_class_name(class_name, ZEND_FETCH_CLASS_GLOBAL, 1 TSRMLS_CC); + zend_resolve_class_name(class_name TSRMLS_CC); catch_class = *class_name; } else { zend_error(E_COMPILE_ERROR, "Bad class name in the catch statement"); @@ -4470,7 +4452,7 @@ void zend_prepare_reference(znode *result, znode *class_name, znode *method_name /* REM: There should not be a need for copying, zend_do_begin_class_declaration is also just using that string */ if (class_name) { - zend_resolve_class_name(class_name, ZEND_FETCH_CLASS_GLOBAL, 1 TSRMLS_CC); + zend_resolve_class_name(class_name TSRMLS_CC); method_ref->class_name = Z_STRVAL(class_name->u.constant); method_ref->cname_len = Z_STRLEN(class_name->u.constant); } else { @@ -5171,7 +5153,7 @@ void zend_do_implements_interface(znode *interface_name TSRMLS_DC) /* {{{ */ opline = get_next_op(CG(active_op_array) TSRMLS_CC); opline->opcode = ZEND_ADD_INTERFACE; SET_NODE(opline->op1, &CG(implementing_class)); - zend_resolve_class_name(interface_name, opline->extended_value, 0 TSRMLS_CC); + zend_resolve_class_name(interface_name TSRMLS_CC); opline->extended_value = (opline->extended_value & ~ZEND_FETCH_CLASS_MASK) | ZEND_FETCH_CLASS_INTERFACE; opline->op2_type = IS_CONST; opline->op2.constant = zend_add_class_name_literal(CG(active_op_array), &interface_name->u.constant TSRMLS_CC); @@ -5203,7 +5185,7 @@ void zend_do_use_trait(znode *trait_name TSRMLS_DC) /* {{{ */ opline = get_next_op(CG(active_op_array) TSRMLS_CC); opline->opcode = ZEND_ADD_TRAIT; SET_NODE(opline->op1, &CG(implementing_class)); - zend_resolve_class_name(trait_name, opline->extended_value, 0 TSRMLS_CC); + zend_resolve_class_name(trait_name TSRMLS_CC); opline->extended_value = ZEND_FETCH_CLASS_TRAIT; opline->op2_type = IS_CONST; opline->op2.constant = zend_add_class_name_literal(CG(active_op_array), &trait_name->u.constant TSRMLS_CC); @@ -5582,7 +5564,7 @@ void zend_do_fetch_constant(znode *result, znode *constant_container, znode *con if (ZEND_FETCH_CLASS_STATIC == type) { zend_error(E_ERROR, "\"static::\" is not allowed in compile-time constants"); } else if (ZEND_FETCH_CLASS_DEFAULT == type) { - zend_resolve_class_name(constant_container, fetch_type, 1 TSRMLS_CC); + zend_resolve_class_name(constant_container TSRMLS_CC); } zend_do_build_full_name(NULL, constant_container, constant_name, 1 TSRMLS_CC); *result = *constant_container; @@ -5591,7 +5573,7 @@ void zend_do_fetch_constant(znode *result, znode *constant_container, znode *con case ZEND_RT: if (constant_container->op_type == IS_CONST && ZEND_FETCH_CLASS_DEFAULT == zend_get_class_fetch_type(Z_STRVAL(constant_container->u.constant), Z_STRLEN(constant_container->u.constant))) { - zend_resolve_class_name(constant_container, fetch_type, 1 TSRMLS_CC); + zend_resolve_class_name(constant_container TSRMLS_CC); } else { zend_do_fetch_class(&tmp, constant_container TSRMLS_CC); constant_container = &tmp; diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 9c55b5ebe8812..61d11427a1e49 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -438,7 +438,7 @@ ZEND_API int zend_get_compiled_lineno(TSRMLS_D); ZEND_API size_t zend_get_scanned_file_offset(TSRMLS_D); void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace TSRMLS_DC); -void zend_resolve_class_name(znode *class_name, ulong fetch_type, int check_ns_name TSRMLS_DC); +void zend_resolve_class_name(znode *class_name TSRMLS_DC); ZEND_API const char* zend_get_compiled_variable_name(const zend_op_array *op_array, zend_uint var, int* name_len); #ifdef ZTS @@ -726,8 +726,8 @@ int zend_add_literal(zend_op_array *op_array, const zval *zv TSRMLS_DC); #define ZEND_FETCH_CLASS_DEFAULT 0 #define ZEND_FETCH_CLASS_SELF 1 #define ZEND_FETCH_CLASS_PARENT 2 -#define ZEND_FETCH_CLASS_MAIN 3 -#define ZEND_FETCH_CLASS_GLOBAL 4 +#define ZEND_FETCH_CLASS_MAIN 3 /* unused */ +#define ZEND_FETCH_CLASS_GLOBAL 4 /* unused */ #define ZEND_FETCH_CLASS_AUTO 5 #define ZEND_FETCH_CLASS_INTERFACE 6 #define ZEND_FETCH_CLASS_STATIC 7 diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 6a9a24a87ea72..403146e16486e 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -629,8 +629,8 @@ trait_precedence: ; trait_reference_list: - fully_qualified_class_name { zend_resolve_class_name(&$1, ZEND_FETCH_CLASS_GLOBAL, 1 TSRMLS_CC); zend_init_list(&$$.u.op.ptr, Z_STRVAL($1.u.constant) TSRMLS_CC); } - | trait_reference_list ',' fully_qualified_class_name { zend_resolve_class_name(&$3, ZEND_FETCH_CLASS_GLOBAL, 1 TSRMLS_CC); zend_add_to_list(&$1.u.op.ptr, Z_STRVAL($3.u.constant) TSRMLS_CC); $$ = $1; } + fully_qualified_class_name { zend_resolve_class_name(&$1 TSRMLS_CC); zend_init_list(&$$.u.op.ptr, Z_STRVAL($1.u.constant) TSRMLS_CC); } + | trait_reference_list ',' fully_qualified_class_name { zend_resolve_class_name(&$3 TSRMLS_CC); zend_add_to_list(&$1.u.op.ptr, Z_STRVAL($3.u.constant) TSRMLS_CC); $$ = $1; } ; trait_method_reference: From 9eaffd34c123ae5782054cd32bf6caa50ff2b7d2 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Fri, 13 Sep 2013 12:54:42 +0200 Subject: [PATCH 098/400] fix broken sha2 configure tests see http://patch-tracker.debian.org/patch/series/view/php5/5.5.3+dfsg-1/fix_broken_sha2_test.patch --- ext/standard/config.m4 | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/ext/standard/config.m4 b/ext/standard/config.m4 index 2af2209f2bb54..3d00d88dda151 100644 --- a/ext/standard/config.m4 +++ b/ext/standard/config.m4 @@ -182,12 +182,12 @@ AC_TRY_RUN([ main() { #if HAVE_CRYPT - char salt[30], answer[80]; - - salt[0]='$'; salt[1]='6'; salt[2]='$'; salt[3]='$'; salt[4]='b'; salt[5]='a'; salt[6]='r'; salt[7]='\0'; + char salt[21], answer[21+86]; + + strcpy(salt,"\$6\$rasmuslerdorf\$"); strcpy(answer, salt); - strcpy(&answer[29],"$6$$QMXjqd7rHQZPQ1yHsXkQqC1FBzDiVfTHXL.LaeDAeVV.IzMaV9VU4MQ8kPuZa2SOP1A0RPm772EaFYjpEJtdu."); - exit (strcmp((char *)crypt("foo",salt),answer)); + strcat(answer, "EeHCRjm0bljalWuALHSTs1NB9ipEiLEXLhYeXdOpx22gmlmVejnVXFhd84cEKbYxCo.XuUTrW.RLraeEnsvWs/"); + exit (strcmp((char *)crypt("rasmuslerdorf",salt),answer)); #else exit(0); #endif @@ -211,12 +211,13 @@ AC_TRY_RUN([ main() { #if HAVE_CRYPT - char salt[30], answer[80]; - salt[0]='$'; salt[1]='5'; salt[2]='$'; salt[3]='$'; salt[4]='s'; salt[5]='a'; salt[6]='l'; salt[7]='t'; salt[8]='s'; salt[9]='t'; salt[10]='r'; salt[11]='i'; salt[12]='n'; salt[13]='g'; salt[14]='\0'; - strcat(salt,""); + char salt[21], answer[21+43]; + + strcpy(salt,"\$5\$rasmuslerdorf\$"); strcpy(answer, salt); - strcpy(&answer[29], "$5$saltstring$5B8vYYiY.CVt1RlTTf8KbXBH3hsxY/GNooZaBBGWEc5"); - exit (strcmp((char *)crypt("foo",salt),answer)); + strcat(answer, "cFAm2puLCujQ9t.0CxiFIIvFi4JyQx5UncCt/xRIX23"); + exit (strcmp((char *)crypt("rasmuslerdorf",salt),answer)); + #else exit(0); #endif From 2e692b22e92e26f6224e313864105ad1d9c4585d Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Fri, 13 Sep 2013 12:54:42 +0200 Subject: [PATCH 099/400] fix broken sha2 configure tests see http://patch-tracker.debian.org/patch/series/view/php5/5.5.3+dfsg-1/fix_broken_sha2_test.patch --- ext/standard/config.m4 | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/ext/standard/config.m4 b/ext/standard/config.m4 index 2af2209f2bb54..3d00d88dda151 100644 --- a/ext/standard/config.m4 +++ b/ext/standard/config.m4 @@ -182,12 +182,12 @@ AC_TRY_RUN([ main() { #if HAVE_CRYPT - char salt[30], answer[80]; - - salt[0]='$'; salt[1]='6'; salt[2]='$'; salt[3]='$'; salt[4]='b'; salt[5]='a'; salt[6]='r'; salt[7]='\0'; + char salt[21], answer[21+86]; + + strcpy(salt,"\$6\$rasmuslerdorf\$"); strcpy(answer, salt); - strcpy(&answer[29],"$6$$QMXjqd7rHQZPQ1yHsXkQqC1FBzDiVfTHXL.LaeDAeVV.IzMaV9VU4MQ8kPuZa2SOP1A0RPm772EaFYjpEJtdu."); - exit (strcmp((char *)crypt("foo",salt),answer)); + strcat(answer, "EeHCRjm0bljalWuALHSTs1NB9ipEiLEXLhYeXdOpx22gmlmVejnVXFhd84cEKbYxCo.XuUTrW.RLraeEnsvWs/"); + exit (strcmp((char *)crypt("rasmuslerdorf",salt),answer)); #else exit(0); #endif @@ -211,12 +211,13 @@ AC_TRY_RUN([ main() { #if HAVE_CRYPT - char salt[30], answer[80]; - salt[0]='$'; salt[1]='5'; salt[2]='$'; salt[3]='$'; salt[4]='s'; salt[5]='a'; salt[6]='l'; salt[7]='t'; salt[8]='s'; salt[9]='t'; salt[10]='r'; salt[11]='i'; salt[12]='n'; salt[13]='g'; salt[14]='\0'; - strcat(salt,""); + char salt[21], answer[21+43]; + + strcpy(salt,"\$5\$rasmuslerdorf\$"); strcpy(answer, salt); - strcpy(&answer[29], "$5$saltstring$5B8vYYiY.CVt1RlTTf8KbXBH3hsxY/GNooZaBBGWEc5"); - exit (strcmp((char *)crypt("foo",salt),answer)); + strcat(answer, "cFAm2puLCujQ9t.0CxiFIIvFi4JyQx5UncCt/xRIX23"); + exit (strcmp((char *)crypt("rasmuslerdorf",salt),answer)); + #else exit(0); #endif From 00799319f90570f113ba35d27ac71cca4bdaa572 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 13 Sep 2013 15:07:47 +0200 Subject: [PATCH 100/400] Make consistent use of Z_*VAL macros in compiler --- Zend/zend_compile.c | 126 ++++++++++++++++++++++---------------------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index a592586290a05..699231ba5219c 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -153,12 +153,12 @@ static void build_runtime_defined_function_key(zval *result, const char *name, i } /* NULL, name length, filename length, last accepting char position length */ - result->value.str.len = 1+name_length+strlen(filename)+char_pos_len; + Z_STRLEN_P(result) = 1+name_length+strlen(filename)+char_pos_len; /* must be binary safe */ - result->value.str.val = (char *) safe_emalloc(result->value.str.len, 1, 1); - result->value.str.val[0] = '\0'; - sprintf(result->value.str.val+1, "%s%s%s", name, filename, char_pos_buf); + Z_STRVAL_P(result) = (char *) safe_emalloc(Z_STRLEN_P(result), 1, 1); + Z_STRVAL_P(result)[0] = '\0'; + sprintf(Z_STRVAL_P(result)+1, "%s%s%s", name, filename, char_pos_buf); result->type = IS_STRING; Z_SET_REFCOUNT_P(result, 1); @@ -664,14 +664,14 @@ void fetch_simple_variable_ex(znode *result, znode *varname, int bp, zend_uchar } else if (IS_INTERNED(Z_STRVAL(varname->u.constant))) { hash = INTERNED_HASH(Z_STRVAL(varname->u.constant)); } - if (!zend_is_auto_global_quick(varname->u.constant.value.str.val, varname->u.constant.value.str.len, hash TSRMLS_CC) && - !(varname->u.constant.value.str.len == (sizeof("this")-1) && - !memcmp(varname->u.constant.value.str.val, "this", sizeof("this"))) && + if (!zend_is_auto_global_quick(Z_STRVAL(varname->u.constant), Z_STRLEN(varname->u.constant), hash TSRMLS_CC) && + !(Z_STRLEN(varname->u.constant) == (sizeof("this")-1) && + !memcmp(Z_STRVAL(varname->u.constant), "this", sizeof("this"))) && (CG(active_op_array)->last == 0 || CG(active_op_array)->opcodes[CG(active_op_array)->last-1].opcode != ZEND_BEGIN_SILENCE)) { result->op_type = IS_CV; - result->u.op.var = lookup_cv(CG(active_op_array), varname->u.constant.value.str.val, varname->u.constant.value.str.len, hash TSRMLS_CC); - varname->u.constant.value.str.val = (char*)CG(active_op_array)->vars[result->u.op.var].name; + result->u.op.var = lookup_cv(CG(active_op_array), Z_STRVAL(varname->u.constant), Z_STRLEN(varname->u.constant), hash TSRMLS_CC); + Z_STRVAL(varname->u.constant) = (char*)CG(active_op_array)->vars[result->u.op.var].name; result->EA = 0; return; } @@ -694,7 +694,7 @@ void fetch_simple_variable_ex(znode *result, znode *varname, int bp, zend_uchar if (varname->op_type == IS_CONST) { CALCULATE_LITERAL_HASH(opline_ptr->op1.constant); - if (zend_is_auto_global_quick(varname->u.constant.value.str.val, varname->u.constant.value.str.len, Z_HASH_P(&CONSTANT(opline_ptr->op1.constant)) TSRMLS_CC)) { + if (zend_is_auto_global_quick(Z_STRVAL(varname->u.constant), Z_STRLEN(varname->u.constant), Z_HASH_P(&CONSTANT(opline_ptr->op1.constant)) TSRMLS_CC)) { opline_ptr->extended_value = ZEND_FETCH_GLOBAL; } } @@ -882,9 +882,9 @@ void zend_do_abstract_method(const znode *function_name, znode *modifiers, const method_type = "Abstract"; } - if (modifiers->u.constant.value.lval & ZEND_ACC_ABSTRACT) { - if(modifiers->u.constant.value.lval & ZEND_ACC_PRIVATE) { - zend_error(E_COMPILE_ERROR, "%s function %s::%s() cannot be declared private", method_type, CG(active_class_entry)->name, function_name->u.constant.value.str.val); + if (Z_LVAL(modifiers->u.constant) & ZEND_ACC_ABSTRACT) { + if(Z_LVAL(modifiers->u.constant) & ZEND_ACC_PRIVATE) { + zend_error(E_COMPILE_ERROR, "%s function %s::%s() cannot be declared private", method_type, CG(active_class_entry)->name, Z_STRVAL(function_name->u.constant)); } if (Z_LVAL(body->u.constant) == ZEND_ACC_ABSTRACT) { zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC); @@ -894,11 +894,11 @@ void zend_do_abstract_method(const znode *function_name, znode *modifiers, const SET_UNUSED(opline->op2); } else { /* we had code in the function body */ - zend_error(E_COMPILE_ERROR, "%s function %s::%s() cannot contain body", method_type, CG(active_class_entry)->name, function_name->u.constant.value.str.val); + zend_error(E_COMPILE_ERROR, "%s function %s::%s() cannot contain body", method_type, CG(active_class_entry)->name, Z_STRVAL(function_name->u.constant)); } } else { - if (body->u.constant.value.lval == ZEND_ACC_ABSTRACT) { - zend_error(E_COMPILE_ERROR, "Non-abstract method %s::%s() must contain body", CG(active_class_entry)->name, function_name->u.constant.value.str.val); + if (Z_LVAL(body->u.constant) == ZEND_ACC_ABSTRACT) { + zend_error(E_COMPILE_ERROR, "Non-abstract method %s::%s() must contain body", CG(active_class_entry)->name, Z_STRVAL(function_name->u.constant)); } } } @@ -1526,8 +1526,8 @@ int zend_do_verify_access_types(const znode *current_access_type, const znode *n void zend_do_begin_function_declaration(znode *function_token, znode *function_name, int is_method, int return_reference, znode *fn_flags_znode TSRMLS_DC) /* {{{ */ { zend_op_array op_array; - char *name = function_name->u.constant.value.str.val; - int name_len = function_name->u.constant.value.str.len; + char *name = Z_STRVAL(function_name->u.constant); + int name_len = Z_STRLEN(function_name->u.constant); int function_begin_line = function_token->u.op.opline_num; zend_uint fn_flags; const char *lcname; @@ -1537,7 +1537,7 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n if (is_method) { if (CG(active_class_entry)->ce_flags & ZEND_ACC_INTERFACE) { if ((Z_LVAL(fn_flags_znode->u.constant) & ~(ZEND_ACC_STATIC|ZEND_ACC_PUBLIC))) { - zend_error(E_COMPILE_ERROR, "Access type for interface method %s::%s() must be omitted", CG(active_class_entry)->name, function_name->u.constant.value.str.val); + zend_error(E_COMPILE_ERROR, "Access type for interface method %s::%s() must be omitted", CG(active_class_entry)->name, Z_STRVAL(function_name->u.constant)); } Z_LVAL(fn_flags_znode->u.constant) |= ZEND_ACC_ABSTRACT; /* propagates to the rest of the parser */ } @@ -1844,7 +1844,7 @@ void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, con zend_error(E_COMPILE_ERROR, "Cannot re-assign auto-global variable %s", Z_STRVAL(varname->u.constant)); } else { var.op_type = IS_CV; - var.u.op.var = lookup_cv(CG(active_op_array), varname->u.constant.value.str.val, varname->u.constant.value.str.len, 0 TSRMLS_CC); + var.u.op.var = lookup_cv(CG(active_op_array), Z_STRVAL(varname->u.constant), Z_STRLEN(varname->u.constant), 0 TSRMLS_CC); Z_STRVAL(varname->u.constant) = (char*)CG(active_op_array)->vars[var.u.op.var].name; var.EA = 0; if (CG(active_op_array)->vars[var.u.op.var].hash_value == THIS_HASHVAL && @@ -1871,8 +1871,8 @@ void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, con } CG(active_op_array)->arg_info = erealloc(CG(active_op_array)->arg_info, sizeof(zend_arg_info)*(CG(active_op_array)->num_args)); cur_arg_info = &CG(active_op_array)->arg_info[CG(active_op_array)->num_args-1]; - cur_arg_info->name = zend_new_interned_string(estrndup(varname->u.constant.value.str.val, varname->u.constant.value.str.len), varname->u.constant.value.str.len + 1, 1 TSRMLS_CC); - cur_arg_info->name_len = varname->u.constant.value.str.len; + cur_arg_info->name = zend_new_interned_string(estrndup(Z_STRVAL(varname->u.constant), Z_STRLEN(varname->u.constant)), Z_STRLEN(varname->u.constant) + 1, 1 TSRMLS_CC); + cur_arg_info->name_len = Z_STRLEN(varname->u.constant); cur_arg_info->type_hint = 0; cur_arg_info->allow_null = 1; cur_arg_info->pass_by_reference = pass_by_reference; @@ -1906,9 +1906,9 @@ void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, con if (ZEND_FETCH_CLASS_DEFAULT == zend_get_class_fetch_type(Z_STRVAL(class_type->u.constant), Z_STRLEN(class_type->u.constant))) { zend_resolve_class_name(class_type TSRMLS_CC); } - Z_STRVAL(class_type->u.constant) = (char*)zend_new_interned_string(class_type->u.constant.value.str.val, class_type->u.constant.value.str.len + 1, 1 TSRMLS_CC); - cur_arg_info->class_name = class_type->u.constant.value.str.val; - cur_arg_info->class_name_len = class_type->u.constant.value.str.len; + Z_STRVAL(class_type->u.constant) = (char*)zend_new_interned_string(Z_STRVAL(class_type->u.constant), Z_STRLEN(class_type->u.constant) + 1, 1 TSRMLS_CC); + cur_arg_info->class_name = Z_STRVAL(class_type->u.constant); + cur_arg_info->class_name_len = Z_STRLEN(class_type->u.constant); if (op == ZEND_RECV_INIT) { if (Z_TYPE(initialization->u.constant) == IS_NULL || (Z_TYPE(initialization->u.constant) == IS_CONSTANT && !strcasecmp(Z_STRVAL(initialization->u.constant), "NULL"))) { cur_arg_info->allow_null = 1; @@ -1940,16 +1940,16 @@ int zend_do_begin_function_call(znode *function_name, zend_bool check_namespace return 1; } - lcname = zend_str_tolower_dup(function_name->u.constant.value.str.val, function_name->u.constant.value.str.len); - if ((zend_hash_find(CG(function_table), lcname, function_name->u.constant.value.str.len+1, (void **) &function)==FAILURE) || + lcname = zend_str_tolower_dup(Z_STRVAL(function_name->u.constant), Z_STRLEN(function_name->u.constant)); + if ((zend_hash_find(CG(function_table), lcname, Z_STRLEN(function_name->u.constant)+1, (void **) &function)==FAILURE) || ((CG(compiler_options) & ZEND_COMPILE_IGNORE_INTERNAL_FUNCTIONS) && (function->type == ZEND_INTERNAL_FUNCTION))) { zend_do_begin_dynamic_function_call(function_name, 0 TSRMLS_CC); efree(lcname); return 1; /* Dynamic */ } - efree(function_name->u.constant.value.str.val); - function_name->u.constant.value.str.val = lcname; + efree(Z_STRVAL(function_name->u.constant)); + Z_STRVAL(function_name->u.constant) = lcname; zend_stack_push(&CG(function_call_stack), (void *) &function, sizeof(zend_function *)); if (CG(context).nested_calls + 1 > CG(active_op_array)->nested_calls) { @@ -2124,7 +2124,7 @@ void zend_do_resolve_class_name(znode *result, znode *class_name, int is_static int lctype; znode constant_name; - lcname = zend_str_tolower_dup(Z_STRVAL(class_name->u.constant), class_name->u.constant.value.str.len); + lcname = zend_str_tolower_dup(Z_STRVAL(class_name->u.constant), Z_STRLEN(class_name->u.constant)); lctype = zend_get_class_fetch_type(lcname, strlen(lcname)); switch (lctype) { case ZEND_FETCH_CLASS_SELF: @@ -2254,7 +2254,7 @@ void zend_do_fetch_class(znode *result, znode *class_name TSRMLS_DC) /* {{{ */ if (class_name->op_type == IS_CONST) { int fetch_type; - fetch_type = zend_get_class_fetch_type(class_name->u.constant.value.str.val, class_name->u.constant.value.str.len); + fetch_type = zend_get_class_fetch_type(Z_STRVAL(class_name->u.constant), Z_STRLEN(class_name->u.constant)); switch (fetch_type) { case ZEND_FETCH_CLASS_SELF: case ZEND_FETCH_CLASS_PARENT: @@ -2401,19 +2401,19 @@ void zend_do_build_full_name(znode *result, znode *prefix, znode *name, int is_c } if (is_class_member) { - length = sizeof("::")-1 + result->u.constant.value.str.len + name->u.constant.value.str.len; - result->u.constant.value.str.val = erealloc(result->u.constant.value.str.val, length+1); - memcpy(&result->u.constant.value.str.val[result->u.constant.value.str.len], "::", sizeof("::")-1); - memcpy(&result->u.constant.value.str.val[result->u.constant.value.str.len + sizeof("::")-1], name->u.constant.value.str.val, name->u.constant.value.str.len+1); - STR_FREE(name->u.constant.value.str.val); - result->u.constant.value.str.len = length; + length = sizeof("::")-1 + Z_STRLEN(result->u.constant) + Z_STRLEN(name->u.constant); + Z_STRVAL(result->u.constant) = erealloc(Z_STRVAL(result->u.constant), length+1); + memcpy(&Z_STRVAL(result->u.constant)[Z_STRLEN(result->u.constant)], "::", sizeof("::")-1); + memcpy(&Z_STRVAL(result->u.constant)[Z_STRLEN(result->u.constant) + sizeof("::")-1], Z_STRVAL(name->u.constant), Z_STRLEN(name->u.constant)+1); + STR_FREE(Z_STRVAL(name->u.constant)); + Z_STRLEN(result->u.constant) = length; } else { - length = sizeof("\\")-1 + result->u.constant.value.str.len + name->u.constant.value.str.len; - result->u.constant.value.str.val = erealloc(result->u.constant.value.str.val, length+1); - memcpy(&result->u.constant.value.str.val[result->u.constant.value.str.len], "\\", sizeof("\\")-1); - memcpy(&result->u.constant.value.str.val[result->u.constant.value.str.len + sizeof("\\")-1], name->u.constant.value.str.val, name->u.constant.value.str.len+1); - STR_FREE(name->u.constant.value.str.val); - result->u.constant.value.str.len = length; + length = sizeof("\\")-1 + Z_STRLEN(result->u.constant) + Z_STRLEN(name->u.constant); + Z_STRVAL(result->u.constant) = erealloc(Z_STRVAL(result->u.constant), length+1); + memcpy(&Z_STRVAL(result->u.constant)[Z_STRLEN(result->u.constant)], "\\", sizeof("\\")-1); + memcpy(&Z_STRVAL(result->u.constant)[Z_STRLEN(result->u.constant) + sizeof("\\")-1], Z_STRVAL(name->u.constant), Z_STRLEN(name->u.constant)+1); + STR_FREE(Z_STRVAL(name->u.constant)); + Z_STRLEN(result->u.constant) = length; } } /* }}} */ @@ -2894,7 +2894,7 @@ void zend_do_begin_catch(znode *catch_token, znode *class_name, znode *catch_var opline->op1_type = IS_CONST; opline->op1.constant = zend_add_class_name_literal(CG(active_op_array), &catch_class.u.constant TSRMLS_CC); opline->op2_type = IS_CV; - opline->op2.var = lookup_cv(CG(active_op_array), catch_var->u.constant.value.str.val, catch_var->u.constant.value.str.len, 0 TSRMLS_CC); + opline->op2.var = lookup_cv(CG(active_op_array), Z_STRVAL(catch_var->u.constant), Z_STRLEN(catch_var->u.constant), 0 TSRMLS_CC); Z_STRVAL(catch_var->u.constant) = (char*)CG(active_op_array)->vars[opline->op2.var].name; opline->result.num = 0; /* 1 means it's the last catch in the block */ @@ -4955,7 +4955,7 @@ void zend_do_begin_class_declaration(const znode *class_token, znode *class_name return; } - lcname = zend_str_tolower_dup(class_name->u.constant.value.str.val, class_name->u.constant.value.str.len); + lcname = zend_str_tolower_dup(Z_STRVAL(class_name->u.constant), Z_STRLEN(class_name->u.constant)); if (!(strcmp(lcname, "self") && strcmp(lcname, "parent"))) { efree(lcname); @@ -5274,11 +5274,11 @@ void zend_do_declare_property(const znode *var_name, const znode *value, zend_ui if (access_type & ZEND_ACC_FINAL) { zend_error(E_COMPILE_ERROR, "Cannot declare property %s::$%s final, the final modifier is allowed only for methods and classes", - CG(active_class_entry)->name, var_name->u.constant.value.str.val); + CG(active_class_entry)->name, Z_STRVAL(var_name->u.constant)); } - if (zend_hash_find(&CG(active_class_entry)->properties_info, var_name->u.constant.value.str.val, var_name->u.constant.value.str.len+1, (void **) &existing_property_info)==SUCCESS) { - zend_error(E_COMPILE_ERROR, "Cannot redeclare %s::$%s", CG(active_class_entry)->name, var_name->u.constant.value.str.val); + if (zend_hash_find(&CG(active_class_entry)->properties_info, Z_STRVAL(var_name->u.constant), Z_STRLEN(var_name->u.constant)+1, (void **) &existing_property_info)==SUCCESS) { + zend_error(E_COMPILE_ERROR, "Cannot redeclare %s::$%s", CG(active_class_entry)->name, Z_STRVAL(var_name->u.constant)); } ALLOC_ZVAL(property); @@ -5296,8 +5296,8 @@ void zend_do_declare_property(const znode *var_name, const znode *value, zend_ui CG(doc_comment_len) = 0; } - zend_declare_property_ex(CG(active_class_entry), zend_new_interned_string(var_name->u.constant.value.str.val, var_name->u.constant.value.str.len + 1, 0 TSRMLS_CC), var_name->u.constant.value.str.len, property, access_type, comment, comment_len TSRMLS_CC); - efree(var_name->u.constant.value.str.val); + zend_declare_property_ex(CG(active_class_entry), zend_new_interned_string(Z_STRVAL(var_name->u.constant), Z_STRLEN(var_name->u.constant) + 1, 0 TSRMLS_CC), Z_STRLEN(var_name->u.constant), property, access_type, comment, comment_len TSRMLS_CC); + efree(Z_STRVAL(var_name->u.constant)); } /* }}} */ @@ -5319,16 +5319,16 @@ void zend_do_declare_class_constant(znode *var_name, const znode *value TSRMLS_D ALLOC_ZVAL(property); *property = value->u.constant; - cname = zend_new_interned_string(var_name->u.constant.value.str.val, var_name->u.constant.value.str.len+1, 0 TSRMLS_CC); + cname = zend_new_interned_string(Z_STRVAL(var_name->u.constant), Z_STRLEN(var_name->u.constant)+1, 0 TSRMLS_CC); if (IS_INTERNED(cname)) { - result = zend_hash_quick_add(&CG(active_class_entry)->constants_table, cname, var_name->u.constant.value.str.len+1, INTERNED_HASH(cname), &property, sizeof(zval *), NULL); + result = zend_hash_quick_add(&CG(active_class_entry)->constants_table, cname, Z_STRLEN(var_name->u.constant)+1, INTERNED_HASH(cname), &property, sizeof(zval *), NULL); } else { - result = zend_hash_add(&CG(active_class_entry)->constants_table, cname, var_name->u.constant.value.str.len+1, &property, sizeof(zval *), NULL); + result = zend_hash_add(&CG(active_class_entry)->constants_table, cname, Z_STRLEN(var_name->u.constant)+1, &property, sizeof(zval *), NULL); } if (result == FAILURE) { FREE_ZVAL(property); - zend_error(E_COMPILE_ERROR, "Cannot redefine class constant %s::%s", CG(active_class_entry)->name, var_name->u.constant.value.str.val); + zend_error(E_COMPILE_ERROR, "Cannot redefine class constant %s::%s", CG(active_class_entry)->name, Z_STRVAL(var_name->u.constant)); } FREE_PNODE(var_name); @@ -5773,11 +5773,11 @@ void zend_do_add_static_array_element(znode *result, znode *offset, const znode Z_STRVAL(offset->u.constant) = erealloc(Z_STRVAL(offset->u.constant), Z_STRLEN(offset->u.constant)+3); Z_STRVAL(offset->u.constant)[Z_STRLEN(offset->u.constant)+1] = Z_TYPE(offset->u.constant); Z_STRVAL(offset->u.constant)[Z_STRLEN(offset->u.constant)+2] = 0; - zend_symtable_update(result->u.constant.value.ht, Z_STRVAL(offset->u.constant), Z_STRLEN(offset->u.constant)+3, &element, sizeof(zval *), NULL); + zend_symtable_update(Z_ARRVAL(result->u.constant), Z_STRVAL(offset->u.constant), Z_STRLEN(offset->u.constant)+3, &element, sizeof(zval *), NULL); zval_dtor(&offset->u.constant); break; case IS_STRING: - zend_symtable_update(result->u.constant.value.ht, offset->u.constant.value.str.val, offset->u.constant.value.str.len+1, &element, sizeof(zval *), NULL); + zend_symtable_update(Z_ARRVAL(result->u.constant), Z_STRVAL(offset->u.constant), Z_STRLEN(offset->u.constant)+1, &element, sizeof(zval *), NULL); zval_dtor(&offset->u.constant); break; case IS_NULL: @@ -5954,7 +5954,7 @@ void zend_do_fetch_static_variable(znode *varname, const znode *static_assignmen ALLOC_HASHTABLE(CG(active_op_array)->static_variables); zend_hash_init(CG(active_op_array)->static_variables, 2, NULL, ZVAL_PTR_DTOR, 0); } - zend_hash_update(CG(active_op_array)->static_variables, varname->u.constant.value.str.val, varname->u.constant.value.str.len+1, &tmp, sizeof(zval *), NULL); + zend_hash_update(CG(active_op_array)->static_variables, Z_STRVAL(varname->u.constant), Z_STRLEN(varname->u.constant)+1, &tmp, sizeof(zval *), NULL); if (varname->op_type == IS_CONST) { if (Z_TYPE(varname->u.constant) != IS_STRING) { @@ -6083,7 +6083,7 @@ void zend_do_indirect_references(znode *result, const znode *num_references, zno int i; zend_do_end_variable_parse(variable, BP_VAR_R, 0 TSRMLS_CC); - for (i=1; iu.constant.value.lval; i++) { + for (i=1; iu.constant); i++) { fetch_simple_variable_ex(result, variable, 0, ZEND_FETCH_R TSRMLS_CC); *variable = *result; } @@ -6398,10 +6398,10 @@ void zend_do_declare_begin(TSRMLS_D) /* {{{ */ void zend_do_declare_stmt(znode *var, znode *val TSRMLS_DC) /* {{{ */ { - if (!zend_binary_strcasecmp(var->u.constant.value.str.val, var->u.constant.value.str.len, "ticks", sizeof("ticks")-1)) { + if (!zend_binary_strcasecmp(Z_STRVAL(var->u.constant), Z_STRLEN(var->u.constant), "ticks", sizeof("ticks")-1)) { convert_to_long(&val->u.constant); CG(declarables).ticks = val->u.constant; - } else if (!zend_binary_strcasecmp(var->u.constant.value.str.val, var->u.constant.value.str.len, "encoding", sizeof("encoding")-1)) { + } else if (!zend_binary_strcasecmp(Z_STRVAL(var->u.constant), Z_STRLEN(var->u.constant), "encoding", sizeof("encoding")-1)) { if ((Z_TYPE(val->u.constant) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) { zend_error(E_COMPILE_ERROR, "Cannot use constants as encoding"); } @@ -6433,9 +6433,9 @@ void zend_do_declare_stmt(znode *var, znode *val TSRMLS_DC) /* {{{ */ CG(encoding_declared) = 1; convert_to_string(&val->u.constant); - new_encoding = zend_multibyte_fetch_encoding(val->u.constant.value.str.val TSRMLS_CC); + new_encoding = zend_multibyte_fetch_encoding(Z_STRVAL(val->u.constant) TSRMLS_CC); if (!new_encoding) { - zend_error(E_COMPILE_WARNING, "Unsupported encoding [%s]", val->u.constant.value.str.val); + zend_error(E_COMPILE_WARNING, "Unsupported encoding [%s]", Z_STRVAL(val->u.constant)); } else { old_input_filter = LANG_SCNG(input_filter); old_encoding = LANG_SCNG(script_encoding); @@ -6452,7 +6452,7 @@ void zend_do_declare_stmt(znode *var, znode *val TSRMLS_DC) /* {{{ */ } zval_dtor(&val->u.constant); } else { - zend_error(E_COMPILE_WARNING, "Unsupported declare '%s'", var->u.constant.value.str.val); + zend_error(E_COMPILE_WARNING, "Unsupported declare '%s'", Z_STRVAL(var->u.constant)); zval_dtor(&val->u.constant); } zval_dtor(&var->u.constant); From d2950ac2791cd03559a58e78f5cd626283b9ee4d Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 13 Sep 2013 15:08:01 +0200 Subject: [PATCH 101/400] Make use of Z_*VAL and ZVAL_* in language scanner --- Zend/zend_language_scanner.c | 948 ++++++++++++++++------------------- Zend/zend_language_scanner.l | 254 ++++------ 2 files changed, 532 insertions(+), 670 deletions(-) diff --git a/Zend/zend_language_scanner.c b/Zend/zend_language_scanner.c index deb799ab763b2..0f0f51194fd52 100644 --- a/Zend/zend_language_scanner.c +++ b/Zend/zend_language_scanner.c @@ -564,10 +564,8 @@ ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type TSR zend_bool original_in_compilation = CG(in_compilation); retval_znode.op_type = IS_CONST; - retval_znode.u.constant.type = IS_LONG; - retval_znode.u.constant.value.lval = 1; - Z_UNSET_ISREF(retval_znode.u.constant); - Z_SET_REFCOUNT(retval_znode.u.constant, 1); + INIT_PZVAL(&retval_znode.u.constant); + ZVAL_LONG(&retval_znode.u.constant, 1); zend_save_lexical_state(&original_lex_state TSRMLS_CC); @@ -624,7 +622,7 @@ zend_op_array *compile_filename(int type, zval *filename TSRMLS_DC) convert_to_string(&tmp); filename = &tmp; } - file_handle.filename = filename->value.str.val; + file_handle.filename = Z_STRVAL_P(filename); file_handle.free_filename = 0; file_handle.type = ZEND_HANDLE_FILENAME; file_handle.opened_path = NULL; @@ -635,7 +633,7 @@ zend_op_array *compile_filename(int type, zval *filename TSRMLS_DC) int dummy = 1; if (!file_handle.opened_path) { - file_handle.opened_path = opened_path = estrndup(filename->value.str.val, filename->value.str.len); + file_handle.opened_path = opened_path = estrndup(Z_STRVAL_P(filename), Z_STRLEN_P(filename)); } zend_hash_add(&EG(included_files), file_handle.opened_path, strlen(file_handle.opened_path)+1, (void *)&dummy, sizeof(int), NULL); @@ -658,21 +656,21 @@ ZEND_API int zend_prepare_string_for_scanning(zval *str, char *filename TSRMLS_D size_t size; /* enforce two trailing NULLs for flex... */ - if (IS_INTERNED(str->value.str.val)) { - char *tmp = safe_emalloc(1, str->value.str.len, ZEND_MMAP_AHEAD); - memcpy(tmp, str->value.str.val, str->value.str.len + ZEND_MMAP_AHEAD); - str->value.str.val = tmp; + if (IS_INTERNED(Z_STRVAL_P(str))) { + char *tmp = safe_emalloc(1, Z_STRLEN_P(str), ZEND_MMAP_AHEAD); + memcpy(tmp, Z_STRVAL_P(str), Z_STRLEN_P(str) + ZEND_MMAP_AHEAD); + Z_STRVAL_P(str) = tmp; } else { - str->value.str.val = safe_erealloc(str->value.str.val, 1, str->value.str.len, ZEND_MMAP_AHEAD); + Z_STRVAL_P(str) = safe_erealloc(Z_STRVAL_P(str), 1, Z_STRLEN_P(str), ZEND_MMAP_AHEAD); } - memset(str->value.str.val + str->value.str.len, 0, ZEND_MMAP_AHEAD); + memset(Z_STRVAL_P(str) + Z_STRLEN_P(str), 0, ZEND_MMAP_AHEAD); SCNG(yy_in) = NULL; SCNG(yy_start) = NULL; - buf = str->value.str.val; - size = str->value.str.len; + buf = Z_STRVAL_P(str); + size = Z_STRLEN_P(str); if (CG(multibyte)) { SCNG(script_org) = (unsigned char*)buf; @@ -733,7 +731,7 @@ zend_op_array *compile_string(zval *source_string, char *filename TSRMLS_DC) int compiler_result; zend_bool original_in_compilation = CG(in_compilation); - if (source_string->value.str.len==0) { + if (Z_STRLEN_P(source_string)==0) { efree(op_array); return NULL; } @@ -871,11 +869,11 @@ ZEND_API void zend_multibyte_yyinput_again(zend_encoding_filter old_input_filter # define zend_copy_value(zendlval, yytext, yyleng) \ if (SCNG(output_filter)) { \ size_t sz = 0; \ - SCNG(output_filter)((unsigned char **)&(zendlval->value.str.val), &sz, (unsigned char *)yytext, (size_t)yyleng TSRMLS_CC); \ - zendlval->value.str.len = sz; \ + SCNG(output_filter)((unsigned char **)&Z_STRVAL_P(zendlval), &sz, (unsigned char *)yytext, (size_t)yyleng TSRMLS_CC); \ + Z_STRLEN_P(zendlval) = sz; \ } else { \ - zendlval->value.str.val = (char *) estrndup(yytext, yyleng); \ - zendlval->value.str.len = yyleng; \ + Z_STRVAL_P(zendlval) = (char *) estrndup(yytext, yyleng); \ + Z_STRLEN_P(zendlval) = yyleng; \ } static void zend_scan_escape_string(zval *zendlval, char *str, int len, char quote_type TSRMLS_DC) @@ -886,8 +884,8 @@ static void zend_scan_escape_string(zval *zendlval, char *str, int len, char quo ZVAL_STRINGL(zendlval, str, len, 1); /* convert escape sequences */ - s = t = zendlval->value.str.val; - end = s+zendlval->value.str.len; + s = t = Z_STRVAL_P(zendlval); + end = s+Z_STRLEN_P(zendlval); while (svalue.str.len--; + Z_STRLEN_P(zendlval)--; break; case 'r': *t++ = '\r'; - zendlval->value.str.len--; + Z_STRLEN_P(zendlval)--; break; case 't': *t++ = '\t'; - zendlval->value.str.len--; + Z_STRLEN_P(zendlval)--; break; case 'f': *t++ = '\f'; - zendlval->value.str.len--; + Z_STRLEN_P(zendlval)--; break; case 'v': *t++ = '\v'; - zendlval->value.str.len--; + Z_STRLEN_P(zendlval)--; break; case 'e': #ifdef PHP_WIN32 @@ -923,7 +921,7 @@ static void zend_scan_escape_string(zval *zendlval, char *str, int len, char quo #else *t++ = '\e'; #endif - zendlval->value.str.len--; + Z_STRLEN_P(zendlval)--; break; case '"': case '`': @@ -935,20 +933,20 @@ static void zend_scan_escape_string(zval *zendlval, char *str, int len, char quo case '\\': case '$': *t++ = *s; - zendlval->value.str.len--; + Z_STRLEN_P(zendlval)--; break; case 'x': case 'X': if (ZEND_IS_HEX(*(s+1))) { char hex_buf[3] = { 0, 0, 0 }; - zendlval->value.str.len--; /* for the 'x' */ + Z_STRLEN_P(zendlval)--; /* for the 'x' */ hex_buf[0] = *(++s); - zendlval->value.str.len--; + Z_STRLEN_P(zendlval)--; if (ZEND_IS_HEX(*(s+1))) { hex_buf[1] = *(++s); - zendlval->value.str.len--; + Z_STRLEN_P(zendlval)--; } *t++ = (char) strtol(hex_buf, NULL, 16); } else { @@ -962,13 +960,13 @@ static void zend_scan_escape_string(zval *zendlval, char *str, int len, char quo char octal_buf[4] = { 0, 0, 0, 0 }; octal_buf[0] = *s; - zendlval->value.str.len--; + Z_STRLEN_P(zendlval)--; if (ZEND_IS_OCT(*(s+1))) { octal_buf[1] = *(++s); - zendlval->value.str.len--; + Z_STRLEN_P(zendlval)--; if (ZEND_IS_OCT(*(s+1))) { octal_buf[2] = *(++s); - zendlval->value.str.len--; + Z_STRLEN_P(zendlval)--; } } *t++ = (char) strtol(octal_buf, NULL, 8); @@ -990,9 +988,9 @@ static void zend_scan_escape_string(zval *zendlval, char *str, int len, char quo *t = 0; if (SCNG(output_filter)) { size_t sz = 0; - s = zendlval->value.str.val; - SCNG(output_filter)((unsigned char **)&(zendlval->value.str.val), &sz, (unsigned char *)s, (size_t)zendlval->value.str.len TSRMLS_CC); - zendlval->value.str.len = sz; + s = Z_STRVAL_P(zendlval); + SCNG(output_filter)((unsigned char **)&Z_STRVAL_P(zendlval), &sz, (unsigned char *)s, (size_t)Z_STRLEN_P(zendlval) TSRMLS_CC); + Z_STRLEN_P(zendlval) = sz; efree(s); } } @@ -1006,7 +1004,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yymore_restart: -#line 1010 "Zend/zend_language_scanner.c" +#line 1008 "Zend/zend_language_scanner.c" { YYCTYPE yych; unsigned int yyaccept = 0; @@ -1105,7 +1103,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy3: YYDEBUG(3, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1807 "Zend/zend_language_scanner.l" +#line 1745 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { return 0; @@ -1152,20 +1150,20 @@ int lex_scan(zval *zendlval TSRMLS_DC) if (SCNG(output_filter)) { int readsize; size_t sz = 0; - readsize = SCNG(output_filter)((unsigned char **)&(zendlval->value.str.val), &sz, (unsigned char *)yytext, (size_t)yyleng TSRMLS_CC); - zendlval->value.str.len = sz; + readsize = SCNG(output_filter)((unsigned char **)&Z_STRVAL_P(zendlval), &sz, (unsigned char *)yytext, (size_t)yyleng TSRMLS_CC); + Z_STRLEN_P(zendlval) = sz; if (readsize < yyleng) { yyless(readsize); } } else { - zendlval->value.str.val = (char *) estrndup(yytext, yyleng); - zendlval->value.str.len = yyleng; + Z_STRVAL_P(zendlval) = (char *) estrndup(yytext, yyleng); + Z_STRLEN_P(zendlval) = yyleng; } zendlval->type = IS_STRING; HANDLE_NEWLINES(yytext, yyleng); return T_INLINE_HTML; } -#line 1169 "Zend/zend_language_scanner.c" +#line 1167 "Zend/zend_language_scanner.c" yy4: YYDEBUG(4, *YYCURSOR); yych = *++YYCURSOR; @@ -1183,38 +1181,34 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy6: YYDEBUG(6, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1795 "Zend/zend_language_scanner.l" +#line 1735 "Zend/zend_language_scanner.l" { if (CG(short_tags)) { - zendlval->value.str.val = yytext; /* no copying - intentional */ - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; + ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ BEGIN(ST_IN_SCRIPTING); return T_OPEN_TAG; } else { goto inline_char_handler; } } -#line 1199 "Zend/zend_language_scanner.c" +#line 1195 "Zend/zend_language_scanner.c" yy7: YYDEBUG(7, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) == '=') goto yy43; YYDEBUG(8, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1772 "Zend/zend_language_scanner.l" +#line 1716 "Zend/zend_language_scanner.l" { if (CG(asp_tags)) { - zendlval->value.str.val = yytext; /* no copying - intentional */ - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; + ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ BEGIN(ST_IN_SCRIPTING); return T_OPEN_TAG; } else { goto inline_char_handler; } } -#line 1218 "Zend/zend_language_scanner.c" +#line 1212 "Zend/zend_language_scanner.c" yy9: YYDEBUG(9, *YYCURSOR); yych = *++YYCURSOR; @@ -1400,7 +1394,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(38, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1732 "Zend/zend_language_scanner.l" +#line 1682 "Zend/zend_language_scanner.l" { YYCTYPE *bracket = (YYCTYPE*)zend_memrchr(yytext, '<', yyleng - (sizeof("script language=php>") - 1)); @@ -1411,13 +1405,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } HANDLE_NEWLINES(yytext, yyleng); - zendlval->value.str.val = yytext; /* no copying - intentional */ - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; + ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ BEGIN(ST_IN_SCRIPTING); return T_OPEN_TAG; } -#line 1421 "Zend/zend_language_scanner.c" +#line 1413 "Zend/zend_language_scanner.c" yy39: YYDEBUG(39, *YYCURSOR); yych = *++YYCURSOR; @@ -1444,33 +1436,29 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(44, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1750 "Zend/zend_language_scanner.l" +#line 1698 "Zend/zend_language_scanner.l" { if (CG(asp_tags)) { - zendlval->value.str.val = yytext; /* no copying - intentional */ - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; + ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ BEGIN(ST_IN_SCRIPTING); return T_OPEN_TAG_WITH_ECHO; } else { goto inline_char_handler; } } -#line 1460 "Zend/zend_language_scanner.c" +#line 1450 "Zend/zend_language_scanner.c" yy45: YYDEBUG(45, *YYCURSOR); ++YYCURSOR; YYDEBUG(46, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1763 "Zend/zend_language_scanner.l" +#line 1709 "Zend/zend_language_scanner.l" { - zendlval->value.str.val = yytext; /* no copying - intentional */ - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; + ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ BEGIN(ST_IN_SCRIPTING); return T_OPEN_TAG_WITH_ECHO; } -#line 1474 "Zend/zend_language_scanner.c" +#line 1462 "Zend/zend_language_scanner.c" yy47: YYDEBUG(47, *YYCURSOR); yych = *++YYCURSOR; @@ -1497,16 +1485,14 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy51: YYDEBUG(51, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1785 "Zend/zend_language_scanner.l" +#line 1727 "Zend/zend_language_scanner.l" { - zendlval->value.str.val = yytext; /* no copying - intentional */ - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; + ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ HANDLE_NEWLINE(yytext[yyleng-1]); BEGIN(ST_IN_SCRIPTING); return T_OPEN_TAG; } -#line 1510 "Zend/zend_language_scanner.c" +#line 1496 "Zend/zend_language_scanner.c" yy52: YYDEBUG(52, *YYCURSOR); ++YYCURSOR; @@ -1577,7 +1563,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy56: YYDEBUG(56, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2258 "Zend/zend_language_scanner.l" +#line 2190 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { return 0; @@ -1618,7 +1604,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zend_scan_escape_string(zendlval, yytext, yyleng, '`' TSRMLS_CC); return T_ENCAPSED_AND_WHITESPACE; } -#line 1622 "Zend/zend_language_scanner.c" +#line 1608 "Zend/zend_language_scanner.c" yy57: YYDEBUG(57, *YYCURSOR); yych = *++YYCURSOR; @@ -1629,12 +1615,12 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(59, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2202 "Zend/zend_language_scanner.l" +#line 2134 "Zend/zend_language_scanner.l" { BEGIN(ST_IN_SCRIPTING); return '`'; } -#line 1638 "Zend/zend_language_scanner.c" +#line 1624 "Zend/zend_language_scanner.c" yy60: YYDEBUG(60, *YYCURSOR); yych = *++YYCURSOR; @@ -1644,14 +1630,14 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(62, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2189 "Zend/zend_language_scanner.l" +#line 2121 "Zend/zend_language_scanner.l" { - zendlval->value.lval = (long) '{'; + Z_LVAL_P(zendlval) = (long) '{'; yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); yyless(1); return T_CURLY_OPEN; } -#line 1655 "Zend/zend_language_scanner.c" +#line 1641 "Zend/zend_language_scanner.c" yy63: YYDEBUG(63, *YYCURSOR); yyaccept = 0; @@ -1667,24 +1653,24 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy65: YYDEBUG(65, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1889 "Zend/zend_language_scanner.l" +#line 1827 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; return T_VARIABLE; } -#line 1677 "Zend/zend_language_scanner.c" +#line 1663 "Zend/zend_language_scanner.c" yy66: YYDEBUG(66, *YYCURSOR); ++YYCURSOR; YYDEBUG(67, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1465 "Zend/zend_language_scanner.l" +#line 1461 "Zend/zend_language_scanner.l" { yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC); return T_DOLLAR_OPEN_CURLY_BRACES; } -#line 1688 "Zend/zend_language_scanner.c" +#line 1674 "Zend/zend_language_scanner.c" yy68: YYDEBUG(68, *YYCURSOR); yych = *++YYCURSOR; @@ -1698,7 +1684,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(71, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1881 "Zend/zend_language_scanner.l" +#line 1819 "Zend/zend_language_scanner.l" { yyless(yyleng - 1); yy_push_state(ST_VAR_OFFSET TSRMLS_CC); @@ -1706,7 +1692,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zendlval->type = IS_STRING; return T_VARIABLE; } -#line 1710 "Zend/zend_language_scanner.c" +#line 1696 "Zend/zend_language_scanner.c" yy72: YYDEBUG(72, *YYCURSOR); yych = *++YYCURSOR; @@ -1724,7 +1710,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(74, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1871 "Zend/zend_language_scanner.l" +#line 1809 "Zend/zend_language_scanner.l" { yyless(yyleng - 3); yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); @@ -1732,7 +1718,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zendlval->type = IS_STRING; return T_VARIABLE; } -#line 1736 "Zend/zend_language_scanner.c" +#line 1722 "Zend/zend_language_scanner.c" } /* *********************************** */ yyc_ST_DOUBLE_QUOTES: @@ -1800,7 +1786,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy78: YYDEBUG(78, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2208 "Zend/zend_language_scanner.l" +#line 2140 "Zend/zend_language_scanner.l" { if (GET_DOUBLE_QUOTES_SCANNED_LENGTH()) { YYCURSOR += GET_DOUBLE_QUOTES_SCANNED_LENGTH() - 1; @@ -1849,7 +1835,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zend_scan_escape_string(zendlval, yytext, yyleng, '"' TSRMLS_CC); return T_ENCAPSED_AND_WHITESPACE; } -#line 1853 "Zend/zend_language_scanner.c" +#line 1839 "Zend/zend_language_scanner.c" yy79: YYDEBUG(79, *YYCURSOR); yych = *++YYCURSOR; @@ -1860,12 +1846,12 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(81, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2197 "Zend/zend_language_scanner.l" +#line 2129 "Zend/zend_language_scanner.l" { BEGIN(ST_IN_SCRIPTING); return '"'; } -#line 1869 "Zend/zend_language_scanner.c" +#line 1855 "Zend/zend_language_scanner.c" yy82: YYDEBUG(82, *YYCURSOR); yych = *++YYCURSOR; @@ -1875,14 +1861,14 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(84, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2189 "Zend/zend_language_scanner.l" +#line 2121 "Zend/zend_language_scanner.l" { - zendlval->value.lval = (long) '{'; + Z_LVAL_P(zendlval) = (long) '{'; yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); yyless(1); return T_CURLY_OPEN; } -#line 1886 "Zend/zend_language_scanner.c" +#line 1872 "Zend/zend_language_scanner.c" yy85: YYDEBUG(85, *YYCURSOR); yyaccept = 0; @@ -1898,24 +1884,24 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy87: YYDEBUG(87, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1889 "Zend/zend_language_scanner.l" +#line 1827 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; return T_VARIABLE; } -#line 1908 "Zend/zend_language_scanner.c" +#line 1894 "Zend/zend_language_scanner.c" yy88: YYDEBUG(88, *YYCURSOR); ++YYCURSOR; YYDEBUG(89, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1465 "Zend/zend_language_scanner.l" +#line 1461 "Zend/zend_language_scanner.l" { yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC); return T_DOLLAR_OPEN_CURLY_BRACES; } -#line 1919 "Zend/zend_language_scanner.c" +#line 1905 "Zend/zend_language_scanner.c" yy90: YYDEBUG(90, *YYCURSOR); yych = *++YYCURSOR; @@ -1929,7 +1915,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(93, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1881 "Zend/zend_language_scanner.l" +#line 1819 "Zend/zend_language_scanner.l" { yyless(yyleng - 1); yy_push_state(ST_VAR_OFFSET TSRMLS_CC); @@ -1937,7 +1923,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zendlval->type = IS_STRING; return T_VARIABLE; } -#line 1941 "Zend/zend_language_scanner.c" +#line 1927 "Zend/zend_language_scanner.c" yy94: YYDEBUG(94, *YYCURSOR); yych = *++YYCURSOR; @@ -1955,7 +1941,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(96, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1871 "Zend/zend_language_scanner.l" +#line 1809 "Zend/zend_language_scanner.l" { yyless(yyleng - 3); yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); @@ -1963,7 +1949,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zendlval->type = IS_STRING; return T_VARIABLE; } -#line 1967 "Zend/zend_language_scanner.c" +#line 1953 "Zend/zend_language_scanner.c" } /* *********************************** */ yyc_ST_END_HEREDOC: @@ -1974,7 +1960,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(100, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2175 "Zend/zend_language_scanner.l" +#line 2107 "Zend/zend_language_scanner.l" { zend_heredoc_label *heredoc_label = zend_ptr_stack_pop(&SCNG(heredoc_label_stack)); @@ -1987,7 +1973,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) BEGIN(ST_IN_SCRIPTING); return T_END_HEREDOC; } -#line 1991 "Zend/zend_language_scanner.c" +#line 1977 "Zend/zend_language_scanner.c" /* *********************************** */ yyc_ST_HEREDOC: { @@ -2049,7 +2035,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy104: YYDEBUG(104, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2300 "Zend/zend_language_scanner.l" +#line 2232 "Zend/zend_language_scanner.l" { int newline = 0; @@ -2122,7 +2108,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zend_scan_escape_string(zendlval, yytext, yyleng - newline, 0 TSRMLS_CC); return T_ENCAPSED_AND_WHITESPACE; } -#line 2126 "Zend/zend_language_scanner.c" +#line 2112 "Zend/zend_language_scanner.c" yy105: YYDEBUG(105, *YYCURSOR); yych = *++YYCURSOR; @@ -2137,14 +2123,14 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(108, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2189 "Zend/zend_language_scanner.l" +#line 2121 "Zend/zend_language_scanner.l" { - zendlval->value.lval = (long) '{'; + Z_LVAL_P(zendlval) = (long) '{'; yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); yyless(1); return T_CURLY_OPEN; } -#line 2148 "Zend/zend_language_scanner.c" +#line 2134 "Zend/zend_language_scanner.c" yy109: YYDEBUG(109, *YYCURSOR); yyaccept = 0; @@ -2160,24 +2146,24 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy111: YYDEBUG(111, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1889 "Zend/zend_language_scanner.l" +#line 1827 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; return T_VARIABLE; } -#line 2170 "Zend/zend_language_scanner.c" +#line 2156 "Zend/zend_language_scanner.c" yy112: YYDEBUG(112, *YYCURSOR); ++YYCURSOR; YYDEBUG(113, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1465 "Zend/zend_language_scanner.l" +#line 1461 "Zend/zend_language_scanner.l" { yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC); return T_DOLLAR_OPEN_CURLY_BRACES; } -#line 2181 "Zend/zend_language_scanner.c" +#line 2167 "Zend/zend_language_scanner.c" yy114: YYDEBUG(114, *YYCURSOR); yych = *++YYCURSOR; @@ -2191,7 +2177,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(117, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1881 "Zend/zend_language_scanner.l" +#line 1819 "Zend/zend_language_scanner.l" { yyless(yyleng - 1); yy_push_state(ST_VAR_OFFSET TSRMLS_CC); @@ -2199,7 +2185,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zendlval->type = IS_STRING; return T_VARIABLE; } -#line 2203 "Zend/zend_language_scanner.c" +#line 2189 "Zend/zend_language_scanner.c" yy118: YYDEBUG(118, *YYCURSOR); yych = *++YYCURSOR; @@ -2217,7 +2203,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(120, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1871 "Zend/zend_language_scanner.l" +#line 1809 "Zend/zend_language_scanner.l" { yyless(yyleng - 3); yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); @@ -2225,7 +2211,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zendlval->type = IS_STRING; return T_VARIABLE; } -#line 2229 "Zend/zend_language_scanner.c" +#line 2215 "Zend/zend_language_scanner.c" } /* *********************************** */ yyc_ST_IN_SCRIPTING: @@ -2408,13 +2394,13 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy124: YYDEBUG(124, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1912 "Zend/zend_language_scanner.l" +#line 1850 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, yytext, yyleng); zendlval->type = IS_STRING; return T_STRING; } -#line 2418 "Zend/zend_language_scanner.c" +#line 2404 "Zend/zend_language_scanner.c" yy125: YYDEBUG(125, *YYCURSOR); yych = *++YYCURSOR; @@ -2646,11 +2632,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy139: YYDEBUG(139, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1454 "Zend/zend_language_scanner.l" +#line 1450 "Zend/zend_language_scanner.l" { return yytext[0]; } -#line 2654 "Zend/zend_language_scanner.c" +#line 2640 "Zend/zend_language_scanner.c" yy140: YYDEBUG(140, *YYCURSOR); ++YYCURSOR; @@ -2659,15 +2645,13 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy141: YYDEBUG(141, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1185 "Zend/zend_language_scanner.l" +#line 1183 "Zend/zend_language_scanner.l" { - zendlval->value.str.val = yytext; /* no copying - intentional */ - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; + ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ HANDLE_NEWLINES(yytext, yyleng); return T_WHITESPACE; } -#line 2671 "Zend/zend_language_scanner.c" +#line 2655 "Zend/zend_language_scanner.c" yy142: YYDEBUG(142, *YYCURSOR); yych = *++YYCURSOR; @@ -2678,11 +2662,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(144, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1214 "Zend/zend_language_scanner.l" +#line 1210 "Zend/zend_language_scanner.l" { return T_NS_SEPARATOR; } -#line 2686 "Zend/zend_language_scanner.c" +#line 2670 "Zend/zend_language_scanner.c" yy145: YYDEBUG(145, *YYCURSOR); yych = *++YYCURSOR; @@ -2910,18 +2894,18 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(169, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1459 "Zend/zend_language_scanner.l" +#line 1455 "Zend/zend_language_scanner.l" { yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); return '{'; } -#line 2919 "Zend/zend_language_scanner.c" +#line 2903 "Zend/zend_language_scanner.c" yy170: YYDEBUG(170, *YYCURSOR); ++YYCURSOR; YYDEBUG(171, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1471 "Zend/zend_language_scanner.l" +#line 1467 "Zend/zend_language_scanner.l" { RESET_DOC_COMMENT(); if (!zend_stack_is_empty(&SCNG(state_stack))) { @@ -2929,7 +2913,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } return '}'; } -#line 2933 "Zend/zend_language_scanner.c" +#line 2917 "Zend/zend_language_scanner.c" yy172: YYDEBUG(172, *YYCURSOR); yyaccept = 2; @@ -2957,18 +2941,18 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy173: YYDEBUG(173, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1522 "Zend/zend_language_scanner.l" +#line 1517 "Zend/zend_language_scanner.l" { if (yyleng < MAX_LENGTH_OF_LONG - 1) { /* Won't overflow */ - zendlval->value.lval = strtol(yytext, NULL, 0); + Z_LVAL_P(zendlval) = strtol(yytext, NULL, 0); } else { errno = 0; - zendlval->value.lval = strtol(yytext, NULL, 0); + Z_LVAL_P(zendlval) = strtol(yytext, NULL, 0); if (errno == ERANGE) { /* Overflow */ if (yytext[0] == '0') { /* octal overflow */ - zendlval->value.dval = zend_oct_strtod(yytext, NULL); + Z_DVAL_P(zendlval) = zend_oct_strtod(yytext, NULL); } else { - zendlval->value.dval = zend_strtod(yytext, NULL); + Z_DVAL_P(zendlval) = zend_strtod(yytext, NULL); } zendlval->type = IS_DOUBLE; return T_DNUMBER; @@ -2978,7 +2962,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zendlval->type = IS_LONG; return T_LNUMBER; } -#line 2982 "Zend/zend_language_scanner.c" +#line 2966 "Zend/zend_language_scanner.c" yy174: YYDEBUG(174, *YYCURSOR); yyaccept = 2; @@ -3006,7 +2990,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy177: YYDEBUG(177, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1919 "Zend/zend_language_scanner.l" +#line 1857 "Zend/zend_language_scanner.l" { while (YYCURSOR < YYLIMIT) { switch (*YYCURSOR++) { @@ -3040,14 +3024,14 @@ int lex_scan(zval *zendlval TSRMLS_DC) return T_COMMENT; } -#line 3044 "Zend/zend_language_scanner.c" +#line 3028 "Zend/zend_language_scanner.c" yy178: YYDEBUG(178, *YYCURSOR); ++YYCURSOR; yy179: YYDEBUG(179, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2010 "Zend/zend_language_scanner.l" +#line 1944 "Zend/zend_language_scanner.l" { register char *s, *t; char *end; @@ -3073,13 +3057,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } } - zendlval->value.str.val = estrndup(yytext+bprefix+1, yyleng-bprefix-2); - zendlval->value.str.len = yyleng-bprefix-2; - zendlval->type = IS_STRING; + ZVAL_STRINGL(zendlval, yytext+bprefix+1, yyleng-bprefix-2, 1); /* convert escape sequences */ - s = t = zendlval->value.str.val; - end = s+zendlval->value.str.len; + s = t = Z_STRVAL_P(zendlval); + end = s+Z_STRLEN_P(zendlval); while (svalue.str.len--; + Z_STRLEN_P(zendlval)--; break; default: *t++ = '\\'; @@ -3108,21 +3090,21 @@ int lex_scan(zval *zendlval TSRMLS_DC) if (SCNG(output_filter)) { size_t sz = 0; - s = zendlval->value.str.val; - SCNG(output_filter)((unsigned char **)&(zendlval->value.str.val), &sz, (unsigned char *)s, (size_t)zendlval->value.str.len TSRMLS_CC); - zendlval->value.str.len = sz; + s = Z_STRVAL_P(zendlval); + SCNG(output_filter)((unsigned char **)&Z_STRVAL_P(zendlval), &sz, (unsigned char *)s, (size_t)Z_STRLEN_P(zendlval) TSRMLS_CC); + Z_STRLEN_P(zendlval) = sz; efree(s); } return T_CONSTANT_ENCAPSED_STRING; } -#line 3119 "Zend/zend_language_scanner.c" +#line 3101 "Zend/zend_language_scanner.c" yy180: YYDEBUG(180, *YYCURSOR); ++YYCURSOR; yy181: YYDEBUG(181, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2079 "Zend/zend_language_scanner.l" +#line 2011 "Zend/zend_language_scanner.l" { int bprefix = (yytext[0] != '"') ? 1 : 0; @@ -3163,24 +3145,24 @@ int lex_scan(zval *zendlval TSRMLS_DC) BEGIN(ST_DOUBLE_QUOTES); return '"'; } -#line 3167 "Zend/zend_language_scanner.c" +#line 3149 "Zend/zend_language_scanner.c" yy182: YYDEBUG(182, *YYCURSOR); ++YYCURSOR; YYDEBUG(183, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2169 "Zend/zend_language_scanner.l" +#line 2101 "Zend/zend_language_scanner.l" { BEGIN(ST_BACKQUOTE); return '`'; } -#line 3178 "Zend/zend_language_scanner.c" +#line 3160 "Zend/zend_language_scanner.c" yy184: YYDEBUG(184, *YYCURSOR); ++YYCURSOR; YYDEBUG(185, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2432 "Zend/zend_language_scanner.l" +#line 2364 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { return 0; @@ -3189,7 +3171,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE); goto restart; } -#line 3193 "Zend/zend_language_scanner.c" +#line 3175 "Zend/zend_language_scanner.c" yy186: YYDEBUG(186, *YYCURSOR); ++YYCURSOR; @@ -3216,13 +3198,12 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy190: YYDEBUG(190, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1587 "Zend/zend_language_scanner.l" +#line 1576 "Zend/zend_language_scanner.l" { - zendlval->value.dval = zend_strtod(yytext, NULL); - zendlval->type = IS_DOUBLE; + ZVAL_DOUBLE(zendlval, zend_strtod(yytext, NULL)); return T_DNUMBER; } -#line 3226 "Zend/zend_language_scanner.c" +#line 3207 "Zend/zend_language_scanner.c" yy191: YYDEBUG(191, *YYCURSOR); yyaccept = 2; @@ -3314,7 +3295,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(202, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1497 "Zend/zend_language_scanner.l" +#line 1493 "Zend/zend_language_scanner.l" { char *bin = yytext + 2; /* Skip "0b" */ int len = yyleng - 2; @@ -3327,19 +3308,18 @@ int lex_scan(zval *zendlval TSRMLS_DC) if (len < SIZEOF_LONG * 8) { if (len == 0) { - zendlval->value.lval = 0; + Z_LVAL_P(zendlval) = 0; } else { - zendlval->value.lval = strtol(bin, NULL, 2); + Z_LVAL_P(zendlval) = strtol(bin, NULL, 2); } zendlval->type = IS_LONG; return T_LNUMBER; } else { - zendlval->value.dval = zend_bin_strtod(bin, NULL); - zendlval->type = IS_DOUBLE; + ZVAL_DOUBLE(zendlval, zend_bin_strtod(bin, NULL)); return T_DNUMBER; } } -#line 3343 "Zend/zend_language_scanner.c" +#line 3323 "Zend/zend_language_scanner.c" yy203: YYDEBUG(203, *YYCURSOR); ++YYCURSOR; @@ -3351,7 +3331,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(205, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1543 "Zend/zend_language_scanner.l" +#line 1538 "Zend/zend_language_scanner.l" { char *hex = yytext + 2; /* Skip "0x" */ int len = yyleng - 2; @@ -3364,19 +3344,18 @@ int lex_scan(zval *zendlval TSRMLS_DC) if (len < SIZEOF_LONG * 2 || (len == SIZEOF_LONG * 2 && *hex <= '7')) { if (len == 0) { - zendlval->value.lval = 0; + Z_LVAL_P(zendlval) = 0; } else { - zendlval->value.lval = strtol(hex, NULL, 16); + Z_LVAL_P(zendlval) = strtol(hex, NULL, 16); } zendlval->type = IS_LONG; return T_LNUMBER; } else { - zendlval->value.dval = zend_hex_strtod(hex, NULL); - zendlval->type = IS_DOUBLE; + ZVAL_DOUBLE(zendlval, zend_hex_strtod(hex, NULL)); return T_DNUMBER; } } -#line 3380 "Zend/zend_language_scanner.c" +#line 3359 "Zend/zend_language_scanner.c" yy206: YYDEBUG(206, *YYCURSOR); ++YYCURSOR; @@ -3385,15 +3364,13 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy207: YYDEBUG(207, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1987 "Zend/zend_language_scanner.l" +#line 1925 "Zend/zend_language_scanner.l" { - zendlval->value.str.val = yytext; /* no copying - intentional */ - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; + ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ BEGIN(INITIAL); return T_CLOSE_TAG; /* implicit ';' at php-end tag */ } -#line 3397 "Zend/zend_language_scanner.c" +#line 3374 "Zend/zend_language_scanner.c" yy208: YYDEBUG(208, *YYCURSOR); yych = *++YYCURSOR; @@ -3427,13 +3404,13 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy212: YYDEBUG(212, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1889 "Zend/zend_language_scanner.l" +#line 1827 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; return T_VARIABLE; } -#line 3437 "Zend/zend_language_scanner.c" +#line 3414 "Zend/zend_language_scanner.c" yy213: YYDEBUG(213, *YYCURSOR); yych = *++YYCURSOR; @@ -3447,11 +3424,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(215, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1442 "Zend/zend_language_scanner.l" +#line 1438 "Zend/zend_language_scanner.l" { return T_LOGICAL_XOR; } -#line 3455 "Zend/zend_language_scanner.c" +#line 3432 "Zend/zend_language_scanner.c" yy216: YYDEBUG(216, *YYCURSOR); ++YYCURSOR; @@ -3460,61 +3437,61 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(217, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1434 "Zend/zend_language_scanner.l" +#line 1430 "Zend/zend_language_scanner.l" { return T_LOGICAL_OR; } -#line 3468 "Zend/zend_language_scanner.c" +#line 3445 "Zend/zend_language_scanner.c" yy218: YYDEBUG(218, *YYCURSOR); ++YYCURSOR; YYDEBUG(219, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1422 "Zend/zend_language_scanner.l" +#line 1418 "Zend/zend_language_scanner.l" { return T_XOR_EQUAL; } -#line 3478 "Zend/zend_language_scanner.c" +#line 3455 "Zend/zend_language_scanner.c" yy220: YYDEBUG(220, *YYCURSOR); ++YYCURSOR; YYDEBUG(221, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1426 "Zend/zend_language_scanner.l" +#line 1422 "Zend/zend_language_scanner.l" { return T_BOOLEAN_OR; } -#line 3488 "Zend/zend_language_scanner.c" +#line 3465 "Zend/zend_language_scanner.c" yy222: YYDEBUG(222, *YYCURSOR); ++YYCURSOR; YYDEBUG(223, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1418 "Zend/zend_language_scanner.l" +#line 1414 "Zend/zend_language_scanner.l" { return T_OR_EQUAL; } -#line 3498 "Zend/zend_language_scanner.c" +#line 3475 "Zend/zend_language_scanner.c" yy224: YYDEBUG(224, *YYCURSOR); ++YYCURSOR; YYDEBUG(225, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1430 "Zend/zend_language_scanner.l" +#line 1426 "Zend/zend_language_scanner.l" { return T_BOOLEAN_AND; } -#line 3508 "Zend/zend_language_scanner.c" +#line 3485 "Zend/zend_language_scanner.c" yy226: YYDEBUG(226, *YYCURSOR); ++YYCURSOR; YYDEBUG(227, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1414 "Zend/zend_language_scanner.l" +#line 1410 "Zend/zend_language_scanner.l" { return T_AND_EQUAL; } -#line 3518 "Zend/zend_language_scanner.c" +#line 3495 "Zend/zend_language_scanner.c" yy228: YYDEBUG(228, *YYCURSOR); ++YYCURSOR; @@ -3523,30 +3500,28 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy229: YYDEBUG(229, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1996 "Zend/zend_language_scanner.l" +#line 1932 "Zend/zend_language_scanner.l" { if (CG(asp_tags)) { BEGIN(INITIAL); - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - zendlval->value.str.val = yytext; /* no copying - intentional */ + ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ return T_CLOSE_TAG; /* implicit ';' at php-end tag */ } else { yyless(1); return yytext[0]; } } -#line 3540 "Zend/zend_language_scanner.c" +#line 3515 "Zend/zend_language_scanner.c" yy230: YYDEBUG(230, *YYCURSOR); ++YYCURSOR; YYDEBUG(231, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1402 "Zend/zend_language_scanner.l" +#line 1398 "Zend/zend_language_scanner.l" { return T_MOD_EQUAL; } -#line 3550 "Zend/zend_language_scanner.c" +#line 3525 "Zend/zend_language_scanner.c" yy232: YYDEBUG(232, *YYCURSOR); yych = *++YYCURSOR; @@ -3577,11 +3552,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(237, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1398 "Zend/zend_language_scanner.l" +#line 1394 "Zend/zend_language_scanner.l" { return T_CONCAT_EQUAL; } -#line 3585 "Zend/zend_language_scanner.c" +#line 3560 "Zend/zend_language_scanner.c" yy238: YYDEBUG(238, *YYCURSOR); yyaccept = 4; @@ -3590,7 +3565,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy239: YYDEBUG(239, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1953 "Zend/zend_language_scanner.l" +#line 1891 "Zend/zend_language_scanner.l" { int doc_com; @@ -3624,7 +3599,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) return T_COMMENT; } -#line 3628 "Zend/zend_language_scanner.c" +#line 3603 "Zend/zend_language_scanner.c" yy240: YYDEBUG(240, *YYCURSOR); yych = *++YYCURSOR; @@ -3634,11 +3609,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(242, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1394 "Zend/zend_language_scanner.l" +#line 1390 "Zend/zend_language_scanner.l" { return T_DIV_EQUAL; } -#line 3642 "Zend/zend_language_scanner.c" +#line 3617 "Zend/zend_language_scanner.c" yy243: YYDEBUG(243, *YYCURSOR); yych = *++YYCURSOR; @@ -3661,42 +3636,42 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(247, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1390 "Zend/zend_language_scanner.l" +#line 1386 "Zend/zend_language_scanner.l" { return T_MUL_EQUAL; } -#line 3669 "Zend/zend_language_scanner.c" +#line 3644 "Zend/zend_language_scanner.c" yy248: YYDEBUG(248, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) == '=') goto yy252; YYDEBUG(249, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1450 "Zend/zend_language_scanner.l" +#line 1446 "Zend/zend_language_scanner.l" { return T_SR; } -#line 3680 "Zend/zend_language_scanner.c" +#line 3655 "Zend/zend_language_scanner.c" yy250: YYDEBUG(250, *YYCURSOR); ++YYCURSOR; YYDEBUG(251, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1378 "Zend/zend_language_scanner.l" +#line 1374 "Zend/zend_language_scanner.l" { return T_IS_GREATER_OR_EQUAL; } -#line 3690 "Zend/zend_language_scanner.c" +#line 3665 "Zend/zend_language_scanner.c" yy252: YYDEBUG(252, *YYCURSOR); ++YYCURSOR; YYDEBUG(253, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1410 "Zend/zend_language_scanner.l" +#line 1406 "Zend/zend_language_scanner.l" { return T_SR_EQUAL; } -#line 3700 "Zend/zend_language_scanner.c" +#line 3675 "Zend/zend_language_scanner.c" yy254: YYDEBUG(254, *YYCURSOR); yyaccept = 5; @@ -3707,11 +3682,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy255: YYDEBUG(255, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1446 "Zend/zend_language_scanner.l" +#line 1442 "Zend/zend_language_scanner.l" { return T_SL; } -#line 3715 "Zend/zend_language_scanner.c" +#line 3690 "Zend/zend_language_scanner.c" yy256: YYDEBUG(256, *YYCURSOR); yych = *++YYCURSOR; @@ -3723,22 +3698,22 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(258, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1374 "Zend/zend_language_scanner.l" +#line 1370 "Zend/zend_language_scanner.l" { return T_IS_SMALLER_OR_EQUAL; } -#line 3731 "Zend/zend_language_scanner.c" +#line 3706 "Zend/zend_language_scanner.c" yy259: YYDEBUG(259, *YYCURSOR); ++YYCURSOR; yy260: YYDEBUG(260, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1370 "Zend/zend_language_scanner.l" +#line 1366 "Zend/zend_language_scanner.l" { return T_IS_NOT_EQUAL; } -#line 3742 "Zend/zend_language_scanner.c" +#line 3717 "Zend/zend_language_scanner.c" yy261: YYDEBUG(261, *YYCURSOR); yych = *++YYCURSOR; @@ -3789,11 +3764,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(269, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1406 "Zend/zend_language_scanner.l" +#line 1402 "Zend/zend_language_scanner.l" { return T_SL_EQUAL; } -#line 3797 "Zend/zend_language_scanner.c" +#line 3772 "Zend/zend_language_scanner.c" yy270: YYDEBUG(270, *YYCURSOR); ++YYCURSOR; @@ -3898,7 +3873,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy280: YYDEBUG(280, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2121 "Zend/zend_language_scanner.l" +#line 2053 "Zend/zend_language_scanner.l" { char *s; int bprefix = (yytext[0] != '<') ? 1 : 0; @@ -3945,7 +3920,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) return T_START_HEREDOC; } -#line 3949 "Zend/zend_language_scanner.c" +#line 3924 "Zend/zend_language_scanner.c" yy281: YYDEBUG(281, *YYCURSOR); yych = *++YYCURSOR; @@ -3985,31 +3960,31 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(286, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1362 "Zend/zend_language_scanner.l" +#line 1358 "Zend/zend_language_scanner.l" { return T_IS_NOT_IDENTICAL; } -#line 3993 "Zend/zend_language_scanner.c" +#line 3968 "Zend/zend_language_scanner.c" yy287: YYDEBUG(287, *YYCURSOR); ++YYCURSOR; YYDEBUG(288, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1382 "Zend/zend_language_scanner.l" +#line 1378 "Zend/zend_language_scanner.l" { return T_PLUS_EQUAL; } -#line 4003 "Zend/zend_language_scanner.c" +#line 3978 "Zend/zend_language_scanner.c" yy289: YYDEBUG(289, *YYCURSOR); ++YYCURSOR; YYDEBUG(290, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1350 "Zend/zend_language_scanner.l" +#line 1346 "Zend/zend_language_scanner.l" { return T_INC; } -#line 4013 "Zend/zend_language_scanner.c" +#line 3988 "Zend/zend_language_scanner.c" yy291: YYDEBUG(291, *YYCURSOR); yych = *++YYCURSOR; @@ -4028,42 +4003,42 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(294, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1338 "Zend/zend_language_scanner.l" +#line 1334 "Zend/zend_language_scanner.l" { return T_LIST; } -#line 4036 "Zend/zend_language_scanner.c" +#line 4011 "Zend/zend_language_scanner.c" yy295: YYDEBUG(295, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) == '=') goto yy299; YYDEBUG(296, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1366 "Zend/zend_language_scanner.l" +#line 1362 "Zend/zend_language_scanner.l" { return T_IS_EQUAL; } -#line 4047 "Zend/zend_language_scanner.c" +#line 4022 "Zend/zend_language_scanner.c" yy297: YYDEBUG(297, *YYCURSOR); ++YYCURSOR; YYDEBUG(298, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1334 "Zend/zend_language_scanner.l" +#line 1330 "Zend/zend_language_scanner.l" { return T_DOUBLE_ARROW; } -#line 4057 "Zend/zend_language_scanner.c" +#line 4032 "Zend/zend_language_scanner.c" yy299: YYDEBUG(299, *YYCURSOR); ++YYCURSOR; YYDEBUG(300, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1358 "Zend/zend_language_scanner.l" +#line 1354 "Zend/zend_language_scanner.l" { return T_IS_IDENTICAL; } -#line 4067 "Zend/zend_language_scanner.c" +#line 4042 "Zend/zend_language_scanner.c" yy301: YYDEBUG(301, *YYCURSOR); yych = *++YYCURSOR; @@ -4193,7 +4168,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(320, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1722 "Zend/zend_language_scanner.l" +#line 1672 "Zend/zend_language_scanner.l" { if (CG(current_namespace)) { *zendlval = *CG(current_namespace); @@ -4203,7 +4178,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } return T_NS_C; } -#line 4207 "Zend/zend_language_scanner.c" +#line 4182 "Zend/zend_language_scanner.c" yy321: YYDEBUG(321, *YYCURSOR); yych = *++YYCURSOR; @@ -4223,7 +4198,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(325, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1695 "Zend/zend_language_scanner.l" +#line 1647 "Zend/zend_language_scanner.l" { char *filename = zend_get_compiled_filename(TSRMLS_C); const size_t filename_len = strlen(filename); @@ -4245,12 +4220,10 @@ int lex_scan(zval *zendlval TSRMLS_DC) #endif } - zendlval->value.str.len = strlen(dirname); - zendlval->value.str.val = dirname; - zendlval->type = IS_STRING; + ZVAL_STRING(zendlval, dirname, 0); return T_DIR; } -#line 4254 "Zend/zend_language_scanner.c" +#line 4227 "Zend/zend_language_scanner.c" yy326: YYDEBUG(326, *YYCURSOR); yych = *++YYCURSOR; @@ -4275,13 +4248,12 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(331, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1677 "Zend/zend_language_scanner.l" +#line 1632 "Zend/zend_language_scanner.l" { - zendlval->value.lval = CG(zend_lineno); - zendlval->type = IS_LONG; + ZVAL_LONG(zendlval, CG(zend_lineno)); return T_LINE; } -#line 4285 "Zend/zend_language_scanner.c" +#line 4257 "Zend/zend_language_scanner.c" yy332: YYDEBUG(332, *YYCURSOR); yych = *++YYCURSOR; @@ -4316,20 +4288,12 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(339, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1656 "Zend/zend_language_scanner.l" +#line 1619 "Zend/zend_language_scanner.l" { const char *class_name = CG(active_class_entry) ? CG(active_class_entry)->name : NULL; const char *func_name = CG(active_op_array)? CG(active_op_array)->function_name : NULL; - size_t len = 0; - - if (class_name) { - len += strlen(class_name) + 2; - } - if (func_name) { - len += strlen(func_name); - } - zendlval->value.str.len = zend_spprintf(&zendlval->value.str.val, 0, "%s%s%s", + Z_STRLEN_P(zendlval) = zend_spprintf(&Z_STRVAL_P(zendlval), 0, "%s%s%s", class_name ? class_name : "", class_name && func_name ? "::" : "", func_name ? func_name : "" @@ -4337,7 +4301,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zendlval->type = IS_STRING; return T_METHOD_C; } -#line 4341 "Zend/zend_language_scanner.c" +#line 4305 "Zend/zend_language_scanner.c" yy340: YYDEBUG(340, *YYCURSOR); yych = *++YYCURSOR; @@ -4388,23 +4352,17 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(350, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1640 "Zend/zend_language_scanner.l" +#line 1609 "Zend/zend_language_scanner.l" { - const char *func_name = NULL; - - if (CG(active_op_array)) { - func_name = CG(active_op_array)->function_name; - } - - if (!func_name) { - func_name = ""; + zend_op_array *op_array = CG(active_op_array); + if (op_array && op_array->function_name) { + ZVAL_STRING(zendlval, op_array->function_name, 1); + } else { + ZVAL_EMPTY_STRING(zendlval); } - zendlval->value.str.len = strlen(func_name); - zendlval->value.str.val = estrndup(func_name, zendlval->value.str.len); - zendlval->type = IS_STRING; return T_FUNC_C; } -#line 4408 "Zend/zend_language_scanner.c" +#line 4366 "Zend/zend_language_scanner.c" yy351: YYDEBUG(351, *YYCURSOR); yych = *++YYCURSOR; @@ -4424,19 +4382,17 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(355, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1683 "Zend/zend_language_scanner.l" +#line 1637 "Zend/zend_language_scanner.l" { char *filename = zend_get_compiled_filename(TSRMLS_C); if (!filename) { filename = ""; } - zendlval->value.str.len = strlen(filename); - zendlval->value.str.val = estrndup(filename, zendlval->value.str.len); - zendlval->type = IS_STRING; + ZVAL_STRING(zendlval, filename, 1); return T_FILE; } -#line 4440 "Zend/zend_language_scanner.c" +#line 4396 "Zend/zend_language_scanner.c" yy356: YYDEBUG(356, *YYCURSOR); yych = *++YYCURSOR; @@ -4466,27 +4422,17 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(362, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1620 "Zend/zend_language_scanner.l" +#line 1599 "Zend/zend_language_scanner.l" { - const char *trait_name = NULL; - - if (CG(active_class_entry) - && (ZEND_ACC_TRAIT == - (CG(active_class_entry)->ce_flags & ZEND_ACC_TRAIT))) { - trait_name = CG(active_class_entry)->name; - } - - if (!trait_name) { - trait_name = ""; + zend_class_entry *ce = CG(active_class_entry); + if (ce && ce->name && ZEND_ACC_TRAIT == (ce->ce_flags & ZEND_ACC_TRAIT)) { + ZVAL_STRINGL(zendlval, ce->name, ce->name_length, 1); + } else { + ZVAL_EMPTY_STRING(zendlval); } - - zendlval->value.str.len = strlen(trait_name); - zendlval->value.str.val = estrndup(trait_name, zendlval->value.str.len); - zendlval->type = IS_STRING; - return T_TRAIT_C; } -#line 4490 "Zend/zend_language_scanner.c" +#line 4436 "Zend/zend_language_scanner.c" yy363: YYDEBUG(363, *YYCURSOR); yych = *++YYCURSOR; @@ -4516,34 +4462,25 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(369, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1593 "Zend/zend_language_scanner.l" +#line 1581 "Zend/zend_language_scanner.l" { - const char *class_name = NULL; - - if (CG(active_class_entry) - && (ZEND_ACC_TRAIT == - (CG(active_class_entry)->ce_flags & ZEND_ACC_TRAIT))) { + zend_class_entry *ce = CG(active_class_entry); + if (ce && ZEND_ACC_TRAIT == (ce->ce_flags & ZEND_ACC_TRAIT)) { /* We create a special __CLASS__ constant that is going to be resolved at run-time */ - zendlval->value.str.len = sizeof("__CLASS__")-1; - zendlval->value.str.val = estrndup("__CLASS__", zendlval->value.str.len); + Z_STRLEN_P(zendlval) = sizeof("__CLASS__")-1; + Z_STRVAL_P(zendlval) = estrndup("__CLASS__", Z_STRLEN_P(zendlval)); zendlval->type = IS_CONSTANT; } else { - if (CG(active_class_entry)) { - class_name = CG(active_class_entry)->name; - } - - if (!class_name) { - class_name = ""; + if (ce && ce->name) { + ZVAL_STRINGL(zendlval, ce->name, ce->name_length, 1); + } else { + ZVAL_EMPTY_STRING(zendlval); } - - zendlval->value.str.len = strlen(class_name); - zendlval->value.str.val = estrndup(class_name, zendlval->value.str.len); - zendlval->type = IS_STRING; } return T_CLASS_C; } -#line 4547 "Zend/zend_language_scanner.c" +#line 4484 "Zend/zend_language_scanner.c" yy370: YYDEBUG(370, *YYCURSOR); yych = *++YYCURSOR; @@ -4605,11 +4542,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(382, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1302 "Zend/zend_language_scanner.l" +#line 1298 "Zend/zend_language_scanner.l" { return T_HALT_COMPILER; } -#line 4613 "Zend/zend_language_scanner.c" +#line 4550 "Zend/zend_language_scanner.c" yy383: YYDEBUG(383, *YYCURSOR); yych = *++YYCURSOR; @@ -4629,11 +4566,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(386, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1282 "Zend/zend_language_scanner.l" +#line 1278 "Zend/zend_language_scanner.l" { return T_USE; } -#line 4637 "Zend/zend_language_scanner.c" +#line 4574 "Zend/zend_language_scanner.c" yy387: YYDEBUG(387, *YYCURSOR); yych = *++YYCURSOR; @@ -4652,11 +4589,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(390, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1330 "Zend/zend_language_scanner.l" +#line 1326 "Zend/zend_language_scanner.l" { return T_UNSET; } -#line 4660 "Zend/zend_language_scanner.c" +#line 4597 "Zend/zend_language_scanner.c" yy391: YYDEBUG(391, *YYCURSOR); ++YYCURSOR; @@ -4828,11 +4765,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(408, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1230 "Zend/zend_language_scanner.l" +#line 1226 "Zend/zend_language_scanner.l" { return T_INT_CAST; } -#line 4836 "Zend/zend_language_scanner.c" +#line 4773 "Zend/zend_language_scanner.c" yy409: YYDEBUG(409, *YYCURSOR); yych = *++YYCURSOR; @@ -4876,11 +4813,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(417, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1234 "Zend/zend_language_scanner.l" +#line 1230 "Zend/zend_language_scanner.l" { return T_DOUBLE_CAST; } -#line 4884 "Zend/zend_language_scanner.c" +#line 4821 "Zend/zend_language_scanner.c" yy418: YYDEBUG(418, *YYCURSOR); yych = *++YYCURSOR; @@ -4950,11 +4887,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(431, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1238 "Zend/zend_language_scanner.l" +#line 1234 "Zend/zend_language_scanner.l" { return T_STRING_CAST; } -#line 4958 "Zend/zend_language_scanner.c" +#line 4895 "Zend/zend_language_scanner.c" yy432: YYDEBUG(432, *YYCURSOR); yych = *++YYCURSOR; @@ -4987,11 +4924,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(438, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1242 "Zend/zend_language_scanner.l" +#line 1238 "Zend/zend_language_scanner.l" { return T_ARRAY_CAST; } -#line 4995 "Zend/zend_language_scanner.c" +#line 4932 "Zend/zend_language_scanner.c" yy439: YYDEBUG(439, *YYCURSOR); yych = *++YYCURSOR; @@ -5029,11 +4966,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(446, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1246 "Zend/zend_language_scanner.l" +#line 1242 "Zend/zend_language_scanner.l" { return T_OBJECT_CAST; } -#line 5037 "Zend/zend_language_scanner.c" +#line 4974 "Zend/zend_language_scanner.c" yy447: YYDEBUG(447, *YYCURSOR); yych = *++YYCURSOR; @@ -5074,11 +5011,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(454, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1250 "Zend/zend_language_scanner.l" +#line 1246 "Zend/zend_language_scanner.l" { return T_BOOL_CAST; } -#line 5082 "Zend/zend_language_scanner.c" +#line 5019 "Zend/zend_language_scanner.c" yy455: YYDEBUG(455, *YYCURSOR); yych = *++YYCURSOR; @@ -5138,11 +5075,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(466, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1254 "Zend/zend_language_scanner.l" +#line 1250 "Zend/zend_language_scanner.l" { return T_UNSET_CAST; } -#line 5146 "Zend/zend_language_scanner.c" +#line 5083 "Zend/zend_language_scanner.c" yy467: YYDEBUG(467, *YYCURSOR); yych = *++YYCURSOR; @@ -5156,11 +5093,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(469, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1226 "Zend/zend_language_scanner.l" +#line 1222 "Zend/zend_language_scanner.l" { return T_VAR; } -#line 5164 "Zend/zend_language_scanner.c" +#line 5101 "Zend/zend_language_scanner.c" yy470: YYDEBUG(470, *YYCURSOR); yych = *++YYCURSOR; @@ -5180,11 +5117,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(473, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1218 "Zend/zend_language_scanner.l" +#line 1214 "Zend/zend_language_scanner.l" { return T_NEW; } -#line 5188 "Zend/zend_language_scanner.c" +#line 5125 "Zend/zend_language_scanner.c" yy474: YYDEBUG(474, *YYCURSOR); yych = *++YYCURSOR; @@ -5223,21 +5160,21 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(481, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1278 "Zend/zend_language_scanner.l" +#line 1274 "Zend/zend_language_scanner.l" { return T_NAMESPACE; } -#line 5231 "Zend/zend_language_scanner.c" +#line 5168 "Zend/zend_language_scanner.c" yy482: YYDEBUG(482, *YYCURSOR); ++YYCURSOR; YYDEBUG(483, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1210 "Zend/zend_language_scanner.l" +#line 1206 "Zend/zend_language_scanner.l" { return T_PAAMAYIM_NEKUDOTAYIM; } -#line 5241 "Zend/zend_language_scanner.c" +#line 5178 "Zend/zend_language_scanner.c" yy484: YYDEBUG(484, *YYCURSOR); ++YYCURSOR; @@ -5259,32 +5196,32 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(487, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1386 "Zend/zend_language_scanner.l" +#line 1382 "Zend/zend_language_scanner.l" { return T_MINUS_EQUAL; } -#line 5267 "Zend/zend_language_scanner.c" +#line 5204 "Zend/zend_language_scanner.c" yy488: YYDEBUG(488, *YYCURSOR); ++YYCURSOR; YYDEBUG(489, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1354 "Zend/zend_language_scanner.l" +#line 1350 "Zend/zend_language_scanner.l" { return T_DEC; } -#line 5277 "Zend/zend_language_scanner.c" +#line 5214 "Zend/zend_language_scanner.c" yy490: YYDEBUG(490, *YYCURSOR); ++YYCURSOR; YYDEBUG(491, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1180 "Zend/zend_language_scanner.l" +#line 1178 "Zend/zend_language_scanner.l" { yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); return T_OBJECT_OPERATOR; } -#line 5288 "Zend/zend_language_scanner.c" +#line 5225 "Zend/zend_language_scanner.c" yy492: YYDEBUG(492, *YYCURSOR); yych = *++YYCURSOR; @@ -5329,11 +5266,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(498, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1326 "Zend/zend_language_scanner.l" +#line 1322 "Zend/zend_language_scanner.l" { return T_PUBLIC; } -#line 5337 "Zend/zend_language_scanner.c" +#line 5274 "Zend/zend_language_scanner.c" yy499: YYDEBUG(499, *YYCURSOR); yych = *++YYCURSOR; @@ -5388,11 +5325,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(507, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1322 "Zend/zend_language_scanner.l" +#line 1318 "Zend/zend_language_scanner.l" { return T_PROTECTED; } -#line 5396 "Zend/zend_language_scanner.c" +#line 5333 "Zend/zend_language_scanner.c" yy508: YYDEBUG(508, *YYCURSOR); yych = *++YYCURSOR; @@ -5422,11 +5359,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(513, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1318 "Zend/zend_language_scanner.l" +#line 1314 "Zend/zend_language_scanner.l" { return T_PRIVATE; } -#line 5430 "Zend/zend_language_scanner.c" +#line 5367 "Zend/zend_language_scanner.c" yy514: YYDEBUG(514, *YYCURSOR); ++YYCURSOR; @@ -5435,11 +5372,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(515, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1156 "Zend/zend_language_scanner.l" +#line 1154 "Zend/zend_language_scanner.l" { return T_PRINT; } -#line 5443 "Zend/zend_language_scanner.c" +#line 5380 "Zend/zend_language_scanner.c" yy516: YYDEBUG(516, *YYCURSOR); yych = *++YYCURSOR; @@ -5464,11 +5401,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(520, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1148 "Zend/zend_language_scanner.l" +#line 1146 "Zend/zend_language_scanner.l" { return T_GOTO; } -#line 5472 "Zend/zend_language_scanner.c" +#line 5409 "Zend/zend_language_scanner.c" yy521: YYDEBUG(521, *YYCURSOR); yych = *++YYCURSOR; @@ -5492,11 +5429,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(525, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1290 "Zend/zend_language_scanner.l" +#line 1286 "Zend/zend_language_scanner.l" { return T_GLOBAL; } -#line 5500 "Zend/zend_language_scanner.c" +#line 5437 "Zend/zend_language_scanner.c" yy526: YYDEBUG(526, *YYCURSOR); yych = *++YYCURSOR; @@ -5533,11 +5470,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(533, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1140 "Zend/zend_language_scanner.l" +#line 1138 "Zend/zend_language_scanner.l" { return T_BREAK; } -#line 5541 "Zend/zend_language_scanner.c" +#line 5478 "Zend/zend_language_scanner.c" yy534: YYDEBUG(534, *YYCURSOR); yych = *++YYCURSOR; @@ -5577,11 +5514,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(541, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1124 "Zend/zend_language_scanner.l" +#line 1122 "Zend/zend_language_scanner.l" { return T_SWITCH; } -#line 5585 "Zend/zend_language_scanner.c" +#line 5522 "Zend/zend_language_scanner.c" yy542: YYDEBUG(542, *YYCURSOR); yych = *++YYCURSOR; @@ -5605,11 +5542,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(546, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1306 "Zend/zend_language_scanner.l" +#line 1302 "Zend/zend_language_scanner.l" { return T_STATIC; } -#line 5613 "Zend/zend_language_scanner.c" +#line 5550 "Zend/zend_language_scanner.c" yy547: YYDEBUG(547, *YYCURSOR); yych = *++YYCURSOR; @@ -5636,11 +5573,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(551, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1120 "Zend/zend_language_scanner.l" +#line 1118 "Zend/zend_language_scanner.l" { return T_AS; } -#line 5644 "Zend/zend_language_scanner.c" +#line 5581 "Zend/zend_language_scanner.c" yy552: YYDEBUG(552, *YYCURSOR); yych = *++YYCURSOR; @@ -5659,11 +5596,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(555, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1342 "Zend/zend_language_scanner.l" +#line 1338 "Zend/zend_language_scanner.l" { return T_ARRAY; } -#line 5667 "Zend/zend_language_scanner.c" +#line 5604 "Zend/zend_language_scanner.c" yy556: YYDEBUG(556, *YYCURSOR); ++YYCURSOR; @@ -5672,11 +5609,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(557, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1438 "Zend/zend_language_scanner.l" +#line 1434 "Zend/zend_language_scanner.l" { return T_LOGICAL_AND; } -#line 5680 "Zend/zend_language_scanner.c" +#line 5617 "Zend/zend_language_scanner.c" yy558: YYDEBUG(558, *YYCURSOR); yych = *++YYCURSOR; @@ -5710,11 +5647,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(564, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1310 "Zend/zend_language_scanner.l" +#line 1306 "Zend/zend_language_scanner.l" { return T_ABSTRACT; } -#line 5718 "Zend/zend_language_scanner.c" +#line 5655 "Zend/zend_language_scanner.c" yy565: YYDEBUG(565, *YYCURSOR); yych = *++YYCURSOR; @@ -5738,11 +5675,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(569, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1080 "Zend/zend_language_scanner.l" +#line 1078 "Zend/zend_language_scanner.l" { return T_WHILE; } -#line 5746 "Zend/zend_language_scanner.c" +#line 5683 "Zend/zend_language_scanner.c" yy570: YYDEBUG(570, *YYCURSOR); ++YYCURSOR; @@ -5751,11 +5688,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(571, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1064 "Zend/zend_language_scanner.l" +#line 1062 "Zend/zend_language_scanner.l" { return T_IF; } -#line 5759 "Zend/zend_language_scanner.c" +#line 5696 "Zend/zend_language_scanner.c" yy572: YYDEBUG(572, *YYCURSOR); yych = *++YYCURSOR; @@ -5807,11 +5744,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(578, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1294 "Zend/zend_language_scanner.l" +#line 1290 "Zend/zend_language_scanner.l" { return T_ISSET; } -#line 5815 "Zend/zend_language_scanner.c" +#line 5752 "Zend/zend_language_scanner.c" yy579: YYDEBUG(579, *YYCURSOR); yych = *++YYCURSOR; @@ -5865,11 +5802,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy586: YYDEBUG(586, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1262 "Zend/zend_language_scanner.l" +#line 1258 "Zend/zend_language_scanner.l" { return T_INCLUDE; } -#line 5873 "Zend/zend_language_scanner.c" +#line 5810 "Zend/zend_language_scanner.c" yy587: YYDEBUG(587, *YYCURSOR); yych = *++YYCURSOR; @@ -5898,11 +5835,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(592, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1266 "Zend/zend_language_scanner.l" +#line 1262 "Zend/zend_language_scanner.l" { return T_INCLUDE_ONCE; } -#line 5906 "Zend/zend_language_scanner.c" +#line 5843 "Zend/zend_language_scanner.c" yy593: YYDEBUG(593, *YYCURSOR); yych = *++YYCURSOR; @@ -5936,11 +5873,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(599, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1164 "Zend/zend_language_scanner.l" +#line 1162 "Zend/zend_language_scanner.l" { return T_INTERFACE; } -#line 5944 "Zend/zend_language_scanner.c" +#line 5881 "Zend/zend_language_scanner.c" yy600: YYDEBUG(600, *YYCURSOR); yych = *++YYCURSOR; @@ -5990,11 +5927,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(607, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1286 "Zend/zend_language_scanner.l" +#line 1282 "Zend/zend_language_scanner.l" { return T_INSTEADOF; } -#line 5998 "Zend/zend_language_scanner.c" +#line 5935 "Zend/zend_language_scanner.c" yy608: YYDEBUG(608, *YYCURSOR); yych = *++YYCURSOR; @@ -6023,11 +5960,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(613, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1116 "Zend/zend_language_scanner.l" +#line 1114 "Zend/zend_language_scanner.l" { return T_INSTANCEOF; } -#line 6031 "Zend/zend_language_scanner.c" +#line 5968 "Zend/zend_language_scanner.c" yy614: YYDEBUG(614, *YYCURSOR); yych = *++YYCURSOR; @@ -6071,11 +6008,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(622, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1176 "Zend/zend_language_scanner.l" +#line 1174 "Zend/zend_language_scanner.l" { return T_IMPLEMENTS; } -#line 6079 "Zend/zend_language_scanner.c" +#line 6016 "Zend/zend_language_scanner.c" yy623: YYDEBUG(623, *YYCURSOR); yych = *++YYCURSOR; @@ -6103,11 +6040,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(626, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1048 "Zend/zend_language_scanner.l" +#line 1046 "Zend/zend_language_scanner.l" { return T_TRY; } -#line 6111 "Zend/zend_language_scanner.c" +#line 6048 "Zend/zend_language_scanner.c" yy627: YYDEBUG(627, *YYCURSOR); yych = *++YYCURSOR; @@ -6126,11 +6063,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(630, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1168 "Zend/zend_language_scanner.l" +#line 1166 "Zend/zend_language_scanner.l" { return T_TRAIT; } -#line 6134 "Zend/zend_language_scanner.c" +#line 6071 "Zend/zend_language_scanner.c" yy631: YYDEBUG(631, *YYCURSOR); yych = *++YYCURSOR; @@ -6149,11 +6086,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(634, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1060 "Zend/zend_language_scanner.l" +#line 1058 "Zend/zend_language_scanner.l" { return T_THROW; } -#line 6157 "Zend/zend_language_scanner.c" +#line 6094 "Zend/zend_language_scanner.c" yy635: YYDEBUG(635, *YYCURSOR); yych = *++YYCURSOR; @@ -6177,11 +6114,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(639, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1044 "Zend/zend_language_scanner.l" +#line 1042 "Zend/zend_language_scanner.l" { return T_YIELD; } -#line 6185 "Zend/zend_language_scanner.c" +#line 6122 "Zend/zend_language_scanner.c" yy640: YYDEBUG(640, *YYCURSOR); yych = *++YYCURSOR; @@ -6242,11 +6179,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy647: YYDEBUG(647, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1270 "Zend/zend_language_scanner.l" +#line 1266 "Zend/zend_language_scanner.l" { return T_REQUIRE; } -#line 6250 "Zend/zend_language_scanner.c" +#line 6187 "Zend/zend_language_scanner.c" yy648: YYDEBUG(648, *YYCURSOR); yych = *++YYCURSOR; @@ -6275,11 +6212,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(653, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1274 "Zend/zend_language_scanner.l" +#line 1270 "Zend/zend_language_scanner.l" { return T_REQUIRE_ONCE; } -#line 6283 "Zend/zend_language_scanner.c" +#line 6220 "Zend/zend_language_scanner.c" yy654: YYDEBUG(654, *YYCURSOR); yych = *++YYCURSOR; @@ -6298,11 +6235,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(657, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1040 "Zend/zend_language_scanner.l" +#line 1038 "Zend/zend_language_scanner.l" { return T_RETURN; } -#line 6306 "Zend/zend_language_scanner.c" +#line 6243 "Zend/zend_language_scanner.c" yy658: YYDEBUG(658, *YYCURSOR); yych = *++YYCURSOR; @@ -6392,11 +6329,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(668, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1144 "Zend/zend_language_scanner.l" +#line 1142 "Zend/zend_language_scanner.l" { return T_CONTINUE; } -#line 6400 "Zend/zend_language_scanner.c" +#line 6337 "Zend/zend_language_scanner.c" yy669: YYDEBUG(669, *YYCURSOR); ++YYCURSOR; @@ -6405,11 +6342,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(670, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1036 "Zend/zend_language_scanner.l" +#line 1034 "Zend/zend_language_scanner.l" { return T_CONST; } -#line 6413 "Zend/zend_language_scanner.c" +#line 6350 "Zend/zend_language_scanner.c" yy671: YYDEBUG(671, *YYCURSOR); yych = *++YYCURSOR; @@ -6434,11 +6371,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(675, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1222 "Zend/zend_language_scanner.l" +#line 1218 "Zend/zend_language_scanner.l" { return T_CLONE; } -#line 6442 "Zend/zend_language_scanner.c" +#line 6379 "Zend/zend_language_scanner.c" yy676: YYDEBUG(676, *YYCURSOR); yych = *++YYCURSOR; @@ -6452,11 +6389,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(678, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1160 "Zend/zend_language_scanner.l" +#line 1158 "Zend/zend_language_scanner.l" { return T_CLASS; } -#line 6460 "Zend/zend_language_scanner.c" +#line 6397 "Zend/zend_language_scanner.c" yy679: YYDEBUG(679, *YYCURSOR); yych = *++YYCURSOR; @@ -6502,11 +6439,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(687, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1346 "Zend/zend_language_scanner.l" +#line 1342 "Zend/zend_language_scanner.l" { return T_CALLABLE; } -#line 6510 "Zend/zend_language_scanner.c" +#line 6447 "Zend/zend_language_scanner.c" yy688: YYDEBUG(688, *YYCURSOR); ++YYCURSOR; @@ -6515,11 +6452,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(689, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1132 "Zend/zend_language_scanner.l" +#line 1130 "Zend/zend_language_scanner.l" { return T_CASE; } -#line 6523 "Zend/zend_language_scanner.c" +#line 6460 "Zend/zend_language_scanner.c" yy690: YYDEBUG(690, *YYCURSOR); yych = *++YYCURSOR; @@ -6533,11 +6470,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(692, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1052 "Zend/zend_language_scanner.l" +#line 1050 "Zend/zend_language_scanner.l" { return T_CATCH; } -#line 6541 "Zend/zend_language_scanner.c" +#line 6478 "Zend/zend_language_scanner.c" yy693: YYDEBUG(693, *YYCURSOR); yych = *++YYCURSOR; @@ -6588,11 +6525,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(702, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1032 "Zend/zend_language_scanner.l" +#line 1030 "Zend/zend_language_scanner.l" { return T_FUNCTION; } -#line 6596 "Zend/zend_language_scanner.c" +#line 6533 "Zend/zend_language_scanner.c" yy703: YYDEBUG(703, *YYCURSOR); ++YYCURSOR; @@ -6616,11 +6553,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy704: YYDEBUG(704, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1092 "Zend/zend_language_scanner.l" +#line 1090 "Zend/zend_language_scanner.l" { return T_FOR; } -#line 6624 "Zend/zend_language_scanner.c" +#line 6561 "Zend/zend_language_scanner.c" yy705: YYDEBUG(705, *YYCURSOR); yych = *++YYCURSOR; @@ -6644,11 +6581,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(709, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1100 "Zend/zend_language_scanner.l" +#line 1098 "Zend/zend_language_scanner.l" { return T_FOREACH; } -#line 6652 "Zend/zend_language_scanner.c" +#line 6589 "Zend/zend_language_scanner.c" yy710: YYDEBUG(710, *YYCURSOR); yych = *++YYCURSOR; @@ -6682,11 +6619,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy713: YYDEBUG(713, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1314 "Zend/zend_language_scanner.l" +#line 1310 "Zend/zend_language_scanner.l" { return T_FINAL; } -#line 6690 "Zend/zend_language_scanner.c" +#line 6627 "Zend/zend_language_scanner.c" yy714: YYDEBUG(714, *YYCURSOR); yych = *++YYCURSOR; @@ -6700,11 +6637,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(716, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1056 "Zend/zend_language_scanner.l" +#line 1054 "Zend/zend_language_scanner.l" { return T_FINALLY; } -#line 6708 "Zend/zend_language_scanner.c" +#line 6645 "Zend/zend_language_scanner.c" yy717: YYDEBUG(717, *YYCURSOR); yych = *++YYCURSOR; @@ -6735,11 +6672,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(720, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1088 "Zend/zend_language_scanner.l" +#line 1086 "Zend/zend_language_scanner.l" { return T_DO; } -#line 6743 "Zend/zend_language_scanner.c" +#line 6680 "Zend/zend_language_scanner.c" yy721: YYDEBUG(721, *YYCURSOR); ++YYCURSOR; @@ -6748,11 +6685,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(722, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1028 "Zend/zend_language_scanner.l" +#line 1026 "Zend/zend_language_scanner.l" { return T_EXIT; } -#line 6756 "Zend/zend_language_scanner.c" +#line 6693 "Zend/zend_language_scanner.c" yy723: YYDEBUG(723, *YYCURSOR); yych = *++YYCURSOR; @@ -6787,11 +6724,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(729, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1136 "Zend/zend_language_scanner.l" +#line 1134 "Zend/zend_language_scanner.l" { return T_DEFAULT; } -#line 6795 "Zend/zend_language_scanner.c" +#line 6732 "Zend/zend_language_scanner.c" yy730: YYDEBUG(730, *YYCURSOR); yych = *++YYCURSOR; @@ -6815,11 +6752,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(734, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1108 "Zend/zend_language_scanner.l" +#line 1106 "Zend/zend_language_scanner.l" { return T_DECLARE; } -#line 6823 "Zend/zend_language_scanner.c" +#line 6760 "Zend/zend_language_scanner.c" yy735: YYDEBUG(735, *YYCURSOR); yych = *++YYCURSOR; @@ -6899,11 +6836,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(747, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1172 "Zend/zend_language_scanner.l" +#line 1170 "Zend/zend_language_scanner.l" { return T_EXTENDS; } -#line 6907 "Zend/zend_language_scanner.c" +#line 6844 "Zend/zend_language_scanner.c" yy748: YYDEBUG(748, *YYCURSOR); ++YYCURSOR; @@ -6912,11 +6849,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(749, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1024 "Zend/zend_language_scanner.l" +#line 1022 "Zend/zend_language_scanner.l" { return T_EXIT; } -#line 6920 "Zend/zend_language_scanner.c" +#line 6857 "Zend/zend_language_scanner.c" yy750: YYDEBUG(750, *YYCURSOR); yych = *++YYCURSOR; @@ -6930,11 +6867,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(752, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1258 "Zend/zend_language_scanner.l" +#line 1254 "Zend/zend_language_scanner.l" { return T_EVAL; } -#line 6938 "Zend/zend_language_scanner.c" +#line 6875 "Zend/zend_language_scanner.c" yy753: YYDEBUG(753, *YYCURSOR); yych = *++YYCURSOR; @@ -7004,11 +6941,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(763, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1084 "Zend/zend_language_scanner.l" +#line 1082 "Zend/zend_language_scanner.l" { return T_ENDWHILE; } -#line 7012 "Zend/zend_language_scanner.c" +#line 6949 "Zend/zend_language_scanner.c" yy764: YYDEBUG(764, *YYCURSOR); yych = *++YYCURSOR; @@ -7037,11 +6974,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(769, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1128 "Zend/zend_language_scanner.l" +#line 1126 "Zend/zend_language_scanner.l" { return T_ENDSWITCH; } -#line 7045 "Zend/zend_language_scanner.c" +#line 6982 "Zend/zend_language_scanner.c" yy770: YYDEBUG(770, *YYCURSOR); ++YYCURSOR; @@ -7050,11 +6987,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(771, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1072 "Zend/zend_language_scanner.l" +#line 1070 "Zend/zend_language_scanner.l" { return T_ENDIF; } -#line 7058 "Zend/zend_language_scanner.c" +#line 6995 "Zend/zend_language_scanner.c" yy772: YYDEBUG(772, *YYCURSOR); yych = *++YYCURSOR; @@ -7083,11 +7020,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy774: YYDEBUG(774, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1096 "Zend/zend_language_scanner.l" +#line 1094 "Zend/zend_language_scanner.l" { return T_ENDFOR; } -#line 7091 "Zend/zend_language_scanner.c" +#line 7028 "Zend/zend_language_scanner.c" yy775: YYDEBUG(775, *YYCURSOR); yych = *++YYCURSOR; @@ -7111,11 +7048,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(779, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1104 "Zend/zend_language_scanner.l" +#line 1102 "Zend/zend_language_scanner.l" { return T_ENDFOREACH; } -#line 7119 "Zend/zend_language_scanner.c" +#line 7056 "Zend/zend_language_scanner.c" yy780: YYDEBUG(780, *YYCURSOR); yych = *++YYCURSOR; @@ -7149,11 +7086,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(786, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1112 "Zend/zend_language_scanner.l" +#line 1110 "Zend/zend_language_scanner.l" { return T_ENDDECLARE; } -#line 7157 "Zend/zend_language_scanner.c" +#line 7094 "Zend/zend_language_scanner.c" yy787: YYDEBUG(787, *YYCURSOR); yych = *++YYCURSOR; @@ -7172,11 +7109,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(790, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1298 "Zend/zend_language_scanner.l" +#line 1294 "Zend/zend_language_scanner.l" { return T_EMPTY; } -#line 7180 "Zend/zend_language_scanner.c" +#line 7117 "Zend/zend_language_scanner.c" yy791: YYDEBUG(791, *YYCURSOR); yych = *++YYCURSOR; @@ -7205,11 +7142,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy793: YYDEBUG(793, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1076 "Zend/zend_language_scanner.l" +#line 1074 "Zend/zend_language_scanner.l" { return T_ELSE; } -#line 7213 "Zend/zend_language_scanner.c" +#line 7150 "Zend/zend_language_scanner.c" yy794: YYDEBUG(794, *YYCURSOR); yych = *++YYCURSOR; @@ -7223,11 +7160,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(796, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1068 "Zend/zend_language_scanner.l" +#line 1066 "Zend/zend_language_scanner.l" { return T_ELSEIF; } -#line 7231 "Zend/zend_language_scanner.c" +#line 7168 "Zend/zend_language_scanner.c" yy797: YYDEBUG(797, *YYCURSOR); yych = *++YYCURSOR; @@ -7241,11 +7178,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(799, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1152 "Zend/zend_language_scanner.l" +#line 1150 "Zend/zend_language_scanner.l" { return T_ECHO; } -#line 7249 "Zend/zend_language_scanner.c" +#line 7186 "Zend/zend_language_scanner.c" } /* *********************************** */ yyc_ST_LOOKING_FOR_PROPERTY: @@ -7318,15 +7255,13 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy803: YYDEBUG(803, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1185 "Zend/zend_language_scanner.l" +#line 1183 "Zend/zend_language_scanner.l" { - zendlval->value.str.val = yytext; /* no copying - intentional */ - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; + ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ HANDLE_NEWLINES(yytext, yyleng); return T_WHITESPACE; } -#line 7330 "Zend/zend_language_scanner.c" +#line 7265 "Zend/zend_language_scanner.c" yy804: YYDEBUG(804, *YYCURSOR); ++YYCURSOR; @@ -7334,13 +7269,13 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy805: YYDEBUG(805, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1204 "Zend/zend_language_scanner.l" +#line 1200 "Zend/zend_language_scanner.l" { yyless(0); yy_pop_state(TSRMLS_C); goto restart; } -#line 7344 "Zend/zend_language_scanner.c" +#line 7279 "Zend/zend_language_scanner.c" yy806: YYDEBUG(806, *YYCURSOR); ++YYCURSOR; @@ -7349,14 +7284,14 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy807: YYDEBUG(807, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1197 "Zend/zend_language_scanner.l" +#line 1193 "Zend/zend_language_scanner.l" { yy_pop_state(TSRMLS_C); zend_copy_value(zendlval, yytext, yyleng); zendlval->type = IS_STRING; return T_STRING; } -#line 7360 "Zend/zend_language_scanner.c" +#line 7295 "Zend/zend_language_scanner.c" yy808: YYDEBUG(808, *YYCURSOR); yych = *++YYCURSOR; @@ -7377,11 +7312,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(812, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1193 "Zend/zend_language_scanner.l" +#line 1189 "Zend/zend_language_scanner.l" { return T_OBJECT_OPERATOR; } -#line 7385 "Zend/zend_language_scanner.c" +#line 7320 "Zend/zend_language_scanner.c" yy813: YYDEBUG(813, *YYCURSOR); ++YYCURSOR; @@ -7466,14 +7401,14 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy818: YYDEBUG(818, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1490 "Zend/zend_language_scanner.l" +#line 1486 "Zend/zend_language_scanner.l" { yyless(0); yy_pop_state(TSRMLS_C); yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); goto restart; } -#line 7477 "Zend/zend_language_scanner.c" +#line 7412 "Zend/zend_language_scanner.c" yy819: YYDEBUG(819, *YYCURSOR); yych = *++YYCURSOR; @@ -7498,7 +7433,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(824, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1480 "Zend/zend_language_scanner.l" +#line 1476 "Zend/zend_language_scanner.l" { yyless(yyleng - 1); zend_copy_value(zendlval, yytext, yyleng); @@ -7507,7 +7442,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); return T_STRING_VARNAME; } -#line 7511 "Zend/zend_language_scanner.c" +#line 7446 "Zend/zend_language_scanner.c" } /* *********************************** */ yyc_ST_NOWDOC: @@ -7518,7 +7453,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(828, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2374 "Zend/zend_language_scanner.l" +#line 2306 "Zend/zend_language_scanner.l" { int newline = 0; @@ -7575,7 +7510,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) HANDLE_NEWLINES(yytext, yyleng - newline); return T_ENCAPSED_AND_WHITESPACE; } -#line 7579 "Zend/zend_language_scanner.c" +#line 7514 "Zend/zend_language_scanner.c" /* *********************************** */ yyc_ST_VAR_OFFSET: { @@ -7682,19 +7617,16 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy832: YYDEBUG(832, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1568 "Zend/zend_language_scanner.l" +#line 1562 "Zend/zend_language_scanner.l" { /* Offset could be treated as a long */ if (yyleng < MAX_LENGTH_OF_LONG - 1 || (yyleng == MAX_LENGTH_OF_LONG - 1 && strcmp(yytext, long_min_digits) < 0)) { - zendlval->value.lval = strtol(yytext, NULL, 10); - zendlval->type = IS_LONG; + ZVAL_LONG(zendlval, strtol(yytext, NULL, 10)); } else { - zendlval->value.str.val = (char *)estrndup(yytext, yyleng); - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; + ZVAL_STRINGL(zendlval, yytext, yyleng, 1); } return T_NUM_STRING; } -#line 7698 "Zend/zend_language_scanner.c" +#line 7630 "Zend/zend_language_scanner.c" yy833: YYDEBUG(833, *YYCURSOR); yych = *++YYCURSOR; @@ -7714,23 +7646,23 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy835: YYDEBUG(835, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1900 "Zend/zend_language_scanner.l" +#line 1838 "Zend/zend_language_scanner.l" { /* Only '[' can be valid, but returning other tokens will allow a more explicit parse error */ return yytext[0]; } -#line 7723 "Zend/zend_language_scanner.c" +#line 7655 "Zend/zend_language_scanner.c" yy836: YYDEBUG(836, *YYCURSOR); ++YYCURSOR; YYDEBUG(837, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1895 "Zend/zend_language_scanner.l" +#line 1833 "Zend/zend_language_scanner.l" { yy_pop_state(TSRMLS_C); return ']'; } -#line 7734 "Zend/zend_language_scanner.c" +#line 7666 "Zend/zend_language_scanner.c" yy838: YYDEBUG(838, *YYCURSOR); yych = *++YYCURSOR; @@ -7740,14 +7672,14 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(840, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1905 "Zend/zend_language_scanner.l" +#line 1843 "Zend/zend_language_scanner.l" { /* Invalid rule to return a more explicit parse error with proper line number */ yyless(0); yy_pop_state(TSRMLS_C); return T_ENCAPSED_AND_WHITESPACE; } -#line 7751 "Zend/zend_language_scanner.c" +#line 7683 "Zend/zend_language_scanner.c" yy841: YYDEBUG(841, *YYCURSOR); ++YYCURSOR; @@ -7756,19 +7688,19 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy842: YYDEBUG(842, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1912 "Zend/zend_language_scanner.l" +#line 1850 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, yytext, yyleng); zendlval->type = IS_STRING; return T_STRING; } -#line 7766 "Zend/zend_language_scanner.c" +#line 7698 "Zend/zend_language_scanner.c" yy843: YYDEBUG(843, *YYCURSOR); ++YYCURSOR; YYDEBUG(844, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2432 "Zend/zend_language_scanner.l" +#line 2364 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { return 0; @@ -7777,7 +7709,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE); goto restart; } -#line 7781 "Zend/zend_language_scanner.c" +#line 7713 "Zend/zend_language_scanner.c" yy845: YYDEBUG(845, *YYCURSOR); ++YYCURSOR; @@ -7813,13 +7745,13 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy849: YYDEBUG(849, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1889 "Zend/zend_language_scanner.l" +#line 1827 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; return T_VARIABLE; } -#line 7823 "Zend/zend_language_scanner.c" +#line 7755 "Zend/zend_language_scanner.c" yy850: YYDEBUG(850, *YYCURSOR); ++YYCURSOR; @@ -7859,14 +7791,12 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy857: YYDEBUG(857, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1580 "Zend/zend_language_scanner.l" +#line 1571 "Zend/zend_language_scanner.l" { /* Offset must be treated as a string */ - zendlval->value.str.val = (char *)estrndup(yytext, yyleng); - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; + ZVAL_STRINGL(zendlval, yytext, yyleng, 1); return T_NUM_STRING; } -#line 7870 "Zend/zend_language_scanner.c" +#line 7800 "Zend/zend_language_scanner.c" yy858: YYDEBUG(858, *YYCURSOR); ++YYCURSOR; @@ -7889,6 +7819,6 @@ int lex_scan(zval *zendlval TSRMLS_DC) goto yy857; } } -#line 2441 "Zend/zend_language_scanner.l" +#line 2373 "Zend/zend_language_scanner.l" } diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index d2e7243bb2da1..95d2d6246b9c6 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -562,10 +562,8 @@ ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type TSR zend_bool original_in_compilation = CG(in_compilation); retval_znode.op_type = IS_CONST; - retval_znode.u.constant.type = IS_LONG; - retval_znode.u.constant.value.lval = 1; - Z_UNSET_ISREF(retval_znode.u.constant); - Z_SET_REFCOUNT(retval_znode.u.constant, 1); + INIT_PZVAL(&retval_znode.u.constant); + ZVAL_LONG(&retval_znode.u.constant, 1); zend_save_lexical_state(&original_lex_state TSRMLS_CC); @@ -622,7 +620,7 @@ zend_op_array *compile_filename(int type, zval *filename TSRMLS_DC) convert_to_string(&tmp); filename = &tmp; } - file_handle.filename = filename->value.str.val; + file_handle.filename = Z_STRVAL_P(filename); file_handle.free_filename = 0; file_handle.type = ZEND_HANDLE_FILENAME; file_handle.opened_path = NULL; @@ -633,7 +631,7 @@ zend_op_array *compile_filename(int type, zval *filename TSRMLS_DC) int dummy = 1; if (!file_handle.opened_path) { - file_handle.opened_path = opened_path = estrndup(filename->value.str.val, filename->value.str.len); + file_handle.opened_path = opened_path = estrndup(Z_STRVAL_P(filename), Z_STRLEN_P(filename)); } zend_hash_add(&EG(included_files), file_handle.opened_path, strlen(file_handle.opened_path)+1, (void *)&dummy, sizeof(int), NULL); @@ -656,21 +654,21 @@ ZEND_API int zend_prepare_string_for_scanning(zval *str, char *filename TSRMLS_D size_t size; /* enforce two trailing NULLs for flex... */ - if (IS_INTERNED(str->value.str.val)) { - char *tmp = safe_emalloc(1, str->value.str.len, ZEND_MMAP_AHEAD); - memcpy(tmp, str->value.str.val, str->value.str.len + ZEND_MMAP_AHEAD); - str->value.str.val = tmp; + if (IS_INTERNED(Z_STRVAL_P(str))) { + char *tmp = safe_emalloc(1, Z_STRLEN_P(str), ZEND_MMAP_AHEAD); + memcpy(tmp, Z_STRVAL_P(str), Z_STRLEN_P(str) + ZEND_MMAP_AHEAD); + Z_STRVAL_P(str) = tmp; } else { - str->value.str.val = safe_erealloc(str->value.str.val, 1, str->value.str.len, ZEND_MMAP_AHEAD); + Z_STRVAL_P(str) = safe_erealloc(Z_STRVAL_P(str), 1, Z_STRLEN_P(str), ZEND_MMAP_AHEAD); } - memset(str->value.str.val + str->value.str.len, 0, ZEND_MMAP_AHEAD); + memset(Z_STRVAL_P(str) + Z_STRLEN_P(str), 0, ZEND_MMAP_AHEAD); SCNG(yy_in) = NULL; SCNG(yy_start) = NULL; - buf = str->value.str.val; - size = str->value.str.len; + buf = Z_STRVAL_P(str); + size = Z_STRLEN_P(str); if (CG(multibyte)) { SCNG(script_org) = (unsigned char*)buf; @@ -731,7 +729,7 @@ zend_op_array *compile_string(zval *source_string, char *filename TSRMLS_DC) int compiler_result; zend_bool original_in_compilation = CG(in_compilation); - if (source_string->value.str.len==0) { + if (Z_STRLEN_P(source_string)==0) { efree(op_array); return NULL; } @@ -869,11 +867,11 @@ ZEND_API void zend_multibyte_yyinput_again(zend_encoding_filter old_input_filter # define zend_copy_value(zendlval, yytext, yyleng) \ if (SCNG(output_filter)) { \ size_t sz = 0; \ - SCNG(output_filter)((unsigned char **)&(zendlval->value.str.val), &sz, (unsigned char *)yytext, (size_t)yyleng TSRMLS_CC); \ - zendlval->value.str.len = sz; \ + SCNG(output_filter)((unsigned char **)&Z_STRVAL_P(zendlval), &sz, (unsigned char *)yytext, (size_t)yyleng TSRMLS_CC); \ + Z_STRLEN_P(zendlval) = sz; \ } else { \ - zendlval->value.str.val = (char *) estrndup(yytext, yyleng); \ - zendlval->value.str.len = yyleng; \ + Z_STRVAL_P(zendlval) = (char *) estrndup(yytext, yyleng); \ + Z_STRLEN_P(zendlval) = yyleng; \ } static void zend_scan_escape_string(zval *zendlval, char *str, int len, char quote_type TSRMLS_DC) @@ -884,8 +882,8 @@ static void zend_scan_escape_string(zval *zendlval, char *str, int len, char quo ZVAL_STRINGL(zendlval, str, len, 1); /* convert escape sequences */ - s = t = zendlval->value.str.val; - end = s+zendlval->value.str.len; + s = t = Z_STRVAL_P(zendlval); + end = s+Z_STRLEN_P(zendlval); while (svalue.str.len--; + Z_STRLEN_P(zendlval)--; break; case 'r': *t++ = '\r'; - zendlval->value.str.len--; + Z_STRLEN_P(zendlval)--; break; case 't': *t++ = '\t'; - zendlval->value.str.len--; + Z_STRLEN_P(zendlval)--; break; case 'f': *t++ = '\f'; - zendlval->value.str.len--; + Z_STRLEN_P(zendlval)--; break; case 'v': *t++ = '\v'; - zendlval->value.str.len--; + Z_STRLEN_P(zendlval)--; break; case 'e': #ifdef PHP_WIN32 @@ -921,7 +919,7 @@ static void zend_scan_escape_string(zval *zendlval, char *str, int len, char quo #else *t++ = '\e'; #endif - zendlval->value.str.len--; + Z_STRLEN_P(zendlval)--; break; case '"': case '`': @@ -933,20 +931,20 @@ static void zend_scan_escape_string(zval *zendlval, char *str, int len, char quo case '\\': case '$': *t++ = *s; - zendlval->value.str.len--; + Z_STRLEN_P(zendlval)--; break; case 'x': case 'X': if (ZEND_IS_HEX(*(s+1))) { char hex_buf[3] = { 0, 0, 0 }; - zendlval->value.str.len--; /* for the 'x' */ + Z_STRLEN_P(zendlval)--; /* for the 'x' */ hex_buf[0] = *(++s); - zendlval->value.str.len--; + Z_STRLEN_P(zendlval)--; if (ZEND_IS_HEX(*(s+1))) { hex_buf[1] = *(++s); - zendlval->value.str.len--; + Z_STRLEN_P(zendlval)--; } *t++ = (char) strtol(hex_buf, NULL, 16); } else { @@ -960,13 +958,13 @@ static void zend_scan_escape_string(zval *zendlval, char *str, int len, char quo char octal_buf[4] = { 0, 0, 0, 0 }; octal_buf[0] = *s; - zendlval->value.str.len--; + Z_STRLEN_P(zendlval)--; if (ZEND_IS_OCT(*(s+1))) { octal_buf[1] = *(++s); - zendlval->value.str.len--; + Z_STRLEN_P(zendlval)--; if (ZEND_IS_OCT(*(s+1))) { octal_buf[2] = *(++s); - zendlval->value.str.len--; + Z_STRLEN_P(zendlval)--; } } *t++ = (char) strtol(octal_buf, NULL, 8); @@ -988,9 +986,9 @@ static void zend_scan_escape_string(zval *zendlval, char *str, int len, char quo *t = 0; if (SCNG(output_filter)) { size_t sz = 0; - s = zendlval->value.str.val; - SCNG(output_filter)((unsigned char **)&(zendlval->value.str.val), &sz, (unsigned char *)s, (size_t)zendlval->value.str.len TSRMLS_CC); - zendlval->value.str.len = sz; + s = Z_STRVAL_P(zendlval); + SCNG(output_filter)((unsigned char **)&Z_STRVAL_P(zendlval), &sz, (unsigned char *)s, (size_t)Z_STRLEN_P(zendlval) TSRMLS_CC); + Z_STRLEN_P(zendlval) = sz; efree(s); } } @@ -1183,9 +1181,7 @@ NEWLINE ("\r"|"\n"|"\r\n") } {WHITESPACE}+ { - zendlval->value.str.val = yytext; /* no copying - intentional */ - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; + ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ HANDLE_NEWLINES(yytext, yyleng); return T_WHITESPACE; } @@ -1506,30 +1502,29 @@ NEWLINE ("\r"|"\n"|"\r\n") if (len < SIZEOF_LONG * 8) { if (len == 0) { - zendlval->value.lval = 0; + Z_LVAL_P(zendlval) = 0; } else { - zendlval->value.lval = strtol(bin, NULL, 2); + Z_LVAL_P(zendlval) = strtol(bin, NULL, 2); } zendlval->type = IS_LONG; return T_LNUMBER; } else { - zendlval->value.dval = zend_bin_strtod(bin, NULL); - zendlval->type = IS_DOUBLE; + ZVAL_DOUBLE(zendlval, zend_bin_strtod(bin, NULL)); return T_DNUMBER; } } {LNUM} { if (yyleng < MAX_LENGTH_OF_LONG - 1) { /* Won't overflow */ - zendlval->value.lval = strtol(yytext, NULL, 0); + Z_LVAL_P(zendlval) = strtol(yytext, NULL, 0); } else { errno = 0; - zendlval->value.lval = strtol(yytext, NULL, 0); + Z_LVAL_P(zendlval) = strtol(yytext, NULL, 0); if (errno == ERANGE) { /* Overflow */ if (yytext[0] == '0') { /* octal overflow */ - zendlval->value.dval = zend_oct_strtod(yytext, NULL); + Z_DVAL_P(zendlval) = zend_oct_strtod(yytext, NULL); } else { - zendlval->value.dval = zend_strtod(yytext, NULL); + Z_DVAL_P(zendlval) = zend_strtod(yytext, NULL); } zendlval->type = IS_DOUBLE; return T_DNUMBER; @@ -1552,120 +1547,80 @@ NEWLINE ("\r"|"\n"|"\r\n") if (len < SIZEOF_LONG * 2 || (len == SIZEOF_LONG * 2 && *hex <= '7')) { if (len == 0) { - zendlval->value.lval = 0; + Z_LVAL_P(zendlval) = 0; } else { - zendlval->value.lval = strtol(hex, NULL, 16); + Z_LVAL_P(zendlval) = strtol(hex, NULL, 16); } zendlval->type = IS_LONG; return T_LNUMBER; } else { - zendlval->value.dval = zend_hex_strtod(hex, NULL); - zendlval->type = IS_DOUBLE; + ZVAL_DOUBLE(zendlval, zend_hex_strtod(hex, NULL)); return T_DNUMBER; } } [0]|([1-9][0-9]*) { /* Offset could be treated as a long */ if (yyleng < MAX_LENGTH_OF_LONG - 1 || (yyleng == MAX_LENGTH_OF_LONG - 1 && strcmp(yytext, long_min_digits) < 0)) { - zendlval->value.lval = strtol(yytext, NULL, 10); - zendlval->type = IS_LONG; + ZVAL_LONG(zendlval, strtol(yytext, NULL, 10)); } else { - zendlval->value.str.val = (char *)estrndup(yytext, yyleng); - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; + ZVAL_STRINGL(zendlval, yytext, yyleng, 1); } return T_NUM_STRING; } {LNUM}|{HNUM}|{BNUM} { /* Offset must be treated as a string */ - zendlval->value.str.val = (char *)estrndup(yytext, yyleng); - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; + ZVAL_STRINGL(zendlval, yytext, yyleng, 1); return T_NUM_STRING; } {DNUM}|{EXPONENT_DNUM} { - zendlval->value.dval = zend_strtod(yytext, NULL); - zendlval->type = IS_DOUBLE; + ZVAL_DOUBLE(zendlval, zend_strtod(yytext, NULL)); return T_DNUMBER; } "__CLASS__" { - const char *class_name = NULL; - - if (CG(active_class_entry) - && (ZEND_ACC_TRAIT == - (CG(active_class_entry)->ce_flags & ZEND_ACC_TRAIT))) { + zend_class_entry *ce = CG(active_class_entry); + if (ce && ZEND_ACC_TRAIT == (ce->ce_flags & ZEND_ACC_TRAIT)) { /* We create a special __CLASS__ constant that is going to be resolved at run-time */ - zendlval->value.str.len = sizeof("__CLASS__")-1; - zendlval->value.str.val = estrndup("__CLASS__", zendlval->value.str.len); + Z_STRLEN_P(zendlval) = sizeof("__CLASS__")-1; + Z_STRVAL_P(zendlval) = estrndup("__CLASS__", Z_STRLEN_P(zendlval)); zendlval->type = IS_CONSTANT; } else { - if (CG(active_class_entry)) { - class_name = CG(active_class_entry)->name; - } - - if (!class_name) { - class_name = ""; + if (ce && ce->name) { + ZVAL_STRINGL(zendlval, ce->name, ce->name_length, 1); + } else { + ZVAL_EMPTY_STRING(zendlval); } - - zendlval->value.str.len = strlen(class_name); - zendlval->value.str.val = estrndup(class_name, zendlval->value.str.len); - zendlval->type = IS_STRING; } return T_CLASS_C; } "__TRAIT__" { - const char *trait_name = NULL; - - if (CG(active_class_entry) - && (ZEND_ACC_TRAIT == - (CG(active_class_entry)->ce_flags & ZEND_ACC_TRAIT))) { - trait_name = CG(active_class_entry)->name; - } - - if (!trait_name) { - trait_name = ""; - } - - zendlval->value.str.len = strlen(trait_name); - zendlval->value.str.val = estrndup(trait_name, zendlval->value.str.len); - zendlval->type = IS_STRING; - + zend_class_entry *ce = CG(active_class_entry); + if (ce && ce->name && ZEND_ACC_TRAIT == (ce->ce_flags & ZEND_ACC_TRAIT)) { + ZVAL_STRINGL(zendlval, ce->name, ce->name_length, 1); + } else { + ZVAL_EMPTY_STRING(zendlval); + } return T_TRAIT_C; } "__FUNCTION__" { - const char *func_name = NULL; - - if (CG(active_op_array)) { - func_name = CG(active_op_array)->function_name; - } - - if (!func_name) { - func_name = ""; + zend_op_array *op_array = CG(active_op_array); + if (op_array && op_array->function_name) { + ZVAL_STRING(zendlval, op_array->function_name, 1); + } else { + ZVAL_EMPTY_STRING(zendlval); } - zendlval->value.str.len = strlen(func_name); - zendlval->value.str.val = estrndup(func_name, zendlval->value.str.len); - zendlval->type = IS_STRING; return T_FUNC_C; } "__METHOD__" { const char *class_name = CG(active_class_entry) ? CG(active_class_entry)->name : NULL; const char *func_name = CG(active_op_array)? CG(active_op_array)->function_name : NULL; - size_t len = 0; - if (class_name) { - len += strlen(class_name) + 2; - } - if (func_name) { - len += strlen(func_name); - } - - zendlval->value.str.len = zend_spprintf(&zendlval->value.str.val, 0, "%s%s%s", + Z_STRLEN_P(zendlval) = zend_spprintf(&Z_STRVAL_P(zendlval), 0, "%s%s%s", class_name ? class_name : "", class_name && func_name ? "::" : "", func_name ? func_name : "" @@ -1675,8 +1630,7 @@ NEWLINE ("\r"|"\n"|"\r\n") } "__LINE__" { - zendlval->value.lval = CG(zend_lineno); - zendlval->type = IS_LONG; + ZVAL_LONG(zendlval, CG(zend_lineno)); return T_LINE; } @@ -1686,9 +1640,7 @@ NEWLINE ("\r"|"\n"|"\r\n") if (!filename) { filename = ""; } - zendlval->value.str.len = strlen(filename); - zendlval->value.str.val = estrndup(filename, zendlval->value.str.len); - zendlval->type = IS_STRING; + ZVAL_STRING(zendlval, filename, 1); return T_FILE; } @@ -1713,9 +1665,7 @@ NEWLINE ("\r"|"\n"|"\r\n") #endif } - zendlval->value.str.len = strlen(dirname); - zendlval->value.str.val = dirname; - zendlval->type = IS_STRING; + ZVAL_STRING(zendlval, dirname, 0); return T_DIR; } @@ -1739,9 +1689,7 @@ NEWLINE ("\r"|"\n"|"\r\n") } HANDLE_NEWLINES(yytext, yyleng); - zendlval->value.str.val = yytext; /* no copying - intentional */ - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; + ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ BEGIN(ST_IN_SCRIPTING); return T_OPEN_TAG; } @@ -1749,9 +1697,7 @@ NEWLINE ("\r"|"\n"|"\r\n") "<%=" { if (CG(asp_tags)) { - zendlval->value.str.val = yytext; /* no copying - intentional */ - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; + ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ BEGIN(ST_IN_SCRIPTING); return T_OPEN_TAG_WITH_ECHO; } else { @@ -1761,9 +1707,7 @@ NEWLINE ("\r"|"\n"|"\r\n") "value.str.val = yytext; /* no copying - intentional */ - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; + ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ BEGIN(ST_IN_SCRIPTING); return T_OPEN_TAG_WITH_ECHO; } @@ -1771,9 +1715,7 @@ NEWLINE ("\r"|"\n"|"\r\n") "<%" { if (CG(asp_tags)) { - zendlval->value.str.val = yytext; /* no copying - intentional */ - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; + ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ BEGIN(ST_IN_SCRIPTING); return T_OPEN_TAG; } else { @@ -1783,9 +1725,7 @@ NEWLINE ("\r"|"\n"|"\r\n") "value.str.val = yytext; /* no copying - intentional */ - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; + ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ HANDLE_NEWLINE(yytext[yyleng-1]); BEGIN(ST_IN_SCRIPTING); return T_OPEN_TAG; @@ -1794,9 +1734,7 @@ NEWLINE ("\r"|"\n"|"\r\n") "value.str.val = yytext; /* no copying - intentional */ - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; + ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ BEGIN(ST_IN_SCRIPTING); return T_OPEN_TAG; } else { @@ -1850,14 +1788,14 @@ inline_html: if (SCNG(output_filter)) { int readsize; size_t sz = 0; - readsize = SCNG(output_filter)((unsigned char **)&(zendlval->value.str.val), &sz, (unsigned char *)yytext, (size_t)yyleng TSRMLS_CC); - zendlval->value.str.len = sz; + readsize = SCNG(output_filter)((unsigned char **)&Z_STRVAL_P(zendlval), &sz, (unsigned char *)yytext, (size_t)yyleng TSRMLS_CC); + Z_STRLEN_P(zendlval) = sz; if (readsize < yyleng) { yyless(readsize); } } else { - zendlval->value.str.val = (char *) estrndup(yytext, yyleng); - zendlval->value.str.len = yyleng; + Z_STRVAL_P(zendlval) = (char *) estrndup(yytext, yyleng); + Z_STRLEN_P(zendlval) = yyleng; } zendlval->type = IS_STRING; HANDLE_NEWLINES(yytext, yyleng); @@ -1985,9 +1923,7 @@ inline_html: } ("?>"|""){NEWLINE}? { - zendlval->value.str.val = yytext; /* no copying - intentional */ - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; + ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ BEGIN(INITIAL); return T_CLOSE_TAG; /* implicit ';' at php-end tag */ } @@ -1996,9 +1932,7 @@ inline_html: "%>"{NEWLINE}? { if (CG(asp_tags)) { BEGIN(INITIAL); - zendlval->value.str.len = yyleng; - zendlval->type = IS_STRING; - zendlval->value.str.val = yytext; /* no copying - intentional */ + ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ return T_CLOSE_TAG; /* implicit ';' at php-end tag */ } else { yyless(1); @@ -2032,13 +1966,11 @@ inline_html: } } - zendlval->value.str.val = estrndup(yytext+bprefix+1, yyleng-bprefix-2); - zendlval->value.str.len = yyleng-bprefix-2; - zendlval->type = IS_STRING; + ZVAL_STRINGL(zendlval, yytext+bprefix+1, yyleng-bprefix-2, 1); /* convert escape sequences */ - s = t = zendlval->value.str.val; - end = s+zendlval->value.str.len; + s = t = Z_STRVAL_P(zendlval); + end = s+Z_STRLEN_P(zendlval); while (svalue.str.len--; + Z_STRLEN_P(zendlval)--; break; default: *t++ = '\\'; @@ -2067,9 +1999,9 @@ inline_html: if (SCNG(output_filter)) { size_t sz = 0; - s = zendlval->value.str.val; - SCNG(output_filter)((unsigned char **)&(zendlval->value.str.val), &sz, (unsigned char *)s, (size_t)zendlval->value.str.len TSRMLS_CC); - zendlval->value.str.len = sz; + s = Z_STRVAL_P(zendlval); + SCNG(output_filter)((unsigned char **)&Z_STRVAL_P(zendlval), &sz, (unsigned char *)s, (size_t)Z_STRLEN_P(zendlval) TSRMLS_CC); + Z_STRLEN_P(zendlval) = sz; efree(s); } return T_CONSTANT_ENCAPSED_STRING; @@ -2187,7 +2119,7 @@ inline_html: "{$" { - zendlval->value.lval = (long) '{'; + Z_LVAL_P(zendlval) = (long) '{'; yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); yyless(1); return T_CURLY_OPEN; From 96b1c2145c2cd5e616dea191648c2d73af0239c9 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 13 Sep 2013 18:45:02 +0200 Subject: [PATCH 102/400] Provide more macros for handling of interned strings * str_erealloc behaves like erealloc for normal strings, but will use emalloc+memcpy for interned strings. * str_estrndup behaves like estrndup for normal strings, but will not copy interned strings. * str_strndup behaves like zend_strndup for normal strings, but will not copy interned strings. * str_efree_rel behaves like efree_rel for normal strings, but will not free interned strings. * str_hash will return INTERNED_HASH for interned strings and compute it using zend_hash_func for normal strings. --- Zend/zend.h | 4 +- Zend/zend_API.c | 19 +- Zend/zend_builtin_functions.c | 2 +- Zend/zend_compile.c | 60 +-- Zend/zend_constants.c | 19 +- Zend/zend_execute.c | 49 +-- Zend/zend_execute_API.c | 10 +- Zend/zend_language_scanner.c | 699 +++++++++++++++++----------------- Zend/zend_language_scanner.l | 11 +- Zend/zend_operators.c | 44 +-- Zend/zend_string.h | 27 ++ Zend/zend_variables.c | 2 +- Zend/zend_vm_def.h | 24 +- Zend/zend_vm_execute.h | 314 +++------------ 14 files changed, 511 insertions(+), 773 deletions(-) diff --git a/Zend/zend.h b/Zend/zend.h index 1377fd566594b..acbb6acaf76ce 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -670,8 +670,8 @@ END_EXTERN_C() /* FIXME: Check if we can save if (ptr) too */ -#define STR_FREE(ptr) if (ptr && !IS_INTERNED(ptr)) { efree(ptr); } -#define STR_FREE_REL(ptr) if (ptr && !IS_INTERNED(ptr)) { efree_rel(ptr); } +#define STR_FREE(ptr) if (ptr) { str_efree(ptr); } +#define STR_FREE_REL(ptr) if (ptr) { str_efree_rel(ptr); } #define STR_EMPTY_ALLOC() estrndup("", sizeof("")-1) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index b59faab28458d..6241df1cad39b 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -2029,7 +2029,7 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio const zend_function_entry *ptr = functions; zend_function function, *reg_function; zend_internal_function *internal_function = (zend_internal_function *)&function; - int count=0, unload=0, result=0; + int count=0, unload=0; HashTable *target_function_table = function_table; int error_type; zend_function *ctor = NULL, *dtor = NULL, *clone = NULL, *__get = NULL, *__set = NULL, *__unset = NULL, *__isset = NULL, *__call = NULL, *__callstatic = NULL, *__tostring = NULL; @@ -2037,6 +2037,7 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio int fname_len; const char *lc_class_name = NULL; int class_name_len = 0; + zend_ulong hash; if (type==MODULE_PERSISTENT) { error_type = E_CORE_WARNING; @@ -2135,12 +2136,8 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio } fname_len = strlen(ptr->fname); lowercase_name = zend_new_interned_string(zend_str_tolower_dup(ptr->fname, fname_len), fname_len + 1, 1 TSRMLS_CC); - if (IS_INTERNED(lowercase_name)) { - result = zend_hash_quick_add(target_function_table, lowercase_name, fname_len+1, INTERNED_HASH(lowercase_name), &function, sizeof(zend_function), (void**)®_function); - } else { - result = zend_hash_add(target_function_table, lowercase_name, fname_len+1, &function, sizeof(zend_function), (void**)®_function); - } - if (result == FAILURE) { + hash = str_hash(lowercase_name, fname_len); + if (zend_hash_quick_add(target_function_table, lowercase_name, fname_len+1, hash, &function, sizeof(zend_function), (void**)®_function) == FAILURE) { unload=1; str_efree(lowercase_name); break; @@ -2493,6 +2490,7 @@ static zend_class_entry *do_register_internal_class(zend_class_entry *orig_class { zend_class_entry *class_entry = malloc(sizeof(zend_class_entry)); char *lowercase_name = emalloc(orig_class_entry->name_length + 1); + zend_ulong hash; *class_entry = *orig_class_entry; class_entry->type = ZEND_INTERNAL_CLASS; @@ -2506,11 +2504,8 @@ static zend_class_entry *do_register_internal_class(zend_class_entry *orig_class zend_str_tolower_copy(lowercase_name, orig_class_entry->name, class_entry->name_length); lowercase_name = (char*)zend_new_interned_string(lowercase_name, class_entry->name_length + 1, 1 TSRMLS_CC); - if (IS_INTERNED(lowercase_name)) { - zend_hash_quick_update(CG(class_table), lowercase_name, class_entry->name_length+1, INTERNED_HASH(lowercase_name), &class_entry, sizeof(zend_class_entry *), NULL); - } else { - zend_hash_update(CG(class_table), lowercase_name, class_entry->name_length+1, &class_entry, sizeof(zend_class_entry *), NULL); - } + hash = str_hash(lowercase_name, class_entry->name_length); + zend_hash_quick_update(CG(class_table), lowercase_name, class_entry->name_length+1, hash, &class_entry, sizeof(zend_class_entry *), NULL); str_efree(lowercase_name); return class_entry; } diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 1ad64e74eaf47..a0fa175dcc4f9 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -706,7 +706,7 @@ ZEND_FUNCTION(define) zval_ptr_dtor(&val_free); } c.flags = case_sensitive; /* non persistent */ - c.name = IS_INTERNED(name) ? name : zend_strndup(name, name_len); + c.name = str_strndup(name, name_len); if(c.name == NULL) { RETURN_FALSE; } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 699231ba5219c..2dd8d03a4c664 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -61,11 +61,8 @@ } while (0) #define CALCULATE_LITERAL_HASH(num) do { \ - if (IS_INTERNED(Z_STRVAL(CONSTANT(num)))) { \ - Z_HASH_P(&CONSTANT(num)) = INTERNED_HASH(Z_STRVAL(CONSTANT(num))); \ - } else { \ - Z_HASH_P(&CONSTANT(num)) = zend_hash_func(Z_STRVAL(CONSTANT(num)), Z_STRLEN(CONSTANT(num))+1); \ - } \ + zval *c = &CONSTANT(num); \ + Z_HASH_P(c) = str_hash(Z_STRVAL_P(c), Z_STRLEN_P(c)); \ } while (0) #define GET_CACHE_SLOT(literal) do { \ @@ -107,9 +104,7 @@ ZEND_API zend_executor_globals executor_globals; static void zend_duplicate_property_info(zend_property_info *property_info) /* {{{ */ { - if (!IS_INTERNED(property_info->name)) { - property_info->name = estrndup(property_info->name, property_info->name_length); - } + property_info->name = str_estrndup(property_info->name, property_info->name_length); if (property_info->doc_comment) { property_info->doc_comment = estrndup(property_info->doc_comment, property_info->doc_comment_len); } @@ -118,9 +113,7 @@ static void zend_duplicate_property_info(zend_property_info *property_info) /* { static void zend_duplicate_property_info_internal(zend_property_info *property_info) /* {{{ */ { - if (!IS_INTERNED(property_info->name)) { - property_info->name = zend_strndup(property_info->name, property_info->name_length); - } + property_info->name = str_strndup(property_info->name, property_info->name_length); } /* }}} */ @@ -657,13 +650,13 @@ void fetch_simple_variable_ex(znode *result, znode *varname, int bp, zend_uchar zend_llist *fetch_list_ptr; if (varname->op_type == IS_CONST) { - ulong hash = 0; + ulong hash; if (Z_TYPE(varname->u.constant) != IS_STRING) { convert_to_string(&varname->u.constant); - } else if (IS_INTERNED(Z_STRVAL(varname->u.constant))) { - hash = INTERNED_HASH(Z_STRVAL(varname->u.constant)); } + + hash = str_hash(Z_STRVAL(varname->u.constant), Z_STRLEN(varname->u.constant)); if (!zend_is_auto_global_quick(Z_STRVAL(varname->u.constant), Z_STRLEN(varname->u.constant), hash TSRMLS_CC) && !(Z_STRLEN(varname->u.constant) == (sizeof("this")-1) && !memcmp(Z_STRVAL(varname->u.constant), "this", sizeof("this"))) && @@ -1568,16 +1561,11 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n op_array.line_start = zend_get_compiled_lineno(TSRMLS_C); if (is_method) { - int result; + zend_ulong hash; lcname = zend_new_interned_string(zend_str_tolower_dup(name, name_len), name_len + 1, 1 TSRMLS_CC); - - if (IS_INTERNED(lcname)) { - result = zend_hash_quick_add(&CG(active_class_entry)->function_table, lcname, name_len+1, INTERNED_HASH(lcname), &op_array, sizeof(zend_op_array), (void **) &CG(active_op_array)); - } else { - result = zend_hash_add(&CG(active_class_entry)->function_table, lcname, name_len+1, &op_array, sizeof(zend_op_array), (void **) &CG(active_op_array)); - } - if (result == FAILURE) { + hash = str_hash(lcname, name_len); + if (zend_hash_quick_add(&CG(active_class_entry)->function_table, lcname, name_len+1, hash, &op_array, sizeof(zend_op_array), (void **) &CG(active_op_array)) == FAILURE) { zend_error(E_COMPILE_ERROR, "Cannot redeclare %s::%s()", CG(active_class_entry)->name, name); } @@ -1840,7 +1828,7 @@ void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, con zend_arg_info *cur_arg_info; znode var; - if (zend_is_auto_global_quick(Z_STRVAL(varname->u.constant), Z_STRLEN(varname->u.constant), 0 TSRMLS_CC)) { + if (zend_is_auto_global(Z_STRVAL(varname->u.constant), Z_STRLEN(varname->u.constant) TSRMLS_CC)) { zend_error(E_COMPILE_ERROR, "Cannot re-assign auto-global variable %s", Z_STRVAL(varname->u.constant)); } else { var.op_type = IS_CV; @@ -1984,9 +1972,7 @@ void zend_do_begin_method_call(znode *left_bracket TSRMLS_DC) /* {{{ */ if (Z_TYPE(name) != IS_STRING) { zend_error(E_COMPILE_ERROR, "Method name must be a string"); } - if (!IS_INTERNED(Z_STRVAL(name))) { - Z_STRVAL(name) = estrndup(Z_STRVAL(name), Z_STRLEN(name)); - } + Z_STRVAL(name) = str_estrndup(Z_STRVAL(name), Z_STRLEN(name)); FREE_POLYMORPHIC_CACHE_SLOT(last_op->op2.constant); last_op->op2.constant = zend_add_func_name_literal(CG(active_op_array), &name TSRMLS_CC); @@ -2112,7 +2098,7 @@ void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace memcpy(Z_STRVAL(tmp.u.constant), Z_STRVAL_P(CG(current_namespace)), Z_STRLEN_P(CG(current_namespace))); memcpy(&(Z_STRVAL(tmp.u.constant)[Z_STRLEN_P(CG(current_namespace))]), "\\", sizeof("\\")-1); memcpy(&(Z_STRVAL(tmp.u.constant)[Z_STRLEN_P(CG(current_namespace)) + sizeof("\\")-1]), Z_STRVAL(element_name->u.constant), Z_STRLEN(element_name->u.constant)+1); - STR_FREE(Z_STRVAL(element_name->u.constant)); + str_efree(Z_STRVAL(element_name->u.constant)); *element_name = tmp; } } @@ -2405,14 +2391,14 @@ void zend_do_build_full_name(znode *result, znode *prefix, znode *name, int is_c Z_STRVAL(result->u.constant) = erealloc(Z_STRVAL(result->u.constant), length+1); memcpy(&Z_STRVAL(result->u.constant)[Z_STRLEN(result->u.constant)], "::", sizeof("::")-1); memcpy(&Z_STRVAL(result->u.constant)[Z_STRLEN(result->u.constant) + sizeof("::")-1], Z_STRVAL(name->u.constant), Z_STRLEN(name->u.constant)+1); - STR_FREE(Z_STRVAL(name->u.constant)); + str_efree(Z_STRVAL(name->u.constant)); Z_STRLEN(result->u.constant) = length; } else { length = sizeof("\\")-1 + Z_STRLEN(result->u.constant) + Z_STRLEN(name->u.constant); Z_STRVAL(result->u.constant) = erealloc(Z_STRVAL(result->u.constant), length+1); memcpy(&Z_STRVAL(result->u.constant)[Z_STRLEN(result->u.constant)], "\\", sizeof("\\")-1); memcpy(&Z_STRVAL(result->u.constant)[Z_STRLEN(result->u.constant) + sizeof("\\")-1], Z_STRVAL(name->u.constant), Z_STRLEN(name->u.constant)+1); - STR_FREE(Z_STRVAL(name->u.constant)); + str_efree(Z_STRVAL(name->u.constant)); Z_STRLEN(result->u.constant) = length; } } @@ -5305,7 +5291,7 @@ void zend_do_declare_class_constant(znode *var_name, const znode *value TSRMLS_D { zval *property; const char *cname = NULL; - int result; + zend_ulong hash; if(Z_TYPE(value->u.constant) == IS_CONSTANT_ARRAY) { zend_error(E_COMPILE_ERROR, "Arrays are not allowed in class constants"); @@ -5320,13 +5306,8 @@ void zend_do_declare_class_constant(znode *var_name, const znode *value TSRMLS_D *property = value->u.constant; cname = zend_new_interned_string(Z_STRVAL(var_name->u.constant), Z_STRLEN(var_name->u.constant)+1, 0 TSRMLS_CC); - - if (IS_INTERNED(cname)) { - result = zend_hash_quick_add(&CG(active_class_entry)->constants_table, cname, Z_STRLEN(var_name->u.constant)+1, INTERNED_HASH(cname), &property, sizeof(zval *), NULL); - } else { - result = zend_hash_add(&CG(active_class_entry)->constants_table, cname, Z_STRLEN(var_name->u.constant)+1, &property, sizeof(zval *), NULL); - } - if (result == FAILURE) { + hash = str_hash(cname, Z_STRLEN(var_name->u.constant)); + if (zend_hash_quick_add(&CG(active_class_entry)->constants_table, cname, Z_STRLEN(var_name->u.constant)+1, hash, &property, sizeof(zval *), NULL) == FAILURE) { FREE_ZVAL(property); zend_error(E_COMPILE_ERROR, "Cannot redefine class constant %s::%s", CG(active_class_entry)->name, Z_STRVAL(var_name->u.constant)); } @@ -6692,10 +6673,9 @@ void zend_do_ticks(TSRMLS_D) /* {{{ */ } /* }}} */ -zend_bool zend_is_auto_global_quick(const char *name, uint name_len, ulong hashval TSRMLS_DC) /* {{{ */ +zend_bool zend_is_auto_global_quick(const char *name, uint name_len, ulong hash TSRMLS_DC) /* {{{ */ { zend_auto_global *auto_global; - ulong hash = hashval ? hashval : zend_hash_func(name, name_len+1); if (zend_hash_quick_find(CG(auto_globals), name, name_len+1, hash, (void **) &auto_global)==SUCCESS) { if (auto_global->armed) { @@ -6709,7 +6689,7 @@ zend_bool zend_is_auto_global_quick(const char *name, uint name_len, ulong hashv zend_bool zend_is_auto_global(const char *name, uint name_len TSRMLS_DC) /* {{{ */ { - return zend_is_auto_global_quick(name, name_len, 0 TSRMLS_CC); + return zend_is_auto_global_quick(name, name_len, zend_hash_func(name, name_len+1) TSRMLS_CC); } /* }}} */ diff --git a/Zend/zend_constants.c b/Zend/zend_constants.c index 594559d58bf06..a53af497cc8d4 100644 --- a/Zend/zend_constants.c +++ b/Zend/zend_constants.c @@ -38,9 +38,7 @@ void free_zend_constant(zend_constant *c) void copy_zend_constant(zend_constant *c) { - if (!IS_INTERNED(c->name)) { - c->name = zend_strndup(c->name, c->name_len - 1); - } + c->name = str_strndup(c->name, c->name_len - 1); if (!(c->flags & CONST_PERSISTENT)) { zval_copy_ctor(&c->value); } @@ -474,7 +472,7 @@ ZEND_API int zend_register_constant(zend_constant *c TSRMLS_DC) char *lowercase_name = NULL; char *name; int ret = SUCCESS; - ulong chash = 0; + ulong chash; #if 0 printf("Registering constant for module %d\n", c->module_number); @@ -486,23 +484,18 @@ ZEND_API int zend_register_constant(zend_constant *c TSRMLS_DC) zend_str_tolower(lowercase_name, c->name_len-1); lowercase_name = (char*)zend_new_interned_string(lowercase_name, c->name_len, 1 TSRMLS_CC); name = lowercase_name; - chash = IS_INTERNED(lowercase_name) ? INTERNED_HASH(lowercase_name) : 0; } else { char *slash = strrchr(c->name, '\\'); - if(slash) { + if (slash) { lowercase_name = estrndup(c->name, c->name_len-1); zend_str_tolower(lowercase_name, slash-c->name); lowercase_name = (char*)zend_new_interned_string(lowercase_name, c->name_len, 1 TSRMLS_CC); name = lowercase_name; - - chash = IS_INTERNED(lowercase_name) ? INTERNED_HASH(lowercase_name) : 0; } else { name = c->name; } } - if (chash == 0) { - chash = zend_hash_func(name, c->name_len); - } + chash = str_hash(name, c->name_len-1); /* Check if the user is trying to define the internal pseudo constant name __COMPILER_HALT_OFFSET__ */ if ((c->name_len == sizeof("__COMPILER_HALT_OFFSET__") @@ -521,8 +514,8 @@ ZEND_API int zend_register_constant(zend_constant *c TSRMLS_DC) } ret = FAILURE; } - if (lowercase_name && !IS_INTERNED(lowercase_name)) { - efree(lowercase_name); + if (lowercase_name) { + str_efree(lowercase_name); } return ret; } diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 048c1fc18495d..63ecbe4069bac 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -767,32 +767,21 @@ static inline void zend_assign_to_object(zval **retval, zval **object_ptr, zval static inline int zend_assign_to_string_offset(const temp_variable *T, const zval *value, int value_type TSRMLS_DC) { - if (Z_TYPE_P(T->str_offset.str) == IS_STRING) { - - if (((int)T->str_offset.offset < 0)) { - zend_error(E_WARNING, "Illegal string offset: %d", T->str_offset.offset); + zval *str = T->str_offset.str; + zend_uint offset = T->str_offset.offset; + if (Z_TYPE_P(str) == IS_STRING) { + if ((int)offset < 0) { + zend_error(E_WARNING, "Illegal string offset: %d", offset); return 0; } - if (T->str_offset.offset >= Z_STRLEN_P(T->str_offset.str)) { - if (IS_INTERNED(Z_STRVAL_P(T->str_offset.str))) { - char *tmp = (char *) emalloc(T->str_offset.offset+1+1); - - memcpy(tmp, Z_STRVAL_P(T->str_offset.str), Z_STRLEN_P(T->str_offset.str)+1); - Z_STRVAL_P(T->str_offset.str) = tmp; - } else { - Z_STRVAL_P(T->str_offset.str) = (char *) erealloc(Z_STRVAL_P(T->str_offset.str), T->str_offset.offset+1+1); - } - memset(Z_STRVAL_P(T->str_offset.str) + Z_STRLEN_P(T->str_offset.str), - ' ', - T->str_offset.offset - Z_STRLEN_P(T->str_offset.str)); - Z_STRVAL_P(T->str_offset.str)[T->str_offset.offset+1] = 0; - Z_STRLEN_P(T->str_offset.str) = T->str_offset.offset+1; - } else if (IS_INTERNED(Z_STRVAL_P(T->str_offset.str))) { - char *tmp = (char *) emalloc(Z_STRLEN_P(T->str_offset.str) + 1); - - memcpy(tmp, Z_STRVAL_P(T->str_offset.str), Z_STRLEN_P(T->str_offset.str) + 1); - Z_STRVAL_P(T->str_offset.str) = tmp; + if (offset >= Z_STRLEN_P(str)) { + Z_STRVAL_P(str) = str_erealloc(Z_STRVAL_P(str), offset+1+1); + memset(Z_STRVAL_P(str) + Z_STRLEN_P(str), ' ', offset - Z_STRLEN_P(str)); + Z_STRVAL_P(str)[offset+1] = 0; + Z_STRLEN_P(str) = offset+1; + } else if (IS_INTERNED(Z_STRVAL_P(str))) { + Z_STRVAL_P(str) = estrndup(Z_STRVAL_P(str), Z_STRLEN_P(str)); } if (Z_TYPE_P(value) != IS_STRING) { @@ -803,15 +792,15 @@ static inline int zend_assign_to_string_offset(const temp_variable *T, const zva zval_copy_ctor(&tmp); } convert_to_string(&tmp); - Z_STRVAL_P(T->str_offset.str)[T->str_offset.offset] = Z_STRVAL(tmp)[0]; - STR_FREE(Z_STRVAL(tmp)); + Z_STRVAL_P(str)[offset] = Z_STRVAL(tmp)[0]; + str_efree(Z_STRVAL(tmp)); } else { - Z_STRVAL_P(T->str_offset.str)[T->str_offset.offset] = Z_STRVAL_P(value)[0]; + Z_STRVAL_P(str)[offset] = Z_STRVAL_P(value)[0]; if (value_type == IS_TMP_VAR) { /* we can safely free final_value here * because separation is done only * in case value_type == IS_VAR */ - STR_FREE(Z_STRVAL_P(value)); + str_efree(Z_STRVAL_P(value)); } } /* @@ -1024,11 +1013,7 @@ static inline zval **zend_fetch_dimension_address_inner(HashTable *ht, const zva hval = Z_HASH_P(dim); } else { ZEND_HANDLE_NUMERIC_EX(offset_key, offset_key_length+1, hval, goto num_index); - if (IS_INTERNED(offset_key)) { - hval = INTERNED_HASH(offset_key); - } else { - hval = zend_hash_func(offset_key, offset_key_length+1); - } + hval = str_hash(offset_key, offset_key_length); } fetch_string_dim: if (zend_hash_quick_find(ht, offset_key, offset_key_length+1, hval, (void **) &retval) == FAILURE) { diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 0b29086a0d5d0..d65308f44d940 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -533,13 +533,13 @@ ZEND_API int zval_update_constant_ex(zval **pp, void *arg, zend_class_entry *sco if (fix_save) { save--; } - if (inline_change && !IS_INTERNED(save)) { - efree(save); + if (inline_change) { + str_efree(save); } save = NULL; } - if (inline_change && save && save != actual && !IS_INTERNED(save)) { - efree(save); + if (inline_change && save && save != actual) { + str_efree(save); } zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", actual, actual); p->type = IS_STRING; @@ -551,7 +551,7 @@ ZEND_API int zval_update_constant_ex(zval **pp, void *arg, zend_class_entry *sco } } else { if (inline_change) { - STR_FREE(Z_STRVAL_P(p)); + str_efree(Z_STRVAL_P(p)); } *p = const_value; } diff --git a/Zend/zend_language_scanner.c b/Zend/zend_language_scanner.c index 0f0f51194fd52..d5768d3345569 100644 --- a/Zend/zend_language_scanner.c +++ b/Zend/zend_language_scanner.c @@ -655,15 +655,8 @@ ZEND_API int zend_prepare_string_for_scanning(zval *str, char *filename TSRMLS_D char *buf; size_t size; - /* enforce two trailing NULLs for flex... */ - if (IS_INTERNED(Z_STRVAL_P(str))) { - char *tmp = safe_emalloc(1, Z_STRLEN_P(str), ZEND_MMAP_AHEAD); - memcpy(tmp, Z_STRVAL_P(str), Z_STRLEN_P(str) + ZEND_MMAP_AHEAD); - Z_STRVAL_P(str) = tmp; - } else { - Z_STRVAL_P(str) = safe_erealloc(Z_STRVAL_P(str), 1, Z_STRLEN_P(str), ZEND_MMAP_AHEAD); - } - + /* enforce ZEND_MMAP_AHEAD trailing NULLs for flex... */ + Z_STRVAL_P(str) = str_erealloc(Z_STRVAL_P(str), Z_STRLEN_P(str) + ZEND_MMAP_AHEAD); memset(Z_STRVAL_P(str) + Z_STRLEN_P(str), 0, ZEND_MMAP_AHEAD); SCNG(yy_in) = NULL; @@ -1004,7 +997,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yymore_restart: -#line 1008 "Zend/zend_language_scanner.c" +#line 1001 "Zend/zend_language_scanner.c" { YYCTYPE yych; unsigned int yyaccept = 0; @@ -1103,7 +1096,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy3: YYDEBUG(3, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1745 "Zend/zend_language_scanner.l" +#line 1738 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { return 0; @@ -1163,7 +1156,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) HANDLE_NEWLINES(yytext, yyleng); return T_INLINE_HTML; } -#line 1167 "Zend/zend_language_scanner.c" +#line 1160 "Zend/zend_language_scanner.c" yy4: YYDEBUG(4, *YYCURSOR); yych = *++YYCURSOR; @@ -1181,7 +1174,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy6: YYDEBUG(6, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1735 "Zend/zend_language_scanner.l" +#line 1728 "Zend/zend_language_scanner.l" { if (CG(short_tags)) { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ @@ -1191,14 +1184,14 @@ int lex_scan(zval *zendlval TSRMLS_DC) goto inline_char_handler; } } -#line 1195 "Zend/zend_language_scanner.c" +#line 1188 "Zend/zend_language_scanner.c" yy7: YYDEBUG(7, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) == '=') goto yy43; YYDEBUG(8, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1716 "Zend/zend_language_scanner.l" +#line 1709 "Zend/zend_language_scanner.l" { if (CG(asp_tags)) { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ @@ -1208,7 +1201,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) goto inline_char_handler; } } -#line 1212 "Zend/zend_language_scanner.c" +#line 1205 "Zend/zend_language_scanner.c" yy9: YYDEBUG(9, *YYCURSOR); yych = *++YYCURSOR; @@ -1394,7 +1387,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(38, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1682 "Zend/zend_language_scanner.l" +#line 1675 "Zend/zend_language_scanner.l" { YYCTYPE *bracket = (YYCTYPE*)zend_memrchr(yytext, '<', yyleng - (sizeof("script language=php>") - 1)); @@ -1409,7 +1402,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) BEGIN(ST_IN_SCRIPTING); return T_OPEN_TAG; } -#line 1413 "Zend/zend_language_scanner.c" +#line 1406 "Zend/zend_language_scanner.c" yy39: YYDEBUG(39, *YYCURSOR); yych = *++YYCURSOR; @@ -1436,7 +1429,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(44, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1698 "Zend/zend_language_scanner.l" +#line 1691 "Zend/zend_language_scanner.l" { if (CG(asp_tags)) { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ @@ -1446,19 +1439,19 @@ int lex_scan(zval *zendlval TSRMLS_DC) goto inline_char_handler; } } -#line 1450 "Zend/zend_language_scanner.c" +#line 1443 "Zend/zend_language_scanner.c" yy45: YYDEBUG(45, *YYCURSOR); ++YYCURSOR; YYDEBUG(46, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1709 "Zend/zend_language_scanner.l" +#line 1702 "Zend/zend_language_scanner.l" { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ BEGIN(ST_IN_SCRIPTING); return T_OPEN_TAG_WITH_ECHO; } -#line 1462 "Zend/zend_language_scanner.c" +#line 1455 "Zend/zend_language_scanner.c" yy47: YYDEBUG(47, *YYCURSOR); yych = *++YYCURSOR; @@ -1485,14 +1478,14 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy51: YYDEBUG(51, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1727 "Zend/zend_language_scanner.l" +#line 1720 "Zend/zend_language_scanner.l" { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ HANDLE_NEWLINE(yytext[yyleng-1]); BEGIN(ST_IN_SCRIPTING); return T_OPEN_TAG; } -#line 1496 "Zend/zend_language_scanner.c" +#line 1489 "Zend/zend_language_scanner.c" yy52: YYDEBUG(52, *YYCURSOR); ++YYCURSOR; @@ -1563,7 +1556,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy56: YYDEBUG(56, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2190 "Zend/zend_language_scanner.l" +#line 2183 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { return 0; @@ -1604,7 +1597,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zend_scan_escape_string(zendlval, yytext, yyleng, '`' TSRMLS_CC); return T_ENCAPSED_AND_WHITESPACE; } -#line 1608 "Zend/zend_language_scanner.c" +#line 1601 "Zend/zend_language_scanner.c" yy57: YYDEBUG(57, *YYCURSOR); yych = *++YYCURSOR; @@ -1615,12 +1608,12 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(59, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2134 "Zend/zend_language_scanner.l" +#line 2127 "Zend/zend_language_scanner.l" { BEGIN(ST_IN_SCRIPTING); return '`'; } -#line 1624 "Zend/zend_language_scanner.c" +#line 1617 "Zend/zend_language_scanner.c" yy60: YYDEBUG(60, *YYCURSOR); yych = *++YYCURSOR; @@ -1630,14 +1623,14 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(62, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2121 "Zend/zend_language_scanner.l" +#line 2114 "Zend/zend_language_scanner.l" { Z_LVAL_P(zendlval) = (long) '{'; yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); yyless(1); return T_CURLY_OPEN; } -#line 1641 "Zend/zend_language_scanner.c" +#line 1634 "Zend/zend_language_scanner.c" yy63: YYDEBUG(63, *YYCURSOR); yyaccept = 0; @@ -1653,24 +1646,24 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy65: YYDEBUG(65, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1827 "Zend/zend_language_scanner.l" +#line 1820 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; return T_VARIABLE; } -#line 1663 "Zend/zend_language_scanner.c" +#line 1656 "Zend/zend_language_scanner.c" yy66: YYDEBUG(66, *YYCURSOR); ++YYCURSOR; YYDEBUG(67, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1461 "Zend/zend_language_scanner.l" +#line 1454 "Zend/zend_language_scanner.l" { yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC); return T_DOLLAR_OPEN_CURLY_BRACES; } -#line 1674 "Zend/zend_language_scanner.c" +#line 1667 "Zend/zend_language_scanner.c" yy68: YYDEBUG(68, *YYCURSOR); yych = *++YYCURSOR; @@ -1684,7 +1677,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(71, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1819 "Zend/zend_language_scanner.l" +#line 1812 "Zend/zend_language_scanner.l" { yyless(yyleng - 1); yy_push_state(ST_VAR_OFFSET TSRMLS_CC); @@ -1692,7 +1685,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zendlval->type = IS_STRING; return T_VARIABLE; } -#line 1696 "Zend/zend_language_scanner.c" +#line 1689 "Zend/zend_language_scanner.c" yy72: YYDEBUG(72, *YYCURSOR); yych = *++YYCURSOR; @@ -1710,7 +1703,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(74, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1809 "Zend/zend_language_scanner.l" +#line 1802 "Zend/zend_language_scanner.l" { yyless(yyleng - 3); yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); @@ -1718,7 +1711,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zendlval->type = IS_STRING; return T_VARIABLE; } -#line 1722 "Zend/zend_language_scanner.c" +#line 1715 "Zend/zend_language_scanner.c" } /* *********************************** */ yyc_ST_DOUBLE_QUOTES: @@ -1786,7 +1779,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy78: YYDEBUG(78, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2140 "Zend/zend_language_scanner.l" +#line 2133 "Zend/zend_language_scanner.l" { if (GET_DOUBLE_QUOTES_SCANNED_LENGTH()) { YYCURSOR += GET_DOUBLE_QUOTES_SCANNED_LENGTH() - 1; @@ -1835,7 +1828,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zend_scan_escape_string(zendlval, yytext, yyleng, '"' TSRMLS_CC); return T_ENCAPSED_AND_WHITESPACE; } -#line 1839 "Zend/zend_language_scanner.c" +#line 1832 "Zend/zend_language_scanner.c" yy79: YYDEBUG(79, *YYCURSOR); yych = *++YYCURSOR; @@ -1846,12 +1839,12 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(81, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2129 "Zend/zend_language_scanner.l" +#line 2122 "Zend/zend_language_scanner.l" { BEGIN(ST_IN_SCRIPTING); return '"'; } -#line 1855 "Zend/zend_language_scanner.c" +#line 1848 "Zend/zend_language_scanner.c" yy82: YYDEBUG(82, *YYCURSOR); yych = *++YYCURSOR; @@ -1861,14 +1854,14 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(84, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2121 "Zend/zend_language_scanner.l" +#line 2114 "Zend/zend_language_scanner.l" { Z_LVAL_P(zendlval) = (long) '{'; yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); yyless(1); return T_CURLY_OPEN; } -#line 1872 "Zend/zend_language_scanner.c" +#line 1865 "Zend/zend_language_scanner.c" yy85: YYDEBUG(85, *YYCURSOR); yyaccept = 0; @@ -1884,24 +1877,24 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy87: YYDEBUG(87, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1827 "Zend/zend_language_scanner.l" +#line 1820 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; return T_VARIABLE; } -#line 1894 "Zend/zend_language_scanner.c" +#line 1887 "Zend/zend_language_scanner.c" yy88: YYDEBUG(88, *YYCURSOR); ++YYCURSOR; YYDEBUG(89, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1461 "Zend/zend_language_scanner.l" +#line 1454 "Zend/zend_language_scanner.l" { yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC); return T_DOLLAR_OPEN_CURLY_BRACES; } -#line 1905 "Zend/zend_language_scanner.c" +#line 1898 "Zend/zend_language_scanner.c" yy90: YYDEBUG(90, *YYCURSOR); yych = *++YYCURSOR; @@ -1915,7 +1908,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(93, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1819 "Zend/zend_language_scanner.l" +#line 1812 "Zend/zend_language_scanner.l" { yyless(yyleng - 1); yy_push_state(ST_VAR_OFFSET TSRMLS_CC); @@ -1923,7 +1916,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zendlval->type = IS_STRING; return T_VARIABLE; } -#line 1927 "Zend/zend_language_scanner.c" +#line 1920 "Zend/zend_language_scanner.c" yy94: YYDEBUG(94, *YYCURSOR); yych = *++YYCURSOR; @@ -1941,7 +1934,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(96, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1809 "Zend/zend_language_scanner.l" +#line 1802 "Zend/zend_language_scanner.l" { yyless(yyleng - 3); yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); @@ -1949,7 +1942,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zendlval->type = IS_STRING; return T_VARIABLE; } -#line 1953 "Zend/zend_language_scanner.c" +#line 1946 "Zend/zend_language_scanner.c" } /* *********************************** */ yyc_ST_END_HEREDOC: @@ -1960,7 +1953,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(100, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2107 "Zend/zend_language_scanner.l" +#line 2100 "Zend/zend_language_scanner.l" { zend_heredoc_label *heredoc_label = zend_ptr_stack_pop(&SCNG(heredoc_label_stack)); @@ -1973,7 +1966,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) BEGIN(ST_IN_SCRIPTING); return T_END_HEREDOC; } -#line 1977 "Zend/zend_language_scanner.c" +#line 1970 "Zend/zend_language_scanner.c" /* *********************************** */ yyc_ST_HEREDOC: { @@ -2035,7 +2028,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy104: YYDEBUG(104, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2232 "Zend/zend_language_scanner.l" +#line 2225 "Zend/zend_language_scanner.l" { int newline = 0; @@ -2108,7 +2101,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zend_scan_escape_string(zendlval, yytext, yyleng - newline, 0 TSRMLS_CC); return T_ENCAPSED_AND_WHITESPACE; } -#line 2112 "Zend/zend_language_scanner.c" +#line 2105 "Zend/zend_language_scanner.c" yy105: YYDEBUG(105, *YYCURSOR); yych = *++YYCURSOR; @@ -2123,14 +2116,14 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(108, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2121 "Zend/zend_language_scanner.l" +#line 2114 "Zend/zend_language_scanner.l" { Z_LVAL_P(zendlval) = (long) '{'; yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); yyless(1); return T_CURLY_OPEN; } -#line 2134 "Zend/zend_language_scanner.c" +#line 2127 "Zend/zend_language_scanner.c" yy109: YYDEBUG(109, *YYCURSOR); yyaccept = 0; @@ -2146,24 +2139,24 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy111: YYDEBUG(111, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1827 "Zend/zend_language_scanner.l" +#line 1820 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; return T_VARIABLE; } -#line 2156 "Zend/zend_language_scanner.c" +#line 2149 "Zend/zend_language_scanner.c" yy112: YYDEBUG(112, *YYCURSOR); ++YYCURSOR; YYDEBUG(113, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1461 "Zend/zend_language_scanner.l" +#line 1454 "Zend/zend_language_scanner.l" { yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC); return T_DOLLAR_OPEN_CURLY_BRACES; } -#line 2167 "Zend/zend_language_scanner.c" +#line 2160 "Zend/zend_language_scanner.c" yy114: YYDEBUG(114, *YYCURSOR); yych = *++YYCURSOR; @@ -2177,7 +2170,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(117, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1819 "Zend/zend_language_scanner.l" +#line 1812 "Zend/zend_language_scanner.l" { yyless(yyleng - 1); yy_push_state(ST_VAR_OFFSET TSRMLS_CC); @@ -2185,7 +2178,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zendlval->type = IS_STRING; return T_VARIABLE; } -#line 2189 "Zend/zend_language_scanner.c" +#line 2182 "Zend/zend_language_scanner.c" yy118: YYDEBUG(118, *YYCURSOR); yych = *++YYCURSOR; @@ -2203,7 +2196,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(120, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1809 "Zend/zend_language_scanner.l" +#line 1802 "Zend/zend_language_scanner.l" { yyless(yyleng - 3); yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); @@ -2211,7 +2204,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zendlval->type = IS_STRING; return T_VARIABLE; } -#line 2215 "Zend/zend_language_scanner.c" +#line 2208 "Zend/zend_language_scanner.c" } /* *********************************** */ yyc_ST_IN_SCRIPTING: @@ -2394,13 +2387,13 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy124: YYDEBUG(124, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1850 "Zend/zend_language_scanner.l" +#line 1843 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, yytext, yyleng); zendlval->type = IS_STRING; return T_STRING; } -#line 2404 "Zend/zend_language_scanner.c" +#line 2397 "Zend/zend_language_scanner.c" yy125: YYDEBUG(125, *YYCURSOR); yych = *++YYCURSOR; @@ -2632,11 +2625,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy139: YYDEBUG(139, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1450 "Zend/zend_language_scanner.l" +#line 1443 "Zend/zend_language_scanner.l" { return yytext[0]; } -#line 2640 "Zend/zend_language_scanner.c" +#line 2633 "Zend/zend_language_scanner.c" yy140: YYDEBUG(140, *YYCURSOR); ++YYCURSOR; @@ -2645,13 +2638,13 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy141: YYDEBUG(141, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1183 "Zend/zend_language_scanner.l" +#line 1176 "Zend/zend_language_scanner.l" { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ HANDLE_NEWLINES(yytext, yyleng); return T_WHITESPACE; } -#line 2655 "Zend/zend_language_scanner.c" +#line 2648 "Zend/zend_language_scanner.c" yy142: YYDEBUG(142, *YYCURSOR); yych = *++YYCURSOR; @@ -2662,11 +2655,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(144, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1210 "Zend/zend_language_scanner.l" +#line 1203 "Zend/zend_language_scanner.l" { return T_NS_SEPARATOR; } -#line 2670 "Zend/zend_language_scanner.c" +#line 2663 "Zend/zend_language_scanner.c" yy145: YYDEBUG(145, *YYCURSOR); yych = *++YYCURSOR; @@ -2894,18 +2887,18 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(169, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1455 "Zend/zend_language_scanner.l" +#line 1448 "Zend/zend_language_scanner.l" { yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); return '{'; } -#line 2903 "Zend/zend_language_scanner.c" +#line 2896 "Zend/zend_language_scanner.c" yy170: YYDEBUG(170, *YYCURSOR); ++YYCURSOR; YYDEBUG(171, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1467 "Zend/zend_language_scanner.l" +#line 1460 "Zend/zend_language_scanner.l" { RESET_DOC_COMMENT(); if (!zend_stack_is_empty(&SCNG(state_stack))) { @@ -2913,7 +2906,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } return '}'; } -#line 2917 "Zend/zend_language_scanner.c" +#line 2910 "Zend/zend_language_scanner.c" yy172: YYDEBUG(172, *YYCURSOR); yyaccept = 2; @@ -2941,7 +2934,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy173: YYDEBUG(173, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1517 "Zend/zend_language_scanner.l" +#line 1510 "Zend/zend_language_scanner.l" { if (yyleng < MAX_LENGTH_OF_LONG - 1) { /* Won't overflow */ Z_LVAL_P(zendlval) = strtol(yytext, NULL, 0); @@ -2962,7 +2955,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zendlval->type = IS_LONG; return T_LNUMBER; } -#line 2966 "Zend/zend_language_scanner.c" +#line 2959 "Zend/zend_language_scanner.c" yy174: YYDEBUG(174, *YYCURSOR); yyaccept = 2; @@ -2990,7 +2983,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy177: YYDEBUG(177, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1857 "Zend/zend_language_scanner.l" +#line 1850 "Zend/zend_language_scanner.l" { while (YYCURSOR < YYLIMIT) { switch (*YYCURSOR++) { @@ -3024,14 +3017,14 @@ int lex_scan(zval *zendlval TSRMLS_DC) return T_COMMENT; } -#line 3028 "Zend/zend_language_scanner.c" +#line 3021 "Zend/zend_language_scanner.c" yy178: YYDEBUG(178, *YYCURSOR); ++YYCURSOR; yy179: YYDEBUG(179, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1944 "Zend/zend_language_scanner.l" +#line 1937 "Zend/zend_language_scanner.l" { register char *s, *t; char *end; @@ -3097,14 +3090,14 @@ int lex_scan(zval *zendlval TSRMLS_DC) } return T_CONSTANT_ENCAPSED_STRING; } -#line 3101 "Zend/zend_language_scanner.c" +#line 3094 "Zend/zend_language_scanner.c" yy180: YYDEBUG(180, *YYCURSOR); ++YYCURSOR; yy181: YYDEBUG(181, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2011 "Zend/zend_language_scanner.l" +#line 2004 "Zend/zend_language_scanner.l" { int bprefix = (yytext[0] != '"') ? 1 : 0; @@ -3145,24 +3138,24 @@ int lex_scan(zval *zendlval TSRMLS_DC) BEGIN(ST_DOUBLE_QUOTES); return '"'; } -#line 3149 "Zend/zend_language_scanner.c" +#line 3142 "Zend/zend_language_scanner.c" yy182: YYDEBUG(182, *YYCURSOR); ++YYCURSOR; YYDEBUG(183, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2101 "Zend/zend_language_scanner.l" +#line 2094 "Zend/zend_language_scanner.l" { BEGIN(ST_BACKQUOTE); return '`'; } -#line 3160 "Zend/zend_language_scanner.c" +#line 3153 "Zend/zend_language_scanner.c" yy184: YYDEBUG(184, *YYCURSOR); ++YYCURSOR; YYDEBUG(185, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2364 "Zend/zend_language_scanner.l" +#line 2357 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { return 0; @@ -3171,7 +3164,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE); goto restart; } -#line 3175 "Zend/zend_language_scanner.c" +#line 3168 "Zend/zend_language_scanner.c" yy186: YYDEBUG(186, *YYCURSOR); ++YYCURSOR; @@ -3198,12 +3191,12 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy190: YYDEBUG(190, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1576 "Zend/zend_language_scanner.l" +#line 1569 "Zend/zend_language_scanner.l" { ZVAL_DOUBLE(zendlval, zend_strtod(yytext, NULL)); return T_DNUMBER; } -#line 3207 "Zend/zend_language_scanner.c" +#line 3200 "Zend/zend_language_scanner.c" yy191: YYDEBUG(191, *YYCURSOR); yyaccept = 2; @@ -3295,7 +3288,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(202, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1493 "Zend/zend_language_scanner.l" +#line 1486 "Zend/zend_language_scanner.l" { char *bin = yytext + 2; /* Skip "0b" */ int len = yyleng - 2; @@ -3319,7 +3312,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) return T_DNUMBER; } } -#line 3323 "Zend/zend_language_scanner.c" +#line 3316 "Zend/zend_language_scanner.c" yy203: YYDEBUG(203, *YYCURSOR); ++YYCURSOR; @@ -3331,7 +3324,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(205, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1538 "Zend/zend_language_scanner.l" +#line 1531 "Zend/zend_language_scanner.l" { char *hex = yytext + 2; /* Skip "0x" */ int len = yyleng - 2; @@ -3355,7 +3348,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) return T_DNUMBER; } } -#line 3359 "Zend/zend_language_scanner.c" +#line 3352 "Zend/zend_language_scanner.c" yy206: YYDEBUG(206, *YYCURSOR); ++YYCURSOR; @@ -3364,13 +3357,13 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy207: YYDEBUG(207, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1925 "Zend/zend_language_scanner.l" +#line 1918 "Zend/zend_language_scanner.l" { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ BEGIN(INITIAL); return T_CLOSE_TAG; /* implicit ';' at php-end tag */ } -#line 3374 "Zend/zend_language_scanner.c" +#line 3367 "Zend/zend_language_scanner.c" yy208: YYDEBUG(208, *YYCURSOR); yych = *++YYCURSOR; @@ -3404,13 +3397,13 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy212: YYDEBUG(212, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1827 "Zend/zend_language_scanner.l" +#line 1820 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; return T_VARIABLE; } -#line 3414 "Zend/zend_language_scanner.c" +#line 3407 "Zend/zend_language_scanner.c" yy213: YYDEBUG(213, *YYCURSOR); yych = *++YYCURSOR; @@ -3424,11 +3417,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(215, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1438 "Zend/zend_language_scanner.l" +#line 1431 "Zend/zend_language_scanner.l" { return T_LOGICAL_XOR; } -#line 3432 "Zend/zend_language_scanner.c" +#line 3425 "Zend/zend_language_scanner.c" yy216: YYDEBUG(216, *YYCURSOR); ++YYCURSOR; @@ -3437,61 +3430,61 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(217, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1430 "Zend/zend_language_scanner.l" +#line 1423 "Zend/zend_language_scanner.l" { return T_LOGICAL_OR; } -#line 3445 "Zend/zend_language_scanner.c" +#line 3438 "Zend/zend_language_scanner.c" yy218: YYDEBUG(218, *YYCURSOR); ++YYCURSOR; YYDEBUG(219, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1418 "Zend/zend_language_scanner.l" +#line 1411 "Zend/zend_language_scanner.l" { return T_XOR_EQUAL; } -#line 3455 "Zend/zend_language_scanner.c" +#line 3448 "Zend/zend_language_scanner.c" yy220: YYDEBUG(220, *YYCURSOR); ++YYCURSOR; YYDEBUG(221, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1422 "Zend/zend_language_scanner.l" +#line 1415 "Zend/zend_language_scanner.l" { return T_BOOLEAN_OR; } -#line 3465 "Zend/zend_language_scanner.c" +#line 3458 "Zend/zend_language_scanner.c" yy222: YYDEBUG(222, *YYCURSOR); ++YYCURSOR; YYDEBUG(223, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1414 "Zend/zend_language_scanner.l" +#line 1407 "Zend/zend_language_scanner.l" { return T_OR_EQUAL; } -#line 3475 "Zend/zend_language_scanner.c" +#line 3468 "Zend/zend_language_scanner.c" yy224: YYDEBUG(224, *YYCURSOR); ++YYCURSOR; YYDEBUG(225, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1426 "Zend/zend_language_scanner.l" +#line 1419 "Zend/zend_language_scanner.l" { return T_BOOLEAN_AND; } -#line 3485 "Zend/zend_language_scanner.c" +#line 3478 "Zend/zend_language_scanner.c" yy226: YYDEBUG(226, *YYCURSOR); ++YYCURSOR; YYDEBUG(227, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1410 "Zend/zend_language_scanner.l" +#line 1403 "Zend/zend_language_scanner.l" { return T_AND_EQUAL; } -#line 3495 "Zend/zend_language_scanner.c" +#line 3488 "Zend/zend_language_scanner.c" yy228: YYDEBUG(228, *YYCURSOR); ++YYCURSOR; @@ -3500,7 +3493,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy229: YYDEBUG(229, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1932 "Zend/zend_language_scanner.l" +#line 1925 "Zend/zend_language_scanner.l" { if (CG(asp_tags)) { BEGIN(INITIAL); @@ -3511,17 +3504,17 @@ int lex_scan(zval *zendlval TSRMLS_DC) return yytext[0]; } } -#line 3515 "Zend/zend_language_scanner.c" +#line 3508 "Zend/zend_language_scanner.c" yy230: YYDEBUG(230, *YYCURSOR); ++YYCURSOR; YYDEBUG(231, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1398 "Zend/zend_language_scanner.l" +#line 1391 "Zend/zend_language_scanner.l" { return T_MOD_EQUAL; } -#line 3525 "Zend/zend_language_scanner.c" +#line 3518 "Zend/zend_language_scanner.c" yy232: YYDEBUG(232, *YYCURSOR); yych = *++YYCURSOR; @@ -3552,11 +3545,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(237, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1394 "Zend/zend_language_scanner.l" +#line 1387 "Zend/zend_language_scanner.l" { return T_CONCAT_EQUAL; } -#line 3560 "Zend/zend_language_scanner.c" +#line 3553 "Zend/zend_language_scanner.c" yy238: YYDEBUG(238, *YYCURSOR); yyaccept = 4; @@ -3565,7 +3558,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy239: YYDEBUG(239, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1891 "Zend/zend_language_scanner.l" +#line 1884 "Zend/zend_language_scanner.l" { int doc_com; @@ -3599,7 +3592,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) return T_COMMENT; } -#line 3603 "Zend/zend_language_scanner.c" +#line 3596 "Zend/zend_language_scanner.c" yy240: YYDEBUG(240, *YYCURSOR); yych = *++YYCURSOR; @@ -3609,11 +3602,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(242, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1390 "Zend/zend_language_scanner.l" +#line 1383 "Zend/zend_language_scanner.l" { return T_DIV_EQUAL; } -#line 3617 "Zend/zend_language_scanner.c" +#line 3610 "Zend/zend_language_scanner.c" yy243: YYDEBUG(243, *YYCURSOR); yych = *++YYCURSOR; @@ -3636,42 +3629,42 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(247, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1386 "Zend/zend_language_scanner.l" +#line 1379 "Zend/zend_language_scanner.l" { return T_MUL_EQUAL; } -#line 3644 "Zend/zend_language_scanner.c" +#line 3637 "Zend/zend_language_scanner.c" yy248: YYDEBUG(248, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) == '=') goto yy252; YYDEBUG(249, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1446 "Zend/zend_language_scanner.l" +#line 1439 "Zend/zend_language_scanner.l" { return T_SR; } -#line 3655 "Zend/zend_language_scanner.c" +#line 3648 "Zend/zend_language_scanner.c" yy250: YYDEBUG(250, *YYCURSOR); ++YYCURSOR; YYDEBUG(251, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1374 "Zend/zend_language_scanner.l" +#line 1367 "Zend/zend_language_scanner.l" { return T_IS_GREATER_OR_EQUAL; } -#line 3665 "Zend/zend_language_scanner.c" +#line 3658 "Zend/zend_language_scanner.c" yy252: YYDEBUG(252, *YYCURSOR); ++YYCURSOR; YYDEBUG(253, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1406 "Zend/zend_language_scanner.l" +#line 1399 "Zend/zend_language_scanner.l" { return T_SR_EQUAL; } -#line 3675 "Zend/zend_language_scanner.c" +#line 3668 "Zend/zend_language_scanner.c" yy254: YYDEBUG(254, *YYCURSOR); yyaccept = 5; @@ -3682,11 +3675,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy255: YYDEBUG(255, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1442 "Zend/zend_language_scanner.l" +#line 1435 "Zend/zend_language_scanner.l" { return T_SL; } -#line 3690 "Zend/zend_language_scanner.c" +#line 3683 "Zend/zend_language_scanner.c" yy256: YYDEBUG(256, *YYCURSOR); yych = *++YYCURSOR; @@ -3698,22 +3691,22 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(258, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1370 "Zend/zend_language_scanner.l" +#line 1363 "Zend/zend_language_scanner.l" { return T_IS_SMALLER_OR_EQUAL; } -#line 3706 "Zend/zend_language_scanner.c" +#line 3699 "Zend/zend_language_scanner.c" yy259: YYDEBUG(259, *YYCURSOR); ++YYCURSOR; yy260: YYDEBUG(260, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1366 "Zend/zend_language_scanner.l" +#line 1359 "Zend/zend_language_scanner.l" { return T_IS_NOT_EQUAL; } -#line 3717 "Zend/zend_language_scanner.c" +#line 3710 "Zend/zend_language_scanner.c" yy261: YYDEBUG(261, *YYCURSOR); yych = *++YYCURSOR; @@ -3764,11 +3757,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(269, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1402 "Zend/zend_language_scanner.l" +#line 1395 "Zend/zend_language_scanner.l" { return T_SL_EQUAL; } -#line 3772 "Zend/zend_language_scanner.c" +#line 3765 "Zend/zend_language_scanner.c" yy270: YYDEBUG(270, *YYCURSOR); ++YYCURSOR; @@ -3873,7 +3866,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy280: YYDEBUG(280, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2053 "Zend/zend_language_scanner.l" +#line 2046 "Zend/zend_language_scanner.l" { char *s; int bprefix = (yytext[0] != '<') ? 1 : 0; @@ -3920,7 +3913,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) return T_START_HEREDOC; } -#line 3924 "Zend/zend_language_scanner.c" +#line 3917 "Zend/zend_language_scanner.c" yy281: YYDEBUG(281, *YYCURSOR); yych = *++YYCURSOR; @@ -3960,31 +3953,31 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(286, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1358 "Zend/zend_language_scanner.l" +#line 1351 "Zend/zend_language_scanner.l" { return T_IS_NOT_IDENTICAL; } -#line 3968 "Zend/zend_language_scanner.c" +#line 3961 "Zend/zend_language_scanner.c" yy287: YYDEBUG(287, *YYCURSOR); ++YYCURSOR; YYDEBUG(288, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1378 "Zend/zend_language_scanner.l" +#line 1371 "Zend/zend_language_scanner.l" { return T_PLUS_EQUAL; } -#line 3978 "Zend/zend_language_scanner.c" +#line 3971 "Zend/zend_language_scanner.c" yy289: YYDEBUG(289, *YYCURSOR); ++YYCURSOR; YYDEBUG(290, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1346 "Zend/zend_language_scanner.l" +#line 1339 "Zend/zend_language_scanner.l" { return T_INC; } -#line 3988 "Zend/zend_language_scanner.c" +#line 3981 "Zend/zend_language_scanner.c" yy291: YYDEBUG(291, *YYCURSOR); yych = *++YYCURSOR; @@ -4003,42 +3996,42 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(294, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1334 "Zend/zend_language_scanner.l" +#line 1327 "Zend/zend_language_scanner.l" { return T_LIST; } -#line 4011 "Zend/zend_language_scanner.c" +#line 4004 "Zend/zend_language_scanner.c" yy295: YYDEBUG(295, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) == '=') goto yy299; YYDEBUG(296, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1362 "Zend/zend_language_scanner.l" +#line 1355 "Zend/zend_language_scanner.l" { return T_IS_EQUAL; } -#line 4022 "Zend/zend_language_scanner.c" +#line 4015 "Zend/zend_language_scanner.c" yy297: YYDEBUG(297, *YYCURSOR); ++YYCURSOR; YYDEBUG(298, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1330 "Zend/zend_language_scanner.l" +#line 1323 "Zend/zend_language_scanner.l" { return T_DOUBLE_ARROW; } -#line 4032 "Zend/zend_language_scanner.c" +#line 4025 "Zend/zend_language_scanner.c" yy299: YYDEBUG(299, *YYCURSOR); ++YYCURSOR; YYDEBUG(300, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1354 "Zend/zend_language_scanner.l" +#line 1347 "Zend/zend_language_scanner.l" { return T_IS_IDENTICAL; } -#line 4042 "Zend/zend_language_scanner.c" +#line 4035 "Zend/zend_language_scanner.c" yy301: YYDEBUG(301, *YYCURSOR); yych = *++YYCURSOR; @@ -4168,7 +4161,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(320, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1672 "Zend/zend_language_scanner.l" +#line 1665 "Zend/zend_language_scanner.l" { if (CG(current_namespace)) { *zendlval = *CG(current_namespace); @@ -4178,7 +4171,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } return T_NS_C; } -#line 4182 "Zend/zend_language_scanner.c" +#line 4175 "Zend/zend_language_scanner.c" yy321: YYDEBUG(321, *YYCURSOR); yych = *++YYCURSOR; @@ -4198,7 +4191,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(325, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1647 "Zend/zend_language_scanner.l" +#line 1640 "Zend/zend_language_scanner.l" { char *filename = zend_get_compiled_filename(TSRMLS_C); const size_t filename_len = strlen(filename); @@ -4223,7 +4216,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ZVAL_STRING(zendlval, dirname, 0); return T_DIR; } -#line 4227 "Zend/zend_language_scanner.c" +#line 4220 "Zend/zend_language_scanner.c" yy326: YYDEBUG(326, *YYCURSOR); yych = *++YYCURSOR; @@ -4248,12 +4241,12 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(331, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1632 "Zend/zend_language_scanner.l" +#line 1625 "Zend/zend_language_scanner.l" { ZVAL_LONG(zendlval, CG(zend_lineno)); return T_LINE; } -#line 4257 "Zend/zend_language_scanner.c" +#line 4250 "Zend/zend_language_scanner.c" yy332: YYDEBUG(332, *YYCURSOR); yych = *++YYCURSOR; @@ -4288,7 +4281,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(339, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1619 "Zend/zend_language_scanner.l" +#line 1612 "Zend/zend_language_scanner.l" { const char *class_name = CG(active_class_entry) ? CG(active_class_entry)->name : NULL; const char *func_name = CG(active_op_array)? CG(active_op_array)->function_name : NULL; @@ -4301,7 +4294,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zendlval->type = IS_STRING; return T_METHOD_C; } -#line 4305 "Zend/zend_language_scanner.c" +#line 4298 "Zend/zend_language_scanner.c" yy340: YYDEBUG(340, *YYCURSOR); yych = *++YYCURSOR; @@ -4352,7 +4345,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(350, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1609 "Zend/zend_language_scanner.l" +#line 1602 "Zend/zend_language_scanner.l" { zend_op_array *op_array = CG(active_op_array); if (op_array && op_array->function_name) { @@ -4362,7 +4355,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } return T_FUNC_C; } -#line 4366 "Zend/zend_language_scanner.c" +#line 4359 "Zend/zend_language_scanner.c" yy351: YYDEBUG(351, *YYCURSOR); yych = *++YYCURSOR; @@ -4382,7 +4375,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(355, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1637 "Zend/zend_language_scanner.l" +#line 1630 "Zend/zend_language_scanner.l" { char *filename = zend_get_compiled_filename(TSRMLS_C); @@ -4392,7 +4385,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ZVAL_STRING(zendlval, filename, 1); return T_FILE; } -#line 4396 "Zend/zend_language_scanner.c" +#line 4389 "Zend/zend_language_scanner.c" yy356: YYDEBUG(356, *YYCURSOR); yych = *++YYCURSOR; @@ -4422,7 +4415,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(362, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1599 "Zend/zend_language_scanner.l" +#line 1592 "Zend/zend_language_scanner.l" { zend_class_entry *ce = CG(active_class_entry); if (ce && ce->name && ZEND_ACC_TRAIT == (ce->ce_flags & ZEND_ACC_TRAIT)) { @@ -4432,7 +4425,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } return T_TRAIT_C; } -#line 4436 "Zend/zend_language_scanner.c" +#line 4429 "Zend/zend_language_scanner.c" yy363: YYDEBUG(363, *YYCURSOR); yych = *++YYCURSOR; @@ -4462,7 +4455,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(369, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1581 "Zend/zend_language_scanner.l" +#line 1574 "Zend/zend_language_scanner.l" { zend_class_entry *ce = CG(active_class_entry); if (ce && ZEND_ACC_TRAIT == (ce->ce_flags & ZEND_ACC_TRAIT)) { @@ -4480,7 +4473,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } return T_CLASS_C; } -#line 4484 "Zend/zend_language_scanner.c" +#line 4477 "Zend/zend_language_scanner.c" yy370: YYDEBUG(370, *YYCURSOR); yych = *++YYCURSOR; @@ -4542,11 +4535,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(382, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1298 "Zend/zend_language_scanner.l" +#line 1291 "Zend/zend_language_scanner.l" { return T_HALT_COMPILER; } -#line 4550 "Zend/zend_language_scanner.c" +#line 4543 "Zend/zend_language_scanner.c" yy383: YYDEBUG(383, *YYCURSOR); yych = *++YYCURSOR; @@ -4566,11 +4559,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(386, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1278 "Zend/zend_language_scanner.l" +#line 1271 "Zend/zend_language_scanner.l" { return T_USE; } -#line 4574 "Zend/zend_language_scanner.c" +#line 4567 "Zend/zend_language_scanner.c" yy387: YYDEBUG(387, *YYCURSOR); yych = *++YYCURSOR; @@ -4589,11 +4582,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(390, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1326 "Zend/zend_language_scanner.l" +#line 1319 "Zend/zend_language_scanner.l" { return T_UNSET; } -#line 4597 "Zend/zend_language_scanner.c" +#line 4590 "Zend/zend_language_scanner.c" yy391: YYDEBUG(391, *YYCURSOR); ++YYCURSOR; @@ -4765,11 +4758,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(408, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1226 "Zend/zend_language_scanner.l" +#line 1219 "Zend/zend_language_scanner.l" { return T_INT_CAST; } -#line 4773 "Zend/zend_language_scanner.c" +#line 4766 "Zend/zend_language_scanner.c" yy409: YYDEBUG(409, *YYCURSOR); yych = *++YYCURSOR; @@ -4813,11 +4806,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(417, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1230 "Zend/zend_language_scanner.l" +#line 1223 "Zend/zend_language_scanner.l" { return T_DOUBLE_CAST; } -#line 4821 "Zend/zend_language_scanner.c" +#line 4814 "Zend/zend_language_scanner.c" yy418: YYDEBUG(418, *YYCURSOR); yych = *++YYCURSOR; @@ -4887,11 +4880,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(431, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1234 "Zend/zend_language_scanner.l" +#line 1227 "Zend/zend_language_scanner.l" { return T_STRING_CAST; } -#line 4895 "Zend/zend_language_scanner.c" +#line 4888 "Zend/zend_language_scanner.c" yy432: YYDEBUG(432, *YYCURSOR); yych = *++YYCURSOR; @@ -4924,11 +4917,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(438, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1238 "Zend/zend_language_scanner.l" +#line 1231 "Zend/zend_language_scanner.l" { return T_ARRAY_CAST; } -#line 4932 "Zend/zend_language_scanner.c" +#line 4925 "Zend/zend_language_scanner.c" yy439: YYDEBUG(439, *YYCURSOR); yych = *++YYCURSOR; @@ -4966,11 +4959,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(446, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1242 "Zend/zend_language_scanner.l" +#line 1235 "Zend/zend_language_scanner.l" { return T_OBJECT_CAST; } -#line 4974 "Zend/zend_language_scanner.c" +#line 4967 "Zend/zend_language_scanner.c" yy447: YYDEBUG(447, *YYCURSOR); yych = *++YYCURSOR; @@ -5011,11 +5004,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(454, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1246 "Zend/zend_language_scanner.l" +#line 1239 "Zend/zend_language_scanner.l" { return T_BOOL_CAST; } -#line 5019 "Zend/zend_language_scanner.c" +#line 5012 "Zend/zend_language_scanner.c" yy455: YYDEBUG(455, *YYCURSOR); yych = *++YYCURSOR; @@ -5075,11 +5068,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(466, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1250 "Zend/zend_language_scanner.l" +#line 1243 "Zend/zend_language_scanner.l" { return T_UNSET_CAST; } -#line 5083 "Zend/zend_language_scanner.c" +#line 5076 "Zend/zend_language_scanner.c" yy467: YYDEBUG(467, *YYCURSOR); yych = *++YYCURSOR; @@ -5093,11 +5086,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(469, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1222 "Zend/zend_language_scanner.l" +#line 1215 "Zend/zend_language_scanner.l" { return T_VAR; } -#line 5101 "Zend/zend_language_scanner.c" +#line 5094 "Zend/zend_language_scanner.c" yy470: YYDEBUG(470, *YYCURSOR); yych = *++YYCURSOR; @@ -5117,11 +5110,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(473, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1214 "Zend/zend_language_scanner.l" +#line 1207 "Zend/zend_language_scanner.l" { return T_NEW; } -#line 5125 "Zend/zend_language_scanner.c" +#line 5118 "Zend/zend_language_scanner.c" yy474: YYDEBUG(474, *YYCURSOR); yych = *++YYCURSOR; @@ -5160,21 +5153,21 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(481, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1274 "Zend/zend_language_scanner.l" +#line 1267 "Zend/zend_language_scanner.l" { return T_NAMESPACE; } -#line 5168 "Zend/zend_language_scanner.c" +#line 5161 "Zend/zend_language_scanner.c" yy482: YYDEBUG(482, *YYCURSOR); ++YYCURSOR; YYDEBUG(483, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1206 "Zend/zend_language_scanner.l" +#line 1199 "Zend/zend_language_scanner.l" { return T_PAAMAYIM_NEKUDOTAYIM; } -#line 5178 "Zend/zend_language_scanner.c" +#line 5171 "Zend/zend_language_scanner.c" yy484: YYDEBUG(484, *YYCURSOR); ++YYCURSOR; @@ -5196,32 +5189,32 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(487, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1382 "Zend/zend_language_scanner.l" +#line 1375 "Zend/zend_language_scanner.l" { return T_MINUS_EQUAL; } -#line 5204 "Zend/zend_language_scanner.c" +#line 5197 "Zend/zend_language_scanner.c" yy488: YYDEBUG(488, *YYCURSOR); ++YYCURSOR; YYDEBUG(489, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1350 "Zend/zend_language_scanner.l" +#line 1343 "Zend/zend_language_scanner.l" { return T_DEC; } -#line 5214 "Zend/zend_language_scanner.c" +#line 5207 "Zend/zend_language_scanner.c" yy490: YYDEBUG(490, *YYCURSOR); ++YYCURSOR; YYDEBUG(491, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1178 "Zend/zend_language_scanner.l" +#line 1171 "Zend/zend_language_scanner.l" { yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); return T_OBJECT_OPERATOR; } -#line 5225 "Zend/zend_language_scanner.c" +#line 5218 "Zend/zend_language_scanner.c" yy492: YYDEBUG(492, *YYCURSOR); yych = *++YYCURSOR; @@ -5266,11 +5259,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(498, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1322 "Zend/zend_language_scanner.l" +#line 1315 "Zend/zend_language_scanner.l" { return T_PUBLIC; } -#line 5274 "Zend/zend_language_scanner.c" +#line 5267 "Zend/zend_language_scanner.c" yy499: YYDEBUG(499, *YYCURSOR); yych = *++YYCURSOR; @@ -5325,11 +5318,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(507, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1318 "Zend/zend_language_scanner.l" +#line 1311 "Zend/zend_language_scanner.l" { return T_PROTECTED; } -#line 5333 "Zend/zend_language_scanner.c" +#line 5326 "Zend/zend_language_scanner.c" yy508: YYDEBUG(508, *YYCURSOR); yych = *++YYCURSOR; @@ -5359,11 +5352,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(513, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1314 "Zend/zend_language_scanner.l" +#line 1307 "Zend/zend_language_scanner.l" { return T_PRIVATE; } -#line 5367 "Zend/zend_language_scanner.c" +#line 5360 "Zend/zend_language_scanner.c" yy514: YYDEBUG(514, *YYCURSOR); ++YYCURSOR; @@ -5372,11 +5365,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(515, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1154 "Zend/zend_language_scanner.l" +#line 1147 "Zend/zend_language_scanner.l" { return T_PRINT; } -#line 5380 "Zend/zend_language_scanner.c" +#line 5373 "Zend/zend_language_scanner.c" yy516: YYDEBUG(516, *YYCURSOR); yych = *++YYCURSOR; @@ -5401,11 +5394,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(520, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1146 "Zend/zend_language_scanner.l" +#line 1139 "Zend/zend_language_scanner.l" { return T_GOTO; } -#line 5409 "Zend/zend_language_scanner.c" +#line 5402 "Zend/zend_language_scanner.c" yy521: YYDEBUG(521, *YYCURSOR); yych = *++YYCURSOR; @@ -5429,11 +5422,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(525, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1286 "Zend/zend_language_scanner.l" +#line 1279 "Zend/zend_language_scanner.l" { return T_GLOBAL; } -#line 5437 "Zend/zend_language_scanner.c" +#line 5430 "Zend/zend_language_scanner.c" yy526: YYDEBUG(526, *YYCURSOR); yych = *++YYCURSOR; @@ -5470,11 +5463,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(533, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1138 "Zend/zend_language_scanner.l" +#line 1131 "Zend/zend_language_scanner.l" { return T_BREAK; } -#line 5478 "Zend/zend_language_scanner.c" +#line 5471 "Zend/zend_language_scanner.c" yy534: YYDEBUG(534, *YYCURSOR); yych = *++YYCURSOR; @@ -5514,11 +5507,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(541, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1122 "Zend/zend_language_scanner.l" +#line 1115 "Zend/zend_language_scanner.l" { return T_SWITCH; } -#line 5522 "Zend/zend_language_scanner.c" +#line 5515 "Zend/zend_language_scanner.c" yy542: YYDEBUG(542, *YYCURSOR); yych = *++YYCURSOR; @@ -5542,11 +5535,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(546, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1302 "Zend/zend_language_scanner.l" +#line 1295 "Zend/zend_language_scanner.l" { return T_STATIC; } -#line 5550 "Zend/zend_language_scanner.c" +#line 5543 "Zend/zend_language_scanner.c" yy547: YYDEBUG(547, *YYCURSOR); yych = *++YYCURSOR; @@ -5573,11 +5566,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(551, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1118 "Zend/zend_language_scanner.l" +#line 1111 "Zend/zend_language_scanner.l" { return T_AS; } -#line 5581 "Zend/zend_language_scanner.c" +#line 5574 "Zend/zend_language_scanner.c" yy552: YYDEBUG(552, *YYCURSOR); yych = *++YYCURSOR; @@ -5596,11 +5589,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(555, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1338 "Zend/zend_language_scanner.l" +#line 1331 "Zend/zend_language_scanner.l" { return T_ARRAY; } -#line 5604 "Zend/zend_language_scanner.c" +#line 5597 "Zend/zend_language_scanner.c" yy556: YYDEBUG(556, *YYCURSOR); ++YYCURSOR; @@ -5609,11 +5602,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(557, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1434 "Zend/zend_language_scanner.l" +#line 1427 "Zend/zend_language_scanner.l" { return T_LOGICAL_AND; } -#line 5617 "Zend/zend_language_scanner.c" +#line 5610 "Zend/zend_language_scanner.c" yy558: YYDEBUG(558, *YYCURSOR); yych = *++YYCURSOR; @@ -5647,11 +5640,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(564, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1306 "Zend/zend_language_scanner.l" +#line 1299 "Zend/zend_language_scanner.l" { return T_ABSTRACT; } -#line 5655 "Zend/zend_language_scanner.c" +#line 5648 "Zend/zend_language_scanner.c" yy565: YYDEBUG(565, *YYCURSOR); yych = *++YYCURSOR; @@ -5675,11 +5668,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(569, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1078 "Zend/zend_language_scanner.l" +#line 1071 "Zend/zend_language_scanner.l" { return T_WHILE; } -#line 5683 "Zend/zend_language_scanner.c" +#line 5676 "Zend/zend_language_scanner.c" yy570: YYDEBUG(570, *YYCURSOR); ++YYCURSOR; @@ -5688,11 +5681,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(571, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1062 "Zend/zend_language_scanner.l" +#line 1055 "Zend/zend_language_scanner.l" { return T_IF; } -#line 5696 "Zend/zend_language_scanner.c" +#line 5689 "Zend/zend_language_scanner.c" yy572: YYDEBUG(572, *YYCURSOR); yych = *++YYCURSOR; @@ -5744,11 +5737,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(578, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1290 "Zend/zend_language_scanner.l" +#line 1283 "Zend/zend_language_scanner.l" { return T_ISSET; } -#line 5752 "Zend/zend_language_scanner.c" +#line 5745 "Zend/zend_language_scanner.c" yy579: YYDEBUG(579, *YYCURSOR); yych = *++YYCURSOR; @@ -5802,11 +5795,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy586: YYDEBUG(586, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1258 "Zend/zend_language_scanner.l" +#line 1251 "Zend/zend_language_scanner.l" { return T_INCLUDE; } -#line 5810 "Zend/zend_language_scanner.c" +#line 5803 "Zend/zend_language_scanner.c" yy587: YYDEBUG(587, *YYCURSOR); yych = *++YYCURSOR; @@ -5835,11 +5828,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(592, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1262 "Zend/zend_language_scanner.l" +#line 1255 "Zend/zend_language_scanner.l" { return T_INCLUDE_ONCE; } -#line 5843 "Zend/zend_language_scanner.c" +#line 5836 "Zend/zend_language_scanner.c" yy593: YYDEBUG(593, *YYCURSOR); yych = *++YYCURSOR; @@ -5873,11 +5866,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(599, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1162 "Zend/zend_language_scanner.l" +#line 1155 "Zend/zend_language_scanner.l" { return T_INTERFACE; } -#line 5881 "Zend/zend_language_scanner.c" +#line 5874 "Zend/zend_language_scanner.c" yy600: YYDEBUG(600, *YYCURSOR); yych = *++YYCURSOR; @@ -5927,11 +5920,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(607, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1282 "Zend/zend_language_scanner.l" +#line 1275 "Zend/zend_language_scanner.l" { return T_INSTEADOF; } -#line 5935 "Zend/zend_language_scanner.c" +#line 5928 "Zend/zend_language_scanner.c" yy608: YYDEBUG(608, *YYCURSOR); yych = *++YYCURSOR; @@ -5960,11 +5953,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(613, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1114 "Zend/zend_language_scanner.l" +#line 1107 "Zend/zend_language_scanner.l" { return T_INSTANCEOF; } -#line 5968 "Zend/zend_language_scanner.c" +#line 5961 "Zend/zend_language_scanner.c" yy614: YYDEBUG(614, *YYCURSOR); yych = *++YYCURSOR; @@ -6008,11 +6001,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(622, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1174 "Zend/zend_language_scanner.l" +#line 1167 "Zend/zend_language_scanner.l" { return T_IMPLEMENTS; } -#line 6016 "Zend/zend_language_scanner.c" +#line 6009 "Zend/zend_language_scanner.c" yy623: YYDEBUG(623, *YYCURSOR); yych = *++YYCURSOR; @@ -6040,11 +6033,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(626, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1046 "Zend/zend_language_scanner.l" +#line 1039 "Zend/zend_language_scanner.l" { return T_TRY; } -#line 6048 "Zend/zend_language_scanner.c" +#line 6041 "Zend/zend_language_scanner.c" yy627: YYDEBUG(627, *YYCURSOR); yych = *++YYCURSOR; @@ -6063,11 +6056,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(630, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1166 "Zend/zend_language_scanner.l" +#line 1159 "Zend/zend_language_scanner.l" { return T_TRAIT; } -#line 6071 "Zend/zend_language_scanner.c" +#line 6064 "Zend/zend_language_scanner.c" yy631: YYDEBUG(631, *YYCURSOR); yych = *++YYCURSOR; @@ -6086,11 +6079,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(634, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1058 "Zend/zend_language_scanner.l" +#line 1051 "Zend/zend_language_scanner.l" { return T_THROW; } -#line 6094 "Zend/zend_language_scanner.c" +#line 6087 "Zend/zend_language_scanner.c" yy635: YYDEBUG(635, *YYCURSOR); yych = *++YYCURSOR; @@ -6114,11 +6107,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(639, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1042 "Zend/zend_language_scanner.l" +#line 1035 "Zend/zend_language_scanner.l" { return T_YIELD; } -#line 6122 "Zend/zend_language_scanner.c" +#line 6115 "Zend/zend_language_scanner.c" yy640: YYDEBUG(640, *YYCURSOR); yych = *++YYCURSOR; @@ -6179,11 +6172,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy647: YYDEBUG(647, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1266 "Zend/zend_language_scanner.l" +#line 1259 "Zend/zend_language_scanner.l" { return T_REQUIRE; } -#line 6187 "Zend/zend_language_scanner.c" +#line 6180 "Zend/zend_language_scanner.c" yy648: YYDEBUG(648, *YYCURSOR); yych = *++YYCURSOR; @@ -6212,11 +6205,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(653, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1270 "Zend/zend_language_scanner.l" +#line 1263 "Zend/zend_language_scanner.l" { return T_REQUIRE_ONCE; } -#line 6220 "Zend/zend_language_scanner.c" +#line 6213 "Zend/zend_language_scanner.c" yy654: YYDEBUG(654, *YYCURSOR); yych = *++YYCURSOR; @@ -6235,11 +6228,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(657, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1038 "Zend/zend_language_scanner.l" +#line 1031 "Zend/zend_language_scanner.l" { return T_RETURN; } -#line 6243 "Zend/zend_language_scanner.c" +#line 6236 "Zend/zend_language_scanner.c" yy658: YYDEBUG(658, *YYCURSOR); yych = *++YYCURSOR; @@ -6329,11 +6322,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(668, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1142 "Zend/zend_language_scanner.l" +#line 1135 "Zend/zend_language_scanner.l" { return T_CONTINUE; } -#line 6337 "Zend/zend_language_scanner.c" +#line 6330 "Zend/zend_language_scanner.c" yy669: YYDEBUG(669, *YYCURSOR); ++YYCURSOR; @@ -6342,11 +6335,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(670, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1034 "Zend/zend_language_scanner.l" +#line 1027 "Zend/zend_language_scanner.l" { return T_CONST; } -#line 6350 "Zend/zend_language_scanner.c" +#line 6343 "Zend/zend_language_scanner.c" yy671: YYDEBUG(671, *YYCURSOR); yych = *++YYCURSOR; @@ -6371,11 +6364,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(675, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1218 "Zend/zend_language_scanner.l" +#line 1211 "Zend/zend_language_scanner.l" { return T_CLONE; } -#line 6379 "Zend/zend_language_scanner.c" +#line 6372 "Zend/zend_language_scanner.c" yy676: YYDEBUG(676, *YYCURSOR); yych = *++YYCURSOR; @@ -6389,11 +6382,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(678, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1158 "Zend/zend_language_scanner.l" +#line 1151 "Zend/zend_language_scanner.l" { return T_CLASS; } -#line 6397 "Zend/zend_language_scanner.c" +#line 6390 "Zend/zend_language_scanner.c" yy679: YYDEBUG(679, *YYCURSOR); yych = *++YYCURSOR; @@ -6439,11 +6432,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(687, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1342 "Zend/zend_language_scanner.l" +#line 1335 "Zend/zend_language_scanner.l" { return T_CALLABLE; } -#line 6447 "Zend/zend_language_scanner.c" +#line 6440 "Zend/zend_language_scanner.c" yy688: YYDEBUG(688, *YYCURSOR); ++YYCURSOR; @@ -6452,11 +6445,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(689, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1130 "Zend/zend_language_scanner.l" +#line 1123 "Zend/zend_language_scanner.l" { return T_CASE; } -#line 6460 "Zend/zend_language_scanner.c" +#line 6453 "Zend/zend_language_scanner.c" yy690: YYDEBUG(690, *YYCURSOR); yych = *++YYCURSOR; @@ -6470,11 +6463,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(692, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1050 "Zend/zend_language_scanner.l" +#line 1043 "Zend/zend_language_scanner.l" { return T_CATCH; } -#line 6478 "Zend/zend_language_scanner.c" +#line 6471 "Zend/zend_language_scanner.c" yy693: YYDEBUG(693, *YYCURSOR); yych = *++YYCURSOR; @@ -6525,11 +6518,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(702, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1030 "Zend/zend_language_scanner.l" +#line 1023 "Zend/zend_language_scanner.l" { return T_FUNCTION; } -#line 6533 "Zend/zend_language_scanner.c" +#line 6526 "Zend/zend_language_scanner.c" yy703: YYDEBUG(703, *YYCURSOR); ++YYCURSOR; @@ -6553,11 +6546,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy704: YYDEBUG(704, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1090 "Zend/zend_language_scanner.l" +#line 1083 "Zend/zend_language_scanner.l" { return T_FOR; } -#line 6561 "Zend/zend_language_scanner.c" +#line 6554 "Zend/zend_language_scanner.c" yy705: YYDEBUG(705, *YYCURSOR); yych = *++YYCURSOR; @@ -6581,11 +6574,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(709, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1098 "Zend/zend_language_scanner.l" +#line 1091 "Zend/zend_language_scanner.l" { return T_FOREACH; } -#line 6589 "Zend/zend_language_scanner.c" +#line 6582 "Zend/zend_language_scanner.c" yy710: YYDEBUG(710, *YYCURSOR); yych = *++YYCURSOR; @@ -6619,11 +6612,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy713: YYDEBUG(713, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1310 "Zend/zend_language_scanner.l" +#line 1303 "Zend/zend_language_scanner.l" { return T_FINAL; } -#line 6627 "Zend/zend_language_scanner.c" +#line 6620 "Zend/zend_language_scanner.c" yy714: YYDEBUG(714, *YYCURSOR); yych = *++YYCURSOR; @@ -6637,11 +6630,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(716, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1054 "Zend/zend_language_scanner.l" +#line 1047 "Zend/zend_language_scanner.l" { return T_FINALLY; } -#line 6645 "Zend/zend_language_scanner.c" +#line 6638 "Zend/zend_language_scanner.c" yy717: YYDEBUG(717, *YYCURSOR); yych = *++YYCURSOR; @@ -6672,11 +6665,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(720, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1086 "Zend/zend_language_scanner.l" +#line 1079 "Zend/zend_language_scanner.l" { return T_DO; } -#line 6680 "Zend/zend_language_scanner.c" +#line 6673 "Zend/zend_language_scanner.c" yy721: YYDEBUG(721, *YYCURSOR); ++YYCURSOR; @@ -6685,11 +6678,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(722, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1026 "Zend/zend_language_scanner.l" +#line 1019 "Zend/zend_language_scanner.l" { return T_EXIT; } -#line 6693 "Zend/zend_language_scanner.c" +#line 6686 "Zend/zend_language_scanner.c" yy723: YYDEBUG(723, *YYCURSOR); yych = *++YYCURSOR; @@ -6724,11 +6717,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(729, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1134 "Zend/zend_language_scanner.l" +#line 1127 "Zend/zend_language_scanner.l" { return T_DEFAULT; } -#line 6732 "Zend/zend_language_scanner.c" +#line 6725 "Zend/zend_language_scanner.c" yy730: YYDEBUG(730, *YYCURSOR); yych = *++YYCURSOR; @@ -6752,11 +6745,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(734, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1106 "Zend/zend_language_scanner.l" +#line 1099 "Zend/zend_language_scanner.l" { return T_DECLARE; } -#line 6760 "Zend/zend_language_scanner.c" +#line 6753 "Zend/zend_language_scanner.c" yy735: YYDEBUG(735, *YYCURSOR); yych = *++YYCURSOR; @@ -6836,11 +6829,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(747, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1170 "Zend/zend_language_scanner.l" +#line 1163 "Zend/zend_language_scanner.l" { return T_EXTENDS; } -#line 6844 "Zend/zend_language_scanner.c" +#line 6837 "Zend/zend_language_scanner.c" yy748: YYDEBUG(748, *YYCURSOR); ++YYCURSOR; @@ -6849,11 +6842,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(749, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1022 "Zend/zend_language_scanner.l" +#line 1015 "Zend/zend_language_scanner.l" { return T_EXIT; } -#line 6857 "Zend/zend_language_scanner.c" +#line 6850 "Zend/zend_language_scanner.c" yy750: YYDEBUG(750, *YYCURSOR); yych = *++YYCURSOR; @@ -6867,11 +6860,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(752, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1254 "Zend/zend_language_scanner.l" +#line 1247 "Zend/zend_language_scanner.l" { return T_EVAL; } -#line 6875 "Zend/zend_language_scanner.c" +#line 6868 "Zend/zend_language_scanner.c" yy753: YYDEBUG(753, *YYCURSOR); yych = *++YYCURSOR; @@ -6941,11 +6934,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(763, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1082 "Zend/zend_language_scanner.l" +#line 1075 "Zend/zend_language_scanner.l" { return T_ENDWHILE; } -#line 6949 "Zend/zend_language_scanner.c" +#line 6942 "Zend/zend_language_scanner.c" yy764: YYDEBUG(764, *YYCURSOR); yych = *++YYCURSOR; @@ -6974,11 +6967,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(769, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1126 "Zend/zend_language_scanner.l" +#line 1119 "Zend/zend_language_scanner.l" { return T_ENDSWITCH; } -#line 6982 "Zend/zend_language_scanner.c" +#line 6975 "Zend/zend_language_scanner.c" yy770: YYDEBUG(770, *YYCURSOR); ++YYCURSOR; @@ -6987,11 +6980,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(771, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1070 "Zend/zend_language_scanner.l" +#line 1063 "Zend/zend_language_scanner.l" { return T_ENDIF; } -#line 6995 "Zend/zend_language_scanner.c" +#line 6988 "Zend/zend_language_scanner.c" yy772: YYDEBUG(772, *YYCURSOR); yych = *++YYCURSOR; @@ -7020,11 +7013,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy774: YYDEBUG(774, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1094 "Zend/zend_language_scanner.l" +#line 1087 "Zend/zend_language_scanner.l" { return T_ENDFOR; } -#line 7028 "Zend/zend_language_scanner.c" +#line 7021 "Zend/zend_language_scanner.c" yy775: YYDEBUG(775, *YYCURSOR); yych = *++YYCURSOR; @@ -7048,11 +7041,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(779, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1102 "Zend/zend_language_scanner.l" +#line 1095 "Zend/zend_language_scanner.l" { return T_ENDFOREACH; } -#line 7056 "Zend/zend_language_scanner.c" +#line 7049 "Zend/zend_language_scanner.c" yy780: YYDEBUG(780, *YYCURSOR); yych = *++YYCURSOR; @@ -7086,11 +7079,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(786, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1110 "Zend/zend_language_scanner.l" +#line 1103 "Zend/zend_language_scanner.l" { return T_ENDDECLARE; } -#line 7094 "Zend/zend_language_scanner.c" +#line 7087 "Zend/zend_language_scanner.c" yy787: YYDEBUG(787, *YYCURSOR); yych = *++YYCURSOR; @@ -7109,11 +7102,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(790, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1294 "Zend/zend_language_scanner.l" +#line 1287 "Zend/zend_language_scanner.l" { return T_EMPTY; } -#line 7117 "Zend/zend_language_scanner.c" +#line 7110 "Zend/zend_language_scanner.c" yy791: YYDEBUG(791, *YYCURSOR); yych = *++YYCURSOR; @@ -7142,11 +7135,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy793: YYDEBUG(793, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1074 "Zend/zend_language_scanner.l" +#line 1067 "Zend/zend_language_scanner.l" { return T_ELSE; } -#line 7150 "Zend/zend_language_scanner.c" +#line 7143 "Zend/zend_language_scanner.c" yy794: YYDEBUG(794, *YYCURSOR); yych = *++YYCURSOR; @@ -7160,11 +7153,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(796, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1066 "Zend/zend_language_scanner.l" +#line 1059 "Zend/zend_language_scanner.l" { return T_ELSEIF; } -#line 7168 "Zend/zend_language_scanner.c" +#line 7161 "Zend/zend_language_scanner.c" yy797: YYDEBUG(797, *YYCURSOR); yych = *++YYCURSOR; @@ -7178,11 +7171,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(799, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1150 "Zend/zend_language_scanner.l" +#line 1143 "Zend/zend_language_scanner.l" { return T_ECHO; } -#line 7186 "Zend/zend_language_scanner.c" +#line 7179 "Zend/zend_language_scanner.c" } /* *********************************** */ yyc_ST_LOOKING_FOR_PROPERTY: @@ -7255,13 +7248,13 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy803: YYDEBUG(803, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1183 "Zend/zend_language_scanner.l" +#line 1176 "Zend/zend_language_scanner.l" { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ HANDLE_NEWLINES(yytext, yyleng); return T_WHITESPACE; } -#line 7265 "Zend/zend_language_scanner.c" +#line 7258 "Zend/zend_language_scanner.c" yy804: YYDEBUG(804, *YYCURSOR); ++YYCURSOR; @@ -7269,13 +7262,13 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy805: YYDEBUG(805, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1200 "Zend/zend_language_scanner.l" +#line 1193 "Zend/zend_language_scanner.l" { yyless(0); yy_pop_state(TSRMLS_C); goto restart; } -#line 7279 "Zend/zend_language_scanner.c" +#line 7272 "Zend/zend_language_scanner.c" yy806: YYDEBUG(806, *YYCURSOR); ++YYCURSOR; @@ -7284,14 +7277,14 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy807: YYDEBUG(807, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1193 "Zend/zend_language_scanner.l" +#line 1186 "Zend/zend_language_scanner.l" { yy_pop_state(TSRMLS_C); zend_copy_value(zendlval, yytext, yyleng); zendlval->type = IS_STRING; return T_STRING; } -#line 7295 "Zend/zend_language_scanner.c" +#line 7288 "Zend/zend_language_scanner.c" yy808: YYDEBUG(808, *YYCURSOR); yych = *++YYCURSOR; @@ -7312,11 +7305,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(812, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1189 "Zend/zend_language_scanner.l" +#line 1182 "Zend/zend_language_scanner.l" { return T_OBJECT_OPERATOR; } -#line 7320 "Zend/zend_language_scanner.c" +#line 7313 "Zend/zend_language_scanner.c" yy813: YYDEBUG(813, *YYCURSOR); ++YYCURSOR; @@ -7401,14 +7394,14 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy818: YYDEBUG(818, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1486 "Zend/zend_language_scanner.l" +#line 1479 "Zend/zend_language_scanner.l" { yyless(0); yy_pop_state(TSRMLS_C); yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); goto restart; } -#line 7412 "Zend/zend_language_scanner.c" +#line 7405 "Zend/zend_language_scanner.c" yy819: YYDEBUG(819, *YYCURSOR); yych = *++YYCURSOR; @@ -7433,7 +7426,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(824, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1476 "Zend/zend_language_scanner.l" +#line 1469 "Zend/zend_language_scanner.l" { yyless(yyleng - 1); zend_copy_value(zendlval, yytext, yyleng); @@ -7442,7 +7435,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); return T_STRING_VARNAME; } -#line 7446 "Zend/zend_language_scanner.c" +#line 7439 "Zend/zend_language_scanner.c" } /* *********************************** */ yyc_ST_NOWDOC: @@ -7453,7 +7446,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(828, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2306 "Zend/zend_language_scanner.l" +#line 2299 "Zend/zend_language_scanner.l" { int newline = 0; @@ -7510,7 +7503,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) HANDLE_NEWLINES(yytext, yyleng - newline); return T_ENCAPSED_AND_WHITESPACE; } -#line 7514 "Zend/zend_language_scanner.c" +#line 7507 "Zend/zend_language_scanner.c" /* *********************************** */ yyc_ST_VAR_OFFSET: { @@ -7617,7 +7610,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy832: YYDEBUG(832, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1562 "Zend/zend_language_scanner.l" +#line 1555 "Zend/zend_language_scanner.l" { /* Offset could be treated as a long */ if (yyleng < MAX_LENGTH_OF_LONG - 1 || (yyleng == MAX_LENGTH_OF_LONG - 1 && strcmp(yytext, long_min_digits) < 0)) { ZVAL_LONG(zendlval, strtol(yytext, NULL, 10)); @@ -7626,7 +7619,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } return T_NUM_STRING; } -#line 7630 "Zend/zend_language_scanner.c" +#line 7623 "Zend/zend_language_scanner.c" yy833: YYDEBUG(833, *YYCURSOR); yych = *++YYCURSOR; @@ -7646,23 +7639,23 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy835: YYDEBUG(835, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1838 "Zend/zend_language_scanner.l" +#line 1831 "Zend/zend_language_scanner.l" { /* Only '[' can be valid, but returning other tokens will allow a more explicit parse error */ return yytext[0]; } -#line 7655 "Zend/zend_language_scanner.c" +#line 7648 "Zend/zend_language_scanner.c" yy836: YYDEBUG(836, *YYCURSOR); ++YYCURSOR; YYDEBUG(837, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1833 "Zend/zend_language_scanner.l" +#line 1826 "Zend/zend_language_scanner.l" { yy_pop_state(TSRMLS_C); return ']'; } -#line 7666 "Zend/zend_language_scanner.c" +#line 7659 "Zend/zend_language_scanner.c" yy838: YYDEBUG(838, *YYCURSOR); yych = *++YYCURSOR; @@ -7672,14 +7665,14 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(840, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1843 "Zend/zend_language_scanner.l" +#line 1836 "Zend/zend_language_scanner.l" { /* Invalid rule to return a more explicit parse error with proper line number */ yyless(0); yy_pop_state(TSRMLS_C); return T_ENCAPSED_AND_WHITESPACE; } -#line 7683 "Zend/zend_language_scanner.c" +#line 7676 "Zend/zend_language_scanner.c" yy841: YYDEBUG(841, *YYCURSOR); ++YYCURSOR; @@ -7688,19 +7681,19 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy842: YYDEBUG(842, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1850 "Zend/zend_language_scanner.l" +#line 1843 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, yytext, yyleng); zendlval->type = IS_STRING; return T_STRING; } -#line 7698 "Zend/zend_language_scanner.c" +#line 7691 "Zend/zend_language_scanner.c" yy843: YYDEBUG(843, *YYCURSOR); ++YYCURSOR; YYDEBUG(844, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2364 "Zend/zend_language_scanner.l" +#line 2357 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { return 0; @@ -7709,7 +7702,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE); goto restart; } -#line 7713 "Zend/zend_language_scanner.c" +#line 7706 "Zend/zend_language_scanner.c" yy845: YYDEBUG(845, *YYCURSOR); ++YYCURSOR; @@ -7745,13 +7738,13 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy849: YYDEBUG(849, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1827 "Zend/zend_language_scanner.l" +#line 1820 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; return T_VARIABLE; } -#line 7755 "Zend/zend_language_scanner.c" +#line 7748 "Zend/zend_language_scanner.c" yy850: YYDEBUG(850, *YYCURSOR); ++YYCURSOR; @@ -7791,12 +7784,12 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy857: YYDEBUG(857, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1571 "Zend/zend_language_scanner.l" +#line 1564 "Zend/zend_language_scanner.l" { /* Offset must be treated as a string */ ZVAL_STRINGL(zendlval, yytext, yyleng, 1); return T_NUM_STRING; } -#line 7800 "Zend/zend_language_scanner.c" +#line 7793 "Zend/zend_language_scanner.c" yy858: YYDEBUG(858, *YYCURSOR); ++YYCURSOR; @@ -7819,6 +7812,6 @@ int lex_scan(zval *zendlval TSRMLS_DC) goto yy857; } } -#line 2373 "Zend/zend_language_scanner.l" +#line 2366 "Zend/zend_language_scanner.l" } diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index 95d2d6246b9c6..f9c421fe8805a 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -653,15 +653,8 @@ ZEND_API int zend_prepare_string_for_scanning(zval *str, char *filename TSRMLS_D char *buf; size_t size; - /* enforce two trailing NULLs for flex... */ - if (IS_INTERNED(Z_STRVAL_P(str))) { - char *tmp = safe_emalloc(1, Z_STRLEN_P(str), ZEND_MMAP_AHEAD); - memcpy(tmp, Z_STRVAL_P(str), Z_STRLEN_P(str) + ZEND_MMAP_AHEAD); - Z_STRVAL_P(str) = tmp; - } else { - Z_STRVAL_P(str) = safe_erealloc(Z_STRVAL_P(str), 1, Z_STRLEN_P(str), ZEND_MMAP_AHEAD); - } - + /* enforce ZEND_MMAP_AHEAD trailing NULLs for flex... */ + Z_STRVAL_P(str) = str_erealloc(Z_STRVAL_P(str), Z_STRLEN_P(str) + ZEND_MMAP_AHEAD); memset(Z_STRVAL_P(str) + Z_STRLEN_P(str), 0, ZEND_MMAP_AHEAD); SCNG(yy_in) = NULL; diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 34237387b6b33..e8629291e545a 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -192,7 +192,7 @@ ZEND_API void convert_scalar_to_number(zval *op TSRMLS_DC) /* {{{ */ if ((Z_TYPE_P(op)=is_numeric_string(strval, Z_STRLEN_P(op), &Z_LVAL_P(op), &Z_DVAL_P(op), 1)) == 0) { ZVAL_LONG(op, 0); } - STR_FREE(strval); + str_efree(strval); break; } case IS_BOOL: @@ -391,7 +391,7 @@ ZEND_API void convert_to_long_base(zval *op, int base) /* {{{ */ char *strval = Z_STRVAL_P(op); Z_LVAL_P(op) = strtol(strval, NULL, base); - STR_FREE(strval); + str_efree(strval); } break; case IS_ARRAY: @@ -451,7 +451,7 @@ ZEND_API void convert_to_double(zval *op) /* {{{ */ char *strval = Z_STRVAL_P(op); Z_DVAL_P(op) = zend_strtod(strval, NULL); - STR_FREE(strval); + str_efree(strval); } break; case IS_ARRAY: @@ -540,7 +540,7 @@ ZEND_API void convert_to_boolean(zval *op) /* {{{ */ } else { Z_LVAL_P(op) = 1; } - STR_FREE(strval); + str_efree(strval); } break; case IS_ARRAY: @@ -1153,7 +1153,7 @@ ZEND_API int bitwise_or_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) / result_str[i] |= Z_STRVAL_P(shorter)[i]; } if (result==op1) { - STR_FREE(Z_STRVAL_P(result)); + str_efree(Z_STRVAL_P(result)); } Z_STRVAL_P(result) = result_str; Z_STRLEN_P(result) = result_len; @@ -1200,7 +1200,7 @@ ZEND_API int bitwise_and_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) result_str[i] &= Z_STRVAL_P(longer)[i]; } if (result==op1) { - STR_FREE(Z_STRVAL_P(result)); + str_efree(Z_STRVAL_P(result)); } Z_STRVAL_P(result) = result_str; Z_STRLEN_P(result) = result_len; @@ -1247,7 +1247,7 @@ ZEND_API int bitwise_xor_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) result_str[i] ^= Z_STRVAL_P(longer)[i]; } if (result==op1) { - STR_FREE(Z_STRVAL_P(result)); + str_efree(Z_STRVAL_P(result)); } Z_STRVAL_P(result) = result_str; Z_STRLEN_P(result) = result_len; @@ -1313,14 +1313,8 @@ ZEND_API int shift_right_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) ZEND_API int add_char_to_string(zval *result, const zval *op1, const zval *op2) /* {{{ */ { int length = Z_STRLEN_P(op1) + 1; - char *buf; + char *buf = str_erealloc(Z_STRVAL_P(op1), length + 1); - if (IS_INTERNED(Z_STRVAL_P(op1))) { - buf = (char *) emalloc(length + 1); - memcpy(buf, Z_STRVAL_P(op1), Z_STRLEN_P(op1)); - } else { - buf = (char *) erealloc(Z_STRVAL_P(op1), length + 1); - } buf[length - 1] = (char) Z_LVAL_P(op2); buf[length] = 0; ZVAL_STRINGL(result, buf, length, 0); @@ -1332,14 +1326,8 @@ ZEND_API int add_char_to_string(zval *result, const zval *op1, const zval *op2) ZEND_API int add_string_to_string(zval *result, const zval *op1, const zval *op2) /* {{{ */ { int length = Z_STRLEN_P(op1) + Z_STRLEN_P(op2); - char *buf; + char *buf = str_erealloc(Z_STRVAL_P(op1), length + 1); - if (IS_INTERNED(Z_STRVAL_P(op1))) { - buf = (char *) emalloc(length+1); - memcpy(buf, Z_STRVAL_P(op1), Z_STRLEN_P(op1)); - } else { - buf = (char *) erealloc(Z_STRVAL_P(op1), length+1); - } memcpy(buf + Z_STRLEN_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op2)); buf[length] = 0; ZVAL_STRINGL(result, buf, length, 0); @@ -1842,16 +1830,14 @@ static void increment_string(zval *str) /* {{{ */ int ch; if (Z_STRLEN_P(str) == 0) { - STR_FREE(Z_STRVAL_P(str)); + str_efree(Z_STRVAL_P(str)); Z_STRVAL_P(str) = estrndup("1", sizeof("1")-1); Z_STRLEN_P(str) = 1; return; } if (IS_INTERNED(s)) { - s = (char*) emalloc(Z_STRLEN_P(str) + 1); - memcpy(s, Z_STRVAL_P(str), Z_STRLEN_P(str) + 1); - Z_STRVAL_P(str) = s; + Z_STRVAL_P(str) = s = estrndup(s, Z_STRLEN_P(str)); } while (pos >= 0) { @@ -1909,7 +1895,7 @@ static void increment_string(zval *str) /* {{{ */ t[0] = 'a'; break; } - STR_FREE(Z_STRVAL_P(str)); + str_efree(Z_STRVAL_P(str)); Z_STRVAL_P(str) = t; } } @@ -1999,13 +1985,13 @@ ZEND_API int decrement_function(zval *op1) /* {{{ */ break; case IS_STRING: /* Like perl we only support string increment */ if (Z_STRLEN_P(op1) == 0) { /* consider as 0 */ - STR_FREE(Z_STRVAL_P(op1)); + str_efree(Z_STRVAL_P(op1)); ZVAL_LONG(op1, -1); break; } switch (is_numeric_string(Z_STRVAL_P(op1), Z_STRLEN_P(op1), &lval, &dval, 0)) { case IS_LONG: - STR_FREE(Z_STRVAL_P(op1)); + str_efree(Z_STRVAL_P(op1)); if (lval == LONG_MIN) { double d = (double)lval; ZVAL_DOUBLE(op1, d-1); @@ -2014,7 +2000,7 @@ ZEND_API int decrement_function(zval *op1) /* {{{ */ } break; case IS_DOUBLE: - STR_FREE(Z_STRVAL_P(op1)); + str_efree(Z_STRVAL_P(op1)); ZVAL_DOUBLE(op1, dval - 1); break; } diff --git a/Zend/zend_string.h b/Zend/zend_string.h index ebf8c816c11ff..725e069ed23a2 100644 --- a/Zend/zend_string.h +++ b/Zend/zend_string.h @@ -56,12 +56,39 @@ END_EXTERN_C() } \ } while (0) +#define str_efree_rel(s) do { \ + if (!IS_INTERNED(s)) { \ + efree_rel((char *)s); \ + } \ + } while (0) + #define str_free(s) do { \ if (!IS_INTERNED(s)) { \ free((char*)s); \ } \ } while (0) +#define str_erealloc(str, new_len) \ + (IS_INTERNED(str) \ + ? _str_erealloc(str, new_len, INTERNED_LEN(str)) \ + : erealloc(str, new_len)) + +static inline char *_str_erealloc(char *str, size_t new_len, size_t old_len) { + char *buf = emalloc(new_len); + memcpy(buf, str, old_len); + return buf; +} + +#define str_estrndup(str, len) \ + (IS_INTERNED(str) ? (str) : estrndup((str), (len))) + +#define str_strndup(str, len) \ + (IS_INTERNED(str) ? (str) : zend_strndup((str), (len))); + +#define str_hash(str, len) \ + (IS_INTERNED(str) ? INTERNED_HASH(str) : zend_hash_func((str), (len)+1)) + + #endif /* ZEND_STRING_H */ /* diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c index c0e1849eefa13..d82e1642e78b0 100644 --- a/Zend/zend_variables.c +++ b/Zend/zend_variables.c @@ -33,7 +33,7 @@ ZEND_API void _zval_dtor_func(zval *zvalue ZEND_FILE_LINE_DC) case IS_STRING: case IS_CONSTANT: CHECK_ZVAL_STRING_REL(zvalue); - STR_FREE_REL(zvalue->value.str.val); + str_efree_rel(zvalue->value.str.val); break; case IS_ARRAY: case IS_CONSTANT_ARRAY: { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 2bc80faa4e841..d95a3dc0a7476 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1052,10 +1052,8 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMP|VAR|CV, UNUSED|CONST| */ if (OP1_TYPE == IS_CONST) { hash_value = Z_HASH_P(varname); - } else if (IS_INTERNED(Z_STRVAL_P(varname))) { - hash_value = INTERNED_HASH(Z_STRVAL_P(varname)); } else { - hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1); + hash_value = str_hash(Z_STRVAL_P(varname), Z_STRLEN_P(varname)); } if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) { @@ -3640,11 +3638,7 @@ ZEND_VM_C_LABEL(num_index): hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, ZEND_VM_C_GOTO(num_index)); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL); break; @@ -3992,11 +3986,7 @@ ZEND_VM_HANDLER(75, ZEND_UNSET_DIM, VAR|UNUSED|CV, CONST|TMP|VAR|CV) hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, ZEND_VM_C_GOTO(num_index_dim)); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (ht == &EG(symbol_table)) { zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC); @@ -4513,11 +4503,7 @@ ZEND_VM_C_LABEL(num_index_prop): if (!prop_dim) { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, ZEND_VM_C_GOTO(num_index_prop)); } - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) { isset = 1; @@ -5194,7 +5180,7 @@ ZEND_VM_HANDLER(143, ZEND_DECLARE_CONST, CONST, CONST) zval_copy_ctor(&c.value); } c.flags = CONST_CS; /* non persistent, case sensetive */ - c.name = IS_INTERNED(Z_STRVAL_P(name)) ? Z_STRVAL_P(name) : zend_strndup(Z_STRVAL_P(name), Z_STRLEN_P(name)); + c.name = str_strndup(Z_STRVAL_P(name), Z_STRLEN_P(name)); c.name_len = Z_STRLEN_P(name)+1; c.module_number = PHP_USER_CONSTANT; diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 08fb84738298d..ac62b2982afb1 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -3397,10 +3397,8 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_CONST(int type */ if (IS_CONST == IS_CONST) { hash_value = Z_HASH_P(varname); - } else if (IS_INTERNED(Z_STRVAL_P(varname))) { - hash_value = INTERNED_HASH(Z_STRVAL_P(varname)); } else { - hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1); + hash_value = str_hash(Z_STRVAL_P(varname), Z_STRLEN_P(varname)); } if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) { @@ -3847,11 +3845,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST_HANDLER(ZEND_O hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL); break; @@ -4080,7 +4074,7 @@ static int ZEND_FASTCALL ZEND_DECLARE_CONST_SPEC_CONST_CONST_HANDLER(ZEND_OPCOD zval_copy_ctor(&c.value); } c.flags = CONST_CS; /* non persistent, case sensetive */ - c.name = IS_INTERNED(Z_STRVAL_P(name)) ? Z_STRVAL_P(name) : zend_strndup(Z_STRVAL_P(name), Z_STRLEN_P(name)); + c.name = str_strndup(Z_STRVAL_P(name), Z_STRLEN_P(name)); c.name_len = Z_STRLEN_P(name)+1; c.module_number = PHP_USER_CONSTANT; @@ -4744,11 +4738,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMP_HANDLER(ZEND_OPC hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL); break; @@ -5272,10 +5262,8 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_VAR(int type, */ if (IS_CONST == IS_CONST) { hash_value = Z_HASH_P(varname); - } else if (IS_INTERNED(Z_STRVAL_P(varname))) { - hash_value = INTERNED_HASH(Z_STRVAL_P(varname)); } else { - hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1); + hash_value = str_hash(Z_STRVAL_P(varname), Z_STRLEN_P(varname)); } if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) { @@ -5602,11 +5590,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_VAR_HANDLER(ZEND_OPC hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL); break; @@ -6018,10 +6002,8 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_UNUSED(int typ */ if (IS_CONST == IS_CONST) { hash_value = Z_HASH_P(varname); - } else if (IS_INTERNED(Z_STRVAL_P(varname))) { - hash_value = INTERNED_HASH(Z_STRVAL_P(varname)); } else { - hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1); + hash_value = str_hash(Z_STRVAL_P(varname), Z_STRLEN_P(varname)); } if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) { @@ -6307,11 +6289,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER(ZEND_ hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL); break; @@ -7241,11 +7219,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV_HANDLER(ZEND_OPCO hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL); break; @@ -8778,10 +8752,8 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_CONST(int type, */ if (IS_TMP_VAR == IS_CONST) { hash_value = Z_HASH_P(varname); - } else if (IS_INTERNED(Z_STRVAL_P(varname))) { - hash_value = INTERNED_HASH(Z_STRVAL_P(varname)); } else { - hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1); + hash_value = str_hash(Z_STRVAL_P(varname), Z_STRLEN_P(varname)); } if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) { @@ -9133,11 +9105,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST_HANDLER(ZEND_OPC hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL); break; @@ -9992,11 +9960,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMP_HANDLER(ZEND_OPCOD hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL); break; @@ -10520,10 +10484,8 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_VAR(int type, ZE */ if (IS_TMP_VAR == IS_CONST) { hash_value = Z_HASH_P(varname); - } else if (IS_INTERNED(Z_STRVAL_P(varname))) { - hash_value = INTERNED_HASH(Z_STRVAL_P(varname)); } else { - hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1); + hash_value = str_hash(Z_STRVAL_P(varname), Z_STRLEN_P(varname)); } if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) { @@ -10852,11 +10814,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL); break; @@ -11268,10 +11226,8 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_UNUSED(int type, */ if (IS_TMP_VAR == IS_CONST) { hash_value = Z_HASH_P(varname); - } else if (IS_INTERNED(Z_STRVAL_P(varname))) { - hash_value = INTERNED_HASH(Z_STRVAL_P(varname)); } else { - hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1); + hash_value = str_hash(Z_STRVAL_P(varname), Z_STRLEN_P(varname)); } if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) { @@ -11434,11 +11390,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED_HANDLER(ZEND_OP hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL); break; @@ -12290,11 +12242,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_HANDLER(ZEND_OPCODE hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL); break; @@ -14682,10 +14630,8 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_CONST(int type, */ if (IS_VAR == IS_CONST) { hash_value = Z_HASH_P(varname); - } else if (IS_INTERNED(Z_STRVAL_P(varname))) { - hash_value = INTERNED_HASH(Z_STRVAL_P(varname)); } else { - hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1); + hash_value = str_hash(Z_STRVAL_P(varname), Z_STRLEN_P(varname)); } if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) { @@ -15747,11 +15693,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST_HANDLER(ZEND_OPC hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL); break; @@ -15906,11 +15848,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAND hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (ht == &EG(symbol_table)) { zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC); @@ -16134,11 +16072,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CONST( if (!prop_dim) { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); } - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) { isset = 1; @@ -18004,11 +17938,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMP_HANDLER(ZEND_OPCOD hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL); break; @@ -18085,11 +18015,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLE hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (ht == &EG(symbol_table)) { zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC); @@ -18228,11 +18154,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_TMP(in if (!prop_dim) { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); } - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) { isset = 1; @@ -19291,10 +19213,8 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_VAR(int type, ZE */ if (IS_VAR == IS_CONST) { hash_value = Z_HASH_P(varname); - } else if (IS_INTERNED(Z_STRVAL_P(varname))) { - hash_value = INTERNED_HASH(Z_STRVAL_P(varname)); } else { - hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1); + hash_value = str_hash(Z_STRVAL_P(varname), Z_STRLEN_P(varname)); } if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) { @@ -20317,11 +20237,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL); break; @@ -20476,11 +20392,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (ht == &EG(symbol_table)) { zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC); @@ -20704,11 +20616,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(in if (!prop_dim) { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); } - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) { isset = 1; @@ -21285,10 +21193,8 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_UNUSED(int type, */ if (IS_VAR == IS_CONST) { hash_value = Z_HASH_P(varname); - } else if (IS_INTERNED(Z_STRVAL_P(varname))) { - hash_value = INTERNED_HASH(Z_STRVAL_P(varname)); } else { - hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1); + hash_value = str_hash(Z_STRVAL_P(varname), Z_STRLEN_P(varname)); } if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) { @@ -21742,11 +21648,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER(ZEND_OP hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL); break; @@ -23774,11 +23676,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL); break; @@ -23855,11 +23753,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (ht == &EG(symbol_table)) { zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC); @@ -23998,11 +23892,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CV(int if (!prop_dim) { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); } - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) { isset = 1; @@ -25367,11 +25257,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_H hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (ht == &EG(symbol_table)) { zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC); @@ -25508,11 +25394,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CON if (!prop_dim) { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); } - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) { isset = 1; @@ -26690,11 +26572,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HAN hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (ht == &EG(symbol_table)) { zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC); @@ -26831,11 +26709,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_TMP if (!prop_dim) { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); } - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) { isset = 1; @@ -28013,11 +27887,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HAN hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (ht == &EG(symbol_table)) { zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC); @@ -28154,11 +28024,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_VAR if (!prop_dim) { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); } - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) { isset = 1; @@ -29758,11 +29624,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HAND hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (ht == &EG(symbol_table)) { zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC); @@ -29899,11 +29761,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CV( if (!prop_dim) { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); } - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) { isset = 1; @@ -32193,10 +32051,8 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_CONST(int type, Z */ if (IS_CV == IS_CONST) { hash_value = Z_HASH_P(varname); - } else if (IS_INTERNED(Z_STRVAL_P(varname))) { - hash_value = INTERNED_HASH(Z_STRVAL_P(varname)); } else { - hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1); + hash_value = str_hash(Z_STRVAL_P(varname), Z_STRLEN_P(varname)); } if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) { @@ -33030,11 +32886,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST_HANDLER(ZEND_OPCO hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL); break; @@ -33189,11 +33041,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDL hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (ht == &EG(symbol_table)) { zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC); @@ -33415,11 +33263,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CONST(i if (!prop_dim) { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); } - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) { isset = 1; @@ -35150,11 +34994,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMP_HANDLER(ZEND_OPCODE hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL); break; @@ -35231,11 +35071,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (ht == &EG(symbol_table)) { zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC); @@ -35372,11 +35208,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_TMP(int if (!prop_dim) { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); } - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) { isset = 1; @@ -36431,10 +36263,8 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_VAR(int type, ZEN */ if (IS_CV == IS_CONST) { hash_value = Z_HASH_P(varname); - } else if (IS_INTERNED(Z_STRVAL_P(varname))) { - hash_value = INTERNED_HASH(Z_STRVAL_P(varname)); } else { - hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1); + hash_value = str_hash(Z_STRVAL_P(varname), Z_STRLEN_P(varname)); } if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) { @@ -37325,11 +37155,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_VAR_HANDLER(ZEND_OPCODE hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL); break; @@ -37484,11 +37310,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (ht == &EG(symbol_table)) { zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC); @@ -37710,11 +37532,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_VAR(int if (!prop_dim) { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); } - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) { isset = 1; @@ -38287,10 +38105,8 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_UNUSED(int type, */ if (IS_CV == IS_CONST) { hash_value = Z_HASH_P(varname); - } else if (IS_INTERNED(Z_STRVAL_P(varname))) { - hash_value = INTERNED_HASH(Z_STRVAL_P(varname)); } else { - hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1); + hash_value = str_hash(Z_STRVAL_P(varname), Z_STRLEN_P(varname)); } if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) { @@ -38620,11 +38436,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER(ZEND_OPC hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL); break; @@ -40497,11 +40309,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_ hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL); break; @@ -40578,11 +40386,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ hval = Z_HASH_P(offset); } else { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim); - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (ht == &EG(symbol_table)) { zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC); @@ -40719,11 +40523,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CV(int if (!prop_dim) { ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); } - if (IS_INTERNED(Z_STRVAL_P(offset))) { - hval = INTERNED_HASH(Z_STRVAL_P(offset)); - } else { - hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1); - } + hval = str_hash(Z_STRVAL_P(offset), Z_STRLEN_P(offset)); } if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) { isset = 1; From 91a9569d8525d2893c83199ac83f973fb91e243b Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 13 Sep 2013 20:01:23 +0200 Subject: [PATCH 103/400] Fix two warnings --- Zend/zend_builtin_functions.c | 3 +-- Zend/zend_compile.c | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index a0fa175dcc4f9..ed136f5e12917 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -1388,12 +1388,11 @@ ZEND_FUNCTION(function_exists) Creates an alias for user defined class */ ZEND_FUNCTION(class_alias) { - char *class_name, *lc_name, *alias_name; + char *class_name, *alias_name; zend_class_entry **ce; int class_name_len, alias_name_len; int found; zend_bool autoload = 1; - ALLOCA_FLAG(use_heap) if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|b", &class_name, &class_name_len, &alias_name, &alias_name_len, &autoload) == FAILURE) { return; diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 2dd8d03a4c664..672f62b7eefa3 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -3985,7 +3985,7 @@ static int zend_traits_copy_functions(zend_function *fn TSRMLS_DC, int num_args, } } - lcname = hash_key->arKey; + lcname = (char *) hash_key->arKey; if (exclude_table == NULL || zend_hash_find(exclude_table, lcname, fnname_len, &dummy) == FAILURE) { /* is not in hashtable, thus, function is not to be excluded */ From 39bd738fbffb1270494e3724a7f9d52b409c56dd Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 13 Sep 2013 20:49:09 +0200 Subject: [PATCH 104/400] Remove version checks in phar No need to keep around compatability code for PHP 5.0 and PHP 6. --- ext/phar/phar.c | 93 ------------- ext/phar/phar_internal.h | 61 +-------- ext/phar/phar_object.c | 78 +---------- ext/phar/stream.c | 12 -- ext/phar/util.c | 286 --------------------------------------- ext/phar/zip.c | 10 -- 6 files changed, 2 insertions(+), 538 deletions(-) diff --git a/ext/phar/phar.c b/ext/phar/phar.c index e8d1139cfa862..c0d23f154421a 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -27,9 +27,7 @@ static void destroy_phar_data(void *pDest); ZEND_DECLARE_MODULE_GLOBALS(phar) -#if PHP_VERSION_ID >= 50300 char *(*phar_save_resolve_path)(const char *filename, int filename_len TSRMLS_DC); -#endif /** * set's phar->is_writeable based on the current INI value @@ -3319,31 +3317,17 @@ static size_t phar_zend_stream_reader(void *handle, char *buf, size_t len TSRMLS } /* }}} */ -#if PHP_VERSION_ID >= 50300 static size_t phar_zend_stream_fsizer(void *handle TSRMLS_DC) /* {{{ */ { return ((phar_archive_data*)handle)->halt_offset + 32; } /* }}} */ -#else /* PHP_VERSION_ID */ - -static long phar_stream_fteller_for_zend(void *handle TSRMLS_DC) /* {{{ */ -{ - return (long)php_stream_tell(phar_get_pharfp((phar_archive_data*)handle TSRMLS_CC)); -} -/* }}} */ -#endif - zend_op_array *(*phar_orig_compile_file)(zend_file_handle *file_handle, int type TSRMLS_DC); -#if PHP_VERSION_ID >= 50300 #define phar_orig_zend_open zend_stream_open_function static char *phar_resolve_path(const char *filename, int filename_len TSRMLS_DC) { return phar_find_in_include_path((char *) filename, filename_len, NULL TSRMLS_CC); } -#else -int (*phar_orig_zend_open)(const char *filename, zend_file_handle *handle TSRMLS_DC); -#endif static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC) /* {{{ */ { @@ -3376,7 +3360,6 @@ static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type } } else if (phar->flags & PHAR_FILE_COMPRESSION_MASK) { /* compressed phar */ -#if PHP_VERSION_ID >= 50300 file_handle->type = ZEND_HANDLE_STREAM; /* we do our own reading directly from the phar, don't change the next line */ file_handle->handle.stream.handle = phar; @@ -3388,18 +3371,6 @@ static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type php_stream_rewind(PHAR_GLOBALS->cached_fp[phar->phar_pos].fp) : php_stream_rewind(phar->fp); memset(&file_handle->handle.stream.mmap, 0, sizeof(file_handle->handle.stream.mmap)); -#else /* PHP_VERSION_ID */ - file_handle->type = ZEND_HANDLE_STREAM; - /* we do our own reading directly from the phar, don't change the next line */ - file_handle->handle.stream.handle = phar; - file_handle->handle.stream.reader = phar_zend_stream_reader; - file_handle->handle.stream.closer = NULL; /* don't close - let phar handle this one */ - file_handle->handle.stream.fteller = phar_stream_fteller_for_zend; - file_handle->handle.stream.interactive = 0; - phar->is_persistent ? - php_stream_rewind(PHAR_GLOBALS->cached_fp[phar->phar_pos].fp) : - php_stream_rewind(phar->fp); -#endif } } } @@ -3424,60 +3395,6 @@ static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type } /* }}} */ -#if PHP_VERSION_ID < 50300 -int phar_zend_open(const char *filename, zend_file_handle *handle TSRMLS_DC) /* {{{ */ -{ - char *arch, *entry; - int arch_len, entry_len; - - /* this code is obsoleted in php 5.3 */ - entry = (char *) filename; - if (!IS_ABSOLUTE_PATH(entry, strlen(entry)) && !strstr(entry, "://")) { - phar_archive_data **pphar = NULL; - char *fname; - int fname_len; - - fname = (char*)zend_get_executed_filename(TSRMLS_C); - fname_len = strlen(fname); - - if (fname_len > 7 && !strncasecmp(fname, "phar://", 7)) { - if (SUCCESS == phar_split_fname(fname, fname_len, &arch, &arch_len, &entry, &entry_len, 1, 0 TSRMLS_CC)) { - zend_hash_find(&(PHAR_GLOBALS->phar_fname_map), arch, arch_len, (void **) &pphar); - if (!pphar && PHAR_G(manifest_cached)) { - zend_hash_find(&cached_phars, arch, arch_len, (void **) &pphar); - } - efree(arch); - efree(entry); - } - } - - /* retrieving an include within the current directory, so use this if possible */ - if (!(entry = phar_find_in_include_path((char *) filename, strlen(filename), NULL TSRMLS_CC))) { - /* this file is not in the phar, use the original path */ - goto skip_phar; - } - - if (SUCCESS == phar_orig_zend_open(entry, handle TSRMLS_CC)) { - if (!handle->opened_path) { - handle->opened_path = entry; - } - if (entry != filename) { - handle->free_filename = 1; - } - return SUCCESS; - } - - if (entry != filename) { - efree(entry); - } - - return FAILURE; - } -skip_phar: - return phar_orig_zend_open(filename, handle TSRMLS_CC); -} -/* }}} */ -#endif typedef zend_op_array* (zend_compile_t)(zend_file_handle*, int TSRMLS_DC); typedef zend_compile_t* (compile_hook)(zend_compile_t *ptr); @@ -3554,13 +3471,8 @@ PHP_MINIT_FUNCTION(phar) /* {{{ */ phar_orig_compile_file = zend_compile_file; zend_compile_file = phar_compile_file; -#if PHP_VERSION_ID >= 50300 phar_save_resolve_path = zend_resolve_path; zend_resolve_path = phar_resolve_path; -#else - phar_orig_zend_open = zend_stream_open_function; - zend_stream_open_function = phar_zend_open; -#endif phar_object_init(TSRMLS_C); @@ -3581,11 +3493,6 @@ PHP_MSHUTDOWN_FUNCTION(phar) /* {{{ */ zend_compile_file = phar_orig_compile_file; } -#if PHP_VERSION_ID < 50300 - if (zend_stream_open_function == phar_zend_open) { - zend_stream_open_function = phar_orig_zend_open; - } -#endif if (PHAR_G(manifest_cached)) { zend_hash_destroy(&(cached_phars)); zend_hash_destroy(&(cached_alias)); diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h index e0a9faf38fb2c..431628a50a4af 100644 --- a/ext/phar/phar_internal.h +++ b/ext/phar/phar_internal.h @@ -513,76 +513,17 @@ union _phar_entry_object { #endif #ifndef PHAR_MAIN -# if PHP_VERSION_ID >= 50300 extern char *(*phar_save_resolve_path)(const char *filename, int filename_len TSRMLS_DC); -# endif -#endif - -#if PHP_VERSION_ID < 50209 -static inline size_t phar_stream_copy_to_stream(php_stream *src, php_stream *dest, size_t maxlen, size_t *len STREAMS_DC TSRMLS_DC) -{ - size_t ret = php_stream_copy_to_stream(src, dest, maxlen); - if (len) { - *len = ret; - } - if (ret) { - return SUCCESS; - } - return FAILURE; -} -#else -# define phar_stream_copy_to_stream(src, dest, maxlen, len) _php_stream_copy_to_stream_ex((src), (dest), (maxlen), (len) STREAMS_CC TSRMLS_CC) - #endif -#if PHP_VERSION_ID >= 60000 -typedef zstr phar_zstr; -#define PHAR_STR(a, b) \ - spprintf(&b, 0, "%s", a.s); -#define PHAR_ZSTR(a, b) \ - b = ZSTR(a); -#define PHAR_STR_FREE(a) \ - efree(a); -static inline int phar_make_unicode(zstr *c_var, char *arKey, uint nKeyLength TSRMLS_DC) -{ - int c_var_len; - UConverter *conv = ZEND_U_CONVERTER(UG(runtime_encoding_conv)); +#define phar_stream_copy_to_stream(src, dest, maxlen, len) _php_stream_copy_to_stream_ex((src), (dest), (maxlen), (len) STREAMS_CC TSRMLS_CC) - c_var->u = NULL; - if (zend_string_to_unicode(conv, &c_var->u, &c_var_len, arKey, nKeyLength TSRMLS_CC) == FAILURE) { - - if (c_var->u) { - efree(c_var->u); - } - return 0; - - } - return c_var_len; -} -static inline int phar_find_key(HashTable *_SERVER, char *key, int len, void **stuff TSRMLS_DC) -{ - if (SUCCESS == zend_hash_find(_SERVER, key, len, stuff)) { - return 1; - } else { - int s = len; - zstr var; - s = phar_make_unicode(&var, key, len TSRMLS_CC); - if (SUCCESS == zend_u_hash_find(_SERVER, IS_UNICODE, var, s, stuff)) { - efree(var.u); - return 1; - } - efree(var.u); - return 0; - } -} -#else typedef char *phar_zstr; #define PHAR_STR(a, b) \ b = a; #define PHAR_ZSTR(a, b) \ b = a; #define PHAR_STR_FREE(a) -#endif BEGIN_EXTERN_C() diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index dcb67fe9fa6e4..7d2922fbaa15c 100644 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -685,11 +685,7 @@ PHP_METHOD(Phar, webPhar) ZVAL_STRINGL(params, entry, entry_len, 1); zp[0] = ¶ms; -#if PHP_VERSION_ID < 50300 - if (FAILURE == zend_fcall_info_init(rewrite, &fci, &fcc TSRMLS_CC)) { -#else if (FAILURE == zend_fcall_info_init(rewrite, 0, &fci, &fcc, NULL, NULL TSRMLS_CC)) { -#endif zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "phar error: invalid rewrite callback"); if (free_pathinfo) { @@ -701,11 +697,7 @@ PHP_METHOD(Phar, webPhar) fci.param_count = 1; fci.params = zp; -#if PHP_VERSION_ID < 50300 - ++(params->refcount); -#else Z_ADDREF_P(params); -#endif fci.retval_ptr_ptr = &retval_ptr; if (FAILURE == zend_call_function(&fci, &fcc TSRMLS_CC)) { @@ -729,11 +721,6 @@ PHP_METHOD(Phar, webPhar) } switch (Z_TYPE_P(retval_ptr)) { -#if PHP_VERSION_ID >= 60000 - case IS_UNICODE: - zval_unicode_to_string(retval_ptr TSRMLS_CC); - /* break intentionally omitted */ -#endif case IS_STRING: efree(entry); @@ -1155,11 +1142,7 @@ PHP_METHOD(Phar, __construct) #else char *fname, *alias = NULL, *error, *arch = NULL, *entry = NULL, *save_fname; int fname_len, alias_len = 0, arch_len, entry_len, is_data; -#if PHP_VERSION_ID < 50300 - long flags = 0; -#else long flags = SPL_FILE_DIR_SKIPDOTS|SPL_FILE_DIR_UNIXPATHS; -#endif long format = 0; phar_archive_object *phar_obj; phar_archive_data *phar_data; @@ -1459,11 +1442,6 @@ static int phar_build(zend_object_iterator *iter, void *puser TSRMLS_DC) /* {{{ } switch (Z_TYPE_PP(value)) { -#if PHP_VERSION_ID >= 60000 - case IS_UNICODE: - zval_unicode_to_string(*(value) TSRMLS_CC); - /* break intentionally omitted */ -#endif case IS_STRING: break; case IS_RESOURCE: @@ -1514,13 +1492,7 @@ static int phar_build(zend_object_iterator *iter, void *puser TSRMLS_DC) /* {{{ switch (intern->type) { case SPL_FS_DIR: -#if PHP_VERSION_ID >= 60000 - test = spl_filesystem_object_get_path(intern, NULL, NULL TSRMLS_CC).s; -#elif PHP_VERSION_ID >= 50300 test = spl_filesystem_object_get_path(intern, NULL TSRMLS_CC); -#else - test = intern->path; -#endif fname_len = spprintf(&fname, 0, "%s%c%s", test, DEFAULT_SLASH, intern->u.dir.entry.d_name); php_stat(fname, fname_len, FS_IS_DIR, &dummy TSRMLS_CC); @@ -1545,25 +1517,7 @@ static int phar_build(zend_object_iterator *iter, void *puser TSRMLS_DC) /* {{{ goto phar_spl_fileinfo; case SPL_FS_INFO: case SPL_FS_FILE: -#if PHP_VERSION_ID >= 60000 - if (intern->file_name_type == IS_UNICODE) { - zval zv; - - INIT_ZVAL(zv); - Z_UNIVAL(zv) = intern->file_name; - Z_UNILEN(zv) = intern->file_name_len; - Z_TYPE(zv) = IS_UNICODE; - - zval_copy_ctor(&zv); - zval_unicode_to_string(&zv TSRMLS_CC); - fname = expand_filepath(Z_STRVAL(zv), NULL TSRMLS_CC); - ezfree(Z_UNIVAL(zv)); - } else { - fname = expand_filepath(intern->file_name.s, NULL TSRMLS_CC); - } -#else fname = expand_filepath(intern->file_name, NULL TSRMLS_CC); -#endif if (!fname) { zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Could not resolve file path"); return ZEND_HASH_APPLY_STOP; @@ -1816,11 +1770,7 @@ PHP_METHOD(Phar, buildFromDirectory) INIT_PZVAL(&arg); ZVAL_STRINGL(&arg, dir, dir_len, 0); INIT_PZVAL(&arg2); -#if PHP_VERSION_ID < 50300 - ZVAL_LONG(&arg2, 0); -#else ZVAL_LONG(&arg2, SPL_FILE_DIR_SKIPDOTS|SPL_FILE_DIR_UNIXPATHS); -#endif zend_call_method_with_2_params(&iter, spl_ce_RecursiveDirectoryIterator, &spl_ce_RecursiveDirectoryIterator->constructor, "__construct", NULL, &arg, &arg2); @@ -2313,11 +2263,7 @@ static zval *phar_convert_to_other(phar_archive_data *source, int convert, char ALLOC_ZVAL(phar->metadata); *phar->metadata = *t; zval_copy_ctor(phar->metadata); -#if PHP_VERSION_ID < 50300 - phar->metadata->refcount = 1; -#else Z_SET_REFCOUNT_P(phar->metadata, 1); -#endif phar->metadata_len = 0; } @@ -2365,11 +2311,7 @@ static zval *phar_convert_to_other(phar_archive_data *source, int convert, char ALLOC_ZVAL(newentry.metadata); *newentry.metadata = *t; zval_copy_ctor(newentry.metadata); -#if PHP_VERSION_ID < 50300 - newentry.metadata->refcount = 1; -#else Z_SET_REFCOUNT_P(newentry.metadata, 1); -#endif newentry.metadata_str.c = NULL; newentry.metadata_str.len = 0; @@ -3552,11 +3494,7 @@ PHP_METHOD(Phar, copy) ALLOC_ZVAL(newentry.metadata); *newentry.metadata = *t; zval_copy_ctor(newentry.metadata); -#if PHP_VERSION_ID < 50300 - newentry.metadata->refcount = 1; -#else Z_SET_REFCOUNT_P(newentry.metadata, 1); -#endif newentry.metadata_str.c = NULL; newentry.metadata_str.len = 0; @@ -4371,11 +4309,6 @@ PHP_METHOD(Phar, extractTo) switch (Z_TYPE_P(zval_files)) { case IS_NULL: goto all_files; -#if PHP_VERSION_ID >= 60000 - case IS_UNICODE: - zval_unicode_to_string(zval_files TSRMLS_CC); - /* break intentionally omitted */ -#endif case IS_STRING: filename = Z_STRVAL_P(zval_files); filename_len = Z_STRLEN_P(zval_files); @@ -4389,11 +4322,6 @@ PHP_METHOD(Phar, extractTo) zval **zval_file; if (zend_hash_index_find(Z_ARRVAL_P(zval_files), i, (void **) &zval_file) == SUCCESS) { switch (Z_TYPE_PP(zval_file)) { -#if PHP_VERSION_ID >= 60000 - case IS_UNICODE: - zval_unicode_to_string(*(zval_file) TSRMLS_CC); - /* break intentionally omitted */ -#endif case IS_STRING: break; default: @@ -5414,11 +5342,7 @@ zend_function_entry phar_exception_methods[] = { #define REGISTER_PHAR_CLASS_CONST_LONG(class_name, const_name, value) \ zend_declare_class_constant_long(class_name, const_name, sizeof(const_name)-1, (long)value TSRMLS_CC); -#if PHP_VERSION_ID < 50200 -# define phar_exception_get_default() zend_exception_get_default() -#else -# define phar_exception_get_default() zend_exception_get_default(TSRMLS_C) -#endif +#define phar_exception_get_default() zend_exception_get_default(TSRMLS_C) void phar_object_init(TSRMLS_D) /* {{{ */ { diff --git a/ext/phar/stream.c b/ext/phar/stream.c index d3d4cd655b33c..74d7fc4814cde 100644 --- a/ext/phar/stream.c +++ b/ext/phar/stream.c @@ -942,11 +942,7 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from entry->filename_len = new_key_len; PHAR_ZSTR(new_str_key, new_key); -#if PHP_VERSION_ID < 50300 - zend_hash_update_current_key_ex(&phar->manifest, key_type, new_key, new_key_len, 0, NULL); -#else zend_hash_update_current_key_ex(&phar->manifest, key_type, new_key, new_key_len, 0, HASH_UPDATE_KEY_ANYWAY, NULL); -#endif } PHAR_STR_FREE(str_key); } @@ -968,11 +964,7 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from new_str_key[new_key_len] = 0; PHAR_ZSTR(new_str_key, new_key); -#if PHP_VERSION_ID < 50300 - zend_hash_update_current_key_ex(&phar->virtual_dirs, key_type, new_key, new_key_len, 0, NULL); -#else zend_hash_update_current_key_ex(&phar->virtual_dirs, key_type, new_key, new_key_len, 0, HASH_UPDATE_KEY_ANYWAY, NULL); -#endif efree(new_str_key); } PHAR_STR_FREE(str_key); @@ -996,11 +988,7 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from new_str_key[new_key_len] = 0; PHAR_ZSTR(new_str_key, new_key); -#if PHP_VERSION_ID < 50300 - zend_hash_update_current_key_ex(&phar->mounted_dirs, key_type, new_key, new_key_len, 0, NULL); -#else zend_hash_update_current_key_ex(&phar->mounted_dirs, key_type, new_key, new_key_len, 0, HASH_UPDATE_KEY_ANYWAY, NULL); -#endif efree(new_str_key); } PHAR_STR_FREE(str_key); diff --git a/ext/phar/util.c b/ext/phar/util.c index 38aa549f00d57..e115d0d584faf 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -41,10 +41,6 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, off_t end, char *key, int key_len, char **signature, int *signature_len TSRMLS_DC); #endif -#if !defined(PHP_VERSION_ID) || PHP_VERSION_ID < 50300 -extern php_stream_wrapper php_stream_phar_wrapper; -#endif - /* for links to relative location, prepend cwd of the entry */ static char *phar_get_link_location(phar_entry_info *entry TSRMLS_DC) /* {{{ */ { @@ -256,7 +252,6 @@ int phar_mount_entry(phar_archive_data *phar, char *filename, int filename_len, char *phar_find_in_include_path(char *filename, int filename_len, phar_archive_data **pphar TSRMLS_DC) /* {{{ */ { -#if PHP_VERSION_ID >= 50300 char *path, *fname, *arch, *entry, *ret, *test; int arch_len, entry_len, fname_len, ret_len; phar_archive_data *phar; @@ -344,223 +339,6 @@ char *phar_find_in_include_path(char *filename, int filename_len, phar_archive_d } return ret; -#else /* PHP 5.2 */ - char resolved_path[MAXPATHLEN]; - char trypath[MAXPATHLEN]; - char *ptr, *end, *path = PG(include_path); - php_stream_wrapper *wrapper; - const char *p; - int n = 0; - char *fname, *arch, *entry, *ret, *test; - int arch_len, entry_len; - phar_archive_data *phar = NULL; - - if (!filename) { - return NULL; - } - - if (!zend_is_executing(TSRMLS_C) || !PHAR_G(cwd)) { - goto doit; - } - - fname = (char*)zend_get_executed_filename(TSRMLS_C); - - if (SUCCESS != phar_split_fname(fname, strlen(fname), &arch, &arch_len, &entry, &entry_len, 1, 0 TSRMLS_CC)) { - goto doit; - } - - efree(entry); - - if (*filename == '.') { - int try_len; - - if (FAILURE == phar_get_archive(&phar, arch, arch_len, NULL, 0, NULL TSRMLS_CC)) { - efree(arch); - goto doit; - } - - try_len = filename_len; - test = phar_fix_filepath(estrndup(filename, filename_len), &try_len, 1 TSRMLS_CC); - - if (*test == '/') { - if (zend_hash_exists(&(phar->manifest), test + 1, try_len - 1)) { - spprintf(&ret, 0, "phar://%s%s", arch, test); - efree(arch); - efree(test); - return ret; - } - } else { - if (zend_hash_exists(&(phar->manifest), test, try_len)) { - spprintf(&ret, 0, "phar://%s/%s", arch, test); - efree(arch); - efree(test); - return ret; - } - } - - efree(test); - } - - efree(arch); -doit: - if (*filename == '.' || IS_ABSOLUTE_PATH(filename, filename_len) || !path || !*path) { - if (tsrm_realpath(filename, resolved_path TSRMLS_CC)) { - return estrdup(resolved_path); - } else { - return NULL; - } - } - - /* test for stream wrappers and return */ - for (p = filename; p - filename < filename_len && (isalnum((int)*p) || *p == '+' || *p == '-' || *p == '.'); ++p, ++n); - - if (n < filename_len - 3 && (*p == ':') && (!strncmp("//", p+1, 2) || ( filename_len > 4 && !memcmp("data", filename, 4)))) { - /* found stream wrapper, this is an absolute path until stream wrappers implement realpath */ - return estrndup(filename, filename_len); - } - - ptr = (char *) path; - while (ptr && *ptr) { - int len, is_stream_wrapper = 0, maybe_stream = 1; - - end = strchr(ptr, DEFAULT_DIR_SEPARATOR); -#ifndef PHP_WIN32 - /* search for stream wrapper */ - if (end - ptr <= 1) { - maybe_stream = 0; - goto not_stream; - } - - for (p = ptr, n = 0; p < end && (isalnum((int)*p) || *p == '+' || *p == '-' || *p == '.'); ++p, ++n); - - if (n == end - ptr && *p && !strncmp("//", p+1, 2)) { - is_stream_wrapper = 1; - /* seek to real end of include_path portion */ - end = strchr(end + 1, DEFAULT_DIR_SEPARATOR); - } else { - maybe_stream = 0; - } -not_stream: -#endif - if (end) { - if ((end-ptr) + 1 + filename_len + 1 >= MAXPATHLEN) { - ptr = end + 1; - continue; - } - - memcpy(trypath, ptr, end-ptr); - len = end-ptr; - trypath[end-ptr] = '/'; - memcpy(trypath+(end-ptr)+1, filename, filename_len+1); - ptr = end+1; - } else { - len = strlen(ptr); - - if (len + 1 + filename_len + 1 >= MAXPATHLEN) { - break; - } - - memcpy(trypath, ptr, len); - trypath[len] = '/'; - memcpy(trypath+len+1, filename, filename_len+1); - ptr = NULL; - } - - if (!is_stream_wrapper && maybe_stream) { - /* search for stream wrapper */ - for (p = trypath, n = 0; isalnum((int)*p) || *p == '+' || *p == '-' || *p == '.'; ++p, ++n); - } - - if (is_stream_wrapper || (n < len - 3 && (*p == ':') && (n > 1) && (!strncmp("//", p+1, 2) || !memcmp("data", trypath, 4)))) { - char *actual; - - wrapper = php_stream_locate_url_wrapper(trypath, &actual, STREAM_OPEN_FOR_INCLUDE TSRMLS_CC); - if (wrapper == &php_plain_files_wrapper) { - strlcpy(trypath, actual, sizeof(trypath)); - } else if (!wrapper) { - /* if wrapper is NULL, there was a mal-formed include_path stream wrapper, so skip this ptr */ - continue; - } else { - if (wrapper->wops->url_stat) { - php_stream_statbuf ssb; - - if (SUCCESS == wrapper->wops->url_stat(wrapper, trypath, 0, &ssb, NULL TSRMLS_CC)) { - if (wrapper == &php_stream_phar_wrapper) { - char *arch, *entry; - int arch_len, entry_len, ret_len; - - ret_len = strlen(trypath); - /* found phar:// */ - - if (SUCCESS != phar_split_fname(trypath, ret_len, &arch, &arch_len, &entry, &entry_len, 1, 0 TSRMLS_CC)) { - return estrndup(trypath, ret_len); - } - - zend_hash_find(&(PHAR_GLOBALS->phar_fname_map), arch, arch_len, (void **) &pphar); - - if (!pphar && PHAR_G(manifest_cached)) { - zend_hash_find(&cached_phars, arch, arch_len, (void **) &pphar); - } - - efree(arch); - efree(entry); - - return estrndup(trypath, ret_len); - } - return estrdup(trypath); - } - } - continue; - } - } - - if (tsrm_realpath(trypath, resolved_path TSRMLS_CC)) { - return estrdup(resolved_path); - } - } /* end provided path */ - - /* check in calling scripts' current working directory as a fall back case */ - if (zend_is_executing(TSRMLS_C)) { - char *exec_fname = (char*)zend_get_executed_filename(TSRMLS_C); - int exec_fname_length = strlen(exec_fname); - const char *p; - int n = 0; - - while ((--exec_fname_length >= 0) && !IS_SLASH(exec_fname[exec_fname_length])); - if (exec_fname && exec_fname[0] != '[' && - exec_fname_length > 0 && - exec_fname_length + 1 + filename_len + 1 < MAXPATHLEN) { - memcpy(trypath, exec_fname, exec_fname_length + 1); - memcpy(trypath+exec_fname_length + 1, filename, filename_len+1); - - /* search for stream wrapper */ - for (p = trypath; isalnum((int)*p) || *p == '+' || *p == '-' || *p == '.'; ++p, ++n); - - if (n < exec_fname_length - 3 && (*p == ':') && (n > 1) && (!strncmp("//", p+1, 2) || !memcmp("data", trypath, 4))) { - char *actual; - - wrapper = php_stream_locate_url_wrapper(trypath, &actual, STREAM_OPEN_FOR_INCLUDE TSRMLS_CC); - - if (wrapper == &php_plain_files_wrapper) { - /* this should never technically happen, but we'll leave it here for completeness */ - strlcpy(trypath, actual, sizeof(trypath)); - } else if (!wrapper) { - /* if wrapper is NULL, there was a malformed include_path stream wrapper - this also should be impossible */ - return NULL; - } else { - return estrdup(trypath); - } - } - - if (tsrm_realpath(trypath, resolved_path TSRMLS_CC)) { - return estrdup(resolved_path); - } - } - } - - return NULL; -#endif /* PHP 5.2 */ } /* }}} */ @@ -1031,47 +809,11 @@ int phar_open_entry_fp(phar_entry_info *entry, char **error, int follow_links TS } /* }}} */ -#if defined(PHP_VERSION_ID) && PHP_VERSION_ID < 50202 -typedef struct { - char *data; - size_t fpos; - size_t fsize; - size_t smax; - int mode; - php_stream **owner_ptr; -} php_stream_memory_data; -#endif - int phar_create_writeable_entry(phar_archive_data *phar, phar_entry_info *entry, char **error TSRMLS_DC) /* {{{ */ { if (entry->fp_type == PHAR_MOD) { /* already newly created, truncate */ -#if PHP_VERSION_ID >= 50202 php_stream_truncate_set_size(entry->fp, 0); -#else - if (php_stream_is(entry->fp, PHP_STREAM_IS_TEMP)) { - if (php_stream_is(*(php_stream**)entry->fp->abstract, PHP_STREAM_IS_MEMORY)) { - php_stream *inner = *(php_stream**)entry->fp->abstract; - php_stream_memory_data *memfp = (php_stream_memory_data*)inner->abstract; - memfp->fpos = 0; - memfp->fsize = 0; - } else if (php_stream_is(*(php_stream**)entry->fp->abstract, PHP_STREAM_IS_STDIO)) { - php_stream_truncate_set_size(*(php_stream**)entry->fp->abstract, 0); - } else { - if (error) { - spprintf(error, 0, "phar error: file \"%s\" cannot be opened for writing, no truncate support", phar->fname); - } - return FAILURE; - } - } else if (php_stream_is(entry->fp, PHP_STREAM_IS_STDIO)) { - php_stream_truncate_set_size(entry->fp, 0); - } else { - if (error) { - spprintf(error, 0, "phar error: file \"%s\" cannot be opened for writing, no truncate support", phar->fname); - } - return FAILURE; - } -#endif entry->old_flags = entry->flags; entry->is_modified = 1; phar->is_modified = 1; @@ -1691,11 +1433,7 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, off_t end, return FAILURE; } -#if PHP_VERSION_ID < 50300 - if (FAILURE == zend_fcall_info_init(openssl, &fci, &fcc TSRMLS_CC)) { -#else if (FAILURE == zend_fcall_info_init(openssl, 0, &fci, &fcc, NULL, NULL TSRMLS_CC)) { -#endif zval_dtor(zdata); zval_dtor(zsig); zval_dtor(zkey); @@ -1709,13 +1447,6 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, off_t end, fci.param_count = 3; fci.params = zp; -#if PHP_VERSION_ID < 50300 - ++(zdata->refcount); - if (!is_sign) { - ++(zsig->refcount); - } - ++(zkey->refcount); -#else Z_ADDREF_P(zdata); if (is_sign) { Z_SET_ISREF_P(zsig); @@ -1723,7 +1454,6 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, off_t end, Z_ADDREF_P(zsig); } Z_ADDREF_P(zkey); -#endif fci.retval_ptr_ptr = &retval_ptr; if (FAILURE == zend_call_function(&fci, &fcc TSRMLS_CC)) { @@ -1740,13 +1470,6 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, off_t end, zval_dtor(openssl); efree(openssl); -#if PHP_VERSION_ID < 50300 - --(zdata->refcount); - if (!is_sign) { - --(zsig->refcount); - } - --(zkey->refcount); -#else Z_DELREF_P(zdata); if (is_sign) { Z_UNSET_ISREF_P(zsig); @@ -1754,7 +1477,6 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, off_t end, Z_DELREF_P(zsig); } Z_DELREF_P(zkey); -#endif zval_dtor(zdata); efree(zdata); zval_dtor(zkey); @@ -2280,11 +2002,7 @@ static int phar_update_cached_entry(void *data, void *argument) /* {{{ */ ALLOC_ZVAL(entry->metadata); *entry->metadata = *t; zval_copy_ctor(entry->metadata); -#if PHP_VERSION_ID < 50300 - entry->metadata->refcount = 1; -#else Z_SET_REFCOUNT_P(entry->metadata, 1); -#endif entry->metadata_str.c = NULL; entry->metadata_str.len = 0; } @@ -2328,11 +2046,7 @@ static void phar_copy_cached_phar(phar_archive_data **pphar TSRMLS_DC) /* {{{ */ ALLOC_ZVAL(phar->metadata); *phar->metadata = *t; zval_copy_ctor(phar->metadata); -#if PHP_VERSION_ID < 50300 - phar->metadata->refcount = 1; -#else Z_SET_REFCOUNT_P(phar->metadata, 1); -#endif } } diff --git a/ext/phar/zip.c b/ext/phar/zip.c index 6ba745e9cbf74..e3b64859b89cc 100644 --- a/ext/phar/zip.c +++ b/ext/phar/zip.c @@ -578,10 +578,6 @@ int phar_parse_zipfile(php_stream *fp, char *fname, int fname_len, char *alias, /* construct actual offset to file start - local extra_len can be different from central extra_len */ entry.offset = entry.offset_abs = sizeof(local) + entry.header_offset + PHAR_GET_16(local.filename_len) + PHAR_GET_16(local.extra_len); -#if PHP_VERSION_ID < 50207 - /* work around Bug #46147 */ - fp->writepos = fp->readpos = 0; -#endif php_stream_seek(fp, entry.offset, SEEK_SET); /* these next lines should be for php < 5.2.6 after 5.3 filters are fixed */ fp->writepos = 0; @@ -605,9 +601,6 @@ int phar_parse_zipfile(php_stream *fp, char *fname, int fname_len, char *alias, if (!(entry.uncompressed_filesize = php_stream_copy_to_mem(fp, &actual_alias, entry.uncompressed_filesize, 0)) || !actual_alias) { pefree(entry.filename, entry.is_persistent); -#if PHP_VERSION_ID < 50207 - PHAR_ZIP_FAIL("unable to read in alias, truncated (PHP 5.2.7 and newer has a potential fix for this problem)"); -#endif PHAR_ZIP_FAIL("unable to read in alias, truncated"); } @@ -626,9 +619,6 @@ int phar_parse_zipfile(php_stream *fp, char *fname, int fname_len, char *alias, if (!(entry.uncompressed_filesize = php_stream_copy_to_mem(fp, &actual_alias, entry.uncompressed_filesize, 0)) || !actual_alias) { pefree(entry.filename, entry.is_persistent); -#if PHP_VERSION_ID < 50207 - PHAR_ZIP_FAIL("unable to read in alias, truncated (PHP 5.2.7 and newer has a potential fix for this problem)"); -#endif PHAR_ZIP_FAIL("unable to read in alias, truncated"); } From e6b228332f3cd7b9e3a5f3ba8a8e08ae1b01abdf Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 13 Sep 2013 21:21:23 +0200 Subject: [PATCH 105/400] Remove PHAR_(Z)STR* usages --- ext/phar/dirstream.c | 46 ++++++---------------------------- ext/phar/phar.c | 38 ++++++---------------------- ext/phar/phar_internal.h | 7 ------ ext/phar/stream.c | 53 ++++++++++++---------------------------- ext/phar/util.c | 9 +------ 5 files changed, 33 insertions(+), 120 deletions(-) diff --git a/ext/phar/dirstream.c b/ext/phar/dirstream.c index b090577306758..62b19a79d929d 100644 --- a/ext/phar/dirstream.c +++ b/ext/phar/dirstream.c @@ -94,31 +94,23 @@ static size_t phar_dir_read(php_stream *stream, char *buf, size_t count TSRMLS_D { size_t to_read; HashTable *data = (HashTable *)stream->abstract; - phar_zstr key; char *str_key; uint keylen; ulong unused; - if (FAILURE == zend_hash_has_more_elements(data)) { + if (HASH_KEY_NON_EXISTENT == zend_hash_get_current_key_ex(data, &str_key, &keylen, &unused, 0, NULL)) { return 0; } - if (HASH_KEY_NON_EXISTENT == zend_hash_get_current_key_ex(data, &key, &keylen, &unused, 0, NULL)) { - return 0; - } - - PHAR_STR(key, str_key); zend_hash_move_forward(data); to_read = MIN(keylen, count); if (to_read == 0 || count < keylen) { - PHAR_STR_FREE(str_key); return 0; } memset(buf, 0, sizeof(php_stream_dirent)); memcpy(((php_stream_dirent *) buf)->d_name, str_key, to_read); - PHAR_STR_FREE(str_key); ((php_stream_dirent *) buf)->d_name[to_read + 1] = '\0'; return sizeof(php_stream_dirent); @@ -193,13 +185,12 @@ static php_stream *phar_make_dirstream(char *dir, HashTable *manifest TSRMLS_DC) { HashTable *data; int dirlen = strlen(dir); - phar_zstr key; char *entry, *found, *save, *str_key; uint keylen; ulong unused; ALLOC_HASHTABLE(data); - zend_hash_init(data, 64, zend_get_hash_value, NULL, 0); + zend_hash_init(data, 64, NULL, NULL, 0); if ((*dir == '/' && dirlen == 1 && (manifest->nNumOfElements == 0)) || (dirlen >= sizeof(".phar")-1 && !memcmp(dir, ".phar", sizeof(".phar")-1))) { /* make empty root directory for empty phar */ @@ -211,15 +202,12 @@ static php_stream *phar_make_dirstream(char *dir, HashTable *manifest TSRMLS_DC) zend_hash_internal_pointer_reset(manifest); while (FAILURE != zend_hash_has_more_elements(manifest)) { - if (HASH_KEY_NON_EXISTENT == zend_hash_get_current_key_ex(manifest, &key, &keylen, &unused, 0, NULL)) { + if (HASH_KEY_NON_EXISTENT == zend_hash_get_current_key_ex(manifest, &str_key, &keylen, &unused, 0, NULL)) { break; } - PHAR_STR(key, str_key); - if (keylen <= (uint)dirlen) { if (keylen < (uint)dirlen || !strncmp(str_key, dir, dirlen)) { - PHAR_STR_FREE(str_key); if (SUCCESS != zend_hash_move_forward(manifest)) { break; } @@ -230,7 +218,6 @@ static php_stream *phar_make_dirstream(char *dir, HashTable *manifest TSRMLS_DC) if (*dir == '/') { /* root directory */ if (keylen >= sizeof(".phar")-1 && !memcmp(str_key, ".phar", sizeof(".phar")-1)) { - PHAR_STR_FREE(str_key); /* do not add any magic entries to this directory */ if (SUCCESS != zend_hash_move_forward(manifest)) { break; @@ -250,19 +237,16 @@ static php_stream *phar_make_dirstream(char *dir, HashTable *manifest TSRMLS_DC) entry[keylen] = '\0'; } - PHAR_STR_FREE(str_key); goto PHAR_ADD_ENTRY; } else { if (0 != memcmp(str_key, dir, dirlen)) { /* entry in directory not found */ - PHAR_STR_FREE(str_key); if (SUCCESS != zend_hash_move_forward(manifest)) { break; } continue; } else { if (str_key[dirlen] != '/') { - PHAR_STR_FREE(str_key); if (SUCCESS != zend_hash_move_forward(manifest)) { break; } @@ -289,7 +273,6 @@ static php_stream *phar_make_dirstream(char *dir, HashTable *manifest TSRMLS_DC) entry[keylen - dirlen - 1] = '\0'; keylen = keylen - dirlen - 1; } - PHAR_STR_FREE(str_key); PHAR_ADD_ENTRY: if (keylen) { phar_add_empty(data, entry, keylen); @@ -324,7 +307,6 @@ php_stream *phar_wrapper_open_dir(php_stream_wrapper *wrapper, const char *path, php_url *resource = NULL; php_stream *ret; char *internal_file, *error, *str_key; - phar_zstr key; uint keylen; ulong unused; phar_archive_data *phar; @@ -405,17 +387,14 @@ php_stream *phar_wrapper_open_dir(php_stream_wrapper *wrapper, const char *path, while (FAILURE != zend_hash_has_more_elements(&phar->manifest)) { if (HASH_KEY_NON_EXISTENT != zend_hash_get_current_key_ex( - &phar->manifest, &key, &keylen, &unused, 0, NULL)) { - PHAR_STR(key, str_key); + &phar->manifest, &str_key, &keylen, &unused, 0, NULL)) { if (keylen > (uint)i_len && 0 == memcmp(str_key, internal_file, i_len)) { - PHAR_STR_FREE(str_key); /* directory found */ internal_file = estrndup(internal_file, i_len); php_url_free(resource); return phar_make_dirstream(internal_file, &phar->manifest TSRMLS_CC); } - PHAR_STR_FREE(str_key); } if (SUCCESS != zend_hash_move_forward(&phar->manifest)) { @@ -572,7 +551,6 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options int arch_len, entry_len; php_url *resource = NULL; uint host_len; - phar_zstr key; char *str_key; uint key_len; ulong unused; @@ -637,15 +615,12 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options if (!entry->is_deleted) { for (zend_hash_internal_pointer_reset(&phar->manifest); - HASH_KEY_NON_EXISTENT != zend_hash_get_current_key_ex(&phar->manifest, &key, &key_len, &unused, 0, NULL); - zend_hash_move_forward(&phar->manifest)) { - - PHAR_STR(key, str_key); - + HASH_KEY_NON_EXISTENT != zend_hash_get_current_key_ex(&phar->manifest, &str_key, &key_len, &unused, 0, NULL); + zend_hash_move_forward(&phar->manifest) + ) { if (key_len > path_len && memcmp(str_key, resource->path+1, path_len) == 0 && IS_SLASH(str_key[path_len])) { - PHAR_STR_FREE(str_key); php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "phar error: Directory not empty"); if (entry->is_temp_dir) { efree(entry->filename); @@ -654,19 +629,15 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options php_url_free(resource); return 0; } - PHAR_STR_FREE(str_key); } for (zend_hash_internal_pointer_reset(&phar->virtual_dirs); - HASH_KEY_NON_EXISTENT != zend_hash_get_current_key_ex(&phar->virtual_dirs, &key, &key_len, &unused, 0, NULL); + HASH_KEY_NON_EXISTENT != zend_hash_get_current_key_ex(&phar->virtual_dirs, &str_key, &key_len, &unused, 0, NULL); zend_hash_move_forward(&phar->virtual_dirs)) { - PHAR_STR(key, str_key); - if (key_len > path_len && memcmp(str_key, resource->path+1, path_len) == 0 && IS_SLASH(str_key[path_len])) { - PHAR_STR_FREE(str_key); php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "phar error: Directory not empty"); if (entry->is_temp_dir) { efree(entry->filename); @@ -675,7 +646,6 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options php_url_free(resource); return 0; } - PHAR_STR_FREE(str_key); } } diff --git a/ext/phar/phar.c b/ext/phar/phar.c index c0d23f154421a..4de1aed42f622 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -1954,67 +1954,45 @@ int phar_detect_phar_fname_ext(const char *filename, int filename_len, const cha goto woohoo; } } else { - phar_zstr key; char *str_key; uint keylen; ulong unused; - zend_hash_internal_pointer_reset(&(PHAR_GLOBALS->phar_fname_map)); - - while (FAILURE != zend_hash_has_more_elements(&(PHAR_GLOBALS->phar_fname_map))) { - if (HASH_KEY_NON_EXISTENT == zend_hash_get_current_key_ex(&(PHAR_GLOBALS->phar_fname_map), &key, &keylen, &unused, 0, NULL)) { - break; - } - - PHAR_STR(key, str_key); - + for (zend_hash_internal_pointer_reset(&(PHAR_GLOBALS->phar_fname_map)); + HASH_KEY_NON_EXISTENT != zend_hash_get_current_key_ex(&(PHAR_GLOBALS->phar_fname_map), &str_key, &keylen, &unused, 0, NULL); + zend_hash_move_forward(&(PHAR_GLOBALS->phar_fname_map)) + ) { if (keylen > (uint) filename_len) { - zend_hash_move_forward(&(PHAR_GLOBALS->phar_fname_map)); - PHAR_STR_FREE(str_key); continue; } if (!memcmp(filename, str_key, keylen) && ((uint)filename_len == keylen || filename[keylen] == '/' || filename[keylen] == '\0')) { - PHAR_STR_FREE(str_key); if (FAILURE == zend_hash_get_current_data(&(PHAR_GLOBALS->phar_fname_map), (void **) &pphar)) { break; } *ext_str = filename + (keylen - (*pphar)->ext_len); goto woohoo; } - - PHAR_STR_FREE(str_key); - zend_hash_move_forward(&(PHAR_GLOBALS->phar_fname_map)); } if (PHAR_G(manifest_cached)) { - zend_hash_internal_pointer_reset(&cached_phars); - - while (FAILURE != zend_hash_has_more_elements(&cached_phars)) { - if (HASH_KEY_NON_EXISTENT == zend_hash_get_current_key_ex(&cached_phars, &key, &keylen, &unused, 0, NULL)) { - break; - } - - PHAR_STR(key, str_key); - + for (zend_hash_internal_pointer_reset(&cached_phars); + HASH_KEY_NON_EXISTENT != zend_hash_get_current_key_ex(&cached_phars, &str_key, &keylen, &unused, 0, NULL); + zend_hash_move_forward(&cached_phars) + ) { if (keylen > (uint) filename_len) { - zend_hash_move_forward(&cached_phars); - PHAR_STR_FREE(str_key); continue; } if (!memcmp(filename, str_key, keylen) && ((uint)filename_len == keylen || filename[keylen] == '/' || filename[keylen] == '\0')) { - PHAR_STR_FREE(str_key); if (FAILURE == zend_hash_get_current_data(&cached_phars, (void **) &pphar)) { break; } *ext_str = filename + (keylen - (*pphar)->ext_len); goto woohoo; } - PHAR_STR_FREE(str_key); - zend_hash_move_forward(&cached_phars); } } } diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h index 431628a50a4af..d12de71d8258a 100644 --- a/ext/phar/phar_internal.h +++ b/ext/phar/phar_internal.h @@ -518,13 +518,6 @@ extern char *(*phar_save_resolve_path)(const char *filename, int filename_len TS #define phar_stream_copy_to_stream(src, dest, maxlen, len) _php_stream_copy_to_stream_ex((src), (dest), (maxlen), (len) STREAMS_CC TSRMLS_CC) -typedef char *phar_zstr; -#define PHAR_STR(a, b) \ - b = a; -#define PHAR_ZSTR(a, b) \ - b = a; -#define PHAR_STR_FREE(a) - BEGIN_EXTERN_C() #ifdef PHP_WIN32 diff --git a/ext/phar/stream.c b/ext/phar/stream.c index 74d7fc4814cde..1b353e0d18c33 100644 --- a/ext/phar/stream.c +++ b/ext/phar/stream.c @@ -627,21 +627,16 @@ static int phar_wrapper_stat(php_stream_wrapper *wrapper, const char *url, int f } /* check for mounted directories */ if (phar->mounted_dirs.arBuckets && zend_hash_num_elements(&phar->mounted_dirs)) { - phar_zstr key; char *str_key; ulong unused; uint keylen; HashPosition pos; - zend_hash_internal_pointer_reset_ex(&phar->mounted_dirs, &pos); - while (FAILURE != zend_hash_has_more_elements_ex(&phar->mounted_dirs, &pos)) { - if (HASH_KEY_NON_EXISTENT == zend_hash_get_current_key_ex(&phar->mounted_dirs, &key, &keylen, &unused, 0, &pos)) { - break; - } - PHAR_STR(key, str_key); + for (zend_hash_internal_pointer_reset_ex(&phar->mounted_dirs, &pos); + HASH_KEY_NON_EXISTENT != zend_hash_get_current_key_ex(&phar->mounted_dirs, &str_key, &keylen, &unused, 0, &pos); + zend_hash_move_forward_ex(&phar->mounted_dirs, &pos) + ) { if ((int)keylen >= internal_file_len || strncmp(str_key, internal_file, keylen)) { - zend_hash_move_forward_ex(&phar->mounted_dirs, &pos); - PHAR_STR_FREE(str_key); continue; } else { char *test; @@ -649,17 +644,14 @@ static int phar_wrapper_stat(php_stream_wrapper *wrapper, const char *url, int f php_stream_statbuf ssbi; if (SUCCESS != zend_hash_find(&phar->manifest, str_key, keylen, (void **) &entry)) { - PHAR_STR_FREE(str_key); goto free_resource; } - PHAR_STR_FREE(str_key); if (!entry->tmp || !entry->is_mounted) { goto free_resource; } test_len = spprintf(&test, MAXPATHLEN, "%s%s", entry->tmp, internal_file + keylen); if (SUCCESS != php_stream_stat_path(test, &ssbi)) { efree(test); - zend_hash_move_forward_ex(&phar->mounted_dirs, &pos); continue; } /* mount the file/directory just in time */ @@ -910,7 +902,6 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from /* Rename directory. Update all nested paths */ if (is_dir) { int key_type; - phar_zstr key, new_key; char *str_key, *new_str_key; uint key_len, new_key_len; ulong unused; @@ -918,12 +909,10 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from uint to_len = strlen(resource_to->path+1); for (zend_hash_internal_pointer_reset(&phar->manifest); - HASH_KEY_NON_EXISTENT != (key_type = zend_hash_get_current_key_ex(&phar->manifest, &key, &key_len, &unused, 0, NULL)) && + HASH_KEY_NON_EXISTENT != (key_type = zend_hash_get_current_key_ex(&phar->manifest, &str_key, &key_len, &unused, 0, NULL)) && SUCCESS == zend_hash_get_current_data(&phar->manifest, (void **) &entry); - zend_hash_move_forward(&phar->manifest)) { - - PHAR_STR(key, str_key); - + zend_hash_move_forward(&phar->manifest) + ) { if (!entry->is_deleted && key_len > from_len && memcmp(str_key, resource_from->path+1, from_len) == 0 && @@ -941,18 +930,14 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from entry->filename = new_str_key; entry->filename_len = new_key_len; - PHAR_ZSTR(new_str_key, new_key); - zend_hash_update_current_key_ex(&phar->manifest, key_type, new_key, new_key_len, 0, HASH_UPDATE_KEY_ANYWAY, NULL); + zend_hash_update_current_key_ex(&phar->manifest, key_type, new_str_key, new_key_len, 0, HASH_UPDATE_KEY_ANYWAY, NULL); } - PHAR_STR_FREE(str_key); } for (zend_hash_internal_pointer_reset(&phar->virtual_dirs); - HASH_KEY_NON_EXISTENT != (key_type = zend_hash_get_current_key_ex(&phar->virtual_dirs, &key, &key_len, &unused, 0, NULL)); - zend_hash_move_forward(&phar->virtual_dirs)) { - - PHAR_STR(key, str_key); - + HASH_KEY_NON_EXISTENT != (key_type = zend_hash_get_current_key_ex(&phar->virtual_dirs, &str_key, &key_len, &unused, 0, NULL)); + zend_hash_move_forward(&phar->virtual_dirs) + ) { if (key_len >= from_len && memcmp(str_key, resource_from->path+1, from_len) == 0 && (key_len == from_len || IS_SLASH(str_key[from_len]))) { @@ -963,20 +948,16 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from memcpy(new_str_key + to_len, str_key + from_len, key_len - from_len); new_str_key[new_key_len] = 0; - PHAR_ZSTR(new_str_key, new_key); - zend_hash_update_current_key_ex(&phar->virtual_dirs, key_type, new_key, new_key_len, 0, HASH_UPDATE_KEY_ANYWAY, NULL); + zend_hash_update_current_key_ex(&phar->virtual_dirs, key_type, new_str_key, new_key_len, 0, HASH_UPDATE_KEY_ANYWAY, NULL); efree(new_str_key); } - PHAR_STR_FREE(str_key); } for (zend_hash_internal_pointer_reset(&phar->mounted_dirs); - HASH_KEY_NON_EXISTENT != (key_type = zend_hash_get_current_key_ex(&phar->mounted_dirs, &key, &key_len, &unused, 0, NULL)) && + HASH_KEY_NON_EXISTENT != (key_type = zend_hash_get_current_key_ex(&phar->mounted_dirs, &str_key, &key_len, &unused, 0, NULL)) && SUCCESS == zend_hash_get_current_data(&phar->mounted_dirs, (void **) &entry); - zend_hash_move_forward(&phar->mounted_dirs)) { - - PHAR_STR(key, str_key); - + zend_hash_move_forward(&phar->mounted_dirs) + ) { if (key_len >= from_len && memcmp(str_key, resource_from->path+1, from_len) == 0 && (key_len == from_len || IS_SLASH(str_key[from_len]))) { @@ -987,11 +968,9 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from memcpy(new_str_key + to_len, str_key + from_len, key_len - from_len); new_str_key[new_key_len] = 0; - PHAR_ZSTR(new_str_key, new_key); - zend_hash_update_current_key_ex(&phar->mounted_dirs, key_type, new_key, new_key_len, 0, HASH_UPDATE_KEY_ANYWAY, NULL); + zend_hash_update_current_key_ex(&phar->mounted_dirs, key_type, new_str_key, new_key_len, 0, HASH_UPDATE_KEY_ANYWAY, NULL); efree(new_str_key); } - PHAR_STR_FREE(str_key); } } diff --git a/ext/phar/util.c b/ext/phar/util.c index e115d0d584faf..bf094aff875a1 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -1289,21 +1289,17 @@ phar_entry_info *phar_get_entry_info_dir(phar_archive_data *phar, char *path, in } if (phar->mounted_dirs.arBuckets && zend_hash_num_elements(&phar->mounted_dirs)) { - phar_zstr key; char *str_key; ulong unused; uint keylen; zend_hash_internal_pointer_reset(&phar->mounted_dirs); while (FAILURE != zend_hash_has_more_elements(&phar->mounted_dirs)) { - if (HASH_KEY_NON_EXISTENT == zend_hash_get_current_key_ex(&phar->mounted_dirs, &key, &keylen, &unused, 0, NULL)) { + if (HASH_KEY_NON_EXISTENT == zend_hash_get_current_key_ex(&phar->mounted_dirs, &str_key, &keylen, &unused, 0, NULL)) { break; } - PHAR_STR(key, str_key); - if ((int)keylen >= path_len || strncmp(str_key, path, keylen)) { - PHAR_STR_FREE(str_key); continue; } else { char *test; @@ -1314,7 +1310,6 @@ phar_entry_info *phar_get_entry_info_dir(phar_archive_data *phar, char *path, in if (error) { spprintf(error, 4096, "phar internal error: mounted path \"%s\" could not be retrieved from manifest", str_key); } - PHAR_STR_FREE(str_key); return NULL; } @@ -1322,10 +1317,8 @@ phar_entry_info *phar_get_entry_info_dir(phar_archive_data *phar, char *path, in if (error) { spprintf(error, 4096, "phar internal error: mounted path \"%s\" is not properly initialized as a mounted path", str_key); } - PHAR_STR_FREE(str_key); return NULL; } - PHAR_STR_FREE(str_key); test_len = spprintf(&test, MAXPATHLEN, "%s%s", entry->tmp, path + keylen); From db6d93fecab928058956c71c35c67658152726b1 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 13 Sep 2013 21:40:32 +0200 Subject: [PATCH 106/400] Remove some more unnecessary macros from phar --- ext/phar/phar.c | 16 ++++++++-------- ext/phar/phar_internal.h | 15 --------------- ext/phar/phar_object.c | 8 ++++---- ext/phar/tar.c | 10 +++++----- ext/phar/util.c | 6 +++--- ext/phar/zip.c | 20 ++++++++++---------- 6 files changed, 30 insertions(+), 45 deletions(-) diff --git a/ext/phar/phar.c b/ext/phar/phar.c index 4de1aed42f622..79f88b4362c0c 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -1639,7 +1639,7 @@ static int phar_open_from_fp(php_stream* fp, char *fname, int fname_len, char *a php_stream_filter_append(&temp->writefilters, filter); - if (SUCCESS != phar_stream_copy_to_stream(fp, temp, PHP_STREAM_COPY_ALL, NULL)) { + if (SUCCESS != php_stream_copy_to_stream_ex(fp, temp, PHP_STREAM_COPY_ALL, NULL)) { if (err) { php_stream_close(temp); MAPPHAR_ALLOC_FAIL("unable to decompress gzipped phar archive \"%s\", ext/zlib is buggy in PHP versions older than 5.2.6") @@ -1681,7 +1681,7 @@ static int phar_open_from_fp(php_stream* fp, char *fname, int fname_len, char *a php_stream_filter_append(&temp->writefilters, filter); - if (SUCCESS != phar_stream_copy_to_stream(fp, temp, PHP_STREAM_COPY_ALL, NULL)) { + if (SUCCESS != php_stream_copy_to_stream_ex(fp, temp, PHP_STREAM_COPY_ALL, NULL)) { php_stream_close(temp); MAPPHAR_ALLOC_FAIL("unable to decompress bzipped phar archive \"%s\" to temporary file") } @@ -2677,7 +2677,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, long len, int convert, size_t written; if (!user_stub && phar->halt_offset && oldfile && !phar->is_brandnew) { - phar_stream_copy_to_stream(oldfile, newfile, phar->halt_offset, &written); + php_stream_copy_to_stream_ex(oldfile, newfile, phar->halt_offset, &written); newstub = NULL; } else { /* this is either a brand new phar or a default stub overwrite */ @@ -2865,7 +2865,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, long len, int convert, return EOF; } php_stream_filter_append((&entry->cfp->writefilters), filter); - if (SUCCESS != phar_stream_copy_to_stream(file, entry->cfp, entry->uncompressed_filesize, NULL)) { + if (SUCCESS != php_stream_copy_to_stream_ex(file, entry->cfp, entry->uncompressed_filesize, NULL)) { if (closeoldfile) { php_stream_close(oldfile); } @@ -3097,7 +3097,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, long len, int convert, /* this will have changed for all files that have either changed compression or been modified */ entry->offset = entry->offset_abs = offset; offset += entry->compressed_filesize; - if (phar_stream_copy_to_stream(file, newfile, entry->compressed_filesize, &wrote) == FAILURE) { + if (php_stream_copy_to_stream_ex(file, newfile, entry->compressed_filesize, &wrote) == FAILURE) { if (closeoldfile) { php_stream_close(oldfile); } @@ -3243,7 +3243,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, long len, int convert, } php_stream_filter_append(&phar->fp->writefilters, filter); - phar_stream_copy_to_stream(newfile, phar->fp, PHP_STREAM_COPY_ALL, NULL); + php_stream_copy_to_stream_ex(newfile, phar->fp, PHP_STREAM_COPY_ALL, NULL); php_stream_filter_flush(filter, 1); php_stream_filter_remove(filter, 1 TSRMLS_CC); php_stream_close(phar->fp); @@ -3252,14 +3252,14 @@ int phar_flush(phar_archive_data *phar, char *user_stub, long len, int convert, } else if (phar->flags & PHAR_FILE_COMPRESSED_BZ2) { filter = php_stream_filter_create("bzip2.compress", NULL, php_stream_is_persistent(phar->fp) TSRMLS_CC); php_stream_filter_append(&phar->fp->writefilters, filter); - phar_stream_copy_to_stream(newfile, phar->fp, PHP_STREAM_COPY_ALL, NULL); + php_stream_copy_to_stream_ex(newfile, phar->fp, PHP_STREAM_COPY_ALL, NULL); php_stream_filter_flush(filter, 1); php_stream_filter_remove(filter, 1 TSRMLS_CC); php_stream_close(phar->fp); /* use the temp stream as our base */ phar->fp = newfile; } else { - phar_stream_copy_to_stream(newfile, phar->fp, PHP_STREAM_COPY_ALL, NULL); + php_stream_copy_to_stream_ex(newfile, phar->fp, PHP_STREAM_COPY_ALL, NULL); /* we could also reopen the file in "rb" mode but there is no need for that */ php_stream_close(newfile); } diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h index d12de71d8258a..64953f66b72d3 100644 --- a/ext/phar/phar_internal.h +++ b/ext/phar/phar_internal.h @@ -68,19 +68,6 @@ #include "ext/hash/php_hash_sha.h" #endif -#ifndef E_RECOVERABLE_ERROR -# define E_RECOVERABLE_ERROR E_ERROR -#endif - -#ifndef pestrndup -# define pestrndup(s, length, persistent) ((persistent)?zend_strndup((s),(length)):estrndup((s),(length))) -#endif - -#ifndef ALLOC_PERMANENT_ZVAL -# define ALLOC_PERMANENT_ZVAL(z) \ - (z) = (zval*)malloc(sizeof(zval)) -#endif - /* PHP_ because this is public information via MINFO */ #define PHP_PHAR_API_VERSION "1.1.1" /* x.y.z maps to 0xyz0 */ @@ -516,8 +503,6 @@ union _phar_entry_object { extern char *(*phar_save_resolve_path)(const char *filename, int filename_len TSRMLS_DC); #endif -#define phar_stream_copy_to_stream(src, dest, maxlen, len) _php_stream_copy_to_stream_ex((src), (dest), (maxlen), (len) STREAMS_CC TSRMLS_CC) - BEGIN_EXTERN_C() #ifdef PHP_WIN32 diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index 7d2922fbaa15c..7c11a48f9cc87 100644 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -1707,7 +1707,7 @@ static int phar_build(zend_object_iterator *iter, void *puser TSRMLS_DC) /* {{{ data->internal_file->fp_type = PHAR_UFP; data->internal_file->offset_abs = data->internal_file->offset = php_stream_tell(p_obj->fp); data->fp = NULL; - phar_stream_copy_to_stream(fp, p_obj->fp, PHP_STREAM_COPY_ALL, &contents_len); + php_stream_copy_to_stream_ex(fp, p_obj->fp, PHP_STREAM_COPY_ALL, &contents_len); data->internal_file->uncompressed_filesize = data->internal_file->compressed_filesize = php_stream_tell(p_obj->fp) - data->internal_file->offset; } @@ -1997,7 +1997,7 @@ static int phar_copy_file_contents(phar_entry_info *entry, php_stream *fp TSRMLS link = entry; } - if (SUCCESS != phar_stream_copy_to_stream(phar_get_efp(link, 0 TSRMLS_CC), fp, link->uncompressed_filesize, NULL)) { + if (SUCCESS != php_stream_copy_to_stream_ex(phar_get_efp(link, 0 TSRMLS_CC), fp, link->uncompressed_filesize, NULL)) { zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Cannot convert phar archive \"%s\", unable to copy entry \"%s\" contents", entry->phar->fname, entry->filename); return FAILURE; @@ -3651,7 +3651,7 @@ static void phar_add_file(phar_archive_data **pphar, char *filename, int filenam zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "Entry %s could not be written to", filename); return; } - phar_stream_copy_to_stream(contents_file, data->fp, PHP_STREAM_COPY_ALL, &contents_len); + php_stream_copy_to_stream_ex(contents_file, data->fp, PHP_STREAM_COPY_ALL, &contents_len); } data->internal_file->compressed_filesize = data->internal_file->uncompressed_filesize = contents_len; @@ -4224,7 +4224,7 @@ static int phar_extract_file(zend_bool overwrite, phar_entry_info *entry, char * return FAILURE; } - if (SUCCESS != phar_stream_copy_to_stream(phar_get_efp(entry, 0 TSRMLS_CC), fp, entry->uncompressed_filesize, NULL)) { + if (SUCCESS != php_stream_copy_to_stream_ex(phar_get_efp(entry, 0 TSRMLS_CC), fp, entry->uncompressed_filesize, NULL)) { spprintf(error, 4096, "Cannot extract \"%s\" to \"%s\", copying contents failed", entry->filename, fullpath); efree(fullpath); php_stream_close(fp); diff --git a/ext/phar/tar.c b/ext/phar/tar.c index 0e60e3db134b4..180675a9d23b8 100644 --- a/ext/phar/tar.c +++ b/ext/phar/tar.c @@ -783,7 +783,7 @@ static int phar_tar_writeheaders(void *pDest, void *argument TSRMLS_DC) /* {{{ * return ZEND_HASH_APPLY_STOP; } - if (SUCCESS != phar_stream_copy_to_stream(phar_get_efp(entry, 0 TSRMLS_CC), fp->new, entry->uncompressed_filesize, NULL)) { + if (SUCCESS != php_stream_copy_to_stream_ex(phar_get_efp(entry, 0 TSRMLS_CC), fp->new, entry->uncompressed_filesize, NULL)) { if (fp->error) { spprintf(fp->error, 4096, "tar-based phar \"%s\" cannot be created, contents of file \"%s\" could not be written", entry->phar->fname, entry->filename); } @@ -1288,7 +1288,7 @@ int phar_tar_flush(phar_archive_data *phar, char *user_stub, long len, int defau if (!filter) { /* copy contents uncompressed rather than lose them */ - phar_stream_copy_to_stream(newfile, phar->fp, PHP_STREAM_COPY_ALL, NULL); + php_stream_copy_to_stream_ex(newfile, phar->fp, PHP_STREAM_COPY_ALL, NULL); php_stream_close(newfile); if (error) { spprintf(error, 4096, "unable to compress all contents of phar \"%s\" using zlib, PHP versions older than 5.2.6 have a buggy zlib", phar->fname); @@ -1297,7 +1297,7 @@ int phar_tar_flush(phar_archive_data *phar, char *user_stub, long len, int defau } php_stream_filter_append(&phar->fp->writefilters, filter); - phar_stream_copy_to_stream(newfile, phar->fp, PHP_STREAM_COPY_ALL, NULL); + php_stream_copy_to_stream_ex(newfile, phar->fp, PHP_STREAM_COPY_ALL, NULL); php_stream_filter_flush(filter, 1); php_stream_filter_remove(filter, 1 TSRMLS_CC); php_stream_close(phar->fp); @@ -1308,14 +1308,14 @@ int phar_tar_flush(phar_archive_data *phar, char *user_stub, long len, int defau filter = php_stream_filter_create("bzip2.compress", NULL, php_stream_is_persistent(phar->fp) TSRMLS_CC); php_stream_filter_append(&phar->fp->writefilters, filter); - phar_stream_copy_to_stream(newfile, phar->fp, PHP_STREAM_COPY_ALL, NULL); + php_stream_copy_to_stream_ex(newfile, phar->fp, PHP_STREAM_COPY_ALL, NULL); php_stream_filter_flush(filter, 1); php_stream_filter_remove(filter, 1 TSRMLS_CC); php_stream_close(phar->fp); /* use the temp stream as our base */ phar->fp = newfile; } else { - phar_stream_copy_to_stream(newfile, phar->fp, PHP_STREAM_COPY_ALL, NULL); + php_stream_copy_to_stream_ex(newfile, phar->fp, PHP_STREAM_COPY_ALL, NULL); /* we could also reopen the file in "rb" mode but there is no need for that */ php_stream_close(newfile); } diff --git a/ext/phar/util.c b/ext/phar/util.c index bf094aff875a1..d42164a57c081 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -678,7 +678,7 @@ int phar_copy_entry_fp(phar_entry_info *source, phar_entry_info *dest, char **er link = source; } - if (SUCCESS != phar_stream_copy_to_stream(phar_get_efp(link, 0 TSRMLS_CC), dest->fp, link->uncompressed_filesize, NULL)) { + if (SUCCESS != php_stream_copy_to_stream_ex(phar_get_efp(link, 0 TSRMLS_CC), dest->fp, link->uncompressed_filesize, NULL)) { php_stream_close(dest->fp); dest->fp_type = PHAR_FP; if (error) { @@ -780,7 +780,7 @@ int phar_open_entry_fp(phar_entry_info *entry, char **error, int follow_links TS php_stream_seek(phar_get_entrypfp(entry TSRMLS_CC), phar_get_fp_offset(entry TSRMLS_CC), SEEK_SET); if (entry->uncompressed_filesize) { - if (SUCCESS != phar_stream_copy_to_stream(phar_get_entrypfp(entry TSRMLS_CC), ufp, entry->compressed_filesize, NULL)) { + if (SUCCESS != php_stream_copy_to_stream_ex(phar_get_entrypfp(entry TSRMLS_CC), ufp, entry->compressed_filesize, NULL)) { spprintf(error, 4096, "phar error: internal corruption of phar \"%s\" (actual filesize mismatch on file \"%s\")", phar->fname, entry->filename); php_stream_filter_remove(filter, 1 TSRMLS_CC); return FAILURE; @@ -886,7 +886,7 @@ int phar_separate_entry_fp(phar_entry_info *entry, char **error TSRMLS_DC) /* {{ link = entry; } - if (SUCCESS != phar_stream_copy_to_stream(phar_get_efp(link, 0 TSRMLS_CC), fp, link->uncompressed_filesize, NULL)) { + if (SUCCESS != php_stream_copy_to_stream_ex(phar_get_efp(link, 0 TSRMLS_CC), fp, link->uncompressed_filesize, NULL)) { if (error) { spprintf(error, 4096, "phar error: cannot separate entry file \"%s\" contents in phar archive \"%s\" for write access", entry->filename, entry->phar->fname); } diff --git a/ext/phar/zip.c b/ext/phar/zip.c index e3b64859b89cc..2e977b8840fe1 100644 --- a/ext/phar/zip.c +++ b/ext/phar/zip.c @@ -417,11 +417,11 @@ int phar_parse_zipfile(php_stream *fp, char *fname, int fname_len, char *alias, php_stream_seek(fp, 0, SEEK_SET); /* copy file contents + local headers and zip comment, if any, to be hashed for signature */ - phar_stream_copy_to_stream(fp, sigfile, entry.header_offset, NULL); + php_stream_copy_to_stream_ex(fp, sigfile, entry.header_offset, NULL); /* seek to central directory */ php_stream_seek(fp, PHAR_GET_32(locator.cdir_offset), SEEK_SET); /* copy central directory header */ - phar_stream_copy_to_stream(fp, sigfile, beforeus - PHAR_GET_32(locator.cdir_offset), NULL); + php_stream_copy_to_stream_ex(fp, sigfile, beforeus - PHAR_GET_32(locator.cdir_offset), NULL); if (metadata) { php_stream_write(sigfile, metadata, PHAR_GET_16(locator.comment_len)); } @@ -905,7 +905,7 @@ static int phar_zip_changed_apply(void *data, void *arg TSRMLS_DC) /* {{{ */ php_stream_filter_append((&entry->cfp->writefilters), filter); - if (SUCCESS != phar_stream_copy_to_stream(efp, entry->cfp, entry->uncompressed_filesize, NULL)) { + if (SUCCESS != php_stream_copy_to_stream_ex(efp, entry->cfp, entry->uncompressed_filesize, NULL)) { spprintf(p->error, 0, "unable to copy compressed file contents of file \"%s\" while creating new phar \"%s\"", entry->filename, entry->phar->fname); return ZEND_HASH_APPLY_STOP; } @@ -1010,7 +1010,7 @@ static int phar_zip_changed_apply(void *data, void *arg TSRMLS_DC) /* {{{ */ if (!not_really_modified && entry->is_modified) { if (entry->cfp) { - if (SUCCESS != phar_stream_copy_to_stream(entry->cfp, p->filefp, entry->compressed_filesize, NULL)) { + if (SUCCESS != php_stream_copy_to_stream_ex(entry->cfp, p->filefp, entry->compressed_filesize, NULL)) { spprintf(p->error, 0, "unable to write compressed contents of file \"%s\" in zip-based phar \"%s\"", entry->filename, entry->phar->fname); return ZEND_HASH_APPLY_STOP; } @@ -1024,7 +1024,7 @@ static int phar_zip_changed_apply(void *data, void *arg TSRMLS_DC) /* {{{ */ phar_seek_efp(entry, 0, SEEK_SET, 0, 0 TSRMLS_CC); - if (SUCCESS != phar_stream_copy_to_stream(phar_get_efp(entry, 0 TSRMLS_CC), p->filefp, entry->uncompressed_filesize, NULL)) { + if (SUCCESS != php_stream_copy_to_stream_ex(phar_get_efp(entry, 0 TSRMLS_CC), p->filefp, entry->uncompressed_filesize, NULL)) { spprintf(p->error, 0, "unable to write contents of file \"%s\" in zip-based phar \"%s\"", entry->filename, entry->phar->fname); return ZEND_HASH_APPLY_STOP; } @@ -1050,7 +1050,7 @@ static int phar_zip_changed_apply(void *data, void *arg TSRMLS_DC) /* {{{ */ } } - if (!entry->is_dir && entry->compressed_filesize && SUCCESS != phar_stream_copy_to_stream(p->old, p->filefp, entry->compressed_filesize, NULL)) { + if (!entry->is_dir && entry->compressed_filesize && SUCCESS != php_stream_copy_to_stream_ex(p->old, p->filefp, entry->compressed_filesize, NULL)) { spprintf(p->error, 0, "unable to copy contents of file \"%s\" while creating zip-based phar \"%s\"", entry->filename, entry->phar->fname); return ZEND_HASH_APPLY_STOP; } @@ -1093,10 +1093,10 @@ static int phar_zip_applysignature(phar_archive_data *phar, struct _phar_zip_pas st = tell = php_stream_tell(pass->filefp); /* copy the local files, central directory, and the zip comment to generate the hash */ php_stream_seek(pass->filefp, 0, SEEK_SET); - phar_stream_copy_to_stream(pass->filefp, newfile, tell, NULL); + php_stream_copy_to_stream_ex(pass->filefp, newfile, tell, NULL); tell = php_stream_tell(pass->centralfp); php_stream_seek(pass->centralfp, 0, SEEK_SET); - phar_stream_copy_to_stream(pass->centralfp, newfile, tell, NULL); + php_stream_copy_to_stream_ex(pass->centralfp, newfile, tell, NULL); if (metadata->c) { php_stream_write(newfile, metadata->c, metadata->len); } @@ -1431,7 +1431,7 @@ int phar_zip_flush(phar_archive_data *phar, char *user_stub, long len, int defau { size_t clen; - int ret = phar_stream_copy_to_stream(pass.centralfp, pass.filefp, PHP_STREAM_COPY_ALL, &clen); + int ret = php_stream_copy_to_stream_ex(pass.centralfp, pass.filefp, PHP_STREAM_COPY_ALL, &clen); if (SUCCESS != ret || clen != cdir_size) { if (error) { spprintf(error, 4096, "phar zip flush of \"%s\" failed: unable to write central-directory", phar->fname); @@ -1501,7 +1501,7 @@ int phar_zip_flush(phar_archive_data *phar, char *user_stub, long len, int defau return EOF; } php_stream_rewind(pass.filefp); - phar_stream_copy_to_stream(pass.filefp, phar->fp, PHP_STREAM_COPY_ALL, NULL); + php_stream_copy_to_stream_ex(pass.filefp, phar->fp, PHP_STREAM_COPY_ALL, NULL); /* we could also reopen the file in "rb" mode but there is no need for that */ php_stream_close(pass.filefp); } From 8748e146b98fb79e66e3be40b211005e36031d64 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 14 Sep 2013 01:37:09 +0200 Subject: [PATCH 107/400] Fix intl build --- Zend/zend_string.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_string.h b/Zend/zend_string.h index 725e069ed23a2..27ba50be3d642 100644 --- a/Zend/zend_string.h +++ b/Zend/zend_string.h @@ -74,7 +74,7 @@ END_EXTERN_C() : erealloc(str, new_len)) static inline char *_str_erealloc(char *str, size_t new_len, size_t old_len) { - char *buf = emalloc(new_len); + char *buf = (char *) emalloc(new_len); memcpy(buf, str, old_len); return buf; } From bdfa03d79df529b555e2d25da288b50647e7c537 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 14 Sep 2013 14:40:48 +0200 Subject: [PATCH 108/400] Save a TSRMLS_FETCH() for zval_ptr_dtor in executor This gives me about 9% improvement on Zend/bench.php for a zts build. --- Zend/zend_execute.c | 8 ++++---- Zend/zend_execute.h | 10 +++------- Zend/zend_execute_API.c | 3 ++- Zend/zend_generators.c | 2 +- Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 2 +- 6 files changed, 12 insertions(+), 15 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 63ecbe4069bac..c79a55169c86e 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -94,7 +94,7 @@ static zend_always_inline void zend_pzval_unlock_free_func(zval *z TSRMLS_DC) } #undef zval_ptr_dtor -#define zval_ptr_dtor(pzv) i_zval_ptr_dtor(*(pzv) ZEND_FILE_LINE_CC) +#define zval_ptr_dtor(pzv) i_zval_ptr_dtor(*(pzv) ZEND_FILE_LINE_CC TSRMLS_CC) #define PZVAL_UNLOCK(z, f) zend_pzval_unlock_func(z, f, 1 TSRMLS_CC) #define PZVAL_UNLOCK_EX(z, f, u) zend_pzval_unlock_func(z, f, u TSRMLS_CC) @@ -1500,7 +1500,7 @@ void zend_clean_and_cache_symbol_table(HashTable *symbol_table TSRMLS_DC) /* {{{ } /* }}} */ -static zend_always_inline void i_free_compiled_variables(zend_execute_data *execute_data) /* {{{ */ +static zend_always_inline void i_free_compiled_variables(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ { zval ***cv = EX_CV_NUM(execute_data, 0); zval ***end = cv + EX(op_array)->last_var; @@ -1513,9 +1513,9 @@ static zend_always_inline void i_free_compiled_variables(zend_execute_data *exec } /* }}} */ -void zend_free_compiled_variables(zend_execute_data *execute_data) /* {{{ */ +void zend_free_compiled_variables(zend_execute_data *execute_data TSRMLS_DC) /* {{{ */ { - i_free_compiled_variables(execute_data); + i_free_compiled_variables(execute_data TSRMLS_CC); } /* }}} */ diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index ff0758772e48b..b68a82ef896e9 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -71,18 +71,14 @@ ZEND_API int zend_eval_stringl_ex(char *str, int str_len, zval *retval_ptr, char ZEND_API char * zend_verify_arg_class_kind(const zend_arg_info *cur_arg_info, ulong fetch_type, const char **class_name, zend_class_entry **pce TSRMLS_DC); ZEND_API int zend_verify_arg_error(int error_type, const zend_function *zf, zend_uint arg_num, const char *need_msg, const char *need_kind, const char *given_msg, const char *given_kind TSRMLS_DC); -static zend_always_inline void i_zval_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC) +static zend_always_inline void i_zval_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC TSRMLS_DC) { if (!Z_DELREF_P(zval_ptr)) { - TSRMLS_FETCH(); - ZEND_ASSERT(zval_ptr != &EG(uninitialized_zval)); GC_REMOVE_ZVAL_FROM_BUFFER(zval_ptr); zval_dtor(zval_ptr); efree_rel(zval_ptr); } else { - TSRMLS_FETCH(); - if (Z_REFCOUNT_P(zval_ptr) == 1) { Z_UNSET_ISREF_P(zval_ptr); } @@ -295,7 +291,7 @@ static zend_always_inline void zend_vm_stack_clear_multiple(int nested TSRMLS_DC while (p != end) { zval *q = (zval *) *(--p); *p = NULL; - i_zval_ptr_dtor(q ZEND_FILE_LINE_CC); + i_zval_ptr_dtor(q ZEND_FILE_LINE_CC TSRMLS_CC); } if (nested) { EG(argument_stack)->top = p; @@ -394,7 +390,7 @@ ZEND_API zval **zend_get_zval_ptr_ptr(int op_type, const znode_op *node, const z ZEND_API int zend_do_fcall(ZEND_OPCODE_HANDLER_ARGS); void zend_clean_and_cache_symbol_table(HashTable *symbol_table TSRMLS_DC); -void zend_free_compiled_variables(zend_execute_data *execute_data); +void zend_free_compiled_variables(zend_execute_data *execute_data TSRMLS_DC); #define CACHED_PTR(num) \ EG(active_op_array)->run_time_cache[(num)] diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index d65308f44d940..779e6d886fa4d 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -423,7 +423,8 @@ ZEND_API zend_bool zend_is_executing(TSRMLS_D) /* {{{ */ ZEND_API void _zval_ptr_dtor(zval **zval_ptr ZEND_FILE_LINE_DC) /* {{{ */ { - i_zval_ptr_dtor(*zval_ptr ZEND_FILE_LINE_RELAY_CC); + TSRMLS_FETCH(); + i_zval_ptr_dtor(*zval_ptr ZEND_FILE_LINE_RELAY_CC TSRMLS_CC); } /* }}} */ diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index c6b211ae4d7ae..c55dc67f1bbdf 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -46,7 +46,7 @@ ZEND_API void zend_generator_close(zend_generator *generator, zend_bool finished zend_op_array *op_array = execute_data->op_array; if (!execute_data->symbol_table) { - zend_free_compiled_variables(execute_data); + zend_free_compiled_variables(execute_data TSRMLS_CC); } else { zend_clean_and_cache_symbol_table(execute_data->symbol_table TSRMLS_CC); } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index d95a3dc0a7476..4621b47e0e69e 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1833,7 +1833,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY) EG(current_execute_data) = EX(prev_execute_data); EG(opline_ptr) = NULL; if (!EG(active_symbol_table)) { - i_free_compiled_variables(execute_data); + i_free_compiled_variables(execute_data TSRMLS_CC); } zend_vm_stack_free((char*)execute_data - (ZEND_MM_ALIGNED_SIZE(sizeof(temp_variable)) * op_array->T) TSRMLS_CC); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index ac62b2982afb1..677cabe2a947f 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -396,7 +396,7 @@ static int ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS) EG(current_execute_data) = EX(prev_execute_data); EG(opline_ptr) = NULL; if (!EG(active_symbol_table)) { - i_free_compiled_variables(execute_data); + i_free_compiled_variables(execute_data TSRMLS_CC); } zend_vm_stack_free((char*)execute_data - (ZEND_MM_ALIGNED_SIZE(sizeof(temp_variable)) * op_array->T) TSRMLS_CC); From a475b2c1db3512eabfece71430cb49065f558e40 Mon Sep 17 00:00:00 2001 From: Boro Sitnikovski Date: Fri, 13 Sep 2013 02:20:19 +0200 Subject: [PATCH 109/400] Bug 64157 Changed error message to make sense --- ext/date/lib/parse_date.c | 2 +- ext/date/lib/parse_date.re | 2 +- ext/date/tests/bug64157.phpt | 14 ++++++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 ext/date/tests/bug64157.phpt diff --git a/ext/date/lib/parse_date.c b/ext/date/lib/parse_date.c index 2ad4d31edb984..f510a665e867f 100644 --- a/ext/date/lib/parse_date.c +++ b/ext/date/lib/parse_date.c @@ -25036,7 +25036,7 @@ timelib_time *timelib_parse_from_format(char *format, char *string, int len, tim TIMELIB_CHECK_NUMBER; sec = timelib_get_nr_ex((char **) &ptr, 2, &length); if (sec == TIMELIB_UNSET || length != 2) { - add_pbf_error(s, "A two second minute could not be found", string, begin); + add_pbf_error(s, "A two digit second could not be found", string, begin); } else { s->time->s = sec; } diff --git a/ext/date/lib/parse_date.re b/ext/date/lib/parse_date.re index f874682ce6922..df33508f505e8 100644 --- a/ext/date/lib/parse_date.re +++ b/ext/date/lib/parse_date.re @@ -2043,7 +2043,7 @@ timelib_time *timelib_parse_from_format(char *format, char *string, int len, tim TIMELIB_CHECK_NUMBER; sec = timelib_get_nr_ex((char **) &ptr, 2, &length); if (sec == TIMELIB_UNSET || length != 2) { - add_pbf_error(s, "A two second minute could not be found", string, begin); + add_pbf_error(s, "A two digit second could not be found", string, begin); } else { s->time->s = sec; } diff --git a/ext/date/tests/bug64157.phpt b/ext/date/tests/bug64157.phpt new file mode 100644 index 0000000000000..fb71495430c72 --- /dev/null +++ b/ext/date/tests/bug64157.phpt @@ -0,0 +1,14 @@ +--TEST-- +Test for bug #64157: DateTime::createFromFormat() reports confusing error message +--CREDITS-- +Boro Sitnikovski +--INI-- +date.timezone = UTC +--FILE-- + +--EXPECT-- +A two digit second could not be found From c0afe829e33c5f5690c6967a102148984836d5aa Mon Sep 17 00:00:00 2001 From: David Soria Parra Date: Mon, 16 Sep 2013 03:48:34 +0200 Subject: [PATCH 110/400] News for bugfix #64157 --- NEWS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NEWS b/NEWS index e05b24042b80c..c7d5e030f3c99 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,10 @@ PHP NEWS . Fixed bug #65633 (built-in server treat some http headers as case-sensitive). (Adam) +- Datetime: + . Fixed bug #64157 (DateTime::createFromFormat() reports confusing error + message). (Boro Sitnikovski) + ?? ??? 2013, PHP 5.4.20 - Core: From 8a936e8eb938965b0daaf076c109ec60141e57a7 Mon Sep 17 00:00:00 2001 From: Levi Morrison Date: Thu, 12 Sep 2013 16:03:39 -0600 Subject: [PATCH 111/400] EmptyIterator now implements Countable; fixes bug 60577 (cherry picked from commit 6398844c86bee08abe4ee3f206ecd86ad0a498f9) --- ext/spl/internal/emptyiterator.inc | 13 +++++++++++-- ext/spl/spl_iterators.c | 12 ++++++++++++ ext/spl/tests/bug60577.phpt | 8 ++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 ext/spl/tests/bug60577.phpt diff --git a/ext/spl/internal/emptyiterator.inc b/ext/spl/internal/emptyiterator.inc index ac80e79581239..d02b15b999c50 100644 --- a/ext/spl/internal/emptyiterator.inc +++ b/ext/spl/internal/emptyiterator.inc @@ -15,7 +15,7 @@ * @version 1.0 * @since PHP 5.1 */ -class EmptyIterator implements Iterator +class EmptyIterator implements Iterator, Countable { /** No operation. * @return void @@ -57,6 +57,15 @@ class EmptyIterator implements Iterator { // nothing to do } + + /** + * @return int + */ + function count() + { + return 0; + } + } -?> \ No newline at end of file +?> diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index eb8247654ecbd..ad76258413328 100644 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -3279,12 +3279,23 @@ SPL_METHOD(EmptyIterator, next) } } /* }}} */ +/* {{{ proto int EmptyIterator::count() + Does nothing */ +SPL_METHOD(EmptyIterator, count) +{ + if (zend_parse_parameters_none() == FAILURE) { + return; + } + RETURN_LONG(0); +} /* }}} */ + static const zend_function_entry spl_funcs_EmptyIterator[] = { SPL_ME(EmptyIterator, rewind, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(EmptyIterator, valid, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(EmptyIterator, key, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(EmptyIterator, current, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(EmptyIterator, next, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) + SPL_ME(EmptyIterator, count, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) PHP_FE_END }; @@ -3756,6 +3767,7 @@ PHP_MINIT_FUNCTION(spl_iterators) REGISTER_SPL_STD_CLASS_EX(EmptyIterator, NULL, spl_funcs_EmptyIterator); REGISTER_SPL_ITERATOR(EmptyIterator); + REGISTER_SPL_IMPLEMENTS(EmptyIterator, Countable); REGISTER_SPL_SUB_CLASS_EX(RecursiveTreeIterator, RecursiveIteratorIterator, spl_RecursiveTreeIterator_new, spl_funcs_RecursiveTreeIterator); REGISTER_SPL_CLASS_CONST_LONG(RecursiveTreeIterator, "BYPASS_CURRENT", RTIT_BYPASS_CURRENT); diff --git a/ext/spl/tests/bug60577.phpt b/ext/spl/tests/bug60577.phpt new file mode 100644 index 0000000000000..33fc133d0fb9e --- /dev/null +++ b/ext/spl/tests/bug60577.phpt @@ -0,0 +1,8 @@ +--TEST-- +count(new EmptyIterator) should return zero +--FILE-- + Date: Sun, 21 Apr 2013 14:32:02 +0700 Subject: [PATCH 112/400] Fix bug #64441 (FILTER_VALIDATE_URL rejects fully qualified domain names) (cherry picked from commit c149d4ee4be81ecf005eafd43ede06e70aa4c985) --- ext/filter/logical_filters.c | 4 ---- ext/filter/tests/bug64441.phpt | 11 +++++++++++ 2 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 ext/filter/tests/bug64441.phpt diff --git a/ext/filter/logical_filters.c b/ext/filter/logical_filters.c index 58d5870c112e1..c8f94a772cb50 100644 --- a/ext/filter/logical_filters.c +++ b/ext/filter/logical_filters.c @@ -484,10 +484,6 @@ void php_filter_validate_url(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */ } s++; } - - if (*(e - 1) == '.') { - goto bad_url; - } } if ( diff --git a/ext/filter/tests/bug64441.phpt b/ext/filter/tests/bug64441.phpt new file mode 100644 index 0000000000000..149079ec05323 --- /dev/null +++ b/ext/filter/tests/bug64441.phpt @@ -0,0 +1,11 @@ +--TEST-- +bug 64441, FILTER_VALIDATE_URL will invalidate a hostname that ended by dot +--SKIPIF-- + +--FILE-- + Date: Mon, 16 Sep 2013 14:43:01 +0800 Subject: [PATCH 113/400] Fixed bug #65665 (Exception not properly caught when opcache enabled) --- NEWS | 2 + ext/opcache/Optimizer/block_pass.c | 12 ++- ext/opcache/tests/bug65665.phpt | 118 +++++++++++++++++++++++++++++ 3 files changed, 128 insertions(+), 4 deletions(-) create mode 100644 ext/opcache/tests/bug65665.phpt diff --git a/NEWS b/NEWS index 5ec672eeda0e4..37db7e6c40857 100644 --- a/NEWS +++ b/NEWS @@ -17,6 +17,8 @@ PHP NEWS scaling methods. (Pierre) - OPcache: + . Fixed bug #65665 (Exception not properly caught when opcache enabled). + (Laruence) . Fixed bug #65510 (5.5.2 crashes in _get_zval_ptr_ptr_var). (Dmitry) - SPL: diff --git a/ext/opcache/Optimizer/block_pass.c b/ext/opcache/Optimizer/block_pass.c index 43ae30419fee9..1c34cffbf76e7 100644 --- a/ext/opcache/Optimizer/block_pass.c +++ b/ext/opcache/Optimizer/block_pass.c @@ -1283,11 +1283,15 @@ static void assemble_code_blocks(zend_cfg *cfg, zend_op_array *op_array) /* adjust exception jump targets */ if (op_array->last_try_catch) { - int i; - for (i = 0; i< op_array->last_try_catch; i++) { - op_array->try_catch_array[i].try_op = cfg->try[i]->start_opline - new_opcodes; - op_array->try_catch_array[i].catch_op = cfg->catch[i]->start_opline - new_opcodes; + int i, j; + for (i = 0, j = 0; i< op_array->last_try_catch; i++) { + if (cfg->try[i]->access) { + op_array->try_catch_array[j].try_op = cfg->try[i]->start_opline - new_opcodes; + op_array->try_catch_array[j].catch_op = cfg->catch[i]->start_opline - new_opcodes; + j++; + } } + op_array->last_try_catch = j; efree(cfg->try); efree(cfg->catch); } diff --git a/ext/opcache/tests/bug65665.phpt b/ext/opcache/tests/bug65665.phpt new file mode 100644 index 0000000000000..ac5c18dd83545 --- /dev/null +++ b/ext/opcache/tests/bug65665.phpt @@ -0,0 +1,118 @@ +--TEST-- +Bug #65665 (Exception not properly caught when opcache enabled) +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +--SKIPIF-- + +--FILE-- + Date: Mon, 16 Sep 2013 14:58:18 +0800 Subject: [PATCH 114/400] Add test for ISSUE #128 --- ext/opcache/tests/issue0128.phpt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 ext/opcache/tests/issue0128.phpt diff --git a/ext/opcache/tests/issue0128.phpt b/ext/opcache/tests/issue0128.phpt new file mode 100644 index 0000000000000..637f675ac2500 --- /dev/null +++ b/ext/opcache/tests/issue0128.phpt @@ -0,0 +1,16 @@ +--TEST-- +ISSUE #128 (opcache_invalidate segmentation fault) +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.optimization_level=-1 +--SKIPIF-- + +--FILE-- + +--EXPECT-- +bool(false) +string(4) "okey" From 52bd9f05ead1803e4deacb86affe3bf9ca47b68e Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Mon, 16 Sep 2013 09:29:42 +0200 Subject: [PATCH 115/400] this test is fragile on travis, let's see why --- ext/standard/tests/file/disk_free_space_basic.phpt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ext/standard/tests/file/disk_free_space_basic.phpt b/ext/standard/tests/file/disk_free_space_basic.phpt index 7ea8d36153f06..ec8a8535e2d56 100644 --- a/ext/standard/tests/file/disk_free_space_basic.phpt +++ b/ext/standard/tests/file/disk_free_space_basic.phpt @@ -35,8 +35,10 @@ var_dump( $space2 ); if( $space1 > $space2 ) echo "\n Free Space Value Is Correct\n"; -else +else { echo "\n Free Space Value Is Incorrect\n"; + var_dump($space1, $space2); +} echo "*** Testing with Binary Input ***\n"; var_dump( disk_free_space(b"$file_path") ); From b5283b9b7abecde841eb268c4b158cd76630d53b Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Mon, 16 Sep 2013 09:35:08 +0200 Subject: [PATCH 116/400] double test timeout for travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d149772e3144c..07653040dd9a7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,4 +29,4 @@ before_script: - . ./travis/ext/pdo_pgsql/setup.sh # Run PHPs run-tests.php -script: ./sapi/cli/php run-tests.php -p `pwd`/sapi/cli/php -g "FAIL,XFAIL,BORK,WARN,LEAK,SKIP" --show-diff +script: ./sapi/cli/php run-tests.php -p `pwd`/sapi/cli/php -g "FAIL,XFAIL,BORK,WARN,LEAK,SKIP" --show-diff --set-timeout 120 From ca3d5d06e4eea225f7da2202153d59545db0538e Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Mon, 16 Sep 2013 10:50:02 +0200 Subject: [PATCH 117/400] use 65k of data to get a more explicit result --- ext/standard/tests/file/disk_free_space_basic.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/tests/file/disk_free_space_basic.phpt b/ext/standard/tests/file/disk_free_space_basic.phpt index ec8a8535e2d56..bfa1db9397f34 100644 --- a/ext/standard/tests/file/disk_free_space_basic.phpt +++ b/ext/standard/tests/file/disk_free_space_basic.phpt @@ -25,7 +25,7 @@ $space1 = disk_free_space($file_path.$dir); var_dump( $space1 ); $fh = fopen($file_path.$dir."/disk_free_space.tmp", "a"); -$data = str_repeat("x", 4096); +$data = str_repeat("x", 0xffff); fwrite($fh, (binary)$data); fclose($fh); From 1939d9e3db2fdbc89bf002c7de00cc0623f321b3 Mon Sep 17 00:00:00 2001 From: David Soria Parra Date: Mon, 16 Sep 2013 05:21:42 +0200 Subject: [PATCH 118/400] NEWS for bug #64441 --- NEWS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NEWS b/NEWS index c7d5e030f3c99..67e31d044feac 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,10 @@ PHP NEWS . Fixed bug #64157 (DateTime::createFromFormat() reports confusing error message). (Boro Sitnikovski) +- Filter: + . Fixed bug #64441 (FILTER_VALIDATE_URL rejects fully qualified domain names). + (Syra) + ?? ??? 2013, PHP 5.4.20 - Core: From 6a0b90da84433ab1b0844a96036f3185d8a29cef Mon Sep 17 00:00:00 2001 From: David Soria Parra Date: Mon, 16 Sep 2013 16:23:29 +0200 Subject: [PATCH 119/400] NEWS for #60577 --- NEWS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/NEWS b/NEWS index 67e31d044feac..b1280b376bbca 100644 --- a/NEWS +++ b/NEWS @@ -14,6 +14,9 @@ PHP NEWS . Fixed bug #64441 (FILTER_VALIDATE_URL rejects fully qualified domain names). (Syra) +- SPL: + . Fixed bug #60577 (count(new EmptyIterator) returns 1). (Levi Morrison) + ?? ??? 2013, PHP 5.4.20 - Core: From 552f22abae0cf2dda3f72b034f656c4fef5761d2 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Tue, 17 Sep 2013 08:04:07 +0200 Subject: [PATCH 120/400] upload2G note --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index 64ca9a5df30b2..60fac8cc9486c 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,8 @@ PHP NEWS . 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) + . Uploads equal or greater than 2GB in size are now accepted. + (Ralf Lang, Mike) - cURL: . Implemented FR #65646 (re-enable CURLOPT_FOLLOWLOCATION with open_basedir From 7c279df6ae29d585021355559c07fa51f4373075 Mon Sep 17 00:00:00 2001 From: Sebastian Nohn Date: Sun, 15 Sep 2013 19:18:20 +0200 Subject: [PATCH 121/400] Add RFC 6598 IPs to reserved addresses (cherry picked from commit b3f5b822e9f83d99d7cb5eed36ba8d307d1408ee) --- ext/filter/logical_filters.c | 1 + ext/filter/tests/018.phpt | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/ext/filter/logical_filters.c b/ext/filter/logical_filters.c index c8f94a772cb50..71c5aba1e9323 100644 --- a/ext/filter/logical_filters.c +++ b/ext/filter/logical_filters.c @@ -714,6 +714,7 @@ void php_filter_validate_ip(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */ if (flags & FILTER_FLAG_NO_RES_RANGE) { if ( (ip[0] == 0) || + (ip[0] == 100 && (ip[1] == 0 || ip[1] <= 127)) || (ip[0] == 128 && ip[1] == 0) || (ip[0] == 191 && ip[1] == 255) || (ip[0] == 169 && ip[1] == 254) || diff --git a/ext/filter/tests/018.phpt b/ext/filter/tests/018.phpt index af52b2e60d67e..9c73fc3cfc4e6 100644 --- a/ext/filter/tests/018.phpt +++ b/ext/filter/tests/018.phpt @@ -15,6 +15,8 @@ var_dump(filter_var("192.168.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE var_dump(filter_var("192.0.34.166", FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)); var_dump(filter_var("127.0.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); var_dump(filter_var("192.0.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); +var_dump(filter_var("100.0.0.0", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); +var_dump(filter_var("100.127.255.255", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); var_dump(filter_var("192.0.34.166", FILTER_VALIDATE_IP)); var_dump(filter_var("256.1237.123.1", FILTER_VALIDATE_IP)); var_dump(filter_var("255.255.255.255", FILTER_VALIDATE_IP)); @@ -40,6 +42,8 @@ bool(false) string(12) "192.0.34.166" bool(false) string(9) "192.0.0.1" +bool(false) +bool(false) string(12) "192.0.34.166" bool(false) string(15) "255.255.255.255" From dfd7d1063a5292b04f6134284337550f4f513749 Mon Sep 17 00:00:00 2001 From: David Soria Parra Date: Tue, 17 Sep 2013 09:54:58 +0200 Subject: [PATCH 122/400] NEWS for added reserved ip addresses according to RFC 6598 --- NEWS | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS b/NEWS index b1280b376bbca..d8895bdfde7cc 100644 --- a/NEWS +++ b/NEWS @@ -11,6 +11,7 @@ PHP NEWS message). (Boro Sitnikovski) - Filter: + . Add RFC 6598 IPs to reserved addresses. (Sebastian Nohn) . Fixed bug #64441 (FILTER_VALIDATE_URL rejects fully qualified domain names). (Syra) From be581ec66d2e9085e9e12a70cbec227be00b8725 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Tue, 17 Sep 2013 16:54:27 +0800 Subject: [PATCH 123/400] Exclude bison 3.0 by Mike --- Zend/acinclude.m4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/acinclude.m4 b/Zend/acinclude.m4 index fe3ab63beb4c6..7fa8c99940596 100644 --- a/Zend/acinclude.m4 +++ b/Zend/acinclude.m4 @@ -9,7 +9,7 @@ AC_DEFUN([LIBZEND_BISON_CHECK],[ # 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" + bison_version_exclude="3.0" # for standalone build of Zend Engine test -z "$SED" && SED=sed From 4a3936ef4abdeb72c7d323fe4b6a65e1ae0ef181 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Tue, 17 Sep 2013 11:08:23 +0200 Subject: [PATCH 124/400] NEWS/UPGRADING{,.INTERNALS} notes about temp POST stream --- NEWS | 3 +++ UPGRADING | 14 ++++++++++++++ UPGRADING.INTERNALS | 10 ++++++++++ 3 files changed, 27 insertions(+) diff --git a/NEWS b/NEWS index 60fac8cc9486c..540f896fe4c68 100644 --- a/NEWS +++ b/NEWS @@ -11,6 +11,9 @@ PHP NEWS (Gustavo) . Uploads equal or greater than 2GB in size are now accepted. (Ralf Lang, Mike) + . Reduced POST data memory usage by 200-300%. Removed INI setting + always_populate_raw_post_data and the $HTTP_RAW_POST_DATA global + variable. (Mike) - cURL: . Implemented FR #65646 (re-enable CURLOPT_FOLLOWLOCATION with open_basedir diff --git a/UPGRADING b/UPGRADING index e9fba517d45b6..f5e7cd0bbdbb9 100755 --- a/UPGRADING +++ b/UPGRADING @@ -20,11 +20,23 @@ PHP X.Y UPGRADE NOTES 1. Backward Incompatible Changes ======================================== +- Core: + Removed $HTTP_RAW_POST_DATA global variable. Restore backwards compatibility + by: + ======================================== 2. New Features ======================================== +- Core: + The php://input stream is now re-usable and can be used concurrently with + enable_post_data_reading=0. ======================================== 2. Changes in SAPI modules @@ -91,6 +103,8 @@ PHP X.Y UPGRADE NOTES 10. Changes to INI File Handling ======================================== +- Core: + Removed always_populate_raw_post_data. ======================================== 11. Other Changes diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index 7cb5539fc1c22..90202f00f03ca 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -5,6 +5,7 @@ UPGRADE NOTES - PHP X.Y 1. Internal API changes a. Addition of do_operation and compare object handlers b. return_value_ptr now always available, RETVAL_ZVAL_FAST macros + c. POST data handling 2. Build system changes a. Unix build system changes @@ -57,6 +58,15 @@ UPGRADE NOTES - PHP X.Y 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. + + c. POST data handling + + The sapi_request_info's members post_data, post_data_len and raw_post_data as + well as raw_post_data_len have been replaced with a temp PHP stream + request_body. + + The recommended way to access raw POST data is to open and use a php://input + stream wrapper. It is safe to be used concurrently and more than once. ======================== 2. Build system changes From 41d78110ffd576a9afa352426ed2c15ab7308bec Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Tue, 17 Sep 2013 13:05:44 +0200 Subject: [PATCH 125/400] let the libsqlite3 symbols be exported in dll --- ext/sqlite3/config.w32 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/sqlite3/config.w32 b/ext/sqlite3/config.w32 index 01e4625feddd1..8ddb6b9ac8b4b 100644 --- a/ext/sqlite3/config.w32 +++ b/ext/sqlite3/config.w32 @@ -4,7 +4,7 @@ ARG_WITH("sqlite3", "SQLite 3 support", "no"); if (PHP_SQLITE3 != "no") { - ADD_FLAG("CFLAGS_SQLITE3", "/D SQLITE_THREADSAFE=" + (PHP_ZTS == "yes" ? "1" : "0") + " /D SQLITE_ENABLE_FTS3=1 /D SQLITE_ENABLE_COLUMN_METADATA=1 /D SQLITE_CORE=1 "); + ADD_FLAG("CFLAGS_SQLITE3", "/D SQLITE_THREADSAFE=" + (PHP_ZTS == "yes" ? "1" : "0") + " /D SQLITE_ENABLE_FTS3=1 /D SQLITE_ENABLE_COLUMN_METADATA=1 /D SQLITE_CORE=1 /D SQLITE_API=__declspec(dllexport) "); EXTENSION("sqlite3", "sqlite3.c", null, "/I" + configure_module_dirname + "/libsqlite /I" + configure_module_dirname); ADD_SOURCES(configure_module_dirname + "/libsqlite", "sqlite3.c", "sqlite3"); From 0f78d8612a7b16f1bbe3fb80a99896d7163c0aa7 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Tue, 17 Sep 2013 13:44:02 +0200 Subject: [PATCH 126/400] we need to use the full stream wrapper for filters --- ext/standard/php_fopen_wrapper.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ext/standard/php_fopen_wrapper.c b/ext/standard/php_fopen_wrapper.c index ca0b92ebdefc5..f624cf49588c4 100644 --- a/ext/standard/php_fopen_wrapper.c +++ b/ext/standard/php_fopen_wrapper.c @@ -73,8 +73,8 @@ static size_t php_stream_input_read(php_stream *stream, char *buf, size_t count { php_stream *inner = stream->abstract; - if (inner && inner->ops->read) { - size_t read = inner->ops->read(inner, buf, count TSRMLS_CC); + if (inner) { + size_t read = php_stream_read(inner, buf, count); stream->eof = inner->eof; return read; } @@ -99,8 +99,10 @@ static int php_stream_input_seek(php_stream *stream, off_t offset, int whence, o { php_stream *inner = stream->abstract; - if (inner && inner->ops->seek) { - return inner->ops->seek(inner, offset, whence, newoffset TSRMLS_CC); + if (inner) { + int sought = php_stream_seek(inner, offset, whence); + *newoffset = inner->position; + return sought; } return -1; From e6084da4735c945cb071c4d9259ea0d702eb77c6 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Tue, 17 Sep 2013 13:59:49 +0200 Subject: [PATCH 127/400] final bits --- ext/soap/soap.c | 1 + ext/standard/php_fopen_wrapper.c | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/ext/soap/soap.c b/ext/soap/soap.c index 980c9248aa675..c5900dc645af4 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -1599,6 +1599,7 @@ PHP_METHOD(SoapServer, handle) if (zf) { php_stream_filter_remove(zf, 1 TSRMLS_CC); + } } else { zval_ptr_dtor(&retval); return; diff --git a/ext/standard/php_fopen_wrapper.c b/ext/standard/php_fopen_wrapper.c index 064eee21ebe27..76f77ebf7b5f4 100644 --- a/ext/standard/php_fopen_wrapper.c +++ b/ext/standard/php_fopen_wrapper.c @@ -91,7 +91,7 @@ static size_t php_stream_input_read(php_stream *stream, char *buf, size_t count } php_stream_seek(*input->body_ptr, input->position, SEEK_SET); - read = (*input->body_ptr)->ops->read(*input->body_ptr, buf, count TSRMLS_CC); + read = php_stream_read(*input->body_ptr, buf, count); if (!read || read == (size_t) -1) { stream->eof = 1; @@ -105,6 +105,9 @@ static size_t php_stream_input_read(php_stream *stream, char *buf, size_t count static int php_stream_input_close(php_stream *stream, int close_handle TSRMLS_DC) /* {{{ */ { + efree(stream->abstract); + stream->abstract = NULL; + return 0; } /* }}} */ From 4a85b5e190d6651bee26bbbeff4ed09d2932f352 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Tue, 17 Sep 2013 16:02:08 +0200 Subject: [PATCH 128/400] fix build - PRIu64 vs %I64u --- main/php_variables.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/main/php_variables.c b/main/php_variables.c index af3a6aae7b7d4..353aa6357d47f 100644 --- a/main/php_variables.c +++ b/main/php_variables.c @@ -292,7 +292,11 @@ static inline int add_post_vars(zval *arr, post_var_data_t *vars, zend_bool eof while (add_post_var(arr, vars, eof TSRMLS_CC)) { if (++vars->cnt > max_vars) { php_error_docref(NULL TSRMLS_CC, E_WARNING, +#ifdef PHP_WIN32 + "Input variables exceeded %I64u. " +#else "Input variables exceeded %" PRIu64 ". " +#endif "To increase the limit change max_input_vars in php.ini.", max_vars); return FAILURE; From 002763fb7b603b30fab3955c0acd132298926c1b Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Wed, 18 Sep 2013 10:52:18 +0200 Subject: [PATCH 129/400] fix test concurrency --- ext/standard/tests/dir/chdir_basic.phpt | 24 ++++---- ext/standard/tests/dir/chdir_variation2.phpt | 58 +++++++++---------- ext/standard/tests/file/bug41655_2.phpt | 4 +- .../tests/file/fopen_include_path.inc | 2 +- .../tests/file/fopen_variation16.phpt | 2 +- .../tests/file/fopen_variation17.phpt | 2 +- .../tests/file/fscanf_variation53.phpt | 2 +- .../tests/file/rename_variation1.phpt | 12 ++-- .../tests/file/rename_variation2-win32.phpt | 18 +++--- .../tests/file/rename_variation2.phpt | 14 ++--- .../tests/file/rename_variation3.phpt | 18 +++--- .../tests/file/rename_variation4.phpt | 12 ++-- .../tests/file/rename_variation5.phpt | 12 ++-- .../stream_get_meta_data_socket_basic.phpt | 2 +- ...tream_get_meta_data_socket_variation1.phpt | 4 +- ...tream_get_meta_data_socket_variation2.phpt | 4 +- ...tream_get_meta_data_socket_variation3.phpt | 4 +- ...tream_get_meta_data_socket_variation4.phpt | 4 +- 18 files changed, 100 insertions(+), 98 deletions(-) diff --git a/ext/standard/tests/dir/chdir_basic.phpt b/ext/standard/tests/dir/chdir_basic.phpt index 5fc0e5b8867f0..81d3c7c9d1a1f 100644 --- a/ext/standard/tests/dir/chdir_basic.phpt +++ b/ext/standard/tests/dir/chdir_basic.phpt @@ -14,40 +14,40 @@ Test chdir() function : basic functionality echo "*** Testing chdir() : basic functionality ***\n"; $base_dir_path = dirname(__FILE__); -$level_one_dir_name = "level_one"; -$level_one_dir_path = "$base_dir_path/$level_one_dir_name"; +$level1_one_dir_name = "level1_one"; +$level1_one_dir_path = "$base_dir_path/$level1_one_dir_name"; -$level_two_dir_name = "level_two"; -$level_two_dir_path = "$base_dir_path/$level_one_dir_name/$level_two_dir_name"; +$level1_two_dir_name = "level1_two"; +$level1_two_dir_path = "$base_dir_path/$level1_one_dir_name/$level1_two_dir_name"; // create directories -mkdir($level_one_dir_path); -mkdir($level_two_dir_path); +mkdir($level1_one_dir_path); +mkdir($level1_two_dir_path); echo "\n-- Testing chdir() with absolute path: --\n"; chdir($base_dir_path); -var_dump(chdir($level_one_dir_path)); +var_dump(chdir($level1_one_dir_path)); var_dump(getcwd()); echo "\n-- Testing chdir() with relative paths: --\n"; -var_dump(chdir($level_two_dir_name)); +var_dump(chdir($level1_two_dir_name)); var_dump(getcwd()); ?> ===DONE=== --CLEAN-- --EXPECTF-- *** Testing chdir() : basic functionality *** -- Testing chdir() with absolute path: -- bool(true) -string(%d) "%slevel_one" +string(%d) "%slevel1_one" -- Testing chdir() with relative paths: -- bool(true) -string(%d) "%slevel_one%elevel_two" +string(%d) "%slevel1_one%elevel1_two" ===DONE=== diff --git a/ext/standard/tests/dir/chdir_variation2.phpt b/ext/standard/tests/dir/chdir_variation2.phpt index fa70f9e104f5d..9ca6a9774873d 100644 --- a/ext/standard/tests/dir/chdir_variation2.phpt +++ b/ext/standard/tests/dir/chdir_variation2.phpt @@ -15,32 +15,32 @@ echo "*** Testing chdir() : usage variations ***\n"; $base_dir_path = dirname(__FILE__); -$level_one_dir_name = "level_one"; -$level_one_dir_path = "$base_dir_path/$level_one_dir_name"; +$level2_one_dir_name = "level2_one"; +$level2_one_dir_path = "$base_dir_path/$level2_one_dir_name"; -$level_two_dir_name = "level_two"; -$level_two_dir_path = "$base_dir_path/$level_one_dir_name/$level_two_dir_name"; +$level2_two_dir_name = "level2_two"; +$level2_two_dir_path = "$base_dir_path/$level2_one_dir_name/$level2_two_dir_name"; // create directories -mkdir($level_one_dir_path); -mkdir($level_two_dir_path); +mkdir($level2_one_dir_path); +mkdir($level2_two_dir_path); -echo "\n-- \$directory = './level_one': --\n"; +echo "\n-- \$directory = './level2_one': --\n"; var_dump(chdir($base_dir_path)); -var_dump(chdir("./$level_one_dir_name")); +var_dump(chdir("./$level2_one_dir_name")); var_dump(getcwd()); -echo "\n-- \$directory = 'level_one/level_two': --\n"; +echo "\n-- \$directory = 'level2_one/level2_two': --\n"; var_dump(chdir($base_dir_path)); -var_dump(chdir("$level_one_dir_name/$level_two_dir_name")); +var_dump(chdir("$level2_one_dir_name/$level2_two_dir_name")); var_dump(getcwd()); echo "\n-- \$directory = '..': --\n"; var_dump(chdir('..')); var_dump(getcwd()); -echo "\n-- \$directory = 'level_two', '.': --\n"; -var_dump(chdir($level_two_dir_path)); +echo "\n-- \$directory = 'level2_two', '.': --\n"; +var_dump(chdir($level2_two_dir_path)); var_dump(chdir('.')); var_dump(getcwd()); @@ -49,13 +49,13 @@ var_dump(chdir('../')); var_dump(getcwd()); echo "\n-- \$directory = './': --\n"; -var_dump(chdir($level_two_dir_path)); +var_dump(chdir($level2_two_dir_path)); var_dump(chdir('./')); var_dump(getcwd()); -echo "\n-- \$directory = '../../'level_one': --\n"; -var_dump(chdir($level_two_dir_path)); -var_dump(chdir("../../$level_one_dir_name")); +echo "\n-- \$directory = '../../'level2_one': --\n"; +var_dump(chdir($level2_two_dir_path)); +var_dump(chdir("../../$level2_one_dir_name")); var_dump(getcwd()); ?> @@ -63,42 +63,42 @@ var_dump(getcwd()); --CLEAN-- --EXPECTF-- *** Testing chdir() : usage variations *** --- $directory = './level_one': -- +-- $directory = './level2_one': -- bool(true) bool(true) -string(%d) "%slevel_one" +string(%d) "%slevel2_one" --- $directory = 'level_one/level_two': -- +-- $directory = 'level2_one/level2_two': -- bool(true) bool(true) -string(%d) "%slevel_one%elevel_two" +string(%d) "%slevel2_one%elevel2_two" -- $directory = '..': -- bool(true) -string(%d) "%slevel_one" +string(%d) "%slevel2_one" --- $directory = 'level_two', '.': -- +-- $directory = 'level2_two', '.': -- bool(true) bool(true) -string(%d) "%slevel_one%elevel_two" +string(%d) "%slevel2_one%elevel2_two" -- $directory = '../': -- bool(true) -string(%d) "%slevel_one" +string(%d) "%slevel2_one" -- $directory = './': -- bool(true) bool(true) -string(%d) "%slevel_one%elevel_two" +string(%d) "%slevel2_one%elevel2_two" --- $directory = '../../'level_one': -- +-- $directory = '../../'level2_one': -- bool(true) bool(true) -string(%d) "%slevel_one" +string(%d) "%slevel2_one" ===DONE=== diff --git a/ext/standard/tests/file/bug41655_2.phpt b/ext/standard/tests/file/bug41655_2.phpt index d406f1ba0404b..96f5cc86f0e54 100644 --- a/ext/standard/tests/file/bug41655_2.phpt +++ b/ext/standard/tests/file/bug41655_2.phpt @@ -5,11 +5,13 @@ open_basedir=/ --FILE-- --EXPECTF-- Array ( [0] => %stest.csv + [1] => %stest2.csv + [2] => %stest3.csv ) diff --git a/ext/standard/tests/file/fopen_include_path.inc b/ext/standard/tests/file/fopen_include_path.inc index 7d6723a815018..5bc9b6ce3b201 100644 --- a/ext/standard/tests/file/fopen_include_path.inc +++ b/ext/standard/tests/file/fopen_include_path.inc @@ -1,6 +1,6 @@ --EXPECTF-- *** Testing rename() : renaming directory across directories *** diff --git a/ext/standard/tests/file/rename_variation2-win32.phpt b/ext/standard/tests/file/rename_variation2-win32.phpt index 87f4e7ddb139c..9627a9fa53012 100644 --- a/ext/standard/tests/file/rename_variation2-win32.phpt +++ b/ext/standard/tests/file/rename_variation2-win32.phpt @@ -15,27 +15,27 @@ if (substr(PHP_OS, 0, 3) != 'WIN') { require dirname(__FILE__).'/file.inc'; $file_path = dirname(__FILE__); -mkdir("$file_path/rename_variation_dir"); +mkdir("$file_path/rename_variation2_dir"); /* Renaming a file and directory to numeric name */ echo "\n*** Testing rename() by renaming a file and directory to numeric name ***\n"; -$fp = fopen($file_path."/rename_variation.tmp", "w"); +$fp = fopen($file_path."/rename_variation2.tmp", "w"); fclose($fp); // renaming existing file to numeric name -var_dump( rename($file_path."/rename_variation.tmp", $file_path."/12345") ); +var_dump( rename($file_path."/rename_variation2.tmp", $file_path."/12345") ); // ensure that rename worked fine -var_dump( file_exists($file_path."/rename_variation.tmp" ) ); // expecting false +var_dump( file_exists($file_path."/rename_variation2.tmp" ) ); // expecting false var_dump( file_exists($file_path."/12345" ) ); // expecting true unlink($file_path."/12345"); // renaming a directory to numeric name -var_dump( rename($file_path."/rename_variation_dir/", $file_path."/12345") ); +var_dump( rename($file_path."/rename_variation2_dir/", $file_path."/12345") ); // ensure that rename worked fine -var_dump( file_exists($file_path."/rename_variation_dir" ) ); // expecting false +var_dump( file_exists($file_path."/rename_variation2_dir" ) ); // expecting false var_dump( file_exists($file_path."/12345" ) ); // expecting true rmdir($file_path."/12345"); @@ -45,9 +45,9 @@ echo "Done\n"; --CLEAN-- --EXPECTF-- *** Testing rename() by renaming a file and directory to numeric name *** diff --git a/ext/standard/tests/file/rename_variation2.phpt b/ext/standard/tests/file/rename_variation2.phpt index fa3ee1e017f6b..1e0a5d9edd306 100644 --- a/ext/standard/tests/file/rename_variation2.phpt +++ b/ext/standard/tests/file/rename_variation2.phpt @@ -11,7 +11,7 @@ if (substr(PHP_OS, 0, 3) == 'WIN') { $file_path = dirname(__FILE__); -$dest_dir = "$file_path/rename_variation_dir"; +$dest_dir = "$file_path/rename_variation2_dir"; // create the $dest_dir mkdir($dest_dir); @@ -23,11 +23,11 @@ $filename = $file_path."/rename_variation2.tmp"; var_dump(touch($filename)); // create the soft links to the file -$linkname = $file_path."/rename_variation_soft_link1.tmp"; +$linkname = $file_path."/rename_variation2_soft_link1.tmp"; var_dump(symlink($filename, $linkname)); //rename the link to a new name in the same dir -$dest_linkname = $file_path."/rename_variation_soft_link2.tmp"; +$dest_linkname = $file_path."/rename_variation2_soft_link2.tmp"; var_dump( rename( $linkname, $dest_linkname) ); //ensure that link was renamed clearstatcache(); @@ -35,14 +35,14 @@ var_dump( file_exists($linkname) ); // expecting false var_dump( file_exists($dest_linkname) ); // expecting true // rename a link across dir -var_dump( rename($dest_linkname, $dest_dir."/rename_variation_soft_link2.tmp")); +var_dump( rename($dest_linkname, $dest_dir."/rename_variation2_soft_link2.tmp")); //ensure that link got renamed clearstatcache(); var_dump( file_exists($dest_linkname) ); // expecting false -var_dump( file_exists($dest_dir."/rename_variation_soft_link2.tmp") ); // expecting true +var_dump( file_exists($dest_dir."/rename_variation2_soft_link2.tmp") ); // expecting true // delete the link file now -unlink($dest_dir."/rename_variation_soft_link2.tmp"); +unlink($dest_dir."/rename_variation2_soft_link2.tmp"); echo "Done\n"; ?> @@ -50,7 +50,7 @@ echo "Done\n"; --EXPECTF-- *** Testing rename() on soft links *** diff --git a/ext/standard/tests/file/rename_variation3.phpt b/ext/standard/tests/file/rename_variation3.phpt index ce8921630b73c..7c47040729c77 100644 --- a/ext/standard/tests/file/rename_variation3.phpt +++ b/ext/standard/tests/file/rename_variation3.phpt @@ -11,41 +11,41 @@ if (substr(PHP_OS, 0, 3) == 'WIN') { $file_path = dirname(__FILE__); -$dest_dir = "$file_path/rename_variation_dir"; +$dest_dir = "$file_path/rename_variation3_dir"; // create the $dest_dir mkdir($dest_dir); echo "\n*** Testing rename() on hard links ***\n"; -$filename = $file_path."/rename_variation1.tmp"; +$filename = $file_path."/rename_variation31.tmp"; @unlink($filename); var_dump(touch($filename)); -$linkname = $file_path."/rename_variation_hard_link1.tmp"; +$linkname = $file_path."/rename_variation3_hard_link1.tmp"; var_dump(link($filename, $linkname)); //rename the link to a new name in the same dir -$dest_linkname = $file_path."/rename_variation_hard_link2.tmp"; +$dest_linkname = $file_path."/rename_variation3_hard_link2.tmp"; var_dump( rename( $filename, $dest_linkname) ); //ensure that link was renamed var_dump( file_exists($filename) ); // expecting false var_dump( file_exists($dest_linkname) ); // expecting true // rename a hard link across dir -var_dump( rename($dest_linkname, $dest_dir."/rename_variation_hard_link2.tmp") ); +var_dump( rename($dest_linkname, $dest_dir."/rename_variation3_hard_link2.tmp") ); //ensure that link got renamed var_dump( file_exists($dest_linkname) ); // expecting false -var_dump( file_exists($dest_dir."/rename_variation_hard_link2.tmp") ); // expecting true +var_dump( file_exists($dest_dir."/rename_variation3_hard_link2.tmp") ); // expecting true // delete the link file now -unlink($dest_dir."/rename_variation_hard_link2.tmp"); +unlink($dest_dir."/rename_variation3_hard_link2.tmp"); echo "Done\n"; ?> --CLEAN-- --EXPECTF-- *** Testing rename() on hard links *** diff --git a/ext/standard/tests/file/rename_variation4.phpt b/ext/standard/tests/file/rename_variation4.phpt index 2965f7534a64d..69753bc322fa7 100644 --- a/ext/standard/tests/file/rename_variation4.phpt +++ b/ext/standard/tests/file/rename_variation4.phpt @@ -15,22 +15,22 @@ require dirname(__FILE__).'/file.inc'; /* Renaming a file, link and directory to numeric name */ echo "\n*** Testing rename() by renaming a file, link and directory to numeric name ***\n"; -$fp = fopen($file_path."/rename_variation.tmp", "w"); +$fp = fopen($file_path."/rename_variation4.tmp", "w"); fclose($fp); // renaming existing file to numeric name -var_dump( rename($file_path."/rename_variation.tmp", $file_path."/12345") ); +var_dump( rename($file_path."/rename_variation4.tmp", $file_path."/12345") ); // ensure that rename worked fine -var_dump( file_exists($file_path."/rename_variation.tmp" ) ); // expecting false +var_dump( file_exists($file_path."/rename_variation4.tmp" ) ); // expecting false var_dump( file_exists($file_path."/12345" ) ); // expecting true // remove the file unlink($file_path."/12345"); -mkdir($file_path."/rename_variation_dir"); +mkdir($file_path."/rename_variation4_dir"); // renaming a directory to numeric name -var_dump( rename($file_path."/rename_variation_dir/", $file_path."/12345") ); +var_dump( rename($file_path."/rename_variation4_dir/", $file_path."/12345") ); // ensure that rename worked fine -var_dump( file_exists($file_path."/rename_variation_dir" ) ); // expecting false +var_dump( file_exists($file_path."/rename_variation4_dir" ) ); // expecting false var_dump( file_exists($file_path."/12345" ) ); // expecting true echo "Done\n"; diff --git a/ext/standard/tests/file/rename_variation5.phpt b/ext/standard/tests/file/rename_variation5.phpt index bf43e49510f3e..2518cf48ea8b8 100644 --- a/ext/standard/tests/file/rename_variation5.phpt +++ b/ext/standard/tests/file/rename_variation5.phpt @@ -13,14 +13,14 @@ if (substr(PHP_OS, 0, 3) == 'WIN') { and one another */ // create a dir $file_path = dirname(__FILE__); -$dirname = "$file_path/rename_variation_dir"; +$dirname = "$file_path/rename_variation5_dir"; mkdir($dirname); //create a file -$filename = "$file_path/rename_variation.tmp"; +$filename = "$file_path/rename_variation5.tmp"; $fp = fopen($filename, "w"); fclose($fp); // create a link -$linkname = "$file_path/rename_variation_link.tmp"; +$linkname = "$file_path/rename_variation5_link.tmp"; symlink($filename, $linkname); echo "\n-- Renaming link to same link name --\n"; @@ -54,9 +54,9 @@ echo "Done\n"; --CLEAN-- --EXPECTF-- -- Renaming link to same link name -- diff --git a/ext/standard/tests/streams/stream_get_meta_data_socket_basic.phpt b/ext/standard/tests/streams/stream_get_meta_data_socket_basic.phpt index 86056114b877c..86c9cd77c8a4a 100644 --- a/ext/standard/tests/streams/stream_get_meta_data_socket_basic.phpt +++ b/ext/standard/tests/streams/stream_get_meta_data_socket_basic.phpt @@ -3,7 +3,7 @@ stream_get_meta_data() on a udp socket --FILE-- Date: Wed, 18 Sep 2013 10:52:35 +0200 Subject: [PATCH 130/400] fix test concurrency --- ext/spl/tests/DirectoryIterator_getBasename_basic_test.phpt | 4 ++-- ext/spl/tests/DirectoryIterator_getBasename_pass_array.phpt | 4 ++-- .../tests/RecursiveDirectoryIterator_getSubPath_basic.phpt | 4 ++-- .../RecursiveDirectoryIterator_getSubPathname_basic.phpt | 4 ++-- ext/spl/tests/SplFileObject_fgetcsv_basic.phpt | 6 +++--- ext/spl/tests/SplFileObject_fgetcsv_delimiter_basic.phpt | 6 +++--- ext/spl/tests/SplFileObject_fgetcsv_delimiter_error.phpt | 6 +++--- ext/spl/tests/SplFileObject_fgetcsv_enclosure_basic.phpt | 6 +++--- ext/spl/tests/SplFileObject_fgetcsv_enclosure_error.phpt | 6 +++--- ext/spl/tests/SplFileObject_fgetcsv_escape_basic.phpt | 6 +++--- ext/spl/tests/SplFileObject_fgetcsv_escape_default.phpt | 6 +++--- ext/spl/tests/SplFileObject_fgetcsv_escape_error.phpt | 6 +++--- ext/spl/tests/SplFileObject_fputcsv_002.phpt | 4 ++-- ext/spl/tests/SplFileObject_fputcsv_error.phpt | 4 ++-- ext/spl/tests/dit_006.phpt | 2 +- 15 files changed, 37 insertions(+), 37 deletions(-) diff --git a/ext/spl/tests/DirectoryIterator_getBasename_basic_test.phpt b/ext/spl/tests/DirectoryIterator_getBasename_basic_test.phpt index ed1f473be9ed3..d4f22f68a1ba3 100644 --- a/ext/spl/tests/DirectoryIterator_getBasename_basic_test.phpt +++ b/ext/spl/tests/DirectoryIterator_getBasename_basic_test.phpt @@ -4,7 +4,7 @@ DirectoryIterator::getBasename() - Basic Test PHPNW Testfest 2009 - Adrian Hardy --FILE-- --CLEAN-- diff --git a/ext/spl/tests/DirectoryIterator_getBasename_pass_array.phpt b/ext/spl/tests/DirectoryIterator_getBasename_pass_array.phpt index b2df8a55c947d..ef1352023748c 100644 --- a/ext/spl/tests/DirectoryIterator_getBasename_pass_array.phpt +++ b/ext/spl/tests/DirectoryIterator_getBasename_pass_array.phpt @@ -4,7 +4,7 @@ DirectoryIterator::getBasename() - Pass unexpected array PHPNW Testfest 2009 - Adrian Hardy --FILE-- --CLEAN-- diff --git a/ext/spl/tests/RecursiveDirectoryIterator_getSubPath_basic.phpt b/ext/spl/tests/RecursiveDirectoryIterator_getSubPath_basic.phpt index f0b2b0182cc90..f6bc266cb1d2a 100644 --- a/ext/spl/tests/RecursiveDirectoryIterator_getSubPath_basic.phpt +++ b/ext/spl/tests/RecursiveDirectoryIterator_getSubPath_basic.phpt @@ -5,7 +5,7 @@ Pawel Krynicki #testfest AmsterdamPHP 2012-06-23 --FILE-- diff --git a/ext/spl/tests/RecursiveDirectoryIterator_getSubPathname_basic.phpt b/ext/spl/tests/RecursiveDirectoryIterator_getSubPathname_basic.phpt index 7b12672e14c50..6527d84bfe854 100644 --- a/ext/spl/tests/RecursiveDirectoryIterator_getSubPathname_basic.phpt +++ b/ext/spl/tests/RecursiveDirectoryIterator_getSubPathname_basic.phpt @@ -5,7 +5,7 @@ Pawel Krynicki #testfest AmsterdamPHP 2012-06-23 --FILE-- --EXPECTF-- diff --git a/ext/spl/tests/SplFileObject_fgetcsv_basic.phpt b/ext/spl/tests/SplFileObject_fgetcsv_basic.phpt index abfe5f235f334..84b540369865c 100644 --- a/ext/spl/tests/SplFileObject_fgetcsv_basic.phpt +++ b/ext/spl/tests/SplFileObject_fgetcsv_basic.phpt @@ -2,7 +2,7 @@ SplFileObject::fgetcsv default path --FILE-- fgetcsv()); ?> --CLEAN-- --EXPECTF-- array(4) { diff --git a/ext/spl/tests/SplFileObject_fgetcsv_delimiter_basic.phpt b/ext/spl/tests/SplFileObject_fgetcsv_delimiter_basic.phpt index 4402d6ca4c32e..a8125a0257128 100644 --- a/ext/spl/tests/SplFileObject_fgetcsv_delimiter_basic.phpt +++ b/ext/spl/tests/SplFileObject_fgetcsv_delimiter_basic.phpt @@ -2,7 +2,7 @@ SplFileObject::fgetcsv with alternative delimiter --FILE-- fgetcsv('|')); ?> --CLEAN-- --EXPECTF-- array(4) { diff --git a/ext/spl/tests/SplFileObject_fgetcsv_delimiter_error.phpt b/ext/spl/tests/SplFileObject_fgetcsv_delimiter_error.phpt index 64d6514a29a4a..169ded7dc3ccd 100644 --- a/ext/spl/tests/SplFileObject_fgetcsv_delimiter_error.phpt +++ b/ext/spl/tests/SplFileObject_fgetcsv_delimiter_error.phpt @@ -2,7 +2,7 @@ SplFileObject::fgetcsv with alternative delimiter --FILE-- fgetcsv('invalid')); ?> --CLEAN-- --EXPECTF-- Warning: SplFileObject::fgetcsv(): delimiter must be a character in %s on line %d diff --git a/ext/spl/tests/SplFileObject_fgetcsv_enclosure_basic.phpt b/ext/spl/tests/SplFileObject_fgetcsv_enclosure_basic.phpt index efbb5fb68559f..efe765cbf84dd 100644 --- a/ext/spl/tests/SplFileObject_fgetcsv_enclosure_basic.phpt +++ b/ext/spl/tests/SplFileObject_fgetcsv_enclosure_basic.phpt @@ -2,7 +2,7 @@ SplFileObject::fgetcsv with alternative delimiter --FILE-- fgetcsv(',', '"')); ?> --CLEAN-- --EXPECTF-- array(4) { diff --git a/ext/spl/tests/SplFileObject_fgetcsv_enclosure_error.phpt b/ext/spl/tests/SplFileObject_fgetcsv_enclosure_error.phpt index 7487b8353c96a..f8c14f0e35e41 100644 --- a/ext/spl/tests/SplFileObject_fgetcsv_enclosure_error.phpt +++ b/ext/spl/tests/SplFileObject_fgetcsv_enclosure_error.phpt @@ -2,7 +2,7 @@ SplFileObject::fgetcsv with alternative delimiter --FILE-- fgetcsv(',', 'invalid')); ?> --CLEAN-- --EXPECTF-- Warning: SplFileObject::fgetcsv(): enclosure must be a character in %s on line %d diff --git a/ext/spl/tests/SplFileObject_fgetcsv_escape_basic.phpt b/ext/spl/tests/SplFileObject_fgetcsv_escape_basic.phpt index 1a94532b2b6b5..960f36d63f635 100644 --- a/ext/spl/tests/SplFileObject_fgetcsv_escape_basic.phpt +++ b/ext/spl/tests/SplFileObject_fgetcsv_escape_basic.phpt @@ -2,16 +2,16 @@ SplFileObject::fgetcsv with alternative delimiter --FILE-- fgetcsv(',', '"', '"')); ?> --CLEAN-- --EXPECTF-- array(3) { diff --git a/ext/spl/tests/SplFileObject_fgetcsv_escape_default.phpt b/ext/spl/tests/SplFileObject_fgetcsv_escape_default.phpt index c628ac043d82c..69089636c1166 100644 --- a/ext/spl/tests/SplFileObject_fgetcsv_escape_default.phpt +++ b/ext/spl/tests/SplFileObject_fgetcsv_escape_default.phpt @@ -2,16 +2,16 @@ SplFileObject::fgetcsv with default escape character --FILE-- fgetcsv()); ?> --CLEAN-- --EXPECTF-- array(3) { diff --git a/ext/spl/tests/SplFileObject_fgetcsv_escape_error.phpt b/ext/spl/tests/SplFileObject_fgetcsv_escape_error.phpt index fd90103bfa7ef..b49bcdd13c345 100644 --- a/ext/spl/tests/SplFileObject_fgetcsv_escape_error.phpt +++ b/ext/spl/tests/SplFileObject_fgetcsv_escape_error.phpt @@ -2,16 +2,16 @@ SplFileObject::fgetcsv with alternative delimiter --FILE-- fgetcsv(',', '"', 'invalid')); ?> --CLEAN-- --EXPECTF-- Warning: SplFileObject::fgetcsv(): escape must be a character in %s on line %d diff --git a/ext/spl/tests/SplFileObject_fputcsv_002.phpt b/ext/spl/tests/SplFileObject_fputcsv_002.phpt index db174931f704b..fdd4112ee6dd5 100644 --- a/ext/spl/tests/SplFileObject_fputcsv_002.phpt +++ b/ext/spl/tests/SplFileObject_fputcsv_002.phpt @@ -2,7 +2,7 @@ SplFileObject::fputcsv(): Checking data after calling the function --FILE-- --CLEAN-- --EXPECTF-- diff --git a/ext/spl/tests/SplFileObject_fputcsv_error.phpt b/ext/spl/tests/SplFileObject_fputcsv_error.phpt index 8368e4211dedc..cdee48c874b7e 100644 --- a/ext/spl/tests/SplFileObject_fputcsv_error.phpt +++ b/ext/spl/tests/SplFileObject_fputcsv_error.phpt @@ -2,7 +2,7 @@ SplFileObject::fputcsv(): error conditions --FILE-- fputcsv($fields, $delim, $enclosure, $fo) ); echo "Done\n"; --CLEAN-- --EXPECTF-- diff --git a/ext/spl/tests/dit_006.phpt b/ext/spl/tests/dit_006.phpt index 1e627a20e0adc..9edbb9f15716e 100644 --- a/ext/spl/tests/dit_006.phpt +++ b/ext/spl/tests/dit_006.phpt @@ -2,7 +2,7 @@ SPL: DirectoryIterator and seek --FILE-- seek(2); $n = 0; From 14d53417879256044c40b2ef8d0aa32b1f215acb Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Wed, 18 Sep 2013 10:52:51 +0200 Subject: [PATCH 131/400] fix test concurrency --- ext/phar/tests/031.phpt | 4 ++-- ext/phar/tests/032.phpt | 4 ++-- ext/phar/tests/files/phar_oo_test.inc | 3 ++- ext/phar/tests/phar_buildfromdirectory1.phpt | 4 ++-- .../tests/phar_buildfromdirectory2-win.phpt | 4 ++-- ext/phar/tests/phar_buildfromdirectory2.phpt | 4 ++-- ext/phar/tests/phar_buildfromdirectory3.phpt | 4 ++-- ext/phar/tests/phar_buildfromdirectory4.phpt | 24 +++++++++---------- ext/phar/tests/phar_buildfromdirectory5.phpt | 24 +++++++++---------- ext/phar/tests/phar_buildfromdirectory6.phpt | 16 ++++++------- ext/phar/tests/phar_buildfromiterator1.phpt | 4 ++-- ext/phar/tests/phar_buildfromiterator10.phpt | 4 ++-- ext/phar/tests/phar_buildfromiterator2.phpt | 4 ++-- ext/phar/tests/phar_buildfromiterator3.phpt | 4 ++-- ext/phar/tests/phar_buildfromiterator4.phpt | 4 ++-- ext/phar/tests/phar_buildfromiterator5.phpt | 4 ++-- ext/phar/tests/phar_buildfromiterator6.phpt | 4 ++-- ext/phar/tests/phar_buildfromiterator7.phpt | 4 ++-- ext/phar/tests/phar_buildfromiterator8.phpt | 4 ++-- ext/phar/tests/phar_buildfromiterator9.phpt | 4 ++-- ext/phar/tests/phar_extract.phpt | 8 +++---- ext/phar/tests/phar_extract2.phpt | 8 +++---- ext/phar/tests/phar_extract3.phpt | 4 ++-- ext/phar/tests/phar_oo_001.phpt | 2 +- ext/phar/tests/phar_oo_001U.phpt | 2 +- ext/phar/tests/phar_oo_002.phpt | 20 ++++++++-------- ext/phar/tests/phar_oo_002U.phpt | 20 ++++++++-------- ext/phar/tests/phar_oo_003.phpt | 2 +- ext/phar/tests/phar_oo_004.phpt | 2 +- ext/phar/tests/phar_oo_004U.phpt | 2 +- ext/phar/tests/phar_oo_005.phpt | 2 +- ext/phar/tests/phar_oo_005U.phpt | 2 +- ext/phar/tests/phar_oo_005_5.2.phpt | 2 +- ext/phar/tests/phar_oo_006.phpt | 2 +- ext/phar/tests/phar_oo_007.phpt | 6 ++--- ext/phar/tests/phar_oo_008.phpt | 2 +- ext/phar/tests/phar_oo_009.phpt | 2 +- ext/phar/tests/phar_oo_010.phpt | 2 +- ext/phar/tests/phar_oo_011.phpt | 2 +- ext/phar/tests/phar_oo_011b.phpt | 2 +- ext/phar/tests/phar_oo_012.phpt | 2 +- ext/phar/tests/phar_oo_012_confirm.phpt | 2 +- ext/phar/tests/phar_oo_012b.phpt | 2 +- 43 files changed, 116 insertions(+), 115 deletions(-) diff --git a/ext/phar/tests/031.phpt b/ext/phar/tests/031.phpt index 4d5988621de88..d458f068f5513 100644 --- a/ext/phar/tests/031.phpt +++ b/ext/phar/tests/031.phpt @@ -22,10 +22,10 @@ require $pname; ===DONE=== --CLEAN-- --EXPECTF-- string(25) "getMessage(); ===DONE=== --CLEAN-- --EXPECTF-- -phar "%sphar_oo_test.phar.php" does not have a signature===DONE=== \ No newline at end of file +phar "%s032.phar.php" does not have a signature===DONE=== \ No newline at end of file diff --git a/ext/phar/tests/files/phar_oo_test.inc b/ext/phar/tests/files/phar_oo_test.inc index e92b4444c1572..45421568dee10 100644 --- a/ext/phar/tests/files/phar_oo_test.inc +++ b/ext/phar/tests/files/phar_oo_test.inc @@ -2,7 +2,8 @@ ini_set('date.timezone', 'GMT'); -$fname = dirname(__FILE__) . '/phar_oo_test.phar.php'; +$tname = basename(current(get_included_files()), ".php"); +$fname = dirname(__FILE__) . "/$tname.phar.php"; $pname = 'phar://' . $fname; $file = (binary)''; diff --git a/ext/phar/tests/phar_buildfromdirectory1.phpt b/ext/phar/tests/phar_buildfromdirectory1.phpt index 63e06fa474de8..957f246664f67 100644 --- a/ext/phar/tests/phar_buildfromdirectory1.phpt +++ b/ext/phar/tests/phar_buildfromdirectory1.phpt @@ -7,7 +7,7 @@ phar.require_hash=0 phar.readonly=0 --FILE-- buildFromDirectory(1); @@ -19,7 +19,7 @@ try { ===DONE=== --CLEAN-- --EXPECTF-- diff --git a/ext/phar/tests/phar_buildfromdirectory2-win.phpt b/ext/phar/tests/phar_buildfromdirectory2-win.phpt index 9dbcf965e32ba..5ed890a48bfb1 100644 --- a/ext/phar/tests/phar_buildfromdirectory2-win.phpt +++ b/ext/phar/tests/phar_buildfromdirectory2-win.phpt @@ -11,7 +11,7 @@ phar.readonly=0 --FILE-- buildFromDirectory(1); } catch (Exception $e) { var_dump(get_class($e)); @@ -21,7 +21,7 @@ try { ===DONE=== --CLEAN-- --EXPECTF-- diff --git a/ext/phar/tests/phar_buildfromdirectory2.phpt b/ext/phar/tests/phar_buildfromdirectory2.phpt index 639ff0bd4b77f..a33e50abbb0b7 100644 --- a/ext/phar/tests/phar_buildfromdirectory2.phpt +++ b/ext/phar/tests/phar_buildfromdirectory2.phpt @@ -11,7 +11,7 @@ phar.readonly=0 --FILE-- buildFromDirectory(1); } catch (Exception $e) { var_dump(get_class($e)); @@ -21,7 +21,7 @@ try { ===DONE=== --CLEAN-- --EXPECTF-- diff --git a/ext/phar/tests/phar_buildfromdirectory3.phpt b/ext/phar/tests/phar_buildfromdirectory3.phpt index 2134cbdb5397a..921e39593ddc8 100644 --- a/ext/phar/tests/phar_buildfromdirectory3.phpt +++ b/ext/phar/tests/phar_buildfromdirectory3.phpt @@ -9,7 +9,7 @@ phar.readonly=0 buildFromDirectory('files', new stdClass); } catch (Exception $e) { var_dump(get_class($e)); @@ -19,7 +19,7 @@ try { ===DONE=== --CLEAN-- --EXPECTF-- diff --git a/ext/phar/tests/phar_buildfromdirectory4.phpt b/ext/phar/tests/phar_buildfromdirectory4.phpt index 683ac4bbc8365..5ee2c33871a51 100644 --- a/ext/phar/tests/phar_buildfromdirectory4.phpt +++ b/ext/phar/tests/phar_buildfromdirectory4.phpt @@ -9,14 +9,14 @@ open_basedir= --FILE-- buildFromDirectory(dirname(__FILE__) . '/testdir'); + $phar = new Phar(dirname(__FILE__) . '/buildfromdirectory4.phar'); + $a = $phar->buildFromDirectory(dirname(__FILE__) . '/testdir4'); asort($a); var_dump($a); } catch (Exception $e) { @@ -24,28 +24,28 @@ try { echo $e->getMessage() . "\n"; } -var_dump(file_exists(dirname(__FILE__) . '/buildfromdirectory.phar')); +var_dump(file_exists(dirname(__FILE__) . '/buildfromdirectory4.phar')); ?> ===DONE=== --CLEAN-- --EXPECTF-- array(4) { ["file1.txt"]=> - string(%d) "%stestdir%cfile1.txt" + string(%d) "%stestdir4%cfile1.txt" ["file2.txt"]=> - string(%d) "%stestdir%cfile2.txt" + string(%d) "%stestdir4%cfile2.txt" ["file3.txt"]=> - string(%d) "%stestdir%cfile3.txt" + string(%d) "%stestdir4%cfile3.txt" ["file4.txt"]=> - string(%d) "%stestdir%cfile4.txt" + string(%d) "%stestdir4%cfile4.txt" } bool(true) ===DONE=== diff --git a/ext/phar/tests/phar_buildfromdirectory5.phpt b/ext/phar/tests/phar_buildfromdirectory5.phpt index 51e5cec6911af..f20c52ab91f95 100644 --- a/ext/phar/tests/phar_buildfromdirectory5.phpt +++ b/ext/phar/tests/phar_buildfromdirectory5.phpt @@ -8,14 +8,14 @@ phar.readonly=0 --FILE-- buildFromDirectory(dirname(__FILE__) . '/testdir', '/\.txt/'); + $phar = new Phar(dirname(__FILE__) . '/buildfromdirectory5.phar'); + $a = $phar->buildFromDirectory(dirname(__FILE__) . '/testdir5', '/\.txt/'); asort($a); var_dump($a); } catch (Exception $e) { @@ -23,28 +23,28 @@ try { echo $e->getMessage() . "\n"; } -var_dump(file_exists(dirname(__FILE__) . '/buildfromdirectory.phar')); +var_dump(file_exists(dirname(__FILE__) . '/buildfromdirectory5.phar')); ?> ===DONE=== --CLEAN-- --EXPECTF-- array(4) { ["file1.txt"]=> - string(%d) "%stestdir%cfile1.txt" + string(%d) "%stestdir5%cfile1.txt" ["file2.txt"]=> - string(%d) "%stestdir%cfile2.txt" + string(%d) "%stestdir5%cfile2.txt" ["file3.txt"]=> - string(%d) "%stestdir%cfile3.txt" + string(%d) "%stestdir5%cfile3.txt" ["file4.txt"]=> - string(%d) "%stestdir%cfile4.txt" + string(%d) "%stestdir5%cfile4.txt" } bool(true) ===DONE=== diff --git a/ext/phar/tests/phar_buildfromdirectory6.phpt b/ext/phar/tests/phar_buildfromdirectory6.phpt index 99566c192669e..5537ebac2358b 100644 --- a/ext/phar/tests/phar_buildfromdirectory6.phpt +++ b/ext/phar/tests/phar_buildfromdirectory6.phpt @@ -8,30 +8,30 @@ phar.readonly=0 --FILE-- buildFromDirectory(dirname(__FILE__) . '/testdir', '/\.php$/')); + $phar = new Phar(dirname(__FILE__) . '/buildfromdirectory6.phar'); + var_dump($phar->buildFromDirectory(dirname(__FILE__) . '/testdir6', '/\.php$/')); } catch (Exception $e) { var_dump(get_class($e)); echo $e->getMessage() . "\n"; } -var_dump(file_exists(dirname(__FILE__) . '/buildfromdirectory.phar')); +var_dump(file_exists(dirname(__FILE__) . '/buildfromdirectory6.phar')); ?> ===DONE=== --CLEAN-- --EXPECT-- array(0) { diff --git a/ext/phar/tests/phar_buildfromiterator1.phpt b/ext/phar/tests/phar_buildfromiterator1.phpt index 238ede6cbe160..0f656b64f2053 100644 --- a/ext/phar/tests/phar_buildfromiterator1.phpt +++ b/ext/phar/tests/phar_buildfromiterator1.phpt @@ -7,7 +7,7 @@ phar.require_hash=0 phar.readonly=0 --FILE-- buildFromIterator(1); @@ -19,7 +19,7 @@ try { ===DONE=== --CLEAN-- --EXPECTF-- diff --git a/ext/phar/tests/phar_buildfromiterator10.phpt b/ext/phar/tests/phar_buildfromiterator10.phpt index 024277ed0acc6..e6b9c025da8c8 100644 --- a/ext/phar/tests/phar_buildfromiterator10.phpt +++ b/ext/phar/tests/phar_buildfromiterator10.phpt @@ -11,7 +11,7 @@ phar.readonly=0 buildFromIterator(new RegexIterator($iter, '/_\d{3}\.phpt$/'), dirname(__FILE__) . DIRECTORY_SEPARATOR); @@ -25,7 +25,7 @@ try { ===DONE=== --CLEAN-- --EXPECTF-- diff --git a/ext/phar/tests/phar_buildfromiterator2.phpt b/ext/phar/tests/phar_buildfromiterator2.phpt index cdc2df1050be0..e9dd26e9de074 100644 --- a/ext/phar/tests/phar_buildfromiterator2.phpt +++ b/ext/phar/tests/phar_buildfromiterator2.phpt @@ -8,7 +8,7 @@ phar.readonly=0 --FILE-- buildFromIterator(new stdClass); } catch (Exception $e) { var_dump(get_class($e)); @@ -18,7 +18,7 @@ try { ===DONE=== --CLEAN-- --EXPECTF-- diff --git a/ext/phar/tests/phar_buildfromiterator3.phpt b/ext/phar/tests/phar_buildfromiterator3.phpt index 4a3bc7c0a52de..1603631278397 100644 --- a/ext/phar/tests/phar_buildfromiterator3.phpt +++ b/ext/phar/tests/phar_buildfromiterator3.phpt @@ -36,7 +36,7 @@ class myIterator implements Iterator } } try { - $phar = new Phar(dirname(__FILE__) . '/buildfromiterator.phar'); + $phar = new Phar(dirname(__FILE__) . '/buildfromiterator3.phar'); $phar->buildFromIterator(new myIterator(array()), new stdClass); } catch (Exception $e) { var_dump(get_class($e)); @@ -46,7 +46,7 @@ try { ===DONE=== --CLEAN-- --EXPECTF-- diff --git a/ext/phar/tests/phar_buildfromiterator4.phpt b/ext/phar/tests/phar_buildfromiterator4.phpt index cd261386d5d73..9277db562b481 100644 --- a/ext/phar/tests/phar_buildfromiterator4.phpt +++ b/ext/phar/tests/phar_buildfromiterator4.phpt @@ -37,7 +37,7 @@ class myIterator implements Iterator } try { chdir(dirname(__FILE__)); - $phar = new Phar(dirname(__FILE__) . '/buildfromiterator.phar'); + $phar = new Phar(dirname(__FILE__) . '/buildfromiterator4.phar'); var_dump($phar->buildFromIterator(new myIterator( array( 'a' => basename(__FILE__, 'php') . 'phpt', @@ -54,7 +54,7 @@ try { ===DONE=== --CLEAN-- --EXPECTF-- diff --git a/ext/phar/tests/phar_buildfromiterator5.phpt b/ext/phar/tests/phar_buildfromiterator5.phpt index 8431c12a7c64b..b6fafec6f4f92 100644 --- a/ext/phar/tests/phar_buildfromiterator5.phpt +++ b/ext/phar/tests/phar_buildfromiterator5.phpt @@ -37,7 +37,7 @@ class myIterator implements Iterator } try { chdir(dirname(__FILE__)); - $phar = new Phar(dirname(__FILE__) . '/buildfromiterator.phar'); + $phar = new Phar(dirname(__FILE__) . '/buildfromiterator5.phar'); var_dump($phar->buildFromIterator(new myIterator(array('a' => new stdClass)))); } catch (Exception $e) { var_dump(get_class($e)); @@ -47,7 +47,7 @@ try { ===DONE=== --CLEAN-- --EXPECTF-- diff --git a/ext/phar/tests/phar_buildfromiterator6.phpt b/ext/phar/tests/phar_buildfromiterator6.phpt index 9c506c85283f8..3a315fae4dcb3 100644 --- a/ext/phar/tests/phar_buildfromiterator6.phpt +++ b/ext/phar/tests/phar_buildfromiterator6.phpt @@ -37,7 +37,7 @@ class myIterator implements Iterator } try { chdir(dirname(__FILE__)); - $phar = new Phar(dirname(__FILE__) . '/buildfromiterator.phar'); + $phar = new Phar(dirname(__FILE__) . '/buildfromiterator6.phar'); var_dump($phar->buildFromIterator(new myIterator(array(basename(__FILE__, 'php') . 'phpt')))); } catch (Exception $e) { var_dump(get_class($e)); @@ -47,7 +47,7 @@ try { ===DONE=== --CLEAN-- --EXPECTF-- diff --git a/ext/phar/tests/phar_buildfromiterator7.phpt b/ext/phar/tests/phar_buildfromiterator7.phpt index 2bac4c8269a57..3dd8fc1b001d0 100644 --- a/ext/phar/tests/phar_buildfromiterator7.phpt +++ b/ext/phar/tests/phar_buildfromiterator7.phpt @@ -37,7 +37,7 @@ class myIterator implements Iterator } try { chdir(dirname(__FILE__)); - $phar = new Phar(dirname(__FILE__) . '/buildfromiterator.phar'); + $phar = new Phar(dirname(__FILE__) . '/buildfromiterator7.phar'); var_dump($phar->buildFromIterator(new myIterator(array('a' => basename(__FILE__, 'php') . '/oopsie/there.phpt')))); } catch (Exception $e) { var_dump(get_class($e)); @@ -47,7 +47,7 @@ try { ===DONE=== --CLEAN-- --EXPECTF-- diff --git a/ext/phar/tests/phar_buildfromiterator8.phpt b/ext/phar/tests/phar_buildfromiterator8.phpt index bb1b780d759b7..de37ee868784d 100644 --- a/ext/phar/tests/phar_buildfromiterator8.phpt +++ b/ext/phar/tests/phar_buildfromiterator8.phpt @@ -8,7 +8,7 @@ phar.readonly=0 buildFromIterator(new RegexIterator(new DirectoryIterator('.'), '/^\d{0,3}\.phpt\\z|^\.\\z|^\.\.\\z/'), dirname(__FILE__) . DIRECTORY_SEPARATOR); asort($a); var_dump($a); @@ -20,7 +20,7 @@ try { ===DONE=== --CLEAN-- --EXPECTF-- diff --git a/ext/phar/tests/phar_buildfromiterator9.phpt b/ext/phar/tests/phar_buildfromiterator9.phpt index 0b56307545677..2c9306b6cc86e 100644 --- a/ext/phar/tests/phar_buildfromiterator9.phpt +++ b/ext/phar/tests/phar_buildfromiterator9.phpt @@ -37,7 +37,7 @@ class myIterator implements Iterator } try { chdir(dirname(__FILE__)); - $phar = new Phar(dirname(__FILE__) . '/buildfromiterator.phar'); + $phar = new Phar(dirname(__FILE__) . '/buildfromiterator9.phar'); var_dump($phar->buildFromIterator(new myIterator(array('a' => $a = fopen(basename(__FILE__, 'php') . 'phpt', 'r'))))); fclose($a); } catch (Exception $e) { @@ -48,7 +48,7 @@ try { ===DONE=== --CLEAN-- --EXPECTF-- diff --git a/ext/phar/tests/phar_extract.phpt b/ext/phar/tests/phar_extract.phpt index 01d65f9091de0..bc545236fd886 100644 --- a/ext/phar/tests/phar_extract.phpt +++ b/ext/phar/tests/phar_extract.phpt @@ -38,9 +38,9 @@ var_dump(file_get_contents(dirname(__FILE__) . '/extract1/file1.txt')); $a->extractTo(dirname(__FILE__) . '/extract1', 'subdir/ectory/file.txt'); var_dump(file_get_contents(dirname(__FILE__) . '/extract1/subdir/ectory/file.txt')); -$a->extractTo(dirname(__FILE__) . '/extract2', array('file2.txt', 'one/level')); -var_dump(file_get_contents(dirname(__FILE__) . '/extract2/file2.txt')); -var_dump(is_dir(dirname(__FILE__) . '/extract2/one/level')); +$a->extractTo(dirname(__FILE__) . '/extract1-2', array('file2.txt', 'one/level')); +var_dump(file_get_contents(dirname(__FILE__) . '/extract1-2/file2.txt')); +var_dump(is_dir(dirname(__FILE__) . '/extract1-2/one/level')); try { $a->extractTo(dirname(__FILE__) . '/whatever', 134); @@ -119,7 +119,7 @@ $e = dirname(__FILE__) . '/extract1/'; @rmdir($e . 'subdir/ectory'); @rmdir($e . 'subdir'); @rmdir($e); -$e = dirname(__FILE__) . '/extract2/'; +$e = dirname(__FILE__) . '/extract1-2/'; @unlink($e . 'file2.txt'); @rmdir($e . 'one/level'); @rmdir($e . 'one'); diff --git a/ext/phar/tests/phar_extract2.phpt b/ext/phar/tests/phar_extract2.phpt index cac509f9dc666..fafe254ef7820 100644 --- a/ext/phar/tests/phar_extract2.phpt +++ b/ext/phar/tests/phar_extract2.phpt @@ -16,11 +16,11 @@ $phar->setAlias('fred'); $phar['file1.txt'] = 'hi'; $phar['file2.txt'] = 'hi2'; $phar['subdir/ectory/file.txt'] = 'hi3'; -$phar->mount($pname . '/mount', __FILE__); +$phar->mount($pname . '/mount2', __FILE__); $phar->addEmptyDir('one/level'); -$phar->extractTo(dirname(__FILE__) . '/extract', 'mount'); -$phar->extractTo(dirname(__FILE__) . '/extract'); +$phar->extractTo(dirname(__FILE__) . '/extract2', 'mount2'); +$phar->extractTo(dirname(__FILE__) . '/extract2'); $out = array(); foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator(dirname(__FILE__) . '/extract', 0x00003000), RecursiveIteratorIterator::CHILD_FIRST) as $path => $file) { @@ -38,7 +38,7 @@ foreach ($extracted as $out) { --CLEAN-- --EXPECT-- diff --git a/ext/phar/tests/phar_oo_001U.phpt b/ext/phar/tests/phar_oo_001U.phpt index f13ddd4b0b206..a21026a5b6947 100644 --- a/ext/phar/tests/phar_oo_001U.phpt +++ b/ext/phar/tests/phar_oo_001U.phpt @@ -46,7 +46,7 @@ try { ===DONE=== --CLEAN-- --EXPECT-- diff --git a/ext/phar/tests/phar_oo_002.phpt b/ext/phar/tests/phar_oo_002.phpt index 3754151d42f0a..476cd7d3c216f 100644 --- a/ext/phar/tests/phar_oo_002.phpt +++ b/ext/phar/tests/phar_oo_002.phpt @@ -50,11 +50,11 @@ foreach(new RecursiveIteratorIterator($phar) as $name => $ent) ===DONE=== --CLEAN-- --EXPECTF-- -string(42) "phar://*/files/phar_oo_test.phar.php%ca.php" +string(41) "phar://*/files/phar_oo_002.phar.php%ca.php" string(5) "a.php" int(32) string(4) "file" @@ -67,7 +67,7 @@ bool(false) int(%d) int(%d) int(%d) -string(38) "phar://*/files/phar_oo_test.phar.php%cb" +string(37) "phar://*/files/phar_oo_002.phar.php%cb" string(1) "b" int(0) string(3) "dir" @@ -80,7 +80,7 @@ bool(false) int(%d) int(%d) int(%d) -string(42) "phar://*/files/phar_oo_test.phar.php%cb.php" +string(41) "phar://*/files/phar_oo_002.phar.php%cb.php" string(5) "b.php" int(32) string(4) "file" @@ -93,7 +93,7 @@ bool(false) int(%d) int(%d) int(%d) -string(42) "phar://*/files/phar_oo_test.phar.php%ce.php" +string(41) "phar://*/files/phar_oo_002.phar.php%ce.php" string(5) "e.php" int(32) string(4) "file" @@ -107,31 +107,31 @@ int(%d) int(%d) int(%d) ==RECURSIVE== -string(42) "phar://*/files/phar_oo_test.phar.php%ca.php" +string(41) "phar://*/files/phar_oo_002.phar.php%ca.php" string(5) "a.php" int(32) bool(false) NULL int(0) -string(44) "phar://*/files/phar_oo_test.phar.php/b%cc.php" +string(43) "phar://*/files/phar_oo_002.phar.php/b%cc.php" string(5) "c.php" int(34) bool(false) NULL int(0) -string(44) "phar://*/files/phar_oo_test.phar.php/b%cd.php" +string(43) "phar://*/files/phar_oo_002.phar.php/b%cd.php" string(5) "d.php" int(34) bool(false) NULL int(0) -string(42) "phar://*/files/phar_oo_test.phar.php%cb.php" +string(41) "phar://*/files/phar_oo_002.phar.php%cb.php" string(5) "b.php" int(32) bool(false) NULL int(0) -string(42) "phar://*/files/phar_oo_test.phar.php%ce.php" +string(41) "phar://*/files/phar_oo_002.phar.php%ce.php" string(5) "e.php" int(32) bool(false) diff --git a/ext/phar/tests/phar_oo_002U.phpt b/ext/phar/tests/phar_oo_002U.phpt index 26d0d68d97474..da17152b3273f 100644 --- a/ext/phar/tests/phar_oo_002U.phpt +++ b/ext/phar/tests/phar_oo_002U.phpt @@ -50,11 +50,11 @@ foreach(new RecursiveIteratorIterator($phar) as $name => $ent) ===DONE=== --CLEAN-- --EXPECTF-- -unicode(42) "phar://*/files/phar_oo_test.phar.php%ca.php" +unicode(42) "phar://*/files/phar_oo_002.phar.php%ca.php" string(5) "a.php" int(32) unicode(4) "file" @@ -67,7 +67,7 @@ bool(false) int(%d) int(%d) int(%d) -unicode(38) "phar://*/files/phar_oo_test.phar.php%cb" +unicode(38) "phar://*/files/phar_oo_002.phar.php%cb" string(1) "b" int(0) unicode(3) "dir" @@ -80,7 +80,7 @@ bool(false) int(%d) int(%d) int(%d) -unicode(42) "phar://*/files/phar_oo_test.phar.php%cb.php" +unicode(42) "phar://*/files/phar_oo_002.phar.php%cb.php" string(5) "b.php" int(32) unicode(4) "file" @@ -93,7 +93,7 @@ bool(false) int(%d) int(%d) int(%d) -unicode(42) "phar://*/files/phar_oo_test.phar.php%ce.php" +unicode(42) "phar://*/files/phar_oo_002.phar.php%ce.php" string(5) "e.php" int(32) unicode(4) "file" @@ -107,31 +107,31 @@ int(%d) int(%d) int(%d) ==RECURSIVE== -unicode(42) "phar://*/files/phar_oo_test.phar.php%ca.php" +unicode(42) "phar://*/files/phar_oo_002.phar.php%ca.php" unicode(5) "a.php" int(32) bool(false) NULL int(0) -unicode(44) "phar://*/files/phar_oo_test.phar.php/b%cc.php" +unicode(44) "phar://*/files/phar_oo_002.phar.php/b%cc.php" unicode(5) "c.php" int(34) bool(false) NULL int(0) -unicode(44) "phar://*/files/phar_oo_test.phar.php/b%cd.php" +unicode(44) "phar://*/files/phar_oo_002.phar.php/b%cd.php" unicode(5) "d.php" int(34) bool(false) NULL int(0) -unicode(42) "phar://*/files/phar_oo_test.phar.php%cb.php" +unicode(42) "phar://*/files/phar_oo_002.phar.php%cb.php" unicode(5) "b.php" int(32) bool(false) NULL int(0) -unicode(42) "phar://*/files/phar_oo_test.phar.php%ce.php" +unicode(42) "phar://*/files/phar_oo_002.phar.php%ce.php" unicode(5) "e.php" int(32) bool(false) diff --git a/ext/phar/tests/phar_oo_003.phpt b/ext/phar/tests/phar_oo_003.phpt index ccaf7c65f80d7..4395792632433 100644 --- a/ext/phar/tests/phar_oo_003.phpt +++ b/ext/phar/tests/phar_oo_003.phpt @@ -27,7 +27,7 @@ foreach($phar as $name => $ent) ===DONE=== --CLEAN-- --EXPECTF-- diff --git a/ext/phar/tests/phar_oo_004.phpt b/ext/phar/tests/phar_oo_004.phpt index ba67749843ab0..3e4581992eaab 100644 --- a/ext/phar/tests/phar_oo_004.phpt +++ b/ext/phar/tests/phar_oo_004.phpt @@ -78,7 +78,7 @@ foreach($it as $name => $ent) ===DONE=== --CLEAN-- --EXPECT-- diff --git a/ext/phar/tests/phar_oo_004U.phpt b/ext/phar/tests/phar_oo_004U.phpt index 2762ee3c3568f..51be9dab2e2bc 100644 --- a/ext/phar/tests/phar_oo_004U.phpt +++ b/ext/phar/tests/phar_oo_004U.phpt @@ -78,7 +78,7 @@ foreach($it as $name => $ent) ===DONE=== --CLEAN-- --EXPECT-- diff --git a/ext/phar/tests/phar_oo_005.phpt b/ext/phar/tests/phar_oo_005.phpt index cb3f2987280f0..b01231e9c2652 100644 --- a/ext/phar/tests/phar_oo_005.phpt +++ b/ext/phar/tests/phar_oo_005.phpt @@ -32,7 +32,7 @@ foreach($it as $name => $ent) ===DONE=== --CLEAN-- --EXPECT-- diff --git a/ext/phar/tests/phar_oo_005U.phpt b/ext/phar/tests/phar_oo_005U.phpt index bcdcb08b0dc9f..9c04b93cef33c 100644 --- a/ext/phar/tests/phar_oo_005U.phpt +++ b/ext/phar/tests/phar_oo_005U.phpt @@ -31,7 +31,7 @@ foreach($it as $name => $ent) ===DONE=== --CLEAN-- --EXPECT-- diff --git a/ext/phar/tests/phar_oo_005_5.2.phpt b/ext/phar/tests/phar_oo_005_5.2.phpt index 9e509d94b704c..399edb0dd37b1 100644 --- a/ext/phar/tests/phar_oo_005_5.2.phpt +++ b/ext/phar/tests/phar_oo_005_5.2.phpt @@ -31,7 +31,7 @@ foreach($it as $name => $ent) ===DONE=== --CLEAN-- --EXPECT-- diff --git a/ext/phar/tests/phar_oo_006.phpt b/ext/phar/tests/phar_oo_006.phpt index 556c98ce0b620..5d1d7052066c4 100644 --- a/ext/phar/tests/phar_oo_006.phpt +++ b/ext/phar/tests/phar_oo_006.phpt @@ -38,7 +38,7 @@ echo $phar['b.php']->getFilename() . "\n"; ===DONE=== --CLEAN-- --EXPECTF-- diff --git a/ext/phar/tests/phar_oo_007.phpt b/ext/phar/tests/phar_oo_007.phpt index 788b11f1f81a4..d0b5aa5ecaec0 100644 --- a/ext/phar/tests/phar_oo_007.phpt +++ b/ext/phar/tests/phar_oo_007.phpt @@ -59,11 +59,11 @@ var_dump($f->eof()); ===DONE=== --CLEAN-- --EXPECTF-- -MyFile::__construct(phar://*/files/phar_oo_test.phar.php/a.php) +MyFile::__construct(phar://*/files/phar_oo_007.phar.php/a.php) int(%d) int(%d) int(%d) @@ -79,7 +79,7 @@ int(0) string(32) "" int(32) ===AGAIN=== -MyFile::__construct(phar://*/files/phar_oo_test.phar.php/a.php) +MyFile::__construct(phar://*/files/phar_oo_007.phar.php/a.php) int(0) bool(false) string(32) "" diff --git a/ext/phar/tests/phar_oo_008.phpt b/ext/phar/tests/phar_oo_008.phpt index 80d1ece0ca97d..d95af571b3c04 100644 --- a/ext/phar/tests/phar_oo_008.phpt +++ b/ext/phar/tests/phar_oo_008.phpt @@ -83,7 +83,7 @@ foreach($v as $k => $d) ===DONE=== --CLEAN-- --EXPECTF-- diff --git a/ext/phar/tests/phar_oo_009.phpt b/ext/phar/tests/phar_oo_009.phpt index 6abd03ee30b52..3c842fabeda52 100644 --- a/ext/phar/tests/phar_oo_009.phpt +++ b/ext/phar/tests/phar_oo_009.phpt @@ -36,7 +36,7 @@ foreach($f as $k => $v) ===DONE=== --CLEAN-- --EXPECTF-- diff --git a/ext/phar/tests/phar_oo_010.phpt b/ext/phar/tests/phar_oo_010.phpt index 1d3ff73242418..331d300a8c650 100644 --- a/ext/phar/tests/phar_oo_010.phpt +++ b/ext/phar/tests/phar_oo_010.phpt @@ -36,7 +36,7 @@ var_dump(isset($phar['b'])); ===DONE=== --CLEAN-- --EXPECTF-- diff --git a/ext/phar/tests/phar_oo_011.phpt b/ext/phar/tests/phar_oo_011.phpt index cfbab702ad8c8..01fa9f01e6ec4 100644 --- a/ext/phar/tests/phar_oo_011.phpt +++ b/ext/phar/tests/phar_oo_011.phpt @@ -26,7 +26,7 @@ echo "\n"; ===DONE=== --CLEAN-- --EXPECT-- diff --git a/ext/phar/tests/phar_oo_011b.phpt b/ext/phar/tests/phar_oo_011b.phpt index 36d9963a2283d..34cae0e760b73 100644 --- a/ext/phar/tests/phar_oo_011b.phpt +++ b/ext/phar/tests/phar_oo_011b.phpt @@ -31,7 +31,7 @@ catch (BadMethodCallException $e) ===DONE=== --CLEAN-- --EXPECTF-- diff --git a/ext/phar/tests/phar_oo_012.phpt b/ext/phar/tests/phar_oo_012.phpt index e79ac0960edc6..b6f9f44b1e153 100644 --- a/ext/phar/tests/phar_oo_012.phpt +++ b/ext/phar/tests/phar_oo_012.phpt @@ -27,7 +27,7 @@ var_dump(isset($phar['f.php'])); ===DONE=== --CLEAN-- --EXPECT-- diff --git a/ext/phar/tests/phar_oo_012_confirm.phpt b/ext/phar/tests/phar_oo_012_confirm.phpt index 58a3be87b323f..ce5a58f212d7e 100644 --- a/ext/phar/tests/phar_oo_012_confirm.phpt +++ b/ext/phar/tests/phar_oo_012_confirm.phpt @@ -30,7 +30,7 @@ var_dump(isset($phar['f.php'])); ===DONE=== --CLEAN-- --EXPECT-- diff --git a/ext/phar/tests/phar_oo_012b.phpt b/ext/phar/tests/phar_oo_012b.phpt index 80d8ed8dc4d7a..066d3bc0687b1 100644 --- a/ext/phar/tests/phar_oo_012b.phpt +++ b/ext/phar/tests/phar_oo_012b.phpt @@ -34,7 +34,7 @@ catch (BadMethodCallException $e) ===DONE=== --CLEAN-- --EXPECTF-- From e9877fe92e8f9a0cc212362f6c35550b92036b3e Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Wed, 18 Sep 2013 10:53:11 +0200 Subject: [PATCH 132/400] fix test concurrency --- ext/libxml/tests/bug61367-read.phpt | 16 ++++++++-------- ext/libxml/tests/bug61367-write.phpt | 14 +++++++------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/ext/libxml/tests/bug61367-read.phpt b/ext/libxml/tests/bug61367-read.phpt index 75d0006a3f35e..b4ecaa0324292 100644 --- a/ext/libxml/tests/bug61367-read.phpt +++ b/ext/libxml/tests/bug61367-read.phpt @@ -32,10 +32,10 @@ XML } } -var_dump(mkdir('test_bug_61367')); -var_dump(mkdir('test_bug_61367/base')); -var_dump(file_put_contents('test_bug_61367/bad', 'blah')); -var_dump(chdir('test_bug_61367/base')); +var_dump(mkdir('test_bug_61367-read')); +var_dump(mkdir('test_bug_61367-read/base')); +var_dump(file_put_contents('test_bug_61367-read/bad', 'blah')); +var_dump(chdir('test_bug_61367-read/base')); stream_wrapper_register( 'exploit', 'StreamExploiter' ); $s = fopen( 'exploit://', 'r' ); @@ -43,9 +43,9 @@ $s = fopen( 'exploit://', 'r' ); ?> --CLEAN-- --EXPECTF-- bool(true) @@ -53,7 +53,7 @@ bool(true) int(4) bool(true) -Warning: DOMDocument::loadXML(): I/O warning : failed to load external entity "file:///%s/test_bug_61367/bad" in %s on line %d +Warning: DOMDocument::loadXML(): I/O warning : failed to load external entity "file:///%s/test_bug_61367-read/bad" in %s on line %d Warning: DOMDocument::loadXML(): Failure to process entity file in Entity, line: 4 in %s on line %d diff --git a/ext/libxml/tests/bug61367-write.phpt b/ext/libxml/tests/bug61367-write.phpt index e18b07149a7cb..63e99a8e50a2f 100644 --- a/ext/libxml/tests/bug61367-write.phpt +++ b/ext/libxml/tests/bug61367-write.phpt @@ -19,10 +19,10 @@ class StreamExploiter { } } -var_dump(mkdir('test_bug_61367')); -var_dump(mkdir('test_bug_61367/base')); -var_dump(file_put_contents('test_bug_61367/bad', 'blah')); -var_dump(chdir('test_bug_61367/base')); +var_dump(mkdir('test_bug_61367-write')); +var_dump(mkdir('test_bug_61367-write/base')); +var_dump(file_put_contents('test_bug_61367-write/bad', 'blah')); +var_dump(chdir('test_bug_61367-write/base')); stream_wrapper_register( 'exploit', 'StreamExploiter' ); $s = fopen( 'exploit://', 'r' ); @@ -30,9 +30,9 @@ $s = fopen( 'exploit://', 'r' ); ?> --CLEAN-- --EXPECTF-- bool(true) From cdf5d201ab570284d8865a4b8366bddb662410eb Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Wed, 18 Sep 2013 11:02:45 +0200 Subject: [PATCH 133/400] fix test concurrency --- ext/phar/tests/phar_extract2.phpt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ext/phar/tests/phar_extract2.phpt b/ext/phar/tests/phar_extract2.phpt index fafe254ef7820..7de8cee5b0e90 100644 --- a/ext/phar/tests/phar_extract2.phpt +++ b/ext/phar/tests/phar_extract2.phpt @@ -23,7 +23,7 @@ $phar->extractTo(dirname(__FILE__) . '/extract2', 'mount2'); $phar->extractTo(dirname(__FILE__) . '/extract2'); $out = array(); -foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator(dirname(__FILE__) . '/extract', 0x00003000), RecursiveIteratorIterator::CHILD_FIRST) as $path => $file) { +foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator(dirname(__FILE__) . '/extract2', 0x00003000), RecursiveIteratorIterator::CHILD_FIRST) as $path => $file) { $extracted[] = $path; } @@ -51,10 +51,10 @@ $dir = dirname(__FILE__) . '/extract1/'; @rmdir($dir); ?> --EXPECTF-- -%sextract%cfile1.txt -%sextract%cfile2.txt -%sextract%cone -%sextract%csubdir -%sextract%csubdir%cectory -%sextract%csubdir%cectory%cfile.txt +%sextract2%cfile1.txt +%sextract2%cfile2.txt +%sextract2%cone +%sextract2%csubdir +%sextract2%csubdir%cectory +%sextract2%csubdir%cectory%cfile.txt ===DONE=== From 9bfd55cda3bd66b56af84a569fafd8a77cbb3726 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Wed, 18 Sep 2013 11:10:55 +0200 Subject: [PATCH 134/400] fix a very rare case of use of uninitialized value combined with a memleak --- main/fopen_wrappers.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/main/fopen_wrappers.c b/main/fopen_wrappers.c index 6f11cf3f3254b..9b8645a061e7e 100644 --- a/main/fopen_wrappers.c +++ b/main/fopen_wrappers.c @@ -775,7 +775,12 @@ PHPAPI char *expand_filepath_with_mode(const char *filepath, char *real_path, co * we cannot cannot getcwd() and the requested, * relatively referenced file is accessible */ copy_len = strlen(filepath) > MAXPATHLEN - 1 ? MAXPATHLEN - 1 : strlen(filepath); - real_path = estrndup(filepath, copy_len); + if (real_path) { + memcpy(real_path, filepath, copy_len); + real_path[copy_len] = '\0'; + } else { + real_path = estrndup(filepath, copy_len); + } close(fdtest); return real_path; } else { From 0d534d7c5ef2405b135bf798be73ec37b770d7f3 Mon Sep 17 00:00:00 2001 From: Chris Wright Date: Tue, 17 Sep 2013 11:34:30 -0400 Subject: [PATCH 135/400] Add ldap_escape() --- ext/ldap/ldap.c | 89 ++++++++++++++++++++++++++ ext/ldap/tests/ldap_escape_all.phpt | 14 ++++ ext/ldap/tests/ldap_escape_both.phpt | 14 ++++ ext/ldap/tests/ldap_escape_dn.phpt | 14 ++++ ext/ldap/tests/ldap_escape_filter.phpt | 14 ++++ ext/ldap/tests/ldap_escape_ignore.phpt | 15 +++++ 6 files changed, 160 insertions(+) create mode 100644 ext/ldap/tests/ldap_escape_all.phpt create mode 100644 ext/ldap/tests/ldap_escape_both.phpt create mode 100644 ext/ldap/tests/ldap_escape_dn.phpt create mode 100644 ext/ldap/tests/ldap_escape_filter.phpt create mode 100644 ext/ldap/tests/ldap_escape_ignore.phpt diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c index 3cfa2092e776e..734486a124a44 100644 --- a/ext/ldap/ldap.c +++ b/ext/ldap/ldap.c @@ -67,6 +67,9 @@ #include #endif +#define PHP_LDAP_ESCAPE_FILTER 0x01 +#define PHP_LDAP_ESCAPE_DN 0x02 + typedef struct { LDAP *link; #if defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC) @@ -195,6 +198,9 @@ PHP_MINIT_FUNCTION(ldap) REGISTER_LONG_CONSTANT("GSLC_SSL_TWOWAY_AUTH", GSLC_SSL_TWOWAY_AUTH, CONST_PERSISTENT | CONST_CS); #endif + REGISTER_LONG_CONSTANT("LDAP_ESCAPE_FILTER", PHP_LDAP_ESCAPE_FILTER, CONST_PERSISTENT | CONST_CS); + REGISTER_LONG_CONSTANT("LDAP_ESCAPE_DN", PHP_LDAP_ESCAPE_DN, CONST_PERSISTENT | CONST_CS); + le_link = zend_register_list_destructors_ex(_close_ldap_link, NULL, "ldap link", module_number); le_result = zend_register_list_destructors_ex(_free_ldap_result, NULL, "ldap result", module_number); le_result_entry = zend_register_list_destructors_ex(_free_ldap_result_entry, NULL, "ldap result entry", module_number); @@ -2136,6 +2142,81 @@ PHP_FUNCTION(ldap_set_rebind_proc) /* }}} */ #endif +static void php_ldap_do_escape(const zend_bool *map, const unsigned char *value, const int valuelen, unsigned char **result, int *resultlen) +{ + char hex[] = "0123456789abcdef"; + int i, p = 0; + size_t len = 0; + + for (i = 0; i < valuelen; i++) { + len += (map[value[i]]) ? 3 : 1; + } + len += 1; + + (*result) = (unsigned char *)emalloc(len); + (*resultlen) = (int)len; + + for (i = 0; i < valuelen; i++) { + if (map[value[i]]) { + (*result)[p++] = '\\'; + (*result)[p++] = hex[value[i] >> 4]; + (*result)[p++] = hex[value[i] & 0x0f]; + } else { + (*result)[p++] = value[i]; + } + } + + (*result)[p++] = '\0'; +} + +static void php_ldap_escape_map_set_chars(zend_bool *map, const unsigned char *chars, const int charslen, char escape) +{ + int i = 0; + while (i < charslen) { + map[chars[i++]] = escape; + } +} + +PHP_FUNCTION(ldap_escape) +{ + unsigned char *value, *ignores, *result; + int valuelen = 0, ignoreslen = 0, resultlen = 0, i; + long flags = 0; + zend_bool map[256] = {0}, havecharlist = 0; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|sl", &value, &valuelen, &ignores, &ignoreslen, &flags) != SUCCESS) { + return; + } + + if (!valuelen) { + RETURN_EMPTY_STRING(); + } + + if (flags & PHP_LDAP_ESCAPE_FILTER) { + havecharlist = 1; + php_ldap_escape_map_set_chars(map, "\\*()\0", sizeof("\\*()\0") - 1, 1); + } + + if (flags & PHP_LDAP_ESCAPE_DN) { + havecharlist = 1; + php_ldap_escape_map_set_chars(map, "\\,=+<>;\"#", sizeof("\\,=+<>;\"#") - 1, 1); + } + + if (!havecharlist) { + for (i = 0; i < 256; i++) { + map[i] = 1; + } + } + + if (ignoreslen) { + php_ldap_escape_map_set_chars(map, ignores, ignoreslen, 0); + } + + php_ldap_do_escape(map, value, valuelen, &result, &resultlen); + + RETURN_STRINGL(result, resultlen - 1, 0); +} + #ifdef STR_TRANSLATION /* {{{ php_ldap_do_translate */ @@ -2625,6 +2706,12 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_set_rebind_proc, 0, 0, 2) ZEND_END_ARG_INFO() #endif +ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_escape, 0, 0, 1) + ZEND_ARG_INFO(0, value) + ZEND_ARG_INFO(0, ignore) + ZEND_ARG_INFO(0, flags) +ZEND_END_ARG_INFO() + #ifdef STR_TRANSLATION ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_t61_to_8859, 0, 0, 1) ZEND_ARG_INFO(0, value) @@ -2703,6 +2790,8 @@ const zend_function_entry ldap_functions[] = { PHP_FE(ldap_set_rebind_proc, arginfo_ldap_set_rebind_proc) #endif + PHP_FE(ldap_escape, arginfo_ldap_escape) + #ifdef STR_TRANSLATION PHP_FE(ldap_t61_to_8859, arginfo_ldap_t61_to_8859) PHP_FE(ldap_8859_to_t61, arginfo_ldap_8859_to_t61) diff --git a/ext/ldap/tests/ldap_escape_all.phpt b/ext/ldap/tests/ldap_escape_all.phpt new file mode 100644 index 0000000000000..a79be004ffe56 --- /dev/null +++ b/ext/ldap/tests/ldap_escape_all.phpt @@ -0,0 +1,14 @@ +--TEST-- +ldap_escape() test all +--SKIPIF-- + +--FILE-- + +--EXPECT-- +string(39) "\66\6f\6f\3d\62\61\72\28\62\61\7a\29\2a" \ No newline at end of file diff --git a/ext/ldap/tests/ldap_escape_both.phpt b/ext/ldap/tests/ldap_escape_both.phpt new file mode 100644 index 0000000000000..2169c0ad2e75c --- /dev/null +++ b/ext/ldap/tests/ldap_escape_both.phpt @@ -0,0 +1,14 @@ +--TEST-- +ldap_escape() test filter and DN +--SKIPIF-- + +--FILE-- + +--EXPECT-- +string(21) "foo\3dbar\28baz\29\2a" \ No newline at end of file diff --git a/ext/ldap/tests/ldap_escape_dn.phpt b/ext/ldap/tests/ldap_escape_dn.phpt new file mode 100644 index 0000000000000..fbcb0545ae4e8 --- /dev/null +++ b/ext/ldap/tests/ldap_escape_dn.phpt @@ -0,0 +1,14 @@ +--TEST-- +ldap_escape() test DN +--SKIPIF-- + +--FILE-- + +--EXPECT-- +string(15) "foo\3dbar(baz)*" \ No newline at end of file diff --git a/ext/ldap/tests/ldap_escape_filter.phpt b/ext/ldap/tests/ldap_escape_filter.phpt new file mode 100644 index 0000000000000..e4540a452d3f6 --- /dev/null +++ b/ext/ldap/tests/ldap_escape_filter.phpt @@ -0,0 +1,14 @@ +--TEST-- +ldap_escape() test filter +--SKIPIF-- + +--FILE-- + +--EXPECT-- +string(19) "foo=bar\28baz\29\2a" \ No newline at end of file diff --git a/ext/ldap/tests/ldap_escape_ignore.phpt b/ext/ldap/tests/ldap_escape_ignore.phpt new file mode 100644 index 0000000000000..ab56aa2d0e91f --- /dev/null +++ b/ext/ldap/tests/ldap_escape_ignore.phpt @@ -0,0 +1,15 @@ +--TEST-- +ldap_escape() test ignore +--SKIPIF-- + +--FILE-- + +--EXPECT-- +string(31) "\66oo\3d\62a\72\28\62a\7a\29\2a" \ No newline at end of file From 7e9044b6a251f40da1217c3265b83a9caae8bff8 Mon Sep 17 00:00:00 2001 From: David Soria Parra Date: Wed, 18 Sep 2013 14:26:10 +0200 Subject: [PATCH 136/400] RFC 6598 reserved ip range starts at 100.64.0.0 --- ext/filter/logical_filters.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/filter/logical_filters.c b/ext/filter/logical_filters.c index 71c5aba1e9323..14964883c1b26 100644 --- a/ext/filter/logical_filters.c +++ b/ext/filter/logical_filters.c @@ -714,7 +714,7 @@ void php_filter_validate_ip(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */ if (flags & FILTER_FLAG_NO_RES_RANGE) { if ( (ip[0] == 0) || - (ip[0] == 100 && (ip[1] == 0 || ip[1] <= 127)) || + (ip[0] == 100 && (ip[1] >= 64 || ip[1] <= 127)) || (ip[0] == 128 && ip[1] == 0) || (ip[0] == 191 && ip[1] == 255) || (ip[0] == 169 && ip[1] == 254) || From 7a24ee13ec74bf3e85970e59dd69db8034ff434c Mon Sep 17 00:00:00 2001 From: David Soria Parra Date: Wed, 18 Sep 2013 15:06:19 +0200 Subject: [PATCH 137/400] Revert "EmptyIterator now implements Countable; fixes bug 60577" This reverts commit 8a936e8eb938965b0daaf076c109ec60141e57a7. --- NEWS | 3 --- ext/spl/internal/emptyiterator.inc | 13 ++----------- ext/spl/spl_iterators.c | 12 ------------ ext/spl/tests/bug60577.phpt | 8 -------- 4 files changed, 2 insertions(+), 34 deletions(-) delete mode 100644 ext/spl/tests/bug60577.phpt diff --git a/NEWS b/NEWS index d8895bdfde7cc..6d94980fbcdb2 100644 --- a/NEWS +++ b/NEWS @@ -15,9 +15,6 @@ PHP NEWS . Fixed bug #64441 (FILTER_VALIDATE_URL rejects fully qualified domain names). (Syra) -- SPL: - . Fixed bug #60577 (count(new EmptyIterator) returns 1). (Levi Morrison) - ?? ??? 2013, PHP 5.4.20 - Core: diff --git a/ext/spl/internal/emptyiterator.inc b/ext/spl/internal/emptyiterator.inc index d02b15b999c50..ac80e79581239 100644 --- a/ext/spl/internal/emptyiterator.inc +++ b/ext/spl/internal/emptyiterator.inc @@ -15,7 +15,7 @@ * @version 1.0 * @since PHP 5.1 */ -class EmptyIterator implements Iterator, Countable +class EmptyIterator implements Iterator { /** No operation. * @return void @@ -57,15 +57,6 @@ class EmptyIterator implements Iterator, Countable { // nothing to do } - - /** - * @return int - */ - function count() - { - return 0; - } - } -?> +?> \ No newline at end of file diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index ad76258413328..eb8247654ecbd 100644 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -3279,23 +3279,12 @@ SPL_METHOD(EmptyIterator, next) } } /* }}} */ -/* {{{ proto int EmptyIterator::count() - Does nothing */ -SPL_METHOD(EmptyIterator, count) -{ - if (zend_parse_parameters_none() == FAILURE) { - return; - } - RETURN_LONG(0); -} /* }}} */ - static const zend_function_entry spl_funcs_EmptyIterator[] = { SPL_ME(EmptyIterator, rewind, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(EmptyIterator, valid, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(EmptyIterator, key, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(EmptyIterator, current, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) SPL_ME(EmptyIterator, next, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) - SPL_ME(EmptyIterator, count, arginfo_recursive_it_void, ZEND_ACC_PUBLIC) PHP_FE_END }; @@ -3767,7 +3756,6 @@ PHP_MINIT_FUNCTION(spl_iterators) REGISTER_SPL_STD_CLASS_EX(EmptyIterator, NULL, spl_funcs_EmptyIterator); REGISTER_SPL_ITERATOR(EmptyIterator); - REGISTER_SPL_IMPLEMENTS(EmptyIterator, Countable); REGISTER_SPL_SUB_CLASS_EX(RecursiveTreeIterator, RecursiveIteratorIterator, spl_RecursiveTreeIterator_new, spl_funcs_RecursiveTreeIterator); REGISTER_SPL_CLASS_CONST_LONG(RecursiveTreeIterator, "BYPASS_CURRENT", RTIT_BYPASS_CURRENT); diff --git a/ext/spl/tests/bug60577.phpt b/ext/spl/tests/bug60577.phpt deleted file mode 100644 index 33fc133d0fb9e..0000000000000 --- a/ext/spl/tests/bug60577.phpt +++ /dev/null @@ -1,8 +0,0 @@ ---TEST-- -count(new EmptyIterator) should return zero ---FILE-- - Date: Wed, 18 Sep 2013 15:14:36 +0200 Subject: [PATCH 138/400] better way to fix PRIu64 availability on windows --- main/php_variables.c | 7 +- win32/php_inttypes.h | 305 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 308 insertions(+), 4 deletions(-) create mode 100644 win32/php_inttypes.h diff --git a/main/php_variables.c b/main/php_variables.c index 353aa6357d47f..ab9aee3ae3c42 100644 --- a/main/php_variables.c +++ b/main/php_variables.c @@ -29,6 +29,9 @@ #include "php_content_types.h" #include "SAPI.h" #include "zend_globals.h" +#ifdef PHP_WIN32 +# include "win32/php_inttypes.h" +#endif /* for systems that need to override reading of environment variables */ void _php_import_environment_variables(zval *array_ptr TSRMLS_DC); @@ -292,11 +295,7 @@ static inline int add_post_vars(zval *arr, post_var_data_t *vars, zend_bool eof while (add_post_var(arr, vars, eof TSRMLS_CC)) { if (++vars->cnt > max_vars) { php_error_docref(NULL TSRMLS_CC, E_WARNING, -#ifdef PHP_WIN32 - "Input variables exceeded %I64u. " -#else "Input variables exceeded %" PRIu64 ". " -#endif "To increase the limit change max_input_vars in php.ini.", max_vars); return FAILURE; diff --git a/win32/php_inttypes.h b/win32/php_inttypes.h new file mode 100644 index 0000000000000..25542771f591c --- /dev/null +++ b/win32/php_inttypes.h @@ -0,0 +1,305 @@ +// ISO C9x compliant inttypes.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. The name of the author may be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_INTTYPES_H_ // [ +#define _MSC_INTTYPES_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include "stdint.h" + +// 7.8 Format conversion of integer types + +typedef struct { + intmax_t quot; + intmax_t rem; +} imaxdiv_t; + +// 7.8.1 Macros for format specifiers + +#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 + +// The fprintf macros for signed integers are: +#define PRId8 "d" +#define PRIi8 "i" +#define PRIdLEAST8 "d" +#define PRIiLEAST8 "i" +#define PRIdFAST8 "d" +#define PRIiFAST8 "i" + +#define PRId16 "hd" +#define PRIi16 "hi" +#define PRIdLEAST16 "hd" +#define PRIiLEAST16 "hi" +#define PRIdFAST16 "hd" +#define PRIiFAST16 "hi" + +#define PRId32 "I32d" +#define PRIi32 "I32i" +#define PRIdLEAST32 "I32d" +#define PRIiLEAST32 "I32i" +#define PRIdFAST32 "I32d" +#define PRIiFAST32 "I32i" + +#define PRId64 "I64d" +#define PRIi64 "I64i" +#define PRIdLEAST64 "I64d" +#define PRIiLEAST64 "I64i" +#define PRIdFAST64 "I64d" +#define PRIiFAST64 "I64i" + +#define PRIdMAX "I64d" +#define PRIiMAX "I64i" + +#define PRIdPTR "Id" +#define PRIiPTR "Ii" + +// The fprintf macros for unsigned integers are: +#define PRIo8 "o" +#define PRIu8 "u" +#define PRIx8 "x" +#define PRIX8 "X" +#define PRIoLEAST8 "o" +#define PRIuLEAST8 "u" +#define PRIxLEAST8 "x" +#define PRIXLEAST8 "X" +#define PRIoFAST8 "o" +#define PRIuFAST8 "u" +#define PRIxFAST8 "x" +#define PRIXFAST8 "X" + +#define PRIo16 "ho" +#define PRIu16 "hu" +#define PRIx16 "hx" +#define PRIX16 "hX" +#define PRIoLEAST16 "ho" +#define PRIuLEAST16 "hu" +#define PRIxLEAST16 "hx" +#define PRIXLEAST16 "hX" +#define PRIoFAST16 "ho" +#define PRIuFAST16 "hu" +#define PRIxFAST16 "hx" +#define PRIXFAST16 "hX" + +#define PRIo32 "I32o" +#define PRIu32 "I32u" +#define PRIx32 "I32x" +#define PRIX32 "I32X" +#define PRIoLEAST32 "I32o" +#define PRIuLEAST32 "I32u" +#define PRIxLEAST32 "I32x" +#define PRIXLEAST32 "I32X" +#define PRIoFAST32 "I32o" +#define PRIuFAST32 "I32u" +#define PRIxFAST32 "I32x" +#define PRIXFAST32 "I32X" + +#define PRIo64 "I64o" +#define PRIu64 "I64u" +#define PRIx64 "I64x" +#define PRIX64 "I64X" +#define PRIoLEAST64 "I64o" +#define PRIuLEAST64 "I64u" +#define PRIxLEAST64 "I64x" +#define PRIXLEAST64 "I64X" +#define PRIoFAST64 "I64o" +#define PRIuFAST64 "I64u" +#define PRIxFAST64 "I64x" +#define PRIXFAST64 "I64X" + +#define PRIoMAX "I64o" +#define PRIuMAX "I64u" +#define PRIxMAX "I64x" +#define PRIXMAX "I64X" + +#define PRIoPTR "Io" +#define PRIuPTR "Iu" +#define PRIxPTR "Ix" +#define PRIXPTR "IX" + +// The fscanf macros for signed integers are: +#define SCNd8 "d" +#define SCNi8 "i" +#define SCNdLEAST8 "d" +#define SCNiLEAST8 "i" +#define SCNdFAST8 "d" +#define SCNiFAST8 "i" + +#define SCNd16 "hd" +#define SCNi16 "hi" +#define SCNdLEAST16 "hd" +#define SCNiLEAST16 "hi" +#define SCNdFAST16 "hd" +#define SCNiFAST16 "hi" + +#define SCNd32 "ld" +#define SCNi32 "li" +#define SCNdLEAST32 "ld" +#define SCNiLEAST32 "li" +#define SCNdFAST32 "ld" +#define SCNiFAST32 "li" + +#define SCNd64 "I64d" +#define SCNi64 "I64i" +#define SCNdLEAST64 "I64d" +#define SCNiLEAST64 "I64i" +#define SCNdFAST64 "I64d" +#define SCNiFAST64 "I64i" + +#define SCNdMAX "I64d" +#define SCNiMAX "I64i" + +#ifdef _WIN64 // [ +# define SCNdPTR "I64d" +# define SCNiPTR "I64i" +#else // _WIN64 ][ +# define SCNdPTR "ld" +# define SCNiPTR "li" +#endif // _WIN64 ] + +// The fscanf macros for unsigned integers are: +#define SCNo8 "o" +#define SCNu8 "u" +#define SCNx8 "x" +#define SCNX8 "X" +#define SCNoLEAST8 "o" +#define SCNuLEAST8 "u" +#define SCNxLEAST8 "x" +#define SCNXLEAST8 "X" +#define SCNoFAST8 "o" +#define SCNuFAST8 "u" +#define SCNxFAST8 "x" +#define SCNXFAST8 "X" + +#define SCNo16 "ho" +#define SCNu16 "hu" +#define SCNx16 "hx" +#define SCNX16 "hX" +#define SCNoLEAST16 "ho" +#define SCNuLEAST16 "hu" +#define SCNxLEAST16 "hx" +#define SCNXLEAST16 "hX" +#define SCNoFAST16 "ho" +#define SCNuFAST16 "hu" +#define SCNxFAST16 "hx" +#define SCNXFAST16 "hX" + +#define SCNo32 "lo" +#define SCNu32 "lu" +#define SCNx32 "lx" +#define SCNX32 "lX" +#define SCNoLEAST32 "lo" +#define SCNuLEAST32 "lu" +#define SCNxLEAST32 "lx" +#define SCNXLEAST32 "lX" +#define SCNoFAST32 "lo" +#define SCNuFAST32 "lu" +#define SCNxFAST32 "lx" +#define SCNXFAST32 "lX" + +#define SCNo64 "I64o" +#define SCNu64 "I64u" +#define SCNx64 "I64x" +#define SCNX64 "I64X" +#define SCNoLEAST64 "I64o" +#define SCNuLEAST64 "I64u" +#define SCNxLEAST64 "I64x" +#define SCNXLEAST64 "I64X" +#define SCNoFAST64 "I64o" +#define SCNuFAST64 "I64u" +#define SCNxFAST64 "I64x" +#define SCNXFAST64 "I64X" + +#define SCNoMAX "I64o" +#define SCNuMAX "I64u" +#define SCNxMAX "I64x" +#define SCNXMAX "I64X" + +#ifdef _WIN64 // [ +# define SCNoPTR "I64o" +# define SCNuPTR "I64u" +# define SCNxPTR "I64x" +# define SCNXPTR "I64X" +#else // _WIN64 ][ +# define SCNoPTR "lo" +# define SCNuPTR "lu" +# define SCNxPTR "lx" +# define SCNXPTR "lX" +#endif // _WIN64 ] + +#endif // __STDC_FORMAT_MACROS ] + +// 7.8.2 Functions for greatest-width integer types + +// 7.8.2.1 The imaxabs function +#define imaxabs _abs64 + +// 7.8.2.2 The imaxdiv function + +// This is modified version of div() function from Microsoft's div.c found +// in %MSVC.NET%\crt\src\div.c +#ifdef STATIC_IMAXDIV // [ +static +#else // STATIC_IMAXDIV ][ +_inline +#endif // STATIC_IMAXDIV ] +imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) +{ + imaxdiv_t result; + + result.quot = numer / denom; + result.rem = numer % denom; + + if (numer < 0 && result.rem > 0) { + // did division wrong; must fix up + ++result.quot; + result.rem -= denom; + } + + return result; +} + +// 7.8.2.3 The strtoimax and strtoumax functions +#define strtoimax _strtoi64 +#define strtoumax _strtoui64 + +// 7.8.2.4 The wcstoimax and wcstoumax functions +#define wcstoimax _wcstoi64 +#define wcstoumax _wcstoui64 + + +#endif // _MSC_INTTYPES_H_ ] From b6d0cb05533d1c7a8f0cce5cffc20352669a2506 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Wed, 18 Sep 2013 19:50:32 -0700 Subject: [PATCH 139/400] Build OCI8 2.0 on Windows with Oracle Database 12c libraries only --- ext/oci8/config.w32 | 78 ++++++++++----------------------------------- 1 file changed, 17 insertions(+), 61 deletions(-) diff --git a/ext/oci8/config.w32 b/ext/oci8/config.w32 index fdd7fa5e48068..ac573a8af39a1 100644 --- a/ext/oci8/config.w32 +++ b/ext/oci8/config.w32 @@ -1,82 +1,38 @@ // $Id$ // vim:ft=javascript -if (PHP_OCI8 != "no" && PHP_OCI8_11G != "no") { - if (!PHP_OCI8_SHARED && !PHP_OCI8_11G_SHARED) { - WARNING("oci8 and oci8-11g provide the same extension and cannot both be built statically"); - PHP_OCI8 = "no" - PHP_OCI8_11G = "no" - } -} - -ARG_WITH("oci8", "OCI8 support", "no"); - -if (PHP_OCI8 != "no") { - - oci8_dirs = new Array( - PHP_OCI8 - ); - - oci8_lib_paths = ""; - oci8_inc_paths = ""; - - // find the Oracle install - for (i = 0; i < oci8_dirs.length; i++) { - oci8_lib_paths += oci8_dirs[i] + "\\lib;"; - oci8_lib_paths += oci8_dirs[i] + "\\lib\\msvc;"; - oci8_inc_paths += oci8_dirs[i] + "\\include;"; - } - - oci8_inc_paths += PHP_PHP_BUILD + "\\include\\instantclient;" - oci8_lib_paths += PHP_PHP_BUILD + "\\lib\\instantclient;"; - - if (CHECK_HEADER_ADD_INCLUDE("oci.h", "CFLAGS_OCI8", oci8_inc_paths) && - CHECK_LIB("oci.lib", "oci8", oci8_lib_paths)) - { - EXTENSION('oci8', 'oci8.c oci8_lob.c oci8_statement.c oci8_collection.c oci8_interface.c'); - - AC_DEFINE('HAVE_OCI8', 1); - AC_DEFINE('HAVE_OCI_INSTANT_CLIENT', 1); - AC_DEFINE('HAVE_OCI_LOB_READ2', 1); - - } else { - WARNING("oci8 not enabled: Oracle Database libraries or Oracle 10g Instant Client not found"); - PHP_OCI8 = "no" - } -} - -ARG_WITH("oci8-11g", "OCI8 support using Oracle 11g Instant Client", "no"); +ARG_WITH("oci8-12c", "OCI8 support using Oracle Database 12c Instant Client", "no"); -if (PHP_OCI8_11G != "no") { +if (PHP_OCI8_12C != "no") { - oci8_11g_dirs = new Array( - PHP_OCI8_11G + oci8_12c_dirs = new Array( + PHP_OCI8_12C ); - oci8_11g_lib_paths = ""; - oci8_11g_inc_paths = ""; + oci8_12c_lib_paths = ""; + oci8_12c_inc_paths = ""; // find the Oracle install - for (i = 0; i < oci8_11g_dirs.length; i++) { - oci8_11g_lib_paths += oci8_11g_dirs[i] + "\\lib;"; - oci8_11g_lib_paths += oci8_11g_dirs[i] + "\\lib\\msvc;"; - oci8_11g_inc_paths += oci8_11g_dirs[i] + "\\include;"; + for (i = 0; i < oci8_12c_dirs.length; i++) { + oci8_12c_lib_paths += oci8_12c_dirs[i] + "\\lib;"; + oci8_12c_lib_paths += oci8_12c_dirs[i] + "\\lib\\msvc;"; + oci8_12c_inc_paths += oci8_12c_dirs[i] + "\\include;"; } - oci8_11g_inc_paths += PHP_PHP_BUILD + "\\include\\instantclient_11;" - oci8_11g_lib_paths += PHP_PHP_BUILD + "\\lib\\instantclient_11;"; + oci8_12c_inc_paths += PHP_PHP_BUILD + "\\include\\instantclient_12;" + oci8_12c_lib_paths += PHP_PHP_BUILD + "\\lib\\instantclient_12;"; - if (CHECK_HEADER_ADD_INCLUDE("oci.h", "CFLAGS_OCI8_11G", oci8_11g_inc_paths) && - CHECK_LIB("oci.lib", "oci8_11g", oci8_11g_lib_paths)) + if (CHECK_HEADER_ADD_INCLUDE("oci.h", "CFLAGS_OCI8_12C", oci8_12c_inc_paths) && + CHECK_LIB("oci.lib", "oci8_12c", oci8_12c_lib_paths)) { - EXTENSION('oci8_11g', 'oci8.c oci8_lob.c oci8_statement.c oci8_collection.c oci8_interface.c', null, null, null, "ext\\oci8_11g") + EXTENSION('oci8_12c', 'oci8.c oci8_lob.c oci8_statement.c oci8_collection.c oci8_interface.c', null, null, null, "ext\\oci8_12c") AC_DEFINE('HAVE_OCI8', 1); AC_DEFINE('HAVE_OCI_INSTANT_CLIENT', 1); AC_DEFINE('HAVE_OCI_LOB_READ2', 1); } else { - WARNING("oci8-11g not enabled: Oracle Database libraries or Oracle 11g Instant Client not found"); - PHP_OCI8_11G = "no" + WARNING("oci8-12c not enabled: Oracle Database client libraries or Oracle Database 12c Instant Client not found"); + PHP_OCI8_12C = "no" } } From 11d60447f9f22944dd08d8dacba1230fc4caabd8 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 19 Sep 2013 15:40:10 +0200 Subject: [PATCH 140/400] add note about request_body and php://input --- main/SAPI.h | 1 + 1 file changed, 1 insertion(+) diff --git a/main/SAPI.h b/main/SAPI.h index 5525a2aabd418..928fca95da72e 100644 --- a/main/SAPI.h +++ b/main/SAPI.h @@ -85,6 +85,7 @@ typedef struct { char *path_translated; char *request_uri; + /* Do not use request_body directly, but the php://input stream wrapper instead */ struct _php_stream *request_body; const char *content_type; From dfa43d55dd996fb06c7bb4d5efcae3fc78131cdc Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Thu, 19 Sep 2013 20:22:50 -0700 Subject: [PATCH 141/400] Added application/pdf to PHP CLI Web Server mime types. --- NEWS | 1 + sapi/cli/php_cli_server.c | 1 + 2 files changed, 2 insertions(+) diff --git a/NEWS b/NEWS index 37db7e6c40857..7b37e076b3404 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,7 @@ PHP NEWS - CLI server: . Fixed bug #65633 (built-in server treat some http headers as case-sensitive). (Adam) + . Added application/pdf to PHP CLI Web Server mime types (Chris Jones) - Datetime: . Fixed bug #65502 (DateTimeImmutable::createFromFormat returns DateTime). diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c index d50cc4f8a0375..e84d9ea97a35b 100644 --- a/sapi/cli/php_cli_server.c +++ b/sapi/cli/php_cli_server.c @@ -268,6 +268,7 @@ static php_cli_server_ext_mime_type_pair mime_type_map[] = { { "jpg", "image/jpeg" }, { "jpeg", "image/jpeg" }, { "jpe", "image/jpeg" }, + { "pdf", "application/pdf" }, { "png", "image/png" }, { "svg", "image/svg+xml" }, { "txt", "text/plain" }, From b8f9a20286c6d88c11e81967df42d118bdba2f02 Mon Sep 17 00:00:00 2001 From: datibbaw Date: Fri, 20 Sep 2013 15:04:52 +0800 Subject: [PATCH 142/400] added openssl_x509_digest(), output is binary sha1 --- ext/openssl/openssl.c | 41 +++++++++++++++++++++++++++++++++++++++ ext/openssl/php_openssl.h | 1 + 2 files changed, 42 insertions(+) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 4aac4e3137cad..c7203a74d63aa 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -129,6 +129,11 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_x509_export, 0, 0, 2) ZEND_ARG_INFO(0, notext) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_x509_digest, 0, 0, 2) + ZEND_ARG_INFO(0, x509) + ZEND_ARG_INFO(1, out) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO(arginfo_openssl_x509_check_private_key, 0) ZEND_ARG_INFO(0, cert) ZEND_ARG_INFO(0, key) @@ -443,6 +448,7 @@ const zend_function_entry openssl_functions[] = { PHP_FE(openssl_x509_checkpurpose, arginfo_openssl_x509_checkpurpose) PHP_FE(openssl_x509_check_private_key, arginfo_openssl_x509_check_private_key) PHP_FE(openssl_x509_export, arginfo_openssl_x509_export) + PHP_FE(openssl_x509_digest, arginfo_openssl_x509_digest) PHP_FE(openssl_x509_export_to_file, arginfo_openssl_x509_export_to_file) /* PKCS12 funcs */ @@ -1665,6 +1671,41 @@ PHP_FUNCTION(openssl_x509_export) } /* }}} */ +PHP_FUNCTION(openssl_x509_digest) +{ + X509 *cert; + zval **zcert, *zout; + long certresource; + + unsigned char md[EVP_MAX_MD_SIZE]; + unsigned int n; + + RETVAL_FALSE; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zz", &zcert, &zout) == FAILURE) { + return; + } + + cert = php_openssl_x509_from_zval(zcert, 0, &certresource TSRMLS_CC); + if (cert == NULL) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "cannot get cert from parameter 1"); + return; + } + + if (!X509_digest(cert, EVP_sha1(), md, &n)) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "out of memory"); + return; + } + + zval_dtor(zout); + ZVAL_STRINGL(zout, md, n, 1); + + if (certresource == -1 && cert) { + X509_free(cert); + } + RETVAL_TRUE; +} + /* {{{ proto bool openssl_x509_check_private_key(mixed cert, mixed key) Checks if a private key corresponds to a CERT */ PHP_FUNCTION(openssl_x509_check_private_key) diff --git a/ext/openssl/php_openssl.h b/ext/openssl/php_openssl.h index 8483bbf7626dd..4f0ac14100143 100644 --- a/ext/openssl/php_openssl.h +++ b/ext/openssl/php_openssl.h @@ -66,6 +66,7 @@ PHP_FUNCTION(openssl_x509_free); PHP_FUNCTION(openssl_x509_parse); PHP_FUNCTION(openssl_x509_checkpurpose); PHP_FUNCTION(openssl_x509_export); +PHP_FUNCTION(openssl_x509_digest); PHP_FUNCTION(openssl_x509_export_to_file); PHP_FUNCTION(openssl_x509_check_private_key); From 5cff92fb12e83f4c6c81c6e8b89480def3ee5e9e Mon Sep 17 00:00:00 2001 From: datibbaw Date: Fri, 20 Sep 2013 15:45:41 +0800 Subject: [PATCH 143/400] added option for raw output --- ext/openssl/openssl.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index c7203a74d63aa..5dfb9b43695af 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -132,6 +132,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_x509_digest, 0, 0, 2) ZEND_ARG_INFO(0, x509) ZEND_ARG_INFO(1, out) + ZEND_ARG_INFO(0, raw_output) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO(arginfo_openssl_x509_check_private_key, 0) @@ -1676,13 +1677,14 @@ PHP_FUNCTION(openssl_x509_digest) X509 *cert; zval **zcert, *zout; long certresource; + zend_bool raw_output = 0; unsigned char md[EVP_MAX_MD_SIZE]; unsigned int n; RETVAL_FALSE; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zz", &zcert, &zout) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zz|b", &zcert, &zout, &raw_output) == FAILURE) { return; } @@ -1698,7 +1700,16 @@ PHP_FUNCTION(openssl_x509_digest) } zval_dtor(zout); - ZVAL_STRINGL(zout, md, n, 1); + + if (raw_output) { + ZVAL_STRINGL(zout, md, n, 1); + } else { + int digest_str_len = n * 2; + char *digest_str = emalloc(digest_str_len + 1); + + make_digest_ex(digest_str, md, n); + ZVAL_STRINGL(zout, digest_str, digest_str_len, 0); + } if (certresource == -1 && cert) { X509_free(cert); From b2881db9a98db6e92d9f6964dd83a003c39a7fbd Mon Sep 17 00:00:00 2001 From: datibbaw Date: Fri, 20 Sep 2013 16:56:50 +0800 Subject: [PATCH 144/400] added option for hash function --- ext/openssl/openssl.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 5dfb9b43695af..6979e35685b3a 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -132,6 +132,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_x509_digest, 0, 0, 2) ZEND_ARG_INFO(0, x509) ZEND_ARG_INFO(1, out) + ZEND_ARG_INFO(0, method) ZEND_ARG_INFO(0, raw_output) ZEND_END_ARG_INFO() @@ -1678,13 +1679,16 @@ PHP_FUNCTION(openssl_x509_digest) zval **zcert, *zout; long certresource; zend_bool raw_output = 0; + char *method = "sha1"; + int method_len; + const EVP_MD *mdtype; unsigned char md[EVP_MAX_MD_SIZE]; unsigned int n; RETVAL_FALSE; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zz|b", &zcert, &zout, &raw_output) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zz|sb", &zcert, &zout, &method, &method_len, &raw_output) == FAILURE) { return; } @@ -1694,7 +1698,13 @@ PHP_FUNCTION(openssl_x509_digest) return; } - if (!X509_digest(cert, EVP_sha1(), md, &n)) { + mdtype = EVP_get_digestbyname(method); + if (!mdtype) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown signature algorithm"); + RETURN_FALSE; + } + + if (!X509_digest(cert, mdtype, md, &n)) { php_error_docref(NULL TSRMLS_CC, E_ERROR, "out of memory"); return; } From ce13f9fa328ae4a0c7fa9ef5efdb72a43f29dde2 Mon Sep 17 00:00:00 2001 From: datibbaw Date: Fri, 20 Sep 2013 16:59:44 +0800 Subject: [PATCH 145/400] indentation fail --- ext/openssl/openssl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 6979e35685b3a..f0ae2b70b19d3 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1676,14 +1676,14 @@ PHP_FUNCTION(openssl_x509_export) PHP_FUNCTION(openssl_x509_digest) { X509 *cert; - zval **zcert, *zout; + zval **zcert, *zout; long certresource; zend_bool raw_output = 0; char *method = "sha1"; int method_len; const EVP_MD *mdtype; - unsigned char md[EVP_MAX_MD_SIZE]; + unsigned char md[EVP_MAX_MD_SIZE]; unsigned int n; RETVAL_FALSE; From 8f146c2bb0dcba3307f08a839554be056e660f34 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Fri, 20 Sep 2013 15:59:33 +0200 Subject: [PATCH 146/400] Fixed bug #65678 the test cli_process_title_windows will fails on particular environnement Patch by Pierre Renaudet --- sapi/cli/tests/cli_process_title_windows.phpt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sapi/cli/tests/cli_process_title_windows.phpt b/sapi/cli/tests/cli_process_title_windows.phpt index 309c09c0e192e..472f9c10fed42 100644 --- a/sapi/cli/tests/cli_process_title_windows.phpt +++ b/sapi/cli/tests/cli_process_title_windows.phpt @@ -20,7 +20,7 @@ if (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') // no warnings/errors. $is_windows8 = false; -$ps_output = shell_exec("PowerShell \"(Get-Host).UI.RawUI.WindowTitle\""); +$ps_output = shell_exec("PowerShell -NoProfile \"(Get-Host).UI.RawUI.WindowTitle\""); if ($ps_output === null) { echo "Get-Host failed\n"; @@ -28,7 +28,8 @@ if ($ps_output === null) } $ps_output = trim($ps_output); -if (($ps_output == "Windows PowerShell") || ($ps_output == "Administrator: Windows PowerShell")) +$end_title_windows8 = ": Windows PowerShell"; +if (($ps_output == "Windows PowerShell") || (strlen($ps_output) > strlen($end_title_windows8) && substr($ps_output,-strlen($end_title_windows8)) === $end_title_windows8)) $is_windows8 = true; echo "*** Testing setting the process title ***\n"; @@ -45,7 +46,7 @@ if ($is_windows8) } else { - $loaded_title = shell_exec("PowerShell \"get-process cmd*,powershell* | Select-Object mainWindowTitle | ft -hide\""); + $loaded_title = shell_exec("PowerShell -NoProfile \"get-process cmd*,powershell* | Select-Object mainWindowTitle | ft -hide\""); if ($loaded_title === null) { From 574fe449dc05a11cfe7e6a33b04d3f6557442600 Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Fri, 20 Sep 2013 22:50:30 +0800 Subject: [PATCH 147/400] removed the byref result --- ext/openssl/openssl.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index f0ae2b70b19d3..e6040d5f2cbe4 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -129,9 +129,8 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_x509_export, 0, 0, 2) ZEND_ARG_INFO(0, notext) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_x509_digest, 0, 0, 2) +ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_x509_digest, 0, 0, 1) ZEND_ARG_INFO(0, x509) - ZEND_ARG_INFO(1, out) ZEND_ARG_INFO(0, method) ZEND_ARG_INFO(0, raw_output) ZEND_END_ARG_INFO() @@ -1676,7 +1675,7 @@ PHP_FUNCTION(openssl_x509_export) PHP_FUNCTION(openssl_x509_digest) { X509 *cert; - zval **zcert, *zout; + zval **zcert; long certresource; zend_bool raw_output = 0; char *method = "sha1"; @@ -1688,7 +1687,7 @@ PHP_FUNCTION(openssl_x509_digest) RETVAL_FALSE; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zz|sb", &zcert, &zout, &method, &method_len, &raw_output) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|sb", &zcert, &method, &method_len, &raw_output) == FAILURE) { return; } @@ -1701,7 +1700,7 @@ PHP_FUNCTION(openssl_x509_digest) mdtype = EVP_get_digestbyname(method); if (!mdtype) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown signature algorithm"); - RETURN_FALSE; + return; } if (!X509_digest(cert, mdtype, md, &n)) { @@ -1709,22 +1708,19 @@ PHP_FUNCTION(openssl_x509_digest) return; } - zval_dtor(zout); - if (raw_output) { - ZVAL_STRINGL(zout, md, n, 1); + RETVAL_STRINGL(md, n, 1); } else { int digest_str_len = n * 2; char *digest_str = emalloc(digest_str_len + 1); make_digest_ex(digest_str, md, n); - ZVAL_STRINGL(zout, digest_str, digest_str_len, 0); + RETVAL_STRINGL(digest_str, digest_str_len, 0); } if (certresource == -1 && cert) { X509_free(cert); } - RETVAL_TRUE; } /* {{{ proto bool openssl_x509_check_private_key(mixed cert, mixed key) From a97aec16c0320c5737b43ad1c3caf01ea1485874 Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Fri, 20 Sep 2013 23:28:29 +0800 Subject: [PATCH 148/400] Added test case for openssl_x509_digest() --- ext/openssl/tests/openssl_x509_digest.phpt | 39 ++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 ext/openssl/tests/openssl_x509_digest.phpt diff --git a/ext/openssl/tests/openssl_x509_digest.phpt b/ext/openssl/tests/openssl_x509_digest.phpt new file mode 100644 index 0000000000000..98ec0098e827e --- /dev/null +++ b/ext/openssl/tests/openssl_x509_digest.phpt @@ -0,0 +1,39 @@ +--TEST-- +Testing openssl_x509_digest() +--SKIPIF-- + +--FILE-- + Date: Fri, 20 Sep 2013 14:15:19 -0700 Subject: [PATCH 149/400] Fix the broken sh syntax in ext/imap/config.m4. Patch by ryotakatsuki at gmail dot com. Fixes bug #65721 (configure script broken in 5.5.4 and 5.4.20 when enabling imap). --- NEWS | 4 ++++ ext/imap/config.m4 | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 6d94980fbcdb2..bb170e7fcf9fa 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,10 @@ PHP NEWS . Fixed bug #64441 (FILTER_VALIDATE_URL rejects fully qualified domain names). (Syra) +- IMAP: + . Fixed bug #65721 (configure script broken in 5.5.4 and 5.4.20 when enabling + imap). (ryotakatsuki at gmail dot com) + ?? ??? 2013, PHP 5.4.20 - Core: diff --git a/ext/imap/config.m4 b/ext/imap/config.m4 index d4dcd4c8adc02..3fcf6742daded 100644 --- a/ext/imap/config.m4 +++ b/ext/imap/config.m4 @@ -198,9 +198,9 @@ if test "$PHP_IMAP" != "no"; then AC_MSG_ERROR(Cannot find rfc822.h. Please check your c-client installation.) fi - if test ! -r "$IMAP_DIR/c-client/libc-client.a" && -r "$IMAP_DIR/c-client/c-client.a" ; then + if test ! -r "$IMAP_DIR/c-client/libc-client.a" && test -r "$IMAP_DIR/c-client/c-client.a" ; then ln -s "$IMAP_DIR/c-client/c-client.a" "$IMAP_DIR/c-client/libc-client.a" >/dev/null 2>&1 - elif test ! -r "$IMAP_DIR/$PHP_LIBDIR/libc-client.a" && -r "$IMAP_DIR/$PHP_LIBDIR/c-client.a"; then + elif test ! -r "$IMAP_DIR/$PHP_LIBDIR/libc-client.a" && test -r "$IMAP_DIR/$PHP_LIBDIR/c-client.a"; then ln -s "$IMAP_DIR/$PHP_LIBDIR/c-client.a" "$IMAP_DIR/$PHP_LIBDIR/libc-client.a" >/dev/null 2>&1 fi From 8915c3fb4fa40743bdddf23013a63e014d03d02c Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Sat, 21 Sep 2013 16:45:20 +0800 Subject: [PATCH 150/400] added better wildcard matching for CN --- ext/openssl/openssl.c | 35 +++++++++++++++++++-------- ext/openssl/tests/bug65729.pem | 28 ++++++++++++++++++++++ ext/openssl/tests/bug65729.phpt | 42 +++++++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+), 10 deletions(-) create mode 100644 ext/openssl/tests/bug65729.pem create mode 100644 ext/openssl/tests/bug65729.phpt diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 4aac4e3137cad..5460f3a6e1131 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -4829,6 +4829,30 @@ static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx) /* {{{ */ } /* }}} */ +static int php_openssl_match_cn(const char *subjectname, const char *certname) +{ + int match = strcmp(subjectname, certname) == 0; + + if (!match) { + char *wildcard = strchr(certname, '*'); + int prefix_len = wildcard - certname; + + /* 1) prefix, if not empty, must match */ + if (wildcard && (prefix_len == 0 || strncmp(subjectname, certname, prefix_len) == 0)) { + const char *suffix = subjectname + strlen(subjectname) - strlen(wildcard + 1); + + /* + * 2) suffix must match + * 3) no period between prefix and suffix + **/ + match = strcmp(wildcard + 1, suffix) == 0 && + memchr(subjectname + prefix_len, '.', suffix - subjectname - prefix_len) == NULL; + } + } + + return match; +} + int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stream TSRMLS_DC) /* {{{ */ { zval **val = NULL; @@ -4881,16 +4905,7 @@ int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stre return FAILURE; } - match = strcmp(cnmatch, buf) == 0; - if (!match && strlen(buf) > 3 && buf[0] == '*' && buf[1] == '.') { - /* Try wildcard */ - - if (strchr(buf+2, '.')) { - char *tmp = strstr(cnmatch, buf+1); - - match = tmp && strcmp(tmp, buf+2) && tmp == strchr(cnmatch, '.'); - } - } + match = php_openssl_match_cn(cnmatch, buf); if (!match) { /* didn't match */ diff --git a/ext/openssl/tests/bug65729.pem b/ext/openssl/tests/bug65729.pem new file mode 100644 index 0000000000000..dbeed6efd3011 --- /dev/null +++ b/ext/openssl/tests/bug65729.pem @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE----- +MIICCTCCAXICCQDNMI29sowT7TANBgkqhkiG9w0BAQUFADBJMQswCQYDVQQGEwJT +RzESMBAGA1UECBMJVGVzdHZpbGxlMREwDwYDVQQKEwhkYXRpYmJhdzETMBEGA1UE +AxQKKi50ZXN0LmNvbTAeFw0xMzA5MjEwNzUyMjRaFw0xNDA5MjEwNzUyMjRaMEkx +CzAJBgNVBAYTAlNHMRIwEAYDVQQIEwlUZXN0dmlsbGUxETAPBgNVBAoTCGRhdGli +YmF3MRMwEQYDVQQDFAoqLnRlc3QuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQCdzVnic8K5W4SVbwVuqezcTjeqVLoQ91vVNZB0Jnsuz6q3DoK03oAd1jTe +Vd0k+MQDbXpHoc37lA4+8z/g5Bs0UXxNx+nkbFTE7Ba2/G24caI9/cOXZPG3UViD +rtqXKL6h5/umqRG9Dt5liF2MVP9XFAesVC7B8+Ca+PbPlQoYzwIDAQABMA0GCSqG +SIb3DQEBBQUAA4GBAAS07u/Ke+EhEHidz6CG3Qcr+zg483JKRgZFyGz+YUKyyKKy +fmLs7JieGJxYQjOmIpj/6X9Gnb2HjIPDnI6A+MV1emXDTnnmsgf2/lZGcthhpZn2 +rMbj9bI0iH6HwOVGtp4ZJA5fB7nj3J+gWNTCQzDDOxwX36d2LL9ua+UMnk/g +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQCdzVnic8K5W4SVbwVuqezcTjeqVLoQ91vVNZB0Jnsuz6q3DoK0 +3oAd1jTeVd0k+MQDbXpHoc37lA4+8z/g5Bs0UXxNx+nkbFTE7Ba2/G24caI9/cOX +ZPG3UViDrtqXKL6h5/umqRG9Dt5liF2MVP9XFAesVC7B8+Ca+PbPlQoYzwIDAQAB +AoGAeyzTwKPDl5QMRejHQL57GOwlH1vLcXrjv+VzwHZZKQ0IoKM++5fCQYf29KXp +XPahaluGW2u9sWa8R/7wGcd0Q4RtquGzsgT3+AQsIc5KfIamyOyDaRVM/ymX3fWg +gHIU7OOzB+ihOU8sHyRIwfbk01/kmrBXLRj8E31sy3i3PIECQQDQQYE+aN7Acrdt +yN5CaqvbkiCGjRvASlemiTzPosgOtndyp21w1gakJwKYhYDk1N6A6Qb8REMZqM/U +wFypldV/AkEAwfq6NFuhpGL6hDA7MvlyY1KiZ0cHetPUX+PgdNqy2DA+1Sv4i7gm +Wd/uA651K7aPXuUaf9dKtPCmZwI4M6SEsQJBALW89HTqP7niYoDEEnITdPaghxHk +gptERUln6lGo1L1CLus3gSI/JHyMLo+7scgAnEwTD62GRKhX0Ubwt+ymfTECQAY5 +fHYnppU20+EgBxZIqOIFCc8UmWnYmE0Ha/Fz/x8u1SVUBuK84wYpSGL32yyu7ATY +hzQo/W229zABAzqtAdECQQCUdB7IBFpPnsfv/EUBFX7X/7zAc9JpACmu9It5ju8C +KIsMuz/02D+TQoJNjdAngBM+4AJDIaGFgTMIfaDMh5L7 +-----END RSA PRIVATE KEY----- diff --git a/ext/openssl/tests/bug65729.phpt b/ext/openssl/tests/bug65729.phpt new file mode 100644 index 0000000000000..d4645d9f5b432 --- /dev/null +++ b/ext/openssl/tests/bug65729.phpt @@ -0,0 +1,42 @@ +--TEST-- +Bug #65729: CN_match gives false positive when wildcard is used +--SKIPIF-- + array( + 'verify_peer' => true, + 'allow_self_signed' => true, + 'CN_match' => 'foo.test.com.sg', + ) + ) + ); + var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, + STREAM_CLIENT_CONNECT, $contextC)); +} else { + @pcntl_wait($status); + @stream_socket_accept($server, 1); +} +--EXPECTF-- +Warning: stream_socket_client(): Peer certificate CN=`*.test.com' did not match expected CN=`foo.test.com.sg' in %s on line %d + +Warning: stream_socket_client(): Failed to enable crypto in %s on line %d + +Warning: stream_socket_client(): unable to connect to ssl://127.0.0.1:64321 (Unknown error) in %s on line %d +bool(false) + From 521a5c956800115f0be008e0581878e4303a5118 Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Sat, 21 Sep 2013 18:24:00 +0800 Subject: [PATCH 151/400] don't leak cert on errors, return null on zpp failure --- ext/openssl/openssl.c | 30 ++++++++++------------ ext/openssl/tests/openssl_x509_digest.phpt | 8 ++++++ 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index e6040d5f2cbe4..9685dac87c66e 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1685,8 +1685,6 @@ PHP_FUNCTION(openssl_x509_digest) unsigned char md[EVP_MAX_MD_SIZE]; unsigned int n; - RETVAL_FALSE; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|sb", &zcert, &method, &method_len, &raw_output) == FAILURE) { return; } @@ -1694,28 +1692,26 @@ PHP_FUNCTION(openssl_x509_digest) cert = php_openssl_x509_from_zval(zcert, 0, &certresource TSRMLS_CC); if (cert == NULL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "cannot get cert from parameter 1"); - return; + RETURN_FALSE; } mdtype = EVP_get_digestbyname(method); if (!mdtype) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown signature algorithm"); - return; - } - - if (!X509_digest(cert, mdtype, md, &n)) { - php_error_docref(NULL TSRMLS_CC, E_ERROR, "out of memory"); - return; - } - - if (raw_output) { - RETVAL_STRINGL(md, n, 1); + RETVAL_FALSE; + } else if (!X509_digest(cert, mdtype, md, &n)) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Out of memory"); + RETVAL_FALSE; } else { - int digest_str_len = n * 2; - char *digest_str = emalloc(digest_str_len + 1); + if (raw_output) { + RETVAL_STRINGL(md, n, 1); + } else { + int digest_str_len = n * 2; + char *digest_str = emalloc(digest_str_len + 1); - make_digest_ex(digest_str, md, n); - RETVAL_STRINGL(digest_str, digest_str_len, 0); + make_digest_ex(digest_str, md, n); + RETVAL_STRINGL(digest_str, digest_str_len, 0); + } } if (certresource == -1 && cert) { diff --git a/ext/openssl/tests/openssl_x509_digest.phpt b/ext/openssl/tests/openssl_x509_digest.phpt index 98ec0098e827e..fde42809a18c3 100644 --- a/ext/openssl/tests/openssl_x509_digest.phpt +++ b/ext/openssl/tests/openssl_x509_digest.phpt @@ -9,8 +9,12 @@ if (!extension_loaded("openssl")) die("skip"); $cert = "file://" . dirname(__FILE__) . "/cert.crt"; +echo "** Testing with no parameters **\n"; +var_dump(openssl_x509_digest()); + echo "** Testing default functionality **\n"; var_dump(openssl_x509_digest($cert)); + echo "** Testing hash method md5 **\n"; var_dump(openssl_x509_digest($cert, 'md5')); @@ -22,6 +26,10 @@ var_dump(openssl_x509_digest('123')); echo "** Testing bad hash method **\n"; var_dump(openssl_x509_digest($cert, 'xx45')); --EXPECTF-- +** Testing with no parameters ** + +Warning: openssl_x509_digest() expects at least 1 parameter, 0 given in %s on line %d +NULL ** Testing default functionality ** string(40) "6e6fd1ea10a5a23071d61c728ee9b40df6dbc33c" ** Testing hash method md5 ** From 8e847b5845b85c080295aea60c20869973c09a15 Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Sat, 21 Sep 2013 19:38:09 +0800 Subject: [PATCH 152/400] Fixed bug that would lead to out of bounds memory access --- ext/openssl/openssl.c | 46 ++++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 5460f3a6e1131..1c367df0815d0 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -4831,26 +4831,36 @@ static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx) /* {{{ */ static int php_openssl_match_cn(const char *subjectname, const char *certname) { - int match = strcmp(subjectname, certname) == 0; - - if (!match) { - char *wildcard = strchr(certname, '*'); - int prefix_len = wildcard - certname; - - /* 1) prefix, if not empty, must match */ - if (wildcard && (prefix_len == 0 || strncmp(subjectname, certname, prefix_len) == 0)) { - const char *suffix = subjectname + strlen(subjectname) - strlen(wildcard + 1); - - /* - * 2) suffix must match - * 3) no period between prefix and suffix - **/ - match = strcmp(wildcard + 1, suffix) == 0 && - memchr(subjectname + prefix_len, '.', suffix - subjectname - prefix_len) == NULL; - } + char *wildcard; + int prefix_len, suffix_len, subject_len; + + if (strcmp(subjectname, certname) == 0) { + return 1; } - return match; + if (!(wildcard = strchr(certname, '*'))) { + return 0; + } + + // 1) prefix, if not empty, must match subject + prefix_len = wildcard - certname; + if (prefix_len && strncmp(subjectname, certname, prefix_len) != 0) { + return 0; + } + + suffix_len = strlen(wildcard + 1); + subject_len = strlen(subjectname); + if (suffix_len <= subject_len) { + const char *suffix = subjectname + subject_len - suffix_len; + + /* 2) suffix must match + * 3) no . between prefix and suffix + **/ + return strcmp(wildcard + 1, suffix) == 0 && + memchr(subjectname + prefix_len, '.', suffix - subjectname - prefix_len) == NULL; + } + + return 0; } int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stream TSRMLS_DC) /* {{{ */ From a820c3d6baac945ead4a5fe6e54d0a04b02620de Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Sat, 21 Sep 2013 20:42:52 +0800 Subject: [PATCH 153/400] yay, reduced one variable --- ext/openssl/openssl.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 1c367df0815d0..2aa850ad1c0db 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -4851,13 +4851,11 @@ static int php_openssl_match_cn(const char *subjectname, const char *certname) suffix_len = strlen(wildcard + 1); subject_len = strlen(subjectname); if (suffix_len <= subject_len) { - const char *suffix = subjectname + subject_len - suffix_len; - /* 2) suffix must match * 3) no . between prefix and suffix **/ - return strcmp(wildcard + 1, suffix) == 0 && - memchr(subjectname + prefix_len, '.', suffix - subjectname - prefix_len) == NULL; + return strcmp(wildcard + 1, subjectname + subject_len - suffix_len) == 0 && + memchr(subjectname + prefix_len, '.', subject_len - suffix_len - prefix_len) == NULL; } return 0; From ce2789558a970057539094ca9019d98ff09e831e Mon Sep 17 00:00:00 2001 From: Martin Jansen Date: Sat, 21 Sep 2013 21:26:40 +0200 Subject: [PATCH 154/400] Streams for ssl:// transports can now be configured to use a specific crypto method (SSLv3, SSLv2 etc.) by calling stream_context_set_option($ctx, "ssl", "crypto_method", $crypto_method) where $crypto_method can be one of STREAM_CRYPTO_METHOD_SSLv2_CLIENT, STREAM_CRYPTO_METHOD_SSLv3_CLIENT, STREAM_CRYPTO_METHOD_SSLv23_CLIENT or STREAM_CRYPTO_METHOD_TLS_CLIENT. SSLv23 remains the default crypto method. This change makes it possible to fopen() SSL URLs that are only provided using SSL v3. --- ext/openssl/xp_ssl.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c index d7ef42e0b1ddd..1ac8a0220e3a0 100644 --- a/ext/openssl/xp_ssl.c +++ b/ext/openssl/xp_ssl.c @@ -853,6 +853,29 @@ php_stream_ops php_openssl_socket_ops = { php_openssl_sockop_set_option, }; +static int get_crypto_method(php_stream_context *ctx) { + if (ctx) { + zval **val = NULL; + long crypto_method; + + if (php_stream_context_get_option(ctx, "ssl", "crypto_method", &val) == SUCCESS) { + convert_to_long_ex(val); + crypto_method = (long)Z_LVAL_PP(val); + + switch (crypto_method) { + case STREAM_CRYPTO_METHOD_SSLv2_CLIENT: + case STREAM_CRYPTO_METHOD_SSLv3_CLIENT: + case STREAM_CRYPTO_METHOD_SSLv23_CLIENT: + case STREAM_CRYPTO_METHOD_TLS_CLIENT: + return crypto_method; + } + + } + } + + return STREAM_CRYPTO_METHOD_SSLv23_CLIENT; +} + static char * get_sni(php_stream_context *ctx, const char *resourcename, size_t resourcenamelen, int is_persistent TSRMLS_DC) { php_url *url; @@ -939,7 +962,12 @@ php_stream *php_openssl_ssl_socket_factory(const char *proto, size_t protolen, if (strncmp(proto, "ssl", protolen) == 0) { sslsock->enable_on_connect = 1; - sslsock->method = STREAM_CRYPTO_METHOD_SSLv23_CLIENT; + + /* General ssl:// transports can use a number + * of crypto methods. The actual methhod can be + * provided in the streams context options. + */ + sslsock->method = get_crypto_method(context); } else if (strncmp(proto, "sslv2", protolen) == 0) { #ifdef OPENSSL_NO_SSL2 php_error_docref(NULL TSRMLS_CC, E_WARNING, "SSLv2 support is not compiled into the OpenSSL library PHP is linked against"); From 2bfc5a253b4ee76f9930692f2d088371c38dd65f Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Mon, 23 Sep 2013 00:51:17 +0800 Subject: [PATCH 155/400] Renamed to be more descriptive of what it does --- ext/openssl/openssl.c | 6 +++--- ext/openssl/php_openssl.h | 2 +- ...est.phpt => openssl_x509_fingerprint.phpt} | 20 +++++++++---------- 3 files changed, 14 insertions(+), 14 deletions(-) rename ext/openssl/tests/{openssl_x509_digest.phpt => openssl_x509_fingerprint.phpt} (58%) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 9685dac87c66e..9da10fc0a0153 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -129,7 +129,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_x509_export, 0, 0, 2) ZEND_ARG_INFO(0, notext) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_x509_digest, 0, 0, 1) +ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_x509_fingerprint, 0, 0, 1) ZEND_ARG_INFO(0, x509) ZEND_ARG_INFO(0, method) ZEND_ARG_INFO(0, raw_output) @@ -449,7 +449,7 @@ const zend_function_entry openssl_functions[] = { PHP_FE(openssl_x509_checkpurpose, arginfo_openssl_x509_checkpurpose) PHP_FE(openssl_x509_check_private_key, arginfo_openssl_x509_check_private_key) PHP_FE(openssl_x509_export, arginfo_openssl_x509_export) - PHP_FE(openssl_x509_digest, arginfo_openssl_x509_digest) + PHP_FE(openssl_x509_fingerprint, arginfo_openssl_x509_fingerprint) PHP_FE(openssl_x509_export_to_file, arginfo_openssl_x509_export_to_file) /* PKCS12 funcs */ @@ -1672,7 +1672,7 @@ PHP_FUNCTION(openssl_x509_export) } /* }}} */ -PHP_FUNCTION(openssl_x509_digest) +PHP_FUNCTION(openssl_x509_fingerprint) { X509 *cert; zval **zcert; diff --git a/ext/openssl/php_openssl.h b/ext/openssl/php_openssl.h index 4f0ac14100143..a06e43db1ce5e 100644 --- a/ext/openssl/php_openssl.h +++ b/ext/openssl/php_openssl.h @@ -66,7 +66,7 @@ PHP_FUNCTION(openssl_x509_free); PHP_FUNCTION(openssl_x509_parse); PHP_FUNCTION(openssl_x509_checkpurpose); PHP_FUNCTION(openssl_x509_export); -PHP_FUNCTION(openssl_x509_digest); +PHP_FUNCTION(openssl_x509_fingerprint); PHP_FUNCTION(openssl_x509_export_to_file); PHP_FUNCTION(openssl_x509_check_private_key); diff --git a/ext/openssl/tests/openssl_x509_digest.phpt b/ext/openssl/tests/openssl_x509_fingerprint.phpt similarity index 58% rename from ext/openssl/tests/openssl_x509_digest.phpt rename to ext/openssl/tests/openssl_x509_fingerprint.phpt index fde42809a18c3..6cd464a894872 100644 --- a/ext/openssl/tests/openssl_x509_digest.phpt +++ b/ext/openssl/tests/openssl_x509_fingerprint.phpt @@ -1,5 +1,5 @@ --TEST-- -Testing openssl_x509_digest() +Testing openssl_x509_fingerprint() --SKIPIF-- Date: Sun, 22 Sep 2013 16:46:17 -0700 Subject: [PATCH 156/400] Copy dba_*() keys before converting to string. A nice Sunday afternoon project for somebody would be to refactor the dba functions to use zend_parse_parameters() reliably and try to untangle some of the macros in dba.c. Sadly, it is not a nice Sunday afternoon here. Fixes bug #65708 (dba functions cast $key param to string in-place, bypassing copy on write). --- NEWS | 4 ++++ ext/dba/dba.c | 25 ++++++++++++++++++------ ext/dba/tests/bug65708.phpt | 38 +++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 ext/dba/tests/bug65708.phpt diff --git a/NEWS b/NEWS index bb170e7fcf9fa..e17632543c442 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,10 @@ PHP NEWS . Fixed bug #64157 (DateTime::createFromFormat() reports confusing error message). (Boro Sitnikovski) +- DBA extension: + . Fixed bug #65708 (dba functions cast $key param to string in-place, + bypassing copy on write). (Adam) + - Filter: . Add RFC 6598 IPs to reserved addresses. (Sebastian Nohn) . Fixed bug #64441 (FILTER_VALIDATE_URL rejects fully qualified domain names). diff --git a/ext/dba/dba.c b/ext/dba/dba.c index 8005101de34b1..50a94dd2adca3 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -226,12 +226,17 @@ static size_t php_dba_make_key(zval *key, char **key_str, char **key_free TSRMLS *key_free = *key_str; return len; } else { - *key_free = NULL; + zval tmp = *key; + int len; - convert_to_string(key); - *key_str = Z_STRVAL_P(key); + zval_copy_ctor(&tmp); + convert_to_string(&tmp); - return Z_STRLEN_P(key); + *key_free = *key_str = estrndup(Z_STRVAL(tmp), Z_STRLEN(tmp)); + len = Z_STRLEN(tmp); + + zval_dtor(&tmp); + return len; } } /* }}} */ @@ -297,6 +302,14 @@ static size_t php_dba_make_key(zval *key, char **key_str, char **key_free TSRMLS RETURN_FALSE; \ } +/* the same check, but with a call to DBA_ID_DONE before returning */ +#define DBA_WRITE_CHECK_WITH_ID \ + if(info->mode != DBA_WRITER && info->mode != DBA_TRUNC && info->mode != DBA_CREAT) { \ + php_error_docref(NULL TSRMLS_CC, E_WARNING, "You cannot perform a modification to a database without proper access"); \ + DBA_ID_DONE; \ + RETURN_FALSE; \ + } + /* }}} */ /* {{{ globals */ @@ -557,7 +570,7 @@ static void php_dba_update(INTERNAL_FUNCTION_PARAMETERS, int mode) DBA_FETCH_RESOURCE(info, &id); - DBA_WRITE_CHECK; + DBA_WRITE_CHECK_WITH_ID; if (info->hnd->update(info, key_str, key_len, val, val_len, mode TSRMLS_CC) == SUCCESS) { DBA_ID_DONE; @@ -1110,7 +1123,7 @@ PHP_FUNCTION(dba_delete) { DBA_ID_GET2; - DBA_WRITE_CHECK; + DBA_WRITE_CHECK_WITH_ID; if(info->hnd->delete(info, key_str, key_len TSRMLS_CC) == SUCCESS) { diff --git a/ext/dba/tests/bug65708.phpt b/ext/dba/tests/bug65708.phpt new file mode 100644 index 0000000000000..b77138f6ed438 --- /dev/null +++ b/ext/dba/tests/bug65708.phpt @@ -0,0 +1,38 @@ +--TEST-- +Bug #65708 (dba functions cast $key param to string in-place, bypassing copy on write) +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECT-- +integer +integer +integer +integer From f7eff9cd41e0b996af9a0a01d3c5f8fdd8b7fa60 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Mon, 23 Sep 2013 13:21:57 +0200 Subject: [PATCH 157/400] Make message and format arguments const char * to avoid build warning about invalid cast. --- Zend/zend_exceptions.c | 8 ++++---- Zend/zend_exceptions.h | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c index 14ae75e38d096..c7f157c4d5f2d 100644 --- a/Zend/zend_exceptions.c +++ b/Zend/zend_exceptions.c @@ -560,7 +560,7 @@ ZEND_METHOD(exception, getPrevious) RETURN_ZVAL(previous, 1, 0); } -int zend_spprintf(char **message, int max_len, char *format, ...) /* {{{ */ +int zend_spprintf(char **message, int max_len, const char *format, ...) /* {{{ */ { va_list arg; int len; @@ -732,7 +732,7 @@ ZEND_API zend_class_entry *zend_get_error_exception(TSRMLS_D) /* {{{ */ } /* }}} */ -ZEND_API zval * zend_throw_exception(zend_class_entry *exception_ce, char *message, long code TSRMLS_DC) /* {{{ */ +ZEND_API zval * zend_throw_exception(zend_class_entry *exception_ce, const char *message, long code TSRMLS_DC) /* {{{ */ { zval *ex; @@ -760,7 +760,7 @@ ZEND_API zval * zend_throw_exception(zend_class_entry *exception_ce, char *messa } /* }}} */ -ZEND_API zval * zend_throw_exception_ex(zend_class_entry *exception_ce, long code TSRMLS_DC, char *format, ...) /* {{{ */ +ZEND_API zval * zend_throw_exception_ex(zend_class_entry *exception_ce, long code TSRMLS_DC, const char *format, ...) /* {{{ */ { va_list arg; char *message; @@ -775,7 +775,7 @@ ZEND_API zval * zend_throw_exception_ex(zend_class_entry *exception_ce, long cod } /* }}} */ -ZEND_API zval * zend_throw_error_exception(zend_class_entry *exception_ce, char *message, long code, int severity TSRMLS_DC) /* {{{ */ +ZEND_API zval * zend_throw_error_exception(zend_class_entry *exception_ce, const char *message, long code, int severity TSRMLS_DC) /* {{{ */ { zval *ex = zend_throw_exception(exception_ce, message, code TSRMLS_CC); zend_update_property_long(default_exception_ce, ex, "severity", sizeof("severity")-1, severity TSRMLS_CC); diff --git a/Zend/zend_exceptions.h b/Zend/zend_exceptions.h index 82633530d61ad..81c8a1f21333e 100644 --- a/Zend/zend_exceptions.h +++ b/Zend/zend_exceptions.h @@ -40,12 +40,12 @@ ZEND_API void zend_register_default_classes(TSRMLS_D); /* exception_ce NULL or zend_exception_get_default() or a derived class * message NULL or the message of the exception */ -ZEND_API zval * zend_throw_exception(zend_class_entry *exception_ce, char *message, long code TSRMLS_DC); -ZEND_API zval * zend_throw_exception_ex(zend_class_entry *exception_ce, long code TSRMLS_DC, char *format, ...); +ZEND_API zval * zend_throw_exception(zend_class_entry *exception_ce, const char *message, long code TSRMLS_DC); +ZEND_API zval * zend_throw_exception_ex(zend_class_entry *exception_ce, long code TSRMLS_DC, const char *format, ...); ZEND_API void zend_throw_exception_object(zval *exception TSRMLS_DC); ZEND_API void zend_clear_exception(TSRMLS_D); -ZEND_API zval * zend_throw_error_exception(zend_class_entry *exception_ce, char *message, long code, int severity TSRMLS_DC); +ZEND_API zval * zend_throw_error_exception(zend_class_entry *exception_ce, const char *message, long code, int severity TSRMLS_DC); extern ZEND_API void (*zend_throw_exception_hook)(zval *ex TSRMLS_DC); @@ -53,7 +53,7 @@ extern ZEND_API void (*zend_throw_exception_hook)(zval *ex TSRMLS_DC); ZEND_API void zend_exception_error(zval *exception, int severity TSRMLS_DC); /* do not export, in php it's available thru spprintf directly */ -int zend_spprintf(char **message, int max_len, char *format, ...); +int zend_spprintf(char **message, int max_len, const char *format, ...); END_EXTERN_C() From 1c7cabb2ca405e6763d7044015f9cb063941a838 Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Mon, 23 Sep 2013 23:29:17 +0800 Subject: [PATCH 158/400] add md5 and sha1 fingerprint tests --- ext/openssl/openssl.c | 79 ++++++++++++++----- .../tests/openssl_peer_fingerprint.phpt | 44 +++++++++++ 2 files changed, 104 insertions(+), 19 deletions(-) create mode 100644 ext/openssl/tests/openssl_peer_fingerprint.phpt diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 9da10fc0a0153..c8588e256904b 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1,4 +1,5 @@ /* + +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ @@ -1672,6 +1673,33 @@ PHP_FUNCTION(openssl_x509_export) } /* }}} */ +int php_openssl_x509_fingerprint(X509 *peer, const char *method, int raw, char **out, int *out_len) +{ + unsigned char md[EVP_MAX_MD_SIZE]; + const EVP_MD *mdtype; + int n; + + if (!(mdtype = EVP_get_digestbyname(method))) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown signature algorithm"); + return 0; + } else if (!X509_digest(peer, mdtype, md, &n)) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not generate signature"); + return 0; + } + + if (raw) { + *out_len = n; + *out = estrndup(md, n); + } else { + *out_len = n * 2; + *out = emalloc(*out_len + 1); + + make_digest_ex(*out, md, n); + } + + return 1; +} + PHP_FUNCTION(openssl_x509_fingerprint) { X509 *cert; @@ -1681,9 +1709,8 @@ PHP_FUNCTION(openssl_x509_fingerprint) char *method = "sha1"; int method_len; - const EVP_MD *mdtype; - unsigned char md[EVP_MAX_MD_SIZE]; - unsigned int n; + char *fingerprint; + char *fingerprint_len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|sb", &zcert, &method, &method_len, &raw_output) == FAILURE) { return; @@ -1695,23 +1722,10 @@ PHP_FUNCTION(openssl_x509_fingerprint) RETURN_FALSE; } - mdtype = EVP_get_digestbyname(method); - if (!mdtype) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown signature algorithm"); - RETVAL_FALSE; - } else if (!X509_digest(cert, mdtype, md, &n)) { - php_error_docref(NULL TSRMLS_CC, E_ERROR, "Out of memory"); - RETVAL_FALSE; + if (php_openssl_x509_fingerprint(cert, method, raw_output, &fingerprint, &fingerprint_len)) { + RETVAL_STRINGL(fingerprint, fingerprint_len, 0); } else { - if (raw_output) { - RETVAL_STRINGL(md, n, 1); - } else { - int digest_str_len = n * 2; - char *digest_str = emalloc(digest_str_len + 1); - - make_digest_ex(digest_str, md, n); - RETVAL_STRINGL(digest_str, digest_str_len, 0); - } + RETVAL_FALSE; } if (certresource == -1 && cert) { @@ -4919,6 +4933,33 @@ int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stre /* if the cert passed the usual checks, apply our own local policies now */ + if (GET_VER_OPT("peer_fingerprint") && Z_TYPE_PP(val) == IS_STRING) { + char *fingerprint; + int fingerprint_len; + const char *method = NULL; + + switch (Z_STRLEN_PP(val)) { + case 32: + method = "md5"; + break; + + case 40: + method = "sha1"; + break; + } + + if (method && php_openssl_x509_fingerprint(peer, method, 0, &fingerprint, &fingerprint_len)) { + int match = strcmp(Z_STRVAL_PP(val), fingerprint) == 0; + + efree(fingerprint); + + if (!match) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer fingerprint `%s` not matched", Z_STRVAL_PP(val)); + return FAILURE; + } + } + } + name = X509_get_subject_name(peer); /* Does the common name match ? (used primarily for https://) */ diff --git a/ext/openssl/tests/openssl_peer_fingerprint.phpt b/ext/openssl/tests/openssl_peer_fingerprint.phpt new file mode 100644 index 0000000000000..a6be676dcb44a --- /dev/null +++ b/ext/openssl/tests/openssl_peer_fingerprint.phpt @@ -0,0 +1,44 @@ +--TEST-- +Testing peer fingerprint on connection +--SKIPIF-- + array( + 'verify_peer' => true, + 'cafile' => __DIR__ . '/bug54992-ca.pem', + 'capture_peer_cert' => true, + 'peer_fingerprint' => '81cafc260aa8d82956ebc6212a362ece', + ) + ) + ); + // should be: 81cafc260aa8d82956ebc6212a362ecc + var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, + STREAM_CLIENT_CONNECT, $contextC)); +} else { + @pcntl_wait($status); + @stream_socket_accept($server, 1); +} +--EXPECTF-- +Warning: stream_socket_client(): Peer fingerprint `81cafc260aa8d82956ebc6212a362ece` not matched in %s on line %d + +Warning: stream_socket_client(): Failed to enable crypto in %s on line %d + +Warning: stream_socket_client(): unable to connect to ssl://127.0.0.1:64321 (Unknown error) in %s on line %d +bool(false) From 69bdc5aca8f14515556bb6fc8f86becf55ef30bf Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Mon, 23 Sep 2013 23:42:31 +0800 Subject: [PATCH 159/400] who put that stupid newline there? --- ext/openssl/openssl.c | 1 - 1 file changed, 1 deletion(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index c8588e256904b..a6ddd1458c98f 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1,5 +1,4 @@ /* - +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ From 8d087dc0d7c88e26539646875dc0f7bb5042187b Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Mon, 23 Sep 2013 13:30:47 -0700 Subject: [PATCH 160/400] =?UTF-8?q?Fix=20typo:=20HTTP=5FROW=5FPOST=5FDATA?= =?UTF-8?q?=20=E2=86=92=20HTTP=5FRAW=5FPOST=5FDATA.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes bug #65745 (Typo in commit 4a3936ef4abdeb72c7d323fe4b6a65e1ae0ef181). --- UPGRADING | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UPGRADING b/UPGRADING index f5e7cd0bbdbb9..581a38e2ad2ec 100755 --- a/UPGRADING +++ b/UPGRADING @@ -26,7 +26,7 @@ PHP X.Y UPGRADE NOTES From dc8705c256cd1d50cfa276e8de31558e089eab92 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 Sep 2013 11:02:39 +0400 Subject: [PATCH 161/400] Fixed issue #135 (segfault in interned strings if initial memory is too low) --- NEWS | 2 ++ ext/opcache/ZendAccelerator.c | 14 ++++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index e02d1b93083bb..cd4d3771360a6 100644 --- a/NEWS +++ b/NEWS @@ -29,6 +29,8 @@ PHP NEWS . Fixed bug #65665 (Exception not properly caught when opcache enabled). (Laruence) . Fixed bug #65510 (5.5.2 crashes in _get_zval_ptr_ptr_var). (Dmitry) + . Fixed issue #135 (segfault in interned strings if initial memory is too + low). (Julien) - SPL: . Fix bug #64782 (SplFileObject constructor make $context optional / give it diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 827f047cd4f65..7fdae6fc67e37 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -2407,14 +2407,14 @@ static inline int accel_find_sapi(TSRMLS_D) return FAILURE; } -static void zend_accel_init_shm(TSRMLS_D) +static int zend_accel_init_shm(TSRMLS_D) { zend_shared_alloc_lock(TSRMLS_C); accel_shared_globals = zend_shared_alloc(sizeof(zend_accel_shared_globals)); if (!accel_shared_globals) { zend_accel_error(ACCEL_LOG_FATAL, "Insufficient shared memory!"); - return; + return FAILURE; } ZSMMG(app_shared_globals) = accel_shared_globals; @@ -2429,7 +2429,8 @@ static void zend_accel_init_shm(TSRMLS_D) ZCSG(interned_strings).arBuckets = zend_shared_alloc(ZCSG(interned_strings).nTableSize * sizeof(Bucket *)); ZCSG(interned_strings_start) = zend_shared_alloc((ZCG(accel_directives).interned_strings_buffer * 1024 * 1024)); if (!ZCSG(interned_strings).arBuckets || !ZCSG(interned_strings_start)) { - zend_error(E_ERROR, ACCELERATOR_PRODUCT_NAME " cannot allocate buffer for interned strings"); + zend_accel_error(ACCEL_LOG_FATAL, ACCELERATOR_PRODUCT_NAME " cannot allocate buffer for interned strings"); + return FAILURE; } ZCSG(interned_strings_end) = ZCSG(interned_strings_start) + (ZCG(accel_directives).interned_strings_buffer * 1024 * 1024); ZCSG(interned_strings_top) = ZCSG(interned_strings_start); @@ -2468,6 +2469,8 @@ static void zend_accel_init_shm(TSRMLS_D) ZCSG(restart_in_progress) = 0; zend_shared_alloc_unlock(TSRMLS_C); + + return SUCCESS; } static void accel_globals_ctor(zend_accel_globals *accel_globals TSRMLS_DC) @@ -2525,7 +2528,10 @@ static int accel_startup(zend_extension *extension) /********************************************/ switch (zend_shared_alloc_startup(ZCG(accel_directives).memory_consumption)) { case ALLOC_SUCCESS: - zend_accel_init_shm(TSRMLS_C); + if (zend_accel_init_shm(TSRMLS_C) == FAILURE) { + accel_startup_ok = 0; + return FAILURE; + } break; case ALLOC_FAILURE: accel_startup_ok = 0; From 69454d9f0f765416f245acbc626b3984dcbf5e1d Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 25 Sep 2013 12:14:06 +0400 Subject: [PATCH 162/400] Added function opcache_compile_file() to load PHP scripts into cache without execution. --- NEWS | 2 ++ ext/opcache/ZendAccelerator.c | 2 +- ext/opcache/ZendAccelerator.h | 1 + ext/opcache/zend_accelerator_module.c | 47 +++++++++++++++++++++++++++ 4 files changed, 51 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index cd4d3771360a6..bdc0cd5fb6532 100644 --- a/NEWS +++ b/NEWS @@ -26,6 +26,8 @@ PHP NEWS imap). (ryotakatsuki at gmail dot com) - OPcache: + . Added function opcache_compile_file() to load PHP scripts into cache + without execution. (Julien) . Fixed bug #65665 (Exception not properly caught when opcache enabled). (Laruence) . Fixed bug #65510 (5.5.2 crashes in _get_zval_ptr_ptr_var). (Dmitry) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 7fdae6fc67e37..72b5a1b9fe7e7 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -1446,7 +1446,7 @@ static zend_persistent_script *compile_and_cache_file(zend_file_handle *file_han } /* zend_compile() replacement */ -static zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC) +zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC) { zend_persistent_script *persistent_script = NULL; char *key = NULL; diff --git a/ext/opcache/ZendAccelerator.h b/ext/opcache/ZendAccelerator.h index 361b60b08f1c4..f223f126e43a8 100644 --- a/ext/opcache/ZendAccelerator.h +++ b/ext/opcache/ZendAccelerator.h @@ -325,6 +325,7 @@ int accelerator_shm_read_lock(TSRMLS_D); void accelerator_shm_read_unlock(TSRMLS_D); char *accel_make_persistent_key_ex(zend_file_handle *file_handle, int path_length, int *key_len TSRMLS_DC); +zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC); #if !defined(ZEND_DECLARE_INHERITED_CLASS_DELAYED) # define ZEND_DECLARE_INHERITED_CLASS_DELAYED 145 diff --git a/ext/opcache/zend_accelerator_module.c b/ext/opcache/zend_accelerator_module.c index f9ddaa98b8ba0..dedb7215c1df3 100644 --- a/ext/opcache/zend_accelerator_module.c +++ b/ext/opcache/zend_accelerator_module.c @@ -48,6 +48,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_opcache_get_status, 0, 0, 0) ZEND_ARG_INFO(0, fetch_scripts) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_opcache_compile_file, 0, 0, 1) + ZEND_ARG_INFO(0, file) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO_EX(arginfo_opcache_invalidate, 0, 0, 1) ZEND_ARG_INFO(0, script) ZEND_ARG_INFO(0, force) @@ -59,12 +63,14 @@ static ZEND_FUNCTION(opcache_invalidate); /* Private functions */ static ZEND_FUNCTION(opcache_get_status); +static ZEND_FUNCTION(opcache_compile_file); static ZEND_FUNCTION(opcache_get_configuration); static zend_function_entry accel_functions[] = { /* User functions */ ZEND_FE(opcache_reset, arginfo_opcache_none) ZEND_FE(opcache_invalidate, arginfo_opcache_invalidate) + ZEND_FE(opcache_compile_file, arginfo_opcache_compile_file) /* Private functions */ ZEND_FE(opcache_get_configuration, arginfo_opcache_none) ZEND_FE(opcache_get_status, arginfo_opcache_get_status) @@ -709,3 +715,44 @@ static ZEND_FUNCTION(opcache_invalidate) RETURN_FALSE; } } + +static ZEND_FUNCTION(opcache_compile_file) +{ + char *script_name; + int script_name_len; + zend_file_handle handle; + zend_op_array *op_array = NULL; + zend_execute_data *orig_execute_data = NULL; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &script_name, &script_name_len) == FAILURE) { + return; + } + + if (!ZCG(enabled) || !accel_startup_ok || !ZCSG(accelerator_enabled)) { + zend_error(E_NOTICE, ACCELERATOR_PRODUCT_NAME " seems to be disabled, can't compile file"); + RETURN_FALSE; + } + + handle.filename = script_name; + handle.free_filename = 0; + handle.opened_path = NULL; + handle.type = ZEND_HANDLE_FILENAME; + + orig_execute_data = EG(current_execute_data); + + zend_try { + op_array = persistent_compile_file(&handle, ZEND_INCLUDE TSRMLS_CC); + } zend_catch { + EG(current_execute_data) = orig_execute_data; + zend_error(E_WARNING, ACCELERATOR_PRODUCT_NAME " could not compile file %s" TSRMLS_CC, handle.filename); + } zend_end_try(); + + if(op_array != NULL) { + destroy_op_array(op_array TSRMLS_CC); + efree(op_array); + RETVAL_TRUE; + } else { + RETVAL_FALSE; + } + zend_destroy_file_handle(&handle TSRMLS_CC); +} From ecbe4af0de94c629fa5ba8ab169654e00c958bad Mon Sep 17 00:00:00 2001 From: ptarjan Date: Thu, 26 Sep 2013 00:18:05 -0700 Subject: [PATCH 163/400] fix many parallel test issues While running these on HHVM I've run into a lot of parallelism issues. I'm backporting all the fixes I had to do in https://github.com/facebook/hiphop-php/blob/master/hphp/tools/import_zend_test.py#L650 to php core. Most of these changes were just filenames that were shared between tests, but I did more surgery on the fixed ports. I can apreciate port 31337 as much as the next nerd, but random ports are better for tests. --- ext/ftp/tests/ftp_fget_basic1.phpt | 4 ++-- ext/ftp/tests/ftp_fget_basic2.phpt | 4 ++-- ext/ftp/tests/ftp_fget_basic3.phpt | 4 ++-- ext/ftp/tests/ftp_nb_fget_basic1.phpt | 4 ++-- ext/ftp/tests/ftp_nb_fget_basic2.phpt | 4 ++-- ext/ftp/tests/ftp_nb_fget_basic3.phpt | 4 ++-- ext/ftp/tests/ftp_nb_get_large.phpt | 4 ++-- .../tests/SplFileObject_getflags_basic.phpt | 6 +++--- .../SplFileObject_getflags_error001.phpt | 6 +++--- .../SplFileObject_getflags_error002.phpt | 6 +++--- .../tests/SplFileObject_rewind_error001.phpt | 6 +++--- .../tests/file/fgets_socket_variation1.phpt | 12 +++++++++--- .../tests/file/fgets_socket_variation2.phpt | 12 +++++++++--- .../file/file_put_contents_variation9.phpt | 8 ++++---- .../tests/file/fread_socket_variation1.phpt | 9 ++++++++- .../tests/general_functions/bug41445_1.phpt | 2 +- .../tests/network/fsockopen_basic.phpt | 10 ++++++++-- .../tests/network/fsockopen_variation1.phpt | 10 ++++++++-- ext/standard/tests/network/shutdown.phpt | 18 +++++++++++++----- .../network/socket_get_status_basic.phpt | 14 +++++++++++--- ext/standard/tests/network/tcp4loop.phpt | 13 ++++++++++--- ext/standard/tests/network/tcp6loop.phpt | 14 +++++++++++--- ext/standard/tests/network/udp6loop.phpt | 14 +++++++++++--- .../streams/stream_set_timeout_error.phpt | 12 +++++++++--- .../tests/strings/vfprintf_basic1.phpt | 2 +- .../tests/strings/vfprintf_basic2.phpt | 2 +- .../tests/strings/vfprintf_basic3.phpt | 2 +- .../tests/strings/vfprintf_basic4.phpt | 2 +- .../tests/strings/vfprintf_basic5.phpt | 2 +- .../tests/strings/vfprintf_basic6.phpt | 2 +- .../tests/strings/vfprintf_basic7.phpt | 2 +- .../tests/strings/vfprintf_basic7_64bit.phpt | 2 +- .../tests/strings/vfprintf_basic8.phpt | 2 +- .../tests/strings/vfprintf_basic9.phpt | 2 +- .../tests/strings/vfprintf_variation10.phpt | Bin 2963 -> 2979 bytes .../tests/strings/vfprintf_variation11.phpt | 2 +- .../strings/vfprintf_variation11_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation12.phpt | 2 +- .../strings/vfprintf_variation12_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation13.phpt | 2 +- .../strings/vfprintf_variation13_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation14.phpt | 2 +- .../strings/vfprintf_variation14_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation15.phpt | 2 +- .../strings/vfprintf_variation15_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation16.phpt | 2 +- .../strings/vfprintf_variation16_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation17.phpt | 2 +- .../tests/strings/vfprintf_variation18.phpt | 2 +- .../tests/strings/vfprintf_variation19.phpt | 2 +- .../strings/vfprintf_variation19_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation20.phpt | 2 +- .../tests/strings/vfprintf_variation21.phpt | 2 +- .../tests/strings/vfprintf_variation3.phpt | 2 +- .../tests/strings/vfprintf_variation4.phpt | 2 +- .../strings/vfprintf_variation4_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation5.phpt | 2 +- .../tests/strings/vfprintf_variation6.phpt | 2 +- .../tests/strings/vfprintf_variation7.phpt | Bin 2391 -> 2406 bytes .../tests/strings/vfprintf_variation8.phpt | 2 +- .../tests/strings/vfprintf_variation9.phpt | Bin 1857 -> 1872 bytes ext/zlib/tests/gzeof_variation1.phpt | 2 +- ext/zlib/tests/gzfile_basic.phpt | 4 ++-- ext/zlib/tests/gzfile_basic2.phpt | 4 ++-- ext/zlib/tests/gzopen_basic2.phpt | 2 +- ext/zlib/tests/gzputs_basic.phpt | 2 +- ext/zlib/tests/gzread_variation1.phpt | 2 +- ext/zlib/tests/gzwrite_basic.phpt | 2 +- ext/zlib/tests/gzwrite_error.phpt | 2 +- ext/zlib/tests/gzwrite_error2.phpt | 2 +- ext/zlib/tests/readgzfile_basic.phpt | 2 +- ext/zlib/tests/readgzfile_basic2.phpt | 2 +- ext/zlib/tests/zlib_wrapper_fflush_basic.phpt | 2 +- .../tests/zlib_wrapper_ftruncate_basic.phpt | 2 +- 74 files changed, 187 insertions(+), 111 deletions(-) diff --git a/ext/ftp/tests/ftp_fget_basic1.phpt b/ext/ftp/tests/ftp_fget_basic1.phpt index 475f7183d2532..5909d35cef608 100644 --- a/ext/ftp/tests/ftp_fget_basic1.phpt +++ b/ext/ftp/tests/ftp_fget_basic1.phpt @@ -16,7 +16,7 @@ ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); ftp_set_option($ftp, FTP_AUTOSEEK, false); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_fget_basic1.txt"; $handle = fopen($local_file, 'w'); var_dump(ftp_fget($ftp, $handle, 'fget.txt', FTP_ASCII, FTP_AUTORESUME)); @@ -24,7 +24,7 @@ var_dump(file_get_contents($local_file)); ?> --CLEAN-- --EXPECT-- bool(true) diff --git a/ext/ftp/tests/ftp_fget_basic2.phpt b/ext/ftp/tests/ftp_fget_basic2.phpt index 00a26752d9150..622cea3683b0d 100644 --- a/ext/ftp/tests/ftp_fget_basic2.phpt +++ b/ext/ftp/tests/ftp_fget_basic2.phpt @@ -15,7 +15,7 @@ $ftp = ftp_connect('127.0.0.1', $port); ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_fget_basic2.txt"; file_put_contents($local_file, 'ASCIIFoo'); $handle = fopen($local_file, 'a'); @@ -24,7 +24,7 @@ var_dump(file_get_contents($local_file)); ?> --CLEAN-- --EXPECT-- bool(true) diff --git a/ext/ftp/tests/ftp_fget_basic3.phpt b/ext/ftp/tests/ftp_fget_basic3.phpt index b7098701ab12e..9485473b1c6a3 100644 --- a/ext/ftp/tests/ftp_fget_basic3.phpt +++ b/ext/ftp/tests/ftp_fget_basic3.phpt @@ -15,7 +15,7 @@ $ftp = ftp_connect('127.0.0.1', $port); ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_fget_basic3.txt"; file_put_contents($local_file, 'ASCIIFoo'); $handle = fopen($local_file, 'a'); @@ -24,7 +24,7 @@ var_dump(file_get_contents($local_file)); ?> --CLEAN-- --EXPECT-- bool(true) diff --git a/ext/ftp/tests/ftp_nb_fget_basic1.phpt b/ext/ftp/tests/ftp_nb_fget_basic1.phpt index cac4eec56bc99..5e6389ff1336a 100644 --- a/ext/ftp/tests/ftp_nb_fget_basic1.phpt +++ b/ext/ftp/tests/ftp_nb_fget_basic1.phpt @@ -16,7 +16,7 @@ ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); ftp_set_option($ftp, FTP_AUTOSEEK, false); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_nb_fget_basic1.txt"; $handle = fopen($local_file, 'w'); var_dump(ftp_nb_fget($ftp, $handle, 'fget.txt', FTP_ASCII, FTP_AUTORESUME)); @@ -24,7 +24,7 @@ var_dump(file_get_contents($local_file)); ?> --CLEAN-- --EXPECT-- int(2) diff --git a/ext/ftp/tests/ftp_nb_fget_basic2.phpt b/ext/ftp/tests/ftp_nb_fget_basic2.phpt index dc92f4e23bc99..215b79ac4a986 100644 --- a/ext/ftp/tests/ftp_nb_fget_basic2.phpt +++ b/ext/ftp/tests/ftp_nb_fget_basic2.phpt @@ -15,7 +15,7 @@ $ftp = ftp_connect('127.0.0.1', $port); ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_nb_fget_basic2.txt"; file_put_contents($local_file, 'ASCIIFoo'); $handle = fopen($local_file, 'a'); @@ -24,7 +24,7 @@ var_dump(file_get_contents($local_file)); ?> --CLEAN-- --EXPECT-- int(2) diff --git a/ext/ftp/tests/ftp_nb_fget_basic3.phpt b/ext/ftp/tests/ftp_nb_fget_basic3.phpt index d1a87c4f3dfe3..66daf2ba0a030 100644 --- a/ext/ftp/tests/ftp_nb_fget_basic3.phpt +++ b/ext/ftp/tests/ftp_nb_fget_basic3.phpt @@ -15,7 +15,7 @@ $ftp = ftp_connect('127.0.0.1', $port); ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_nb_fget_basic3.txt"; file_put_contents($local_file, 'ASCIIFoo'); $handle = fopen($local_file, 'a'); @@ -24,7 +24,7 @@ var_dump(file_get_contents($local_file)); ?> --CLEAN-- --EXPECT-- int(2) diff --git a/ext/ftp/tests/ftp_nb_get_large.phpt b/ext/ftp/tests/ftp_nb_get_large.phpt index 3fbf2a4831d14..0c354d7c1978f 100644 --- a/ext/ftp/tests/ftp_nb_get_large.phpt +++ b/ext/ftp/tests/ftp_nb_get_large.phpt @@ -18,7 +18,7 @@ $ftp = ftp_connect('127.0.0.1', $port); ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_nb_get_large.txt"; touch($local_file); ftp_nb_get($ftp, $local_file, 'fget_large.txt', FTP_BINARY, 5368709119); $fp = fopen($local_file, 'r'); @@ -29,7 +29,7 @@ fclose($fp); ?> --CLEAN-- --EXPECT-- string(1) "X" diff --git a/ext/spl/tests/SplFileObject_getflags_basic.phpt b/ext/spl/tests/SplFileObject_getflags_basic.phpt index 5addadf38046e..88cf6861a2921 100644 --- a/ext/spl/tests/SplFileObject_getflags_basic.phpt +++ b/ext/spl/tests/SplFileObject_getflags_basic.phpt @@ -7,16 +7,16 @@ Erwin Poeze --FILE-- setFlags(SplFileObject::DROP_NEW_LINE); var_dump($fo->getFlags()); ?> --CLEAN-- --EXPECT-- int(1) diff --git a/ext/spl/tests/SplFileObject_getflags_error001.phpt b/ext/spl/tests/SplFileObject_getflags_error001.phpt index 1602f88885e11..ca53c857e7e6b 100644 --- a/ext/spl/tests/SplFileObject_getflags_error001.phpt +++ b/ext/spl/tests/SplFileObject_getflags_error001.phpt @@ -7,10 +7,10 @@ Erwin Poeze --FILE-- setFlags(SplFileObject::READ_CSV); $fo->setFlags(SplFileObject::DROP_NEW_LINE); @@ -20,7 +20,7 @@ var_dump($fo->getFlags()); ?> --CLEAN-- --EXPECT-- int(1) diff --git a/ext/spl/tests/SplFileObject_getflags_error002.phpt b/ext/spl/tests/SplFileObject_getflags_error002.phpt index e2c8255f44960..00fd351db8cca 100644 --- a/ext/spl/tests/SplFileObject_getflags_error002.phpt +++ b/ext/spl/tests/SplFileObject_getflags_error002.phpt @@ -5,9 +5,9 @@ Erwin Poeze --FILE-- setFlags(SplFileObject::READ_CSV); $fo->getFlags('fake'); @@ -15,7 +15,7 @@ $fo->getFlags('fake'); ?> --CLEAN-- --EXPECTF-- Warning: SplFileObject::getFlags() expects exactly 0 parameters, 1 given in %s on line %d diff --git a/ext/spl/tests/SplFileObject_rewind_error001.phpt b/ext/spl/tests/SplFileObject_rewind_error001.phpt index ac536a0a44af5..5f2379aa13911 100644 --- a/ext/spl/tests/SplFileObject_rewind_error001.phpt +++ b/ext/spl/tests/SplFileObject_rewind_error001.phpt @@ -7,16 +7,16 @@ Erwin Poeze --FILE-- rewind( "invalid" ); ?> --CLEAN-- --EXPECTF-- Warning: SplFileObject::rewind() expects exactly 0 parameters, 1 given in %s on line %d diff --git a/ext/standard/tests/file/fgets_socket_variation1.phpt b/ext/standard/tests/file/fgets_socket_variation1.phpt index 57944d8b563c1..429ad67d69677 100644 --- a/ext/standard/tests/file/fgets_socket_variation1.phpt +++ b/ext/standard/tests/file/fgets_socket_variation1.phpt @@ -5,11 +5,17 @@ Dave Kelsey --FILE-- --FILE-- --EXPECTF-- diff --git a/ext/standard/tests/network/tcp4loop.phpt b/ext/standard/tests/network/tcp4loop.phpt index afd955918e8fb..a163cd9b35816 100644 --- a/ext/standard/tests/network/tcp4loop.phpt +++ b/ext/standard/tests/network/tcp4loop.phpt @@ -2,14 +2,21 @@ Streams Based IPv4 TCP Loopback test --FILE-- --FILE-- --FILE-- P%01CC;505bXoQ~&?~ diff --git a/ext/standard/tests/strings/vfprintf_variation11.phpt b/ext/standard/tests/strings/vfprintf_variation11.phpt index 45f1f61fa63f6..4bc38851d271e 100644 --- a/ext/standard/tests/strings/vfprintf_variation11.phpt +++ b/ext/standard/tests/strings/vfprintf_variation11.phpt @@ -45,7 +45,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation11.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation11_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation11_64bit.phpt index d6549846b5a55..a55297999ee45 100644 --- a/ext/standard/tests/strings/vfprintf_variation11_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation11_64bit.phpt @@ -45,7 +45,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation11_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation12.phpt b/ext/standard/tests/strings/vfprintf_variation12.phpt index e95fd5bb7f972..f0fa354ea639a 100644 --- a/ext/standard/tests/strings/vfprintf_variation12.phpt +++ b/ext/standard/tests/strings/vfprintf_variation12.phpt @@ -68,7 +68,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation12.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation12_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation12_64bit.phpt index a1e57bc42c7ab..fe786d3f495d2 100644 --- a/ext/standard/tests/strings/vfprintf_variation12_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation12_64bit.phpt @@ -68,7 +68,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation12_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation13.phpt b/ext/standard/tests/strings/vfprintf_variation13.phpt index 245feb5a2388a..fd3424242458b 100644 --- a/ext/standard/tests/strings/vfprintf_variation13.phpt +++ b/ext/standard/tests/strings/vfprintf_variation13.phpt @@ -45,7 +45,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation13.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation13_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation13_64bit.phpt index bf6fcb5ec0005..68baed853745e 100644 --- a/ext/standard/tests/strings/vfprintf_variation13_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation13_64bit.phpt @@ -45,7 +45,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation13_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation14.phpt b/ext/standard/tests/strings/vfprintf_variation14.phpt index c714d89758cdb..0173a27fb7071 100644 --- a/ext/standard/tests/strings/vfprintf_variation14.phpt +++ b/ext/standard/tests/strings/vfprintf_variation14.phpt @@ -68,7 +68,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation14.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation14_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation14_64bit.phpt index 930ee3d03de83..fb34befd3ccc5 100644 --- a/ext/standard/tests/strings/vfprintf_variation14_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation14_64bit.phpt @@ -68,7 +68,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation14_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation15.phpt b/ext/standard/tests/strings/vfprintf_variation15.phpt index 95667b5a81895..19e319a557d8b 100644 --- a/ext/standard/tests/strings/vfprintf_variation15.phpt +++ b/ext/standard/tests/strings/vfprintf_variation15.phpt @@ -38,7 +38,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation15.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation15_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation15_64bit.phpt index d2e331c2d3b4a..7bb0d150e01e6 100644 --- a/ext/standard/tests/strings/vfprintf_variation15_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation15_64bit.phpt @@ -38,7 +38,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation15_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation16.phpt b/ext/standard/tests/strings/vfprintf_variation16.phpt index 21630521b8dc1..4995ab02a4243 100644 --- a/ext/standard/tests/strings/vfprintf_variation16.phpt +++ b/ext/standard/tests/strings/vfprintf_variation16.phpt @@ -61,7 +61,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation16.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation16_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation16_64bit.phpt index 381e67c3397a9..16d0624018066 100644 --- a/ext/standard/tests/strings/vfprintf_variation16_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation16_64bit.phpt @@ -61,7 +61,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation16_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation17.phpt b/ext/standard/tests/strings/vfprintf_variation17.phpt index 871ae98d857e6..6c17b801f6f23 100644 --- a/ext/standard/tests/strings/vfprintf_variation17.phpt +++ b/ext/standard/tests/strings/vfprintf_variation17.phpt @@ -34,7 +34,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation17.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation18.phpt b/ext/standard/tests/strings/vfprintf_variation18.phpt index 76168621c3a51..5467753dc0a3e 100644 --- a/ext/standard/tests/strings/vfprintf_variation18.phpt +++ b/ext/standard/tests/strings/vfprintf_variation18.phpt @@ -57,7 +57,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation18.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation19.phpt b/ext/standard/tests/strings/vfprintf_variation19.phpt index 7ee01a97e16d0..26c21e1e3c0c3 100644 --- a/ext/standard/tests/strings/vfprintf_variation19.phpt +++ b/ext/standard/tests/strings/vfprintf_variation19.phpt @@ -46,7 +46,7 @@ $args_array = array( /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation19.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation19_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation19_64bit.phpt index 58810a811aa8c..a56357cfdf58d 100644 --- a/ext/standard/tests/strings/vfprintf_variation19_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation19_64bit.phpt @@ -46,7 +46,7 @@ $args_array = array( /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation19_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation20.phpt b/ext/standard/tests/strings/vfprintf_variation20.phpt index cd348d8350c35..48fea341edd31 100644 --- a/ext/standard/tests/strings/vfprintf_variation20.phpt +++ b/ext/standard/tests/strings/vfprintf_variation20.phpt @@ -84,7 +84,7 @@ $values = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation20.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation21.phpt b/ext/standard/tests/strings/vfprintf_variation21.phpt index 4dc9ed5666d4a..09bf703957ef1 100644 --- a/ext/standard/tests/strings/vfprintf_variation21.phpt +++ b/ext/standard/tests/strings/vfprintf_variation21.phpt @@ -81,7 +81,7 @@ $values = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation21.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation3.phpt b/ext/standard/tests/strings/vfprintf_variation3.phpt index 02535cefb659c..1ae945990cc82 100644 --- a/ext/standard/tests/strings/vfprintf_variation3.phpt +++ b/ext/standard/tests/strings/vfprintf_variation3.phpt @@ -45,7 +45,7 @@ $args_array = array( // and with int values from the above $args_array array /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation3.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation4.phpt b/ext/standard/tests/strings/vfprintf_variation4.phpt index 72ca9fe3b9f0a..642f35c46a704 100644 --- a/ext/standard/tests/strings/vfprintf_variation4.phpt +++ b/ext/standard/tests/strings/vfprintf_variation4.phpt @@ -62,7 +62,7 @@ $args_array = array( /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation4.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation4_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation4_64bit.phpt index f7038ff76c256..6bf814003a3d6 100644 --- a/ext/standard/tests/strings/vfprintf_variation4_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation4_64bit.phpt @@ -62,7 +62,7 @@ $args_array = array( /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation4_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation5.phpt b/ext/standard/tests/strings/vfprintf_variation5.phpt index 4bac1ebe57a00..eb3646ca1f3af 100644 --- a/ext/standard/tests/strings/vfprintf_variation5.phpt +++ b/ext/standard/tests/strings/vfprintf_variation5.phpt @@ -42,7 +42,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation5.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation6.phpt b/ext/standard/tests/strings/vfprintf_variation6.phpt index 6b5425d5cff1e..b5b82bbc62b06 100644 --- a/ext/standard/tests/strings/vfprintf_variation6.phpt +++ b/ext/standard/tests/strings/vfprintf_variation6.phpt @@ -57,7 +57,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation6.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation7.phpt b/ext/standard/tests/strings/vfprintf_variation7.phpt index a206fd869113e4a6b21861ea638b51cb2b2831bc..ee836edc774c84a9cd9f83a9b3df8801d98126e8 100644 GIT binary patch delta 32 ncmcaE^h{_22b*wNT0v1}UP)SfSz=LUVo7Fxp7~}THg9GC%$p0C delta 17 YcmaDRbX{lz2OCRDX>P%0X*O?W068NCd;kCd diff --git a/ext/standard/tests/strings/vfprintf_variation8.phpt b/ext/standard/tests/strings/vfprintf_variation8.phpt index cda05c4d79842..a72e260e09bd6 100644 --- a/ext/standard/tests/strings/vfprintf_variation8.phpt +++ b/ext/standard/tests/strings/vfprintf_variation8.phpt @@ -60,7 +60,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation8.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation9.phpt b/ext/standard/tests/strings/vfprintf_variation9.phpt index d10c8aed506e5ccf781091912c459c6fdd7ae235..dd3093c8c9e981b6494d2e7e8cdd2fc534b0a494 100644 GIT binary patch delta 32 ncmX@ecY$w1FpF?mT0v1}UP)SfSz=LUVo7Fxp5^9nmRC#w(0dG) delta 17 Ycmcb>caU#GFbhjcX>P&hG?rIP06V+}cmMzZ diff --git a/ext/zlib/tests/gzeof_variation1.phpt b/ext/zlib/tests/gzeof_variation1.phpt index 6d1e0401dff1c..77a1eccb66bb3 100644 --- a/ext/zlib/tests/gzeof_variation1.phpt +++ b/ext/zlib/tests/gzeof_variation1.phpt @@ -9,7 +9,7 @@ if (!extension_loaded("zlib")) { --FILE-- string(17) "for all languages" } -===DONE=== \ No newline at end of file +===DONE=== diff --git a/ext/zlib/tests/gzfile_basic2.phpt b/ext/zlib/tests/gzfile_basic2.phpt index 9f31eb0f87380..2bbf315a1ad71 100644 --- a/ext/zlib/tests/gzfile_basic2.phpt +++ b/ext/zlib/tests/gzfile_basic2.phpt @@ -12,7 +12,7 @@ is a very common test for all languages EOT; $dirname = 'gzfile_temp'; -$filename = $dirname.'/plainfile.txt'; +$filename = $dirname.'/gzfile_basic2.txt'; mkdir($dirname); $h = fopen($filename, 'w'); fwrite($h, $plaintxt); @@ -36,4 +36,4 @@ array(3) { [2]=> string(17) "for all languages" } -===DONE=== \ No newline at end of file +===DONE=== diff --git a/ext/zlib/tests/gzopen_basic2.phpt b/ext/zlib/tests/gzopen_basic2.phpt index 5cc02cd182267..90766b18170cf 100644 --- a/ext/zlib/tests/gzopen_basic2.phpt +++ b/ext/zlib/tests/gzopen_basic2.phpt @@ -18,7 +18,7 @@ echo "*** Testing gzopen() : basic functionality ***\n"; // Initialise all required variables -$filename = "temp.txt.gz"; +$filename = "gzopen_basic2.txt.gz"; $modes = array('w', 'w+'); $data = "This was the information that was written"; diff --git a/ext/zlib/tests/gzputs_basic.phpt b/ext/zlib/tests/gzputs_basic.phpt index 7566e74e72393..6456e4b55f96c 100644 --- a/ext/zlib/tests/gzputs_basic.phpt +++ b/ext/zlib/tests/gzputs_basic.phpt @@ -9,7 +9,7 @@ if (!extension_loaded("zlib")) { --FILE-- --FILE-- Date: Thu, 26 Sep 2013 01:06:36 -0700 Subject: [PATCH 164/400] fix missing change from 'tcp_socket' to the more common 'server' --- ext/standard/tests/file/fread_socket_variation1.phpt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/standard/tests/file/fread_socket_variation1.phpt b/ext/standard/tests/file/fread_socket_variation1.phpt index f5086ced09122..d65565d3cc11a 100644 --- a/ext/standard/tests/file/fread_socket_variation1.phpt +++ b/ext/standard/tests/file/fread_socket_variation1.phpt @@ -12,11 +12,11 @@ for ($i=0; $i<100; $i++) { } } -socket_set_timeout($tcp_socket, 0, 1000); +socket_set_timeout($server, 0, 1000); -var_dump(fread($tcp_socket, 1)); +var_dump(fread($server, 1)); -fclose($tcp_socket); +fclose($server); ?> --EXPECT-- From 0d7a6388663b76ebed6585ac92dfca5ef65fa7af Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 26 Sep 2013 18:39:17 +0200 Subject: [PATCH 165/400] Implement variadic function syntax As per RFC: https://wiki.php.net/rfc/variadics --- NEWS | 2 + UPGRADING | 6 +- UPGRADING.INTERNALS | 42 + .../adding_additional_optional_parameter.phpt | 17 + ...g_additional_optional_parameter_error.phpt | 16 + Zend/tests/variadic/basic.phpt | 57 + Zend/tests/variadic/by_ref.phpt | 24 + Zend/tests/variadic/by_ref_error.phpt | 12 + Zend/tests/variadic/no_default_error.phpt | 10 + ...on_variadic_implements_variadic_error.phpt | 16 + Zend/tests/variadic/only_last_error.phpt | 10 + Zend/tests/variadic/optional_params.phpt | 49 + .../variadic/removing_parameter_error.phpt | 20 + Zend/tests/variadic/typehint_error.phpt | 36 + .../variadic/typehint_suppressed_error.phpt | 33 + .../variadic_changed_byref_error.phpt | 16 + .../variadic_changed_typehint_error.phpt | 16 + .../variadic_implements_non_variadic.phpt | 17 + Zend/zend_API.c | 10 +- Zend/zend_API.h | 20 +- Zend/zend_compile.c | 96 +- Zend/zend_compile.h | 29 +- Zend/zend_execute.c | 11 +- Zend/zend_language_parser.y | 25 +- Zend/zend_language_scanner.c | 4360 +++++++++-------- Zend/zend_language_scanner.l | 5 +- Zend/zend_vm_def.h | 31 + Zend/zend_vm_execute.h | 56 + Zend/zend_vm_opcodes.h | 1 + ext/mbstring/mbstring.c | 4 +- ext/mysqli/mysqli_fe.c | 15 +- ext/opcache/Optimizer/block_pass.c | 4 +- ext/pdo/pdo_dbh.c | 10 +- ext/reflection/php_reflection.c | 33 +- .../ReflectionFunction_isVariadic_basic.phpt | 18 + ...eflectionParameter_canBePassedByValue.phpt | 4 + .../ReflectionParameter_isVariadic_basic.phpt | 24 + .../ReflectionParameter_toString_basic.phpt | 3 +- ext/spl/spl_directory.c | 3 +- ext/spl/tests/bug51532.phpt | 2 +- ext/sqlite3/sqlite3.c | 2 +- ext/standard/basic_functions.c | 15 +- ext/tokenizer/tokenizer_data.c | 6 +- 43 files changed, 2908 insertions(+), 2278 deletions(-) create mode 100644 Zend/tests/variadic/adding_additional_optional_parameter.phpt create mode 100644 Zend/tests/variadic/adding_additional_optional_parameter_error.phpt create mode 100644 Zend/tests/variadic/basic.phpt create mode 100644 Zend/tests/variadic/by_ref.phpt create mode 100644 Zend/tests/variadic/by_ref_error.phpt create mode 100644 Zend/tests/variadic/no_default_error.phpt create mode 100644 Zend/tests/variadic/non_variadic_implements_variadic_error.phpt create mode 100644 Zend/tests/variadic/only_last_error.phpt create mode 100644 Zend/tests/variadic/optional_params.phpt create mode 100644 Zend/tests/variadic/removing_parameter_error.phpt create mode 100644 Zend/tests/variadic/typehint_error.phpt create mode 100644 Zend/tests/variadic/typehint_suppressed_error.phpt create mode 100644 Zend/tests/variadic/variadic_changed_byref_error.phpt create mode 100644 Zend/tests/variadic/variadic_changed_typehint_error.phpt create mode 100644 Zend/tests/variadic/variadic_implements_non_variadic.phpt create mode 100644 ext/reflection/tests/ReflectionFunction_isVariadic_basic.phpt create mode 100644 ext/reflection/tests/ReflectionParameter_isVariadic_basic.phpt diff --git a/NEWS b/NEWS index 540f896fe4c68..95acaa66692f7 100644 --- a/NEWS +++ b/NEWS @@ -14,6 +14,8 @@ PHP NEWS . Reduced POST data memory usage by 200-300%. Removed INI setting always_populate_raw_post_data and the $HTTP_RAW_POST_DATA global variable. (Mike) + . Implemented dedicated syntax for variadic functions + (RFC: https://wiki.php.net/rfc/variadics). (Nikita) - cURL: . Implemented FR #65646 (re-enable CURLOPT_FOLLOWLOCATION with open_basedir diff --git a/UPGRADING b/UPGRADING index 581a38e2ad2ec..87b9eefeedb52 100755 --- a/UPGRADING +++ b/UPGRADING @@ -34,8 +34,10 @@ PHP X.Y UPGRADE NOTES 2. New Features ======================================== -- Core: - The php://input stream is now re-usable and can be used concurrently with +- Added dedicated syntax for variadic functions. + (https://wiki.php.net/rfc/variadics) + +- The php://input stream is now re-usable and can be used concurrently with enable_post_data_reading=0. ======================================== diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index 90202f00f03ca..d1aca29dc4533 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -6,6 +6,7 @@ UPGRADE NOTES - PHP X.Y a. Addition of do_operation and compare object handlers b. return_value_ptr now always available, RETVAL_ZVAL_FAST macros c. POST data handling + d. Arginfo changes 2. Build system changes a. Unix build system changes @@ -68,6 +69,47 @@ UPGRADE NOTES - PHP X.Y The recommended way to access raw POST data is to open and use a php://input stream wrapper. It is safe to be used concurrently and more than once. + d. Arginfo changes + + The pass_rest_by_reference argument of the ZEND_BEGIN_ARG_INFO and + ZEND_BEGIN_ARG_INFO_EX() is no longer used. The value passed to it is ignored. + + Instead a variadic argument is created using ZEND_ARG_VARIADIC_INFO(): + + ZEND_ARG_VARIADIC_INFO(0, name) /* pass rest by value */ + ZEND_ARG_VARIADIC_INFO(1, name) /* pass rest by reference */ + ZEND_ARG_VARIADIC_INFO(ZEND_SEND_PREFER_REF, name) + /* pass rest by prefer-ref */ + + ZEND_ARG_VARIADIC_INFO() should only be used for the last argument. + + The following changes were applied to the zend_arg_info struct: + + typedef struct _zend_arg_info { + const char *class_name; + zend_uint class_name_len; + zend_uchar type_hint; + + zend_uchar pass_by_reference; + zend_bool allow_null; + - zend_bool pass_by_reference; + + zend_bool is_variadic; + } zend_arg_info; + + The following changes were applied to the zend_internal_function_info struct: + + typedef struct _zend_internal_function_info { + zend_uint required_num_args; + zend_uchar _type_hint; + zend_bool return_reference; + - zend_bool pass_rest_by_reference; + + zend_bool _allow_null; + + zend_bool _is_variadic; + } zend_internal_function_info; + + The CHECK_ARG_SEND_TYPE(), ARG_MUST_BE_SENT_BY_REF(), + ARG_SHOULD_BE_SENT_BY_REF() and ARG_MAY_BE_SENT_BY_REF() macros now assume + that the argument passed to them is a zend_function* and that it is non-NULL. + ======================== 2. Build system changes ======================== diff --git a/Zend/tests/variadic/adding_additional_optional_parameter.phpt b/Zend/tests/variadic/adding_additional_optional_parameter.phpt new file mode 100644 index 0000000000000..b4e797803dcf2 --- /dev/null +++ b/Zend/tests/variadic/adding_additional_optional_parameter.phpt @@ -0,0 +1,17 @@ +--TEST-- +It's possible to add additional optional arguments with matching signature +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/tests/variadic/adding_additional_optional_parameter_error.phpt b/Zend/tests/variadic/adding_additional_optional_parameter_error.phpt new file mode 100644 index 0000000000000..2f31d47dc6969 --- /dev/null +++ b/Zend/tests/variadic/adding_additional_optional_parameter_error.phpt @@ -0,0 +1,16 @@ +--TEST-- +Additional optional parameters must have a matching prototype +--FILE-- + +--EXPECTF-- +Fatal error: Declaration of MySQL::query() must be compatible with DB::query($query, string ...$params) in %s on line %d diff --git a/Zend/tests/variadic/basic.phpt b/Zend/tests/variadic/basic.phpt new file mode 100644 index 0000000000000..810d4756aa087 --- /dev/null +++ b/Zend/tests/variadic/basic.phpt @@ -0,0 +1,57 @@ +--TEST-- +Basic variadic function +--FILE-- + +--EXPECT-- +array(0) { +} +array(1) { + [0]=> + int(1) +} +array(3) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) +} +int(1) +int(2) +array(0) { +} +int(1) +int(2) +array(1) { + [0]=> + int(3) +} +int(1) +int(2) +array(3) { + [0]=> + int(3) + [1]=> + int(4) + [2]=> + int(5) +} diff --git a/Zend/tests/variadic/by_ref.phpt b/Zend/tests/variadic/by_ref.phpt new file mode 100644 index 0000000000000..e1635f4ecf20a --- /dev/null +++ b/Zend/tests/variadic/by_ref.phpt @@ -0,0 +1,24 @@ +--TEST-- +Variadic arguments with by-reference passing +--FILE-- + +--EXPECT-- +int(0) +int(0) +int(1) +int(2) diff --git a/Zend/tests/variadic/by_ref_error.phpt b/Zend/tests/variadic/by_ref_error.phpt new file mode 100644 index 0000000000000..7f21014146406 --- /dev/null +++ b/Zend/tests/variadic/by_ref_error.phpt @@ -0,0 +1,12 @@ +--TEST-- +By-ref variadics enforce the reference +--FILE-- + +--EXPECTF-- +Fatal error: Only variables can be passed by reference in %s on line %d diff --git a/Zend/tests/variadic/no_default_error.phpt b/Zend/tests/variadic/no_default_error.phpt new file mode 100644 index 0000000000000..427ebed0289a9 --- /dev/null +++ b/Zend/tests/variadic/no_default_error.phpt @@ -0,0 +1,10 @@ +--TEST-- +Variadic argument cannot have a default value +--FILE-- + +--EXPECTF-- +Fatal error: Variadic parameter cannot have a default value in %s on line %d diff --git a/Zend/tests/variadic/non_variadic_implements_variadic_error.phpt b/Zend/tests/variadic/non_variadic_implements_variadic_error.phpt new file mode 100644 index 0000000000000..f447837ca4afb --- /dev/null +++ b/Zend/tests/variadic/non_variadic_implements_variadic_error.phpt @@ -0,0 +1,16 @@ +--TEST-- +It's not possible to turn a variadic function into a non-variadic one +--FILE-- + +--EXPECTF-- +Fatal error: Declaration of MySQL::query() must be compatible with DB::query($query, ...$params) in %s on line %d diff --git a/Zend/tests/variadic/only_last_error.phpt b/Zend/tests/variadic/only_last_error.phpt new file mode 100644 index 0000000000000..ee6ff3f777c46 --- /dev/null +++ b/Zend/tests/variadic/only_last_error.phpt @@ -0,0 +1,10 @@ +--TEST-- +Only the last argument can be variadic +--FILE-- + +--EXPECTF-- +Fatal error: Only the last parameter can be variadic in %s on line %d diff --git a/Zend/tests/variadic/optional_params.phpt b/Zend/tests/variadic/optional_params.phpt new file mode 100644 index 0000000000000..ba965e538c4f9 --- /dev/null +++ b/Zend/tests/variadic/optional_params.phpt @@ -0,0 +1,49 @@ +--TEST-- +Optional parameter before variadic parameter +--FILE-- + +--EXPECT-- +int(1) +NULL +array(0) { +} +int(1) +int(2) +array(0) { +} +int(1) +int(2) +array(1) { + [0]=> + int(3) +} +int(1) +int(2) +array(2) { + [0]=> + int(3) + [1]=> + int(4) +} +int(1) +int(2) +array(3) { + [0]=> + int(3) + [1]=> + int(4) + [2]=> + int(5) +} diff --git a/Zend/tests/variadic/removing_parameter_error.phpt b/Zend/tests/variadic/removing_parameter_error.phpt new file mode 100644 index 0000000000000..a189e5cf094b7 --- /dev/null +++ b/Zend/tests/variadic/removing_parameter_error.phpt @@ -0,0 +1,20 @@ +--TEST-- +It's not possible to remove required parameter before a variadic parameter +--FILE-- + +--EXPECTF-- +Fatal error: Declaration of MySQL::query() must be compatible with DB::query($query, ...$params) in %s on line %d diff --git a/Zend/tests/variadic/typehint_error.phpt b/Zend/tests/variadic/typehint_error.phpt new file mode 100644 index 0000000000000..3006b999576c6 --- /dev/null +++ b/Zend/tests/variadic/typehint_error.phpt @@ -0,0 +1,36 @@ +--TEST-- +Variadic arguments enforce typehints +--FILE-- + +--EXPECTF-- +array(0) { +} +array(3) { + [0]=> + array(1) { + [0]=> + int(0) + } + [1]=> + array(1) { + [0]=> + int(1) + } + [2]=> + array(1) { + [0]=> + int(2) + } +} + +Catchable fatal error: Argument 3 passed to test() must be of the type array, integer given, called in %s on line %d diff --git a/Zend/tests/variadic/typehint_suppressed_error.phpt b/Zend/tests/variadic/typehint_suppressed_error.phpt new file mode 100644 index 0000000000000..5048e1c1bb5ab --- /dev/null +++ b/Zend/tests/variadic/typehint_suppressed_error.phpt @@ -0,0 +1,33 @@ +--TEST-- +Error suppression for typehints on variadic arguments works +--FILE-- + +--EXPECTF-- +string(%d) "Argument 3 passed to test() must be of the type array, integer given, called in %s on line %d and defined" +array(3) { + [0]=> + array(1) { + [0]=> + int(0) + } + [1]=> + array(1) { + [0]=> + int(1) + } + [2]=> + int(2) +} diff --git a/Zend/tests/variadic/variadic_changed_byref_error.phpt b/Zend/tests/variadic/variadic_changed_byref_error.phpt new file mode 100644 index 0000000000000..14fb6ae5eb0d9 --- /dev/null +++ b/Zend/tests/variadic/variadic_changed_byref_error.phpt @@ -0,0 +1,16 @@ +--TEST-- +Variadic arguments must have compatible passing modes +--FILE-- + +--EXPECTF-- +Fatal error: Declaration of MySQL::query() must be compatible with DB::query($query, &...$params) in %s on line %d diff --git a/Zend/tests/variadic/variadic_changed_typehint_error.phpt b/Zend/tests/variadic/variadic_changed_typehint_error.phpt new file mode 100644 index 0000000000000..00df33a0424a4 --- /dev/null +++ b/Zend/tests/variadic/variadic_changed_typehint_error.phpt @@ -0,0 +1,16 @@ +--TEST-- +Typehints for variadic arguments have to be compatible +--FILE-- + +--EXPECTF-- +Fatal error: Declaration of MySQL::query() must be compatible with DB::query($query, string ...$params) in %s on line %d diff --git a/Zend/tests/variadic/variadic_implements_non_variadic.phpt b/Zend/tests/variadic/variadic_implements_non_variadic.phpt new file mode 100644 index 0000000000000..a66ec280b8626 --- /dev/null +++ b/Zend/tests/variadic/variadic_implements_non_variadic.phpt @@ -0,0 +1,17 @@ +--TEST-- +A non-variadic function can be turned into a variadic one +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 6241df1cad39b..5fa7fb908e500 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -2090,16 +2090,12 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio } else { internal_function->required_num_args = info->required_num_args; } - if (info->pass_rest_by_reference) { - if (info->pass_rest_by_reference == ZEND_SEND_PREFER_REF) { - internal_function->fn_flags |= ZEND_ACC_PASS_REST_PREFER_REF; - } else { - internal_function->fn_flags |= ZEND_ACC_PASS_REST_BY_REFERENCE; - } - } if (info->return_reference) { internal_function->fn_flags |= ZEND_ACC_RETURN_REFERENCE; } + if (ptr->arg_info[ptr->num_args].is_variadic) { + internal_function->fn_flags |= ZEND_ACC_VARIADIC; + } } else { internal_function->arg_info = NULL; internal_function->num_args = 0; diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 16e766d8a51ea..007d9896092be 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -98,16 +98,18 @@ typedef struct _zend_fcall_info_cache { #define ZEND_FE_END { NULL, NULL, NULL, 0, 0 } -#define ZEND_ARG_INFO(pass_by_ref, name) { #name, sizeof(#name)-1, NULL, 0, 0, 0, pass_by_ref}, -#define ZEND_ARG_PASS_INFO(pass_by_ref) { NULL, 0, NULL, 0, 0, 0, pass_by_ref}, -#define ZEND_ARG_OBJ_INFO(pass_by_ref, name, classname, allow_null) { #name, sizeof(#name)-1, #classname, sizeof(#classname)-1, IS_OBJECT, allow_null, pass_by_ref}, -#define ZEND_ARG_ARRAY_INFO(pass_by_ref, name, allow_null) { #name, sizeof(#name)-1, NULL, 0, IS_ARRAY, allow_null, pass_by_ref}, -#define ZEND_ARG_TYPE_INFO(pass_by_ref, name, type_hint, allow_null) { #name, sizeof(#name)-1, NULL, 0, type_hint, allow_null, pass_by_ref}, -#define ZEND_BEGIN_ARG_INFO_EX(name, pass_rest_by_reference, return_reference, required_num_args) \ +#define ZEND_ARG_INFO(pass_by_ref, name) { #name, sizeof(#name)-1, NULL, 0, 0, pass_by_ref, 0, 0 }, +#define ZEND_ARG_PASS_INFO(pass_by_ref) { NULL, 0, NULL, 0, 0, pass_by_ref, 0, 0 }, +#define ZEND_ARG_OBJ_INFO(pass_by_ref, name, classname, allow_null) { #name, sizeof(#name)-1, #classname, sizeof(#classname)-1, IS_OBJECT, pass_by_ref, allow_null, 0 }, +#define ZEND_ARG_ARRAY_INFO(pass_by_ref, name, allow_null) { #name, sizeof(#name)-1, NULL, 0, IS_ARRAY, pass_by_ref, allow_null, 0 }, +#define ZEND_ARG_TYPE_INFO(pass_by_ref, name, type_hint, allow_null) { #name, sizeof(#name)-1, NULL, 0, type_hint, pass_by_ref, allow_null, 0 }, +#define ZEND_ARG_VARIADIC_INFO(pass_by_ref, name) { #name, sizeof(#name)-1, NULL, 0, 0, pass_by_ref, 0, 1 }, + +#define ZEND_BEGIN_ARG_INFO_EX(name, _unused, return_reference, required_num_args) \ static const zend_arg_info name[] = { \ - { NULL, 0, NULL, required_num_args, 0, return_reference, pass_rest_by_reference}, -#define ZEND_BEGIN_ARG_INFO(name, pass_rest_by_reference) \ - ZEND_BEGIN_ARG_INFO_EX(name, pass_rest_by_reference, ZEND_RETURN_VALUE, -1) + { NULL, 0, NULL, required_num_args, 0, return_reference, 0, 0 }, +#define ZEND_BEGIN_ARG_INFO(name, _unused) \ + ZEND_BEGIN_ARG_INFO_EX(name, 0, ZEND_RETURN_VALUE, -1) #define ZEND_END_ARG_INFO() }; /* Name macros */ diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 672f62b7eefa3..90ff26297ae16 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1822,7 +1822,7 @@ void zend_do_end_function_declaration(const znode *function_token TSRMLS_DC) /* } /* }}} */ -void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, const znode *initialization, znode *class_type, zend_uchar pass_by_reference TSRMLS_DC) /* {{{ */ +void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, const znode *initialization, znode *class_type, zend_uchar pass_by_reference, zend_bool is_variadic TSRMLS_DC) /* {{{ */ { zend_op *opline; zend_arg_info *cur_arg_info; @@ -1846,6 +1846,19 @@ void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, con } } + if (CG(active_op_array)->fn_flags & ZEND_ACC_VARIADIC) { + zend_error(E_COMPILE_ERROR, "Only the last parameter can be variadic"); + } + + if (is_variadic) { + if (op == ZEND_RECV_INIT) { + zend_error(E_COMPILE_ERROR, "Variadic parameter cannot have a default value"); + } + + op = ZEND_RECV_VARIADIC; + CG(active_op_array)->fn_flags |= ZEND_ACC_VARIADIC; + } + opline = get_next_op(CG(active_op_array) TSRMLS_CC); CG(active_op_array)->num_args++; opline->opcode = op; @@ -1854,16 +1867,19 @@ void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, con if (op == ZEND_RECV_INIT) { SET_NODE(opline->op2, initialization); } else { - CG(active_op_array)->required_num_args = CG(active_op_array)->num_args; SET_UNUSED(opline->op2); + if (!is_variadic) { + CG(active_op_array)->required_num_args = CG(active_op_array)->num_args; + } } CG(active_op_array)->arg_info = erealloc(CG(active_op_array)->arg_info, sizeof(zend_arg_info)*(CG(active_op_array)->num_args)); cur_arg_info = &CG(active_op_array)->arg_info[CG(active_op_array)->num_args-1]; cur_arg_info->name = zend_new_interned_string(estrndup(Z_STRVAL(varname->u.constant), Z_STRLEN(varname->u.constant)), Z_STRLEN(varname->u.constant) + 1, 1 TSRMLS_CC); cur_arg_info->name_len = Z_STRLEN(varname->u.constant); cur_arg_info->type_hint = 0; - cur_arg_info->allow_null = 1; cur_arg_info->pass_by_reference = pass_by_reference; + cur_arg_info->allow_null = 1; + cur_arg_info->is_variadic = is_variadic; cur_arg_info->class_name = NULL; cur_arg_info->class_name_len = 0; @@ -3083,7 +3099,7 @@ static void do_inherit_method(zend_function *function) /* {{{ */ static zend_bool zend_do_perform_implementation_check(const zend_function *fe, const zend_function *proto TSRMLS_DC) /* {{{ */ { - zend_uint i; + zend_uint i, num_args; /* If it's a user function then arg_info == NULL means we don't have any parameters but * we still need to do the arg number checks. We are only willing to ignore this for internal @@ -3113,48 +3129,66 @@ static zend_bool zend_do_perform_implementation_check(const zend_function *fe, c return 0; } - if (fe->common.type != ZEND_USER_FUNCTION - && (proto->common.fn_flags & ZEND_ACC_PASS_REST_BY_REFERENCE) != 0 - && (fe->common.fn_flags & ZEND_ACC_PASS_REST_BY_REFERENCE) == 0) { - return 0; - } - /* by-ref constraints on return values are covariant */ if ((proto->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) && !(fe->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { return 0; } - for (i=0; i < proto->common.num_args; i++) { - if (ZEND_LOG_XOR(fe->common.arg_info[i].class_name, proto->common.arg_info[i].class_name)) { + if ((proto->common.fn_flags & ZEND_ACC_VARIADIC) + && !(fe->common.fn_flags & ZEND_ACC_VARIADIC)) { + return 0; + } + + /* For variadic functions any additional (optional) arguments that were added must be + * checked against the signature of the variadic argument, so in this case we have to + * go through all the parameters of the function and not just those present in the + * prototype. */ + num_args = proto->common.num_args; + if ((fe->common.fn_flags & ZEND_ACC_VARIADIC) + && fe->common.num_args > proto->common.num_args) { + num_args = fe->common.num_args; + } + + for (i = 0; i < num_args; i++) { + zend_arg_info *fe_arg_info = &fe->common.arg_info[i]; + + zend_arg_info *proto_arg_info; + if (i < proto->common.num_args) { + proto_arg_info = &proto->common.arg_info[i]; + } else { + proto_arg_info = &proto->common.arg_info[proto->common.num_args-1]; + } + + if (ZEND_LOG_XOR(fe_arg_info->class_name, proto_arg_info->class_name)) { /* Only one has a type hint and the other one doesn't */ return 0; } - if (fe->common.arg_info[i].class_name) { + if (fe_arg_info->class_name) { const char *fe_class_name, *proto_class_name; zend_uint fe_class_name_len, proto_class_name_len; - if (!strcasecmp(fe->common.arg_info[i].class_name, "parent") && proto->common.scope) { + if (!strcasecmp(fe_arg_info->class_name, "parent") && proto->common.scope) { fe_class_name = proto->common.scope->name; fe_class_name_len = proto->common.scope->name_length; - } else if (!strcasecmp(fe->common.arg_info[i].class_name, "self") && fe->common.scope) { + } else if (!strcasecmp(fe_arg_info->class_name, "self") && fe->common.scope) { fe_class_name = fe->common.scope->name; fe_class_name_len = fe->common.scope->name_length; } else { - fe_class_name = fe->common.arg_info[i].class_name; - fe_class_name_len = fe->common.arg_info[i].class_name_len; + fe_class_name = fe_arg_info->class_name; + fe_class_name_len = fe_arg_info->class_name_len; } - if (!strcasecmp(proto->common.arg_info[i].class_name, "parent") && proto->common.scope && proto->common.scope->parent) { + if (!strcasecmp(proto_arg_info->class_name, "parent") && proto->common.scope && proto->common.scope->parent) { proto_class_name = proto->common.scope->parent->name; proto_class_name_len = proto->common.scope->parent->name_length; - } else if (!strcasecmp(proto->common.arg_info[i].class_name, "self") && proto->common.scope) { + } else if (!strcasecmp(proto_arg_info->class_name, "self") && proto->common.scope) { proto_class_name = proto->common.scope->name; proto_class_name_len = proto->common.scope->name_length; } else { - proto_class_name = proto->common.arg_info[i].class_name; - proto_class_name_len = proto->common.arg_info[i].class_name_len; + proto_class_name = proto_arg_info->class_name; + proto_class_name_len = proto_arg_info->class_name_len; } if (strcasecmp(fe_class_name, proto_class_name)!=0) { @@ -3181,24 +3215,17 @@ static zend_bool zend_do_perform_implementation_check(const zend_function *fe, c } } } - if (fe->common.arg_info[i].type_hint != proto->common.arg_info[i].type_hint) { + if (fe_arg_info->type_hint != proto_arg_info->type_hint) { /* Incompatible type hint */ return 0; } /* by-ref constraints on arguments are invariant */ - if (fe->common.arg_info[i].pass_by_reference != proto->common.arg_info[i].pass_by_reference) { + if (fe_arg_info->pass_by_reference != proto_arg_info->pass_by_reference) { return 0; } } - if (proto->common.fn_flags & ZEND_ACC_PASS_REST_BY_REFERENCE) { - for (i=proto->common.num_args; i < fe->common.num_args; i++) { - if (!fe->common.arg_info[i].pass_by_reference) { - return 0; - } - } - } return 1; } /* }}} */ @@ -3271,6 +3298,13 @@ static char * zend_get_function_declaration(zend_function *fptr TSRMLS_DC) /* {{ if (arg_info->pass_by_reference) { *(offset++) = '&'; } + + if (arg_info->is_variadic) { + *(offset++) = '.'; + *(offset++) = '.'; + *(offset++) = '.'; + } + *(offset++) = '$'; if (arg_info->name) { @@ -3286,7 +3320,7 @@ static char * zend_get_function_declaration(zend_function *fptr TSRMLS_DC) /* {{ idx /= 10; } while (idx > 0); } - if (i >= required) { + if (i >= required && !arg_info->is_variadic) { *(offset++) = ' '; *(offset++) = '='; *(offset++) = ' '; diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 61d11427a1e49..0e070294125c8 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -207,8 +207,7 @@ typedef struct _zend_try_catch_element { /* disable inline caching */ #define ZEND_ACC_NEVER_CACHE 0x400000 -#define ZEND_ACC_PASS_REST_BY_REFERENCE 0x1000000 -#define ZEND_ACC_PASS_REST_PREFER_REF 0x2000000 +#define ZEND_ACC_VARIADIC 0x1000000 #define ZEND_ACC_RETURN_REFERENCE 0x4000000 #define ZEND_ACC_DONE_PASS_TWO 0x8000000 @@ -234,8 +233,9 @@ typedef struct _zend_arg_info { const char *class_name; zend_uint class_name_len; zend_uchar type_hint; + zend_uchar pass_by_reference; zend_bool allow_null; - zend_bool pass_by_reference; + zend_bool is_variadic; } zend_arg_info; /* the following structure repeats the layout of zend_arg_info, @@ -249,7 +249,8 @@ typedef struct _zend_internal_function_info { zend_uint required_num_args; zend_uchar _type_hint; zend_bool return_reference; - zend_bool pass_rest_by_reference; + zend_bool _allow_null; + zend_bool _is_variadic; } zend_internal_function_info; typedef struct _zend_compiled_variable { @@ -500,7 +501,7 @@ void zend_do_add_variable(znode *result, const znode *op1, const znode *op2 TSRM int zend_do_verify_access_types(const znode *current_access_type, const znode *new_modifier); void zend_do_begin_function_declaration(znode *function_token, znode *function_name, int is_method, int return_reference, znode *fn_flags_znode TSRMLS_DC); void zend_do_end_function_declaration(const znode *function_token TSRMLS_DC); -void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, const znode *initialization, znode *class_type, zend_bool pass_by_reference TSRMLS_DC); +void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, const znode *initialization, znode *class_type, zend_bool pass_by_reference, zend_bool is_variadic TSRMLS_DC); int zend_do_begin_function_call(znode *function_name, zend_bool check_namespace TSRMLS_DC); void zend_do_begin_method_call(znode *left_bracket TSRMLS_DC); void zend_do_clone(znode *result, const znode *expr TSRMLS_DC); @@ -817,21 +818,21 @@ int zend_add_literal(zend_op_array *op_array, const zval *zv TSRMLS_DC); #define ZEND_SEND_BY_REF 1 #define ZEND_SEND_PREFER_REF 2 -#define CHECK_ARG_SEND_TYPE(zf, arg_num, m1, m2) \ - ((zf) && \ - ((((zend_function*)(zf))->common.arg_info && \ - arg_num <= ((zend_function*)(zf))->common.num_args) ? \ - (((zend_function *)(zf))->common.arg_info[arg_num-1].pass_by_reference & (m1)) : \ - (((zend_function *)(zf))->common.fn_flags & (m2)))) +#define CHECK_ARG_SEND_TYPE(zf, arg_num, m) \ + ((zf)->common.arg_info && \ + (arg_num <= (zf)->common.num_args \ + ? ((zf)->common.arg_info[arg_num-1].pass_by_reference & (m)) \ + : ((zf)->common.fn_flags & ZEND_ACC_VARIADIC) \ + ? ((zf)->common.arg_info[(zf)->common.num_args-1].pass_by_reference & (m)) : 0)) #define ARG_MUST_BE_SENT_BY_REF(zf, arg_num) \ - CHECK_ARG_SEND_TYPE(zf, arg_num, ZEND_SEND_BY_REF, ZEND_ACC_PASS_REST_BY_REFERENCE) + CHECK_ARG_SEND_TYPE(zf, arg_num, ZEND_SEND_BY_REF) #define ARG_SHOULD_BE_SENT_BY_REF(zf, arg_num) \ - CHECK_ARG_SEND_TYPE(zf, arg_num, ZEND_SEND_BY_REF|ZEND_SEND_PREFER_REF, ZEND_ACC_PASS_REST_BY_REFERENCE|ZEND_ACC_PASS_REST_PREFER_REF) + CHECK_ARG_SEND_TYPE(zf, arg_num, ZEND_SEND_BY_REF|ZEND_SEND_PREFER_REF) #define ARG_MAY_BE_SENT_BY_REF(zf, arg_num) \ - CHECK_ARG_SEND_TYPE(zf, arg_num, ZEND_SEND_PREFER_REF, ZEND_ACC_PASS_REST_PREFER_REF) + CHECK_ARG_SEND_TYPE(zf, arg_num, ZEND_SEND_PREFER_REF) #define ZEND_RETURN_VAL 0 #define ZEND_RETURN_REF 1 diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index c79a55169c86e..9f78218d3de35 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -616,12 +616,17 @@ static inline int zend_verify_arg_type(zend_function *zf, zend_uint arg_num, zva char *need_msg; zend_class_entry *ce; - if (!zf->common.arg_info - || arg_num>zf->common.num_args) { + if (!zf->common.arg_info) { return 1; } - cur_arg_info = &zf->common.arg_info[arg_num-1]; + if (arg_num <= zf->common.num_args) { + cur_arg_info = &zf->common.arg_info[arg_num-1]; + } else if (zf->common.fn_flags & ZEND_ACC_VARIADIC) { + cur_arg_info = &zf->common.arg_info[zf->common.num_args-1]; + } else { + return 1; + } if (cur_arg_info->class_name) { const char *class_name; diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 403146e16486e..4523783dec8ce 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -212,6 +212,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*); %token T_NS_C "__NAMESPACE__ (T_NS_C)" %token T_DIR "__DIR__ (T_DIR)" %token T_NS_SEPARATOR "\\ (T_NS_SEPARATOR)" +%token T_ELLIPSIS "... (T_ELLIPSIS)" %% /* Rules */ @@ -371,10 +372,14 @@ class_declaration_statement: ; is_reference: - /* empty */ { $$.op_type = ZEND_RETURN_VAL; } - | '&' { $$.op_type = ZEND_RETURN_REF; } + /* empty */ { $$.op_type = 0; } + | '&' { $$.op_type = 1; } ; +is_variadic: + /* empty */ { $$.op_type = 0; } + | T_ELLIPSIS { $$.op_type = 1; } +; unticked_function_declaration_statement: function is_reference T_STRING { zend_do_begin_function_declaration(&$1, &$3, 0, $2.op_type, NULL TSRMLS_CC); } @@ -523,14 +528,14 @@ parameter_list: non_empty_parameter_list: - optional_class_type T_VARIABLE { $$.op_type = IS_UNUSED; $$.u.op.num=1; zend_do_receive_arg(ZEND_RECV, &$2, &$$, NULL, &$1, 0 TSRMLS_CC); } - | optional_class_type '&' T_VARIABLE { $$.op_type = IS_UNUSED; $$.u.op.num=1; zend_do_receive_arg(ZEND_RECV, &$3, &$$, NULL, &$1, 1 TSRMLS_CC); } - | optional_class_type '&' T_VARIABLE '=' static_scalar { $$.op_type = IS_UNUSED; $$.u.op.num=1; zend_do_receive_arg(ZEND_RECV_INIT, &$3, &$$, &$5, &$1, 1 TSRMLS_CC); } - | optional_class_type T_VARIABLE '=' static_scalar { $$.op_type = IS_UNUSED; $$.u.op.num=1; zend_do_receive_arg(ZEND_RECV_INIT, &$2, &$$, &$4, &$1, 0 TSRMLS_CC); } - | non_empty_parameter_list ',' optional_class_type T_VARIABLE { $$=$1; $$.u.op.num++; zend_do_receive_arg(ZEND_RECV, &$4, &$$, NULL, &$3, 0 TSRMLS_CC); } - | non_empty_parameter_list ',' optional_class_type '&' T_VARIABLE { $$=$1; $$.u.op.num++; zend_do_receive_arg(ZEND_RECV, &$5, &$$, NULL, &$3, 1 TSRMLS_CC); } - | non_empty_parameter_list ',' optional_class_type '&' T_VARIABLE '=' static_scalar { $$=$1; $$.u.op.num++; zend_do_receive_arg(ZEND_RECV_INIT, &$5, &$$, &$7, &$3, 1 TSRMLS_CC); } - | non_empty_parameter_list ',' optional_class_type T_VARIABLE '=' static_scalar { $$=$1; $$.u.op.num++; zend_do_receive_arg(ZEND_RECV_INIT, &$4, &$$, &$6, &$3, 0 TSRMLS_CC); } + optional_class_type is_reference is_variadic T_VARIABLE + { $$.op_type = IS_UNUSED; $$.u.op.num=1; zend_do_receive_arg(ZEND_RECV, &$4, &$$, NULL, &$1, $2.op_type, $3.op_type TSRMLS_CC); } + | optional_class_type is_reference is_variadic T_VARIABLE '=' static_scalar + { $$.op_type = IS_UNUSED; $$.u.op.num=1; zend_do_receive_arg(ZEND_RECV_INIT, &$4, &$$, &$6, &$1, $2.op_type, $3.op_type TSRMLS_CC); } + | non_empty_parameter_list ',' optional_class_type is_reference is_variadic T_VARIABLE + { $$=$1; $$.u.op.num++; zend_do_receive_arg(ZEND_RECV, &$6, &$$, NULL, &$3, $4.op_type, $5.op_type TSRMLS_CC); } + | non_empty_parameter_list ',' optional_class_type is_reference is_variadic T_VARIABLE '=' static_scalar + { $$=$1; $$.u.op.num++; zend_do_receive_arg(ZEND_RECV_INIT, &$6, &$$, &$8, &$3, $4.op_type, $5.op_type TSRMLS_CC); } ; diff --git a/Zend/zend_language_scanner.c b/Zend/zend_language_scanner.c index d5768d3345569..12ee1f59c2da0 100644 --- a/Zend/zend_language_scanner.c +++ b/Zend/zend_language_scanner.c @@ -1096,7 +1096,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy3: YYDEBUG(3, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1738 "Zend/zend_language_scanner.l" +#line 1741 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { return 0; @@ -1174,7 +1174,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy6: YYDEBUG(6, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1728 "Zend/zend_language_scanner.l" +#line 1731 "Zend/zend_language_scanner.l" { if (CG(short_tags)) { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ @@ -1191,7 +1191,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) if ((yych = *YYCURSOR) == '=') goto yy43; YYDEBUG(8, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1709 "Zend/zend_language_scanner.l" +#line 1712 "Zend/zend_language_scanner.l" { if (CG(asp_tags)) { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ @@ -1387,7 +1387,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(38, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1675 "Zend/zend_language_scanner.l" +#line 1678 "Zend/zend_language_scanner.l" { YYCTYPE *bracket = (YYCTYPE*)zend_memrchr(yytext, '<', yyleng - (sizeof("script language=php>") - 1)); @@ -1429,7 +1429,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(44, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1691 "Zend/zend_language_scanner.l" +#line 1694 "Zend/zend_language_scanner.l" { if (CG(asp_tags)) { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ @@ -1445,7 +1445,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(46, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1702 "Zend/zend_language_scanner.l" +#line 1705 "Zend/zend_language_scanner.l" { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ BEGIN(ST_IN_SCRIPTING); @@ -1478,7 +1478,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy51: YYDEBUG(51, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1720 "Zend/zend_language_scanner.l" +#line 1723 "Zend/zend_language_scanner.l" { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ HANDLE_NEWLINE(yytext[yyleng-1]); @@ -1556,7 +1556,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy56: YYDEBUG(56, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2183 "Zend/zend_language_scanner.l" +#line 2186 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { return 0; @@ -1608,7 +1608,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(59, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2127 "Zend/zend_language_scanner.l" +#line 2130 "Zend/zend_language_scanner.l" { BEGIN(ST_IN_SCRIPTING); return '`'; @@ -1623,7 +1623,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(62, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2114 "Zend/zend_language_scanner.l" +#line 2117 "Zend/zend_language_scanner.l" { Z_LVAL_P(zendlval) = (long) '{'; yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); @@ -1646,7 +1646,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy65: YYDEBUG(65, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1820 "Zend/zend_language_scanner.l" +#line 1823 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; @@ -1658,7 +1658,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(67, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1454 "Zend/zend_language_scanner.l" +#line 1457 "Zend/zend_language_scanner.l" { yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC); return T_DOLLAR_OPEN_CURLY_BRACES; @@ -1677,7 +1677,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(71, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1812 "Zend/zend_language_scanner.l" +#line 1815 "Zend/zend_language_scanner.l" { yyless(yyleng - 1); yy_push_state(ST_VAR_OFFSET TSRMLS_CC); @@ -1703,7 +1703,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(74, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1802 "Zend/zend_language_scanner.l" +#line 1805 "Zend/zend_language_scanner.l" { yyless(yyleng - 3); yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); @@ -1779,7 +1779,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy78: YYDEBUG(78, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2133 "Zend/zend_language_scanner.l" +#line 2136 "Zend/zend_language_scanner.l" { if (GET_DOUBLE_QUOTES_SCANNED_LENGTH()) { YYCURSOR += GET_DOUBLE_QUOTES_SCANNED_LENGTH() - 1; @@ -1839,7 +1839,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(81, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2122 "Zend/zend_language_scanner.l" +#line 2125 "Zend/zend_language_scanner.l" { BEGIN(ST_IN_SCRIPTING); return '"'; @@ -1854,7 +1854,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(84, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2114 "Zend/zend_language_scanner.l" +#line 2117 "Zend/zend_language_scanner.l" { Z_LVAL_P(zendlval) = (long) '{'; yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); @@ -1877,7 +1877,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy87: YYDEBUG(87, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1820 "Zend/zend_language_scanner.l" +#line 1823 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; @@ -1889,7 +1889,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(89, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1454 "Zend/zend_language_scanner.l" +#line 1457 "Zend/zend_language_scanner.l" { yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC); return T_DOLLAR_OPEN_CURLY_BRACES; @@ -1908,7 +1908,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(93, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1812 "Zend/zend_language_scanner.l" +#line 1815 "Zend/zend_language_scanner.l" { yyless(yyleng - 1); yy_push_state(ST_VAR_OFFSET TSRMLS_CC); @@ -1934,7 +1934,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(96, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1802 "Zend/zend_language_scanner.l" +#line 1805 "Zend/zend_language_scanner.l" { yyless(yyleng - 3); yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); @@ -1953,7 +1953,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(100, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2100 "Zend/zend_language_scanner.l" +#line 2103 "Zend/zend_language_scanner.l" { zend_heredoc_label *heredoc_label = zend_ptr_stack_pop(&SCNG(heredoc_label_stack)); @@ -2028,7 +2028,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy104: YYDEBUG(104, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2225 "Zend/zend_language_scanner.l" +#line 2228 "Zend/zend_language_scanner.l" { int newline = 0; @@ -2116,7 +2116,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(108, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2114 "Zend/zend_language_scanner.l" +#line 2117 "Zend/zend_language_scanner.l" { Z_LVAL_P(zendlval) = (long) '{'; yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); @@ -2139,7 +2139,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy111: YYDEBUG(111, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1820 "Zend/zend_language_scanner.l" +#line 1823 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; @@ -2151,7 +2151,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(113, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1454 "Zend/zend_language_scanner.l" +#line 1457 "Zend/zend_language_scanner.l" { yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC); return T_DOLLAR_OPEN_CURLY_BRACES; @@ -2170,7 +2170,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(117, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1812 "Zend/zend_language_scanner.l" +#line 1815 "Zend/zend_language_scanner.l" { yyless(yyleng - 1); yy_push_state(ST_VAR_OFFSET TSRMLS_CC); @@ -2196,7 +2196,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(120, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1802 "Zend/zend_language_scanner.l" +#line 1805 "Zend/zend_language_scanner.l" { yyless(yyleng - 3); yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); @@ -2281,14 +2281,14 @@ int lex_scan(zval *zendlval TSRMLS_DC) case '\n': case '\r': case ' ': goto yy140; - case '!': goto yy153; + case '!': goto yy154; case '"': goto yy180; case '#': goto yy176; case '$': goto yy165; case '%': goto yy159; case '&': goto yy160; case '\'': goto yy178; - case '(': goto yy147; + case '(': goto yy148; case ')': case ',': case ';': @@ -2296,11 +2296,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) case '[': case ']': case '~': goto yy166; - case '*': goto yy156; - case '+': goto yy152; + case '*': goto yy157; + case '+': goto yy153; case '-': goto yy138; - case '.': goto yy158; - case '/': goto yy157; + case '.': goto yy145; + case '/': goto yy158; case '0': goto yy172; case '1': case '2': @@ -2312,9 +2312,9 @@ int lex_scan(zval *zendlval TSRMLS_DC) case '8': case '9': goto yy174; case ':': goto yy142; - case '<': goto yy154; - case '=': goto yy150; - case '>': goto yy155; + case '<': goto yy155; + case '=': goto yy151; + case '>': goto yy156; case '?': goto yy167; case 'A': case 'a': goto yy133; @@ -2333,9 +2333,9 @@ int lex_scan(zval *zendlval TSRMLS_DC) case 'I': case 'i': goto yy131; case 'L': - case 'l': goto yy151; + case 'l': goto yy152; case 'N': - case 'n': goto yy145; + case 'n': goto yy146; case 'O': case 'o': goto yy163; case 'P': @@ -2347,9 +2347,9 @@ int lex_scan(zval *zendlval TSRMLS_DC) case 'T': case 't': goto yy130; case 'U': - case 'u': goto yy148; + case 'u': goto yy149; case 'V': - case 'v': goto yy146; + case 'v': goto yy147; case 'W': case 'w': goto yy132; case 'X': @@ -2358,7 +2358,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) case 'y': goto yy129; case '\\': goto yy143; case '^': goto yy162; - case '_': goto yy149; + case '_': goto yy150; case '`': goto yy182; case '{': goto yy168; case '|': goto yy161; @@ -2371,23 +2371,23 @@ int lex_scan(zval *zendlval TSRMLS_DC) YYDEBUG(-1, yych); switch ((yych = *YYCURSOR)) { case 'C': - case 'c': goto yy735; + case 'c': goto yy738; case 'L': - case 'l': goto yy736; + case 'l': goto yy739; case 'M': - case 'm': goto yy737; + case 'm': goto yy740; case 'N': - case 'n': goto yy738; + case 'n': goto yy741; case 'V': - case 'v': goto yy739; + case 'v': goto yy742; case 'X': - case 'x': goto yy740; + case 'x': goto yy743; default: goto yy187; } yy124: YYDEBUG(124, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1843 "Zend/zend_language_scanner.l" +#line 1846 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, yytext, yyleng); zendlval->type = IS_STRING; @@ -2399,20 +2399,20 @@ int lex_scan(zval *zendlval TSRMLS_DC) yych = *++YYCURSOR; if (yych <= 'O') { if (yych <= 'H') { - if (yych == 'E') goto yy717; + if (yych == 'E') goto yy720; goto yy187; } else { - if (yych <= 'I') goto yy718; + if (yych <= 'I') goto yy721; if (yych <= 'N') goto yy187; - goto yy719; + goto yy722; } } else { if (yych <= 'h') { - if (yych == 'e') goto yy717; + if (yych == 'e') goto yy720; goto yy187; } else { - if (yych <= 'i') goto yy718; - if (yych == 'o') goto yy719; + if (yych <= 'i') goto yy721; + if (yych == 'o') goto yy722; goto yy187; } } @@ -2421,20 +2421,20 @@ int lex_scan(zval *zendlval TSRMLS_DC) yych = *++YYCURSOR; if (yych <= 'U') { if (yych <= 'N') { - if (yych == 'I') goto yy693; + if (yych == 'I') goto yy696; goto yy187; } else { - if (yych <= 'O') goto yy694; + if (yych <= 'O') goto yy697; if (yych <= 'T') goto yy187; - goto yy695; + goto yy698; } } else { if (yych <= 'n') { - if (yych == 'i') goto yy693; + if (yych == 'i') goto yy696; goto yy187; } else { - if (yych <= 'o') goto yy694; - if (yych == 'u') goto yy695; + if (yych <= 'o') goto yy697; + if (yych == 'u') goto yy698; goto yy187; } } @@ -2443,48 +2443,48 @@ int lex_scan(zval *zendlval TSRMLS_DC) yych = *++YYCURSOR; if (yych <= 'O') { if (yych <= 'K') { - if (yych == 'A') goto yy658; + if (yych == 'A') goto yy661; goto yy187; } else { - if (yych <= 'L') goto yy659; + if (yych <= 'L') goto yy662; if (yych <= 'N') goto yy187; - goto yy660; + goto yy663; } } else { if (yych <= 'k') { - if (yych == 'a') goto yy658; + if (yych == 'a') goto yy661; goto yy187; } else { - if (yych <= 'l') goto yy659; - if (yych == 'o') goto yy660; + if (yych <= 'l') goto yy662; + if (yych == 'o') goto yy663; goto yy187; } } yy128: YYDEBUG(128, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy640; - if (yych == 'e') goto yy640; + if (yych == 'E') goto yy643; + if (yych == 'e') goto yy643; goto yy187; yy129: YYDEBUG(129, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy635; - if (yych == 'i') goto yy635; + if (yych == 'I') goto yy638; + if (yych == 'i') goto yy638; goto yy187; yy130: YYDEBUG(130, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'R') { - if (yych == 'H') goto yy623; + if (yych == 'H') goto yy626; if (yych <= 'Q') goto yy187; - goto yy624; + goto yy627; } else { if (yych <= 'h') { if (yych <= 'g') goto yy187; - goto yy623; + goto yy626; } else { - if (yych == 'r') goto yy624; + if (yych == 'r') goto yy627; goto yy187; } } @@ -2493,53 +2493,53 @@ int lex_scan(zval *zendlval TSRMLS_DC) yych = *++YYCURSOR; if (yych <= 'S') { if (yych <= 'L') { - if (yych == 'F') goto yy570; + if (yych == 'F') goto yy573; goto yy187; } else { - if (yych <= 'M') goto yy572; - if (yych <= 'N') goto yy573; + if (yych <= 'M') goto yy575; + if (yych <= 'N') goto yy576; if (yych <= 'R') goto yy187; - goto yy574; + goto yy577; } } else { if (yych <= 'm') { - if (yych == 'f') goto yy570; + if (yych == 'f') goto yy573; if (yych <= 'l') goto yy187; - goto yy572; + goto yy575; } else { - if (yych <= 'n') goto yy573; - if (yych == 's') goto yy574; + if (yych <= 'n') goto yy576; + if (yych == 's') goto yy577; goto yy187; } } yy132: YYDEBUG(132, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy565; - if (yych == 'h') goto yy565; + if (yych == 'H') goto yy568; + if (yych == 'h') goto yy568; goto yy187; yy133: YYDEBUG(133, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'S') { if (yych <= 'M') { - if (yych == 'B') goto yy547; + if (yych == 'B') goto yy550; goto yy187; } else { - if (yych <= 'N') goto yy548; + if (yych <= 'N') goto yy551; if (yych <= 'Q') goto yy187; - if (yych <= 'R') goto yy549; - goto yy550; + if (yych <= 'R') goto yy552; + goto yy553; } } else { if (yych <= 'n') { - if (yych == 'b') goto yy547; + if (yych == 'b') goto yy550; if (yych <= 'm') goto yy187; - goto yy548; + goto yy551; } else { if (yych <= 'q') goto yy187; - if (yych <= 'r') goto yy549; - if (yych <= 's') goto yy550; + if (yych <= 'r') goto yy552; + if (yych <= 's') goto yy553; goto yy187; } } @@ -2547,15 +2547,15 @@ int lex_scan(zval *zendlval TSRMLS_DC) YYDEBUG(134, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'W') { - if (yych == 'T') goto yy535; + if (yych == 'T') goto yy538; if (yych <= 'V') goto yy187; - goto yy536; + goto yy539; } else { if (yych <= 't') { if (yych <= 's') goto yy187; - goto yy535; + goto yy538; } else { - if (yych == 'w') goto yy536; + if (yych == 'w') goto yy539; goto yy187; } } @@ -2566,18 +2566,18 @@ int lex_scan(zval *zendlval TSRMLS_DC) if (yych <= ';') { if (yych <= '"') { if (yych <= '!') goto yy187; - goto yy527; + goto yy530; } else { - if (yych == '\'') goto yy528; + if (yych == '\'') goto yy531; goto yy187; } } else { if (yych <= 'R') { - if (yych <= '<') goto yy526; + if (yych <= '<') goto yy529; if (yych <= 'Q') goto yy187; - goto yy529; + goto yy532; } else { - if (yych == 'r') goto yy529; + if (yych == 'r') goto yy532; goto yy187; } } @@ -2585,15 +2585,15 @@ int lex_scan(zval *zendlval TSRMLS_DC) YYDEBUG(136, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'O') { - if (yych == 'L') goto yy516; + if (yych == 'L') goto yy519; if (yych <= 'N') goto yy187; - goto yy517; + goto yy520; } else { if (yych <= 'l') { if (yych <= 'k') goto yy187; - goto yy516; + goto yy519; } else { - if (yych == 'o') goto yy517; + if (yych == 'o') goto yy520; goto yy187; } } @@ -2601,15 +2601,15 @@ int lex_scan(zval *zendlval TSRMLS_DC) YYDEBUG(137, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'U') { - if (yych == 'R') goto yy492; + if (yych == 'R') goto yy495; if (yych <= 'T') goto yy187; - goto yy493; + goto yy496; } else { if (yych <= 'r') { if (yych <= 'q') goto yy187; - goto yy492; + goto yy495; } else { - if (yych == 'u') goto yy493; + if (yych == 'u') goto yy496; goto yy187; } } @@ -2617,15 +2617,15 @@ int lex_scan(zval *zendlval TSRMLS_DC) YYDEBUG(138, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '<') { - if (yych == '-') goto yy488; + if (yych == '-') goto yy491; } else { - if (yych <= '=') goto yy486; - if (yych <= '>') goto yy490; + if (yych <= '=') goto yy489; + if (yych <= '>') goto yy493; } yy139: YYDEBUG(139, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1443 "Zend/zend_language_scanner.l" +#line 1446 "Zend/zend_language_scanner.l" { return yytext[0]; } @@ -2634,11 +2634,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) YYDEBUG(140, *YYCURSOR); ++YYCURSOR; yych = *YYCURSOR; - goto yy485; + goto yy488; yy141: YYDEBUG(141, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1176 "Zend/zend_language_scanner.l" +#line 1175 "Zend/zend_language_scanner.l" { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ HANDLE_NEWLINES(yytext, yyleng); @@ -2648,181 +2648,186 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy142: YYDEBUG(142, *YYCURSOR); yych = *++YYCURSOR; - if (yych == ':') goto yy482; + if (yych == ':') goto yy485; goto yy139; yy143: YYDEBUG(143, *YYCURSOR); ++YYCURSOR; YYDEBUG(144, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1203 "Zend/zend_language_scanner.l" +#line 1202 "Zend/zend_language_scanner.l" { return T_NS_SEPARATOR; } #line 2663 "Zend/zend_language_scanner.c" yy145: YYDEBUG(145, *YYCURSOR); + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '/') { + if (yych == '.') goto yy482; + goto yy139; + } else { + if (yych <= '9') goto yy478; + if (yych == '=') goto yy480; + goto yy139; + } +yy146: + YYDEBUG(146, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'E') { - if (yych == 'A') goto yy470; + if (yych == 'A') goto yy466; if (yych <= 'D') goto yy187; - goto yy471; + goto yy467; } else { if (yych <= 'a') { if (yych <= '`') goto yy187; - goto yy470; + goto yy466; } else { - if (yych == 'e') goto yy471; + if (yych == 'e') goto yy467; goto yy187; } } -yy146: - YYDEBUG(146, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'A') goto yy467; - if (yych == 'a') goto yy467; - goto yy187; yy147: YYDEBUG(147, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'A') goto yy463; + if (yych == 'a') goto yy463; + goto yy187; +yy148: + YYDEBUG(148, *YYCURSOR); yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'S') { if (yych <= 'D') { if (yych <= ' ') { - if (yych == '\t') goto yy392; + if (yych == '\t') goto yy388; if (yych <= 0x1F) goto yy139; - goto yy392; + goto yy388; } else { if (yych <= '@') goto yy139; if (yych == 'C') goto yy139; - goto yy392; + goto yy388; } } else { if (yych <= 'I') { - if (yych == 'F') goto yy392; + if (yych == 'F') goto yy388; if (yych <= 'H') goto yy139; - goto yy392; + goto yy388; } else { - if (yych == 'O') goto yy392; + if (yych == 'O') goto yy388; if (yych <= 'Q') goto yy139; - goto yy392; + goto yy388; } } } else { if (yych <= 'f') { if (yych <= 'b') { - if (yych == 'U') goto yy392; + if (yych == 'U') goto yy388; if (yych <= '`') goto yy139; - goto yy392; + goto yy388; } else { - if (yych == 'd') goto yy392; + if (yych == 'd') goto yy388; if (yych <= 'e') goto yy139; - goto yy392; + goto yy388; } } else { if (yych <= 'o') { - if (yych == 'i') goto yy392; + if (yych == 'i') goto yy388; if (yych <= 'n') goto yy139; - goto yy392; + goto yy388; } else { if (yych <= 's') { if (yych <= 'q') goto yy139; - goto yy392; + goto yy388; } else { - if (yych == 'u') goto yy392; + if (yych == 'u') goto yy388; goto yy139; } } } } -yy148: - YYDEBUG(148, *YYCURSOR); +yy149: + YYDEBUG(149, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'S') { - if (yych == 'N') goto yy383; + if (yych == 'N') goto yy379; if (yych <= 'R') goto yy187; - goto yy384; + goto yy380; } else { if (yych <= 'n') { if (yych <= 'm') goto yy187; - goto yy383; + goto yy379; } else { - if (yych == 's') goto yy384; + if (yych == 's') goto yy380; goto yy187; } } -yy149: - YYDEBUG(149, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '_') goto yy301; - goto yy187; yy150: YYDEBUG(150, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '<') goto yy139; - if (yych <= '=') goto yy295; - if (yych <= '>') goto yy297; - goto yy139; + if (yych == '_') goto yy297; + goto yy187; yy151: YYDEBUG(151, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy291; - if (yych == 'i') goto yy291; - goto yy187; + if (yych <= '<') goto yy139; + if (yych <= '=') goto yy291; + if (yych <= '>') goto yy293; + goto yy139; yy152: YYDEBUG(152, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '+') goto yy289; - if (yych == '=') goto yy287; - goto yy139; + if (yych == 'I') goto yy287; + if (yych == 'i') goto yy287; + goto yy187; yy153: YYDEBUG(153, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '=') goto yy284; + if (yych == '+') goto yy285; + if (yych == '=') goto yy283; goto yy139; yy154: YYDEBUG(154, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '=') goto yy280; + goto yy139; +yy155: + YYDEBUG(155, *YYCURSOR); yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); if (yych <= ';') { - if (yych == '/') goto yy256; + if (yych == '/') goto yy252; goto yy139; } else { - if (yych <= '<') goto yy254; - if (yych <= '=') goto yy257; - if (yych <= '>') goto yy259; + if (yych <= '<') goto yy250; + if (yych <= '=') goto yy253; + if (yych <= '>') goto yy255; goto yy139; } -yy155: - YYDEBUG(155, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= '<') goto yy139; - if (yych <= '=') goto yy250; - if (yych <= '>') goto yy248; - goto yy139; yy156: YYDEBUG(156, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '=') goto yy246; + if (yych <= '<') goto yy139; + if (yych <= '=') goto yy246; + if (yych <= '>') goto yy244; goto yy139; yy157: YYDEBUG(157, *YYCURSOR); yych = *++YYCURSOR; + if (yych == '=') goto yy242; + goto yy139; +yy158: + YYDEBUG(158, *YYCURSOR); + yych = *++YYCURSOR; if (yych <= '.') { - if (yych == '*') goto yy238; + if (yych == '*') goto yy234; goto yy139; } else { - if (yych <= '/') goto yy240; - if (yych == '=') goto yy241; + if (yych <= '/') goto yy236; + if (yych == '=') goto yy237; goto yy139; } -yy158: - YYDEBUG(158, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= '/') goto yy139; - if (yych <= '9') goto yy234; - if (yych == '=') goto yy236; - goto yy139; yy159: YYDEBUG(159, *YYCURSOR); yych = *++YYCURSOR; @@ -2887,18 +2892,18 @@ int lex_scan(zval *zendlval TSRMLS_DC) ++YYCURSOR; YYDEBUG(169, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1448 "Zend/zend_language_scanner.l" +#line 1451 "Zend/zend_language_scanner.l" { yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); return '{'; } -#line 2896 "Zend/zend_language_scanner.c" +#line 2901 "Zend/zend_language_scanner.c" yy170: YYDEBUG(170, *YYCURSOR); ++YYCURSOR; YYDEBUG(171, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1460 "Zend/zend_language_scanner.l" +#line 1463 "Zend/zend_language_scanner.l" { RESET_DOC_COMMENT(); if (!zend_stack_is_empty(&SCNG(state_stack))) { @@ -2906,7 +2911,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } return '}'; } -#line 2910 "Zend/zend_language_scanner.c" +#line 2915 "Zend/zend_language_scanner.c" yy172: YYDEBUG(172, *YYCURSOR); yyaccept = 2; @@ -2934,7 +2939,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy173: YYDEBUG(173, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1510 "Zend/zend_language_scanner.l" +#line 1513 "Zend/zend_language_scanner.l" { if (yyleng < MAX_LENGTH_OF_LONG - 1) { /* Won't overflow */ Z_LVAL_P(zendlval) = strtol(yytext, NULL, 0); @@ -2955,7 +2960,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zendlval->type = IS_LONG; return T_LNUMBER; } -#line 2959 "Zend/zend_language_scanner.c" +#line 2964 "Zend/zend_language_scanner.c" yy174: YYDEBUG(174, *YYCURSOR); yyaccept = 2; @@ -2983,7 +2988,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy177: YYDEBUG(177, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1850 "Zend/zend_language_scanner.l" +#line 1853 "Zend/zend_language_scanner.l" { while (YYCURSOR < YYLIMIT) { switch (*YYCURSOR++) { @@ -3017,14 +3022,14 @@ int lex_scan(zval *zendlval TSRMLS_DC) return T_COMMENT; } -#line 3021 "Zend/zend_language_scanner.c" +#line 3026 "Zend/zend_language_scanner.c" yy178: YYDEBUG(178, *YYCURSOR); ++YYCURSOR; yy179: YYDEBUG(179, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1937 "Zend/zend_language_scanner.l" +#line 1940 "Zend/zend_language_scanner.l" { register char *s, *t; char *end; @@ -3090,14 +3095,14 @@ int lex_scan(zval *zendlval TSRMLS_DC) } return T_CONSTANT_ENCAPSED_STRING; } -#line 3094 "Zend/zend_language_scanner.c" +#line 3099 "Zend/zend_language_scanner.c" yy180: YYDEBUG(180, *YYCURSOR); ++YYCURSOR; yy181: YYDEBUG(181, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2004 "Zend/zend_language_scanner.l" +#line 2007 "Zend/zend_language_scanner.l" { int bprefix = (yytext[0] != '"') ? 1 : 0; @@ -3138,24 +3143,24 @@ int lex_scan(zval *zendlval TSRMLS_DC) BEGIN(ST_DOUBLE_QUOTES); return '"'; } -#line 3142 "Zend/zend_language_scanner.c" +#line 3147 "Zend/zend_language_scanner.c" yy182: YYDEBUG(182, *YYCURSOR); ++YYCURSOR; YYDEBUG(183, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2094 "Zend/zend_language_scanner.l" +#line 2097 "Zend/zend_language_scanner.l" { BEGIN(ST_BACKQUOTE); return '`'; } -#line 3153 "Zend/zend_language_scanner.c" +#line 3158 "Zend/zend_language_scanner.c" yy184: YYDEBUG(184, *YYCURSOR); ++YYCURSOR; YYDEBUG(185, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2357 "Zend/zend_language_scanner.l" +#line 2360 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { return 0; @@ -3164,7 +3169,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE); goto restart; } -#line 3168 "Zend/zend_language_scanner.c" +#line 3173 "Zend/zend_language_scanner.c" yy186: YYDEBUG(186, *YYCURSOR); ++YYCURSOR; @@ -3191,12 +3196,12 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy190: YYDEBUG(190, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1569 "Zend/zend_language_scanner.l" +#line 1572 "Zend/zend_language_scanner.l" { ZVAL_DOUBLE(zendlval, zend_strtod(yytext, NULL)); return T_DNUMBER; } -#line 3200 "Zend/zend_language_scanner.c" +#line 3205 "Zend/zend_language_scanner.c" yy191: YYDEBUG(191, *YYCURSOR); yyaccept = 2; @@ -3243,10 +3248,10 @@ int lex_scan(zval *zendlval TSRMLS_DC) if (yyaccept <= 3) { goto yy190; } else { - goto yy239; + goto yy235; } } else { - goto yy255; + goto yy251; } } yy195: @@ -3288,7 +3293,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(202, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1486 "Zend/zend_language_scanner.l" +#line 1489 "Zend/zend_language_scanner.l" { char *bin = yytext + 2; /* Skip "0b" */ int len = yyleng - 2; @@ -3312,7 +3317,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) return T_DNUMBER; } } -#line 3316 "Zend/zend_language_scanner.c" +#line 3321 "Zend/zend_language_scanner.c" yy203: YYDEBUG(203, *YYCURSOR); ++YYCURSOR; @@ -3324,7 +3329,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(205, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1531 "Zend/zend_language_scanner.l" +#line 1534 "Zend/zend_language_scanner.l" { char *hex = yytext + 2; /* Skip "0x" */ int len = yyleng - 2; @@ -3348,7 +3353,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) return T_DNUMBER; } } -#line 3352 "Zend/zend_language_scanner.c" +#line 3357 "Zend/zend_language_scanner.c" yy206: YYDEBUG(206, *YYCURSOR); ++YYCURSOR; @@ -3357,13 +3362,13 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy207: YYDEBUG(207, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1918 "Zend/zend_language_scanner.l" +#line 1921 "Zend/zend_language_scanner.l" { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ BEGIN(INITIAL); return T_CLOSE_TAG; /* implicit ';' at php-end tag */ } -#line 3367 "Zend/zend_language_scanner.c" +#line 3372 "Zend/zend_language_scanner.c" yy208: YYDEBUG(208, *YYCURSOR); yych = *++YYCURSOR; @@ -3397,13 +3402,13 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy212: YYDEBUG(212, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1820 "Zend/zend_language_scanner.l" +#line 1823 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; return T_VARIABLE; } -#line 3407 "Zend/zend_language_scanner.c" +#line 3412 "Zend/zend_language_scanner.c" yy213: YYDEBUG(213, *YYCURSOR); yych = *++YYCURSOR; @@ -3417,11 +3422,11 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(215, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1431 "Zend/zend_language_scanner.l" +#line 1434 "Zend/zend_language_scanner.l" { return T_LOGICAL_XOR; } -#line 3425 "Zend/zend_language_scanner.c" +#line 3430 "Zend/zend_language_scanner.c" yy216: YYDEBUG(216, *YYCURSOR); ++YYCURSOR; @@ -3430,61 +3435,61 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(217, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1423 "Zend/zend_language_scanner.l" +#line 1426 "Zend/zend_language_scanner.l" { return T_LOGICAL_OR; } -#line 3438 "Zend/zend_language_scanner.c" +#line 3443 "Zend/zend_language_scanner.c" yy218: YYDEBUG(218, *YYCURSOR); ++YYCURSOR; YYDEBUG(219, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1411 "Zend/zend_language_scanner.l" +#line 1414 "Zend/zend_language_scanner.l" { return T_XOR_EQUAL; } -#line 3448 "Zend/zend_language_scanner.c" +#line 3453 "Zend/zend_language_scanner.c" yy220: YYDEBUG(220, *YYCURSOR); ++YYCURSOR; YYDEBUG(221, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1415 "Zend/zend_language_scanner.l" +#line 1418 "Zend/zend_language_scanner.l" { return T_BOOLEAN_OR; } -#line 3458 "Zend/zend_language_scanner.c" +#line 3463 "Zend/zend_language_scanner.c" yy222: YYDEBUG(222, *YYCURSOR); ++YYCURSOR; YYDEBUG(223, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1407 "Zend/zend_language_scanner.l" +#line 1410 "Zend/zend_language_scanner.l" { return T_OR_EQUAL; } -#line 3468 "Zend/zend_language_scanner.c" +#line 3473 "Zend/zend_language_scanner.c" yy224: YYDEBUG(224, *YYCURSOR); ++YYCURSOR; YYDEBUG(225, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1419 "Zend/zend_language_scanner.l" +#line 1422 "Zend/zend_language_scanner.l" { return T_BOOLEAN_AND; } -#line 3478 "Zend/zend_language_scanner.c" +#line 3483 "Zend/zend_language_scanner.c" yy226: YYDEBUG(226, *YYCURSOR); ++YYCURSOR; YYDEBUG(227, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1403 "Zend/zend_language_scanner.l" +#line 1406 "Zend/zend_language_scanner.l" { return T_AND_EQUAL; } -#line 3488 "Zend/zend_language_scanner.c" +#line 3493 "Zend/zend_language_scanner.c" yy228: YYDEBUG(228, *YYCURSOR); ++YYCURSOR; @@ -3493,7 +3498,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy229: YYDEBUG(229, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1925 "Zend/zend_language_scanner.l" +#line 1928 "Zend/zend_language_scanner.l" { if (CG(asp_tags)) { BEGIN(INITIAL); @@ -3504,17 +3509,17 @@ int lex_scan(zval *zendlval TSRMLS_DC) return yytext[0]; } } -#line 3508 "Zend/zend_language_scanner.c" +#line 3513 "Zend/zend_language_scanner.c" yy230: YYDEBUG(230, *YYCURSOR); ++YYCURSOR; YYDEBUG(231, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1391 "Zend/zend_language_scanner.l" +#line 1394 "Zend/zend_language_scanner.l" { return T_MOD_EQUAL; } -#line 3518 "Zend/zend_language_scanner.c" +#line 3523 "Zend/zend_language_scanner.c" yy232: YYDEBUG(232, *YYCURSOR); yych = *++YYCURSOR; @@ -3526,39 +3531,13 @@ int lex_scan(zval *zendlval TSRMLS_DC) goto yy229; yy234: YYDEBUG(234, *YYCURSOR); - yyaccept = 3; - YYMARKER = ++YYCURSOR; - YYFILL(3); - yych = *YYCURSOR; - YYDEBUG(235, *YYCURSOR); - if (yych <= 'D') { - if (yych <= '/') goto yy190; - if (yych <= '9') goto yy234; - goto yy190; - } else { - if (yych <= 'E') goto yy193; - if (yych == 'e') goto yy193; - goto yy190; - } -yy236: - YYDEBUG(236, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(237, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1387 "Zend/zend_language_scanner.l" - { - return T_CONCAT_EQUAL; -} -#line 3553 "Zend/zend_language_scanner.c" -yy238: - YYDEBUG(238, *YYCURSOR); yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); - if (yych == '*') goto yy243; -yy239: - YYDEBUG(239, *YYCURSOR); + if (yych == '*') goto yy239; +yy235: + YYDEBUG(235, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1884 "Zend/zend_language_scanner.l" +#line 1887 "Zend/zend_language_scanner.l" { int doc_com; @@ -3592,281 +3571,281 @@ int lex_scan(zval *zendlval TSRMLS_DC) return T_COMMENT; } -#line 3596 "Zend/zend_language_scanner.c" -yy240: - YYDEBUG(240, *YYCURSOR); +#line 3575 "Zend/zend_language_scanner.c" +yy236: + YYDEBUG(236, *YYCURSOR); yych = *++YYCURSOR; goto yy177; -yy241: - YYDEBUG(241, *YYCURSOR); +yy237: + YYDEBUG(237, *YYCURSOR); ++YYCURSOR; - YYDEBUG(242, *YYCURSOR); + YYDEBUG(238, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1383 "Zend/zend_language_scanner.l" +#line 1386 "Zend/zend_language_scanner.l" { return T_DIV_EQUAL; } -#line 3610 "Zend/zend_language_scanner.c" -yy243: - YYDEBUG(243, *YYCURSOR); +#line 3589 "Zend/zend_language_scanner.c" +yy239: + YYDEBUG(239, *YYCURSOR); yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy244; + goto yy240; } goto yy194; -yy244: - YYDEBUG(244, *YYCURSOR); +yy240: + YYDEBUG(240, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(245, *YYCURSOR); + YYDEBUG(241, *YYCURSOR); if (yybm[0+yych] & 64) { - goto yy244; + goto yy240; } - goto yy239; -yy246: - YYDEBUG(246, *YYCURSOR); + goto yy235; +yy242: + YYDEBUG(242, *YYCURSOR); ++YYCURSOR; - YYDEBUG(247, *YYCURSOR); + YYDEBUG(243, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1379 "Zend/zend_language_scanner.l" +#line 1382 "Zend/zend_language_scanner.l" { return T_MUL_EQUAL; } -#line 3637 "Zend/zend_language_scanner.c" -yy248: - YYDEBUG(248, *YYCURSOR); +#line 3616 "Zend/zend_language_scanner.c" +yy244: + YYDEBUG(244, *YYCURSOR); ++YYCURSOR; - if ((yych = *YYCURSOR) == '=') goto yy252; - YYDEBUG(249, *YYCURSOR); + if ((yych = *YYCURSOR) == '=') goto yy248; + YYDEBUG(245, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1439 "Zend/zend_language_scanner.l" +#line 1442 "Zend/zend_language_scanner.l" { return T_SR; } -#line 3648 "Zend/zend_language_scanner.c" -yy250: - YYDEBUG(250, *YYCURSOR); +#line 3627 "Zend/zend_language_scanner.c" +yy246: + YYDEBUG(246, *YYCURSOR); ++YYCURSOR; - YYDEBUG(251, *YYCURSOR); + YYDEBUG(247, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1367 "Zend/zend_language_scanner.l" +#line 1370 "Zend/zend_language_scanner.l" { return T_IS_GREATER_OR_EQUAL; } -#line 3658 "Zend/zend_language_scanner.c" -yy252: - YYDEBUG(252, *YYCURSOR); +#line 3637 "Zend/zend_language_scanner.c" +yy248: + YYDEBUG(248, *YYCURSOR); ++YYCURSOR; - YYDEBUG(253, *YYCURSOR); + YYDEBUG(249, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1399 "Zend/zend_language_scanner.l" +#line 1402 "Zend/zend_language_scanner.l" { return T_SR_EQUAL; } -#line 3668 "Zend/zend_language_scanner.c" -yy254: - YYDEBUG(254, *YYCURSOR); +#line 3647 "Zend/zend_language_scanner.c" +yy250: + YYDEBUG(250, *YYCURSOR); yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= ';') goto yy255; - if (yych <= '<') goto yy270; - if (yych <= '=') goto yy268; -yy255: - YYDEBUG(255, *YYCURSOR); + if (yych <= ';') goto yy251; + if (yych <= '<') goto yy266; + if (yych <= '=') goto yy264; +yy251: + YYDEBUG(251, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1435 "Zend/zend_language_scanner.l" +#line 1438 "Zend/zend_language_scanner.l" { return T_SL; } -#line 3683 "Zend/zend_language_scanner.c" -yy256: - YYDEBUG(256, *YYCURSOR); +#line 3662 "Zend/zend_language_scanner.c" +yy252: + YYDEBUG(252, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy261; - if (yych == 's') goto yy261; + if (yych == 'S') goto yy257; + if (yych == 's') goto yy257; goto yy194; -yy257: - YYDEBUG(257, *YYCURSOR); +yy253: + YYDEBUG(253, *YYCURSOR); ++YYCURSOR; - YYDEBUG(258, *YYCURSOR); + YYDEBUG(254, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1363 "Zend/zend_language_scanner.l" +#line 1366 "Zend/zend_language_scanner.l" { return T_IS_SMALLER_OR_EQUAL; } -#line 3699 "Zend/zend_language_scanner.c" -yy259: - YYDEBUG(259, *YYCURSOR); +#line 3678 "Zend/zend_language_scanner.c" +yy255: + YYDEBUG(255, *YYCURSOR); ++YYCURSOR; -yy260: - YYDEBUG(260, *YYCURSOR); +yy256: + YYDEBUG(256, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1359 "Zend/zend_language_scanner.l" +#line 1362 "Zend/zend_language_scanner.l" { return T_IS_NOT_EQUAL; } -#line 3710 "Zend/zend_language_scanner.c" -yy261: - YYDEBUG(261, *YYCURSOR); +#line 3689 "Zend/zend_language_scanner.c" +yy257: + YYDEBUG(257, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy262; + if (yych == 'C') goto yy258; if (yych != 'c') goto yy194; -yy262: - YYDEBUG(262, *YYCURSOR); +yy258: + YYDEBUG(258, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy263; + if (yych == 'R') goto yy259; if (yych != 'r') goto yy194; -yy263: - YYDEBUG(263, *YYCURSOR); +yy259: + YYDEBUG(259, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy264; + if (yych == 'I') goto yy260; if (yych != 'i') goto yy194; -yy264: - YYDEBUG(264, *YYCURSOR); +yy260: + YYDEBUG(260, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'P') goto yy265; + if (yych == 'P') goto yy261; if (yych != 'p') goto yy194; -yy265: - YYDEBUG(265, *YYCURSOR); +yy261: + YYDEBUG(261, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy266; + if (yych == 'T') goto yy262; if (yych != 't') goto yy194; -yy266: - YYDEBUG(266, *YYCURSOR); +yy262: + YYDEBUG(262, *YYCURSOR); ++YYCURSOR; YYFILL(3); yych = *YYCURSOR; - YYDEBUG(267, *YYCURSOR); + YYDEBUG(263, *YYCURSOR); if (yych <= '\r') { if (yych <= 0x08) goto yy194; - if (yych <= '\n') goto yy266; + if (yych <= '\n') goto yy262; if (yych <= '\f') goto yy194; - goto yy266; + goto yy262; } else { if (yych <= ' ') { if (yych <= 0x1F) goto yy194; - goto yy266; + goto yy262; } else { if (yych == '>') goto yy206; goto yy194; } } -yy268: - YYDEBUG(268, *YYCURSOR); +yy264: + YYDEBUG(264, *YYCURSOR); ++YYCURSOR; - YYDEBUG(269, *YYCURSOR); + YYDEBUG(265, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1395 "Zend/zend_language_scanner.l" +#line 1398 "Zend/zend_language_scanner.l" { return T_SL_EQUAL; } -#line 3765 "Zend/zend_language_scanner.c" -yy270: - YYDEBUG(270, *YYCURSOR); +#line 3744 "Zend/zend_language_scanner.c" +yy266: + YYDEBUG(266, *YYCURSOR); ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; - YYDEBUG(271, *YYCURSOR); + YYDEBUG(267, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy270; + goto yy266; } if (yych <= 'Z') { if (yych <= '&') { - if (yych == '"') goto yy275; + if (yych == '"') goto yy271; goto yy194; } else { - if (yych <= '\'') goto yy274; + if (yych <= '\'') goto yy270; if (yych <= '@') goto yy194; } } else { if (yych <= '`') { if (yych != '_') goto yy194; } else { - if (yych <= 'z') goto yy272; + if (yych <= 'z') goto yy268; if (yych <= '~') goto yy194; } } -yy272: - YYDEBUG(272, *YYCURSOR); +yy268: + YYDEBUG(268, *YYCURSOR); ++YYCURSOR; YYFILL(2); yych = *YYCURSOR; - YYDEBUG(273, *YYCURSOR); + YYDEBUG(269, *YYCURSOR); if (yych <= '@') { if (yych <= '\f') { - if (yych == '\n') goto yy279; + if (yych == '\n') goto yy275; goto yy194; } else { - if (yych <= '\r') goto yy281; + if (yych <= '\r') goto yy277; if (yych <= '/') goto yy194; - if (yych <= '9') goto yy272; + if (yych <= '9') goto yy268; goto yy194; } } else { if (yych <= '_') { - if (yych <= 'Z') goto yy272; + if (yych <= 'Z') goto yy268; if (yych <= '^') goto yy194; - goto yy272; + goto yy268; } else { if (yych <= '`') goto yy194; - if (yych <= 'z') goto yy272; + if (yych <= 'z') goto yy268; if (yych <= '~') goto yy194; - goto yy272; + goto yy268; } } -yy274: - YYDEBUG(274, *YYCURSOR); +yy270: + YYDEBUG(270, *YYCURSOR); yych = *++YYCURSOR; if (yych == '\'') goto yy194; - if (yych <= '/') goto yy283; + if (yych <= '/') goto yy279; if (yych <= '9') goto yy194; - goto yy283; -yy275: - YYDEBUG(275, *YYCURSOR); + goto yy279; +yy271: + YYDEBUG(271, *YYCURSOR); yych = *++YYCURSOR; if (yych == '"') goto yy194; - if (yych <= '/') goto yy277; + if (yych <= '/') goto yy273; if (yych <= '9') goto yy194; - goto yy277; -yy276: - YYDEBUG(276, *YYCURSOR); + goto yy273; +yy272: + YYDEBUG(272, *YYCURSOR); ++YYCURSOR; YYFILL(3); yych = *YYCURSOR; -yy277: - YYDEBUG(277, *YYCURSOR); +yy273: + YYDEBUG(273, *YYCURSOR); if (yych <= 'Z') { if (yych <= '/') { if (yych != '"') goto yy194; } else { - if (yych <= '9') goto yy276; + if (yych <= '9') goto yy272; if (yych <= '@') goto yy194; - goto yy276; + goto yy272; } } else { if (yych <= '`') { - if (yych == '_') goto yy276; + if (yych == '_') goto yy272; goto yy194; } else { - if (yych <= 'z') goto yy276; + if (yych <= 'z') goto yy272; if (yych <= '~') goto yy194; - goto yy276; + goto yy272; } } -yy278: - YYDEBUG(278, *YYCURSOR); +yy274: + YYDEBUG(274, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '\n') goto yy279; - if (yych == '\r') goto yy281; + if (yych == '\n') goto yy275; + if (yych == '\r') goto yy277; goto yy194; -yy279: - YYDEBUG(279, *YYCURSOR); +yy275: + YYDEBUG(275, *YYCURSOR); ++YYCURSOR; -yy280: - YYDEBUG(280, *YYCURSOR); +yy276: + YYDEBUG(276, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2046 "Zend/zend_language_scanner.l" +#line 2049 "Zend/zend_language_scanner.l" { char *s; int bprefix = (yytext[0] != '<') ? 1 : 0; @@ -3913,255 +3892,255 @@ int lex_scan(zval *zendlval TSRMLS_DC) return T_START_HEREDOC; } -#line 3917 "Zend/zend_language_scanner.c" -yy281: - YYDEBUG(281, *YYCURSOR); +#line 3896 "Zend/zend_language_scanner.c" +yy277: + YYDEBUG(277, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '\n') goto yy279; - goto yy280; -yy282: - YYDEBUG(282, *YYCURSOR); + if (yych == '\n') goto yy275; + goto yy276; +yy278: + YYDEBUG(278, *YYCURSOR); ++YYCURSOR; YYFILL(3); yych = *YYCURSOR; -yy283: - YYDEBUG(283, *YYCURSOR); +yy279: + YYDEBUG(279, *YYCURSOR); if (yych <= 'Z') { if (yych <= '/') { - if (yych == '\'') goto yy278; + if (yych == '\'') goto yy274; goto yy194; } else { - if (yych <= '9') goto yy282; + if (yych <= '9') goto yy278; if (yych <= '@') goto yy194; - goto yy282; + goto yy278; } } else { if (yych <= '`') { - if (yych == '_') goto yy282; + if (yych == '_') goto yy278; goto yy194; } else { - if (yych <= 'z') goto yy282; + if (yych <= 'z') goto yy278; if (yych <= '~') goto yy194; - goto yy282; + goto yy278; } } -yy284: - YYDEBUG(284, *YYCURSOR); +yy280: + YYDEBUG(280, *YYCURSOR); yych = *++YYCURSOR; - if (yych != '=') goto yy260; - YYDEBUG(285, *YYCURSOR); + if (yych != '=') goto yy256; + YYDEBUG(281, *YYCURSOR); ++YYCURSOR; - YYDEBUG(286, *YYCURSOR); + YYDEBUG(282, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1351 "Zend/zend_language_scanner.l" +#line 1354 "Zend/zend_language_scanner.l" { return T_IS_NOT_IDENTICAL; } -#line 3961 "Zend/zend_language_scanner.c" -yy287: - YYDEBUG(287, *YYCURSOR); +#line 3940 "Zend/zend_language_scanner.c" +yy283: + YYDEBUG(283, *YYCURSOR); ++YYCURSOR; - YYDEBUG(288, *YYCURSOR); + YYDEBUG(284, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1371 "Zend/zend_language_scanner.l" +#line 1374 "Zend/zend_language_scanner.l" { return T_PLUS_EQUAL; } -#line 3971 "Zend/zend_language_scanner.c" -yy289: - YYDEBUG(289, *YYCURSOR); +#line 3950 "Zend/zend_language_scanner.c" +yy285: + YYDEBUG(285, *YYCURSOR); ++YYCURSOR; - YYDEBUG(290, *YYCURSOR); + YYDEBUG(286, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1339 "Zend/zend_language_scanner.l" +#line 1342 "Zend/zend_language_scanner.l" { return T_INC; } -#line 3981 "Zend/zend_language_scanner.c" -yy291: - YYDEBUG(291, *YYCURSOR); +#line 3960 "Zend/zend_language_scanner.c" +yy287: + YYDEBUG(287, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy292; + if (yych == 'S') goto yy288; if (yych != 's') goto yy187; -yy292: - YYDEBUG(292, *YYCURSOR); +yy288: + YYDEBUG(288, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy293; + if (yych == 'T') goto yy289; if (yych != 't') goto yy187; -yy293: - YYDEBUG(293, *YYCURSOR); +yy289: + YYDEBUG(289, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(294, *YYCURSOR); + YYDEBUG(290, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1327 "Zend/zend_language_scanner.l" +#line 1330 "Zend/zend_language_scanner.l" { return T_LIST; } -#line 4004 "Zend/zend_language_scanner.c" -yy295: - YYDEBUG(295, *YYCURSOR); +#line 3983 "Zend/zend_language_scanner.c" +yy291: + YYDEBUG(291, *YYCURSOR); ++YYCURSOR; - if ((yych = *YYCURSOR) == '=') goto yy299; - YYDEBUG(296, *YYCURSOR); + if ((yych = *YYCURSOR) == '=') goto yy295; + YYDEBUG(292, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1355 "Zend/zend_language_scanner.l" +#line 1358 "Zend/zend_language_scanner.l" { return T_IS_EQUAL; } -#line 4015 "Zend/zend_language_scanner.c" -yy297: - YYDEBUG(297, *YYCURSOR); +#line 3994 "Zend/zend_language_scanner.c" +yy293: + YYDEBUG(293, *YYCURSOR); ++YYCURSOR; - YYDEBUG(298, *YYCURSOR); + YYDEBUG(294, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1323 "Zend/zend_language_scanner.l" +#line 1326 "Zend/zend_language_scanner.l" { return T_DOUBLE_ARROW; } -#line 4025 "Zend/zend_language_scanner.c" -yy299: - YYDEBUG(299, *YYCURSOR); +#line 4004 "Zend/zend_language_scanner.c" +yy295: + YYDEBUG(295, *YYCURSOR); ++YYCURSOR; - YYDEBUG(300, *YYCURSOR); + YYDEBUG(296, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1347 "Zend/zend_language_scanner.l" +#line 1350 "Zend/zend_language_scanner.l" { return T_IS_IDENTICAL; } -#line 4035 "Zend/zend_language_scanner.c" -yy301: - YYDEBUG(301, *YYCURSOR); +#line 4014 "Zend/zend_language_scanner.c" +yy297: + YYDEBUG(297, *YYCURSOR); yych = *++YYCURSOR; YYDEBUG(-1, yych); switch (yych) { case 'C': - case 'c': goto yy303; + case 'c': goto yy299; case 'D': - case 'd': goto yy308; + case 'd': goto yy304; case 'F': - case 'f': goto yy305; + case 'f': goto yy301; case 'H': - case 'h': goto yy302; + case 'h': goto yy298; case 'L': - case 'l': goto yy307; + case 'l': goto yy303; case 'M': - case 'm': goto yy306; + case 'm': goto yy302; case 'N': - case 'n': goto yy309; + case 'n': goto yy305; case 'T': - case 't': goto yy304; + case 't': goto yy300; default: goto yy187; } -yy302: - YYDEBUG(302, *YYCURSOR); +yy298: + YYDEBUG(298, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy370; - if (yych == 'a') goto yy370; + if (yych == 'A') goto yy366; + if (yych == 'a') goto yy366; goto yy187; -yy303: - YYDEBUG(303, *YYCURSOR); +yy299: + YYDEBUG(299, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy363; - if (yych == 'l') goto yy363; + if (yych == 'L') goto yy359; + if (yych == 'l') goto yy359; goto yy187; -yy304: - YYDEBUG(304, *YYCURSOR); +yy300: + YYDEBUG(300, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy356; - if (yych == 'r') goto yy356; + if (yych == 'R') goto yy352; + if (yych == 'r') goto yy352; goto yy187; -yy305: - YYDEBUG(305, *YYCURSOR); +yy301: + YYDEBUG(301, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'U') { - if (yych == 'I') goto yy340; + if (yych == 'I') goto yy336; if (yych <= 'T') goto yy187; - goto yy341; + goto yy337; } else { if (yych <= 'i') { if (yych <= 'h') goto yy187; - goto yy340; + goto yy336; } else { - if (yych == 'u') goto yy341; + if (yych == 'u') goto yy337; goto yy187; } } +yy302: + YYDEBUG(302, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy328; + if (yych == 'e') goto yy328; + goto yy187; +yy303: + YYDEBUG(303, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'I') goto yy322; + if (yych == 'i') goto yy322; + goto yy187; +yy304: + YYDEBUG(304, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'I') goto yy317; + if (yych == 'i') goto yy317; + goto yy187; +yy305: + YYDEBUG(305, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'A') goto yy306; + if (yych != 'a') goto yy187; yy306: YYDEBUG(306, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy332; - if (yych == 'e') goto yy332; - goto yy187; + if (yych == 'M') goto yy307; + if (yych != 'm') goto yy187; yy307: YYDEBUG(307, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy326; - if (yych == 'i') goto yy326; - goto yy187; + if (yych == 'E') goto yy308; + if (yych != 'e') goto yy187; yy308: YYDEBUG(308, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy321; - if (yych == 'i') goto yy321; - goto yy187; + if (yych == 'S') goto yy309; + if (yych != 's') goto yy187; yy309: YYDEBUG(309, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy310; - if (yych != 'a') goto yy187; + if (yych == 'P') goto yy310; + if (yych != 'p') goto yy187; yy310: YYDEBUG(310, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'M') goto yy311; - if (yych != 'm') goto yy187; + if (yych == 'A') goto yy311; + if (yych != 'a') goto yy187; yy311: YYDEBUG(311, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy312; - if (yych != 'e') goto yy187; + if (yych == 'C') goto yy312; + if (yych != 'c') goto yy187; yy312: YYDEBUG(312, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy313; - if (yych != 's') goto yy187; + if (yych == 'E') goto yy313; + if (yych != 'e') goto yy187; yy313: YYDEBUG(313, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'P') goto yy314; - if (yych != 'p') goto yy187; -yy314: - YYDEBUG(314, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'A') goto yy315; - if (yych != 'a') goto yy187; -yy315: - YYDEBUG(315, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'C') goto yy316; - if (yych != 'c') goto yy187; -yy316: - YYDEBUG(316, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy317; - if (yych != 'e') goto yy187; -yy317: - YYDEBUG(317, *YYCURSOR); - yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(318, *YYCURSOR); + YYDEBUG(314, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(319, *YYCURSOR); + YYDEBUG(315, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(320, *YYCURSOR); + YYDEBUG(316, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1665 "Zend/zend_language_scanner.l" +#line 1668 "Zend/zend_language_scanner.l" { if (CG(current_namespace)) { *zendlval = *CG(current_namespace); @@ -4171,27 +4150,27 @@ int lex_scan(zval *zendlval TSRMLS_DC) } return T_NS_C; } -#line 4175 "Zend/zend_language_scanner.c" -yy321: - YYDEBUG(321, *YYCURSOR); +#line 4154 "Zend/zend_language_scanner.c" +yy317: + YYDEBUG(317, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy322; + if (yych == 'R') goto yy318; if (yych != 'r') goto yy187; -yy322: - YYDEBUG(322, *YYCURSOR); +yy318: + YYDEBUG(318, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(323, *YYCURSOR); + YYDEBUG(319, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(324, *YYCURSOR); + YYDEBUG(320, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(325, *YYCURSOR); + YYDEBUG(321, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1640 "Zend/zend_language_scanner.l" +#line 1643 "Zend/zend_language_scanner.l" { char *filename = zend_get_compiled_filename(TSRMLS_C); const size_t filename_len = strlen(filename); @@ -4216,72 +4195,72 @@ int lex_scan(zval *zendlval TSRMLS_DC) ZVAL_STRING(zendlval, dirname, 0); return T_DIR; } -#line 4220 "Zend/zend_language_scanner.c" -yy326: - YYDEBUG(326, *YYCURSOR); +#line 4199 "Zend/zend_language_scanner.c" +yy322: + YYDEBUG(322, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy327; + if (yych == 'N') goto yy323; if (yych != 'n') goto yy187; -yy327: - YYDEBUG(327, *YYCURSOR); +yy323: + YYDEBUG(323, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy328; + if (yych == 'E') goto yy324; if (yych != 'e') goto yy187; -yy328: - YYDEBUG(328, *YYCURSOR); +yy324: + YYDEBUG(324, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(329, *YYCURSOR); + YYDEBUG(325, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(330, *YYCURSOR); + YYDEBUG(326, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(331, *YYCURSOR); + YYDEBUG(327, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1625 "Zend/zend_language_scanner.l" +#line 1628 "Zend/zend_language_scanner.l" { ZVAL_LONG(zendlval, CG(zend_lineno)); return T_LINE; } -#line 4250 "Zend/zend_language_scanner.c" -yy332: - YYDEBUG(332, *YYCURSOR); +#line 4229 "Zend/zend_language_scanner.c" +yy328: + YYDEBUG(328, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy333; + if (yych == 'T') goto yy329; if (yych != 't') goto yy187; -yy333: - YYDEBUG(333, *YYCURSOR); +yy329: + YYDEBUG(329, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy334; + if (yych == 'H') goto yy330; if (yych != 'h') goto yy187; -yy334: - YYDEBUG(334, *YYCURSOR); +yy330: + YYDEBUG(330, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy335; + if (yych == 'O') goto yy331; if (yych != 'o') goto yy187; -yy335: - YYDEBUG(335, *YYCURSOR); +yy331: + YYDEBUG(331, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy336; + if (yych == 'D') goto yy332; if (yych != 'd') goto yy187; -yy336: - YYDEBUG(336, *YYCURSOR); +yy332: + YYDEBUG(332, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(337, *YYCURSOR); + YYDEBUG(333, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(338, *YYCURSOR); + YYDEBUG(334, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(339, *YYCURSOR); + YYDEBUG(335, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1612 "Zend/zend_language_scanner.l" +#line 1615 "Zend/zend_language_scanner.l" { const char *class_name = CG(active_class_entry) ? CG(active_class_entry)->name : NULL; const char *func_name = CG(active_op_array)? CG(active_op_array)->function_name : NULL; @@ -4294,58 +4273,58 @@ int lex_scan(zval *zendlval TSRMLS_DC) zendlval->type = IS_STRING; return T_METHOD_C; } -#line 4298 "Zend/zend_language_scanner.c" -yy340: - YYDEBUG(340, *YYCURSOR); +#line 4277 "Zend/zend_language_scanner.c" +yy336: + YYDEBUG(336, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy351; - if (yych == 'l') goto yy351; + if (yych == 'L') goto yy347; + if (yych == 'l') goto yy347; goto yy187; -yy341: - YYDEBUG(341, *YYCURSOR); +yy337: + YYDEBUG(337, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy342; + if (yych == 'N') goto yy338; if (yych != 'n') goto yy187; -yy342: - YYDEBUG(342, *YYCURSOR); +yy338: + YYDEBUG(338, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy343; + if (yych == 'C') goto yy339; if (yych != 'c') goto yy187; -yy343: - YYDEBUG(343, *YYCURSOR); +yy339: + YYDEBUG(339, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy344; + if (yych == 'T') goto yy340; if (yych != 't') goto yy187; -yy344: - YYDEBUG(344, *YYCURSOR); +yy340: + YYDEBUG(340, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy345; + if (yych == 'I') goto yy341; if (yych != 'i') goto yy187; -yy345: - YYDEBUG(345, *YYCURSOR); +yy341: + YYDEBUG(341, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy346; + if (yych == 'O') goto yy342; if (yych != 'o') goto yy187; -yy346: - YYDEBUG(346, *YYCURSOR); +yy342: + YYDEBUG(342, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy347; + if (yych == 'N') goto yy343; if (yych != 'n') goto yy187; -yy347: - YYDEBUG(347, *YYCURSOR); +yy343: + YYDEBUG(343, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(348, *YYCURSOR); + YYDEBUG(344, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(349, *YYCURSOR); + YYDEBUG(345, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(350, *YYCURSOR); + YYDEBUG(346, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1602 "Zend/zend_language_scanner.l" +#line 1605 "Zend/zend_language_scanner.l" { zend_op_array *op_array = CG(active_op_array); if (op_array && op_array->function_name) { @@ -4355,27 +4334,27 @@ int lex_scan(zval *zendlval TSRMLS_DC) } return T_FUNC_C; } -#line 4359 "Zend/zend_language_scanner.c" -yy351: - YYDEBUG(351, *YYCURSOR); +#line 4338 "Zend/zend_language_scanner.c" +yy347: + YYDEBUG(347, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy352; + if (yych == 'E') goto yy348; if (yych != 'e') goto yy187; -yy352: - YYDEBUG(352, *YYCURSOR); +yy348: + YYDEBUG(348, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(353, *YYCURSOR); + YYDEBUG(349, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(354, *YYCURSOR); + YYDEBUG(350, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(355, *YYCURSOR); + YYDEBUG(351, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1630 "Zend/zend_language_scanner.l" +#line 1633 "Zend/zend_language_scanner.l" { char *filename = zend_get_compiled_filename(TSRMLS_C); @@ -4385,37 +4364,37 @@ int lex_scan(zval *zendlval TSRMLS_DC) ZVAL_STRING(zendlval, filename, 1); return T_FILE; } -#line 4389 "Zend/zend_language_scanner.c" -yy356: - YYDEBUG(356, *YYCURSOR); +#line 4368 "Zend/zend_language_scanner.c" +yy352: + YYDEBUG(352, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy357; + if (yych == 'A') goto yy353; if (yych != 'a') goto yy187; -yy357: - YYDEBUG(357, *YYCURSOR); +yy353: + YYDEBUG(353, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy358; + if (yych == 'I') goto yy354; if (yych != 'i') goto yy187; -yy358: - YYDEBUG(358, *YYCURSOR); +yy354: + YYDEBUG(354, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy359; + if (yych == 'T') goto yy355; if (yych != 't') goto yy187; -yy359: - YYDEBUG(359, *YYCURSOR); +yy355: + YYDEBUG(355, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(360, *YYCURSOR); + YYDEBUG(356, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(361, *YYCURSOR); + YYDEBUG(357, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(362, *YYCURSOR); + YYDEBUG(358, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1592 "Zend/zend_language_scanner.l" +#line 1595 "Zend/zend_language_scanner.l" { zend_class_entry *ce = CG(active_class_entry); if (ce && ce->name && ZEND_ACC_TRAIT == (ce->ce_flags & ZEND_ACC_TRAIT)) { @@ -4425,37 +4404,37 @@ int lex_scan(zval *zendlval TSRMLS_DC) } return T_TRAIT_C; } -#line 4429 "Zend/zend_language_scanner.c" -yy363: - YYDEBUG(363, *YYCURSOR); +#line 4408 "Zend/zend_language_scanner.c" +yy359: + YYDEBUG(359, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy364; + if (yych == 'A') goto yy360; if (yych != 'a') goto yy187; -yy364: - YYDEBUG(364, *YYCURSOR); +yy360: + YYDEBUG(360, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy365; + if (yych == 'S') goto yy361; if (yych != 's') goto yy187; -yy365: - YYDEBUG(365, *YYCURSOR); +yy361: + YYDEBUG(361, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy366; + if (yych == 'S') goto yy362; if (yych != 's') goto yy187; -yy366: - YYDEBUG(366, *YYCURSOR); +yy362: + YYDEBUG(362, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(367, *YYCURSOR); + YYDEBUG(363, *YYCURSOR); yych = *++YYCURSOR; if (yych != '_') goto yy187; - YYDEBUG(368, *YYCURSOR); + YYDEBUG(364, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(369, *YYCURSOR); + YYDEBUG(365, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1574 "Zend/zend_language_scanner.l" +#line 1577 "Zend/zend_language_scanner.l" { zend_class_entry *ce = CG(active_class_entry); if (ce && ZEND_ACC_TRAIT == (ce->ce_flags & ZEND_ACC_TRAIT)) { @@ -4473,60 +4452,84 @@ int lex_scan(zval *zendlval TSRMLS_DC) } return T_CLASS_C; } -#line 4477 "Zend/zend_language_scanner.c" +#line 4456 "Zend/zend_language_scanner.c" +yy366: + YYDEBUG(366, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'L') goto yy367; + if (yych != 'l') goto yy187; +yy367: + YYDEBUG(367, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'T') goto yy368; + if (yych != 't') goto yy187; +yy368: + YYDEBUG(368, *YYCURSOR); + yych = *++YYCURSOR; + if (yych != '_') goto yy187; + YYDEBUG(369, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'C') goto yy370; + if (yych != 'c') goto yy187; yy370: YYDEBUG(370, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy371; - if (yych != 'l') goto yy187; + if (yych == 'O') goto yy371; + if (yych != 'o') goto yy187; yy371: YYDEBUG(371, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy372; - if (yych != 't') goto yy187; + if (yych == 'M') goto yy372; + if (yych != 'm') goto yy187; yy372: YYDEBUG(372, *YYCURSOR); yych = *++YYCURSOR; - if (yych != '_') goto yy187; + if (yych == 'P') goto yy373; + if (yych != 'p') goto yy187; +yy373: YYDEBUG(373, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy374; - if (yych != 'c') goto yy187; + if (yych == 'I') goto yy374; + if (yych != 'i') goto yy187; yy374: YYDEBUG(374, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy375; - if (yych != 'o') goto yy187; + if (yych == 'L') goto yy375; + if (yych != 'l') goto yy187; yy375: YYDEBUG(375, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'M') goto yy376; - if (yych != 'm') goto yy187; + if (yych == 'E') goto yy376; + if (yych != 'e') goto yy187; yy376: YYDEBUG(376, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'P') goto yy377; - if (yych != 'p') goto yy187; + if (yych == 'R') goto yy377; + if (yych != 'r') goto yy187; yy377: YYDEBUG(377, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'I') goto yy378; - if (yych != 'i') goto yy187; -yy378: + ++YYCURSOR; + if (yybm[0+(yych = *YYCURSOR)] & 4) { + goto yy186; + } YYDEBUG(378, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy379; - if (yych != 'l') goto yy187; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1294 "Zend/zend_language_scanner.l" + { + return T_HALT_COMPILER; +} +#line 4522 "Zend/zend_language_scanner.c" yy379: YYDEBUG(379, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy380; - if (yych != 'e') goto yy187; + if (yych == 'S') goto yy383; + if (yych == 's') goto yy383; + goto yy187; yy380: YYDEBUG(380, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy381; - if (yych != 'r') goto yy187; + if (yych == 'E') goto yy381; + if (yych != 'e') goto yy187; yy381: YYDEBUG(381, *YYCURSOR); ++YYCURSOR; @@ -4535,22 +4538,21 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(382, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1291 "Zend/zend_language_scanner.l" +#line 1274 "Zend/zend_language_scanner.l" { - return T_HALT_COMPILER; + return T_USE; } -#line 4543 "Zend/zend_language_scanner.c" +#line 4546 "Zend/zend_language_scanner.c" yy383: YYDEBUG(383, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy387; - if (yych == 's') goto yy387; - goto yy187; + if (yych == 'E') goto yy384; + if (yych != 'e') goto yy187; yy384: YYDEBUG(384, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy385; - if (yych != 'e') goto yy187; + if (yych == 'T') goto yy385; + if (yych != 't') goto yy187; yy385: YYDEBUG(385, *YYCURSOR); ++YYCURSOR; @@ -4559,742 +4561,743 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(386, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1271 "Zend/zend_language_scanner.l" +#line 1322 "Zend/zend_language_scanner.l" { - return T_USE; + return T_UNSET; } -#line 4567 "Zend/zend_language_scanner.c" +#line 4569 "Zend/zend_language_scanner.c" yy387: YYDEBUG(387, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy388; - if (yych != 'e') goto yy187; -yy388: - YYDEBUG(388, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy389; - if (yych != 't') goto yy187; -yy389: - YYDEBUG(389, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 4) { - goto yy186; - } - YYDEBUG(390, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1319 "Zend/zend_language_scanner.l" - { - return T_UNSET; -} -#line 4590 "Zend/zend_language_scanner.c" -yy391: - YYDEBUG(391, *YYCURSOR); ++YYCURSOR; YYFILL(7); yych = *YYCURSOR; -yy392: - YYDEBUG(392, *YYCURSOR); +yy388: + YYDEBUG(388, *YYCURSOR); if (yych <= 'S') { if (yych <= 'D') { if (yych <= ' ') { - if (yych == '\t') goto yy391; + if (yych == '\t') goto yy387; if (yych <= 0x1F) goto yy194; - goto yy391; + goto yy387; } else { if (yych <= 'A') { if (yych <= '@') goto yy194; - goto yy396; + goto yy392; } else { - if (yych <= 'B') goto yy394; + if (yych <= 'B') goto yy390; if (yych <= 'C') goto yy194; - goto yy399; + goto yy395; } } } else { if (yych <= 'I') { - if (yych == 'F') goto yy400; + if (yych == 'F') goto yy396; if (yych <= 'H') goto yy194; - goto yy401; + goto yy397; } else { if (yych <= 'O') { if (yych <= 'N') goto yy194; - goto yy395; + goto yy391; } else { if (yych <= 'Q') goto yy194; - if (yych <= 'R') goto yy398; - goto yy397; + if (yych <= 'R') goto yy394; + goto yy393; } } } } else { if (yych <= 'f') { if (yych <= 'a') { - if (yych == 'U') goto yy393; + if (yych == 'U') goto yy389; if (yych <= '`') goto yy194; - goto yy396; + goto yy392; } else { if (yych <= 'c') { - if (yych <= 'b') goto yy394; + if (yych <= 'b') goto yy390; goto yy194; } else { - if (yych <= 'd') goto yy399; + if (yych <= 'd') goto yy395; if (yych <= 'e') goto yy194; - goto yy400; + goto yy396; } } } else { if (yych <= 'q') { if (yych <= 'i') { if (yych <= 'h') goto yy194; - goto yy401; + goto yy397; } else { - if (yych == 'o') goto yy395; + if (yych == 'o') goto yy391; goto yy194; } } else { if (yych <= 's') { - if (yych <= 'r') goto yy398; - goto yy397; + if (yych <= 'r') goto yy394; + goto yy393; } else { if (yych != 'u') goto yy194; } } } } -yy393: - YYDEBUG(393, *YYCURSOR); +yy389: + YYDEBUG(389, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy460; - if (yych == 'n') goto yy460; + if (yych == 'N') goto yy456; + if (yych == 'n') goto yy456; goto yy194; -yy394: - YYDEBUG(394, *YYCURSOR); +yy390: + YYDEBUG(390, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'O') { - if (yych == 'I') goto yy447; + if (yych == 'I') goto yy443; if (yych <= 'N') goto yy194; - goto yy448; + goto yy444; } else { if (yych <= 'i') { if (yych <= 'h') goto yy194; - goto yy447; + goto yy443; } else { - if (yych == 'o') goto yy448; + if (yych == 'o') goto yy444; goto yy194; } } +yy391: + YYDEBUG(391, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'B') goto yy435; + if (yych == 'b') goto yy435; + goto yy194; +yy392: + YYDEBUG(392, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'R') goto yy428; + if (yych == 'r') goto yy428; + goto yy194; +yy393: + YYDEBUG(393, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'T') goto yy420; + if (yych == 't') goto yy420; + goto yy194; +yy394: + YYDEBUG(394, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy418; + if (yych == 'e') goto yy418; + goto yy194; yy395: YYDEBUG(395, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'B') goto yy439; - if (yych == 'b') goto yy439; + if (yych == 'O') goto yy414; + if (yych == 'o') goto yy414; goto yy194; yy396: YYDEBUG(396, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy432; - if (yych == 'r') goto yy432; + if (yych == 'L') goto yy407; + if (yych == 'l') goto yy407; goto yy194; yy397: YYDEBUG(397, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy424; - if (yych == 't') goto yy424; - goto yy194; + if (yych == 'N') goto yy398; + if (yych != 'n') goto yy194; yy398: YYDEBUG(398, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy422; - if (yych == 'e') goto yy422; - goto yy194; + if (yych == 'T') goto yy399; + if (yych != 't') goto yy194; yy399: YYDEBUG(399, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy418; - if (yych == 'o') goto yy418; - goto yy194; + if (yych == 'E') goto yy400; + if (yych != 'e') goto yy402; yy400: YYDEBUG(400, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy411; - if (yych == 'l') goto yy411; + if (yych == 'G') goto yy405; + if (yych == 'g') goto yy405; goto yy194; yy401: YYDEBUG(401, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'N') goto yy402; - if (yych != 'n') goto yy194; -yy402: - YYDEBUG(402, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy403; - if (yych != 't') goto yy194; -yy403: - YYDEBUG(403, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy404; - if (yych != 'e') goto yy406; -yy404: - YYDEBUG(404, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'G') goto yy409; - if (yych == 'g') goto yy409; - goto yy194; -yy405: - YYDEBUG(405, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy406: - YYDEBUG(406, *YYCURSOR); +yy402: + YYDEBUG(402, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy405; + if (yych == '\t') goto yy401; goto yy194; } else { - if (yych <= ' ') goto yy405; + if (yych <= ' ') goto yy401; if (yych != ')') goto yy194; } - YYDEBUG(407, *YYCURSOR); + YYDEBUG(403, *YYCURSOR); ++YYCURSOR; - YYDEBUG(408, *YYCURSOR); + YYDEBUG(404, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1219 "Zend/zend_language_scanner.l" +#line 1222 "Zend/zend_language_scanner.l" { return T_INT_CAST; } -#line 4766 "Zend/zend_language_scanner.c" -yy409: - YYDEBUG(409, *YYCURSOR); +#line 4745 "Zend/zend_language_scanner.c" +yy405: + YYDEBUG(405, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy410; + if (yych == 'E') goto yy406; if (yych != 'e') goto yy194; -yy410: - YYDEBUG(410, *YYCURSOR); +yy406: + YYDEBUG(406, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy405; - if (yych == 'r') goto yy405; + if (yych == 'R') goto yy401; + if (yych == 'r') goto yy401; goto yy194; -yy411: - YYDEBUG(411, *YYCURSOR); +yy407: + YYDEBUG(407, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy412; + if (yych == 'O') goto yy408; if (yych != 'o') goto yy194; -yy412: - YYDEBUG(412, *YYCURSOR); +yy408: + YYDEBUG(408, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy413; + if (yych == 'A') goto yy409; if (yych != 'a') goto yy194; -yy413: - YYDEBUG(413, *YYCURSOR); +yy409: + YYDEBUG(409, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy414; + if (yych == 'T') goto yy410; if (yych != 't') goto yy194; -yy414: - YYDEBUG(414, *YYCURSOR); +yy410: + YYDEBUG(410, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(415, *YYCURSOR); + YYDEBUG(411, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy414; + if (yych == '\t') goto yy410; goto yy194; } else { - if (yych <= ' ') goto yy414; + if (yych <= ' ') goto yy410; if (yych != ')') goto yy194; } - YYDEBUG(416, *YYCURSOR); + YYDEBUG(412, *YYCURSOR); ++YYCURSOR; - YYDEBUG(417, *YYCURSOR); + YYDEBUG(413, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1223 "Zend/zend_language_scanner.l" +#line 1226 "Zend/zend_language_scanner.l" { return T_DOUBLE_CAST; } -#line 4814 "Zend/zend_language_scanner.c" -yy418: - YYDEBUG(418, *YYCURSOR); +#line 4793 "Zend/zend_language_scanner.c" +yy414: + YYDEBUG(414, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy419; + if (yych == 'U') goto yy415; if (yych != 'u') goto yy194; -yy419: - YYDEBUG(419, *YYCURSOR); +yy415: + YYDEBUG(415, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'B') goto yy420; + if (yych == 'B') goto yy416; if (yych != 'b') goto yy194; -yy420: - YYDEBUG(420, *YYCURSOR); +yy416: + YYDEBUG(416, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy421; + if (yych == 'L') goto yy417; if (yych != 'l') goto yy194; -yy421: - YYDEBUG(421, *YYCURSOR); +yy417: + YYDEBUG(417, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy414; - if (yych == 'e') goto yy414; + if (yych == 'E') goto yy410; + if (yych == 'e') goto yy410; goto yy194; -yy422: - YYDEBUG(422, *YYCURSOR); +yy418: + YYDEBUG(418, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy423; + if (yych == 'A') goto yy419; if (yych != 'a') goto yy194; -yy423: - YYDEBUG(423, *YYCURSOR); +yy419: + YYDEBUG(419, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy414; - if (yych == 'l') goto yy414; + if (yych == 'L') goto yy410; + if (yych == 'l') goto yy410; goto yy194; -yy424: - YYDEBUG(424, *YYCURSOR); +yy420: + YYDEBUG(420, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy425; + if (yych == 'R') goto yy421; if (yych != 'r') goto yy194; -yy425: - YYDEBUG(425, *YYCURSOR); +yy421: + YYDEBUG(421, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy426; + if (yych == 'I') goto yy422; if (yych != 'i') goto yy194; -yy426: - YYDEBUG(426, *YYCURSOR); +yy422: + YYDEBUG(422, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy427; + if (yych == 'N') goto yy423; if (yych != 'n') goto yy194; -yy427: - YYDEBUG(427, *YYCURSOR); +yy423: + YYDEBUG(423, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'G') goto yy428; + if (yych == 'G') goto yy424; if (yych != 'g') goto yy194; -yy428: - YYDEBUG(428, *YYCURSOR); +yy424: + YYDEBUG(424, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(429, *YYCURSOR); + YYDEBUG(425, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy428; + if (yych == '\t') goto yy424; goto yy194; } else { - if (yych <= ' ') goto yy428; + if (yych <= ' ') goto yy424; if (yych != ')') goto yy194; } - YYDEBUG(430, *YYCURSOR); + YYDEBUG(426, *YYCURSOR); ++YYCURSOR; - YYDEBUG(431, *YYCURSOR); + YYDEBUG(427, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1227 "Zend/zend_language_scanner.l" +#line 1230 "Zend/zend_language_scanner.l" { return T_STRING_CAST; } -#line 4888 "Zend/zend_language_scanner.c" -yy432: - YYDEBUG(432, *YYCURSOR); +#line 4867 "Zend/zend_language_scanner.c" +yy428: + YYDEBUG(428, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy433; + if (yych == 'R') goto yy429; if (yych != 'r') goto yy194; -yy433: - YYDEBUG(433, *YYCURSOR); +yy429: + YYDEBUG(429, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy434; + if (yych == 'A') goto yy430; if (yych != 'a') goto yy194; -yy434: - YYDEBUG(434, *YYCURSOR); +yy430: + YYDEBUG(430, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy435; + if (yych == 'Y') goto yy431; if (yych != 'y') goto yy194; -yy435: - YYDEBUG(435, *YYCURSOR); +yy431: + YYDEBUG(431, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(436, *YYCURSOR); + YYDEBUG(432, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy435; + if (yych == '\t') goto yy431; goto yy194; } else { - if (yych <= ' ') goto yy435; + if (yych <= ' ') goto yy431; if (yych != ')') goto yy194; } - YYDEBUG(437, *YYCURSOR); + YYDEBUG(433, *YYCURSOR); ++YYCURSOR; - YYDEBUG(438, *YYCURSOR); + YYDEBUG(434, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1231 "Zend/zend_language_scanner.l" +#line 1234 "Zend/zend_language_scanner.l" { return T_ARRAY_CAST; } -#line 4925 "Zend/zend_language_scanner.c" -yy439: - YYDEBUG(439, *YYCURSOR); +#line 4904 "Zend/zend_language_scanner.c" +yy435: + YYDEBUG(435, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'J') goto yy440; + if (yych == 'J') goto yy436; if (yych != 'j') goto yy194; -yy440: - YYDEBUG(440, *YYCURSOR); +yy436: + YYDEBUG(436, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy441; + if (yych == 'E') goto yy437; if (yych != 'e') goto yy194; -yy441: - YYDEBUG(441, *YYCURSOR); +yy437: + YYDEBUG(437, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy442; + if (yych == 'C') goto yy438; if (yych != 'c') goto yy194; -yy442: - YYDEBUG(442, *YYCURSOR); +yy438: + YYDEBUG(438, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy443; + if (yych == 'T') goto yy439; if (yych != 't') goto yy194; -yy443: - YYDEBUG(443, *YYCURSOR); +yy439: + YYDEBUG(439, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(444, *YYCURSOR); + YYDEBUG(440, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy443; + if (yych == '\t') goto yy439; goto yy194; } else { - if (yych <= ' ') goto yy443; + if (yych <= ' ') goto yy439; if (yych != ')') goto yy194; } - YYDEBUG(445, *YYCURSOR); + YYDEBUG(441, *YYCURSOR); ++YYCURSOR; - YYDEBUG(446, *YYCURSOR); + YYDEBUG(442, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1235 "Zend/zend_language_scanner.l" +#line 1238 "Zend/zend_language_scanner.l" { return T_OBJECT_CAST; } -#line 4967 "Zend/zend_language_scanner.c" -yy447: - YYDEBUG(447, *YYCURSOR); +#line 4946 "Zend/zend_language_scanner.c" +yy443: + YYDEBUG(443, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy457; - if (yych == 'n') goto yy457; + if (yych == 'N') goto yy453; + if (yych == 'n') goto yy453; goto yy194; -yy448: - YYDEBUG(448, *YYCURSOR); +yy444: + YYDEBUG(444, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy449; + if (yych == 'O') goto yy445; if (yych != 'o') goto yy194; -yy449: - YYDEBUG(449, *YYCURSOR); +yy445: + YYDEBUG(445, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy450; + if (yych == 'L') goto yy446; if (yych != 'l') goto yy194; -yy450: - YYDEBUG(450, *YYCURSOR); +yy446: + YYDEBUG(446, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy455; - if (yych == 'e') goto yy455; - goto yy452; -yy451: - YYDEBUG(451, *YYCURSOR); + if (yych == 'E') goto yy451; + if (yych == 'e') goto yy451; + goto yy448; +yy447: + YYDEBUG(447, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy452: - YYDEBUG(452, *YYCURSOR); +yy448: + YYDEBUG(448, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy451; + if (yych == '\t') goto yy447; goto yy194; } else { - if (yych <= ' ') goto yy451; + if (yych <= ' ') goto yy447; if (yych != ')') goto yy194; } - YYDEBUG(453, *YYCURSOR); + YYDEBUG(449, *YYCURSOR); ++YYCURSOR; - YYDEBUG(454, *YYCURSOR); + YYDEBUG(450, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1239 "Zend/zend_language_scanner.l" +#line 1242 "Zend/zend_language_scanner.l" { return T_BOOL_CAST; } -#line 5012 "Zend/zend_language_scanner.c" -yy455: - YYDEBUG(455, *YYCURSOR); +#line 4991 "Zend/zend_language_scanner.c" +yy451: + YYDEBUG(451, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy456; + if (yych == 'A') goto yy452; if (yych != 'a') goto yy194; -yy456: - YYDEBUG(456, *YYCURSOR); +yy452: + YYDEBUG(452, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy451; - if (yych == 'n') goto yy451; + if (yych == 'N') goto yy447; + if (yych == 'n') goto yy447; goto yy194; -yy457: - YYDEBUG(457, *YYCURSOR); +yy453: + YYDEBUG(453, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy458; + if (yych == 'A') goto yy454; if (yych != 'a') goto yy194; -yy458: - YYDEBUG(458, *YYCURSOR); +yy454: + YYDEBUG(454, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy459; + if (yych == 'R') goto yy455; if (yych != 'r') goto yy194; -yy459: - YYDEBUG(459, *YYCURSOR); +yy455: + YYDEBUG(455, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy428; - if (yych == 'y') goto yy428; + if (yych == 'Y') goto yy424; + if (yych == 'y') goto yy424; goto yy194; -yy460: - YYDEBUG(460, *YYCURSOR); +yy456: + YYDEBUG(456, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy461; + if (yych == 'S') goto yy457; if (yych != 's') goto yy194; -yy461: - YYDEBUG(461, *YYCURSOR); +yy457: + YYDEBUG(457, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy462; + if (yych == 'E') goto yy458; if (yych != 'e') goto yy194; -yy462: - YYDEBUG(462, *YYCURSOR); +yy458: + YYDEBUG(458, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy463; + if (yych == 'T') goto yy459; if (yych != 't') goto yy194; -yy463: - YYDEBUG(463, *YYCURSOR); +yy459: + YYDEBUG(459, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(464, *YYCURSOR); + YYDEBUG(460, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy463; + if (yych == '\t') goto yy459; goto yy194; } else { - if (yych <= ' ') goto yy463; + if (yych <= ' ') goto yy459; if (yych != ')') goto yy194; } - YYDEBUG(465, *YYCURSOR); + YYDEBUG(461, *YYCURSOR); ++YYCURSOR; - YYDEBUG(466, *YYCURSOR); + YYDEBUG(462, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1243 "Zend/zend_language_scanner.l" +#line 1246 "Zend/zend_language_scanner.l" { return T_UNSET_CAST; } -#line 5076 "Zend/zend_language_scanner.c" -yy467: - YYDEBUG(467, *YYCURSOR); +#line 5055 "Zend/zend_language_scanner.c" +yy463: + YYDEBUG(463, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy468; + if (yych == 'R') goto yy464; if (yych != 'r') goto yy187; -yy468: - YYDEBUG(468, *YYCURSOR); +yy464: + YYDEBUG(464, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(469, *YYCURSOR); + YYDEBUG(465, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1215 "Zend/zend_language_scanner.l" +#line 1218 "Zend/zend_language_scanner.l" { return T_VAR; } -#line 5094 "Zend/zend_language_scanner.c" -yy470: - YYDEBUG(470, *YYCURSOR); +#line 5073 "Zend/zend_language_scanner.c" +yy466: + YYDEBUG(466, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'M') goto yy474; - if (yych == 'm') goto yy474; + if (yych == 'M') goto yy470; + if (yych == 'm') goto yy470; goto yy187; -yy471: - YYDEBUG(471, *YYCURSOR); +yy467: + YYDEBUG(467, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'W') goto yy472; + if (yych == 'W') goto yy468; if (yych != 'w') goto yy187; -yy472: - YYDEBUG(472, *YYCURSOR); +yy468: + YYDEBUG(468, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(473, *YYCURSOR); + YYDEBUG(469, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1207 "Zend/zend_language_scanner.l" +#line 1210 "Zend/zend_language_scanner.l" { return T_NEW; } -#line 5118 "Zend/zend_language_scanner.c" -yy474: - YYDEBUG(474, *YYCURSOR); +#line 5097 "Zend/zend_language_scanner.c" +yy470: + YYDEBUG(470, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy475; + if (yych == 'E') goto yy471; if (yych != 'e') goto yy187; -yy475: - YYDEBUG(475, *YYCURSOR); +yy471: + YYDEBUG(471, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy476; + if (yych == 'S') goto yy472; if (yych != 's') goto yy187; -yy476: - YYDEBUG(476, *YYCURSOR); +yy472: + YYDEBUG(472, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'P') goto yy477; + if (yych == 'P') goto yy473; if (yych != 'p') goto yy187; -yy477: - YYDEBUG(477, *YYCURSOR); +yy473: + YYDEBUG(473, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy478; + if (yych == 'A') goto yy474; if (yych != 'a') goto yy187; -yy478: - YYDEBUG(478, *YYCURSOR); +yy474: + YYDEBUG(474, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy479; + if (yych == 'C') goto yy475; if (yych != 'c') goto yy187; -yy479: - YYDEBUG(479, *YYCURSOR); +yy475: + YYDEBUG(475, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy480; + if (yych == 'E') goto yy476; if (yych != 'e') goto yy187; -yy480: - YYDEBUG(480, *YYCURSOR); +yy476: + YYDEBUG(476, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(481, *YYCURSOR); + YYDEBUG(477, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1267 "Zend/zend_language_scanner.l" +#line 1270 "Zend/zend_language_scanner.l" { return T_NAMESPACE; } -#line 5161 "Zend/zend_language_scanner.c" +#line 5140 "Zend/zend_language_scanner.c" +yy478: + YYDEBUG(478, *YYCURSOR); + yyaccept = 3; + YYMARKER = ++YYCURSOR; + YYFILL(3); + yych = *YYCURSOR; + YYDEBUG(479, *YYCURSOR); + if (yych <= 'D') { + if (yych <= '/') goto yy190; + if (yych <= '9') goto yy478; + goto yy190; + } else { + if (yych <= 'E') goto yy193; + if (yych == 'e') goto yy193; + goto yy190; + } +yy480: + YYDEBUG(480, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(481, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1390 "Zend/zend_language_scanner.l" + { + return T_CONCAT_EQUAL; +} +#line 5166 "Zend/zend_language_scanner.c" yy482: YYDEBUG(482, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych != '.') goto yy194; YYDEBUG(483, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(484, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1206 "Zend/zend_language_scanner.l" + { + return T_ELLIPSIS; +} +#line 5179 "Zend/zend_language_scanner.c" +yy485: + YYDEBUG(485, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(486, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1199 "Zend/zend_language_scanner.l" +#line 1198 "Zend/zend_language_scanner.l" { return T_PAAMAYIM_NEKUDOTAYIM; } -#line 5171 "Zend/zend_language_scanner.c" -yy484: - YYDEBUG(484, *YYCURSOR); +#line 5189 "Zend/zend_language_scanner.c" +yy487: + YYDEBUG(487, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy485: - YYDEBUG(485, *YYCURSOR); +yy488: + YYDEBUG(488, *YYCURSOR); if (yych <= '\f') { if (yych <= 0x08) goto yy141; - if (yych <= '\n') goto yy484; + if (yych <= '\n') goto yy487; goto yy141; } else { - if (yych <= '\r') goto yy484; - if (yych == ' ') goto yy484; + if (yych <= '\r') goto yy487; + if (yych == ' ') goto yy487; goto yy141; } -yy486: - YYDEBUG(486, *YYCURSOR); +yy489: + YYDEBUG(489, *YYCURSOR); ++YYCURSOR; - YYDEBUG(487, *YYCURSOR); + YYDEBUG(490, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1375 "Zend/zend_language_scanner.l" +#line 1378 "Zend/zend_language_scanner.l" { return T_MINUS_EQUAL; } -#line 5197 "Zend/zend_language_scanner.c" -yy488: - YYDEBUG(488, *YYCURSOR); +#line 5215 "Zend/zend_language_scanner.c" +yy491: + YYDEBUG(491, *YYCURSOR); ++YYCURSOR; - YYDEBUG(489, *YYCURSOR); + YYDEBUG(492, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1343 "Zend/zend_language_scanner.l" +#line 1346 "Zend/zend_language_scanner.l" { return T_DEC; } -#line 5207 "Zend/zend_language_scanner.c" -yy490: - YYDEBUG(490, *YYCURSOR); +#line 5225 "Zend/zend_language_scanner.c" +yy493: + YYDEBUG(493, *YYCURSOR); ++YYCURSOR; - YYDEBUG(491, *YYCURSOR); + YYDEBUG(494, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1171 "Zend/zend_language_scanner.l" +#line 1170 "Zend/zend_language_scanner.l" { yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC); return T_OBJECT_OPERATOR; } -#line 5218 "Zend/zend_language_scanner.c" -yy492: - YYDEBUG(492, *YYCURSOR); +#line 5236 "Zend/zend_language_scanner.c" +yy495: + YYDEBUG(495, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'O') { - if (yych == 'I') goto yy499; + if (yych == 'I') goto yy502; if (yych <= 'N') goto yy187; - goto yy500; + goto yy503; } else { if (yych <= 'i') { if (yych <= 'h') goto yy187; - goto yy499; + goto yy502; } else { - if (yych == 'o') goto yy500; + if (yych == 'o') goto yy503; goto yy187; } } -yy493: - YYDEBUG(493, *YYCURSOR); +yy496: + YYDEBUG(496, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'B') goto yy494; + if (yych == 'B') goto yy497; if (yych != 'b') goto yy187; -yy494: - YYDEBUG(494, *YYCURSOR); +yy497: + YYDEBUG(497, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy495; + if (yych == 'L') goto yy498; if (yych != 'l') goto yy187; -yy495: - YYDEBUG(495, *YYCURSOR); +yy498: + YYDEBUG(498, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy496; + if (yych == 'I') goto yy499; if (yych != 'i') goto yy187; -yy496: - YYDEBUG(496, *YYCURSOR); +yy499: + YYDEBUG(499, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy497; + if (yych == 'C') goto yy500; if (yych != 'c') goto yy187; -yy497: - YYDEBUG(497, *YYCURSOR); +yy500: + YYDEBUG(500, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(498, *YYCURSOR); + YYDEBUG(501, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1315 "Zend/zend_language_scanner.l" +#line 1318 "Zend/zend_language_scanner.l" { return T_PUBLIC; } -#line 5267 "Zend/zend_language_scanner.c" -yy499: - YYDEBUG(499, *YYCURSOR); +#line 5285 "Zend/zend_language_scanner.c" +yy502: + YYDEBUG(502, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'V') { - if (yych == 'N') goto yy508; + if (yych == 'N') goto yy511; if (yych <= 'U') goto yy187; - goto yy509; + goto yy512; } else { if (yych <= 'n') { if (yych <= 'm') goto yy187; - goto yy508; + goto yy511; } else { - if (yych == 'v') goto yy509; + if (yych == 'v') goto yy512; goto yy187; } } -yy500: - YYDEBUG(500, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy501; - if (yych != 't') goto yy187; -yy501: - YYDEBUG(501, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy502; - if (yych != 'e') goto yy187; -yy502: - YYDEBUG(502, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'C') goto yy503; - if (yych != 'c') goto yy187; yy503: YYDEBUG(503, *YYCURSOR); yych = *++YYCURSOR; @@ -5308,1072 +5311,1069 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy505: YYDEBUG(505, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy506; - if (yych != 'd') goto yy187; + if (yych == 'C') goto yy506; + if (yych != 'c') goto yy187; yy506: YYDEBUG(506, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'T') goto yy507; + if (yych != 't') goto yy187; +yy507: + YYDEBUG(507, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy508; + if (yych != 'e') goto yy187; +yy508: + YYDEBUG(508, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'D') goto yy509; + if (yych != 'd') goto yy187; +yy509: + YYDEBUG(509, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(507, *YYCURSOR); + YYDEBUG(510, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1311 "Zend/zend_language_scanner.l" +#line 1314 "Zend/zend_language_scanner.l" { return T_PROTECTED; } -#line 5326 "Zend/zend_language_scanner.c" -yy508: - YYDEBUG(508, *YYCURSOR); +#line 5344 "Zend/zend_language_scanner.c" +yy511: + YYDEBUG(511, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy514; - if (yych == 't') goto yy514; + if (yych == 'T') goto yy517; + if (yych == 't') goto yy517; goto yy187; -yy509: - YYDEBUG(509, *YYCURSOR); +yy512: + YYDEBUG(512, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy510; + if (yych == 'A') goto yy513; if (yych != 'a') goto yy187; -yy510: - YYDEBUG(510, *YYCURSOR); +yy513: + YYDEBUG(513, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy511; + if (yych == 'T') goto yy514; if (yych != 't') goto yy187; -yy511: - YYDEBUG(511, *YYCURSOR); +yy514: + YYDEBUG(514, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy512; + if (yych == 'E') goto yy515; if (yych != 'e') goto yy187; -yy512: - YYDEBUG(512, *YYCURSOR); +yy515: + YYDEBUG(515, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(513, *YYCURSOR); + YYDEBUG(516, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1307 "Zend/zend_language_scanner.l" +#line 1310 "Zend/zend_language_scanner.l" { return T_PRIVATE; } -#line 5360 "Zend/zend_language_scanner.c" -yy514: - YYDEBUG(514, *YYCURSOR); +#line 5378 "Zend/zend_language_scanner.c" +yy517: + YYDEBUG(517, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(515, *YYCURSOR); + YYDEBUG(518, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1147 "Zend/zend_language_scanner.l" +#line 1146 "Zend/zend_language_scanner.l" { return T_PRINT; } -#line 5373 "Zend/zend_language_scanner.c" -yy516: - YYDEBUG(516, *YYCURSOR); +#line 5391 "Zend/zend_language_scanner.c" +yy519: + YYDEBUG(519, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy521; - if (yych == 'o') goto yy521; + if (yych == 'O') goto yy524; + if (yych == 'o') goto yy524; goto yy187; -yy517: - YYDEBUG(517, *YYCURSOR); +yy520: + YYDEBUG(520, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy518; + if (yych == 'T') goto yy521; if (yych != 't') goto yy187; -yy518: - YYDEBUG(518, *YYCURSOR); +yy521: + YYDEBUG(521, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy519; + if (yych == 'O') goto yy522; if (yych != 'o') goto yy187; -yy519: - YYDEBUG(519, *YYCURSOR); +yy522: + YYDEBUG(522, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(520, *YYCURSOR); + YYDEBUG(523, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1139 "Zend/zend_language_scanner.l" +#line 1138 "Zend/zend_language_scanner.l" { return T_GOTO; } -#line 5402 "Zend/zend_language_scanner.c" -yy521: - YYDEBUG(521, *YYCURSOR); +#line 5420 "Zend/zend_language_scanner.c" +yy524: + YYDEBUG(524, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'B') goto yy522; + if (yych == 'B') goto yy525; if (yych != 'b') goto yy187; -yy522: - YYDEBUG(522, *YYCURSOR); +yy525: + YYDEBUG(525, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy523; + if (yych == 'A') goto yy526; if (yych != 'a') goto yy187; -yy523: - YYDEBUG(523, *YYCURSOR); +yy526: + YYDEBUG(526, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy524; + if (yych == 'L') goto yy527; if (yych != 'l') goto yy187; -yy524: - YYDEBUG(524, *YYCURSOR); +yy527: + YYDEBUG(527, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(525, *YYCURSOR); + YYDEBUG(528, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1279 "Zend/zend_language_scanner.l" +#line 1282 "Zend/zend_language_scanner.l" { return T_GLOBAL; } -#line 5430 "Zend/zend_language_scanner.c" -yy526: - YYDEBUG(526, *YYCURSOR); +#line 5448 "Zend/zend_language_scanner.c" +yy529: + YYDEBUG(529, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '<') goto yy534; + if (yych == '<') goto yy537; goto yy194; -yy527: - YYDEBUG(527, *YYCURSOR); +yy530: + YYDEBUG(530, *YYCURSOR); yych = *++YYCURSOR; goto yy181; -yy528: - YYDEBUG(528, *YYCURSOR); +yy531: + YYDEBUG(531, *YYCURSOR); yych = *++YYCURSOR; goto yy179; -yy529: - YYDEBUG(529, *YYCURSOR); +yy532: + YYDEBUG(532, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy530; + if (yych == 'E') goto yy533; if (yych != 'e') goto yy187; -yy530: - YYDEBUG(530, *YYCURSOR); +yy533: + YYDEBUG(533, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy531; + if (yych == 'A') goto yy534; if (yych != 'a') goto yy187; -yy531: - YYDEBUG(531, *YYCURSOR); +yy534: + YYDEBUG(534, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'K') goto yy532; + if (yych == 'K') goto yy535; if (yych != 'k') goto yy187; -yy532: - YYDEBUG(532, *YYCURSOR); +yy535: + YYDEBUG(535, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(533, *YYCURSOR); + YYDEBUG(536, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1131 "Zend/zend_language_scanner.l" +#line 1130 "Zend/zend_language_scanner.l" { return T_BREAK; } -#line 5471 "Zend/zend_language_scanner.c" -yy534: - YYDEBUG(534, *YYCURSOR); +#line 5489 "Zend/zend_language_scanner.c" +yy537: + YYDEBUG(537, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '<') goto yy270; + if (yych == '<') goto yy266; goto yy194; -yy535: - YYDEBUG(535, *YYCURSOR); +yy538: + YYDEBUG(538, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy542; - if (yych == 'a') goto yy542; + if (yych == 'A') goto yy545; + if (yych == 'a') goto yy545; goto yy187; -yy536: - YYDEBUG(536, *YYCURSOR); +yy539: + YYDEBUG(539, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy537; + if (yych == 'I') goto yy540; if (yych != 'i') goto yy187; -yy537: - YYDEBUG(537, *YYCURSOR); +yy540: + YYDEBUG(540, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy538; + if (yych == 'T') goto yy541; if (yych != 't') goto yy187; -yy538: - YYDEBUG(538, *YYCURSOR); +yy541: + YYDEBUG(541, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy539; + if (yych == 'C') goto yy542; if (yych != 'c') goto yy187; -yy539: - YYDEBUG(539, *YYCURSOR); +yy542: + YYDEBUG(542, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy540; + if (yych == 'H') goto yy543; if (yych != 'h') goto yy187; -yy540: - YYDEBUG(540, *YYCURSOR); +yy543: + YYDEBUG(543, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(541, *YYCURSOR); + YYDEBUG(544, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1115 "Zend/zend_language_scanner.l" +#line 1114 "Zend/zend_language_scanner.l" { return T_SWITCH; } -#line 5515 "Zend/zend_language_scanner.c" -yy542: - YYDEBUG(542, *YYCURSOR); +#line 5533 "Zend/zend_language_scanner.c" +yy545: + YYDEBUG(545, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy543; + if (yych == 'T') goto yy546; if (yych != 't') goto yy187; -yy543: - YYDEBUG(543, *YYCURSOR); +yy546: + YYDEBUG(546, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy544; + if (yych == 'I') goto yy547; if (yych != 'i') goto yy187; -yy544: - YYDEBUG(544, *YYCURSOR); +yy547: + YYDEBUG(547, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy545; + if (yych == 'C') goto yy548; if (yych != 'c') goto yy187; -yy545: - YYDEBUG(545, *YYCURSOR); +yy548: + YYDEBUG(548, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(546, *YYCURSOR); + YYDEBUG(549, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1295 "Zend/zend_language_scanner.l" +#line 1298 "Zend/zend_language_scanner.l" { return T_STATIC; } -#line 5543 "Zend/zend_language_scanner.c" -yy547: - YYDEBUG(547, *YYCURSOR); +#line 5561 "Zend/zend_language_scanner.c" +yy550: + YYDEBUG(550, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy558; - if (yych == 's') goto yy558; + if (yych == 'S') goto yy561; + if (yych == 's') goto yy561; goto yy187; -yy548: - YYDEBUG(548, *YYCURSOR); +yy551: + YYDEBUG(551, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy556; - if (yych == 'd') goto yy556; + if (yych == 'D') goto yy559; + if (yych == 'd') goto yy559; goto yy187; -yy549: - YYDEBUG(549, *YYCURSOR); +yy552: + YYDEBUG(552, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy552; - if (yych == 'r') goto yy552; + if (yych == 'R') goto yy555; + if (yych == 'r') goto yy555; goto yy187; -yy550: - YYDEBUG(550, *YYCURSOR); +yy553: + YYDEBUG(553, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(551, *YYCURSOR); + YYDEBUG(554, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1111 "Zend/zend_language_scanner.l" +#line 1110 "Zend/zend_language_scanner.l" { return T_AS; } -#line 5574 "Zend/zend_language_scanner.c" -yy552: - YYDEBUG(552, *YYCURSOR); +#line 5592 "Zend/zend_language_scanner.c" +yy555: + YYDEBUG(555, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy553; + if (yych == 'A') goto yy556; if (yych != 'a') goto yy187; -yy553: - YYDEBUG(553, *YYCURSOR); +yy556: + YYDEBUG(556, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy554; + if (yych == 'Y') goto yy557; if (yych != 'y') goto yy187; -yy554: - YYDEBUG(554, *YYCURSOR); +yy557: + YYDEBUG(557, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(555, *YYCURSOR); + YYDEBUG(558, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1331 "Zend/zend_language_scanner.l" +#line 1334 "Zend/zend_language_scanner.l" { return T_ARRAY; } -#line 5597 "Zend/zend_language_scanner.c" -yy556: - YYDEBUG(556, *YYCURSOR); +#line 5615 "Zend/zend_language_scanner.c" +yy559: + YYDEBUG(559, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(557, *YYCURSOR); + YYDEBUG(560, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1427 "Zend/zend_language_scanner.l" +#line 1430 "Zend/zend_language_scanner.l" { return T_LOGICAL_AND; } -#line 5610 "Zend/zend_language_scanner.c" -yy558: - YYDEBUG(558, *YYCURSOR); +#line 5628 "Zend/zend_language_scanner.c" +yy561: + YYDEBUG(561, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy559; + if (yych == 'T') goto yy562; if (yych != 't') goto yy187; -yy559: - YYDEBUG(559, *YYCURSOR); +yy562: + YYDEBUG(562, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy560; + if (yych == 'R') goto yy563; if (yych != 'r') goto yy187; -yy560: - YYDEBUG(560, *YYCURSOR); +yy563: + YYDEBUG(563, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy561; + if (yych == 'A') goto yy564; if (yych != 'a') goto yy187; -yy561: - YYDEBUG(561, *YYCURSOR); +yy564: + YYDEBUG(564, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy562; + if (yych == 'C') goto yy565; if (yych != 'c') goto yy187; -yy562: - YYDEBUG(562, *YYCURSOR); +yy565: + YYDEBUG(565, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy563; + if (yych == 'T') goto yy566; if (yych != 't') goto yy187; -yy563: - YYDEBUG(563, *YYCURSOR); +yy566: + YYDEBUG(566, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(564, *YYCURSOR); + YYDEBUG(567, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1299 "Zend/zend_language_scanner.l" +#line 1302 "Zend/zend_language_scanner.l" { return T_ABSTRACT; } -#line 5648 "Zend/zend_language_scanner.c" -yy565: - YYDEBUG(565, *YYCURSOR); +#line 5666 "Zend/zend_language_scanner.c" +yy568: + YYDEBUG(568, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy566; + if (yych == 'I') goto yy569; if (yych != 'i') goto yy187; -yy566: - YYDEBUG(566, *YYCURSOR); +yy569: + YYDEBUG(569, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy567; + if (yych == 'L') goto yy570; if (yych != 'l') goto yy187; -yy567: - YYDEBUG(567, *YYCURSOR); +yy570: + YYDEBUG(570, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy568; + if (yych == 'E') goto yy571; if (yych != 'e') goto yy187; -yy568: - YYDEBUG(568, *YYCURSOR); +yy571: + YYDEBUG(571, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(569, *YYCURSOR); + YYDEBUG(572, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1071 "Zend/zend_language_scanner.l" +#line 1070 "Zend/zend_language_scanner.l" { return T_WHILE; } -#line 5676 "Zend/zend_language_scanner.c" -yy570: - YYDEBUG(570, *YYCURSOR); +#line 5694 "Zend/zend_language_scanner.c" +yy573: + YYDEBUG(573, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(571, *YYCURSOR); + YYDEBUG(574, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1055 "Zend/zend_language_scanner.l" +#line 1054 "Zend/zend_language_scanner.l" { return T_IF; } -#line 5689 "Zend/zend_language_scanner.c" -yy572: - YYDEBUG(572, *YYCURSOR); +#line 5707 "Zend/zend_language_scanner.c" +yy575: + YYDEBUG(575, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'P') goto yy614; - if (yych == 'p') goto yy614; + if (yych == 'P') goto yy617; + if (yych == 'p') goto yy617; goto yy187; -yy573: - YYDEBUG(573, *YYCURSOR); +yy576: + YYDEBUG(576, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= 'C') { if (yych <= 'B') goto yy187; - goto yy581; + goto yy584; } else { if (yych <= 'R') goto yy187; - if (yych <= 'S') goto yy579; - goto yy580; + if (yych <= 'S') goto yy582; + goto yy583; } } else { if (yych <= 'r') { - if (yych == 'c') goto yy581; + if (yych == 'c') goto yy584; goto yy187; } else { - if (yych <= 's') goto yy579; - if (yych <= 't') goto yy580; + if (yych <= 's') goto yy582; + if (yych <= 't') goto yy583; goto yy187; } } -yy574: - YYDEBUG(574, *YYCURSOR); +yy577: + YYDEBUG(577, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy575; + if (yych == 'S') goto yy578; if (yych != 's') goto yy187; -yy575: - YYDEBUG(575, *YYCURSOR); +yy578: + YYDEBUG(578, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy576; + if (yych == 'E') goto yy579; if (yych != 'e') goto yy187; -yy576: - YYDEBUG(576, *YYCURSOR); +yy579: + YYDEBUG(579, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy577; + if (yych == 'T') goto yy580; if (yych != 't') goto yy187; -yy577: - YYDEBUG(577, *YYCURSOR); +yy580: + YYDEBUG(580, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(578, *YYCURSOR); + YYDEBUG(581, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1283 "Zend/zend_language_scanner.l" +#line 1286 "Zend/zend_language_scanner.l" { return T_ISSET; } -#line 5745 "Zend/zend_language_scanner.c" -yy579: - YYDEBUG(579, *YYCURSOR); +#line 5763 "Zend/zend_language_scanner.c" +yy582: + YYDEBUG(582, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy600; - if (yych == 't') goto yy600; + if (yych == 'T') goto yy603; + if (yych == 't') goto yy603; goto yy187; -yy580: - YYDEBUG(580, *YYCURSOR); +yy583: + YYDEBUG(583, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy593; - if (yych == 'e') goto yy593; + if (yych == 'E') goto yy596; + if (yych == 'e') goto yy596; goto yy187; -yy581: - YYDEBUG(581, *YYCURSOR); +yy584: + YYDEBUG(584, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy582; + if (yych == 'L') goto yy585; if (yych != 'l') goto yy187; -yy582: - YYDEBUG(582, *YYCURSOR); +yy585: + YYDEBUG(585, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy583; + if (yych == 'U') goto yy586; if (yych != 'u') goto yy187; -yy583: - YYDEBUG(583, *YYCURSOR); +yy586: + YYDEBUG(586, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy584; + if (yych == 'D') goto yy587; if (yych != 'd') goto yy187; -yy584: - YYDEBUG(584, *YYCURSOR); +yy587: + YYDEBUG(587, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy585; + if (yych == 'E') goto yy588; if (yych != 'e') goto yy187; -yy585: - YYDEBUG(585, *YYCURSOR); +yy588: + YYDEBUG(588, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '^') { if (yych <= '9') { if (yych >= '0') goto yy186; } else { - if (yych <= '@') goto yy586; + if (yych <= '@') goto yy589; if (yych <= 'Z') goto yy186; } } else { if (yych <= '`') { - if (yych <= '_') goto yy587; + if (yych <= '_') goto yy590; } else { if (yych <= 'z') goto yy186; if (yych >= 0x7F) goto yy186; } } -yy586: - YYDEBUG(586, *YYCURSOR); +yy589: + YYDEBUG(589, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1251 "Zend/zend_language_scanner.l" +#line 1254 "Zend/zend_language_scanner.l" { return T_INCLUDE; } -#line 5803 "Zend/zend_language_scanner.c" -yy587: - YYDEBUG(587, *YYCURSOR); +#line 5821 "Zend/zend_language_scanner.c" +yy590: + YYDEBUG(590, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy588; + if (yych == 'O') goto yy591; if (yych != 'o') goto yy187; -yy588: - YYDEBUG(588, *YYCURSOR); +yy591: + YYDEBUG(591, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy589; + if (yych == 'N') goto yy592; if (yych != 'n') goto yy187; -yy589: - YYDEBUG(589, *YYCURSOR); +yy592: + YYDEBUG(592, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy590; + if (yych == 'C') goto yy593; if (yych != 'c') goto yy187; -yy590: - YYDEBUG(590, *YYCURSOR); +yy593: + YYDEBUG(593, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy591; + if (yych == 'E') goto yy594; if (yych != 'e') goto yy187; -yy591: - YYDEBUG(591, *YYCURSOR); +yy594: + YYDEBUG(594, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(592, *YYCURSOR); + YYDEBUG(595, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1255 "Zend/zend_language_scanner.l" +#line 1258 "Zend/zend_language_scanner.l" { return T_INCLUDE_ONCE; } -#line 5836 "Zend/zend_language_scanner.c" -yy593: - YYDEBUG(593, *YYCURSOR); +#line 5854 "Zend/zend_language_scanner.c" +yy596: + YYDEBUG(596, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy594; + if (yych == 'R') goto yy597; if (yych != 'r') goto yy187; -yy594: - YYDEBUG(594, *YYCURSOR); +yy597: + YYDEBUG(597, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy595; + if (yych == 'F') goto yy598; if (yych != 'f') goto yy187; -yy595: - YYDEBUG(595, *YYCURSOR); +yy598: + YYDEBUG(598, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy596; + if (yych == 'A') goto yy599; if (yych != 'a') goto yy187; -yy596: - YYDEBUG(596, *YYCURSOR); +yy599: + YYDEBUG(599, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy597; + if (yych == 'C') goto yy600; if (yych != 'c') goto yy187; -yy597: - YYDEBUG(597, *YYCURSOR); +yy600: + YYDEBUG(600, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy598; + if (yych == 'E') goto yy601; if (yych != 'e') goto yy187; -yy598: - YYDEBUG(598, *YYCURSOR); +yy601: + YYDEBUG(601, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(599, *YYCURSOR); + YYDEBUG(602, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1155 "Zend/zend_language_scanner.l" +#line 1154 "Zend/zend_language_scanner.l" { return T_INTERFACE; } -#line 5874 "Zend/zend_language_scanner.c" -yy600: - YYDEBUG(600, *YYCURSOR); +#line 5892 "Zend/zend_language_scanner.c" +yy603: + YYDEBUG(603, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'E') { - if (yych == 'A') goto yy601; + if (yych == 'A') goto yy604; if (yych <= 'D') goto yy187; - goto yy602; + goto yy605; } else { if (yych <= 'a') { if (yych <= '`') goto yy187; } else { - if (yych == 'e') goto yy602; + if (yych == 'e') goto yy605; goto yy187; } } -yy601: - YYDEBUG(601, *YYCURSOR); +yy604: + YYDEBUG(604, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy608; - if (yych == 'n') goto yy608; + if (yych == 'N') goto yy611; + if (yych == 'n') goto yy611; goto yy187; -yy602: - YYDEBUG(602, *YYCURSOR); +yy605: + YYDEBUG(605, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy603; + if (yych == 'A') goto yy606; if (yych != 'a') goto yy187; -yy603: - YYDEBUG(603, *YYCURSOR); +yy606: + YYDEBUG(606, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy604; + if (yych == 'D') goto yy607; if (yych != 'd') goto yy187; -yy604: - YYDEBUG(604, *YYCURSOR); +yy607: + YYDEBUG(607, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy605; + if (yych == 'O') goto yy608; if (yych != 'o') goto yy187; -yy605: - YYDEBUG(605, *YYCURSOR); +yy608: + YYDEBUG(608, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy606; + if (yych == 'F') goto yy609; if (yych != 'f') goto yy187; -yy606: - YYDEBUG(606, *YYCURSOR); +yy609: + YYDEBUG(609, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(607, *YYCURSOR); + YYDEBUG(610, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1275 "Zend/zend_language_scanner.l" +#line 1278 "Zend/zend_language_scanner.l" { return T_INSTEADOF; } -#line 5928 "Zend/zend_language_scanner.c" -yy608: - YYDEBUG(608, *YYCURSOR); +#line 5946 "Zend/zend_language_scanner.c" +yy611: + YYDEBUG(611, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy609; + if (yych == 'C') goto yy612; if (yych != 'c') goto yy187; -yy609: - YYDEBUG(609, *YYCURSOR); +yy612: + YYDEBUG(612, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy610; + if (yych == 'E') goto yy613; if (yych != 'e') goto yy187; -yy610: - YYDEBUG(610, *YYCURSOR); +yy613: + YYDEBUG(613, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy611; + if (yych == 'O') goto yy614; if (yych != 'o') goto yy187; -yy611: - YYDEBUG(611, *YYCURSOR); +yy614: + YYDEBUG(614, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy612; + if (yych == 'F') goto yy615; if (yych != 'f') goto yy187; -yy612: - YYDEBUG(612, *YYCURSOR); +yy615: + YYDEBUG(615, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(613, *YYCURSOR); + YYDEBUG(616, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1107 "Zend/zend_language_scanner.l" +#line 1106 "Zend/zend_language_scanner.l" { return T_INSTANCEOF; } -#line 5961 "Zend/zend_language_scanner.c" -yy614: - YYDEBUG(614, *YYCURSOR); +#line 5979 "Zend/zend_language_scanner.c" +yy617: + YYDEBUG(617, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy615; + if (yych == 'L') goto yy618; if (yych != 'l') goto yy187; -yy615: - YYDEBUG(615, *YYCURSOR); +yy618: + YYDEBUG(618, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy616; + if (yych == 'E') goto yy619; if (yych != 'e') goto yy187; -yy616: - YYDEBUG(616, *YYCURSOR); +yy619: + YYDEBUG(619, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'M') goto yy617; + if (yych == 'M') goto yy620; if (yych != 'm') goto yy187; -yy617: - YYDEBUG(617, *YYCURSOR); +yy620: + YYDEBUG(620, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy618; + if (yych == 'E') goto yy621; if (yych != 'e') goto yy187; -yy618: - YYDEBUG(618, *YYCURSOR); +yy621: + YYDEBUG(621, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy619; + if (yych == 'N') goto yy622; if (yych != 'n') goto yy187; -yy619: - YYDEBUG(619, *YYCURSOR); +yy622: + YYDEBUG(622, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy620; + if (yych == 'T') goto yy623; if (yych != 't') goto yy187; -yy620: - YYDEBUG(620, *YYCURSOR); +yy623: + YYDEBUG(623, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy621; + if (yych == 'S') goto yy624; if (yych != 's') goto yy187; -yy621: - YYDEBUG(621, *YYCURSOR); +yy624: + YYDEBUG(624, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(622, *YYCURSOR); + YYDEBUG(625, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1167 "Zend/zend_language_scanner.l" +#line 1166 "Zend/zend_language_scanner.l" { return T_IMPLEMENTS; } -#line 6009 "Zend/zend_language_scanner.c" -yy623: - YYDEBUG(623, *YYCURSOR); +#line 6027 "Zend/zend_language_scanner.c" +yy626: + YYDEBUG(626, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy631; - if (yych == 'r') goto yy631; + if (yych == 'R') goto yy634; + if (yych == 'r') goto yy634; goto yy187; -yy624: - YYDEBUG(624, *YYCURSOR); +yy627: + YYDEBUG(627, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'Y') { - if (yych == 'A') goto yy627; + if (yych == 'A') goto yy630; if (yych <= 'X') goto yy187; } else { if (yych <= 'a') { if (yych <= '`') goto yy187; - goto yy627; + goto yy630; } else { if (yych != 'y') goto yy187; } } - YYDEBUG(625, *YYCURSOR); + YYDEBUG(628, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(626, *YYCURSOR); + YYDEBUG(629, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1039 "Zend/zend_language_scanner.l" +#line 1038 "Zend/zend_language_scanner.l" { return T_TRY; } -#line 6041 "Zend/zend_language_scanner.c" -yy627: - YYDEBUG(627, *YYCURSOR); +#line 6059 "Zend/zend_language_scanner.c" +yy630: + YYDEBUG(630, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy628; + if (yych == 'I') goto yy631; if (yych != 'i') goto yy187; -yy628: - YYDEBUG(628, *YYCURSOR); +yy631: + YYDEBUG(631, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy629; + if (yych == 'T') goto yy632; if (yych != 't') goto yy187; -yy629: - YYDEBUG(629, *YYCURSOR); +yy632: + YYDEBUG(632, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(630, *YYCURSOR); + YYDEBUG(633, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1159 "Zend/zend_language_scanner.l" +#line 1158 "Zend/zend_language_scanner.l" { return T_TRAIT; } -#line 6064 "Zend/zend_language_scanner.c" -yy631: - YYDEBUG(631, *YYCURSOR); +#line 6082 "Zend/zend_language_scanner.c" +yy634: + YYDEBUG(634, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy632; + if (yych == 'O') goto yy635; if (yych != 'o') goto yy187; -yy632: - YYDEBUG(632, *YYCURSOR); +yy635: + YYDEBUG(635, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'W') goto yy633; + if (yych == 'W') goto yy636; if (yych != 'w') goto yy187; -yy633: - YYDEBUG(633, *YYCURSOR); +yy636: + YYDEBUG(636, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(634, *YYCURSOR); + YYDEBUG(637, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1051 "Zend/zend_language_scanner.l" +#line 1050 "Zend/zend_language_scanner.l" { return T_THROW; } -#line 6087 "Zend/zend_language_scanner.c" -yy635: - YYDEBUG(635, *YYCURSOR); +#line 6105 "Zend/zend_language_scanner.c" +yy638: + YYDEBUG(638, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy636; + if (yych == 'E') goto yy639; if (yych != 'e') goto yy187; -yy636: - YYDEBUG(636, *YYCURSOR); +yy639: + YYDEBUG(639, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy637; + if (yych == 'L') goto yy640; if (yych != 'l') goto yy187; -yy637: - YYDEBUG(637, *YYCURSOR); +yy640: + YYDEBUG(640, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy638; + if (yych == 'D') goto yy641; if (yych != 'd') goto yy187; -yy638: - YYDEBUG(638, *YYCURSOR); +yy641: + YYDEBUG(641, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(639, *YYCURSOR); + YYDEBUG(642, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1035 "Zend/zend_language_scanner.l" +#line 1034 "Zend/zend_language_scanner.l" { return T_YIELD; } -#line 6115 "Zend/zend_language_scanner.c" -yy640: - YYDEBUG(640, *YYCURSOR); +#line 6133 "Zend/zend_language_scanner.c" +yy643: + YYDEBUG(643, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { - if (yych == 'Q') goto yy642; + if (yych == 'Q') goto yy645; if (yych <= 'S') goto yy187; } else { if (yych <= 'q') { if (yych <= 'p') goto yy187; - goto yy642; + goto yy645; } else { if (yych != 't') goto yy187; } } - YYDEBUG(641, *YYCURSOR); + YYDEBUG(644, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy654; - if (yych == 'u') goto yy654; + if (yych == 'U') goto yy657; + if (yych == 'u') goto yy657; goto yy187; -yy642: - YYDEBUG(642, *YYCURSOR); +yy645: + YYDEBUG(645, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy643; + if (yych == 'U') goto yy646; if (yych != 'u') goto yy187; -yy643: - YYDEBUG(643, *YYCURSOR); +yy646: + YYDEBUG(646, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy644; + if (yych == 'I') goto yy647; if (yych != 'i') goto yy187; -yy644: - YYDEBUG(644, *YYCURSOR); +yy647: + YYDEBUG(647, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy645; + if (yych == 'R') goto yy648; if (yych != 'r') goto yy187; -yy645: - YYDEBUG(645, *YYCURSOR); +yy648: + YYDEBUG(648, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy646; + if (yych == 'E') goto yy649; if (yych != 'e') goto yy187; -yy646: - YYDEBUG(646, *YYCURSOR); +yy649: + YYDEBUG(649, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '^') { if (yych <= '9') { if (yych >= '0') goto yy186; } else { - if (yych <= '@') goto yy647; + if (yych <= '@') goto yy650; if (yych <= 'Z') goto yy186; } } else { if (yych <= '`') { - if (yych <= '_') goto yy648; + if (yych <= '_') goto yy651; } else { if (yych <= 'z') goto yy186; if (yych >= 0x7F) goto yy186; } } -yy647: - YYDEBUG(647, *YYCURSOR); +yy650: + YYDEBUG(650, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1259 "Zend/zend_language_scanner.l" +#line 1262 "Zend/zend_language_scanner.l" { return T_REQUIRE; } -#line 6180 "Zend/zend_language_scanner.c" -yy648: - YYDEBUG(648, *YYCURSOR); +#line 6198 "Zend/zend_language_scanner.c" +yy651: + YYDEBUG(651, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy649; + if (yych == 'O') goto yy652; if (yych != 'o') goto yy187; -yy649: - YYDEBUG(649, *YYCURSOR); +yy652: + YYDEBUG(652, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy650; + if (yych == 'N') goto yy653; if (yych != 'n') goto yy187; -yy650: - YYDEBUG(650, *YYCURSOR); +yy653: + YYDEBUG(653, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy651; + if (yych == 'C') goto yy654; if (yych != 'c') goto yy187; -yy651: - YYDEBUG(651, *YYCURSOR); +yy654: + YYDEBUG(654, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy652; + if (yych == 'E') goto yy655; if (yych != 'e') goto yy187; -yy652: - YYDEBUG(652, *YYCURSOR); +yy655: + YYDEBUG(655, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(653, *YYCURSOR); + YYDEBUG(656, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1263 "Zend/zend_language_scanner.l" +#line 1266 "Zend/zend_language_scanner.l" { return T_REQUIRE_ONCE; } -#line 6213 "Zend/zend_language_scanner.c" -yy654: - YYDEBUG(654, *YYCURSOR); +#line 6231 "Zend/zend_language_scanner.c" +yy657: + YYDEBUG(657, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy655; + if (yych == 'R') goto yy658; if (yych != 'r') goto yy187; -yy655: - YYDEBUG(655, *YYCURSOR); +yy658: + YYDEBUG(658, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy656; + if (yych == 'N') goto yy659; if (yych != 'n') goto yy187; -yy656: - YYDEBUG(656, *YYCURSOR); +yy659: + YYDEBUG(659, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(657, *YYCURSOR); + YYDEBUG(660, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1031 "Zend/zend_language_scanner.l" +#line 1030 "Zend/zend_language_scanner.l" { return T_RETURN; } -#line 6236 "Zend/zend_language_scanner.c" -yy658: - YYDEBUG(658, *YYCURSOR); +#line 6254 "Zend/zend_language_scanner.c" +yy661: + YYDEBUG(661, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= 'L') { if (yych <= 'K') goto yy187; - goto yy681; + goto yy684; } else { if (yych <= 'R') goto yy187; - if (yych <= 'S') goto yy680; - goto yy679; + if (yych <= 'S') goto yy683; + goto yy682; } } else { if (yych <= 'r') { - if (yych == 'l') goto yy681; + if (yych == 'l') goto yy684; goto yy187; } else { - if (yych <= 's') goto yy680; - if (yych <= 't') goto yy679; + if (yych <= 's') goto yy683; + if (yych <= 't') goto yy682; goto yy187; } } -yy659: - YYDEBUG(659, *YYCURSOR); +yy662: + YYDEBUG(662, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'O') { - if (yych == 'A') goto yy671; + if (yych == 'A') goto yy674; if (yych <= 'N') goto yy187; - goto yy672; + goto yy675; } else { if (yych <= 'a') { if (yych <= '`') goto yy187; - goto yy671; + goto yy674; } else { - if (yych == 'o') goto yy672; + if (yych == 'o') goto yy675; goto yy187; } } -yy660: - YYDEBUG(660, *YYCURSOR); +yy663: + YYDEBUG(663, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy661; + if (yych == 'N') goto yy664; if (yych != 'n') goto yy187; -yy661: - YYDEBUG(661, *YYCURSOR); +yy664: + YYDEBUG(664, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'T') { if (yych <= 'R') goto yy187; - if (yych >= 'T') goto yy663; + if (yych >= 'T') goto yy666; } else { if (yych <= 'r') goto yy187; - if (yych <= 's') goto yy662; - if (yych <= 't') goto yy663; + if (yych <= 's') goto yy665; + if (yych <= 't') goto yy666; goto yy187; } -yy662: - YYDEBUG(662, *YYCURSOR); +yy665: + YYDEBUG(665, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy669; - if (yych == 't') goto yy669; + if (yych == 'T') goto yy672; + if (yych == 't') goto yy672; goto yy187; -yy663: - YYDEBUG(663, *YYCURSOR); +yy666: + YYDEBUG(666, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy664; + if (yych == 'I') goto yy667; if (yych != 'i') goto yy187; -yy664: - YYDEBUG(664, *YYCURSOR); +yy667: + YYDEBUG(667, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy665; + if (yych == 'N') goto yy668; if (yych != 'n') goto yy187; -yy665: - YYDEBUG(665, *YYCURSOR); +yy668: + YYDEBUG(668, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy666; + if (yych == 'U') goto yy669; if (yych != 'u') goto yy187; -yy666: - YYDEBUG(666, *YYCURSOR); +yy669: + YYDEBUG(669, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy667; + if (yych == 'E') goto yy670; if (yych != 'e') goto yy187; -yy667: - YYDEBUG(667, *YYCURSOR); +yy670: + YYDEBUG(670, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(668, *YYCURSOR); + YYDEBUG(671, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1135 "Zend/zend_language_scanner.l" +#line 1134 "Zend/zend_language_scanner.l" { return T_CONTINUE; } -#line 6330 "Zend/zend_language_scanner.c" -yy669: - YYDEBUG(669, *YYCURSOR); +#line 6348 "Zend/zend_language_scanner.c" +yy672: + YYDEBUG(672, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(670, *YYCURSOR); + YYDEBUG(673, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1027 "Zend/zend_language_scanner.l" +#line 1026 "Zend/zend_language_scanner.l" { return T_CONST; } -#line 6343 "Zend/zend_language_scanner.c" -yy671: - YYDEBUG(671, *YYCURSOR); +#line 6361 "Zend/zend_language_scanner.c" +yy674: + YYDEBUG(674, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy676; - if (yych == 's') goto yy676; + if (yych == 'S') goto yy679; + if (yych == 's') goto yy679; goto yy187; -yy672: - YYDEBUG(672, *YYCURSOR); +yy675: + YYDEBUG(675, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy673; + if (yych == 'N') goto yy676; if (yych != 'n') goto yy187; -yy673: - YYDEBUG(673, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy674; - if (yych != 'e') goto yy187; -yy674: - YYDEBUG(674, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 4) { - goto yy186; - } - YYDEBUG(675, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1211 "Zend/zend_language_scanner.l" - { - return T_CLONE; -} -#line 6372 "Zend/zend_language_scanner.c" yy676: YYDEBUG(676, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy677; - if (yych != 's') goto yy187; + if (yych == 'E') goto yy677; + if (yych != 'e') goto yy187; yy677: YYDEBUG(677, *YYCURSOR); ++YYCURSOR; @@ -6382,38 +6382,41 @@ int lex_scan(zval *zendlval TSRMLS_DC) } YYDEBUG(678, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1151 "Zend/zend_language_scanner.l" +#line 1214 "Zend/zend_language_scanner.l" { - return T_CLASS; + return T_CLONE; } #line 6390 "Zend/zend_language_scanner.c" yy679: YYDEBUG(679, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy690; - if (yych == 'c') goto yy690; - goto yy187; + if (yych == 'S') goto yy680; + if (yych != 's') goto yy187; yy680: YYDEBUG(680, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy688; - if (yych == 'e') goto yy688; - goto yy187; -yy681: + ++YYCURSOR; + if (yybm[0+(yych = *YYCURSOR)] & 4) { + goto yy186; + } YYDEBUG(681, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy682; - if (yych != 'l') goto yy187; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1150 "Zend/zend_language_scanner.l" + { + return T_CLASS; +} +#line 6408 "Zend/zend_language_scanner.c" yy682: YYDEBUG(682, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy683; - if (yych != 'a') goto yy187; + if (yych == 'C') goto yy693; + if (yych == 'c') goto yy693; + goto yy187; yy683: YYDEBUG(683, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'B') goto yy684; - if (yych != 'b') goto yy187; + if (yych == 'E') goto yy691; + if (yych == 'e') goto yy691; + goto yy187; yy684: YYDEBUG(684, *YYCURSOR); yych = *++YYCURSOR; @@ -6422,760 +6425,775 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy685: YYDEBUG(685, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy686; - if (yych != 'e') goto yy187; + if (yych == 'A') goto yy686; + if (yych != 'a') goto yy187; yy686: YYDEBUG(686, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'B') goto yy687; + if (yych != 'b') goto yy187; +yy687: + YYDEBUG(687, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'L') goto yy688; + if (yych != 'l') goto yy187; +yy688: + YYDEBUG(688, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy689; + if (yych != 'e') goto yy187; +yy689: + YYDEBUG(689, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(687, *YYCURSOR); + YYDEBUG(690, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1335 "Zend/zend_language_scanner.l" +#line 1338 "Zend/zend_language_scanner.l" { return T_CALLABLE; } -#line 6440 "Zend/zend_language_scanner.c" -yy688: - YYDEBUG(688, *YYCURSOR); +#line 6458 "Zend/zend_language_scanner.c" +yy691: + YYDEBUG(691, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(689, *YYCURSOR); + YYDEBUG(692, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1123 "Zend/zend_language_scanner.l" +#line 1122 "Zend/zend_language_scanner.l" { return T_CASE; } -#line 6453 "Zend/zend_language_scanner.c" -yy690: - YYDEBUG(690, *YYCURSOR); +#line 6471 "Zend/zend_language_scanner.c" +yy693: + YYDEBUG(693, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy691; + if (yych == 'H') goto yy694; if (yych != 'h') goto yy187; -yy691: - YYDEBUG(691, *YYCURSOR); +yy694: + YYDEBUG(694, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(692, *YYCURSOR); + YYDEBUG(695, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1043 "Zend/zend_language_scanner.l" +#line 1042 "Zend/zend_language_scanner.l" { return T_CATCH; } -#line 6471 "Zend/zend_language_scanner.c" -yy693: - YYDEBUG(693, *YYCURSOR); +#line 6489 "Zend/zend_language_scanner.c" +yy696: + YYDEBUG(696, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy710; - if (yych == 'n') goto yy710; + if (yych == 'N') goto yy713; + if (yych == 'n') goto yy713; goto yy187; -yy694: - YYDEBUG(694, *YYCURSOR); +yy697: + YYDEBUG(697, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy703; - if (yych == 'r') goto yy703; + if (yych == 'R') goto yy706; + if (yych == 'r') goto yy706; goto yy187; -yy695: - YYDEBUG(695, *YYCURSOR); +yy698: + YYDEBUG(698, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy696; + if (yych == 'N') goto yy699; if (yych != 'n') goto yy187; -yy696: - YYDEBUG(696, *YYCURSOR); +yy699: + YYDEBUG(699, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy697; + if (yych == 'C') goto yy700; if (yych != 'c') goto yy187; -yy697: - YYDEBUG(697, *YYCURSOR); +yy700: + YYDEBUG(700, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy698; + if (yych == 'T') goto yy701; if (yych != 't') goto yy187; -yy698: - YYDEBUG(698, *YYCURSOR); +yy701: + YYDEBUG(701, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy699; + if (yych == 'I') goto yy702; if (yych != 'i') goto yy187; -yy699: - YYDEBUG(699, *YYCURSOR); +yy702: + YYDEBUG(702, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy700; + if (yych == 'O') goto yy703; if (yych != 'o') goto yy187; -yy700: - YYDEBUG(700, *YYCURSOR); +yy703: + YYDEBUG(703, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy701; + if (yych == 'N') goto yy704; if (yych != 'n') goto yy187; -yy701: - YYDEBUG(701, *YYCURSOR); +yy704: + YYDEBUG(704, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(702, *YYCURSOR); + YYDEBUG(705, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1023 "Zend/zend_language_scanner.l" +#line 1022 "Zend/zend_language_scanner.l" { return T_FUNCTION; } -#line 6526 "Zend/zend_language_scanner.c" -yy703: - YYDEBUG(703, *YYCURSOR); +#line 6544 "Zend/zend_language_scanner.c" +yy706: + YYDEBUG(706, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '^') { if (yych <= '@') { - if (yych <= '/') goto yy704; + if (yych <= '/') goto yy707; if (yych <= '9') goto yy186; } else { - if (yych == 'E') goto yy705; + if (yych == 'E') goto yy708; if (yych <= 'Z') goto yy186; } } else { if (yych <= 'd') { if (yych != '`') goto yy186; } else { - if (yych <= 'e') goto yy705; + if (yych <= 'e') goto yy708; if (yych <= 'z') goto yy186; if (yych >= 0x7F) goto yy186; } } -yy704: - YYDEBUG(704, *YYCURSOR); +yy707: + YYDEBUG(707, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1083 "Zend/zend_language_scanner.l" +#line 1082 "Zend/zend_language_scanner.l" { return T_FOR; } -#line 6554 "Zend/zend_language_scanner.c" -yy705: - YYDEBUG(705, *YYCURSOR); +#line 6572 "Zend/zend_language_scanner.c" +yy708: + YYDEBUG(708, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy706; + if (yych == 'A') goto yy709; if (yych != 'a') goto yy187; -yy706: - YYDEBUG(706, *YYCURSOR); +yy709: + YYDEBUG(709, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy707; + if (yych == 'C') goto yy710; if (yych != 'c') goto yy187; -yy707: - YYDEBUG(707, *YYCURSOR); +yy710: + YYDEBUG(710, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy708; + if (yych == 'H') goto yy711; if (yych != 'h') goto yy187; -yy708: - YYDEBUG(708, *YYCURSOR); +yy711: + YYDEBUG(711, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(709, *YYCURSOR); + YYDEBUG(712, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1091 "Zend/zend_language_scanner.l" +#line 1090 "Zend/zend_language_scanner.l" { return T_FOREACH; } -#line 6582 "Zend/zend_language_scanner.c" -yy710: - YYDEBUG(710, *YYCURSOR); +#line 6600 "Zend/zend_language_scanner.c" +yy713: + YYDEBUG(713, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy711; + if (yych == 'A') goto yy714; if (yych != 'a') goto yy187; -yy711: - YYDEBUG(711, *YYCURSOR); +yy714: + YYDEBUG(714, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy712; + if (yych == 'L') goto yy715; if (yych != 'l') goto yy187; -yy712: - YYDEBUG(712, *YYCURSOR); +yy715: + YYDEBUG(715, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '^') { if (yych <= '@') { - if (yych <= '/') goto yy713; + if (yych <= '/') goto yy716; if (yych <= '9') goto yy186; } else { - if (yych == 'L') goto yy714; + if (yych == 'L') goto yy717; if (yych <= 'Z') goto yy186; } } else { if (yych <= 'k') { if (yych != '`') goto yy186; } else { - if (yych <= 'l') goto yy714; + if (yych <= 'l') goto yy717; if (yych <= 'z') goto yy186; if (yych >= 0x7F) goto yy186; } } -yy713: - YYDEBUG(713, *YYCURSOR); +yy716: + YYDEBUG(716, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1303 "Zend/zend_language_scanner.l" +#line 1306 "Zend/zend_language_scanner.l" { return T_FINAL; } -#line 6620 "Zend/zend_language_scanner.c" -yy714: - YYDEBUG(714, *YYCURSOR); +#line 6638 "Zend/zend_language_scanner.c" +yy717: + YYDEBUG(717, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy715; + if (yych == 'Y') goto yy718; if (yych != 'y') goto yy187; -yy715: - YYDEBUG(715, *YYCURSOR); +yy718: + YYDEBUG(718, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(716, *YYCURSOR); + YYDEBUG(719, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1047 "Zend/zend_language_scanner.l" +#line 1046 "Zend/zend_language_scanner.l" { return T_FINALLY; } -#line 6638 "Zend/zend_language_scanner.c" -yy717: - YYDEBUG(717, *YYCURSOR); +#line 6656 "Zend/zend_language_scanner.c" +yy720: + YYDEBUG(720, *YYCURSOR); yych = *++YYCURSOR; if (yych <= 'F') { - if (yych == 'C') goto yy723; + if (yych == 'C') goto yy726; if (yych <= 'E') goto yy187; - goto yy724; + goto yy727; } else { if (yych <= 'c') { if (yych <= 'b') goto yy187; - goto yy723; + goto yy726; } else { - if (yych == 'f') goto yy724; + if (yych == 'f') goto yy727; goto yy187; } } -yy718: - YYDEBUG(718, *YYCURSOR); +yy721: + YYDEBUG(721, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy721; - if (yych == 'e') goto yy721; + if (yych == 'E') goto yy724; + if (yych == 'e') goto yy724; goto yy187; -yy719: - YYDEBUG(719, *YYCURSOR); +yy722: + YYDEBUG(722, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(720, *YYCURSOR); + YYDEBUG(723, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1079 "Zend/zend_language_scanner.l" +#line 1078 "Zend/zend_language_scanner.l" { return T_DO; } -#line 6673 "Zend/zend_language_scanner.c" -yy721: - YYDEBUG(721, *YYCURSOR); +#line 6691 "Zend/zend_language_scanner.c" +yy724: + YYDEBUG(724, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(722, *YYCURSOR); + YYDEBUG(725, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1019 "Zend/zend_language_scanner.l" +#line 1018 "Zend/zend_language_scanner.l" { return T_EXIT; } -#line 6686 "Zend/zend_language_scanner.c" -yy723: - YYDEBUG(723, *YYCURSOR); +#line 6704 "Zend/zend_language_scanner.c" +yy726: + YYDEBUG(726, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy730; - if (yych == 'l') goto yy730; + if (yych == 'L') goto yy733; + if (yych == 'l') goto yy733; goto yy187; -yy724: - YYDEBUG(724, *YYCURSOR); +yy727: + YYDEBUG(727, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy725; + if (yych == 'A') goto yy728; if (yych != 'a') goto yy187; -yy725: - YYDEBUG(725, *YYCURSOR); +yy728: + YYDEBUG(728, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy726; + if (yych == 'U') goto yy729; if (yych != 'u') goto yy187; -yy726: - YYDEBUG(726, *YYCURSOR); +yy729: + YYDEBUG(729, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy727; + if (yych == 'L') goto yy730; if (yych != 'l') goto yy187; -yy727: - YYDEBUG(727, *YYCURSOR); +yy730: + YYDEBUG(730, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy728; + if (yych == 'T') goto yy731; if (yych != 't') goto yy187; -yy728: - YYDEBUG(728, *YYCURSOR); +yy731: + YYDEBUG(731, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(729, *YYCURSOR); + YYDEBUG(732, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1127 "Zend/zend_language_scanner.l" +#line 1126 "Zend/zend_language_scanner.l" { return T_DEFAULT; } -#line 6725 "Zend/zend_language_scanner.c" -yy730: - YYDEBUG(730, *YYCURSOR); +#line 6743 "Zend/zend_language_scanner.c" +yy733: + YYDEBUG(733, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy731; + if (yych == 'A') goto yy734; if (yych != 'a') goto yy187; -yy731: - YYDEBUG(731, *YYCURSOR); +yy734: + YYDEBUG(734, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy732; + if (yych == 'R') goto yy735; if (yych != 'r') goto yy187; -yy732: - YYDEBUG(732, *YYCURSOR); +yy735: + YYDEBUG(735, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy733; + if (yych == 'E') goto yy736; if (yych != 'e') goto yy187; -yy733: - YYDEBUG(733, *YYCURSOR); +yy736: + YYDEBUG(736, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(734, *YYCURSOR); + YYDEBUG(737, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1099 "Zend/zend_language_scanner.l" +#line 1098 "Zend/zend_language_scanner.l" { return T_DECLARE; } -#line 6753 "Zend/zend_language_scanner.c" -yy735: - YYDEBUG(735, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'H') goto yy797; - if (yych == 'h') goto yy797; - goto yy187; -yy736: - YYDEBUG(736, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'S') goto yy791; - if (yych == 's') goto yy791; - goto yy187; -yy737: - YYDEBUG(737, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'P') goto yy787; - if (yych == 'p') goto yy787; - goto yy187; +#line 6771 "Zend/zend_language_scanner.c" yy738: YYDEBUG(738, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy753; - if (yych == 'd') goto yy753; + if (yych == 'H') goto yy800; + if (yych == 'h') goto yy800; goto yy187; yy739: YYDEBUG(739, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy750; - if (yych == 'a') goto yy750; + if (yych == 'S') goto yy794; + if (yych == 's') goto yy794; goto yy187; yy740: YYDEBUG(740, *YYCURSOR); yych = *++YYCURSOR; + if (yych == 'P') goto yy790; + if (yych == 'p') goto yy790; + goto yy187; +yy741: + YYDEBUG(741, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'D') goto yy756; + if (yych == 'd') goto yy756; + goto yy187; +yy742: + YYDEBUG(742, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'A') goto yy753; + if (yych == 'a') goto yy753; + goto yy187; +yy743: + YYDEBUG(743, *YYCURSOR); + yych = *++YYCURSOR; if (yych <= 'T') { - if (yych == 'I') goto yy741; + if (yych == 'I') goto yy744; if (yych <= 'S') goto yy187; - goto yy742; + goto yy745; } else { if (yych <= 'i') { if (yych <= 'h') goto yy187; } else { - if (yych == 't') goto yy742; + if (yych == 't') goto yy745; goto yy187; } } -yy741: - YYDEBUG(741, *YYCURSOR); +yy744: + YYDEBUG(744, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy748; - if (yych == 't') goto yy748; + if (yych == 'T') goto yy751; + if (yych == 't') goto yy751; goto yy187; -yy742: - YYDEBUG(742, *YYCURSOR); +yy745: + YYDEBUG(745, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy743; + if (yych == 'E') goto yy746; if (yych != 'e') goto yy187; -yy743: - YYDEBUG(743, *YYCURSOR); +yy746: + YYDEBUG(746, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy744; + if (yych == 'N') goto yy747; if (yych != 'n') goto yy187; -yy744: - YYDEBUG(744, *YYCURSOR); +yy747: + YYDEBUG(747, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy745; + if (yych == 'D') goto yy748; if (yych != 'd') goto yy187; -yy745: - YYDEBUG(745, *YYCURSOR); +yy748: + YYDEBUG(748, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy746; + if (yych == 'S') goto yy749; if (yych != 's') goto yy187; -yy746: - YYDEBUG(746, *YYCURSOR); +yy749: + YYDEBUG(749, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(747, *YYCURSOR); + YYDEBUG(750, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1163 "Zend/zend_language_scanner.l" +#line 1162 "Zend/zend_language_scanner.l" { return T_EXTENDS; } -#line 6837 "Zend/zend_language_scanner.c" -yy748: - YYDEBUG(748, *YYCURSOR); +#line 6855 "Zend/zend_language_scanner.c" +yy751: + YYDEBUG(751, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(749, *YYCURSOR); + YYDEBUG(752, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1015 "Zend/zend_language_scanner.l" +#line 1014 "Zend/zend_language_scanner.l" { return T_EXIT; } -#line 6850 "Zend/zend_language_scanner.c" -yy750: - YYDEBUG(750, *YYCURSOR); +#line 6868 "Zend/zend_language_scanner.c" +yy753: + YYDEBUG(753, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy751; + if (yych == 'L') goto yy754; if (yych != 'l') goto yy187; -yy751: - YYDEBUG(751, *YYCURSOR); +yy754: + YYDEBUG(754, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(752, *YYCURSOR); + YYDEBUG(755, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1247 "Zend/zend_language_scanner.l" +#line 1250 "Zend/zend_language_scanner.l" { return T_EVAL; } -#line 6868 "Zend/zend_language_scanner.c" -yy753: - YYDEBUG(753, *YYCURSOR); +#line 6886 "Zend/zend_language_scanner.c" +yy756: + YYDEBUG(756, *YYCURSOR); yych = *++YYCURSOR; YYDEBUG(-1, yych); switch (yych) { case 'D': - case 'd': goto yy754; + case 'd': goto yy757; case 'F': - case 'f': goto yy755; + case 'f': goto yy758; case 'I': - case 'i': goto yy756; + case 'i': goto yy759; case 'S': - case 's': goto yy757; + case 's': goto yy760; case 'W': - case 'w': goto yy758; + case 'w': goto yy761; default: goto yy187; } -yy754: - YYDEBUG(754, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy780; - if (yych == 'e') goto yy780; - goto yy187; -yy755: - YYDEBUG(755, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'O') goto yy772; - if (yych == 'o') goto yy772; - goto yy187; -yy756: - YYDEBUG(756, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'F') goto yy770; - if (yych == 'f') goto yy770; - goto yy187; yy757: YYDEBUG(757, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'W') goto yy764; - if (yych == 'w') goto yy764; + if (yych == 'E') goto yy783; + if (yych == 'e') goto yy783; goto yy187; yy758: YYDEBUG(758, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy759; - if (yych != 'h') goto yy187; + if (yych == 'O') goto yy775; + if (yych == 'o') goto yy775; + goto yy187; yy759: YYDEBUG(759, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy760; - if (yych != 'i') goto yy187; + if (yych == 'F') goto yy773; + if (yych == 'f') goto yy773; + goto yy187; yy760: YYDEBUG(760, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy761; - if (yych != 'l') goto yy187; + if (yych == 'W') goto yy767; + if (yych == 'w') goto yy767; + goto yy187; yy761: YYDEBUG(761, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy762; - if (yych != 'e') goto yy187; + if (yych == 'H') goto yy762; + if (yych != 'h') goto yy187; yy762: YYDEBUG(762, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'I') goto yy763; + if (yych != 'i') goto yy187; +yy763: + YYDEBUG(763, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'L') goto yy764; + if (yych != 'l') goto yy187; +yy764: + YYDEBUG(764, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy765; + if (yych != 'e') goto yy187; +yy765: + YYDEBUG(765, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(763, *YYCURSOR); + YYDEBUG(766, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1075 "Zend/zend_language_scanner.l" +#line 1074 "Zend/zend_language_scanner.l" { return T_ENDWHILE; } -#line 6942 "Zend/zend_language_scanner.c" -yy764: - YYDEBUG(764, *YYCURSOR); +#line 6960 "Zend/zend_language_scanner.c" +yy767: + YYDEBUG(767, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy765; + if (yych == 'I') goto yy768; if (yych != 'i') goto yy187; -yy765: - YYDEBUG(765, *YYCURSOR); +yy768: + YYDEBUG(768, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy766; + if (yych == 'T') goto yy769; if (yych != 't') goto yy187; -yy766: - YYDEBUG(766, *YYCURSOR); +yy769: + YYDEBUG(769, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy767; + if (yych == 'C') goto yy770; if (yych != 'c') goto yy187; -yy767: - YYDEBUG(767, *YYCURSOR); +yy770: + YYDEBUG(770, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy768; + if (yych == 'H') goto yy771; if (yych != 'h') goto yy187; -yy768: - YYDEBUG(768, *YYCURSOR); +yy771: + YYDEBUG(771, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(769, *YYCURSOR); + YYDEBUG(772, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1119 "Zend/zend_language_scanner.l" +#line 1118 "Zend/zend_language_scanner.l" { return T_ENDSWITCH; } -#line 6975 "Zend/zend_language_scanner.c" -yy770: - YYDEBUG(770, *YYCURSOR); +#line 6993 "Zend/zend_language_scanner.c" +yy773: + YYDEBUG(773, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(771, *YYCURSOR); + YYDEBUG(774, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1063 "Zend/zend_language_scanner.l" +#line 1062 "Zend/zend_language_scanner.l" { return T_ENDIF; } -#line 6988 "Zend/zend_language_scanner.c" -yy772: - YYDEBUG(772, *YYCURSOR); +#line 7006 "Zend/zend_language_scanner.c" +yy775: + YYDEBUG(775, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy773; + if (yych == 'R') goto yy776; if (yych != 'r') goto yy187; -yy773: - YYDEBUG(773, *YYCURSOR); +yy776: + YYDEBUG(776, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '^') { if (yych <= '@') { - if (yych <= '/') goto yy774; + if (yych <= '/') goto yy777; if (yych <= '9') goto yy186; } else { - if (yych == 'E') goto yy775; + if (yych == 'E') goto yy778; if (yych <= 'Z') goto yy186; } } else { if (yych <= 'd') { if (yych != '`') goto yy186; } else { - if (yych <= 'e') goto yy775; + if (yych <= 'e') goto yy778; if (yych <= 'z') goto yy186; if (yych >= 0x7F) goto yy186; } } -yy774: - YYDEBUG(774, *YYCURSOR); +yy777: + YYDEBUG(777, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1087 "Zend/zend_language_scanner.l" +#line 1086 "Zend/zend_language_scanner.l" { return T_ENDFOR; } -#line 7021 "Zend/zend_language_scanner.c" -yy775: - YYDEBUG(775, *YYCURSOR); +#line 7039 "Zend/zend_language_scanner.c" +yy778: + YYDEBUG(778, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy776; + if (yych == 'A') goto yy779; if (yych != 'a') goto yy187; -yy776: - YYDEBUG(776, *YYCURSOR); +yy779: + YYDEBUG(779, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy777; + if (yych == 'C') goto yy780; if (yych != 'c') goto yy187; -yy777: - YYDEBUG(777, *YYCURSOR); +yy780: + YYDEBUG(780, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy778; + if (yych == 'H') goto yy781; if (yych != 'h') goto yy187; -yy778: - YYDEBUG(778, *YYCURSOR); +yy781: + YYDEBUG(781, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(779, *YYCURSOR); + YYDEBUG(782, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1095 "Zend/zend_language_scanner.l" +#line 1094 "Zend/zend_language_scanner.l" { return T_ENDFOREACH; } -#line 7049 "Zend/zend_language_scanner.c" -yy780: - YYDEBUG(780, *YYCURSOR); +#line 7067 "Zend/zend_language_scanner.c" +yy783: + YYDEBUG(783, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy781; + if (yych == 'C') goto yy784; if (yych != 'c') goto yy187; -yy781: - YYDEBUG(781, *YYCURSOR); +yy784: + YYDEBUG(784, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy782; + if (yych == 'L') goto yy785; if (yych != 'l') goto yy187; -yy782: - YYDEBUG(782, *YYCURSOR); +yy785: + YYDEBUG(785, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy783; + if (yych == 'A') goto yy786; if (yych != 'a') goto yy187; -yy783: - YYDEBUG(783, *YYCURSOR); +yy786: + YYDEBUG(786, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy784; + if (yych == 'R') goto yy787; if (yych != 'r') goto yy187; -yy784: - YYDEBUG(784, *YYCURSOR); +yy787: + YYDEBUG(787, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy785; + if (yych == 'E') goto yy788; if (yych != 'e') goto yy187; -yy785: - YYDEBUG(785, *YYCURSOR); +yy788: + YYDEBUG(788, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(786, *YYCURSOR); + YYDEBUG(789, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1103 "Zend/zend_language_scanner.l" +#line 1102 "Zend/zend_language_scanner.l" { return T_ENDDECLARE; } -#line 7087 "Zend/zend_language_scanner.c" -yy787: - YYDEBUG(787, *YYCURSOR); +#line 7105 "Zend/zend_language_scanner.c" +yy790: + YYDEBUG(790, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy788; + if (yych == 'T') goto yy791; if (yych != 't') goto yy187; -yy788: - YYDEBUG(788, *YYCURSOR); +yy791: + YYDEBUG(791, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy789; + if (yych == 'Y') goto yy792; if (yych != 'y') goto yy187; -yy789: - YYDEBUG(789, *YYCURSOR); +yy792: + YYDEBUG(792, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(790, *YYCURSOR); + YYDEBUG(793, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1287 "Zend/zend_language_scanner.l" +#line 1290 "Zend/zend_language_scanner.l" { return T_EMPTY; } -#line 7110 "Zend/zend_language_scanner.c" -yy791: - YYDEBUG(791, *YYCURSOR); +#line 7128 "Zend/zend_language_scanner.c" +yy794: + YYDEBUG(794, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy792; + if (yych == 'E') goto yy795; if (yych != 'e') goto yy187; -yy792: - YYDEBUG(792, *YYCURSOR); +yy795: + YYDEBUG(795, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '^') { if (yych <= '@') { - if (yych <= '/') goto yy793; + if (yych <= '/') goto yy796; if (yych <= '9') goto yy186; } else { - if (yych == 'I') goto yy794; + if (yych == 'I') goto yy797; if (yych <= 'Z') goto yy186; } } else { if (yych <= 'h') { if (yych != '`') goto yy186; } else { - if (yych <= 'i') goto yy794; + if (yych <= 'i') goto yy797; if (yych <= 'z') goto yy186; if (yych >= 0x7F) goto yy186; } } -yy793: - YYDEBUG(793, *YYCURSOR); +yy796: + YYDEBUG(796, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1067 "Zend/zend_language_scanner.l" +#line 1066 "Zend/zend_language_scanner.l" { return T_ELSE; } -#line 7143 "Zend/zend_language_scanner.c" -yy794: - YYDEBUG(794, *YYCURSOR); +#line 7161 "Zend/zend_language_scanner.c" +yy797: + YYDEBUG(797, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy795; + if (yych == 'F') goto yy798; if (yych != 'f') goto yy187; -yy795: - YYDEBUG(795, *YYCURSOR); +yy798: + YYDEBUG(798, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(796, *YYCURSOR); + YYDEBUG(799, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1059 "Zend/zend_language_scanner.l" +#line 1058 "Zend/zend_language_scanner.l" { return T_ELSEIF; } -#line 7161 "Zend/zend_language_scanner.c" -yy797: - YYDEBUG(797, *YYCURSOR); +#line 7179 "Zend/zend_language_scanner.c" +yy800: + YYDEBUG(800, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy798; + if (yych == 'O') goto yy801; if (yych != 'o') goto yy187; -yy798: - YYDEBUG(798, *YYCURSOR); +yy801: + YYDEBUG(801, *YYCURSOR); ++YYCURSOR; if (yybm[0+(yych = *YYCURSOR)] & 4) { goto yy186; } - YYDEBUG(799, *YYCURSOR); + YYDEBUG(802, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1143 "Zend/zend_language_scanner.l" +#line 1142 "Zend/zend_language_scanner.l" { return T_ECHO; } -#line 7179 "Zend/zend_language_scanner.c" +#line 7197 "Zend/zend_language_scanner.c" } /* *********************************** */ yyc_ST_LOOKING_FOR_PROPERTY: @@ -7214,113 +7232,113 @@ int lex_scan(zval *zendlval TSRMLS_DC) 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, }; - YYDEBUG(800, *YYCURSOR); + YYDEBUG(803, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; if (yych <= '-') { if (yych <= '\r') { - if (yych <= 0x08) goto yy808; - if (yych <= '\n') goto yy802; - if (yych <= '\f') goto yy808; + if (yych <= 0x08) goto yy811; + if (yych <= '\n') goto yy805; + if (yych <= '\f') goto yy811; } else { - if (yych == ' ') goto yy802; - if (yych <= ',') goto yy808; - goto yy804; + if (yych == ' ') goto yy805; + if (yych <= ',') goto yy811; + goto yy807; } } else { if (yych <= '_') { - if (yych <= '@') goto yy808; - if (yych <= 'Z') goto yy806; - if (yych <= '^') goto yy808; - goto yy806; + if (yych <= '@') goto yy811; + if (yych <= 'Z') goto yy809; + if (yych <= '^') goto yy811; + goto yy809; } else { - if (yych <= '`') goto yy808; - if (yych <= 'z') goto yy806; - if (yych <= '~') goto yy808; - goto yy806; + if (yych <= '`') goto yy811; + if (yych <= 'z') goto yy809; + if (yych <= '~') goto yy811; + goto yy809; } } -yy802: - YYDEBUG(802, *YYCURSOR); +yy805: + YYDEBUG(805, *YYCURSOR); ++YYCURSOR; yych = *YYCURSOR; - goto yy814; -yy803: - YYDEBUG(803, *YYCURSOR); + goto yy817; +yy806: + YYDEBUG(806, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1176 "Zend/zend_language_scanner.l" +#line 1175 "Zend/zend_language_scanner.l" { ZVAL_STRINGL(zendlval, yytext, yyleng, 0); /* no copying - intentional */ HANDLE_NEWLINES(yytext, yyleng); return T_WHITESPACE; } -#line 7258 "Zend/zend_language_scanner.c" -yy804: - YYDEBUG(804, *YYCURSOR); +#line 7276 "Zend/zend_language_scanner.c" +yy807: + YYDEBUG(807, *YYCURSOR); ++YYCURSOR; - if ((yych = *YYCURSOR) == '>') goto yy811; -yy805: - YYDEBUG(805, *YYCURSOR); + if ((yych = *YYCURSOR) == '>') goto yy814; +yy808: + YYDEBUG(808, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1193 "Zend/zend_language_scanner.l" +#line 1192 "Zend/zend_language_scanner.l" { yyless(0); yy_pop_state(TSRMLS_C); goto restart; } -#line 7272 "Zend/zend_language_scanner.c" -yy806: - YYDEBUG(806, *YYCURSOR); +#line 7290 "Zend/zend_language_scanner.c" +yy809: + YYDEBUG(809, *YYCURSOR); ++YYCURSOR; yych = *YYCURSOR; - goto yy810; -yy807: - YYDEBUG(807, *YYCURSOR); + goto yy813; +yy810: + YYDEBUG(810, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1186 "Zend/zend_language_scanner.l" +#line 1185 "Zend/zend_language_scanner.l" { yy_pop_state(TSRMLS_C); zend_copy_value(zendlval, yytext, yyleng); zendlval->type = IS_STRING; return T_STRING; } -#line 7288 "Zend/zend_language_scanner.c" -yy808: - YYDEBUG(808, *YYCURSOR); +#line 7306 "Zend/zend_language_scanner.c" +yy811: + YYDEBUG(811, *YYCURSOR); yych = *++YYCURSOR; - goto yy805; -yy809: - YYDEBUG(809, *YYCURSOR); + goto yy808; +yy812: + YYDEBUG(812, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy810: - YYDEBUG(810, *YYCURSOR); +yy813: + YYDEBUG(813, *YYCURSOR); if (yybm[0+yych] & 64) { - goto yy809; + goto yy812; } - goto yy807; -yy811: - YYDEBUG(811, *YYCURSOR); + goto yy810; +yy814: + YYDEBUG(814, *YYCURSOR); ++YYCURSOR; - YYDEBUG(812, *YYCURSOR); + YYDEBUG(815, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1182 "Zend/zend_language_scanner.l" +#line 1181 "Zend/zend_language_scanner.l" { return T_OBJECT_OPERATOR; } -#line 7313 "Zend/zend_language_scanner.c" -yy813: - YYDEBUG(813, *YYCURSOR); +#line 7331 "Zend/zend_language_scanner.c" +yy816: + YYDEBUG(816, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy814: - YYDEBUG(814, *YYCURSOR); +yy817: + YYDEBUG(817, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy813; + goto yy816; } - goto yy803; + goto yy806; } /* *********************************** */ yyc_ST_LOOKING_FOR_VARNAME: @@ -7359,74 +7377,74 @@ int lex_scan(zval *zendlval TSRMLS_DC) 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; - YYDEBUG(815, *YYCURSOR); + YYDEBUG(818, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; if (yych <= '_') { - if (yych <= '@') goto yy819; - if (yych <= 'Z') goto yy817; - if (yych <= '^') goto yy819; + if (yych <= '@') goto yy822; + if (yych <= 'Z') goto yy820; + if (yych <= '^') goto yy822; } else { - if (yych <= '`') goto yy819; - if (yych <= 'z') goto yy817; - if (yych <= '~') goto yy819; + if (yych <= '`') goto yy822; + if (yych <= 'z') goto yy820; + if (yych <= '~') goto yy822; } -yy817: - YYDEBUG(817, *YYCURSOR); +yy820: + YYDEBUG(820, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= '_') { if (yych <= '@') { - if (yych <= '/') goto yy818; - if (yych <= '9') goto yy821; + if (yych <= '/') goto yy821; + if (yych <= '9') goto yy824; } else { - if (yych <= '[') goto yy821; - if (yych >= '_') goto yy821; + if (yych <= '[') goto yy824; + if (yych >= '_') goto yy824; } } else { if (yych <= '|') { - if (yych <= '`') goto yy818; - if (yych <= 'z') goto yy821; + if (yych <= '`') goto yy821; + if (yych <= 'z') goto yy824; } else { - if (yych != '~') goto yy821; + if (yych != '~') goto yy824; } } -yy818: - YYDEBUG(818, *YYCURSOR); +yy821: + YYDEBUG(821, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1479 "Zend/zend_language_scanner.l" +#line 1482 "Zend/zend_language_scanner.l" { yyless(0); yy_pop_state(TSRMLS_C); yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); goto restart; } -#line 7405 "Zend/zend_language_scanner.c" -yy819: - YYDEBUG(819, *YYCURSOR); +#line 7423 "Zend/zend_language_scanner.c" +yy822: + YYDEBUG(822, *YYCURSOR); yych = *++YYCURSOR; - goto yy818; -yy820: - YYDEBUG(820, *YYCURSOR); + goto yy821; +yy823: + YYDEBUG(823, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy821: - YYDEBUG(821, *YYCURSOR); +yy824: + YYDEBUG(824, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy820; + goto yy823; } - if (yych == '[') goto yy823; - if (yych == '}') goto yy823; - YYDEBUG(822, *YYCURSOR); + if (yych == '[') goto yy826; + if (yych == '}') goto yy826; + YYDEBUG(825, *YYCURSOR); YYCURSOR = YYMARKER; - goto yy818; -yy823: - YYDEBUG(823, *YYCURSOR); + goto yy821; +yy826: + YYDEBUG(826, *YYCURSOR); ++YYCURSOR; - YYDEBUG(824, *YYCURSOR); + YYDEBUG(827, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1469 "Zend/zend_language_scanner.l" +#line 1472 "Zend/zend_language_scanner.l" { yyless(yyleng - 1); zend_copy_value(zendlval, yytext, yyleng); @@ -7435,18 +7453,18 @@ int lex_scan(zval *zendlval TSRMLS_DC) yy_push_state(ST_IN_SCRIPTING TSRMLS_CC); return T_STRING_VARNAME; } -#line 7439 "Zend/zend_language_scanner.c" +#line 7457 "Zend/zend_language_scanner.c" } /* *********************************** */ yyc_ST_NOWDOC: - YYDEBUG(825, *YYCURSOR); + YYDEBUG(828, *YYCURSOR); YYFILL(1); yych = *YYCURSOR; - YYDEBUG(827, *YYCURSOR); + YYDEBUG(830, *YYCURSOR); ++YYCURSOR; - YYDEBUG(828, *YYCURSOR); + YYDEBUG(831, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2299 "Zend/zend_language_scanner.l" +#line 2302 "Zend/zend_language_scanner.l" { int newline = 0; @@ -7503,7 +7521,7 @@ int lex_scan(zval *zendlval TSRMLS_DC) HANDLE_NEWLINES(yytext, yyleng - newline); return T_ENCAPSED_AND_WHITESPACE; } -#line 7507 "Zend/zend_language_scanner.c" +#line 7525 "Zend/zend_language_scanner.c" /* *********************************** */ yyc_ST_VAR_OFFSET: { @@ -7541,76 +7559,76 @@ int lex_scan(zval *zendlval TSRMLS_DC) 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, }; - YYDEBUG(829, *YYCURSOR); + YYDEBUG(832, *YYCURSOR); YYFILL(3); yych = *YYCURSOR; if (yych <= '/') { if (yych <= ' ') { if (yych <= '\f') { - if (yych <= 0x08) goto yy843; - if (yych <= '\n') goto yy839; - goto yy843; + if (yych <= 0x08) goto yy846; + if (yych <= '\n') goto yy842; + goto yy846; } else { - if (yych <= '\r') goto yy839; - if (yych <= 0x1F) goto yy843; - goto yy839; + if (yych <= '\r') goto yy842; + if (yych <= 0x1F) goto yy846; + goto yy842; } } else { if (yych <= '$') { - if (yych <= '"') goto yy838; - if (yych <= '#') goto yy839; - goto yy834; + if (yych <= '"') goto yy841; + if (yych <= '#') goto yy842; + goto yy837; } else { - if (yych == '\'') goto yy839; - goto yy838; + if (yych == '\'') goto yy842; + goto yy841; } } } else { if (yych <= '\\') { if (yych <= '@') { - if (yych <= '0') goto yy831; - if (yych <= '9') goto yy833; - goto yy838; + if (yych <= '0') goto yy834; + if (yych <= '9') goto yy836; + goto yy841; } else { - if (yych <= 'Z') goto yy841; - if (yych <= '[') goto yy838; - goto yy839; + if (yych <= 'Z') goto yy844; + if (yych <= '[') goto yy841; + goto yy842; } } else { if (yych <= '_') { - if (yych <= ']') goto yy836; - if (yych <= '^') goto yy838; - goto yy841; + if (yych <= ']') goto yy839; + if (yych <= '^') goto yy841; + goto yy844; } else { - if (yych <= '`') goto yy838; - if (yych <= 'z') goto yy841; - if (yych <= '~') goto yy838; - goto yy841; + if (yych <= '`') goto yy841; + if (yych <= 'z') goto yy844; + if (yych <= '~') goto yy841; + goto yy844; } } } -yy831: - YYDEBUG(831, *YYCURSOR); +yy834: + YYDEBUG(834, *YYCURSOR); yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'W') { if (yych <= '9') { - if (yych >= '0') goto yy855; + if (yych >= '0') goto yy858; } else { - if (yych == 'B') goto yy852; + if (yych == 'B') goto yy855; } } else { if (yych <= 'b') { - if (yych <= 'X') goto yy854; - if (yych >= 'b') goto yy852; + if (yych <= 'X') goto yy857; + if (yych >= 'b') goto yy855; } else { - if (yych == 'x') goto yy854; + if (yych == 'x') goto yy857; } } -yy832: - YYDEBUG(832, *YYCURSOR); +yy835: + YYDEBUG(835, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1555 "Zend/zend_language_scanner.l" +#line 1558 "Zend/zend_language_scanner.l" { /* Offset could be treated as a long */ if (yyleng < MAX_LENGTH_OF_LONG - 1 || (yyleng == MAX_LENGTH_OF_LONG - 1 && strcmp(yytext, long_min_digits) < 0)) { ZVAL_LONG(zendlval, strtol(yytext, NULL, 10)); @@ -7619,81 +7637,81 @@ int lex_scan(zval *zendlval TSRMLS_DC) } return T_NUM_STRING; } -#line 7623 "Zend/zend_language_scanner.c" -yy833: - YYDEBUG(833, *YYCURSOR); +#line 7641 "Zend/zend_language_scanner.c" +yy836: + YYDEBUG(836, *YYCURSOR); yych = *++YYCURSOR; - goto yy851; -yy834: - YYDEBUG(834, *YYCURSOR); + goto yy854; +yy837: + YYDEBUG(837, *YYCURSOR); ++YYCURSOR; if ((yych = *YYCURSOR) <= '_') { - if (yych <= '@') goto yy835; - if (yych <= 'Z') goto yy847; - if (yych >= '_') goto yy847; + if (yych <= '@') goto yy838; + if (yych <= 'Z') goto yy850; + if (yych >= '_') goto yy850; } else { - if (yych <= '`') goto yy835; - if (yych <= 'z') goto yy847; - if (yych >= 0x7F) goto yy847; + if (yych <= '`') goto yy838; + if (yych <= 'z') goto yy850; + if (yych >= 0x7F) goto yy850; } -yy835: - YYDEBUG(835, *YYCURSOR); +yy838: + YYDEBUG(838, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1831 "Zend/zend_language_scanner.l" +#line 1834 "Zend/zend_language_scanner.l" { /* Only '[' can be valid, but returning other tokens will allow a more explicit parse error */ return yytext[0]; } -#line 7648 "Zend/zend_language_scanner.c" -yy836: - YYDEBUG(836, *YYCURSOR); +#line 7666 "Zend/zend_language_scanner.c" +yy839: + YYDEBUG(839, *YYCURSOR); ++YYCURSOR; - YYDEBUG(837, *YYCURSOR); + YYDEBUG(840, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1826 "Zend/zend_language_scanner.l" +#line 1829 "Zend/zend_language_scanner.l" { yy_pop_state(TSRMLS_C); return ']'; } -#line 7659 "Zend/zend_language_scanner.c" -yy838: - YYDEBUG(838, *YYCURSOR); +#line 7677 "Zend/zend_language_scanner.c" +yy841: + YYDEBUG(841, *YYCURSOR); yych = *++YYCURSOR; - goto yy835; -yy839: - YYDEBUG(839, *YYCURSOR); + goto yy838; +yy842: + YYDEBUG(842, *YYCURSOR); ++YYCURSOR; - YYDEBUG(840, *YYCURSOR); + YYDEBUG(843, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1836 "Zend/zend_language_scanner.l" +#line 1839 "Zend/zend_language_scanner.l" { /* Invalid rule to return a more explicit parse error with proper line number */ yyless(0); yy_pop_state(TSRMLS_C); return T_ENCAPSED_AND_WHITESPACE; } -#line 7676 "Zend/zend_language_scanner.c" -yy841: - YYDEBUG(841, *YYCURSOR); +#line 7694 "Zend/zend_language_scanner.c" +yy844: + YYDEBUG(844, *YYCURSOR); ++YYCURSOR; yych = *YYCURSOR; - goto yy846; -yy842: - YYDEBUG(842, *YYCURSOR); + goto yy849; +yy845: + YYDEBUG(845, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1843 "Zend/zend_language_scanner.l" +#line 1846 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, yytext, yyleng); zendlval->type = IS_STRING; return T_STRING; } -#line 7691 "Zend/zend_language_scanner.c" -yy843: - YYDEBUG(843, *YYCURSOR); +#line 7709 "Zend/zend_language_scanner.c" +yy846: + YYDEBUG(846, *YYCURSOR); ++YYCURSOR; - YYDEBUG(844, *YYCURSOR); + YYDEBUG(847, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2357 "Zend/zend_language_scanner.l" +#line 2360 "Zend/zend_language_scanner.l" { if (YYCURSOR > YYLIMIT) { return 0; @@ -7702,116 +7720,116 @@ int lex_scan(zval *zendlval TSRMLS_DC) zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE); goto restart; } -#line 7706 "Zend/zend_language_scanner.c" -yy845: - YYDEBUG(845, *YYCURSOR); +#line 7724 "Zend/zend_language_scanner.c" +yy848: + YYDEBUG(848, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy846: - YYDEBUG(846, *YYCURSOR); +yy849: + YYDEBUG(849, *YYCURSOR); if (yybm[0+yych] & 16) { - goto yy845; + goto yy848; } - goto yy842; -yy847: - YYDEBUG(847, *YYCURSOR); + goto yy845; +yy850: + YYDEBUG(850, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(848, *YYCURSOR); + YYDEBUG(851, *YYCURSOR); if (yych <= '^') { if (yych <= '9') { - if (yych >= '0') goto yy847; + if (yych >= '0') goto yy850; } else { - if (yych <= '@') goto yy849; - if (yych <= 'Z') goto yy847; + if (yych <= '@') goto yy852; + if (yych <= 'Z') goto yy850; } } else { if (yych <= '`') { - if (yych <= '_') goto yy847; + if (yych <= '_') goto yy850; } else { - if (yych <= 'z') goto yy847; - if (yych >= 0x7F) goto yy847; + if (yych <= 'z') goto yy850; + if (yych >= 0x7F) goto yy850; } } -yy849: - YYDEBUG(849, *YYCURSOR); +yy852: + YYDEBUG(852, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1820 "Zend/zend_language_scanner.l" +#line 1823 "Zend/zend_language_scanner.l" { zend_copy_value(zendlval, (yytext+1), (yyleng-1)); zendlval->type = IS_STRING; return T_VARIABLE; } -#line 7748 "Zend/zend_language_scanner.c" -yy850: - YYDEBUG(850, *YYCURSOR); +#line 7766 "Zend/zend_language_scanner.c" +yy853: + YYDEBUG(853, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy851: - YYDEBUG(851, *YYCURSOR); +yy854: + YYDEBUG(854, *YYCURSOR); if (yybm[0+yych] & 32) { - goto yy850; + goto yy853; } - goto yy832; -yy852: - YYDEBUG(852, *YYCURSOR); + goto yy835; +yy855: + YYDEBUG(855, *YYCURSOR); yych = *++YYCURSOR; if (yybm[0+yych] & 128) { - goto yy860; + goto yy863; } -yy853: - YYDEBUG(853, *YYCURSOR); +yy856: + YYDEBUG(856, *YYCURSOR); YYCURSOR = YYMARKER; - goto yy832; -yy854: - YYDEBUG(854, *YYCURSOR); + goto yy835; +yy857: + YYDEBUG(857, *YYCURSOR); yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy858; + goto yy861; } - goto yy853; -yy855: - YYDEBUG(855, *YYCURSOR); + goto yy856; +yy858: + YYDEBUG(858, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(856, *YYCURSOR); - if (yych <= '/') goto yy857; - if (yych <= '9') goto yy855; -yy857: - YYDEBUG(857, *YYCURSOR); + YYDEBUG(859, *YYCURSOR); + if (yych <= '/') goto yy860; + if (yych <= '9') goto yy858; +yy860: + YYDEBUG(860, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1564 "Zend/zend_language_scanner.l" +#line 1567 "Zend/zend_language_scanner.l" { /* Offset must be treated as a string */ ZVAL_STRINGL(zendlval, yytext, yyleng, 1); return T_NUM_STRING; } -#line 7793 "Zend/zend_language_scanner.c" -yy858: - YYDEBUG(858, *YYCURSOR); +#line 7811 "Zend/zend_language_scanner.c" +yy861: + YYDEBUG(861, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(859, *YYCURSOR); + YYDEBUG(862, *YYCURSOR); if (yybm[0+yych] & 64) { - goto yy858; + goto yy861; } - goto yy857; -yy860: - YYDEBUG(860, *YYCURSOR); + goto yy860; +yy863: + YYDEBUG(863, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(861, *YYCURSOR); + YYDEBUG(864, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy860; + goto yy863; } - goto yy857; + goto yy860; } } -#line 2366 "Zend/zend_language_scanner.l" +#line 2369 "Zend/zend_language_scanner.l" } diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index f9c421fe8805a..f620cb8b4695b 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -1011,7 +1011,6 @@ NEWLINE ("\r"|"\n"|"\r\n") /* compute yyleng before each rule */ := yyleng = YYCURSOR - SCNG(yy_text); - "exit" { return T_EXIT; } @@ -1204,6 +1203,10 @@ NEWLINE ("\r"|"\n"|"\r\n") return T_NS_SEPARATOR; } +"..." { + return T_ELLIPSIS; +} + "new" { return T_NEW; } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 4621b47e0e69e..3a513215b2808 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -3279,6 +3279,37 @@ ZEND_VM_HANDLER(64, ZEND_RECV_INIT, ANY, CONST) ZEND_VM_NEXT_OPCODE(); } +ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, ANY, ANY) +{ + USE_OPLINE + zend_uint arg_num = opline->op1.num; + zend_uint arg_count = zend_vm_stack_get_args_count(TSRMLS_C); + zval **var_ptr, *params; + + SAVE_OPLINE(); + + var_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(execute_data, opline->result.var TSRMLS_CC); + Z_DELREF_PP(var_ptr); + MAKE_STD_ZVAL(params); + *var_ptr = params; + + if (arg_num <= arg_count) { + array_init_size(params, arg_count - arg_num + 1); + } else { + array_init(params); + } + + for (; arg_num <= arg_count; ++arg_num) { + zval **param = zend_vm_stack_get_arg(arg_num TSRMLS_CC); + zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, *param, opline->extended_value TSRMLS_CC); + zend_hash_next_index_insert(Z_ARRVAL_P(params), param, sizeof(zval *), NULL); + Z_ADDREF_PP(param); + } + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + ZEND_VM_HANDLER(52, ZEND_BOOL, CONST|TMP|VAR|CV, ANY) { USE_OPLINE diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 677cabe2a947f..7774e9654f147 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -742,6 +742,37 @@ static int ZEND_FASTCALL ZEND_RECV_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) ZEND_VM_NEXT_OPCODE(); } +static int ZEND_FASTCALL ZEND_RECV_VARIADIC_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_uint arg_num = opline->op1.num; + zend_uint arg_count = zend_vm_stack_get_args_count(TSRMLS_C); + zval **var_ptr, *params; + + SAVE_OPLINE(); + + var_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(execute_data, opline->result.var TSRMLS_CC); + Z_DELREF_PP(var_ptr); + MAKE_STD_ZVAL(params); + *var_ptr = params; + + if (arg_num <= arg_count) { + array_init_size(params, arg_count - arg_num + 1); + } else { + array_init(params); + } + + for (; arg_num <= arg_count; ++arg_num) { + zval **param = zend_vm_stack_get_arg(arg_num TSRMLS_CC); + zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, *param, opline->extended_value TSRMLS_CC); + zend_hash_next_index_insert(Z_ARRVAL_P(params), param, sizeof(zval *), NULL); + Z_ADDREF_PP(param); + } + + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + static int ZEND_FASTCALL ZEND_NEW_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -44895,6 +44926,31 @@ void zend_init_opcodes_handlers(void) ZEND_FAST_RET_SPEC_HANDLER, ZEND_FAST_RET_SPEC_HANDLER, ZEND_FAST_RET_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, + ZEND_RECV_VARIADIC_SPEC_HANDLER, ZEND_NULL_HANDLER }; zend_opcode_handlers = (opcode_handler_t*)labels; diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h index 859258a440bef..7624ec192d7e6 100644 --- a/Zend/zend_vm_opcodes.h +++ b/Zend/zend_vm_opcodes.h @@ -164,3 +164,4 @@ #define ZEND_GENERATOR_RETURN 161 #define ZEND_FAST_CALL 162 #define ZEND_FAST_RET 163 +#define ZEND_RECV_VARIADIC 164 diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 4e430b6ea2364..168b133c6429f 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -402,10 +402,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_convert_kana, 0, 0, 1) ZEND_ARG_INFO(0, encoding) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_convert_variables, 1, 0, 3) +ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_convert_variables, 0, 0, 3) ZEND_ARG_INFO(0, to) ZEND_ARG_INFO(0, from) - ZEND_ARG_INFO(1, ...) + ZEND_ARG_VARIADIC_INFO(1, vars) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_mb_encode_numericentity, 0, 0, 2) diff --git a/ext/mysqli/mysqli_fe.c b/ext/mysqli/mysqli_fe.c index 6f2e404087843..eb94ff65bbebf 100644 --- a/ext/mysqli/mysqli_fe.c +++ b/ext/mysqli/mysqli_fe.c @@ -43,23 +43,28 @@ #define MYSQLI_ZEND_ARG_OBJ_INFO_STMT() ZEND_ARG_INFO(0, stmt) #endif -ZEND_BEGIN_ARG_INFO(arginfo_mysqli_stmt_bind_result, 1) +ZEND_BEGIN_ARG_INFO(arginfo_mysqli_stmt_bind_result, 0) MYSQLI_ZEND_ARG_OBJ_INFO_STMT() + ZEND_ARG_VARIADIC_INFO(1, vars) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO(arginfo_mysqli_stmt_bind_param, 1) +ZEND_BEGIN_ARG_INFO(arginfo_mysqli_stmt_bind_param, 0) MYSQLI_ZEND_ARG_OBJ_INFO_STMT() ZEND_ARG_INFO(0, types) + ZEND_ARG_VARIADIC_INFO(1, vars) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO(arginfo_class_mysqli_stmt_bind_result, 1) +ZEND_BEGIN_ARG_INFO(arginfo_class_mysqli_stmt_bind_result, 0) + ZEND_ARG_VARIADIC_INFO(1, vars) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO(arginfo_class_mysqli_stmt_bind_param, 1) +ZEND_BEGIN_ARG_INFO(arginfo_class_mysqli_stmt_bind_param, 0) ZEND_ARG_INFO(0, types) + ZEND_ARG_VARIADIC_INFO(1, vars) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO(all_args_force_by_ref, 1) +ZEND_BEGIN_ARG_INFO(all_args_force_by_ref, 0) + ZEND_ARG_VARIADIC_INFO(1, vars) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_mysqli_poll, 0, 0, 4) diff --git a/ext/opcache/Optimizer/block_pass.c b/ext/opcache/Optimizer/block_pass.c index 1c34cffbf76e7..a4e661e3f897a 100644 --- a/ext/opcache/Optimizer/block_pass.c +++ b/ext/opcache/Optimizer/block_pass.c @@ -1899,7 +1899,7 @@ static void zend_jmp_optimization(zend_code_block *block, zend_op_array *op_arra #endif /* Find a set of variables which are used outside of the block where they are - * defined. We won't apply some optimization patterns for sush variables. */ + * defined. We won't apply some optimization patterns for such variables. */ static void zend_t_usage(zend_code_block *block, zend_op_array *op_array, char *used_ext) { zend_code_block *next_block = block->next; @@ -1931,6 +1931,7 @@ static void zend_t_usage(zend_code_block *block, zend_op_array *op_array, char * if (RESULT_USED(opline)) { if (!defined_here[VAR_NUM(ZEND_RESULT(opline).var)] && !used_ext[VAR_NUM(ZEND_RESULT(opline).var)] && (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT || + opline->opcode == ZEND_RECV_VARIADIC || (opline->opcode == ZEND_OP_DATA && ZEND_RESULT_TYPE(opline) == IS_TMP_VAR) || opline->opcode == ZEND_ADD_ARRAY_ELEMENT)) { /* these opcodes use the result as argument */ @@ -2015,6 +2016,7 @@ static void zend_t_usage(zend_code_block *block, zend_op_array *op_array, char * if (opline->opcode == ZEND_RECV || opline->opcode == ZEND_RECV_INIT || + opline->opcode == ZEND_RECV_VARIADIC || opline->opcode == ZEND_ADD_ARRAY_ELEMENT) { if (ZEND_OP1_TYPE(opline) == IS_VAR || ZEND_OP1_TYPE(opline) == IS_TMP_VAR) { usage[VAR_NUM(ZEND_RESULT(opline).var)] = 1; diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c index aec388c03f5d9..ee74e8592837e 100644 --- a/ext/pdo/pdo_dbh.c +++ b/ext/pdo/pdo_dbh.c @@ -1328,16 +1328,12 @@ int pdo_hash_methods(pdo_dbh_t *dbh, int kind TSRMLS_DC) } else { ifunc->required_num_args = info->required_num_args; } - if (info->pass_rest_by_reference) { - if (info->pass_rest_by_reference == ZEND_SEND_PREFER_REF) { - ifunc->fn_flags |= ZEND_ACC_PASS_REST_PREFER_REF; - } else { - ifunc->fn_flags |= ZEND_ACC_PASS_REST_BY_REFERENCE; - } - } if (info->return_reference) { ifunc->fn_flags |= ZEND_ACC_RETURN_REFERENCE; } + if (funcs->arg_info[funcs->num_args].is_variadic) { + ifunc->fn_flags |= ZEND_ACC_VARIADIC; + } } else { ifunc->arg_info = NULL; ifunc->num_args = 0; diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index b1f7484f243ca..cc148b39c5663 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -681,8 +681,8 @@ static zend_op* _get_recv_op(zend_op_array *op_array, zend_uint offset) ++offset; while (op < end) { - if ((op->opcode == ZEND_RECV || op->opcode == ZEND_RECV_INIT) - && op->op1.num == (long)offset) + if ((op->opcode == ZEND_RECV || op->opcode == ZEND_RECV_INIT + || op->opcode == ZEND_RECV_VARIADIC) && op->op1.num == (long)offset) { return op; } @@ -715,6 +715,9 @@ static void _parameter_string(string *str, zend_function *fptr, struct _zend_arg if (arg_info->pass_by_reference) { string_write(str, "&", sizeof("&")-1); } + if (arg_info->is_variadic) { + string_write(str, "...", sizeof("...")-1); + } if (arg_info->name) { string_printf(str, "$%s", arg_info->name); } else { @@ -2652,6 +2655,22 @@ ZEND_METHOD(reflection_parameter, getDefaultValueConstantName) } /* }}} */ +/* {{{ proto public bool ReflectionParameter::isVariadic() + Returns whether this parameter is a variadic parameter */ +ZEND_METHOD(reflection_parameter, isVariadic) +{ + reflection_object *intern; + parameter_reference *param; + + if (zend_parse_parameters_none() == FAILURE) { + return; + } + GET_REFLECTION_OBJECT_PTR(param); + + RETVAL_BOOL(param->arg_info->is_variadic); +} +/* }}} */ + /* {{{ proto public static mixed ReflectionMethod::export(mixed class, string name [, bool return]) throws ReflectionException Exports a reflection object. Returns the output if TRUE is specified for return, printing it otherwise. */ ZEND_METHOD(reflection_method, export) @@ -3095,6 +3114,14 @@ ZEND_METHOD(reflection_function, isGenerator) } /* }}} */ +/* {{{ proto public bool ReflectionFunction::isVariadic() + Returns whether this function is variadic */ +ZEND_METHOD(reflection_function, isVariadic) +{ + _function_check_flag(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_ACC_VARIADIC); +} +/* }}} */ + /* {{{ proto public bool ReflectionFunction::inNamespace() Returns whether this function is defined in namespace */ ZEND_METHOD(reflection_function, inNamespace) @@ -5720,6 +5747,7 @@ static const zend_function_entry reflection_function_abstract_functions[] = { ZEND_ME(reflection_function, isInternal, arginfo_reflection__void, 0) ZEND_ME(reflection_function, isUserDefined, arginfo_reflection__void, 0) ZEND_ME(reflection_function, isGenerator, arginfo_reflection__void, 0) + ZEND_ME(reflection_function, isVariadic, arginfo_reflection__void, 0) ZEND_ME(reflection_function, getClosureThis, arginfo_reflection__void, 0) ZEND_ME(reflection_function, getClosureScopeClass, arginfo_reflection__void, 0) ZEND_ME(reflection_function, getDocComment, arginfo_reflection__void, 0) @@ -6022,6 +6050,7 @@ static const zend_function_entry reflection_parameter_functions[] = { ZEND_ME(reflection_parameter, getDefaultValue, arginfo_reflection__void, 0) ZEND_ME(reflection_parameter, isDefaultValueConstant, arginfo_reflection__void, 0) ZEND_ME(reflection_parameter, getDefaultValueConstantName, arginfo_reflection__void, 0) + ZEND_ME(reflection_parameter, isVariadic, arginfo_reflection__void, 0) PHP_FE_END }; diff --git a/ext/reflection/tests/ReflectionFunction_isVariadic_basic.phpt b/ext/reflection/tests/ReflectionFunction_isVariadic_basic.phpt new file mode 100644 index 0000000000000..50b6bb495e449 --- /dev/null +++ b/ext/reflection/tests/ReflectionFunction_isVariadic_basic.phpt @@ -0,0 +1,18 @@ +--TEST-- +ReflectionFunction::isVariadic() +--FILE-- +isVariadic()); +var_dump((new ReflectionFunction('test2'))->isVariadic()); +var_dump((new ReflectionFunction('test3'))->isVariadic()); + +?> +--EXPECT-- +bool(false) +bool(true) +bool(true) diff --git a/ext/reflection/tests/ReflectionParameter_canBePassedByValue.phpt b/ext/reflection/tests/ReflectionParameter_canBePassedByValue.phpt index 82c62001226b2..4772f6548dcae 100644 --- a/ext/reflection/tests/ReflectionParameter_canBePassedByValue.phpt +++ b/ext/reflection/tests/ReflectionParameter_canBePassedByValue.phpt @@ -61,6 +61,10 @@ Name: SORT_REGULAR_or_SORT_NUMERIC_or_SORT_STRING Is passed by reference: yes Can be passed by value: yes +Name: more_array_and_sort_options +Is passed by reference: yes +Can be passed by value: yes + => sort: Name: arg diff --git a/ext/reflection/tests/ReflectionParameter_isVariadic_basic.phpt b/ext/reflection/tests/ReflectionParameter_isVariadic_basic.phpt new file mode 100644 index 0000000000000..370edc388df39 --- /dev/null +++ b/ext/reflection/tests/ReflectionParameter_isVariadic_basic.phpt @@ -0,0 +1,24 @@ +--TEST-- +ReflectionParameter::isVariadic() +--FILE-- +getParameters()[0]->isVariadic()); +var_dump($r2->getParameters()[0]->isVariadic()); +var_dump($r3->getParameters()[0]->isVariadic()); +var_dump($r3->getParameters()[1]->isVariadic()); + +?> +--EXPECT-- +bool(false) +bool(true) +bool(false) +bool(true) diff --git a/ext/reflection/tests/ReflectionParameter_toString_basic.phpt b/ext/reflection/tests/ReflectionParameter_toString_basic.phpt index 268ced15eca32..d1a23c758d3a3 100644 --- a/ext/reflection/tests/ReflectionParameter_toString_basic.phpt +++ b/ext/reflection/tests/ReflectionParameter_toString_basic.phpt @@ -4,7 +4,7 @@ ReflectionParameter::__toString() Stefan Koopmanschap --FILE-- $value) { --EXPECT-- Parameter #0 [ $test ] Parameter #1 [ $test2 = NULL ] +Parameter #2 [ ...$test3 ] ==DONE== diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 3dc7b7925c949..f73e8ee9f0db4 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -2938,8 +2938,9 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_fgetss, 0, 0, 0) ZEND_ARG_INFO(0, allowable_tags) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_fscanf, 1, 0, 1) +ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_fscanf, 0, 0, 1) ZEND_ARG_INFO(0, format) + ZEND_ARG_VARIADIC_INFO(1, vars) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_file_object_fwrite, 0, 0, 1) diff --git a/ext/spl/tests/bug51532.phpt b/ext/spl/tests/bug51532.phpt index 3a0722b2af68d..26eaa8f82f87d 100644 --- a/ext/spl/tests/bug51532.phpt +++ b/ext/spl/tests/bug51532.phpt @@ -4,7 +4,7 @@ SPL: Allow valid extension of SplFileObject::fscanf Date: Thu, 26 Sep 2013 19:43:32 +0200 Subject: [PATCH 166/400] Don't track parameter number in separate znode We already track it in the op array already. --- Zend/zend_compile.c | 5 +++-- Zend/zend_compile.h | 2 +- Zend/zend_language_parser.y | 13 +++++++------ 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 90ff26297ae16..25a604c4405ed 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1822,7 +1822,7 @@ void zend_do_end_function_declaration(const znode *function_token TSRMLS_DC) /* } /* }}} */ -void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, const znode *initialization, znode *class_type, zend_uchar pass_by_reference, zend_bool is_variadic TSRMLS_DC) /* {{{ */ +void zend_do_receive_param(zend_uchar op, znode *varname, const znode *initialization, znode *class_type, zend_uchar pass_by_reference, zend_bool is_variadic TSRMLS_DC) /* {{{ */ { zend_op *opline; zend_arg_info *cur_arg_info; @@ -1863,7 +1863,8 @@ void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, con CG(active_op_array)->num_args++; opline->opcode = op; SET_NODE(opline->result, &var); - SET_NODE(opline->op1, offset); + opline->op1_type = IS_UNUSED; + opline->op1.num = CG(active_op_array)->num_args; if (op == ZEND_RECV_INIT) { SET_NODE(opline->op2, initialization); } else { diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 0e070294125c8..f9520c98eacf2 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -501,7 +501,7 @@ void zend_do_add_variable(znode *result, const znode *op1, const znode *op2 TSRM int zend_do_verify_access_types(const znode *current_access_type, const znode *new_modifier); void zend_do_begin_function_declaration(znode *function_token, znode *function_name, int is_method, int return_reference, znode *fn_flags_znode TSRMLS_DC); void zend_do_end_function_declaration(const znode *function_token TSRMLS_DC); -void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, const znode *initialization, znode *class_type, zend_bool pass_by_reference, zend_bool is_variadic TSRMLS_DC); +void zend_do_receive_param(zend_uchar op, znode *varname, const znode *initialization, znode *class_type, zend_bool pass_by_reference, zend_bool is_variadic TSRMLS_DC); int zend_do_begin_function_call(znode *function_name, zend_bool check_namespace TSRMLS_DC); void zend_do_begin_method_call(znode *left_bracket TSRMLS_DC); void zend_do_clone(znode *result, const znode *expr TSRMLS_DC); diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 4523783dec8ce..d46149957ac5e 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -528,14 +528,15 @@ parameter_list: non_empty_parameter_list: + parameter + | non_empty_parameter_list ',' parameter +; + +parameter: optional_class_type is_reference is_variadic T_VARIABLE - { $$.op_type = IS_UNUSED; $$.u.op.num=1; zend_do_receive_arg(ZEND_RECV, &$4, &$$, NULL, &$1, $2.op_type, $3.op_type TSRMLS_CC); } + { zend_do_receive_param(ZEND_RECV, &$4, NULL, &$1, $2.op_type, $3.op_type TSRMLS_CC); } | optional_class_type is_reference is_variadic T_VARIABLE '=' static_scalar - { $$.op_type = IS_UNUSED; $$.u.op.num=1; zend_do_receive_arg(ZEND_RECV_INIT, &$4, &$$, &$6, &$1, $2.op_type, $3.op_type TSRMLS_CC); } - | non_empty_parameter_list ',' optional_class_type is_reference is_variadic T_VARIABLE - { $$=$1; $$.u.op.num++; zend_do_receive_arg(ZEND_RECV, &$6, &$$, NULL, &$3, $4.op_type, $5.op_type TSRMLS_CC); } - | non_empty_parameter_list ',' optional_class_type is_reference is_variadic T_VARIABLE '=' static_scalar - { $$=$1; $$.u.op.num++; zend_do_receive_arg(ZEND_RECV_INIT, &$6, &$$, &$8, &$3, $4.op_type, $5.op_type TSRMLS_CC); } + { zend_do_receive_param(ZEND_RECV_INIT, &$4, &$6, &$1, $2.op_type, $3.op_type TSRMLS_CC); } ; From ac05cfb49912dd87264573df930d0ead3c3e0cca Mon Sep 17 00:00:00 2001 From: Stanley Sufficool Date: Thu, 26 Sep 2013 19:53:47 -0700 Subject: [PATCH 167/400] FIX BUG #48539 - Disable TEXTLIMIT for FreeTDS driver --- ext/pdo_dblib/dblib_driver.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ext/pdo_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c index ff425147219ae..2aaf3975db18e 100644 --- a/ext/pdo_dblib/dblib_driver.c +++ b/ext/pdo_dblib/dblib_driver.c @@ -362,8 +362,10 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ goto cleanup; } +#if PHP_DBLIB_IS_MSSQL /* dblib do not return more than this length from text/image */ DBSETOPT(H->link, DBTEXTLIMIT, "2147483647"); +#endif /* limit text/image from network */ DBSETOPT(H->link, DBTEXTSIZE, "2147483647"); From 5ac7c533a0334f384d1a74eed6172a3c8cc4ef49 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Thu, 26 Sep 2013 21:12:11 -0700 Subject: [PATCH 168/400] More OCI8 DTrace probe updates. Change php.ini-* doc to match an earlier change to config.w32 --- ext/oci8/config.m4 | 2 +- ext/oci8/oci8.c | 37 +++++++++++++++++++++++++------------ ext/oci8/oci8_dtrace.d | 8 ++++---- ext/oci8/oci8_interface.c | 29 +++++++++++++++++++++++++++-- ext/oci8/oci8_statement.c | 16 ++++++++-------- ext/oci8/package.xml | 31 ++++++++++++++++++++++++------- ext/oci8/php_oci8.h | 2 +- ext/oci8/php_oci8_int.h | 3 +++ php.ini-development | 3 +-- php.ini-production | 3 +-- 10 files changed, 95 insertions(+), 39 deletions(-) diff --git a/ext/oci8/config.m4 b/ext/oci8/config.m4 index 49998d18f08ba..3873a2205aa36 100644 --- a/ext/oci8/config.m4 +++ b/ext/oci8/config.m4 @@ -124,7 +124,7 @@ dnl in GNU Make which causes the .d file to be overwritten (Bug 61268) 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 > \$[]@ + CFLAGS="\$(CFLAGS_CLEAN)" dtrace -h -C -s $ac_srcdir[$]ac_provsrc -o \$[]@.bak && \$(SED) -e 's,PHPOCI_,DTRACE_,g' \$[]@.bak > \$[]@ \$(OCI8_DTRACE_OBJS): $ac_bdir[$]ac_hdrobj diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index bccaa529b0c93..f04114d4d67cf 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 | + | Authors: Stig Sæther Bakken | | Thies C. Arntzen | | Maxim Maletsky | | | @@ -2097,6 +2097,9 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char connection = (php_oci_connection *) ecalloc(1, sizeof(php_oci_connection)); connection->hash_key = estrndup(hashed_details.c, hashed_details.len); connection->is_persistent = 0; +#ifdef HAVE_OCI8_DTRACE + connection->client_id = NULL; +#endif } else { connection = (php_oci_connection *) calloc(1, sizeof(php_oci_connection)); if (connection == NULL) { @@ -2108,11 +2111,17 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char return NULL; } connection->is_persistent = 1; +#ifdef HAVE_OCI8_DTRACE + connection->client_id = NULL; +#endif } } else { connection = (php_oci_connection *) ecalloc(1, sizeof(php_oci_connection)); connection->hash_key = estrndup(hashed_details.c, hashed_details.len); connection->is_persistent = 0; +#ifdef HAVE_OCI8_DTRACE + connection->client_id = NULL; +#endif } /* {{{ Get the session pool that suits this connection request from the persistent list. This @@ -2366,17 +2375,15 @@ static int php_oci_connection_close(php_oci_connection *connection TSRMLS_DC) php_oci_spool_close(connection->private_spool TSRMLS_CC); } - if (connection->is_persistent) { - if (connection->hash_key) { - free(connection->hash_key); - } - free(connection); - } else { - if (connection->hash_key) { - efree(connection->hash_key); - } - efree(connection); + if (connection->hash_key) { + pefree(connection->hash_key, connection->is_persistent); + } +#ifdef HAVE_OCI8_DTRACE + if (connection->client_id) { + pefree(connection->client_id, connection->is_persistent); } +#endif /* HAVE_OCI8_DTRACE */ + pefree(connection, connection->is_persistent); connection = NULL; OCI_G(in_call) = in_call_save; return result; @@ -2463,6 +2470,12 @@ int php_oci_connection_release(php_oci_connection *connection TSRMLS_DC) * the OCI session */ connection->next_pingp = NULL; +#ifdef HAVE_OCI8_DTRACE + if (connection->client_id) { + pefree(connection->client_id, connection->is_persistent); + connection->client_id = NULL; + } +#endif /* HAVE_OCI8_DTRACE */ } OCI_G(in_call) = in_call_save; @@ -3500,7 +3513,7 @@ void php_oci_dtrace_check_connection(php_oci_connection *connection, sb4 errcode { #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); + DTRACE_OCI8_CHECK_CONNECTION(connection, connection->client_id, connection->is_open ? 1 : 0, (long)errcode, (unsigned long)serverStatus); } #endif /* HAVE_OCI8_DTRACE */ } diff --git a/ext/oci8/oci8_dtrace.d b/ext/oci8/oci8_dtrace.d index 8ac94105c13cd..30c98de912828 100644 --- a/ext/oci8/oci8_dtrace.d +++ b/ext/oci8/oci8_dtrace.d @@ -16,14 +16,14 @@ +----------------------------------------------------------------------+ */ -provider php { - probe oci8__check__connection(void *connection, int is_open, long errcode, unsigned long server_status); +provider phpoci { + probe oci8__check__connection(void *connection, char *client_id, 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__execute__mode(void *connection, char *client_id, void *statement, unsigned int mode); + probe oci8__sqltext(void *connection, char *client_id, void *statement, char *sql); probe oci8__connect__p__dtor__close(void *connection); probe oci8__connect__p__dtor__release(void *connection); diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c index 8d70aff9c2b42..3fad90d9c7c84 100644 --- a/ext/oci8/oci8_interface.c +++ b/ext/oci8/oci8_interface.c @@ -1772,6 +1772,30 @@ PHP_FUNCTION(oci_set_client_identifier) RETURN_FALSE; } +#ifdef HAVE_OCI8_DTRACE + /* The alternatives to storing client_id like done below are + i) display it in a probe here in oci_set_client_identifier and + let the user D script correlate the connection address probe + argument and the client_id. This would likely require user D + script variables, which would use kernel memory. + ii) call OCIAttrGet for each probe definition that uses + client_id. This would be slower than storing it. + */ + + if (connection->client_id) { + pefree(connection->client_id, connection->is_persistent); + } + + if (client_id) { + /* this long winded copy allows compatibility with older PHP versions */ + connection->client_id = (char *)safe_emalloc(client_id_len+1, sizeof(char), connection->is_persistent); + memcpy(connection->client_id, client_id, client_id_len); + connection->client_id[client_id_len] = '\0'; + } else { + connection->client_id = NULL; + } +#endif /* HAVE_OCI8_DTRACE */ + RETURN_TRUE; } /* }}} */ @@ -1790,13 +1814,14 @@ PHP_FUNCTION(oci_set_edition) if (OCI_G(edition)) { efree(OCI_G(edition)); - OCI_G(edition) = NULL; } if (edition) { - OCI_G(edition) = (char *)safe_emalloc(edition_len+1, sizeof(text), 0); + OCI_G(edition) = (char *)safe_emalloc(edition_len+1, sizeof(char), 0); memcpy(OCI_G(edition), edition, edition_len); OCI_G(edition)[edition_len] = '\0'; + } else { + OCI_G(edition) = NULL; } RETURN_TRUE; diff --git a/ext/oci8/oci8_statement.c b/ext/oci8/oci8_statement.c index 274c4e9e33b40..1e66308e53ca4 100644 --- a/ext/oci8/oci8_statement.c +++ b/ext/oci8/oci8_statement.c @@ -55,14 +55,8 @@ php_oci_statement *php_oci_statement_create(php_oci_connection *connection, char 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) { @@ -79,6 +73,12 @@ php_oci_statement *php_oci_statement_create(php_oci_connection *connection, char OCI_DEFAULT ) ); +#ifdef HAVE_OCI8_DTRACE + if (DTRACE_OCI8_SQLTEXT_ENABLED()) { + DTRACE_OCI8_SQLTEXT(connection, connection->client_id, statement, query); + } +#endif /* HAVE_OCI8_DTRACE */ + if (errstatus != OCI_SUCCESS) { connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); @@ -498,7 +498,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) /* only these are allowed */ #ifdef HAVE_OCI8_DTRACE if (DTRACE_OCI8_EXECUTE_MODE_ENABLED()) { - DTRACE_OCI8_EXECUTE_MODE(statement->connection, mode); + DTRACE_OCI8_EXECUTE_MODE(statement->connection, statement->connection->client_id, statement, mode); } #endif /* HAVE_OCI8_DTRACE */ break; diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index fcab20cc4544b..24ba635fef6dc 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -40,12 +40,12 @@ http://pear.php.net/dtd/package-2.0.xsd"> no - 2013-09-06 + 2013-09-27 - 2.0.2 - 2.0.2 + 2.0.3 + 2.0.3 devel @@ -53,10 +53,9 @@ http://pear.php.net/dtd/package-2.0.xsd"> PHP -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. +Add the oci_set_client_identifier() value and statement structure pointer to several DTrace probes. +Use 'phpoci' as the DTrace provider name since uniqueness is required by the Linux fasttrap module. +Update Windows builds to create only php_oci8_12c.dll. @@ -455,6 +454,24 @@ Add the connection handle to several DTrace probes. + + + 2.0.2 + 2.0.2 + + + devel + devel + + PHP + +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. + + + 2.0.1 diff --git a/ext/oci8/php_oci8.h b/ext/oci8/php_oci8.h index 8c5fba9ab0873..6d02eff6b27af 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 "2.0.2-dev" +#define PHP_OCI8_VERSION "2.0.3-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 6155a883b02e1..2d4ff26947e99 100644 --- a/ext/oci8/php_oci8_int.h +++ b/ext/oci8/php_oci8_int.h @@ -156,6 +156,9 @@ typedef struct { 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 */ +#ifdef HAVE_OCI8_DTRACE + char *client_id; /* The oci_set_client_identifier() value */ +#endif } php_oci_connection; /* }}} */ diff --git a/php.ini-development b/php.ini-development index beebabbd24f07..cc1cae2986834 100644 --- a/php.ini-development +++ b/php.ini-development @@ -884,8 +884,7 @@ default_socket_timeout = 60 ;extension=php_exif.dll ; Must be after mbstring as it depends on it ;extension=php_mysql.dll ;extension=php_mysqli.dll -;extension=php_oci8.dll ; Use with Oracle 10gR2 Instant Client -;extension=php_oci8_11g.dll ; Use with Oracle 11gR2 Instant Client +;extension=php_oci8_12c.dll ; Use with Oracle Database 12c Instant Client ;extension=php_openssl.dll ;extension=php_pdo_firebird.dll ;extension=php_pdo_mysql.dll diff --git a/php.ini-production b/php.ini-production index 5a95344cb451e..8ed89c799cce7 100644 --- a/php.ini-production +++ b/php.ini-production @@ -884,8 +884,7 @@ default_socket_timeout = 60 ;extension=php_exif.dll ; Must be after mbstring as it depends on it ;extension=php_mysql.dll ;extension=php_mysqli.dll -;extension=php_oci8.dll ; Use with Oracle 10gR2 Instant Client -;extension=php_oci8_11g.dll ; Use with Oracle 11gR2 Instant Client +;extension=php_oci8_12c.dll ; Use with Oracle Database 12c Instant Client ;extension=php_openssl.dll ;extension=php_pdo_firebird.dll ;extension=php_pdo_mysql.dll From edd93f34520b550c4c42877fe9e03112cad005ba Mon Sep 17 00:00:00 2001 From: datibbaw Date: Fri, 27 Sep 2013 14:13:11 +0800 Subject: [PATCH 169/400] Support string and array for peer fingerprint matching --- ext/openssl/openssl.c | 87 ++++++++++++++----- .../tests/openssl_peer_fingerprint.phpt | 20 ++++- 2 files changed, 82 insertions(+), 25 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index a6ddd1458c98f..c0d1b0bf2ddbc 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1672,7 +1672,7 @@ PHP_FUNCTION(openssl_x509_export) } /* }}} */ -int php_openssl_x509_fingerprint(X509 *peer, const char *method, int raw, char **out, int *out_len) +static int php_openssl_x509_fingerprint(X509 *peer, const char *method, int raw, char **out, int *out_len) { unsigned char md[EVP_MAX_MD_SIZE]; const EVP_MD *mdtype; @@ -1699,6 +1699,61 @@ int php_openssl_x509_fingerprint(X509 *peer, const char *method, int raw, char * return 1; } +static int php_x509_fingerprint_cmp(X509 *peer, const char *method, const char *expected) +{ + char *fingerprint; + int fingerprint_len; + int result = -1; + + if (php_openssl_x509_fingerprint(peer, method, 0, &fingerprint, &fingerprint_len)) { + result = strcmp(expected, fingerprint); + efree(fingerprint); + } + + return result; +} + +static int php_x509_fingerprint_match(X509 *peer, zval **val) +{ + if (Z_TYPE_PP(val) == IS_STRING) { + const char *method = NULL; + + switch (Z_STRLEN_PP(val)) { + case 32: + method = "md5"; + break; + + case 40: + method = "sha1"; + break; + } + + return method && php_x509_fingerprint_cmp(peer, method, Z_STRVAL_PP(val)) == 0; + } else if (Z_TYPE_PP(val) == IS_ARRAY) { + HashPosition pos; + zval **current; + char *key; + uint key_len; + ulong key_index; + + for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL_PP(val), &pos); + zend_hash_get_current_data_ex(Z_ARRVAL_PP(val), (void **)¤t, &pos) == SUCCESS; + zend_hash_move_forward_ex(Z_ARRVAL_PP(val), &pos) + ) { + int key_type = zend_hash_get_current_key_ex(Z_ARRVAL_PP(val), &key, &key_len, &key_index, 0, &pos); + + if (key_type == HASH_KEY_IS_STRING + && Z_TYPE_PP(current) == IS_STRING + && php_x509_fingerprint_cmp(peer, key, Z_STRVAL_PP(current)) != 0 + ) { + return 0; + } + } + return 1; + } + return 0; +} + PHP_FUNCTION(openssl_x509_fingerprint) { X509 *cert; @@ -1709,7 +1764,7 @@ PHP_FUNCTION(openssl_x509_fingerprint) int method_len; char *fingerprint; - char *fingerprint_len; + int fingerprint_len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|sb", &zcert, &method, &method_len, &raw_output) == FAILURE) { return; @@ -4932,30 +4987,14 @@ int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stre /* if the cert passed the usual checks, apply our own local policies now */ - if (GET_VER_OPT("peer_fingerprint") && Z_TYPE_PP(val) == IS_STRING) { - char *fingerprint; - int fingerprint_len; - const char *method = NULL; - - switch (Z_STRLEN_PP(val)) { - case 32: - method = "md5"; - break; - - case 40: - method = "sha1"; - break; - } - - if (method && php_openssl_x509_fingerprint(peer, method, 0, &fingerprint, &fingerprint_len)) { - int match = strcmp(Z_STRVAL_PP(val), fingerprint) == 0; - - efree(fingerprint); - - if (!match) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer fingerprint `%s` not matched", Z_STRVAL_PP(val)); + if (GET_VER_OPT("peer_fingerprint")) { + if (Z_TYPE_PP(val) == IS_STRING || Z_TYPE_PP(val) == IS_ARRAY) { + if (!php_x509_fingerprint_match(peer, val)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer fingerprint doesn't match"); return FAILURE; } + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Expected peer fingerprint must be a string or an array"); } } diff --git a/ext/openssl/tests/openssl_peer_fingerprint.phpt b/ext/openssl/tests/openssl_peer_fingerprint.phpt index a6be676dcb44a..2960dffae506e 100644 --- a/ext/openssl/tests/openssl_peer_fingerprint.phpt +++ b/ext/openssl/tests/openssl_peer_fingerprint.phpt @@ -31,14 +31,32 @@ if ($pid == -1) { // should be: 81cafc260aa8d82956ebc6212a362ecc var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $contextC)); + + $contextC = stream_context_create( + array( + 'ssl' => array( + 'verify_peer' => true, + 'cafile' => __DIR__ . '/bug54992-ca.pem', + 'capture_peer_cert' => true, + 'peer_fingerprint' => array( + 'sha256' => '78ea579f2c3b439359dec5dac9d445108772927427c4780037e87df3799a0aa0', + ), + ) + ) + ); + + var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, + STREAM_CLIENT_CONNECT, $contextC)); } else { @pcntl_wait($status); @stream_socket_accept($server, 1); + @stream_socket_accept($server, 1); } --EXPECTF-- -Warning: stream_socket_client(): Peer fingerprint `81cafc260aa8d82956ebc6212a362ece` not matched in %s on line %d +Warning: stream_socket_client(): Peer fingerprint doesn't match in %s on line %d Warning: stream_socket_client(): Failed to enable crypto in %s on line %d Warning: stream_socket_client(): unable to connect to ssl://127.0.0.1:64321 (Unknown error) in %s on line %d bool(false) +resource(9) of type (stream) From 7a1a1aec8c90fff8a24dc53d2232e22fbca3d39f Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Fri, 27 Sep 2013 10:14:46 +0100 Subject: [PATCH 170/400] - Updated to version 2013.6 (2013f) --- ext/date/lib/timezonedb.h | 1578 ++++++++++++++++++------------------- 1 file changed, 784 insertions(+), 794 deletions(-) diff --git a/ext/date/lib/timezonedb.h b/ext/date/lib/timezonedb.h index 1e5706cdccd3c..8142aab565eb0 100644 --- a/ext/date/lib/timezonedb.h +++ b/ext/date/lib/timezonedb.h @@ -58,529 +58,529 @@ const timelib_tzdb_index_entry timezonedb_idx_builtin[579] = { { "America/Anguilla" , 0x002952 }, { "America/Antigua" , 0x0029A7 }, { "America/Araguaina" , 0x002A0D }, - { "America/Argentina/Buenos_Aires" , 0x002C67 }, - { "America/Argentina/Catamarca" , 0x002E15 }, - { "America/Argentina/ComodRivadavia" , 0x002FD6 }, - { "America/Argentina/Cordoba" , 0x00317C }, - { "America/Argentina/Jujuy" , 0x003351 }, - { "America/Argentina/La_Rioja" , 0x003505 }, - { "America/Argentina/Mendoza" , 0x0036BD }, - { "America/Argentina/Rio_Gallegos" , 0x00387D }, - { "America/Argentina/Salta" , 0x003A32 }, - { "America/Argentina/San_Juan" , 0x003BDE }, - { "America/Argentina/San_Luis" , 0x003D96 }, - { "America/Argentina/Tucuman" , 0x003F5C }, - { "America/Argentina/Ushuaia" , 0x004118 }, - { "America/Aruba" , 0x0042D3 }, - { "America/Asuncion" , 0x004339 }, - { "America/Atikokan" , 0x00461E }, - { "America/Atka" , 0x0046F4 }, - { "America/Bahia" , 0x004A5A }, - { "America/Bahia_Banderas" , 0x004BED }, - { "America/Barbados" , 0x004E66 }, - { "America/Belem" , 0x004F00 }, - { "America/Belize" , 0x004FFB }, - { "America/Blanc-Sablon" , 0x005177 }, - { "America/Boa_Vista" , 0x00522B }, - { "America/Bogota" , 0x005334 }, - { "America/Boise" , 0x0053A0 }, - { "America/Buenos_Aires" , 0x005737 }, - { "America/Cambridge_Bay" , 0x0058D0 }, - { "America/Campo_Grande" , 0x005BF8 }, - { "America/Cancun" , 0x005EE7 }, - { "America/Caracas" , 0x006129 }, - { "America/Catamarca" , 0x006190 }, - { "America/Cayenne" , 0x006336 }, - { "America/Cayman" , 0x006398 }, - { "America/Chicago" , 0x0063ED }, - { "America/Chihuahua" , 0x006904 }, - { "America/Coral_Harbour" , 0x006B6F }, - { "America/Cordoba" , 0x006C01 }, - { "America/Costa_Rica" , 0x006DA7 }, - { "America/Creston" , 0x006E31 }, - { "America/Cuiaba" , 0x006EBD }, - { "America/Curacao" , 0x00719B }, - { "America/Danmarkshavn" , 0x007201 }, - { "America/Dawson" , 0x007345 }, - { "America/Dawson_Creek" , 0x007662 }, - { "America/Denver" , 0x00783C }, - { "America/Detroit" , 0x007BC2 }, - { "America/Dominica" , 0x007F21 }, - { "America/Edmonton" , 0x007F76 }, - { "America/Eirunepe" , 0x00832E }, - { "America/El_Salvador" , 0x008441 }, - { "America/Ensenada" , 0x0084B6 }, - { "America/Fort_Wayne" , 0x00895D }, - { "America/Fortaleza" , 0x00881F }, - { "America/Glace_Bay" , 0x008BC7 }, - { "America/Godthab" , 0x008F3E }, - { "America/Goose_Bay" , 0x009202 }, - { "America/Grand_Turk" , 0x0096BF }, - { "America/Grenada" , 0x00996E }, - { "America/Guadeloupe" , 0x0099C3 }, - { "America/Guatemala" , 0x009A18 }, - { "America/Guayaquil" , 0x009AA1 }, - { "America/Guyana" , 0x009AFE }, - { "America/Halifax" , 0x009B7F }, - { "America/Havana" , 0x00A095 }, - { "America/Hermosillo" , 0x00A408 }, - { "America/Indiana/Indianapolis" , 0x00A4E6 }, - { "America/Indiana/Knox" , 0x00A777 }, - { "America/Indiana/Marengo" , 0x00AB0E }, - { "America/Indiana/Petersburg" , 0x00ADB4 }, - { "America/Indiana/Tell_City" , 0x00B301 }, - { "America/Indiana/Vevay" , 0x00B59A }, - { "America/Indiana/Vincennes" , 0x00B7D5 }, - { "America/Indiana/Winamac" , 0x00BA89 }, - { "America/Indianapolis" , 0x00B097 }, - { "America/Inuvik" , 0x00BD42 }, - { "America/Iqaluit" , 0x00C039 }, - { "America/Jamaica" , 0x00C35B }, - { "America/Jujuy" , 0x00C420 }, - { "America/Juneau" , 0x00C5CA }, - { "America/Kentucky/Louisville" , 0x00C948 }, - { "America/Kentucky/Monticello" , 0x00CD66 }, - { "America/Knox_IN" , 0x00D0EB }, - { "America/Kralendijk" , 0x00D45C }, - { "America/La_Paz" , 0x00D4C2 }, - { "America/Lima" , 0x00D529 }, - { "America/Los_Angeles" , 0x00D5D1 }, - { "America/Louisville" , 0x00D9E2 }, - { "America/Lower_Princes" , 0x00DDD7 }, - { "America/Maceio" , 0x00DE3D }, - { "America/Managua" , 0x00DF77 }, - { "America/Manaus" , 0x00E02A }, - { "America/Marigot" , 0x00E12C }, - { "America/Martinique" , 0x00E181 }, - { "America/Matamoros" , 0x00E1ED }, - { "America/Mazatlan" , 0x00E446 }, - { "America/Mendoza" , 0x00E6B3 }, - { "America/Menominee" , 0x00E867 }, - { "America/Merida" , 0x00EBE8 }, - { "America/Metlakatla" , 0x00EE23 }, - { "America/Mexico_City" , 0x00EF5D }, - { "America/Miquelon" , 0x00F1D8 }, - { "America/Moncton" , 0x00F44A }, - { "America/Monterrey" , 0x00F8E1 }, - { "America/Montevideo" , 0x00FB44 }, - { "America/Montreal" , 0x00FE56 }, - { "America/Montserrat" , 0x01036C }, - { "America/Nassau" , 0x0103C1 }, - { "America/New_York" , 0x010706 }, - { "America/Nipigon" , 0x010C11 }, - { "America/Nome" , 0x010F62 }, - { "America/Noronha" , 0x0112E0 }, - { "America/North_Dakota/Beulah" , 0x011410 }, - { "America/North_Dakota/Center" , 0x0117A4 }, - { "America/North_Dakota/New_Salem" , 0x011B38 }, - { "America/Ojinaga" , 0x011EE1 }, - { "America/Panama" , 0x012142 }, - { "America/Pangnirtung" , 0x012197 }, - { "America/Paramaribo" , 0x0124CD }, - { "America/Phoenix" , 0x01255F }, - { "America/Port-au-Prince" , 0x01260D }, - { "America/Port_of_Spain" , 0x01292C }, - { "America/Porto_Acre" , 0x01282D }, - { "America/Porto_Velho" , 0x012981 }, - { "America/Puerto_Rico" , 0x012A77 }, - { "America/Rainy_River" , 0x012AE2 }, - { "America/Rankin_Inlet" , 0x012E1A }, - { "America/Recife" , 0x013100 }, - { "America/Regina" , 0x01322A }, - { "America/Resolute" , 0x0133E8 }, - { "America/Rio_Branco" , 0x0136D9 }, - { "America/Rosario" , 0x0137DC }, - { "America/Santa_Isabel" , 0x013982 }, - { "America/Santarem" , 0x013D25 }, - { "America/Santiago" , 0x013E2A }, - { "America/Santo_Domingo" , 0x0141D3 }, - { "America/Sao_Paulo" , 0x014299 }, - { "America/Scoresbysund" , 0x0145A8 }, - { "America/Shiprock" , 0x014896 }, - { "America/Sitka" , 0x014C25 }, - { "America/St_Barthelemy" , 0x014FAD }, - { "America/St_Johns" , 0x015002 }, - { "America/St_Kitts" , 0x015555 }, - { "America/St_Lucia" , 0x0155AA }, - { "America/St_Thomas" , 0x0155FF }, - { "America/St_Vincent" , 0x015654 }, - { "America/Swift_Current" , 0x0156A9 }, - { "America/Tegucigalpa" , 0x0157CA }, - { "America/Thule" , 0x015849 }, - { "America/Thunder_Bay" , 0x015A90 }, - { "America/Tijuana" , 0x015DD9 }, - { "America/Toronto" , 0x016172 }, - { "America/Tortola" , 0x016689 }, - { "America/Vancouver" , 0x0166DE }, - { "America/Virgin" , 0x016B1B }, - { "America/Whitehorse" , 0x016B70 }, - { "America/Winnipeg" , 0x016E8D }, - { "America/Yakutat" , 0x0172CD }, - { "America/Yellowknife" , 0x017638 }, - { "Antarctica/Casey" , 0x017948 }, - { "Antarctica/Davis" , 0x0179E5 }, - { "Antarctica/DumontDUrville" , 0x017A86 }, - { "Antarctica/Macquarie" , 0x017B18 }, - { "Antarctica/Mawson" , 0x017D5F }, - { "Antarctica/McMurdo" , 0x017DDB }, - { "Antarctica/Palmer" , 0x0180DD }, - { "Antarctica/Rothera" , 0x0183F9 }, - { "Antarctica/South_Pole" , 0x01846F }, - { "Antarctica/Syowa" , 0x018777 }, - { "Antarctica/Vostok" , 0x0187E5 }, - { "Arctic/Longyearbyen" , 0x018856 }, - { "Asia/Aden" , 0x018B88 }, - { "Asia/Almaty" , 0x018BDD }, - { "Asia/Amman" , 0x018D5C }, - { "Asia/Anadyr" , 0x019012 }, - { "Asia/Aqtau" , 0x0191F7 }, - { "Asia/Aqtobe" , 0x0193F6 }, - { "Asia/Ashgabat" , 0x0195AE }, - { "Asia/Ashkhabad" , 0x0196CB }, - { "Asia/Baghdad" , 0x0197E8 }, - { "Asia/Bahrain" , 0x01995D }, - { "Asia/Baku" , 0x0199C3 }, - { "Asia/Bangkok" , 0x019CAB }, - { "Asia/Beirut" , 0x019D00 }, - { "Asia/Bishkek" , 0x01A00D }, - { "Asia/Brunei" , 0x01A1B9 }, - { "Asia/Calcutta" , 0x01A21B }, - { "Asia/Choibalsan" , 0x01A294 }, - { "Asia/Chongqing" , 0x01A40D }, - { "Asia/Chungking" , 0x01A4FC }, - { "Asia/Colombo" , 0x01A5AB }, - { "Asia/Dacca" , 0x01A647 }, - { "Asia/Damascus" , 0x01A6ED }, - { "Asia/Dhaka" , 0x01AA3D }, - { "Asia/Dili" , 0x01AAE3 }, - { "Asia/Dubai" , 0x01AB6C }, - { "Asia/Dushanbe" , 0x01ABC1 }, - { "Asia/Gaza" , 0x01ACC4 }, - { "Asia/Harbin" , 0x01B017 }, - { "Asia/Hebron" , 0x01B0FE }, - { "Asia/Ho_Chi_Minh" , 0x01B45A }, - { "Asia/Hong_Kong" , 0x01B4D2 }, - { "Asia/Hovd" , 0x01B694 }, - { "Asia/Irkutsk" , 0x01B80C }, - { "Asia/Istanbul" , 0x01B9F2 }, - { "Asia/Jakarta" , 0x01BDDF }, - { "Asia/Jayapura" , 0x01BE89 }, - { "Asia/Jerusalem" , 0x01BF25 }, - { "Asia/Kabul" , 0x01C254 }, - { "Asia/Kamchatka" , 0x01C2A5 }, - { "Asia/Karachi" , 0x01C481 }, - { "Asia/Kashgar" , 0x01C536 }, - { "Asia/Kathmandu" , 0x01C607 }, - { "Asia/Katmandu" , 0x01C66D }, - { "Asia/Khandyga" , 0x01C6D3 }, - { "Asia/Kolkata" , 0x01C8F8 }, - { "Asia/Krasnoyarsk" , 0x01C971 }, - { "Asia/Kuala_Lumpur" , 0x01CB59 }, - { "Asia/Kuching" , 0x01CC16 }, - { "Asia/Kuwait" , 0x01CD04 }, - { "Asia/Macao" , 0x01CD59 }, - { "Asia/Macau" , 0x01CE94 }, - { "Asia/Magadan" , 0x01CFCF }, - { "Asia/Makassar" , 0x01D1B1 }, - { "Asia/Manila" , 0x01D275 }, - { "Asia/Muscat" , 0x01D2FA }, - { "Asia/Nicosia" , 0x01D34F }, - { "Asia/Novokuznetsk" , 0x01D637 }, - { "Asia/Novosibirsk" , 0x01D839 }, - { "Asia/Omsk" , 0x01DA24 }, - { "Asia/Oral" , 0x01DC0B }, - { "Asia/Phnom_Penh" , 0x01DDDB }, - { "Asia/Pontianak" , 0x01DE53 }, - { "Asia/Pyongyang" , 0x01DF14 }, - { "Asia/Qatar" , 0x01DF81 }, - { "Asia/Qyzylorda" , 0x01DFE7 }, - { "Asia/Rangoon" , 0x01E1BD }, - { "Asia/Riyadh" , 0x01E235 }, - { "Asia/Saigon" , 0x01E28A }, - { "Asia/Sakhalin" , 0x01E302 }, - { "Asia/Samarkand" , 0x01E4F9 }, - { "Asia/Seoul" , 0x01E62F }, - { "Asia/Shanghai" , 0x01E6D3 }, - { "Asia/Singapore" , 0x01E7B3 }, - { "Asia/Taipei" , 0x01E86A }, - { "Asia/Tashkent" , 0x01E982 }, - { "Asia/Tbilisi" , 0x01EAB3 }, - { "Asia/Tehran" , 0x01EC6D }, - { "Asia/Tel_Aviv" , 0x01EEDB }, - { "Asia/Thimbu" , 0x01F20A }, - { "Asia/Thimphu" , 0x01F270 }, - { "Asia/Tokyo" , 0x01F2D6 }, - { "Asia/Ujung_Pandang" , 0x01F35F }, - { "Asia/Ulaanbaatar" , 0x01F3DB }, - { "Asia/Ulan_Bator" , 0x01F536 }, - { "Asia/Urumqi" , 0x01F683 }, - { "Asia/Ust-Nera" , 0x01F74A }, - { "Asia/Vientiane" , 0x01F94F }, - { "Asia/Vladivostok" , 0x01F9C7 }, - { "Asia/Yakutsk" , 0x01FBB3 }, - { "Asia/Yekaterinburg" , 0x01FD98 }, - { "Asia/Yerevan" , 0x01FFA3 }, - { "Atlantic/Azores" , 0x0201A3 }, - { "Atlantic/Bermuda" , 0x0206A6 }, - { "Atlantic/Canary" , 0x020987 }, - { "Atlantic/Cape_Verde" , 0x020C5D }, - { "Atlantic/Faeroe" , 0x020CD6 }, - { "Atlantic/Faroe" , 0x020F7A }, - { "Atlantic/Jan_Mayen" , 0x02121E }, - { "Atlantic/Madeira" , 0x021550 }, - { "Atlantic/Reykjavik" , 0x021A59 }, - { "Atlantic/South_Georgia" , 0x021C12 }, - { "Atlantic/St_Helena" , 0x021E24 }, - { "Atlantic/Stanley" , 0x021C56 }, - { "Australia/ACT" , 0x021E79 }, - { "Australia/Adelaide" , 0x022196 }, - { "Australia/Brisbane" , 0x0224C2 }, - { "Australia/Broken_Hill" , 0x022589 }, - { "Australia/Canberra" , 0x0228C7 }, - { "Australia/Currie" , 0x022BE4 }, - { "Australia/Darwin" , 0x022F17 }, - { "Australia/Eucla" , 0x022F9D }, - { "Australia/Hobart" , 0x023072 }, - { "Australia/LHI" , 0x0233D0 }, - { "Australia/Lindeman" , 0x02366B }, - { "Australia/Lord_Howe" , 0x02374C }, - { "Australia/Melbourne" , 0x0239F7 }, - { "Australia/North" , 0x023D1C }, - { "Australia/NSW" , 0x023D90 }, - { "Australia/Perth" , 0x0240AD }, - { "Australia/Queensland" , 0x024185 }, - { "Australia/South" , 0x024231 }, - { "Australia/Sydney" , 0x02454E }, - { "Australia/Tasmania" , 0x02488B }, - { "Australia/Victoria" , 0x024BD0 }, - { "Australia/West" , 0x024EED }, - { "Australia/Yancowinna" , 0x024FA3 }, - { "Brazil/Acre" , 0x0252C5 }, - { "Brazil/DeNoronha" , 0x0253C4 }, - { "Brazil/East" , 0x0254E4 }, - { "Brazil/West" , 0x0257C1 }, - { "Canada/Atlantic" , 0x0258B9 }, - { "Canada/Central" , 0x025DA1 }, - { "Canada/East-Saskatchewan" , 0x0266AB }, - { "Canada/Eastern" , 0x0261BB }, - { "Canada/Mountain" , 0x026834 }, - { "Canada/Newfoundland" , 0x026BAA }, - { "Canada/Pacific" , 0x0270D5 }, - { "Canada/Saskatchewan" , 0x0274EE }, - { "Canada/Yukon" , 0x027677 }, - { "CET" , 0x02797A }, - { "Chile/Continental" , 0x027C83 }, - { "Chile/EasterIsland" , 0x02801E }, - { "CST6CDT" , 0x028360 }, - { "Cuba" , 0x0286B1 }, - { "EET" , 0x028A24 }, - { "Egypt" , 0x028CD7 }, - { "Eire" , 0x028F9A }, - { "EST" , 0x0294AB }, - { "EST5EDT" , 0x0294EF }, - { "Etc/GMT" , 0x029840 }, - { "Etc/GMT+0" , 0x02990C }, - { "Etc/GMT+1" , 0x029996 }, - { "Etc/GMT+10" , 0x029A23 }, - { "Etc/GMT+11" , 0x029AB1 }, - { "Etc/GMT+12" , 0x029B3F }, - { "Etc/GMT+2" , 0x029C5A }, - { "Etc/GMT+3" , 0x029CE6 }, - { "Etc/GMT+4" , 0x029D72 }, - { "Etc/GMT+5" , 0x029DFE }, - { "Etc/GMT+6" , 0x029E8A }, - { "Etc/GMT+7" , 0x029F16 }, - { "Etc/GMT+8" , 0x029FA2 }, - { "Etc/GMT+9" , 0x02A02E }, - { "Etc/GMT-0" , 0x0298C8 }, - { "Etc/GMT-1" , 0x029950 }, - { "Etc/GMT-10" , 0x0299DC }, - { "Etc/GMT-11" , 0x029A6A }, - { "Etc/GMT-12" , 0x029AF8 }, - { "Etc/GMT-13" , 0x029B86 }, - { "Etc/GMT-14" , 0x029BCD }, - { "Etc/GMT-2" , 0x029C14 }, - { "Etc/GMT-3" , 0x029CA0 }, - { "Etc/GMT-4" , 0x029D2C }, - { "Etc/GMT-5" , 0x029DB8 }, - { "Etc/GMT-6" , 0x029E44 }, - { "Etc/GMT-7" , 0x029ED0 }, - { "Etc/GMT-8" , 0x029F5C }, - { "Etc/GMT-9" , 0x029FE8 }, - { "Etc/GMT0" , 0x029884 }, - { "Etc/Greenwich" , 0x02A074 }, - { "Etc/UCT" , 0x02A0B8 }, - { "Etc/Universal" , 0x02A0FC }, - { "Etc/UTC" , 0x02A140 }, - { "Etc/Zulu" , 0x02A184 }, - { "Europe/Amsterdam" , 0x02A1C8 }, - { "Europe/Andorra" , 0x02A606 }, - { "Europe/Athens" , 0x02A882 }, - { "Europe/Belfast" , 0x02ABC5 }, - { "Europe/Belgrade" , 0x02B0FC }, - { "Europe/Berlin" , 0x02B3C5 }, - { "Europe/Bratislava" , 0x02B729 }, - { "Europe/Brussels" , 0x02BA5B }, - { "Europe/Bucharest" , 0x02BE92 }, - { "Europe/Budapest" , 0x02C1BC }, - { "Europe/Busingen" , 0x02C52F }, - { "Europe/Chisinau" , 0x02C7E6 }, - { "Europe/Copenhagen" , 0x02CB74 }, - { "Europe/Dublin" , 0x02CE7E }, - { "Europe/Gibraltar" , 0x02D38F }, - { "Europe/Guernsey" , 0x02D7E6 }, - { "Europe/Helsinki" , 0x02DD1D }, - { "Europe/Isle_of_Man" , 0x02DFD3 }, - { "Europe/Istanbul" , 0x02E50A }, - { "Europe/Jersey" , 0x02E8F7 }, - { "Europe/Kaliningrad" , 0x02EE2E }, - { "Europe/Kiev" , 0x02F094 }, - { "Europe/Lisbon" , 0x02F3AB }, - { "Europe/Ljubljana" , 0x02F8AF }, - { "Europe/London" , 0x02FB78 }, - { "Europe/Luxembourg" , 0x0300AF }, - { "Europe/Madrid" , 0x030505 }, - { "Europe/Malta" , 0x0308CB }, - { "Europe/Mariehamn" , 0x030C84 }, - { "Europe/Minsk" , 0x030F3A }, - { "Europe/Monaco" , 0x031148 }, - { "Europe/Moscow" , 0x031583 }, - { "Europe/Nicosia" , 0x0317D4 }, - { "Europe/Oslo" , 0x031ABC }, - { "Europe/Paris" , 0x031DEE }, - { "Europe/Podgorica" , 0x032234 }, - { "Europe/Prague" , 0x0324FD }, - { "Europe/Riga" , 0x03282F }, - { "Europe/Rome" , 0x032B74 }, - { "Europe/Samara" , 0x032F37 }, - { "Europe/San_Marino" , 0x03316A }, - { "Europe/Sarajevo" , 0x03352D }, - { "Europe/Simferopol" , 0x0337F6 }, - { "Europe/Skopje" , 0x033B21 }, - { "Europe/Sofia" , 0x033DEA }, - { "Europe/Stockholm" , 0x0340F2 }, - { "Europe/Tallinn" , 0x0343A1 }, - { "Europe/Tirane" , 0x0346DB }, - { "Europe/Tiraspol" , 0x0349E1 }, - { "Europe/Uzhgorod" , 0x034D6F }, - { "Europe/Vaduz" , 0x035086 }, - { "Europe/Vatican" , 0x035319 }, - { "Europe/Vienna" , 0x0356DC }, - { "Europe/Vilnius" , 0x035A09 }, - { "Europe/Volgograd" , 0x035D48 }, - { "Europe/Warsaw" , 0x035F48 }, - { "Europe/Zagreb" , 0x036329 }, - { "Europe/Zaporozhye" , 0x0365F2 }, - { "Europe/Zurich" , 0x036933 }, - { "Factory" , 0x036BE2 }, - { "GB" , 0x036C53 }, - { "GB-Eire" , 0x03718A }, - { "GMT" , 0x0376C1 }, - { "GMT+0" , 0x03778D }, - { "GMT-0" , 0x037749 }, - { "GMT0" , 0x037705 }, - { "Greenwich" , 0x0377D1 }, - { "Hongkong" , 0x037815 }, - { "HST" , 0x0379D7 }, - { "Iceland" , 0x037A1B }, - { "Indian/Antananarivo" , 0x037BD4 }, - { "Indian/Chagos" , 0x037C48 }, - { "Indian/Christmas" , 0x037CAA }, - { "Indian/Cocos" , 0x037CEE }, - { "Indian/Comoro" , 0x037D32 }, - { "Indian/Kerguelen" , 0x037D87 }, - { "Indian/Mahe" , 0x037DDC }, - { "Indian/Maldives" , 0x037E31 }, - { "Indian/Mauritius" , 0x037E86 }, - { "Indian/Mayotte" , 0x037EFC }, - { "Indian/Reunion" , 0x037F51 }, - { "Iran" , 0x037FA6 }, - { "Israel" , 0x038214 }, - { "Jamaica" , 0x038543 }, - { "Japan" , 0x038608 }, - { "Kwajalein" , 0x038691 }, - { "Libya" , 0x0386F4 }, - { "MET" , 0x0388ED }, - { "Mexico/BajaNorte" , 0x038BF6 }, - { "Mexico/BajaSur" , 0x038F5F }, - { "Mexico/General" , 0x0391A4 }, - { "MST" , 0x039402 }, - { "MST7MDT" , 0x039446 }, - { "Navajo" , 0x039797 }, - { "NZ" , 0x039B10 }, - { "NZ-CHAT" , 0x039E8E }, - { "Pacific/Apia" , 0x03A176 }, - { "Pacific/Auckland" , 0x03A312 }, - { "Pacific/Chatham" , 0x03A69E }, - { "Pacific/Chuuk" , 0x03A995 }, - { "Pacific/Easter" , 0x03A9EE }, - { "Pacific/Efate" , 0x03AD4C }, - { "Pacific/Enderbury" , 0x03AE12 }, - { "Pacific/Fakaofo" , 0x03AE80 }, - { "Pacific/Fiji" , 0x03AED1 }, - { "Pacific/Funafuti" , 0x03B064 }, - { "Pacific/Galapagos" , 0x03B0A8 }, - { "Pacific/Gambier" , 0x03B120 }, - { "Pacific/Guadalcanal" , 0x03B185 }, - { "Pacific/Guam" , 0x03B1DA }, - { "Pacific/Honolulu" , 0x03B230 }, - { "Pacific/Johnston" , 0x03B2A7 }, - { "Pacific/Kiritimati" , 0x03B2F9 }, - { "Pacific/Kosrae" , 0x03B364 }, - { "Pacific/Kwajalein" , 0x03B3C1 }, - { "Pacific/Majuro" , 0x03B42D }, - { "Pacific/Marquesas" , 0x03B48C }, - { "Pacific/Midway" , 0x03B4F3 }, - { "Pacific/Nauru" , 0x03B57D }, - { "Pacific/Niue" , 0x03B5F5 }, - { "Pacific/Norfolk" , 0x03B653 }, - { "Pacific/Noumea" , 0x03B6A8 }, - { "Pacific/Pago_Pago" , 0x03B738 }, - { "Pacific/Palau" , 0x03B7C1 }, - { "Pacific/Pitcairn" , 0x03B805 }, - { "Pacific/Pohnpei" , 0x03B85A }, - { "Pacific/Ponape" , 0x03B8AF }, - { "Pacific/Port_Moresby" , 0x03B8F4 }, - { "Pacific/Rarotonga" , 0x03B938 }, - { "Pacific/Saipan" , 0x03BA14 }, - { "Pacific/Samoa" , 0x03BA77 }, - { "Pacific/Tahiti" , 0x03BB00 }, - { "Pacific/Tarawa" , 0x03BB65 }, - { "Pacific/Tongatapu" , 0x03BBB9 }, - { "Pacific/Truk" , 0x03BC45 }, - { "Pacific/Wake" , 0x03BC8A }, - { "Pacific/Wallis" , 0x03BCDA }, - { "Pacific/Yap" , 0x03BD1E }, - { "Poland" , 0x03BD63 }, - { "Portugal" , 0x03C144 }, - { "PRC" , 0x03C640 }, - { "PST8PDT" , 0x03C6F1 }, - { "ROC" , 0x03CA42 }, - { "ROK" , 0x03CB5A }, - { "Singapore" , 0x03CBFE }, - { "Turkey" , 0x03CCB5 }, - { "UCT" , 0x03D0A2 }, - { "Universal" , 0x03D0E6 }, - { "US/Alaska" , 0x03D12A }, - { "US/Aleutian" , 0x03D493 }, - { "US/Arizona" , 0x03D7F9 }, - { "US/Central" , 0x03D887 }, - { "US/East-Indiana" , 0x03E291 }, - { "US/Eastern" , 0x03DD92 }, - { "US/Hawaii" , 0x03E4FB }, - { "US/Indiana-Starke" , 0x03E56C }, - { "US/Michigan" , 0x03E8DD }, - { "US/Mountain" , 0x03EC14 }, - { "US/Pacific" , 0x03EF8D }, - { "US/Pacific-New" , 0x03F392 }, - { "US/Samoa" , 0x03F797 }, - { "UTC" , 0x03F820 }, - { "W-SU" , 0x03FB17 }, - { "WET" , 0x03F864 }, - { "Zulu" , 0x03FD51 }, + { "America/Argentina/Buenos_Aires" , 0x002B72 }, + { "America/Argentina/Catamarca" , 0x002D20 }, + { "America/Argentina/ComodRivadavia" , 0x002EE1 }, + { "America/Argentina/Cordoba" , 0x003087 }, + { "America/Argentina/Jujuy" , 0x00325C }, + { "America/Argentina/La_Rioja" , 0x003410 }, + { "America/Argentina/Mendoza" , 0x0035C8 }, + { "America/Argentina/Rio_Gallegos" , 0x003788 }, + { "America/Argentina/Salta" , 0x00393D }, + { "America/Argentina/San_Juan" , 0x003AE9 }, + { "America/Argentina/San_Luis" , 0x003CA1 }, + { "America/Argentina/Tucuman" , 0x003E67 }, + { "America/Argentina/Ushuaia" , 0x004023 }, + { "America/Aruba" , 0x0041DE }, + { "America/Asuncion" , 0x004244 }, + { "America/Atikokan" , 0x004529 }, + { "America/Atka" , 0x0045FF }, + { "America/Bahia" , 0x004965 }, + { "America/Bahia_Banderas" , 0x004AF8 }, + { "America/Barbados" , 0x004D71 }, + { "America/Belem" , 0x004E0B }, + { "America/Belize" , 0x004F06 }, + { "America/Blanc-Sablon" , 0x005082 }, + { "America/Boa_Vista" , 0x005136 }, + { "America/Bogota" , 0x00523F }, + { "America/Boise" , 0x0052AB }, + { "America/Buenos_Aires" , 0x005642 }, + { "America/Cambridge_Bay" , 0x0057DB }, + { "America/Campo_Grande" , 0x005B03 }, + { "America/Cancun" , 0x005DF2 }, + { "America/Caracas" , 0x006034 }, + { "America/Catamarca" , 0x00609B }, + { "America/Cayenne" , 0x006241 }, + { "America/Cayman" , 0x0062A3 }, + { "America/Chicago" , 0x0062F8 }, + { "America/Chihuahua" , 0x00680F }, + { "America/Coral_Harbour" , 0x006A7A }, + { "America/Cordoba" , 0x006B0C }, + { "America/Costa_Rica" , 0x006CB2 }, + { "America/Creston" , 0x006D3C }, + { "America/Cuiaba" , 0x006DC8 }, + { "America/Curacao" , 0x0070A6 }, + { "America/Danmarkshavn" , 0x00710C }, + { "America/Dawson" , 0x007250 }, + { "America/Dawson_Creek" , 0x00756D }, + { "America/Denver" , 0x007747 }, + { "America/Detroit" , 0x007ACD }, + { "America/Dominica" , 0x007E2C }, + { "America/Edmonton" , 0x007E81 }, + { "America/Eirunepe" , 0x008239 }, + { "America/El_Salvador" , 0x00834C }, + { "America/Ensenada" , 0x0083C1 }, + { "America/Fort_Wayne" , 0x008868 }, + { "America/Fortaleza" , 0x00872A }, + { "America/Glace_Bay" , 0x008AD2 }, + { "America/Godthab" , 0x008E49 }, + { "America/Goose_Bay" , 0x00910D }, + { "America/Grand_Turk" , 0x0095CA }, + { "America/Grenada" , 0x009879 }, + { "America/Guadeloupe" , 0x0098CE }, + { "America/Guatemala" , 0x009923 }, + { "America/Guayaquil" , 0x0099AC }, + { "America/Guyana" , 0x009A09 }, + { "America/Halifax" , 0x009A8A }, + { "America/Havana" , 0x009FA0 }, + { "America/Hermosillo" , 0x00A313 }, + { "America/Indiana/Indianapolis" , 0x00A3F1 }, + { "America/Indiana/Knox" , 0x00A682 }, + { "America/Indiana/Marengo" , 0x00AA19 }, + { "America/Indiana/Petersburg" , 0x00ACBF }, + { "America/Indiana/Tell_City" , 0x00B20C }, + { "America/Indiana/Vevay" , 0x00B4A5 }, + { "America/Indiana/Vincennes" , 0x00B6E0 }, + { "America/Indiana/Winamac" , 0x00B994 }, + { "America/Indianapolis" , 0x00AFA2 }, + { "America/Inuvik" , 0x00BC4D }, + { "America/Iqaluit" , 0x00BF44 }, + { "America/Jamaica" , 0x00C266 }, + { "America/Jujuy" , 0x00C32B }, + { "America/Juneau" , 0x00C4D5 }, + { "America/Kentucky/Louisville" , 0x00C853 }, + { "America/Kentucky/Monticello" , 0x00CC71 }, + { "America/Knox_IN" , 0x00CFF6 }, + { "America/Kralendijk" , 0x00D367 }, + { "America/La_Paz" , 0x00D3CD }, + { "America/Lima" , 0x00D434 }, + { "America/Los_Angeles" , 0x00D4DC }, + { "America/Louisville" , 0x00D8ED }, + { "America/Lower_Princes" , 0x00DCE2 }, + { "America/Maceio" , 0x00DD48 }, + { "America/Managua" , 0x00DE82 }, + { "America/Manaus" , 0x00DF35 }, + { "America/Marigot" , 0x00E037 }, + { "America/Martinique" , 0x00E08C }, + { "America/Matamoros" , 0x00E0F8 }, + { "America/Mazatlan" , 0x00E351 }, + { "America/Mendoza" , 0x00E5BE }, + { "America/Menominee" , 0x00E772 }, + { "America/Merida" , 0x00EAF3 }, + { "America/Metlakatla" , 0x00ED2E }, + { "America/Mexico_City" , 0x00EE68 }, + { "America/Miquelon" , 0x00F0E3 }, + { "America/Moncton" , 0x00F355 }, + { "America/Monterrey" , 0x00F7EC }, + { "America/Montevideo" , 0x00FA4F }, + { "America/Montreal" , 0x00FD61 }, + { "America/Montserrat" , 0x010251 }, + { "America/Nassau" , 0x0102A6 }, + { "America/New_York" , 0x0105EB }, + { "America/Nipigon" , 0x010AF6 }, + { "America/Nome" , 0x010E47 }, + { "America/Noronha" , 0x0111C5 }, + { "America/North_Dakota/Beulah" , 0x0112F5 }, + { "America/North_Dakota/Center" , 0x011689 }, + { "America/North_Dakota/New_Salem" , 0x011A1D }, + { "America/Ojinaga" , 0x011DC6 }, + { "America/Panama" , 0x012027 }, + { "America/Pangnirtung" , 0x01207C }, + { "America/Paramaribo" , 0x0123B2 }, + { "America/Phoenix" , 0x012444 }, + { "America/Port-au-Prince" , 0x012502 }, + { "America/Port_of_Spain" , 0x012821 }, + { "America/Porto_Acre" , 0x012722 }, + { "America/Porto_Velho" , 0x012876 }, + { "America/Puerto_Rico" , 0x01296C }, + { "America/Rainy_River" , 0x0129D7 }, + { "America/Rankin_Inlet" , 0x012D0F }, + { "America/Recife" , 0x012FF5 }, + { "America/Regina" , 0x01311F }, + { "America/Resolute" , 0x0132DD }, + { "America/Rio_Branco" , 0x0135CE }, + { "America/Rosario" , 0x0136D1 }, + { "America/Santa_Isabel" , 0x013877 }, + { "America/Santarem" , 0x013C1A }, + { "America/Santiago" , 0x013D1F }, + { "America/Santo_Domingo" , 0x0140C8 }, + { "America/Sao_Paulo" , 0x01418E }, + { "America/Scoresbysund" , 0x01449D }, + { "America/Shiprock" , 0x01478B }, + { "America/Sitka" , 0x014B04 }, + { "America/St_Barthelemy" , 0x014E8C }, + { "America/St_Johns" , 0x014EE1 }, + { "America/St_Kitts" , 0x015434 }, + { "America/St_Lucia" , 0x015489 }, + { "America/St_Thomas" , 0x0154DE }, + { "America/St_Vincent" , 0x015533 }, + { "America/Swift_Current" , 0x015588 }, + { "America/Tegucigalpa" , 0x0156A9 }, + { "America/Thule" , 0x015728 }, + { "America/Thunder_Bay" , 0x01596F }, + { "America/Tijuana" , 0x015CB8 }, + { "America/Toronto" , 0x016051 }, + { "America/Tortola" , 0x016571 }, + { "America/Vancouver" , 0x0165C6 }, + { "America/Virgin" , 0x016A03 }, + { "America/Whitehorse" , 0x016A58 }, + { "America/Winnipeg" , 0x016D75 }, + { "America/Yakutat" , 0x0171B5 }, + { "America/Yellowknife" , 0x017520 }, + { "Antarctica/Casey" , 0x017830 }, + { "Antarctica/Davis" , 0x0178CD }, + { "Antarctica/DumontDUrville" , 0x01796E }, + { "Antarctica/Macquarie" , 0x017A00 }, + { "Antarctica/Mawson" , 0x017C47 }, + { "Antarctica/McMurdo" , 0x017CC3 }, + { "Antarctica/Palmer" , 0x01806E }, + { "Antarctica/Rothera" , 0x01838A }, + { "Antarctica/South_Pole" , 0x018400 }, + { "Antarctica/Syowa" , 0x01877E }, + { "Antarctica/Vostok" , 0x0187EC }, + { "Arctic/Longyearbyen" , 0x01885D }, + { "Asia/Aden" , 0x018B8F }, + { "Asia/Almaty" , 0x018BE4 }, + { "Asia/Amman" , 0x018D63 }, + { "Asia/Anadyr" , 0x018F35 }, + { "Asia/Aqtau" , 0x01911A }, + { "Asia/Aqtobe" , 0x019319 }, + { "Asia/Ashgabat" , 0x0194D1 }, + { "Asia/Ashkhabad" , 0x0195EE }, + { "Asia/Baghdad" , 0x01970B }, + { "Asia/Bahrain" , 0x019880 }, + { "Asia/Baku" , 0x0198E6 }, + { "Asia/Bangkok" , 0x019BCE }, + { "Asia/Beirut" , 0x019C23 }, + { "Asia/Bishkek" , 0x019F30 }, + { "Asia/Brunei" , 0x01A0DC }, + { "Asia/Calcutta" , 0x01A13E }, + { "Asia/Choibalsan" , 0x01A1B7 }, + { "Asia/Chongqing" , 0x01A330 }, + { "Asia/Chungking" , 0x01A41F }, + { "Asia/Colombo" , 0x01A4CE }, + { "Asia/Dacca" , 0x01A56A }, + { "Asia/Damascus" , 0x01A610 }, + { "Asia/Dhaka" , 0x01A960 }, + { "Asia/Dili" , 0x01AA06 }, + { "Asia/Dubai" , 0x01AA90 }, + { "Asia/Dushanbe" , 0x01AAE5 }, + { "Asia/Gaza" , 0x01ABE8 }, + { "Asia/Harbin" , 0x01AF3B }, + { "Asia/Hebron" , 0x01B022 }, + { "Asia/Ho_Chi_Minh" , 0x01B37E }, + { "Asia/Hong_Kong" , 0x01B3F6 }, + { "Asia/Hovd" , 0x01B5B8 }, + { "Asia/Irkutsk" , 0x01B730 }, + { "Asia/Istanbul" , 0x01B916 }, + { "Asia/Jakarta" , 0x01BD03 }, + { "Asia/Jayapura" , 0x01BDAD }, + { "Asia/Jerusalem" , 0x01BE49 }, + { "Asia/Kabul" , 0x01C178 }, + { "Asia/Kamchatka" , 0x01C1C9 }, + { "Asia/Karachi" , 0x01C3A5 }, + { "Asia/Kashgar" , 0x01C45A }, + { "Asia/Kathmandu" , 0x01C52B }, + { "Asia/Katmandu" , 0x01C591 }, + { "Asia/Khandyga" , 0x01C5F7 }, + { "Asia/Kolkata" , 0x01C81C }, + { "Asia/Krasnoyarsk" , 0x01C895 }, + { "Asia/Kuala_Lumpur" , 0x01CA7D }, + { "Asia/Kuching" , 0x01CB3A }, + { "Asia/Kuwait" , 0x01CC28 }, + { "Asia/Macao" , 0x01CC7D }, + { "Asia/Macau" , 0x01CDB8 }, + { "Asia/Magadan" , 0x01CEF3 }, + { "Asia/Makassar" , 0x01D0D5 }, + { "Asia/Manila" , 0x01D19A }, + { "Asia/Muscat" , 0x01D21F }, + { "Asia/Nicosia" , 0x01D274 }, + { "Asia/Novokuznetsk" , 0x01D55C }, + { "Asia/Novosibirsk" , 0x01D75E }, + { "Asia/Omsk" , 0x01D949 }, + { "Asia/Oral" , 0x01DB30 }, + { "Asia/Phnom_Penh" , 0x01DD00 }, + { "Asia/Pontianak" , 0x01DD78 }, + { "Asia/Pyongyang" , 0x01DE3A }, + { "Asia/Qatar" , 0x01DEA7 }, + { "Asia/Qyzylorda" , 0x01DF0D }, + { "Asia/Rangoon" , 0x01E0E3 }, + { "Asia/Riyadh" , 0x01E15B }, + { "Asia/Saigon" , 0x01E1B0 }, + { "Asia/Sakhalin" , 0x01E228 }, + { "Asia/Samarkand" , 0x01E41F }, + { "Asia/Seoul" , 0x01E555 }, + { "Asia/Shanghai" , 0x01E5F9 }, + { "Asia/Singapore" , 0x01E6D9 }, + { "Asia/Taipei" , 0x01E790 }, + { "Asia/Tashkent" , 0x01E8A8 }, + { "Asia/Tbilisi" , 0x01E9D9 }, + { "Asia/Tehran" , 0x01EB93 }, + { "Asia/Tel_Aviv" , 0x01EE01 }, + { "Asia/Thimbu" , 0x01F130 }, + { "Asia/Thimphu" , 0x01F196 }, + { "Asia/Tokyo" , 0x01F1FC }, + { "Asia/Ujung_Pandang" , 0x01F285 }, + { "Asia/Ulaanbaatar" , 0x01F302 }, + { "Asia/Ulan_Bator" , 0x01F45D }, + { "Asia/Urumqi" , 0x01F5AA }, + { "Asia/Ust-Nera" , 0x01F671 }, + { "Asia/Vientiane" , 0x01F876 }, + { "Asia/Vladivostok" , 0x01F8EE }, + { "Asia/Yakutsk" , 0x01FADA }, + { "Asia/Yekaterinburg" , 0x01FCBF }, + { "Asia/Yerevan" , 0x01FECA }, + { "Atlantic/Azores" , 0x0200CA }, + { "Atlantic/Bermuda" , 0x0205CD }, + { "Atlantic/Canary" , 0x0208AE }, + { "Atlantic/Cape_Verde" , 0x020B84 }, + { "Atlantic/Faeroe" , 0x020BFD }, + { "Atlantic/Faroe" , 0x020EA1 }, + { "Atlantic/Jan_Mayen" , 0x021145 }, + { "Atlantic/Madeira" , 0x021477 }, + { "Atlantic/Reykjavik" , 0x021980 }, + { "Atlantic/South_Georgia" , 0x021B39 }, + { "Atlantic/St_Helena" , 0x021D4B }, + { "Atlantic/Stanley" , 0x021B7D }, + { "Australia/ACT" , 0x021DA0 }, + { "Australia/Adelaide" , 0x0220BD }, + { "Australia/Brisbane" , 0x0223E9 }, + { "Australia/Broken_Hill" , 0x0224B0 }, + { "Australia/Canberra" , 0x0227EE }, + { "Australia/Currie" , 0x022B0B }, + { "Australia/Darwin" , 0x022E3E }, + { "Australia/Eucla" , 0x022EC4 }, + { "Australia/Hobart" , 0x022F99 }, + { "Australia/LHI" , 0x0232F7 }, + { "Australia/Lindeman" , 0x023592 }, + { "Australia/Lord_Howe" , 0x023673 }, + { "Australia/Melbourne" , 0x02391E }, + { "Australia/North" , 0x023C43 }, + { "Australia/NSW" , 0x023CB7 }, + { "Australia/Perth" , 0x023FD4 }, + { "Australia/Queensland" , 0x0240AC }, + { "Australia/South" , 0x024158 }, + { "Australia/Sydney" , 0x024475 }, + { "Australia/Tasmania" , 0x0247B2 }, + { "Australia/Victoria" , 0x024AF7 }, + { "Australia/West" , 0x024E14 }, + { "Australia/Yancowinna" , 0x024ECA }, + { "Brazil/Acre" , 0x0251EC }, + { "Brazil/DeNoronha" , 0x0252EB }, + { "Brazil/East" , 0x02540B }, + { "Brazil/West" , 0x0256E8 }, + { "Canada/Atlantic" , 0x0257E0 }, + { "Canada/Central" , 0x025CC8 }, + { "Canada/East-Saskatchewan" , 0x0265D2 }, + { "Canada/Eastern" , 0x0260E2 }, + { "Canada/Mountain" , 0x02675B }, + { "Canada/Newfoundland" , 0x026AD1 }, + { "Canada/Pacific" , 0x026FFC }, + { "Canada/Saskatchewan" , 0x027415 }, + { "Canada/Yukon" , 0x02759E }, + { "CET" , 0x0278A1 }, + { "Chile/Continental" , 0x027BAA }, + { "Chile/EasterIsland" , 0x027F45 }, + { "CST6CDT" , 0x028287 }, + { "Cuba" , 0x0285D8 }, + { "EET" , 0x02894B }, + { "Egypt" , 0x028BFE }, + { "Eire" , 0x028EC1 }, + { "EST" , 0x0293D2 }, + { "EST5EDT" , 0x029416 }, + { "Etc/GMT" , 0x029767 }, + { "Etc/GMT+0" , 0x029833 }, + { "Etc/GMT+1" , 0x0298BD }, + { "Etc/GMT+10" , 0x02994A }, + { "Etc/GMT+11" , 0x0299D8 }, + { "Etc/GMT+12" , 0x029A66 }, + { "Etc/GMT+2" , 0x029B81 }, + { "Etc/GMT+3" , 0x029C0D }, + { "Etc/GMT+4" , 0x029C99 }, + { "Etc/GMT+5" , 0x029D25 }, + { "Etc/GMT+6" , 0x029DB1 }, + { "Etc/GMT+7" , 0x029E3D }, + { "Etc/GMT+8" , 0x029EC9 }, + { "Etc/GMT+9" , 0x029F55 }, + { "Etc/GMT-0" , 0x0297EF }, + { "Etc/GMT-1" , 0x029877 }, + { "Etc/GMT-10" , 0x029903 }, + { "Etc/GMT-11" , 0x029991 }, + { "Etc/GMT-12" , 0x029A1F }, + { "Etc/GMT-13" , 0x029AAD }, + { "Etc/GMT-14" , 0x029AF4 }, + { "Etc/GMT-2" , 0x029B3B }, + { "Etc/GMT-3" , 0x029BC7 }, + { "Etc/GMT-4" , 0x029C53 }, + { "Etc/GMT-5" , 0x029CDF }, + { "Etc/GMT-6" , 0x029D6B }, + { "Etc/GMT-7" , 0x029DF7 }, + { "Etc/GMT-8" , 0x029E83 }, + { "Etc/GMT-9" , 0x029F0F }, + { "Etc/GMT0" , 0x0297AB }, + { "Etc/Greenwich" , 0x029F9B }, + { "Etc/UCT" , 0x029FDF }, + { "Etc/Universal" , 0x02A023 }, + { "Etc/UTC" , 0x02A067 }, + { "Etc/Zulu" , 0x02A0AB }, + { "Europe/Amsterdam" , 0x02A0EF }, + { "Europe/Andorra" , 0x02A52D }, + { "Europe/Athens" , 0x02A7A9 }, + { "Europe/Belfast" , 0x02AAEC }, + { "Europe/Belgrade" , 0x02B023 }, + { "Europe/Berlin" , 0x02B2EC }, + { "Europe/Bratislava" , 0x02B650 }, + { "Europe/Brussels" , 0x02B982 }, + { "Europe/Bucharest" , 0x02BDB9 }, + { "Europe/Budapest" , 0x02C0E3 }, + { "Europe/Busingen" , 0x02C456 }, + { "Europe/Chisinau" , 0x02C70D }, + { "Europe/Copenhagen" , 0x02CA9B }, + { "Europe/Dublin" , 0x02CDA5 }, + { "Europe/Gibraltar" , 0x02D2B6 }, + { "Europe/Guernsey" , 0x02D70D }, + { "Europe/Helsinki" , 0x02DC44 }, + { "Europe/Isle_of_Man" , 0x02DEFA }, + { "Europe/Istanbul" , 0x02E431 }, + { "Europe/Jersey" , 0x02E81E }, + { "Europe/Kaliningrad" , 0x02ED55 }, + { "Europe/Kiev" , 0x02EFBB }, + { "Europe/Lisbon" , 0x02F2D2 }, + { "Europe/Ljubljana" , 0x02F7D6 }, + { "Europe/London" , 0x02FA9F }, + { "Europe/Luxembourg" , 0x02FFD6 }, + { "Europe/Madrid" , 0x03042C }, + { "Europe/Malta" , 0x0307F2 }, + { "Europe/Mariehamn" , 0x030BAB }, + { "Europe/Minsk" , 0x030E61 }, + { "Europe/Monaco" , 0x03106F }, + { "Europe/Moscow" , 0x0314AA }, + { "Europe/Nicosia" , 0x0316FB }, + { "Europe/Oslo" , 0x0319E3 }, + { "Europe/Paris" , 0x031D15 }, + { "Europe/Podgorica" , 0x03215B }, + { "Europe/Prague" , 0x032424 }, + { "Europe/Riga" , 0x032756 }, + { "Europe/Rome" , 0x032A9B }, + { "Europe/Samara" , 0x032E5E }, + { "Europe/San_Marino" , 0x033091 }, + { "Europe/Sarajevo" , 0x033454 }, + { "Europe/Simferopol" , 0x03371D }, + { "Europe/Skopje" , 0x033A48 }, + { "Europe/Sofia" , 0x033D11 }, + { "Europe/Stockholm" , 0x034019 }, + { "Europe/Tallinn" , 0x0342C8 }, + { "Europe/Tirane" , 0x034602 }, + { "Europe/Tiraspol" , 0x034908 }, + { "Europe/Uzhgorod" , 0x034C96 }, + { "Europe/Vaduz" , 0x034FAD }, + { "Europe/Vatican" , 0x03525C }, + { "Europe/Vienna" , 0x03561F }, + { "Europe/Vilnius" , 0x03594C }, + { "Europe/Volgograd" , 0x035C8B }, + { "Europe/Warsaw" , 0x035E8B }, + { "Europe/Zagreb" , 0x03626C }, + { "Europe/Zaporozhye" , 0x036535 }, + { "Europe/Zurich" , 0x036876 }, + { "Factory" , 0x036B25 }, + { "GB" , 0x036B96 }, + { "GB-Eire" , 0x0370CD }, + { "GMT" , 0x037604 }, + { "GMT+0" , 0x0376D0 }, + { "GMT-0" , 0x03768C }, + { "GMT0" , 0x037648 }, + { "Greenwich" , 0x037714 }, + { "Hongkong" , 0x037758 }, + { "HST" , 0x03791A }, + { "Iceland" , 0x03795E }, + { "Indian/Antananarivo" , 0x037B17 }, + { "Indian/Chagos" , 0x037B8B }, + { "Indian/Christmas" , 0x037BED }, + { "Indian/Cocos" , 0x037C31 }, + { "Indian/Comoro" , 0x037C75 }, + { "Indian/Kerguelen" , 0x037CCA }, + { "Indian/Mahe" , 0x037D1F }, + { "Indian/Maldives" , 0x037D74 }, + { "Indian/Mauritius" , 0x037DC9 }, + { "Indian/Mayotte" , 0x037E3F }, + { "Indian/Reunion" , 0x037E94 }, + { "Iran" , 0x037EE9 }, + { "Israel" , 0x038157 }, + { "Jamaica" , 0x038486 }, + { "Japan" , 0x03854B }, + { "Kwajalein" , 0x0385D4 }, + { "Libya" , 0x038637 }, + { "MET" , 0x038830 }, + { "Mexico/BajaNorte" , 0x038B39 }, + { "Mexico/BajaSur" , 0x038EA2 }, + { "Mexico/General" , 0x0390E7 }, + { "MST" , 0x039345 }, + { "MST7MDT" , 0x039389 }, + { "Navajo" , 0x0396DA }, + { "NZ" , 0x039A53 }, + { "NZ-CHAT" , 0x039DD1 }, + { "Pacific/Apia" , 0x03A0B9 }, + { "Pacific/Auckland" , 0x03A255 }, + { "Pacific/Chatham" , 0x03A5E1 }, + { "Pacific/Chuuk" , 0x03A8D8 }, + { "Pacific/Easter" , 0x03A931 }, + { "Pacific/Efate" , 0x03AC8F }, + { "Pacific/Enderbury" , 0x03AD55 }, + { "Pacific/Fakaofo" , 0x03ADC3 }, + { "Pacific/Fiji" , 0x03AE14 }, + { "Pacific/Funafuti" , 0x03AFA7 }, + { "Pacific/Galapagos" , 0x03AFEB }, + { "Pacific/Gambier" , 0x03B063 }, + { "Pacific/Guadalcanal" , 0x03B0C8 }, + { "Pacific/Guam" , 0x03B11D }, + { "Pacific/Honolulu" , 0x03B173 }, + { "Pacific/Johnston" , 0x03B1EA }, + { "Pacific/Kiritimati" , 0x03B269 }, + { "Pacific/Kosrae" , 0x03B2D4 }, + { "Pacific/Kwajalein" , 0x03B331 }, + { "Pacific/Majuro" , 0x03B39D }, + { "Pacific/Marquesas" , 0x03B3FC }, + { "Pacific/Midway" , 0x03B463 }, + { "Pacific/Nauru" , 0x03B4ED }, + { "Pacific/Niue" , 0x03B565 }, + { "Pacific/Norfolk" , 0x03B5C3 }, + { "Pacific/Noumea" , 0x03B618 }, + { "Pacific/Pago_Pago" , 0x03B6A8 }, + { "Pacific/Palau" , 0x03B731 }, + { "Pacific/Pitcairn" , 0x03B775 }, + { "Pacific/Pohnpei" , 0x03B7CA }, + { "Pacific/Ponape" , 0x03B81F }, + { "Pacific/Port_Moresby" , 0x03B864 }, + { "Pacific/Rarotonga" , 0x03B8A8 }, + { "Pacific/Saipan" , 0x03B984 }, + { "Pacific/Samoa" , 0x03B9E7 }, + { "Pacific/Tahiti" , 0x03BA70 }, + { "Pacific/Tarawa" , 0x03BAD5 }, + { "Pacific/Tongatapu" , 0x03BB29 }, + { "Pacific/Truk" , 0x03BBB5 }, + { "Pacific/Wake" , 0x03BBFA }, + { "Pacific/Wallis" , 0x03BC4A }, + { "Pacific/Yap" , 0x03BC8E }, + { "Poland" , 0x03BCD3 }, + { "Portugal" , 0x03C0B4 }, + { "PRC" , 0x03C5B0 }, + { "PST8PDT" , 0x03C661 }, + { "ROC" , 0x03C9B2 }, + { "ROK" , 0x03CACA }, + { "Singapore" , 0x03CB6E }, + { "Turkey" , 0x03CC25 }, + { "UCT" , 0x03D012 }, + { "Universal" , 0x03D056 }, + { "US/Alaska" , 0x03D09A }, + { "US/Aleutian" , 0x03D403 }, + { "US/Arizona" , 0x03D769 }, + { "US/Central" , 0x03D7F7 }, + { "US/East-Indiana" , 0x03E201 }, + { "US/Eastern" , 0x03DD02 }, + { "US/Hawaii" , 0x03E46B }, + { "US/Indiana-Starke" , 0x03E4DC }, + { "US/Michigan" , 0x03E84D }, + { "US/Mountain" , 0x03EB84 }, + { "US/Pacific" , 0x03EEFD }, + { "US/Pacific-New" , 0x03F302 }, + { "US/Samoa" , 0x03F707 }, + { "UTC" , 0x03F790 }, + { "W-SU" , 0x03FA87 }, + { "WET" , 0x03F7D4 }, + { "Zulu" , 0x03FCC1 }, }; /* This is a generated file, do not modify */ -const unsigned char timelib_timezone_db_data_builtin[261525] = { +const unsigned char timelib_timezone_db_data_builtin[261381] = { /* Africa/Abidjan */ @@ -945,7 +945,7 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* Africa/Juba */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x53, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0xB6, 0xA3, 0xDA, 0xE0, +0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0xB6, 0xA3, 0xDA, 0x00, 0x00, 0x9E, 0x17, 0xE0, 0x01, 0x7A, 0x34, 0x50, 0x02, 0x7D, 0xF9, 0xE0, 0x03, 0x5B, 0x67, 0xD0, 0x04, 0x60, 0x7E, 0xE0, 0x05, 0x3D, 0xEC, 0xD0, 0x06, 0x40, 0x60, 0xE0, 0x07, 0x1F, 0x20, 0x50, 0x08, 0x20, 0x42, 0xE0, 0x09, 0x00, 0x53, 0xD0, 0x0A, 0x00, 0x24, 0xE0, 0x0A, 0xE1, 0x87, 0x50, @@ -956,7 +956,7 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x1A, 0xF1, 0x8B, 0xE0, 0x1B, 0xD0, 0x4B, 0x50, 0x1C, 0xD1, 0x6D, 0xE0, 0x1D, 0xB1, 0x7E, 0xD0, 0x38, 0x80, 0x45, 0x20, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x00, 0x00, 0x1D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, +0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x00, 0x00, 0x1E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x41, 0x53, 0x54, 0x00, 0x43, 0x41, 0x54, 0x00, 0x45, 0x41, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xBA, 0xC8, 0x01, 0x42, 0xE0, 0x40, 0x00, @@ -1390,8 +1390,8 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* America/Anguilla */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x41, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x35, 0x20, -0x01, 0xFF, 0xFF, 0xC4, 0xE0, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x19, 0xA0, 0x00, 0xB2, 0x6D, 0x15, 0x00, 0x00, 0x00, 0x00, @@ -1407,7 +1407,7 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* America/Araguaina */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0D, 0x96, 0xAA, 0x74, 0x30, +0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0D, 0x96, 0xAA, 0x74, 0x30, 0xB8, 0x0F, 0x49, 0xE0, 0xB8, 0xFD, 0x40, 0xA0, 0xB9, 0xF1, 0x34, 0x30, 0xBA, 0xDE, 0x74, 0x20, 0xDA, 0x38, 0xAE, 0x30, 0xDA, 0xEB, 0xFA, 0x30, 0xDC, 0x19, 0xE1, 0xB0, 0xDC, 0xB9, 0x59, 0x20, 0xDD, 0xFB, 0x15, 0x30, 0xDE, 0x9B, 0xDE, 0x20, 0xDF, 0xDD, 0x9A, 0x30, 0xE0, 0x54, 0x33, 0x20, @@ -1420,29 +1420,14 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x34, 0x38, 0x54, 0x30, 0x34, 0xF8, 0xC1, 0x20, 0x36, 0x20, 0x1F, 0x30, 0x36, 0xCF, 0x68, 0xA0, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xB8, 0x85, 0x20, 0x39, 0xDF, 0xE3, 0x30, 0x3A, 0x8F, 0x2C, 0xA0, 0x3B, 0xC8, 0xFF, 0xB0, 0x3C, 0x6F, 0x0E, 0xA0, 0x3D, 0xC4, 0x91, 0x30, 0x3E, 0x4E, 0xF0, 0xA0, -0x50, 0x83, 0x65, 0x30, 0x51, 0x20, 0x39, 0xA0, 0x52, 0x63, 0x47, 0x30, 0x53, 0x00, 0x1B, 0xA0, -0x54, 0x43, 0x29, 0x30, 0x54, 0xE9, 0x38, 0x20, 0x56, 0x23, 0x0B, 0x30, 0x56, 0xC9, 0x1A, 0x20, -0x58, 0x02, 0xED, 0x30, 0x58, 0xA8, 0xFC, 0x20, 0x59, 0xE2, 0xCF, 0x30, 0x5A, 0x88, 0xDE, 0x20, -0x5B, 0xCB, 0xEB, 0xB0, 0x5C, 0x68, 0xC0, 0x20, 0x5D, 0xAB, 0xCD, 0xB0, 0x5E, 0x48, 0xA2, 0x20, -0x5F, 0x8B, 0xAF, 0xB0, 0x60, 0x31, 0xBE, 0xA0, 0x61, 0x6B, 0x91, 0xB0, 0x62, 0x11, 0xA0, 0xA0, -0x63, 0x4B, 0x73, 0xB0, 0x63, 0xFA, 0xBD, 0x20, 0x65, 0x2B, 0x55, 0xB0, 0x65, 0xD1, 0x64, 0xA0, -0x67, 0x14, 0x72, 0x30, 0x67, 0xB1, 0x46, 0xA0, 0x68, 0xF4, 0x54, 0x30, 0x69, 0x9A, 0x63, 0x20, -0x6A, 0xD4, 0x36, 0x30, 0x6B, 0x7A, 0x45, 0x20, 0x6C, 0xB4, 0x18, 0x30, 0x6D, 0x5A, 0x27, 0x20, -0x6E, 0x93, 0xFA, 0x30, 0x6F, 0x3A, 0x09, 0x20, 0x70, 0x7D, 0x16, 0xB0, 0x71, 0x19, 0xEB, 0x20, -0x72, 0x5C, 0xF8, 0xB0, 0x72, 0xF9, 0xCD, 0x20, 0x74, 0x3C, 0xDA, 0xB0, 0x74, 0xD9, 0xAF, 0x20, -0x76, 0x1C, 0xBC, 0xB0, 0x76, 0xC2, 0xCB, 0xA0, 0x77, 0xFC, 0x9E, 0xB0, 0x78, 0xAB, 0xE8, 0x20, -0x79, 0xDC, 0x80, 0xB0, 0x7A, 0x82, 0x8F, 0xA0, 0x7B, 0xC5, 0x9D, 0x30, 0x7C, 0x62, 0x71, 0xA0, -0x7D, 0xA5, 0x7F, 0x30, 0x7E, 0x4B, 0x8E, 0x20, 0x7F, 0x85, 0x61, 0x30, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x50, 0x83, 0x65, 0x30, 0x51, 0x20, 0x39, 0xA0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0xFF, 0xFF, 0xD2, 0xD0, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, -0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x42, 0x52, 0x53, 0x54, 0x00, 0x42, 0x52, 0x54, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x57, 0xC0, 0x00, 0xC9, 0x1C, 0x60, 0x00, 0x00, 0x00, -0x09, 0x54, 0x6F, 0x63, 0x61, 0x6E, 0x74, 0x69, 0x6E, 0x73, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xD2, 0xD0, 0x00, +0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x09, 0x4C, 0x4D, 0x54, +0x00, 0x42, 0x52, 0x53, 0x54, 0x00, 0x42, 0x52, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x7E, 0x57, 0xC0, 0x00, 0xC9, 0x1C, 0x60, 0x00, 0x00, 0x00, 0x09, 0x54, 0x6F, 0x63, 0x61, +0x6E, 0x74, 0x69, 0x6E, 0x73, /* America/Argentina/Buenos_Aires */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1767,7 +1752,7 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x05, -0x06, 0x05, 0x04, 0x06, 0x04, 0x05, 0x04, 0x03, 0x06, 0x05, 0x06, 0x05, 0x06, 0xFF, 0xFF, 0xC3, +0x06, 0x05, 0x04, 0x06, 0x04, 0x05, 0x04, 0x03, 0x06, 0x05, 0x06, 0x05, 0x04, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0D, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x12, 0x43, 0x4D, 0x54, 0x00, 0x41, 0x52, 0x54, 0x00, 0x41, @@ -1839,8 +1824,8 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* America/Aruba */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x41, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x93, 0x1E, 0x2F, 0x38, -0xF6, 0x98, 0xEC, 0x48, 0x01, 0x02, 0xFF, 0xFF, 0xBE, 0x48, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xB8, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x93, 0x1E, 0x2E, 0x23, +0xF6, 0x98, 0xEC, 0x48, 0x01, 0x02, 0xFF, 0xFF, 0xBF, 0x5D, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xB8, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x4E, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0x67, 0x10, 0x00, 0xA7, 0xE5, 0xC5, 0x00, 0x00, 0x00, 0x00, @@ -2414,8 +2399,8 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* America/Cayman */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4B, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x0F, 0xB5, 0x00, -0x01, 0xFF, 0xFF, 0xB8, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x04, 0x4B, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x0F, 0xB4, 0xFF, +0x01, 0xFF, 0xFF, 0xB8, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x04, 0x4B, 0x4D, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xC7, 0x50, 0x00, 0x96, 0x7A, 0x22, 0x00, 0x00, 0x00, 0x00, @@ -2889,8 +2874,8 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* America/Dominica */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x44, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x91, 0xF4, 0x34, 0x4C, -0x01, 0xFF, 0xFF, 0xC6, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xAC, 0xD0, 0x00, 0xB4, 0xF8, 0x20, 0x00, 0x00, 0x00, 0x00, @@ -3292,7 +3277,7 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* America/Grand_Turk */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x54, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x93, 0x0F, 0xB5, 0x00, +0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x93, 0x0F, 0xB4, 0xFF, 0x11, 0x89, 0x65, 0xF0, 0x12, 0x79, 0x48, 0xE0, 0x13, 0x69, 0x47, 0xF0, 0x14, 0x59, 0x2A, 0xE0, 0x15, 0x49, 0x29, 0xF0, 0x16, 0x39, 0x0C, 0xE0, 0x17, 0x29, 0x0B, 0xF0, 0x18, 0x22, 0x29, 0x60, 0x19, 0x08, 0xED, 0xF0, 0x1A, 0x02, 0x0B, 0x60, 0x1A, 0xF2, 0x0A, 0x70, 0x1B, 0xE1, 0xED, 0x60, @@ -3330,23 +3315,23 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, -0xFF, 0xB8, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, +0xFF, 0xB8, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0x4B, 0x4D, 0x54, 0x00, 0x45, 0x44, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x15, 0xAA, 0x00, 0xA6, 0x1E, 0x0A, 0x00, 0x00, 0x00, 0x00, /* America/Grenada */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x47, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x91, 0xF4, 0x34, 0x64, -0x01, 0xFF, 0xFF, 0xC6, 0x1C, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9B, 0xB7, 0x48, 0x00, 0xB4, 0x6F, 0x68, 0x00, 0x00, 0x00, 0x00, /* America/Guadeloupe */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x47, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x91, 0xD5, 0xE1, 0xB0, -0x01, 0xFF, 0xFF, 0xC6, 0x50, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA2, 0x19, 0x65, 0x00, 0xB4, 0xC4, 0x0A, 0x00, 0x00, 0x00, 0x00, @@ -4057,17 +4042,17 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* America/Jamaica */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4A, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x93, 0x0F, 0xB5, 0x00, +0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x93, 0x0F, 0xB4, 0xFF, 0x08, 0x20, 0xC1, 0x70, 0x09, 0x10, 0xA4, 0x60, 0x09, 0xAD, 0x94, 0xF0, 0x0A, 0xF0, 0x86, 0x60, 0x0B, 0xE0, 0x85, 0x70, 0x0C, 0xD9, 0xA2, 0xE0, 0x0D, 0xC0, 0x67, 0x70, 0x0E, 0xB9, 0x84, 0xE0, 0x0F, 0xA9, 0x83, 0xF0, 0x10, 0x99, 0x66, 0xE0, 0x11, 0x89, 0x65, 0xF0, 0x12, 0x79, 0x48, 0xE0, 0x13, 0x69, 0x47, 0xF0, 0x14, 0x59, 0x2A, 0xE0, 0x15, 0x49, 0x29, 0xF0, 0x16, 0x39, 0x0C, 0xE0, 0x17, 0x29, 0x0B, 0xF0, 0x18, 0x22, 0x29, 0x60, 0x19, 0x08, 0xED, 0xF0, 0x1A, 0x02, 0x0B, 0x60, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0xFF, 0xFF, 0xB8, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, +0x01, 0x02, 0x01, 0x02, 0x01, 0xFF, 0xFF, 0xB8, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x08, 0x4B, 0x4D, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x45, -0x44, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA4, 0xCB, 0x80, 0x00, 0x9D, 0x78, -0x80, 0x00, 0x00, 0x00, 0x00, +0x44, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA4, 0xBF, 0x05, 0x00, 0x9D, 0x7B, +0x1A, 0x00, 0x00, 0x00, 0x00, /* America/Jujuy */ 0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -4573,8 +4558,8 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* America/Marigot */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4D, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x91, 0xD5, 0xE1, 0xB0, -0x01, 0xFF, 0xFF, 0xC6, 0x50, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA4, 0xE5, 0x8A, 0x00, 0xB2, 0x66, 0x92, 0x00, 0x00, 0x00, 0x00, @@ -5071,7 +5056,7 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x00, 0x00, /* America/Montreal */ -0x50, 0x48, 0x50, 0x31, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x9C, 0xBD, 0x01, 0xF0, 0x9C, 0xE4, 0x64, 0xC0, 0x9E, 0xB8, 0x93, 0x70, 0x9F, 0xBA, 0xEB, 0x60, 0xA0, 0x87, 0x58, 0xF8, @@ -5149,16 +5134,14 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x00, 0x01, 0x00, 0x01, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0x45, 0x44, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x45, 0x57, 0x54, 0x00, 0x45, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x01, 0x00, 0xCE, 0xC8, 0x32, 0x00, 0xA2, 0x67, 0x85, 0x00, 0x00, 0x00, 0x26, -0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6E, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x51, -0x75, 0x65, 0x62, 0x65, 0x63, 0x20, 0x2D, 0x20, 0x6D, 0x6F, 0x73, 0x74, 0x20, 0x6C, 0x6F, 0x63, -0x61, 0x74, 0x69, 0x6F, 0x6E, 0x73, +0x00, 0x00, 0x00, 0x01, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, + /* America/Montserrat */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4D, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x91, 0xF4, 0x35, 0x10, -0x01, 0xFF, 0xFF, 0xC5, 0xAC, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA2, 0xD6, 0x32, 0x00, 0xB3, 0xB9, 0x1D, 0x00, 0x00, 0x00, 0x00, @@ -5741,9 +5724,10 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0xFB, 0xE8, 0x58, 0x00, 0x00, 0x01, 0x00, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x01, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x08, 0x4D, 0x44, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x4D, 0x57, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xBC, 0x5E, 0x01, 0x00, 0x67, 0xA5, 0xDA, 0x00, 0x00, 0x00, 0x20, 0x4D, 0x6F, +0x00, 0x00, 0x00, 0xBC, 0x5E, 0x01, 0x00, 0x67, 0xA5, 0xDA, 0x00, 0x00, 0x00, 0x30, 0x4D, 0x6F, 0x75, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x20, 0x53, 0x74, 0x61, 0x6E, 0x64, 0x61, 0x72, 0x64, 0x20, -0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x41, 0x72, 0x69, 0x7A, 0x6F, 0x6E, 0x61, +0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x41, 0x72, 0x69, 0x7A, 0x6F, 0x6E, 0x61, 0x20, 0x28, +0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x4E, 0x61, 0x76, 0x61, 0x6A, 0x6F, 0x29, /* America/Port-au-Prince */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x48, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -6344,7 +6328,7 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x74, 0x6F, 0x71, 0x71, 0x6F, 0x72, 0x74, 0x6F, 0x6F, 0x72, 0x6D, 0x69, 0x69, 0x74, /* America/Shiprock */ -0x50, 0x48, 0x50, 0x31, 0x01, 0x55, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9D, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x9E, 0xA6, 0x3A, 0x90, 0x9F, 0xBB, 0x07, 0x80, 0xA0, 0x86, 0x1C, 0x90, 0xA1, 0x9A, 0xE9, 0x80, 0xA2, 0x65, 0xFE, 0x90, @@ -6398,9 +6382,8 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0x4D, 0x44, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x4D, 0x57, 0x54, -0x00, 0x4D, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xC1, 0x75, -0x9B, 0x00, 0x6C, 0xD0, 0xE1, 0x00, 0x00, 0x00, 0x16, 0x4D, 0x6F, 0x75, 0x6E, 0x74, 0x61, 0x69, -0x6E, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x4E, 0x61, 0x76, 0x61, 0x6A, 0x6F, +0x00, 0x4D, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x89, 0x54, +0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, /* America/Sitka */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x55, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -6464,8 +6447,8 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* America/St_Barthelemy */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x42, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x91, 0xD5, 0xE1, 0xB0, -0x01, 0xFF, 0xFF, 0xC6, 0x50, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA4, 0x9D, 0xED, 0x00, 0xB2, 0xC1, 0xB8, 0x00, 0x00, 0x00, 0x00, @@ -6560,32 +6543,32 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* America/St_Kitts */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4B, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x34, 0xCC, -0x01, 0xFF, 0xFF, 0xC5, 0x34, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA3, 0xBA, 0x10, 0x00, 0xB2, 0xF5, 0xCD, 0x00, 0x00, 0x00, 0x00, /* America/St_Lucia */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4C, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x92, 0xE6, 0xC7, 0xB0, -0x01, 0xFF, 0xFF, 0xC6, 0xD0, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x43, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9E, 0xB7, 0x82, 0x00, 0xB5, 0x94, 0x60, 0x00, 0x00, 0x00, 0x00, /* America/St_Thomas */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x56, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x91, 0xF4, 0x37, 0x60, -0x01, 0xFF, 0xFF, 0xC3, 0x20, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x54, 0x38, 0x00, 0xAF, 0x93, 0xEA, 0x00, 0x00, 0x00, 0x00, /* America/St_Vincent */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x56, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x92, 0xE6, 0xC7, 0xE8, -0x01, 0xFF, 0xFF, 0xC6, 0x98, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4B, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9D, 0x64, 0xF8, 0x00, 0xB5, 0x39, 0x3A, 0x00, 0x00, 0x00, 0x00, @@ -6853,16 +6836,17 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x00, 0x01, 0x00, 0x01, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0x45, 0x44, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x45, 0x57, 0x54, 0x00, 0x45, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x01, 0x00, 0xCB, 0xEF, 0x08, 0x00, 0x99, 0x87, 0x62, 0x00, 0x00, 0x00, 0x27, +0x00, 0x00, 0x00, 0x01, 0x00, 0xCB, 0xEF, 0x08, 0x00, 0x99, 0x87, 0x62, 0x00, 0x00, 0x00, 0x30, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6E, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x4F, -0x6E, 0x74, 0x61, 0x72, 0x69, 0x6F, 0x20, 0x2D, 0x20, 0x6D, 0x6F, 0x73, 0x74, 0x20, 0x6C, 0x6F, -0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x73, +0x6E, 0x74, 0x61, 0x72, 0x69, 0x6F, 0x20, 0x26, 0x20, 0x51, 0x75, 0x65, 0x62, 0x65, 0x63, 0x20, +0x2D, 0x20, 0x6D, 0x6F, 0x73, 0x74, 0x20, 0x6C, 0x6F, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x73, + /* America/Tortola */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x56, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x91, 0xF4, 0x37, 0x14, -0x01, 0xFF, 0xFF, 0xC3, 0x6C, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x7B, 0x48, 0x00, 0xB0, 0x0F, 0x9D, 0x00, 0x00, 0x00, 0x00, @@ -6939,8 +6923,8 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* America/Virgin */ 0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x91, 0xF4, 0x37, 0x60, -0x01, 0xFF, 0xFF, 0xC3, 0x20, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, +0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, @@ -7264,54 +7248,64 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* Antarctica/McMurdo */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x41, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0E, 0xE5, 0xA9, 0xE9, 0x00, -0x09, 0x18, 0xFD, 0xE0, 0x09, 0xAC, 0xA5, 0xE0, 0x0A, 0xEF, 0xA5, 0x60, 0x0B, 0x9E, 0xFC, 0xE0, -0x0C, 0xD8, 0xC1, 0xE0, 0x0D, 0x7E, 0xDE, 0xE0, 0x0E, 0xB8, 0xA3, 0xE0, 0x0F, 0x5E, 0xC0, 0xE0, -0x10, 0x98, 0x85, 0xE0, 0x11, 0x3E, 0xA2, 0xE0, 0x12, 0x78, 0x67, 0xE0, 0x13, 0x1E, 0x84, 0xE0, -0x14, 0x58, 0x49, 0xE0, 0x14, 0xFE, 0x66, 0xE0, 0x16, 0x38, 0x2B, 0xE0, 0x16, 0xE7, 0x83, 0x60, -0x18, 0x21, 0x48, 0x60, 0x18, 0xC7, 0x65, 0x60, 0x1A, 0x01, 0x2A, 0x60, 0x1A, 0xA7, 0x47, 0x60, -0x1B, 0xE1, 0x0C, 0x60, 0x1C, 0x87, 0x29, 0x60, 0x1D, 0xC0, 0xEE, 0x60, 0x1E, 0x67, 0x0B, 0x60, -0x1F, 0xA0, 0xD0, 0x60, 0x20, 0x46, 0xED, 0x60, 0x21, 0x80, 0xB2, 0x60, 0x22, 0x30, 0x09, 0xE0, -0x23, 0x69, 0xCE, 0xE0, 0x24, 0x0F, 0xEB, 0xE0, 0x25, 0x2E, 0x01, 0x60, 0x26, 0x02, 0x42, 0xE0, -0x27, 0x0D, 0xE3, 0x60, 0x27, 0xE2, 0x24, 0xE0, 0x28, 0xED, 0xC5, 0x60, 0x29, 0xC2, 0x06, 0xE0, -0x2A, 0xCD, 0xA7, 0x60, 0x2B, 0xAB, 0x23, 0x60, 0x2C, 0xAD, 0x89, 0x60, 0x2D, 0x8B, 0x05, 0x60, -0x2E, 0x8D, 0x6B, 0x60, 0x2F, 0x6A, 0xE7, 0x60, 0x30, 0x6D, 0x4D, 0x60, 0x31, 0x4A, 0xC9, 0x60, -0x32, 0x56, 0x69, 0xE0, 0x33, 0x2A, 0xAB, 0x60, 0x34, 0x36, 0x4B, 0xE0, 0x35, 0x0A, 0x8D, 0x60, -0x36, 0x16, 0x2D, 0xE0, 0x36, 0xF3, 0xA9, 0xE0, 0x37, 0xF6, 0x0F, 0xE0, 0x38, 0xD3, 0x8B, 0xE0, -0x39, 0xD5, 0xF1, 0xE0, 0x3A, 0xB3, 0x6D, 0xE0, 0x3B, 0xBF, 0x0E, 0x60, 0x3C, 0x93, 0x4F, 0xE0, -0x3D, 0x9E, 0xF0, 0x60, 0x3E, 0x73, 0x31, 0xE0, 0x3F, 0x7E, 0xD2, 0x60, 0x40, 0x5C, 0x4E, 0x60, -0x41, 0x5E, 0xB4, 0x60, 0x42, 0x3C, 0x30, 0x60, 0x43, 0x3E, 0x96, 0x60, 0x44, 0x1C, 0x12, 0x60, -0x45, 0x1E, 0x78, 0x60, 0x45, 0xFB, 0xF4, 0x60, 0x46, 0xFE, 0x5A, 0x60, 0x47, 0xF7, 0x85, 0xE0, -0x48, 0xDE, 0x3C, 0x60, 0x49, 0xD7, 0x67, 0xE0, 0x4A, 0xBE, 0x1E, 0x60, 0x4B, 0xB7, 0x49, 0xE0, -0x4C, 0x9E, 0x00, 0x60, 0x4D, 0x97, 0x2B, 0xE0, 0x4E, 0x7D, 0xE2, 0x60, 0x4F, 0x77, 0x0D, 0xE0, -0x50, 0x66, 0xFE, 0xE0, 0x51, 0x60, 0x2A, 0x60, 0x52, 0x46, 0xE0, 0xE0, 0x53, 0x40, 0x0C, 0x60, -0x54, 0x26, 0xC2, 0xE0, 0x55, 0x1F, 0xEE, 0x60, 0x56, 0x06, 0xA4, 0xE0, 0x56, 0xFF, 0xD0, 0x60, -0x57, 0xE6, 0x86, 0xE0, 0x58, 0xDF, 0xB2, 0x60, 0x59, 0xC6, 0x68, 0xE0, 0x5A, 0xBF, 0x94, 0x60, -0x5B, 0xAF, 0x85, 0x60, 0x5C, 0xA8, 0xB0, 0xE0, 0x5D, 0x8F, 0x67, 0x60, 0x5E, 0x88, 0x92, 0xE0, -0x5F, 0x6F, 0x49, 0x60, 0x60, 0x68, 0x74, 0xE0, 0x61, 0x4F, 0x2B, 0x60, 0x62, 0x48, 0x56, 0xE0, -0x63, 0x2F, 0x0D, 0x60, 0x64, 0x28, 0x38, 0xE0, 0x65, 0x0E, 0xEF, 0x60, 0x66, 0x11, 0x55, 0x60, -0x66, 0xF8, 0x0B, 0xE0, 0x67, 0xF1, 0x37, 0x60, 0x68, 0xD7, 0xED, 0xE0, 0x69, 0xD1, 0x19, 0x60, -0x6A, 0xB7, 0xCF, 0xE0, 0x6B, 0xB0, 0xFB, 0x60, 0x6C, 0x97, 0xB1, 0xE0, 0x6D, 0x90, 0xDD, 0x60, -0x6E, 0x77, 0x93, 0xE0, 0x6F, 0x70, 0xBF, 0x60, 0x70, 0x60, 0xB0, 0x60, 0x71, 0x59, 0xDB, 0xE0, -0x72, 0x40, 0x92, 0x60, 0x73, 0x39, 0xBD, 0xE0, 0x74, 0x20, 0x74, 0x60, 0x75, 0x19, 0x9F, 0xE0, -0x76, 0x00, 0x56, 0x60, 0x76, 0xF9, 0x81, 0xE0, 0x77, 0xE0, 0x38, 0x60, 0x78, 0xD9, 0x63, 0xE0, -0x79, 0xC0, 0x1A, 0x60, 0x7A, 0xB9, 0x45, 0xE0, 0x7B, 0xA9, 0x36, 0xE0, 0x7C, 0xA2, 0x62, 0x60, -0x7D, 0x89, 0x18, 0xE0, 0x7E, 0x82, 0x44, 0x60, 0x7F, 0x68, 0xFA, 0xE0, 0x03, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0F, 0xB0, 0xB4, 0xB2, 0xE8, +0xB1, 0x51, 0x87, 0x58, 0xB2, 0x78, 0xE5, 0x68, 0xB3, 0x43, 0xE5, 0x60, 0xB4, 0x58, 0xC7, 0x68, +0xB5, 0x23, 0xC7, 0x60, 0xB6, 0x38, 0xA9, 0x68, 0xB7, 0x03, 0xA9, 0x60, 0xB8, 0x18, 0x8B, 0x68, +0xB8, 0xEC, 0xC5, 0xE0, 0xB9, 0xF8, 0x6D, 0x68, 0xBA, 0xCC, 0xA7, 0xE0, 0xBB, 0xD8, 0x4F, 0x68, +0xBC, 0xE3, 0xE8, 0xE0, 0xBD, 0xAE, 0xF6, 0xE8, 0xBE, 0xC3, 0xCA, 0xE0, 0xBF, 0x8E, 0xD8, 0xE8, +0xC0, 0xA3, 0xAC, 0xE0, 0xC1, 0x6E, 0xBA, 0xE8, 0xC2, 0x83, 0x8E, 0xE0, 0xC3, 0x4E, 0x9C, 0xE8, +0xC4, 0x63, 0x70, 0xE0, 0xC5, 0x2E, 0x7E, 0xE8, 0xC6, 0x4C, 0x8D, 0x60, 0xC7, 0x0E, 0x60, 0xE8, +0xC8, 0x2C, 0x6F, 0x60, 0xC8, 0xF7, 0x7D, 0x68, 0xD2, 0xDA, 0x9A, 0x40, 0x09, 0x18, 0xFD, 0xE0, +0x09, 0xAC, 0xA5, 0xE0, 0x0A, 0xEF, 0xA5, 0x60, 0x0B, 0x9E, 0xFC, 0xE0, 0x0C, 0xD8, 0xC1, 0xE0, +0x0D, 0x7E, 0xDE, 0xE0, 0x0E, 0xB8, 0xA3, 0xE0, 0x0F, 0x5E, 0xC0, 0xE0, 0x10, 0x98, 0x85, 0xE0, +0x11, 0x3E, 0xA2, 0xE0, 0x12, 0x78, 0x67, 0xE0, 0x13, 0x1E, 0x84, 0xE0, 0x14, 0x58, 0x49, 0xE0, +0x14, 0xFE, 0x66, 0xE0, 0x16, 0x38, 0x2B, 0xE0, 0x16, 0xE7, 0x83, 0x60, 0x18, 0x21, 0x48, 0x60, +0x18, 0xC7, 0x65, 0x60, 0x1A, 0x01, 0x2A, 0x60, 0x1A, 0xA7, 0x47, 0x60, 0x1B, 0xE1, 0x0C, 0x60, +0x1C, 0x87, 0x29, 0x60, 0x1D, 0xC0, 0xEE, 0x60, 0x1E, 0x67, 0x0B, 0x60, 0x1F, 0xA0, 0xD0, 0x60, +0x20, 0x46, 0xED, 0x60, 0x21, 0x80, 0xB2, 0x60, 0x22, 0x30, 0x09, 0xE0, 0x23, 0x69, 0xCE, 0xE0, +0x24, 0x0F, 0xEB, 0xE0, 0x25, 0x2E, 0x01, 0x60, 0x26, 0x02, 0x42, 0xE0, 0x27, 0x0D, 0xE3, 0x60, +0x27, 0xE2, 0x24, 0xE0, 0x28, 0xED, 0xC5, 0x60, 0x29, 0xC2, 0x06, 0xE0, 0x2A, 0xCD, 0xA7, 0x60, +0x2B, 0xAB, 0x23, 0x60, 0x2C, 0xAD, 0x89, 0x60, 0x2D, 0x8B, 0x05, 0x60, 0x2E, 0x8D, 0x6B, 0x60, +0x2F, 0x6A, 0xE7, 0x60, 0x30, 0x6D, 0x4D, 0x60, 0x31, 0x4A, 0xC9, 0x60, 0x32, 0x56, 0x69, 0xE0, +0x33, 0x2A, 0xAB, 0x60, 0x34, 0x36, 0x4B, 0xE0, 0x35, 0x0A, 0x8D, 0x60, 0x36, 0x16, 0x2D, 0xE0, +0x36, 0xF3, 0xA9, 0xE0, 0x37, 0xF6, 0x0F, 0xE0, 0x38, 0xD3, 0x8B, 0xE0, 0x39, 0xD5, 0xF1, 0xE0, +0x3A, 0xB3, 0x6D, 0xE0, 0x3B, 0xBF, 0x0E, 0x60, 0x3C, 0x93, 0x4F, 0xE0, 0x3D, 0x9E, 0xF0, 0x60, +0x3E, 0x73, 0x31, 0xE0, 0x3F, 0x7E, 0xD2, 0x60, 0x40, 0x5C, 0x4E, 0x60, 0x41, 0x5E, 0xB4, 0x60, +0x42, 0x3C, 0x30, 0x60, 0x43, 0x3E, 0x96, 0x60, 0x44, 0x1C, 0x12, 0x60, 0x45, 0x1E, 0x78, 0x60, +0x45, 0xFB, 0xF4, 0x60, 0x46, 0xFE, 0x5A, 0x60, 0x47, 0xF7, 0x85, 0xE0, 0x48, 0xDE, 0x3C, 0x60, +0x49, 0xD7, 0x67, 0xE0, 0x4A, 0xBE, 0x1E, 0x60, 0x4B, 0xB7, 0x49, 0xE0, 0x4C, 0x9E, 0x00, 0x60, +0x4D, 0x97, 0x2B, 0xE0, 0x4E, 0x7D, 0xE2, 0x60, 0x4F, 0x77, 0x0D, 0xE0, 0x50, 0x66, 0xFE, 0xE0, +0x51, 0x60, 0x2A, 0x60, 0x52, 0x46, 0xE0, 0xE0, 0x53, 0x40, 0x0C, 0x60, 0x54, 0x26, 0xC2, 0xE0, +0x55, 0x1F, 0xEE, 0x60, 0x56, 0x06, 0xA4, 0xE0, 0x56, 0xFF, 0xD0, 0x60, 0x57, 0xE6, 0x86, 0xE0, +0x58, 0xDF, 0xB2, 0x60, 0x59, 0xC6, 0x68, 0xE0, 0x5A, 0xBF, 0x94, 0x60, 0x5B, 0xAF, 0x85, 0x60, +0x5C, 0xA8, 0xB0, 0xE0, 0x5D, 0x8F, 0x67, 0x60, 0x5E, 0x88, 0x92, 0xE0, 0x5F, 0x6F, 0x49, 0x60, +0x60, 0x68, 0x74, 0xE0, 0x61, 0x4F, 0x2B, 0x60, 0x62, 0x48, 0x56, 0xE0, 0x63, 0x2F, 0x0D, 0x60, +0x64, 0x28, 0x38, 0xE0, 0x65, 0x0E, 0xEF, 0x60, 0x66, 0x11, 0x55, 0x60, 0x66, 0xF8, 0x0B, 0xE0, +0x67, 0xF1, 0x37, 0x60, 0x68, 0xD7, 0xED, 0xE0, 0x69, 0xD1, 0x19, 0x60, 0x6A, 0xB7, 0xCF, 0xE0, +0x6B, 0xB0, 0xFB, 0x60, 0x6C, 0x97, 0xB1, 0xE0, 0x6D, 0x90, 0xDD, 0x60, 0x6E, 0x77, 0x93, 0xE0, +0x6F, 0x70, 0xBF, 0x60, 0x70, 0x60, 0xB0, 0x60, 0x71, 0x59, 0xDB, 0xE0, 0x72, 0x40, 0x92, 0x60, +0x73, 0x39, 0xBD, 0xE0, 0x74, 0x20, 0x74, 0x60, 0x75, 0x19, 0x9F, 0xE0, 0x76, 0x00, 0x56, 0x60, +0x76, 0xF9, 0x81, 0xE0, 0x77, 0xE0, 0x38, 0x60, 0x78, 0xD9, 0x63, 0xE0, 0x79, 0xC0, 0x1A, 0x60, +0x7A, 0xB9, 0x45, 0xE0, 0x7B, 0xA9, 0x36, 0xE0, 0x7C, 0xA2, 0x62, 0x60, 0x7D, 0x89, 0x18, 0xE0, +0x7E, 0x82, 0x44, 0x60, 0x7F, 0x68, 0xFA, 0xE0, 0x00, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x09, 0x00, 0x00, -0xA8, 0xC0, 0x00, 0x09, 0x7A, 0x7A, 0x7A, 0x00, 0x4E, 0x5A, 0x44, 0x54, 0x00, 0x4E, 0x5A, 0x53, -0x54, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x90, 0x9A, 0x02, 0x10, -0xDE, 0xA0, 0x00, 0x00, 0x00, 0x1C, 0x4D, 0x63, 0x4D, 0x75, 0x72, 0x64, 0x6F, 0x20, 0x53, 0x74, -0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2C, 0x20, 0x52, 0x6F, 0x73, 0x73, 0x20, 0x49, 0x73, 0x6C, 0x61, -0x6E, 0x64, +0x02, 0x01, 0x02, 0x05, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x00, 0x00, 0xAF, 0xC8, 0x01, 0x00, 0x00, 0x00, 0xA1, 0xB8, 0x00, 0x05, 0x00, +0x00, 0xA8, 0xC0, 0x01, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x0A, 0x00, 0x00, 0xA8, 0xC0, 0x00, +0x00, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x00, 0x4E, 0x5A, 0x53, 0x54, 0x00, 0x4E, 0x5A, 0x4D, 0x54, +0x00, 0x4E, 0x5A, 0x44, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x12, 0x90, 0x9A, 0x02, 0x10, 0xDE, 0xA0, 0x00, 0x00, 0x00, 0x2D, 0x4D, 0x63, +0x4D, 0x75, 0x72, 0x64, 0x6F, 0x2C, 0x20, 0x53, 0x6F, 0x75, 0x74, 0x68, 0x20, 0x50, 0x6F, 0x6C, +0x65, 0x2C, 0x20, 0x53, 0x63, 0x6F, 0x74, 0x74, 0x20, 0x28, 0x4E, 0x65, 0x77, 0x20, 0x5A, 0x65, +0x61, 0x6C, 0x61, 0x6E, 0x64, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x29, /* Antarctica/Palmer */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x41, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -7376,55 +7370,62 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64, /* Antarctica/South_Pole */ -0x50, 0x48, 0x50, 0x31, 0x01, 0x41, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0E, 0xE5, 0xA9, 0xE9, 0x00, -0x09, 0x18, 0xFD, 0xE0, 0x09, 0xAC, 0xA5, 0xE0, 0x0A, 0xEF, 0xA5, 0x60, 0x0B, 0x9E, 0xFC, 0xE0, -0x0C, 0xD8, 0xC1, 0xE0, 0x0D, 0x7E, 0xDE, 0xE0, 0x0E, 0xB8, 0xA3, 0xE0, 0x0F, 0x5E, 0xC0, 0xE0, -0x10, 0x98, 0x85, 0xE0, 0x11, 0x3E, 0xA2, 0xE0, 0x12, 0x78, 0x67, 0xE0, 0x13, 0x1E, 0x84, 0xE0, -0x14, 0x58, 0x49, 0xE0, 0x14, 0xFE, 0x66, 0xE0, 0x16, 0x38, 0x2B, 0xE0, 0x16, 0xE7, 0x83, 0x60, -0x18, 0x21, 0x48, 0x60, 0x18, 0xC7, 0x65, 0x60, 0x1A, 0x01, 0x2A, 0x60, 0x1A, 0xA7, 0x47, 0x60, -0x1B, 0xE1, 0x0C, 0x60, 0x1C, 0x87, 0x29, 0x60, 0x1D, 0xC0, 0xEE, 0x60, 0x1E, 0x67, 0x0B, 0x60, -0x1F, 0xA0, 0xD0, 0x60, 0x20, 0x46, 0xED, 0x60, 0x21, 0x80, 0xB2, 0x60, 0x22, 0x30, 0x09, 0xE0, -0x23, 0x69, 0xCE, 0xE0, 0x24, 0x0F, 0xEB, 0xE0, 0x25, 0x2E, 0x01, 0x60, 0x26, 0x02, 0x42, 0xE0, -0x27, 0x0D, 0xE3, 0x60, 0x27, 0xE2, 0x24, 0xE0, 0x28, 0xED, 0xC5, 0x60, 0x29, 0xC2, 0x06, 0xE0, -0x2A, 0xCD, 0xA7, 0x60, 0x2B, 0xAB, 0x23, 0x60, 0x2C, 0xAD, 0x89, 0x60, 0x2D, 0x8B, 0x05, 0x60, -0x2E, 0x8D, 0x6B, 0x60, 0x2F, 0x6A, 0xE7, 0x60, 0x30, 0x6D, 0x4D, 0x60, 0x31, 0x4A, 0xC9, 0x60, -0x32, 0x56, 0x69, 0xE0, 0x33, 0x2A, 0xAB, 0x60, 0x34, 0x36, 0x4B, 0xE0, 0x35, 0x0A, 0x8D, 0x60, -0x36, 0x16, 0x2D, 0xE0, 0x36, 0xF3, 0xA9, 0xE0, 0x37, 0xF6, 0x0F, 0xE0, 0x38, 0xD3, 0x8B, 0xE0, -0x39, 0xD5, 0xF1, 0xE0, 0x3A, 0xB3, 0x6D, 0xE0, 0x3B, 0xBF, 0x0E, 0x60, 0x3C, 0x93, 0x4F, 0xE0, -0x3D, 0x9E, 0xF0, 0x60, 0x3E, 0x73, 0x31, 0xE0, 0x3F, 0x7E, 0xD2, 0x60, 0x40, 0x5C, 0x4E, 0x60, -0x41, 0x5E, 0xB4, 0x60, 0x42, 0x3C, 0x30, 0x60, 0x43, 0x3E, 0x96, 0x60, 0x44, 0x1C, 0x12, 0x60, -0x45, 0x1E, 0x78, 0x60, 0x45, 0xFB, 0xF4, 0x60, 0x46, 0xFE, 0x5A, 0x60, 0x47, 0xF7, 0x85, 0xE0, -0x48, 0xDE, 0x3C, 0x60, 0x49, 0xD7, 0x67, 0xE0, 0x4A, 0xBE, 0x1E, 0x60, 0x4B, 0xB7, 0x49, 0xE0, -0x4C, 0x9E, 0x00, 0x60, 0x4D, 0x97, 0x2B, 0xE0, 0x4E, 0x7D, 0xE2, 0x60, 0x4F, 0x77, 0x0D, 0xE0, -0x50, 0x66, 0xFE, 0xE0, 0x51, 0x60, 0x2A, 0x60, 0x52, 0x46, 0xE0, 0xE0, 0x53, 0x40, 0x0C, 0x60, -0x54, 0x26, 0xC2, 0xE0, 0x55, 0x1F, 0xEE, 0x60, 0x56, 0x06, 0xA4, 0xE0, 0x56, 0xFF, 0xD0, 0x60, -0x57, 0xE6, 0x86, 0xE0, 0x58, 0xDF, 0xB2, 0x60, 0x59, 0xC6, 0x68, 0xE0, 0x5A, 0xBF, 0x94, 0x60, -0x5B, 0xAF, 0x85, 0x60, 0x5C, 0xA8, 0xB0, 0xE0, 0x5D, 0x8F, 0x67, 0x60, 0x5E, 0x88, 0x92, 0xE0, -0x5F, 0x6F, 0x49, 0x60, 0x60, 0x68, 0x74, 0xE0, 0x61, 0x4F, 0x2B, 0x60, 0x62, 0x48, 0x56, 0xE0, -0x63, 0x2F, 0x0D, 0x60, 0x64, 0x28, 0x38, 0xE0, 0x65, 0x0E, 0xEF, 0x60, 0x66, 0x11, 0x55, 0x60, -0x66, 0xF8, 0x0B, 0xE0, 0x67, 0xF1, 0x37, 0x60, 0x68, 0xD7, 0xED, 0xE0, 0x69, 0xD1, 0x19, 0x60, -0x6A, 0xB7, 0xCF, 0xE0, 0x6B, 0xB0, 0xFB, 0x60, 0x6C, 0x97, 0xB1, 0xE0, 0x6D, 0x90, 0xDD, 0x60, -0x6E, 0x77, 0x93, 0xE0, 0x6F, 0x70, 0xBF, 0x60, 0x70, 0x60, 0xB0, 0x60, 0x71, 0x59, 0xDB, 0xE0, -0x72, 0x40, 0x92, 0x60, 0x73, 0x39, 0xBD, 0xE0, 0x74, 0x20, 0x74, 0x60, 0x75, 0x19, 0x9F, 0xE0, -0x76, 0x00, 0x56, 0x60, 0x76, 0xF9, 0x81, 0xE0, 0x77, 0xE0, 0x38, 0x60, 0x78, 0xD9, 0x63, 0xE0, -0x79, 0xC0, 0x1A, 0x60, 0x7A, 0xB9, 0x45, 0xE0, 0x7B, 0xA9, 0x36, 0xE0, 0x7C, 0xA2, 0x62, 0x60, -0x7D, 0x89, 0x18, 0xE0, 0x7E, 0x82, 0x44, 0x60, 0x7F, 0x68, 0xFA, 0xE0, 0x03, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x9B, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0F, 0xB0, 0xB4, 0xB2, 0xE8, +0xB1, 0x51, 0x87, 0x58, 0xB2, 0x78, 0xE5, 0x68, 0xB3, 0x43, 0xE5, 0x60, 0xB4, 0x58, 0xC7, 0x68, +0xB5, 0x23, 0xC7, 0x60, 0xB6, 0x38, 0xA9, 0x68, 0xB7, 0x03, 0xA9, 0x60, 0xB8, 0x18, 0x8B, 0x68, +0xB8, 0xEC, 0xC5, 0xE0, 0xB9, 0xF8, 0x6D, 0x68, 0xBA, 0xCC, 0xA7, 0xE0, 0xBB, 0xD8, 0x4F, 0x68, +0xBC, 0xE3, 0xE8, 0xE0, 0xBD, 0xAE, 0xF6, 0xE8, 0xBE, 0xC3, 0xCA, 0xE0, 0xBF, 0x8E, 0xD8, 0xE8, +0xC0, 0xA3, 0xAC, 0xE0, 0xC1, 0x6E, 0xBA, 0xE8, 0xC2, 0x83, 0x8E, 0xE0, 0xC3, 0x4E, 0x9C, 0xE8, +0xC4, 0x63, 0x70, 0xE0, 0xC5, 0x2E, 0x7E, 0xE8, 0xC6, 0x4C, 0x8D, 0x60, 0xC7, 0x0E, 0x60, 0xE8, +0xC8, 0x2C, 0x6F, 0x60, 0xC8, 0xF7, 0x7D, 0x68, 0xD2, 0xDA, 0x9A, 0x40, 0x09, 0x18, 0xFD, 0xE0, +0x09, 0xAC, 0xA5, 0xE0, 0x0A, 0xEF, 0xA5, 0x60, 0x0B, 0x9E, 0xFC, 0xE0, 0x0C, 0xD8, 0xC1, 0xE0, +0x0D, 0x7E, 0xDE, 0xE0, 0x0E, 0xB8, 0xA3, 0xE0, 0x0F, 0x5E, 0xC0, 0xE0, 0x10, 0x98, 0x85, 0xE0, +0x11, 0x3E, 0xA2, 0xE0, 0x12, 0x78, 0x67, 0xE0, 0x13, 0x1E, 0x84, 0xE0, 0x14, 0x58, 0x49, 0xE0, +0x14, 0xFE, 0x66, 0xE0, 0x16, 0x38, 0x2B, 0xE0, 0x16, 0xE7, 0x83, 0x60, 0x18, 0x21, 0x48, 0x60, +0x18, 0xC7, 0x65, 0x60, 0x1A, 0x01, 0x2A, 0x60, 0x1A, 0xA7, 0x47, 0x60, 0x1B, 0xE1, 0x0C, 0x60, +0x1C, 0x87, 0x29, 0x60, 0x1D, 0xC0, 0xEE, 0x60, 0x1E, 0x67, 0x0B, 0x60, 0x1F, 0xA0, 0xD0, 0x60, +0x20, 0x46, 0xED, 0x60, 0x21, 0x80, 0xB2, 0x60, 0x22, 0x30, 0x09, 0xE0, 0x23, 0x69, 0xCE, 0xE0, +0x24, 0x0F, 0xEB, 0xE0, 0x25, 0x2E, 0x01, 0x60, 0x26, 0x02, 0x42, 0xE0, 0x27, 0x0D, 0xE3, 0x60, +0x27, 0xE2, 0x24, 0xE0, 0x28, 0xED, 0xC5, 0x60, 0x29, 0xC2, 0x06, 0xE0, 0x2A, 0xCD, 0xA7, 0x60, +0x2B, 0xAB, 0x23, 0x60, 0x2C, 0xAD, 0x89, 0x60, 0x2D, 0x8B, 0x05, 0x60, 0x2E, 0x8D, 0x6B, 0x60, +0x2F, 0x6A, 0xE7, 0x60, 0x30, 0x6D, 0x4D, 0x60, 0x31, 0x4A, 0xC9, 0x60, 0x32, 0x56, 0x69, 0xE0, +0x33, 0x2A, 0xAB, 0x60, 0x34, 0x36, 0x4B, 0xE0, 0x35, 0x0A, 0x8D, 0x60, 0x36, 0x16, 0x2D, 0xE0, +0x36, 0xF3, 0xA9, 0xE0, 0x37, 0xF6, 0x0F, 0xE0, 0x38, 0xD3, 0x8B, 0xE0, 0x39, 0xD5, 0xF1, 0xE0, +0x3A, 0xB3, 0x6D, 0xE0, 0x3B, 0xBF, 0x0E, 0x60, 0x3C, 0x93, 0x4F, 0xE0, 0x3D, 0x9E, 0xF0, 0x60, +0x3E, 0x73, 0x31, 0xE0, 0x3F, 0x7E, 0xD2, 0x60, 0x40, 0x5C, 0x4E, 0x60, 0x41, 0x5E, 0xB4, 0x60, +0x42, 0x3C, 0x30, 0x60, 0x43, 0x3E, 0x96, 0x60, 0x44, 0x1C, 0x12, 0x60, 0x45, 0x1E, 0x78, 0x60, +0x45, 0xFB, 0xF4, 0x60, 0x46, 0xFE, 0x5A, 0x60, 0x47, 0xF7, 0x85, 0xE0, 0x48, 0xDE, 0x3C, 0x60, +0x49, 0xD7, 0x67, 0xE0, 0x4A, 0xBE, 0x1E, 0x60, 0x4B, 0xB7, 0x49, 0xE0, 0x4C, 0x9E, 0x00, 0x60, +0x4D, 0x97, 0x2B, 0xE0, 0x4E, 0x7D, 0xE2, 0x60, 0x4F, 0x77, 0x0D, 0xE0, 0x50, 0x66, 0xFE, 0xE0, +0x51, 0x60, 0x2A, 0x60, 0x52, 0x46, 0xE0, 0xE0, 0x53, 0x40, 0x0C, 0x60, 0x54, 0x26, 0xC2, 0xE0, +0x55, 0x1F, 0xEE, 0x60, 0x56, 0x06, 0xA4, 0xE0, 0x56, 0xFF, 0xD0, 0x60, 0x57, 0xE6, 0x86, 0xE0, +0x58, 0xDF, 0xB2, 0x60, 0x59, 0xC6, 0x68, 0xE0, 0x5A, 0xBF, 0x94, 0x60, 0x5B, 0xAF, 0x85, 0x60, +0x5C, 0xA8, 0xB0, 0xE0, 0x5D, 0x8F, 0x67, 0x60, 0x5E, 0x88, 0x92, 0xE0, 0x5F, 0x6F, 0x49, 0x60, +0x60, 0x68, 0x74, 0xE0, 0x61, 0x4F, 0x2B, 0x60, 0x62, 0x48, 0x56, 0xE0, 0x63, 0x2F, 0x0D, 0x60, +0x64, 0x28, 0x38, 0xE0, 0x65, 0x0E, 0xEF, 0x60, 0x66, 0x11, 0x55, 0x60, 0x66, 0xF8, 0x0B, 0xE0, +0x67, 0xF1, 0x37, 0x60, 0x68, 0xD7, 0xED, 0xE0, 0x69, 0xD1, 0x19, 0x60, 0x6A, 0xB7, 0xCF, 0xE0, +0x6B, 0xB0, 0xFB, 0x60, 0x6C, 0x97, 0xB1, 0xE0, 0x6D, 0x90, 0xDD, 0x60, 0x6E, 0x77, 0x93, 0xE0, +0x6F, 0x70, 0xBF, 0x60, 0x70, 0x60, 0xB0, 0x60, 0x71, 0x59, 0xDB, 0xE0, 0x72, 0x40, 0x92, 0x60, +0x73, 0x39, 0xBD, 0xE0, 0x74, 0x20, 0x74, 0x60, 0x75, 0x19, 0x9F, 0xE0, 0x76, 0x00, 0x56, 0x60, +0x76, 0xF9, 0x81, 0xE0, 0x77, 0xE0, 0x38, 0x60, 0x78, 0xD9, 0x63, 0xE0, 0x79, 0xC0, 0x1A, 0x60, +0x7A, 0xB9, 0x45, 0xE0, 0x7B, 0xA9, 0x36, 0xE0, 0x7C, 0xA2, 0x62, 0x60, 0x7D, 0x89, 0x18, 0xE0, +0x7E, 0x82, 0x44, 0x60, 0x7F, 0x68, 0xFA, 0xE0, 0x00, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x09, 0x00, 0x00, -0xA8, 0xC0, 0x00, 0x09, 0x7A, 0x7A, 0x7A, 0x00, 0x4E, 0x5A, 0x44, 0x54, 0x00, 0x4E, 0x5A, 0x53, -0x54, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x12, -0xA8, 0x80, 0x00, 0x00, 0x00, 0x22, 0x41, 0x6D, 0x75, 0x6E, 0x64, 0x73, 0x65, 0x6E, 0x2D, 0x53, -0x63, 0x6F, 0x74, 0x74, 0x20, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2C, 0x20, 0x53, 0x6F, -0x75, 0x74, 0x68, 0x20, 0x50, 0x6F, 0x6C, 0x65, +0x02, 0x01, 0x02, 0x05, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x00, 0x00, 0xAF, 0xC8, 0x01, 0x00, 0x00, 0x00, 0xA1, 0xB8, 0x00, 0x05, 0x00, +0x00, 0xA8, 0xC0, 0x01, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x0A, 0x00, 0x00, 0xA8, 0xC0, 0x00, +0x00, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x00, 0x4E, 0x5A, 0x53, 0x54, 0x00, 0x4E, 0x5A, 0x4D, 0x54, +0x00, 0x4E, 0x5A, 0x44, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, /* Antarctica/Syowa */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x41, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -7535,8 +7536,8 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* Asia/Amman */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4A, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0D, 0xB6, 0xA3, 0xD6, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x11, 0xB6, 0xA3, 0xD6, 0xD0, 0x06, 0x72, 0x79, 0xE0, 0x07, 0x0C, 0xAB, 0x50, 0x08, 0x24, 0x37, 0x60, 0x08, 0xED, 0xDE, 0xD0, 0x0A, 0x05, 0x6A, 0xE0, 0x0A, 0xCF, 0x12, 0x50, 0x0B, 0xE7, 0xEF, 0xE0, 0x0C, 0xDA, 0x75, 0xD0, 0x0D, 0xC9, 0x23, 0x60, 0x0E, 0x92, 0xCA, 0xD0, 0x0F, 0xA9, 0x05, 0x60, 0x10, 0x72, 0xAC, 0xD0, @@ -7553,31 +7554,17 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x42, 0x4C, 0x72, 0xE0, 0x43, 0x3C, 0x63, 0xE0, 0x44, 0x2C, 0x54, 0xE0, 0x45, 0x41, 0x2F, 0xE0, 0x46, 0x0C, 0x36, 0xE0, 0x47, 0x21, 0x11, 0xE0, 0x47, 0xEC, 0x18, 0xE0, 0x49, 0x0A, 0x2E, 0x60, 0x49, 0xCB, 0xFA, 0xE0, 0x4A, 0xEA, 0x10, 0x60, 0x4B, 0xAB, 0xDC, 0xE0, 0x4C, 0xC9, 0xF2, 0x60, -0x4D, 0x94, 0xF9, 0x60, 0x4E, 0xA9, 0xD4, 0x60, 0x4F, 0x74, 0xDB, 0x60, 0x52, 0x69, 0x98, 0x60, -0x53, 0x34, 0x9F, 0x60, 0x54, 0x52, 0xB4, 0xE0, 0x55, 0x14, 0x81, 0x60, 0x56, 0x32, 0x96, 0xE0, -0x56, 0xFD, 0x9D, 0xE0, 0x58, 0x12, 0x78, 0xE0, 0x58, 0xDD, 0x7F, 0xE0, 0x59, 0xF2, 0x5A, 0xE0, -0x5A, 0xBD, 0x61, 0xE0, 0x5B, 0xD2, 0x3C, 0xE0, 0x5C, 0x9D, 0x43, 0xE0, 0x5D, 0xB2, 0x1E, 0xE0, -0x5E, 0x7D, 0x25, 0xE0, 0x5F, 0x9B, 0x3B, 0x60, 0x60, 0x5D, 0x07, 0xE0, 0x61, 0x7B, 0x1D, 0x60, -0x62, 0x46, 0x24, 0x60, 0x63, 0x5A, 0xFF, 0x60, 0x64, 0x26, 0x06, 0x60, 0x65, 0x3A, 0xE1, 0x60, -0x66, 0x05, 0xE8, 0x60, 0x67, 0x1A, 0xC3, 0x60, 0x67, 0xE5, 0xCA, 0x60, 0x69, 0x03, 0xDF, 0xE0, -0x69, 0xC5, 0xAC, 0x60, 0x6A, 0xE3, 0xC1, 0xE0, 0x6B, 0xA5, 0x8E, 0x60, 0x6C, 0xC3, 0xA3, 0xE0, -0x6D, 0x8E, 0xAA, 0xE0, 0x6E, 0xA3, 0x85, 0xE0, 0x6F, 0x6E, 0x8C, 0xE0, 0x70, 0x83, 0x67, 0xE0, -0x71, 0x4E, 0x6E, 0xE0, 0x72, 0x63, 0x49, 0xE0, 0x73, 0x2E, 0x50, 0xE0, 0x74, 0x4C, 0x66, 0x60, -0x75, 0x0E, 0x32, 0xE0, 0x76, 0x2C, 0x48, 0x60, 0x76, 0xF7, 0x4F, 0x60, 0x78, 0x0C, 0x2A, 0x60, -0x78, 0xD7, 0x31, 0x60, 0x79, 0xEC, 0x0C, 0x60, 0x7A, 0xB7, 0x13, 0x60, 0x7B, 0xCB, 0xEE, 0x60, -0x7C, 0x96, 0xF5, 0x60, 0x7D, 0xB5, 0x0A, 0xE0, 0x7E, 0x76, 0xD7, 0x60, 0x7F, 0x94, 0xEC, 0xE0, +0x4D, 0x94, 0xF9, 0x60, 0x4E, 0xA9, 0xD4, 0x60, 0x4F, 0x74, 0xDB, 0x60, 0x50, 0x89, 0xB6, 0x60, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, -0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, -0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, -0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, -0x03, 0x01, 0x03, 0x01, 0x03, 0x00, 0x00, 0x21, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, +0x03, 0x01, 0x03, 0x01, 0x05, 0x00, 0x00, 0x21, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, 0x2A, -0x30, 0x01, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, -0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBA, 0x14, 0xB8, 0x01, 0x49, -0x7C, 0xF5, 0x00, 0x00, 0x00, 0x00, +0x30, 0x01, 0x04, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, +0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBA, 0x14, 0xB8, 0x01, 0x49, 0x7C, 0xF5, 0x00, 0x00, +0x00, 0x00, /* Asia/Anadyr */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -8060,13 +8047,13 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* Asia/Dili */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x54, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x10, 0x92, 0xE6, 0x18, 0xC4, +0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x11, 0x92, 0xE6, 0x18, 0xC4, 0xCB, 0x99, 0x32, 0xF0, 0xD2, 0x56, 0xEE, 0x70, 0x0B, 0xEA, 0x30, 0x70, 0x39, 0xC3, 0x99, 0x00, 0x01, 0x02, 0x03, 0x04, 0x03, 0x00, 0x00, 0x75, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x04, 0x00, 0x00, 0x70, -0x80, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x54, 0x4C, 0x54, 0x00, 0x4A, 0x53, 0x54, 0x00, 0x43, -0x49, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x48, -0x68, 0x01, 0xD2, 0x48, 0x7D, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x54, 0x4C, 0x54, 0x00, 0x4A, 0x53, 0x54, 0x00, 0x57, +0x49, 0x54, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, +0x48, 0x68, 0x01, 0xD2, 0x48, 0x7D, 0x00, 0x00, 0x00, 0x00, /* Asia/Dubai */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x41, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -8122,19 +8109,19 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x45, 0x12, 0xFD, 0x50, 0x46, 0x0E, 0xD9, 0xE0, 0x46, 0xE8, 0x6F, 0x70, 0x47, 0xEC, 0x18, 0xE0, 0x48, 0xB7, 0x11, 0xD0, 0x49, 0xCB, 0xFA, 0xE0, 0x4A, 0xA0, 0x3C, 0x60, 0x4B, 0xAD, 0x2E, 0x9C, 0x4C, 0x61, 0xBD, 0xD0, 0x4D, 0x94, 0xF9, 0x9C, 0x4E, 0x35, 0xC2, 0x50, 0x4F, 0x74, 0xDB, 0x60, -0x50, 0x5B, 0x91, 0xE0, 0x51, 0x54, 0xBD, 0x60, 0x52, 0x44, 0xAE, 0x60, 0x53, 0x34, 0x9F, 0x60, -0x54, 0x24, 0x90, 0x60, 0x55, 0x14, 0x81, 0x60, 0x56, 0x04, 0x72, 0x60, 0x56, 0xFD, 0x9D, 0xE0, -0x57, 0xE4, 0x54, 0x60, 0x58, 0xDD, 0x7F, 0xE0, 0x59, 0xC4, 0x36, 0x60, 0x5A, 0xBD, 0x61, 0xE0, -0x5B, 0xA4, 0x18, 0x60, 0x5C, 0x9D, 0x43, 0xE0, 0x5D, 0x8D, 0x34, 0xE0, 0x5E, 0x7D, 0x25, 0xE0, -0x5F, 0x6D, 0x16, 0xE0, 0x60, 0x5D, 0x07, 0xE0, 0x61, 0x4C, 0xF8, 0xE0, 0x62, 0x46, 0x24, 0x60, -0x63, 0x2C, 0xDA, 0xE0, 0x64, 0x26, 0x06, 0x60, 0x65, 0x0C, 0xBC, 0xE0, 0x66, 0x05, 0xE8, 0x60, -0x66, 0xF5, 0xD9, 0x60, 0x67, 0xE5, 0xCA, 0x60, 0x68, 0xD5, 0xBB, 0x60, 0x69, 0xC5, 0xAC, 0x60, -0x6A, 0xB5, 0x9D, 0x60, 0x6B, 0xA5, 0x8E, 0x60, 0x6C, 0x95, 0x7F, 0x60, 0x6D, 0x8E, 0xAA, 0xE0, -0x6E, 0x75, 0x61, 0x60, 0x6F, 0x6E, 0x8C, 0xE0, 0x70, 0x55, 0x43, 0x60, 0x71, 0x4E, 0x6E, 0xE0, -0x72, 0x3E, 0x5F, 0xE0, 0x73, 0x2E, 0x50, 0xE0, 0x74, 0x1E, 0x41, 0xE0, 0x75, 0x0E, 0x32, 0xE0, -0x75, 0xFE, 0x23, 0xE0, 0x76, 0xF7, 0x4F, 0x60, 0x77, 0xDE, 0x05, 0xE0, 0x78, 0xD7, 0x31, 0x60, -0x79, 0xBD, 0xE7, 0xE0, 0x7A, 0xB7, 0x13, 0x60, 0x7B, 0x9D, 0xC9, 0xE0, 0x7C, 0x96, 0xF5, 0x60, -0x7D, 0x86, 0xE6, 0x60, 0x7E, 0x76, 0xD7, 0x60, 0x7F, 0x66, 0xC8, 0x60, 0x00, 0x01, 0x00, 0x01, +0x50, 0x5B, 0x91, 0xE0, 0x51, 0x54, 0xBD, 0x60, 0x52, 0x44, 0xA0, 0x50, 0x53, 0x34, 0x9F, 0x60, +0x54, 0x24, 0x82, 0x50, 0x55, 0x14, 0x81, 0x60, 0x56, 0x04, 0x64, 0x50, 0x56, 0xFD, 0x9D, 0xE0, +0x57, 0xE4, 0x46, 0x50, 0x58, 0xDD, 0x7F, 0xE0, 0x59, 0xC4, 0x28, 0x50, 0x5A, 0xBD, 0x61, 0xE0, +0x5B, 0xA4, 0x0A, 0x50, 0x5C, 0x9D, 0x43, 0xE0, 0x5D, 0x8D, 0x26, 0xD0, 0x5E, 0x7D, 0x25, 0xE0, +0x5F, 0x6D, 0x08, 0xD0, 0x60, 0x5D, 0x07, 0xE0, 0x61, 0x4C, 0xEA, 0xD0, 0x62, 0x46, 0x24, 0x60, +0x63, 0x2C, 0xCC, 0xD0, 0x64, 0x26, 0x06, 0x60, 0x65, 0x0C, 0xAE, 0xD0, 0x66, 0x05, 0xE8, 0x60, +0x66, 0xF5, 0xCB, 0x50, 0x67, 0xE5, 0xCA, 0x60, 0x68, 0xD5, 0xAD, 0x50, 0x69, 0xC5, 0xAC, 0x60, +0x6A, 0xB5, 0x8F, 0x50, 0x6B, 0xA5, 0x8E, 0x60, 0x6C, 0x95, 0x71, 0x50, 0x6D, 0x8E, 0xAA, 0xE0, +0x6E, 0x75, 0x53, 0x50, 0x6F, 0x6E, 0x8C, 0xE0, 0x70, 0x55, 0x35, 0x50, 0x71, 0x4E, 0x6E, 0xE0, +0x72, 0x3E, 0x51, 0xD0, 0x73, 0x2E, 0x50, 0xE0, 0x74, 0x1E, 0x33, 0xD0, 0x75, 0x0E, 0x32, 0xE0, +0x75, 0xFE, 0x15, 0xD0, 0x76, 0xF7, 0x4F, 0x60, 0x77, 0xDD, 0xF7, 0xD0, 0x78, 0xD7, 0x31, 0x60, +0x79, 0xBD, 0xD9, 0xD0, 0x7A, 0xB7, 0x13, 0x60, 0x7B, 0x9D, 0xBB, 0xD0, 0x7C, 0x96, 0xF5, 0x60, +0x7D, 0x86, 0xD8, 0x50, 0x7E, 0x76, 0xD7, 0x60, 0x7F, 0x66, 0xBA, 0x50, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, @@ -8196,19 +8183,19 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x48, 0xBB, 0x06, 0x50, 0x49, 0xCB, 0xFA, 0xE0, 0x4A, 0xA0, 0x3C, 0x60, 0x4B, 0xAB, 0xDC, 0xE0, 0x4C, 0x61, 0xBD, 0xD0, 0x4D, 0x94, 0xF9, 0x9C, 0x4E, 0x35, 0xC2, 0x50, 0x4E, 0x5C, 0x0B, 0xE0, 0x4E, 0x84, 0xDC, 0x50, 0x4F, 0x74, 0xDB, 0x60, 0x50, 0x5B, 0x91, 0xE0, 0x51, 0x54, 0xBD, 0x60, -0x52, 0x44, 0xAE, 0x60, 0x53, 0x34, 0x9F, 0x60, 0x54, 0x24, 0x90, 0x60, 0x55, 0x14, 0x81, 0x60, -0x56, 0x04, 0x72, 0x60, 0x56, 0xFD, 0x9D, 0xE0, 0x57, 0xE4, 0x54, 0x60, 0x58, 0xDD, 0x7F, 0xE0, -0x59, 0xC4, 0x36, 0x60, 0x5A, 0xBD, 0x61, 0xE0, 0x5B, 0xA4, 0x18, 0x60, 0x5C, 0x9D, 0x43, 0xE0, -0x5D, 0x8D, 0x34, 0xE0, 0x5E, 0x7D, 0x25, 0xE0, 0x5F, 0x6D, 0x16, 0xE0, 0x60, 0x5D, 0x07, 0xE0, -0x61, 0x4C, 0xF8, 0xE0, 0x62, 0x46, 0x24, 0x60, 0x63, 0x2C, 0xDA, 0xE0, 0x64, 0x26, 0x06, 0x60, -0x65, 0x0C, 0xBC, 0xE0, 0x66, 0x05, 0xE8, 0x60, 0x66, 0xF5, 0xD9, 0x60, 0x67, 0xE5, 0xCA, 0x60, -0x68, 0xD5, 0xBB, 0x60, 0x69, 0xC5, 0xAC, 0x60, 0x6A, 0xB5, 0x9D, 0x60, 0x6B, 0xA5, 0x8E, 0x60, -0x6C, 0x95, 0x7F, 0x60, 0x6D, 0x8E, 0xAA, 0xE0, 0x6E, 0x75, 0x61, 0x60, 0x6F, 0x6E, 0x8C, 0xE0, -0x70, 0x55, 0x43, 0x60, 0x71, 0x4E, 0x6E, 0xE0, 0x72, 0x3E, 0x5F, 0xE0, 0x73, 0x2E, 0x50, 0xE0, -0x74, 0x1E, 0x41, 0xE0, 0x75, 0x0E, 0x32, 0xE0, 0x75, 0xFE, 0x23, 0xE0, 0x76, 0xF7, 0x4F, 0x60, -0x77, 0xDE, 0x05, 0xE0, 0x78, 0xD7, 0x31, 0x60, 0x79, 0xBD, 0xE7, 0xE0, 0x7A, 0xB7, 0x13, 0x60, -0x7B, 0x9D, 0xC9, 0xE0, 0x7C, 0x96, 0xF5, 0x60, 0x7D, 0x86, 0xE6, 0x60, 0x7E, 0x76, 0xD7, 0x60, -0x7F, 0x66, 0xC8, 0x60, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x02, 0x01, +0x52, 0x44, 0xA0, 0x50, 0x53, 0x34, 0x9F, 0x60, 0x54, 0x24, 0x82, 0x50, 0x55, 0x14, 0x81, 0x60, +0x56, 0x04, 0x64, 0x50, 0x56, 0xFD, 0x9D, 0xE0, 0x57, 0xE4, 0x46, 0x50, 0x58, 0xDD, 0x7F, 0xE0, +0x59, 0xC4, 0x28, 0x50, 0x5A, 0xBD, 0x61, 0xE0, 0x5B, 0xA4, 0x0A, 0x50, 0x5C, 0x9D, 0x43, 0xE0, +0x5D, 0x8D, 0x26, 0xD0, 0x5E, 0x7D, 0x25, 0xE0, 0x5F, 0x6D, 0x08, 0xD0, 0x60, 0x5D, 0x07, 0xE0, +0x61, 0x4C, 0xEA, 0xD0, 0x62, 0x46, 0x24, 0x60, 0x63, 0x2C, 0xCC, 0xD0, 0x64, 0x26, 0x06, 0x60, +0x65, 0x0C, 0xAE, 0xD0, 0x66, 0x05, 0xE8, 0x60, 0x66, 0xF5, 0xCB, 0x50, 0x67, 0xE5, 0xCA, 0x60, +0x68, 0xD5, 0xAD, 0x50, 0x69, 0xC5, 0xAC, 0x60, 0x6A, 0xB5, 0x8F, 0x50, 0x6B, 0xA5, 0x8E, 0x60, +0x6C, 0x95, 0x71, 0x50, 0x6D, 0x8E, 0xAA, 0xE0, 0x6E, 0x75, 0x53, 0x50, 0x6F, 0x6E, 0x8C, 0xE0, +0x70, 0x55, 0x35, 0x50, 0x71, 0x4E, 0x6E, 0xE0, 0x72, 0x3E, 0x51, 0xD0, 0x73, 0x2E, 0x50, 0xE0, +0x74, 0x1E, 0x33, 0xD0, 0x75, 0x0E, 0x32, 0xE0, 0x75, 0xFE, 0x15, 0xD0, 0x76, 0xF7, 0x4F, 0x60, +0x77, 0xDD, 0xF7, 0xD0, 0x78, 0xD7, 0x31, 0x60, 0x79, 0xBD, 0xD9, 0xD0, 0x7A, 0xB7, 0x13, 0x60, +0x7B, 0x9D, 0xBB, 0xD0, 0x7C, 0x96, 0xF5, 0x60, 0x7D, 0x86, 0xD8, 0x50, 0x7E, 0x76, 0xD7, 0x60, +0x7F, 0x66, 0xBA, 0x50, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x01, 0x02, @@ -8397,7 +8384,7 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0xDA, 0xFF, 0x26, 0x00, 0xF4, 0xB5, 0xBE, 0x88, 0x01, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x00, 0x00, 0x64, 0x20, 0x00, 0x00, 0x00, 0x00, 0x67, 0x20, 0x00, 0x04, 0x00, 0x00, 0x69, 0x78, 0x00, 0x09, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0D, 0x00, 0x00, 0x70, 0x80, 0x00, 0x09, 0x00, 0x00, 0x62, -0x70, 0x00, 0x09, 0x4A, 0x4D, 0x54, 0x00, 0x4A, 0x41, 0x56, 0x54, 0x00, 0x57, 0x49, 0x54, 0x00, +0x70, 0x00, 0x09, 0x42, 0x4D, 0x54, 0x00, 0x4A, 0x41, 0x56, 0x54, 0x00, 0x57, 0x49, 0x42, 0x00, 0x4A, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xEB, 0x65, 0x01, 0xB5, 0x9F, 0x40, 0x00, 0x00, 0x00, 0x0E, 0x4A, 0x61, 0x76, 0x61, 0x20, 0x26, 0x20, 0x53, 0x75, 0x6D, 0x61, 0x74, 0x72, 0x61, @@ -8408,7 +8395,7 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xBA, 0x16, 0xC1, 0x98, 0xD0, 0x58, 0xB9, 0xF0, 0xF4, 0xB5, 0xA2, 0x68, 0x01, 0x02, 0x01, 0x00, 0x00, 0x83, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x04, 0x00, 0x00, 0x85, 0x98, 0x00, 0x08, 0x4C, 0x4D, 0x54, -0x00, 0x45, 0x49, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x57, 0x49, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x76, 0xAA, 0x01, 0xE9, 0x59, 0x70, 0x00, 0x00, 0x00, 0x31, 0x77, 0x65, 0x73, 0x74, 0x20, 0x4E, 0x65, 0x77, 0x20, 0x47, 0x75, 0x69, 0x6E, 0x65, 0x61, 0x20, 0x28, 0x49, 0x72, 0x69, 0x61, 0x6E, 0x20, 0x4A, 0x61, 0x79, 0x61, 0x29, 0x20, 0x26, 0x20, 0x4D, 0x61, 0x6C, 0x75, 0x6B, 0x75, @@ -8754,17 +8741,17 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* Asia/Makassar */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x49, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xA1, 0xF2, 0x5D, 0x90, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0xA1, 0xF2, 0x5D, 0x90, 0xBA, 0x16, 0xD5, 0x90, 0xCB, 0x88, 0x1D, 0x80, 0xD2, 0x56, 0xEE, 0x70, 0x01, 0x02, 0x03, 0x02, 0x00, 0x00, 0x6F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xF0, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, -0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x4D, 0x54, 0x00, -0x43, 0x49, 0x54, 0x00, 0x4A, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x81, 0x85, 0x8D, 0x01, 0xC8, 0xD9, 0x1F, 0x00, 0x00, 0x00, 0x48, 0x65, 0x61, 0x73, 0x74, -0x20, 0x26, 0x20, 0x73, 0x6F, 0x75, 0x74, 0x68, 0x20, 0x42, 0x6F, 0x72, 0x6E, 0x65, 0x6F, 0x2C, -0x20, 0x53, 0x75, 0x6C, 0x61, 0x77, 0x65, 0x73, 0x69, 0x20, 0x28, 0x43, 0x65, 0x6C, 0x65, 0x62, -0x65, 0x73, 0x29, 0x2C, 0x20, 0x42, 0x61, 0x6C, 0x69, 0x2C, 0x20, 0x4E, 0x75, 0x73, 0x61, 0x20, -0x54, 0x65, 0x6E, 0x67, 0x61, 0x72, 0x72, 0x61, 0x2C, 0x20, 0x77, 0x65, 0x73, 0x74, 0x20, 0x54, -0x69, 0x6D, 0x6F, 0x72, +0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x4D, 0x54, 0x00, +0x57, 0x49, 0x54, 0x41, 0x00, 0x4A, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x81, 0x85, 0x8D, 0x01, 0xC8, 0xD9, 0x1F, 0x00, 0x00, 0x00, 0x48, 0x65, 0x61, 0x73, +0x74, 0x20, 0x26, 0x20, 0x73, 0x6F, 0x75, 0x74, 0x68, 0x20, 0x42, 0x6F, 0x72, 0x6E, 0x65, 0x6F, +0x2C, 0x20, 0x53, 0x75, 0x6C, 0x61, 0x77, 0x65, 0x73, 0x69, 0x20, 0x28, 0x43, 0x65, 0x6C, 0x65, +0x62, 0x65, 0x73, 0x29, 0x2C, 0x20, 0x42, 0x61, 0x6C, 0x69, 0x2C, 0x20, 0x4E, 0x75, 0x73, 0x61, +0x20, 0x54, 0x65, 0x6E, 0x67, 0x61, 0x72, 0x72, 0x61, 0x2C, 0x20, 0x77, 0x65, 0x73, 0x74, 0x20, +0x54, 0x69, 0x6D, 0x6F, 0x72, /* Asia/Manila */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x50, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -8980,17 +8967,17 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* Asia/Pontianak */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x49, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0x8B, 0xFF, 0x8E, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x15, 0x8B, 0xFF, 0x8E, 0x00, 0xBA, 0x16, 0xDF, 0x00, 0xCB, 0x79, 0xA4, 0x08, 0xD2, 0x56, 0xEE, 0x70, 0xD7, 0x3C, 0xC6, 0x08, 0xDA, 0xFF, 0x26, 0x00, 0xF4, 0xB5, 0xBE, 0x88, 0x21, 0xDA, 0x74, 0x80, 0x01, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x06, 0x00, 0x00, 0x66, 0x80, 0x00, 0x00, 0x00, 0x00, 0x66, 0x80, 0x00, 0x04, 0x00, 0x00, 0x69, 0x78, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x00, 0x08, 0x00, 0x00, 0x70, 0x80, 0x00, 0x10, 0x00, 0x00, 0x62, 0x70, 0x00, 0x08, 0x4C, 0x4D, -0x54, 0x00, 0x50, 0x4D, 0x54, 0x00, 0x57, 0x49, 0x54, 0x00, 0x4A, 0x53, 0x54, 0x00, 0x43, 0x49, -0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x89, 0x47, 0x3A, 0x01, 0xB9, 0x7C, 0xD5, 0x00, 0x00, 0x00, 0x15, 0x77, 0x65, 0x73, 0x74, -0x20, 0x26, 0x20, 0x63, 0x65, 0x6E, 0x74, 0x72, 0x61, 0x6C, 0x20, 0x42, 0x6F, 0x72, 0x6E, 0x65, -0x6F, +0x54, 0x00, 0x50, 0x4D, 0x54, 0x00, 0x57, 0x49, 0x42, 0x00, 0x4A, 0x53, 0x54, 0x00, 0x57, 0x49, +0x54, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x89, 0x47, 0x3A, 0x01, 0xB9, 0x7C, 0xD5, 0x00, 0x00, 0x00, 0x15, 0x77, 0x65, 0x73, +0x74, 0x20, 0x26, 0x20, 0x63, 0x65, 0x6E, 0x74, 0x72, 0x61, 0x6C, 0x20, 0x42, 0x6F, 0x72, 0x6E, +0x65, 0x6F, /* Asia/Pyongyang */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -9368,12 +9355,12 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* Asia/Ujung_Pandang */ 0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xA1, 0xF2, 0x5D, 0x90, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0xA1, 0xF2, 0x5D, 0x90, 0xBA, 0x16, 0xD5, 0x90, 0xCB, 0x88, 0x1D, 0x80, 0xD2, 0x56, 0xEE, 0x70, 0x01, 0x02, 0x03, 0x02, 0x00, 0x00, 0x6F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xF0, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, -0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x4D, 0x54, 0x00, -0x43, 0x49, 0x54, 0x00, 0x4A, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x4D, 0x54, 0x00, +0x57, 0x49, 0x54, 0x41, 0x00, 0x4A, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, /* Asia/Ulaanbaatar */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4D, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -15346,8 +15333,9 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* Europe/Vaduz */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4C, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x09, 0x15, 0x23, 0xEB, 0x90, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x09, 0xCA, 0x17, 0x6A, 0x00, +0xCA, 0xE2, 0x71, 0x00, 0xCB, 0xF7, 0x4C, 0x00, 0xCC, 0xC2, 0x53, 0x00, 0x15, 0x23, 0xEB, 0x90, 0x16, 0x13, 0xDC, 0x90, 0x17, 0x03, 0xCD, 0x90, 0x17, 0xF3, 0xBE, 0x90, 0x18, 0xE3, 0xAF, 0x90, 0x19, 0xD3, 0xA0, 0x90, 0x1A, 0xC3, 0x91, 0x90, 0x1B, 0xBC, 0xBD, 0x10, 0x1C, 0xAC, 0xAE, 0x10, 0x1D, 0x9C, 0x9F, 0x10, 0x1E, 0x8C, 0x90, 0x10, 0x1F, 0x7C, 0x81, 0x10, 0x20, 0x6C, 0x72, 0x10, @@ -15376,17 +15364,17 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x74, 0x45, 0xF9, 0x10, 0x75, 0x11, 0x00, 0x10, 0x76, 0x2F, 0x15, 0x90, 0x76, 0xF0, 0xE2, 0x10, 0x78, 0x0E, 0xF7, 0x90, 0x78, 0xD0, 0xC4, 0x10, 0x79, 0xEE, 0xD9, 0x90, 0x7A, 0xB0, 0xA6, 0x10, 0x7B, 0xCE, 0xBB, 0x90, 0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, 0x7E, 0x79, 0xA4, 0x90, -0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, -0x01, 0x04, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, -0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0xD1, 0x46, 0x38, 0x01, 0x21, 0x2D, 0xF2, 0x00, -0x00, 0x00, 0x00, +0x7F, 0x8E, 0x7F, 0x90, 0x00, 0x01, 0x00, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x00, +0x00, 0x00, 0x0E, 0x10, 0x00, 0x05, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x10, +0x00, 0x05, 0x43, 0x45, 0x53, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, +0x00, 0x01, 0x01, 0x00, 0xD1, 0x46, 0x38, 0x01, 0x21, 0x2D, 0xF2, 0x00, 0x00, 0x00, 0x00, /* Europe/Vatican */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x56, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -16278,14 +16266,14 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* Jamaica */ 0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x93, 0x0F, 0xB5, 0x00, +0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x93, 0x0F, 0xB4, 0xFF, 0x08, 0x20, 0xC1, 0x70, 0x09, 0x10, 0xA4, 0x60, 0x09, 0xAD, 0x94, 0xF0, 0x0A, 0xF0, 0x86, 0x60, 0x0B, 0xE0, 0x85, 0x70, 0x0C, 0xD9, 0xA2, 0xE0, 0x0D, 0xC0, 0x67, 0x70, 0x0E, 0xB9, 0x84, 0xE0, 0x0F, 0xA9, 0x83, 0xF0, 0x10, 0x99, 0x66, 0xE0, 0x11, 0x89, 0x65, 0xF0, 0x12, 0x79, 0x48, 0xE0, 0x13, 0x69, 0x47, 0xF0, 0x14, 0x59, 0x2A, 0xE0, 0x15, 0x49, 0x29, 0xF0, 0x16, 0x39, 0x0C, 0xE0, 0x17, 0x29, 0x0B, 0xF0, 0x18, 0x22, 0x29, 0x60, 0x19, 0x08, 0xED, 0xF0, 0x1A, 0x02, 0x0B, 0x60, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0xFF, 0xFF, 0xB8, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, +0x01, 0x02, 0x01, 0x02, 0x01, 0xFF, 0xFF, 0xB8, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x08, 0x4B, 0x4D, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x45, 0x44, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, @@ -16999,19 +16987,19 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x36, 0x3B, 0x17, 0xE0, 0x36, 0xD7, 0xFA, 0x60, 0x38, 0x24, 0x34, 0x60, 0x38, 0xB7, 0xDC, 0x60, 0x4B, 0x11, 0x2C, 0xE0, 0x4B, 0xAE, 0x0F, 0x60, 0x4C, 0xC2, 0xEA, 0x60, 0x4D, 0x72, 0x41, 0xE0, 0x4E, 0xA2, 0xCC, 0x60, 0x4F, 0x1A, 0xC4, 0xE0, 0x50, 0x82, 0xAE, 0x60, 0x50, 0xFA, 0xA6, 0xE0, -0x52, 0x62, 0x90, 0x60, 0x52, 0xDA, 0x88, 0xE0, 0x54, 0x42, 0x72, 0x60, 0x54, 0xBA, 0x6A, 0xE0, -0x56, 0x22, 0x54, 0x60, 0x56, 0xA3, 0x87, 0x60, 0x58, 0x0B, 0x70, 0xE0, 0x58, 0x83, 0x69, 0x60, +0x52, 0x6B, 0xCA, 0xE0, 0x52, 0xDA, 0x88, 0xE0, 0x54, 0x4B, 0xAC, 0xE0, 0x54, 0xBA, 0x6A, 0xE0, +0x56, 0x2B, 0x8E, 0xE0, 0x56, 0xA3, 0x87, 0x60, 0x58, 0x0B, 0x70, 0xE0, 0x58, 0x83, 0x69, 0x60, 0x59, 0xEB, 0x52, 0xE0, 0x5A, 0x63, 0x4B, 0x60, 0x5B, 0xCB, 0x34, 0xE0, 0x5C, 0x43, 0x2D, 0x60, -0x5D, 0xAB, 0x16, 0xE0, 0x5E, 0x23, 0x0F, 0x60, 0x5F, 0x8A, 0xF8, 0xE0, 0x60, 0x0C, 0x2B, 0xE0, +0x5D, 0xB4, 0x51, 0x60, 0x5E, 0x23, 0x0F, 0x60, 0x5F, 0x94, 0x33, 0x60, 0x60, 0x0C, 0x2B, 0xE0, 0x61, 0x74, 0x15, 0x60, 0x61, 0xEC, 0x0D, 0xE0, 0x63, 0x53, 0xF7, 0x60, 0x63, 0xCB, 0xEF, 0xE0, -0x65, 0x33, 0xD9, 0x60, 0x65, 0xAB, 0xD1, 0xE0, 0x67, 0x13, 0xBB, 0x60, 0x67, 0x8B, 0xB3, 0xE0, -0x68, 0xF3, 0x9D, 0x60, 0x69, 0x6B, 0x95, 0xE0, 0x6A, 0xD3, 0x7F, 0x60, 0x6B, 0x54, 0xB2, 0x60, +0x65, 0x33, 0xD9, 0x60, 0x65, 0xAB, 0xD1, 0xE0, 0x67, 0x1C, 0xF5, 0xE0, 0x67, 0x8B, 0xB3, 0xE0, +0x68, 0xFC, 0xD7, 0xE0, 0x69, 0x6B, 0x95, 0xE0, 0x6A, 0xDC, 0xB9, 0xE0, 0x6B, 0x54, 0xB2, 0x60, 0x6C, 0xBC, 0x9B, 0xE0, 0x6D, 0x34, 0x94, 0x60, 0x6E, 0x9C, 0x7D, 0xE0, 0x6F, 0x14, 0x76, 0x60, -0x70, 0x7C, 0x5F, 0xE0, 0x70, 0xF4, 0x58, 0x60, 0x72, 0x5C, 0x41, 0xE0, 0x72, 0xD4, 0x3A, 0x60, -0x74, 0x3C, 0x23, 0xE0, 0x74, 0xB4, 0x1C, 0x60, 0x76, 0x25, 0x40, 0x60, 0x76, 0x9D, 0x38, 0xE0, +0x70, 0x7C, 0x5F, 0xE0, 0x70, 0xF4, 0x58, 0x60, 0x72, 0x65, 0x7C, 0x60, 0x72, 0xD4, 0x3A, 0x60, +0x74, 0x45, 0x5E, 0x60, 0x74, 0xB4, 0x1C, 0x60, 0x76, 0x25, 0x40, 0x60, 0x76, 0x9D, 0x38, 0xE0, 0x78, 0x05, 0x22, 0x60, 0x78, 0x7D, 0x1A, 0xE0, 0x79, 0xE5, 0x04, 0x60, 0x7A, 0x5C, 0xFC, 0xE0, -0x7B, 0xC4, 0xE6, 0x60, 0x7C, 0x3C, 0xDE, 0xE0, 0x7D, 0xA4, 0xC8, 0x60, 0x7E, 0x1C, 0xC0, 0xE0, -0x7F, 0x84, 0xAA, 0x60, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x7B, 0xC4, 0xE6, 0x60, 0x7C, 0x3C, 0xDE, 0xE0, 0x7D, 0xAE, 0x02, 0xE0, 0x7E, 0x1C, 0xC0, 0xE0, +0x7F, 0x8D, 0xE4, 0xE0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, @@ -17074,11 +17062,13 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { /* Pacific/Johnston */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x55, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0x73, 0x60, -0x00, 0x00, 0x48, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0xA2, 0xE3, 0x38, 0x00, 0x0F, 0xFF, 0x0D, -0x00, 0x00, 0x00, 0x0E, 0x4A, 0x6F, 0x68, 0x6E, 0x73, 0x74, 0x6F, 0x6E, 0x20, 0x41, 0x74, 0x6F, -0x6C, 0x6C, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0xBB, 0x05, 0x43, 0x48, +0xBB, 0x21, 0x71, 0x58, 0xCB, 0x89, 0x3D, 0xC8, 0xD2, 0x61, 0x49, 0x38, 0xD5, 0x8D, 0x73, 0x48, +0x01, 0x00, 0x01, 0x00, 0x02, 0xFF, 0xFF, 0x6C, 0x58, 0x00, 0x00, 0xFF, 0xFF, 0x7A, 0x68, 0x01, +0x04, 0xFF, 0xFF, 0x73, 0x60, 0x00, 0x00, 0x48, 0x53, 0x54, 0x00, 0x48, 0x44, 0x54, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA2, 0xE3, 0x38, 0x00, 0x0F, 0xFF, 0x0D, 0x00, 0x00, 0x00, +0x0E, 0x4A, 0x6F, 0x68, 0x6E, 0x73, 0x74, 0x6F, 0x6E, 0x20, 0x41, 0x74, 0x6F, 0x6C, 0x6C, /* Pacific/Kiritimati */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4B, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -18410,4 +18400,4 @@ const unsigned char timelib_timezone_db_data_builtin[261525] = { 0x00, 0x00, 0x55, 0x54, 0x43, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, }; -const timelib_tzdb timezonedb_builtin = { "2013.4", 579, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; +const timelib_tzdb timezonedb_builtin = { "2013.6", 579, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; From f90483001236c863abe1070d05ee2214db5a0a97 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 27 Sep 2013 13:43:25 +0400 Subject: [PATCH 171/400] Added support for GNU Hurd. (Svante Signell) --- NEWS | 1 + ext/opcache/ZendAccelerator.h | 11 +++++- ext/opcache/config.m4 | 70 ++++++++++++++++++----------------- sapi/cgi/cgi_main.c | 27 +++++++++++--- 4 files changed, 69 insertions(+), 40 deletions(-) diff --git a/NEWS b/NEWS index bdc0cd5fb6532..c03d31905676c 100644 --- a/NEWS +++ b/NEWS @@ -26,6 +26,7 @@ PHP NEWS imap). (ryotakatsuki at gmail dot com) - OPcache: + . Added support for GNU Hurd. (Svante Signell) . Added function opcache_compile_file() to load PHP scripts into cache without execution. (Julien) . Fixed bug #65665 (Exception not properly caught when opcache enabled). diff --git a/ext/opcache/ZendAccelerator.h b/ext/opcache/ZendAccelerator.h index f223f126e43a8..b9d7ef34704d8 100644 --- a/ext/opcache/ZendAccelerator.h +++ b/ext/opcache/ZendAccelerator.h @@ -80,6 +80,9 @@ # endif # include #else +# ifndef MAXPATHLEN +# define MAXPATHLEN 4096 +# endif # include #endif @@ -100,7 +103,7 @@ extern int lock_file; # elif defined(__svr4__) # define FLOCK_STRUCTURE(name, type, whence, start, len) \ struct flock name = {type, whence, start, len} -# elif defined(__linux__) || defined(__hpux) +# elif defined(__linux__) || defined(__hpux) || defined(__GNU__) # define FLOCK_STRUCTURE(name, type, whence, start, len) \ struct flock name = {type, whence, start, len, 0} # elif defined(_AIX) @@ -111,6 +114,12 @@ extern int lock_file; # define FLOCK_STRUCTURE(name, type, whence, start, len) \ struct flock name = {type, whence, start, len} # endif +# elif defined(HAVE_FLOCK_BSD) +# define FLOCK_STRUCTURE(name, type, whence, start, len) \ + struct flock name = {start, len, -1, type, whence} +# elif defined(HAVE_FLOCK_LINUX) +# define FLOCK_STRUCTURE(name, type, whence, start, len) \ + struct flock name = {type, whence, start, len} # else # error "Don't know how to define struct flock" # endif diff --git a/ext/opcache/config.m4 b/ext/opcache/config.m4 index 1798fe13fa80d..60edeed966b36 100644 --- a/ext/opcache/config.m4 +++ b/ext/opcache/config.m4 @@ -326,40 +326,42 @@ int main() { msg=yes,msg=no,msg=no) AC_MSG_RESULT([$msg]) - AC_MSG_CHECKING(for known struct flock definition) - dnl Copied from ZendAccelerator.h - AC_TRY_RUN([ -#include -#include - -#ifndef ZEND_WIN32 -extern int lock_file; - -# if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || (defined(__APPLE__) && defined(__MACH__)/* Darwin */) || defined(__OpenBSD__) || defined(__NetBSD__) -# define FLOCK_STRUCTURE(name, type, whence, start, len) \ - struct flock name = {start, len, -1, type, whence} -# elif defined(__svr4__) -# define FLOCK_STRUCTURE(name, type, whence, start, len) \ - struct flock name = {type, whence, start, len} -# elif defined(__linux__) || defined(__hpux) -# define FLOCK_STRUCTURE(name, type, whence, start, len) \ - struct flock name = {type, whence, start, len, 0} -# elif defined(_AIX) -# if defined(_LARGE_FILES) || defined(__64BIT__) -# define FLOCK_STRUCTURE(name, type, whence, start, len) \ - struct flock name = {type, whence, 0, 0, 0, start, len } -# else -# define FLOCK_STRUCTURE(name, type, whence, start, len) \ - struct flock name = {type, whence, start, len} -# endif -# else -# error "Don't know how to define struct flock" -# endif -#endif -int main() { return 0; } -], -[AC_MSG_RESULT([done])], -[AC_MSG_ERROR([Don't know how to define struct flock on this system[,] set --enable-opcache=no])], []) +flock_type=unknown +AC_MSG_CHECKING("whether flock struct is linux ordered") +AC_TRY_RUN([ + #include + struct flock lock = { 1, 2, 3, 4, 5 }; + int main() { + if(lock.l_type == 1 && lock.l_whence == 2 && lock.l_start == 3 && lock.l_len == 4) { + return 0; + } + return 1; + } +], [ + flock_type=linux + AC_DEFINE([HAVE_FLOCK_LINUX], [], [Struct flock is Linux-type]) + AC_MSG_RESULT("yes") +], AC_MSG_RESULT("no") ) + +AC_MSG_CHECKING("whether flock struct is BSD ordered") +AC_TRY_RUN([ + #include + struct flock lock = { 1, 2, 3, 4, 5 }; + int main() { + if(lock.l_start == 1 && lock.l_len == 2 && lock.l_type == 4 && lock.l_whence == 5) { + return 0; + } + return 1; + } +], [ + flock_type=bsd + AC_DEFINE([HAVE_FLOCK_BSD], [], [Struct flock is BSD-type]) + AC_MSG_RESULT("yes") +], AC_MSG_RESULT("no") ) + +if test "$flock_type" == "unknown"; then + AC_MSG_ERROR([Don't know how to define struct flock on this system[,] set --enable-opcache=no]) +fi PHP_NEW_EXTENSION(opcache, ZendAccelerator.c \ diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c index 4c78fcafec08f..4f3d5040e1b8c 100644 --- a/sapi/cgi/cgi_main.c +++ b/sapi/cgi/cgi_main.c @@ -154,6 +154,7 @@ static const opt_struct OPTIONS[] = { {'?', 0, "usage"},/* help alias (both '?' and 'usage') */ {'v', 0, "version"}, {'z', 1, "zend-extension"}, + {'W', 1, "warmup"}, {'T', 1, "timing"}, {'-', 0, NULL} /* end of args */ }; @@ -1754,6 +1755,7 @@ int main(int argc, char *argv[]) int fcgi_fd = 0; fcgi_request *request = NULL; int repeats = 1; + int warmup_repeats = 0; int benchmark = 0; #if HAVE_GETTIMEOFDAY struct timeval start, end; @@ -2103,6 +2105,9 @@ consult the installation file that came with this distribution, or visit \n\ time(&start); #endif break; + case 'W': + warmup_repeats = atoi(php_optarg); + break; case 'h': case '?': if (request) { @@ -2516,12 +2521,24 @@ consult the installation file that came with this distribution, or visit \n\ if (!fastcgi) { if (benchmark) { - repeats--; - if (repeats > 0) { - script_file = NULL; - php_optind = orig_optind; - php_optarg = orig_optarg; + if (warmup_repeats) { + warmup_repeats--; + if (!warmup_repeats) { +#ifdef HAVE_GETTIMEOFDAY + gettimeofday(&start, NULL); +#else + time(&start); +#endif + } continue; + } else { + repeats--; + if (repeats > 0) { + script_file = NULL; + php_optind = orig_optind; + php_optarg = orig_optarg; + continue; + } } } break; From 80346690ba0a13f8a2a924671aaed55f824839c3 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 27 Sep 2013 14:01:07 +0400 Subject: [PATCH 172/400] Removed references to "Zend Support" --- ext/opcache/zend_accelerator_util_funcs.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ext/opcache/zend_accelerator_util_funcs.c b/ext/opcache/zend_accelerator_util_funcs.c index 39b4c1fc2558b..894da63aaa48e 100644 --- a/ext/opcache/zend_accelerator_util_funcs.c +++ b/ext/opcache/zend_accelerator_util_funcs.c @@ -478,7 +478,7 @@ static void zend_hash_clone_methods(HashTable *ht, HashTable *source, zend_class if (accel_xlat_get(new_entry->scope, new_ce) == SUCCESS) { new_entry->scope = *new_ce; } else { - zend_error(E_ERROR, ACCELERATOR_PRODUCT_NAME " class loading error, class %s, function %s. Please call Zend Support", ce->name, new_entry->function_name); + zend_error(E_ERROR, ACCELERATOR_PRODUCT_NAME " class loading error, class %s, function %s", ce->name, new_entry->function_name); } } @@ -487,7 +487,7 @@ static void zend_hash_clone_methods(HashTable *ht, HashTable *source, zend_class if (accel_xlat_get(new_entry->prototype, new_prototype) == SUCCESS) { new_entry->prototype = *new_prototype; } else { - zend_error(E_ERROR, ACCELERATOR_PRODUCT_NAME " class loading error, class %s, function %s. Please call Zend Support", ce->name, new_entry->function_name); + zend_error(E_ERROR, ACCELERATOR_PRODUCT_NAME " class loading error, class %s, function %s", ce->name, new_entry->function_name); } } @@ -589,7 +589,7 @@ static void zend_hash_clone_prop_info(HashTable *ht, HashTable *source, zend_cla } else if (accel_xlat_get(prop_info->ce, new_ce) == SUCCESS) { prop_info->ce = *new_ce; } else { - zend_error(E_ERROR, ACCELERATOR_PRODUCT_NAME" class loading error, class %s, property %s. Please call Zend Support", ce->name, prop_info->name); + zend_error(E_ERROR, ACCELERATOR_PRODUCT_NAME" class loading error, class %s, property %s", ce->name, prop_info->name); } p = p->pListNext; @@ -621,7 +621,7 @@ static int zend_prepare_function_for_execution(zend_op_array *op_array) if (accel_xlat_get(ce->handler, new_func) == SUCCESS) { \ ce->handler = *new_func; \ } else { \ - zend_error(E_ERROR, ACCELERATOR_PRODUCT_NAME " class loading error, class %s. Please call Zend Support", ce->name); \ + zend_error(E_ERROR, ACCELERATOR_PRODUCT_NAME " class loading error, class %s", ce->name); \ } \ } \ } @@ -710,7 +710,7 @@ static void zend_class_copy_ctor(zend_class_entry **pce) if (accel_xlat_get(ce->parent, new_ce) == SUCCESS) { ce->parent = *new_ce; } else { - zend_error(E_ERROR, ACCELERATOR_PRODUCT_NAME" class loading error, class %s. Please call Zend Support", ce->name); + zend_error(E_ERROR, ACCELERATOR_PRODUCT_NAME" class loading error, class %s", ce->name); } } From 0ad0a2f56ea5f9822297fec8e2816751b9a4f653 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Fri, 27 Sep 2013 17:46:14 +0200 Subject: [PATCH 173/400] Add information about which INI file is which inside respective files --- php.ini-development | 2 ++ php.ini-production | 2 ++ 2 files changed, 4 insertions(+) diff --git a/php.ini-development b/php.ini-development index ba20bd3fb87e5..b935f22eb5aba 100644 --- a/php.ini-development +++ b/php.ini-development @@ -83,6 +83,8 @@ ; 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 ; ;;;;;;;;;;;;;;;;;;; diff --git a/php.ini-production b/php.ini-production index db48a8fbc85f4..4ee7ac92ce0bc 100644 --- a/php.ini-production +++ b/php.ini-production @@ -83,6 +83,8 @@ ; 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 ; ;;;;;;;;;;;;;;;;;;; From a88c7be88b57162eb0a89ff1b7c2ef60ac1de935 Mon Sep 17 00:00:00 2001 From: datibbaw Date: Thu, 21 Feb 2013 14:42:28 +0800 Subject: [PATCH 174/400] added use_keys argument to array_filter() --- ext/standard/array.c | 39 +++++++++-- .../tests/array/array_filter_error.phpt | 4 +- .../tests/array/array_filter_variation10.phpt | 70 +++++++++++++++++++ 3 files changed, 107 insertions(+), 6 deletions(-) create mode 100644 ext/standard/tests/array/array_filter_variation10.phpt diff --git a/ext/standard/array.c b/ext/standard/array.c index ae6e5d266fa29..1f98ef16f2093 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -4194,9 +4194,11 @@ PHP_FUNCTION(array_filter) { zval *array; zval **operand; - zval **args[1]; + zval **args[2]; zval *retval = NULL; + zval *key = NULL; zend_bool have_callback = 0; + zend_bool use_key = 0; char *string_key; zend_fcall_info fci = empty_fcall_info; zend_fcall_info_cache fci_cache = empty_fcall_info_cache; @@ -4204,7 +4206,7 @@ PHP_FUNCTION(array_filter) ulong num_key; HashPosition pos; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|f", &array, &fci, &fci_cache) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|fb", &array, &fci, &fci_cache, &use_key) == FAILURE) { return; } @@ -4217,23 +4219,52 @@ PHP_FUNCTION(array_filter) have_callback = 1; fci.no_separation = 0; fci.retval_ptr_ptr = &retval; - fci.param_count = 1; + + if (use_key) { + fci.param_count = 2; + args[1] = &key; + } else { + fci.param_count = 1; + } } for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(array), &pos); zend_hash_get_current_data_ex(Z_ARRVAL_P(array), (void **)&operand, &pos) == SUCCESS; zend_hash_move_forward_ex(Z_ARRVAL_P(array), &pos) ) { + int key_type = zend_hash_get_current_key_ex(Z_ARRVAL_P(array), &string_key, &string_key_len, &num_key, 0, &pos); + if (have_callback) { + if (use_key) { + MAKE_STD_ZVAL(key); + /* Set up the key */ + switch (key_type) { + case HASH_KEY_IS_LONG: + Z_TYPE_P(key) = IS_LONG; + Z_LVAL_P(key) = num_key; + break; + + case HASH_KEY_IS_STRING: + ZVAL_STRINGL(key, string_key, string_key_len - 1, 1); + break; + } + } + args[0] = operand; fci.params = args; if (zend_call_function(&fci, &fci_cache TSRMLS_CC) == SUCCESS && retval) { if (!zend_is_true(retval)) { zval_ptr_dtor(&retval); + if (use_key) { + zval_ptr_dtor(&key); + } continue; } else { zval_ptr_dtor(&retval); + if (use_key) { + zval_ptr_dtor(&key); + } } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "An error occurred while invoking the filter callback"); @@ -4244,7 +4275,7 @@ PHP_FUNCTION(array_filter) } zval_add_ref(operand); - switch (zend_hash_get_current_key_ex(Z_ARRVAL_P(array), &string_key, &string_key_len, &num_key, 0, &pos)) { + switch (key_type) { case HASH_KEY_IS_STRING: zend_hash_update(Z_ARRVAL_P(return_value), string_key, string_key_len, operand, sizeof(zval *), NULL); break; diff --git a/ext/standard/tests/array/array_filter_error.phpt b/ext/standard/tests/array/array_filter_error.phpt index 20e89aa4b776e..3f8f51bc14a5b 100644 --- a/ext/standard/tests/array/array_filter_error.phpt +++ b/ext/standard/tests/array/array_filter_error.phpt @@ -28,7 +28,7 @@ $extra_arg = 10; // with one more than the expected number of arguments echo "-- Testing array_filter() function with more than expected no. of arguments --"; -var_dump( array_filter($input, "odd", $extra_arg) ); +var_dump( array_filter($input, "odd", $extra_arg, $extra_arg) ); // with incorrect callback function echo "-- Testing array_filter() function with incorrect callback --"; @@ -42,7 +42,7 @@ echo "Done" Warning: array_filter() expects at least 1 parameter, 0 given in %s on line %d NULL -- Testing array_filter() function with more than expected no. of arguments -- -Warning: array_filter() expects at most 2 parameters, 3 given in %s on line %d +Warning: array_filter() expects at most 3 parameters, 4 given in %s on line %d NULL -- Testing array_filter() function with incorrect callback -- Warning: array_filter() expects parameter 2 to be a valid callback, function 'even' not found or invalid function name in %s on line %d diff --git a/ext/standard/tests/array/array_filter_variation10.phpt b/ext/standard/tests/array/array_filter_variation10.phpt new file mode 100644 index 0000000000000..9a5b2a4a302ff --- /dev/null +++ b/ext/standard/tests/array/array_filter_variation10.phpt @@ -0,0 +1,70 @@ +--TEST-- +Test array_filter() function : usage variations - using the array keys inside 'callback' +--FILE-- + 4; +} + +var_dump( array_filter($input, 'dump2', true) ); + +echo "*** Testing array_filter() : usage variations - 'callback' expecting second argument ***\n"; + +var_dump( array_filter($small, 'dump', false) ); + +echo "Done" +?> +--EXPECTF-- +*** Testing array_filter() : usage variations - using array keys in 'callback' *** +0 = 0 +1 = 1 +2 = -1 +3 = 10 +4 = 100 +5 = 1000 +6 = Hello +7 = +array(0) { +} +*** Testing array_filter() : usage variations - 'callback' filters based on key value *** +array(3) { + [5]=> + int(1000) + [6]=> + string(5) "Hello" + [7]=> + NULL +} +*** Testing array_filter() : usage variations - 'callback' expecting second argument *** + +Warning: Missing argument 2 for dump() in /home/tjerk/work/php/php-src/ext/standard/tests/array/array_filter_variation10.php on line %d + +Notice: Undefined variable: key in /home/tjerk/work/php/php-src/ext/standard/tests/array/array_filter_variation10.php on line %d + = 123 +array(0) { +} +Done From 6442e49b22da6dfab8ebcef1a4cf568250b1ee96 Mon Sep 17 00:00:00 2001 From: datibbaw Date: Thu, 21 Feb 2013 16:35:48 +0800 Subject: [PATCH 175/400] forgot introspection changes --- ext/standard/basic_functions.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 3e5084e837642..cb57d755b21af 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -595,6 +595,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_array_filter, 0, 0, 1) ZEND_ARG_INFO(0, arg) /* ARRAY_INFO(0, arg, 0) */ ZEND_ARG_INFO(0, callback) + ZEND_ARG_INFO(0, use_keys) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_array_map, 0, 0, 2) From b8653d34579409131b8dc6d92e7ac30e28fa95a6 Mon Sep 17 00:00:00 2001 From: Tjerk Anne Meesters Date: Wed, 27 Feb 2013 21:20:28 +0800 Subject: [PATCH 176/400] fixed test case to pass on other systems than my own --- ext/standard/tests/array/array_filter_variation10.phpt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/standard/tests/array/array_filter_variation10.phpt b/ext/standard/tests/array/array_filter_variation10.phpt index 9a5b2a4a302ff..1eec4591a1fea 100644 --- a/ext/standard/tests/array/array_filter_variation10.phpt +++ b/ext/standard/tests/array/array_filter_variation10.phpt @@ -61,9 +61,9 @@ array(3) { } *** Testing array_filter() : usage variations - 'callback' expecting second argument *** -Warning: Missing argument 2 for dump() in /home/tjerk/work/php/php-src/ext/standard/tests/array/array_filter_variation10.php on line %d +Warning: Missing argument 2 for dump() in %s on line %d -Notice: Undefined variable: key in /home/tjerk/work/php/php-src/ext/standard/tests/array/array_filter_variation10.php on line %d +Notice: Undefined variable: key in %s on line %d = 123 array(0) { } From 0492145e58bda8fed9f64992a9b8d054d9c80758 Mon Sep 17 00:00:00 2001 From: datibbaw Date: Thu, 26 Sep 2013 11:10:24 +0800 Subject: [PATCH 177/400] added bitmask variation --- ext/standard/array.c | 36 +++++++++++-------- ext/standard/php_array.h | 4 +++ .../tests/array/array_filter_variation10.phpt | 35 +++++++++++++++++- 3 files changed, 59 insertions(+), 16 deletions(-) diff --git a/ext/standard/array.c b/ext/standard/array.c index 1f98ef16f2093..13148ec6f0084 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -127,6 +127,10 @@ PHP_MINIT_FUNCTION(array) /* {{{ */ REGISTER_LONG_CONSTANT("COUNT_NORMAL", COUNT_NORMAL, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("COUNT_RECURSIVE", COUNT_RECURSIVE, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("ARRAY_FILTER_USE_BOTH", ARRAY_FILTER_USE_BOTH, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("ARRAY_FILTER_USE_KEY", ARRAY_FILTER_USE_KEY, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("ARRAY_FILTER_USE_VALUE", ARRAY_FILTER_USE_VALUE, CONST_CS | CONST_PERSISTENT); + return SUCCESS; } /* }}} */ @@ -4198,7 +4202,7 @@ PHP_FUNCTION(array_filter) zval *retval = NULL; zval *key = NULL; zend_bool have_callback = 0; - zend_bool use_key = 0; + long use_type = ARRAY_FILTER_USE_VALUE; char *string_key; zend_fcall_info fci = empty_fcall_info; zend_fcall_info_cache fci_cache = empty_fcall_info_cache; @@ -4206,7 +4210,7 @@ PHP_FUNCTION(array_filter) ulong num_key; HashPosition pos; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|fb", &array, &fci, &fci_cache, &use_key) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|fl", &array, &fci, &fci_cache, &use_type) == FAILURE) { return; } @@ -4220,11 +4224,14 @@ PHP_FUNCTION(array_filter) fci.no_separation = 0; fci.retval_ptr_ptr = &retval; - if (use_key) { + if (use_type == ARRAY_FILTER_USE_BOTH) { fci.param_count = 2; args[1] = &key; } else { fci.param_count = 1; + if (use_type == ARRAY_FILTER_USE_KEY) { + args[0] = &key; + } } } @@ -4235,7 +4242,7 @@ PHP_FUNCTION(array_filter) int key_type = zend_hash_get_current_key_ex(Z_ARRVAL_P(array), &string_key, &string_key_len, &num_key, 0, &pos); if (have_callback) { - if (use_key) { + if (use_type != ARRAY_FILTER_USE_VALUE) { MAKE_STD_ZVAL(key); /* Set up the key */ switch (key_type) { @@ -4250,21 +4257,20 @@ PHP_FUNCTION(array_filter) } } - args[0] = operand; + if (use_type != ARRAY_FILTER_USE_KEY) { + args[0] = operand; + } fci.params = args; if (zend_call_function(&fci, &fci_cache TSRMLS_CC) == SUCCESS && retval) { - if (!zend_is_true(retval)) { - zval_ptr_dtor(&retval); - if (use_key) { - zval_ptr_dtor(&key); - } + int retval_true = zend_is_true(retval); + + zval_ptr_dtor(&retval); + if (use_type != ARRAY_FILTER_USE_VALUE) { + zval_ptr_dtor(&key); + } + if (!retval_true) { continue; - } else { - zval_ptr_dtor(&retval); - if (use_key) { - zval_ptr_dtor(&key); - } } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "An error occurred while invoking the filter callback"); diff --git a/ext/standard/php_array.h b/ext/standard/php_array.h index 1cf27790718d7..7d9733d2964f2 100644 --- a/ext/standard/php_array.h +++ b/ext/standard/php_array.h @@ -117,6 +117,10 @@ PHPAPI int php_multisort_compare(const void *a, const void *b TSRMLS_DC); #define PHP_SORT_NATURAL 6 #define PHP_SORT_FLAG_CASE 8 +#define ARRAY_FILTER_USE_BOTH 1 +#define ARRAY_FILTER_USE_KEY 2 +#define ARRAY_FILTER_USE_VALUE 3 + ZEND_BEGIN_MODULE_GLOBALS(array) int *multisort_flags[2]; int (*compare_func)(zval *result, zval *op1, zval *op2 TSRMLS_DC); diff --git a/ext/standard/tests/array/array_filter_variation10.phpt b/ext/standard/tests/array/array_filter_variation10.phpt index 1eec4591a1fea..25698c55c2f69 100644 --- a/ext/standard/tests/array/array_filter_variation10.phpt +++ b/ext/standard/tests/array/array_filter_variation10.phpt @@ -2,7 +2,7 @@ Test array_filter() function : usage variations - using the array keys inside 'callback' --FILE-- 'a', 2 => 'b', 'a' => 1, 'b' => 2); + +var_dump(array_filter($mixed, 'is_numeric', ARRAY_FILTER_USE_KEY)); + +var_dump(array_filter($mixed, 'is_numeric', ARRAY_FILTER_USE_VALUE)); + +var_dump(array_filter($mixed, 'is_numeric', ARRAY_FILTER_USE_BOTH)); + echo "Done" ?> --EXPECTF-- @@ -67,4 +77,27 @@ Notice: Undefined variable: key in %s on line %d = 123 array(0) { } +*** Testing array_filter() with various use types *** +array(2) { + [1]=> + string(1) "a" + [2]=> + string(1) "b" +} +array(2) { + ["a"]=> + int(1) + ["b"]=> + int(2) +} + +Warning: is_numeric() expects exactly 1 parameter, 2 given in %s on line 44 + +Warning: is_numeric() expects exactly 1 parameter, 2 given in %s on line 44 + +Warning: is_numeric() expects exactly 1 parameter, 2 given in %s on line 44 + +Warning: is_numeric() expects exactly 1 parameter, 2 given in %s on line 44 +array(0) { +} Done From 75ba75e2055d670e204e6361732995ba27b05896 Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Fri, 27 Sep 2013 07:42:33 +0800 Subject: [PATCH 178/400] Using only two constants to signal use type intent. --- ext/standard/array.c | 7 +++---- ext/standard/php_array.h | 1 - ext/standard/tests/array/array_filter_variation10.phpt | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/ext/standard/array.c b/ext/standard/array.c index 13148ec6f0084..5968a41dd5f55 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -129,7 +129,6 @@ PHP_MINIT_FUNCTION(array) /* {{{ */ REGISTER_LONG_CONSTANT("ARRAY_FILTER_USE_BOTH", ARRAY_FILTER_USE_BOTH, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("ARRAY_FILTER_USE_KEY", ARRAY_FILTER_USE_KEY, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("ARRAY_FILTER_USE_VALUE", ARRAY_FILTER_USE_VALUE, CONST_CS | CONST_PERSISTENT); return SUCCESS; } @@ -4202,7 +4201,7 @@ PHP_FUNCTION(array_filter) zval *retval = NULL; zval *key = NULL; zend_bool have_callback = 0; - long use_type = ARRAY_FILTER_USE_VALUE; + long use_type = 0; char *string_key; zend_fcall_info fci = empty_fcall_info; zend_fcall_info_cache fci_cache = empty_fcall_info_cache; @@ -4242,7 +4241,7 @@ PHP_FUNCTION(array_filter) int key_type = zend_hash_get_current_key_ex(Z_ARRVAL_P(array), &string_key, &string_key_len, &num_key, 0, &pos); if (have_callback) { - if (use_type != ARRAY_FILTER_USE_VALUE) { + if (use_type) { MAKE_STD_ZVAL(key); /* Set up the key */ switch (key_type) { @@ -4266,7 +4265,7 @@ PHP_FUNCTION(array_filter) int retval_true = zend_is_true(retval); zval_ptr_dtor(&retval); - if (use_type != ARRAY_FILTER_USE_VALUE) { + if (use_type) { zval_ptr_dtor(&key); } if (!retval_true) { diff --git a/ext/standard/php_array.h b/ext/standard/php_array.h index 7d9733d2964f2..ef43cddfcc416 100644 --- a/ext/standard/php_array.h +++ b/ext/standard/php_array.h @@ -119,7 +119,6 @@ PHPAPI int php_multisort_compare(const void *a, const void *b TSRMLS_DC); #define ARRAY_FILTER_USE_BOTH 1 #define ARRAY_FILTER_USE_KEY 2 -#define ARRAY_FILTER_USE_VALUE 3 ZEND_BEGIN_MODULE_GLOBALS(array) int *multisort_flags[2]; diff --git a/ext/standard/tests/array/array_filter_variation10.phpt b/ext/standard/tests/array/array_filter_variation10.phpt index 25698c55c2f69..f0a6115f79ccf 100644 --- a/ext/standard/tests/array/array_filter_variation10.phpt +++ b/ext/standard/tests/array/array_filter_variation10.phpt @@ -42,7 +42,7 @@ $mixed = array(1 => 'a', 2 => 'b', 'a' => 1, 'b' => 2); var_dump(array_filter($mixed, 'is_numeric', ARRAY_FILTER_USE_KEY)); -var_dump(array_filter($mixed, 'is_numeric', ARRAY_FILTER_USE_VALUE)); +var_dump(array_filter($mixed, 'is_numeric', 0)); var_dump(array_filter($mixed, 'is_numeric', ARRAY_FILTER_USE_BOTH)); From 9b9eaba0834a0f985290304187189d0e33834b30 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Fri, 27 Sep 2013 17:00:41 -0700 Subject: [PATCH 179/400] OCI8: Fix alloc function and DLL generation --- ext/oci8/oci8.c | 2 +- ext/oci8/oci8_interface.c | 2 +- ext/oci8/package.xml | 26 +++++++++++++++++++++----- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index f04114d4d67cf..6723c22019ccf 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -151,7 +151,7 @@ static sword php_oci_ping_init(php_oci_connection *connection, OCIError *errh TS /* }}} */ /* {{{ dynamically loadable module stuff */ -#if defined(COMPILE_DL_OCI8) || defined(COMPILE_DL_OCI8_11G) +#if defined(COMPILE_DL_OCI8) || defined(COMPILE_DL_OCI8_11G) || defined(COMPILE_DL_OCI8_12C) ZEND_GET_MODULE(oci8) #endif /* COMPILE_DL */ /* }}} */ diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c index 3fad90d9c7c84..0f17f935f114b 100644 --- a/ext/oci8/oci8_interface.c +++ b/ext/oci8/oci8_interface.c @@ -1788,7 +1788,7 @@ PHP_FUNCTION(oci_set_client_identifier) if (client_id) { /* this long winded copy allows compatibility with older PHP versions */ - connection->client_id = (char *)safe_emalloc(client_id_len+1, sizeof(char), connection->is_persistent); + connection->client_id = (char *)pemalloc(client_id_len+1, connection->is_persistent); memcpy(connection->client_id, client_id, client_id_len); connection->client_id[client_id_len] = '\0'; } else { diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index 24ba635fef6dc..cd6bb04c0bd42 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -44,8 +44,8 @@ http://pear.php.net/dtd/package-2.0.xsd"> - 2.0.3 - 2.0.3 + 2.0.4 + 2.0.4 devel @@ -53,9 +53,8 @@ http://pear.php.net/dtd/package-2.0.xsd"> PHP -Add the oci_set_client_identifier() value and statement structure pointer to several DTrace probes. -Use 'phpoci' as the DTrace provider name since uniqueness is required by the Linux fasttrap module. -Update Windows builds to create only php_oci8_12c.dll. +Fix persistent memory usage with --enable-dtrace +Export get_module() for Windows php_oci8_12c.dll @@ -454,6 +453,23 @@ Update Windows builds to create only php_oci8_12c.dll. + + + 2.0.3 + 2.0.3 + + + devel + devel + + PHP + +Add the oci_set_client_identifier() value and statement structure pointer to several DTrace probes. +Use 'phpoci' as the DTrace provider name since uniqueness is required by the Linux fasttrap module. +Update Windows builds to create only php_oci8_12c.dll. + + + 2.0.2 From 0a3ee7b26bfe17a6536b2dd8b16febc8b4b55d4d Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Fri, 27 Sep 2013 17:16:02 -0700 Subject: [PATCH 180/400] Prepare for next release --- ext/oci8/package.xml | 23 +++++++++++++++++++---- ext/oci8/php_oci8.h | 2 +- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index cd6bb04c0bd42..1161b031f33a0 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -44,8 +44,8 @@ http://pear.php.net/dtd/package-2.0.xsd"> - 2.0.4 - 2.0.4 + 2.0.5 + 2.0.5 devel @@ -53,8 +53,7 @@ http://pear.php.net/dtd/package-2.0.xsd"> PHP -Fix persistent memory usage with --enable-dtrace -Export get_module() for Windows php_oci8_12c.dll + - no notes yet @@ -453,6 +452,22 @@ Export get_module() for Windows php_oci8_12c.dll + + + 2.0.4 + 2.0.4 + + + devel + devel + + PHP + +Fix persistent memory usage with --enable-dtrace +Export get_module() for Windows php_oci8_12c.dll + + + 2.0.3 diff --git a/ext/oci8/php_oci8.h b/ext/oci8/php_oci8.h index 6d02eff6b27af..1ea0411073e2e 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 "2.0.3-dev" +#define PHP_OCI8_VERSION "2.0.5-dev" extern zend_module_entry oci8_module_entry; #define phpext_oci8_ptr &oci8_module_entry From d143c2b60f87f5cd221bd070bfde887374b74eb4 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sat, 28 Sep 2013 18:04:44 -0700 Subject: [PATCH 181/400] 5.4.20 release date --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index e17632543c442..37daabb18f852 100644 --- a/NEWS +++ b/NEWS @@ -23,7 +23,7 @@ PHP NEWS . Fixed bug #65721 (configure script broken in 5.5.4 and 5.4.20 when enabling imap). (ryotakatsuki at gmail dot com) -?? ??? 2013, PHP 5.4.20 +19 Sep 2013, PHP 5.4.20 - Core: . Fixed bug #60598 (cli/apache sapi segfault on objects manipulation). From f0c1ea1d2e2f7f697d1776f260919cec583fdb5f Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sat, 28 Sep 2013 18:06:15 -0700 Subject: [PATCH 182/400] 5.5.4 release date --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index c03d31905676c..45b264746d7c6 100644 --- a/NEWS +++ b/NEWS @@ -39,7 +39,7 @@ PHP NEWS . Fix bug #64782 (SplFileObject constructor make $context optional / give it a default value). (Nikita) -?? ??? 2013, PHP 5.5.4 +19 Sep 2013, PHP 5.5.4 - Core: . Fixed bug #60598 (cli/apache sapi segfault on objects manipulation). From f0c926564c5f7de9462d9ca7bd75014b14a63f56 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 29 Sep 2013 17:58:25 +0200 Subject: [PATCH 183/400] Fix bug #65322: compile time errors won't trigger auto loading Also fixes duplicate bugs #54054 and #42098. Furthermore this fixes incorrect error messages thrown from code running inside an error handler when a compilation is in progress. The error file and line are now correctly associated with the file/line of the executor, rather than the compiler. --- NEWS | 3 +++ Zend/tests/bug65322.phpt | 22 ++++++++++++++++++++++ Zend/tests/errmsg_045.phpt | 18 ++++++++++++++++++ Zend/zend.c | 4 +++- 4 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/bug65322.phpt create mode 100644 Zend/tests/errmsg_045.phpt diff --git a/NEWS b/NEWS index 37daabb18f852..4dc7ef7c18e9d 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,9 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2013, PHP 5.4.21 +- Core: + . Fixed bug #65322 (compile time errors won't trigger auto loading). (Nikita) + - CLI server: . Fixed bug #65633 (built-in server treat some http headers as case-sensitive). (Adam) diff --git a/Zend/tests/bug65322.phpt b/Zend/tests/bug65322.phpt new file mode 100644 index 0000000000000..aab163d915e11 --- /dev/null +++ b/Zend/tests/bug65322.phpt @@ -0,0 +1,22 @@ +--TEST-- +Bug #65322: compile time errors won't trigger auto loading +--FILE-- + +--EXPECTF-- +string(50) "Redefining already defined constructor for class A" +string(%d) "%s(%d) : eval()'d code" +string(1) "B" diff --git a/Zend/tests/errmsg_045.phpt b/Zend/tests/errmsg_045.phpt new file mode 100644 index 0000000000000..b27f67ade4caa --- /dev/null +++ b/Zend/tests/errmsg_045.phpt @@ -0,0 +1,18 @@ +--TEST-- +Error message in error handler during compilation +--FILE-- + +--EXPECTF-- +string(50) "Redefining already defined constructor for class A" +string(%d) "%s(%d) : eval()'d code" + +Notice: Undefined variable: undefined in %s on line %d diff --git a/Zend/zend.c b/Zend/zend.c index 162922866b6db..0602c45042609 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -1183,7 +1183,7 @@ ZEND_API void zend_error(int type, const char *format, ...) /* {{{ */ * such scripts recursivly, but some CG() variables may be * inconsistent. */ - in_compilation = zend_is_compiling(TSRMLS_C); + in_compilation = CG(in_compilation); if (in_compilation) { saved_class_entry = CG(active_class_entry); CG(active_class_entry) = NULL; @@ -1195,6 +1195,7 @@ ZEND_API void zend_error(int type, const char *format, ...) /* {{{ */ SAVE_STACK(declare_stack); SAVE_STACK(list_stack); SAVE_STACK(context_stack); + CG(in_compilation) = 0; } if (call_user_function_ex(CG(function_table), NULL, orig_user_error_handler, &retval, 5, params, 1, NULL TSRMLS_CC) == SUCCESS) { @@ -1219,6 +1220,7 @@ ZEND_API void zend_error(int type, const char *format, ...) /* {{{ */ RESTORE_STACK(declare_stack); RESTORE_STACK(list_stack); RESTORE_STACK(context_stack); + CG(in_compilation) = 1; } if (!EG(user_error_handler)) { From 6b68f44e6b46dffd7fe029eca7afc37f1fa57347 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 29 Sep 2013 20:18:12 +0200 Subject: [PATCH 184/400] Fix bug #64979: Wrong behavior of static variables in closure generators --- NEWS | 4 ++++ Zend/tests/bug64979.phpt | 18 ++++++++---------- Zend/zend_generators.c | 28 +++++++++++++++++++++++++++- 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/NEWS b/NEWS index 45b264746d7c6..1b1f9c4bdf543 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2013, PHP 5.5.5 +- Core: + . Fixed bug #64979 (Wrong behavior of static variables in closure generators). + (Nikita) + - CLI server: . Fixed bug #65633 (built-in server treat some http headers as case-sensitive). (Adam) diff --git a/Zend/tests/bug64979.phpt b/Zend/tests/bug64979.phpt index 09de555546420..5bc8e5a6ab2a4 100644 --- a/Zend/tests/bug64979.phpt +++ b/Zend/tests/bug64979.phpt @@ -1,15 +1,13 @@ --TEST-- -Bug #64578 (Closures with static variables can be generators) ---XFAIL-- -Bug #64979 not fixed yet. +Bug #64979 (Wrong behavior of static variables in closure generators) --FILE-- diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index 1a805bbd6d61c..0af20f4593fcb 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -226,6 +226,16 @@ static zend_object_value zend_generator_create(zend_class_entry *class_type TSRM } /* }}} */ +static void copy_closure_static_var(zval **var TSRMLS_DC, int num_args, va_list args, zend_hash_key *key) /* {{{ */ +{ + HashTable *target = va_arg(args, HashTable *); + + SEPARATE_ZVAL_TO_MAKE_IS_REF(var); + Z_ADDREF_PP(var); + zend_hash_quick_update(target, key->arKey, key->nKeyLength, key->h, var, sizeof(zval *), NULL); +} +/* }}} */ + /* Requires globals EG(scope), EG(current_scope), EG(This), * EG(active_symbol_table) and EG(current_execute_data). */ ZEND_API zval *zend_generator_create_zval(zend_op_array *op_array TSRMLS_DC) /* {{{ */ @@ -242,7 +252,23 @@ ZEND_API zval *zend_generator_create_zval(zend_op_array *op_array TSRMLS_DC) /* if (op_array->fn_flags & ZEND_ACC_CLOSURE) { zend_op_array *op_array_copy = (zend_op_array*)emalloc(sizeof(zend_op_array)); *op_array_copy = *op_array; - function_add_ref((zend_function *) op_array_copy); + + (*op_array->refcount)++; + op_array->run_time_cache = NULL; + if (op_array->static_variables) { + ALLOC_HASHTABLE(op_array_copy->static_variables); + zend_hash_init( + op_array_copy->static_variables, + zend_hash_num_elements(op_array->static_variables), + NULL, ZVAL_PTR_DTOR, 0 + ); + zend_hash_apply_with_arguments( + op_array->static_variables TSRMLS_CC, + (apply_func_args_t) copy_closure_static_var, + 1, op_array_copy->static_variables + ); + } + op_array = op_array_copy; } From e9e63f922303d852b6899cadd68d7ec73e8f6134 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Mon, 30 Sep 2013 11:23:33 +0200 Subject: [PATCH 185/400] fix memleak on resetting rebind_proc --- ext/ldap/ldap.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c index 3cfa2092e776e..71d57d6d9b9ef 100644 --- a/ext/ldap/ldap.c +++ b/ext/ldap/ldap.c @@ -2107,6 +2107,7 @@ PHP_FUNCTION(ldap_set_rebind_proc) /* unregister rebind procedure */ if (ld->rebindproc != NULL) { zval_dtor(ld->rebindproc); + FREE_ZVAL(ld->rebindproc); ld->rebindproc = NULL; ldap_set_rebind_proc(ld->link, NULL, NULL); } From 2b78edfba25afac8f34ca65e18f98d23a4b8bcce Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Mon, 30 Sep 2013 11:41:35 +0200 Subject: [PATCH 186/400] fix test --- ext/ldap/tests/ldap_search_variation6.phpt | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/ext/ldap/tests/ldap_search_variation6.phpt b/ext/ldap/tests/ldap_search_variation6.phpt index a29e4524df46b..5139ebb77dece 100644 --- a/ext/ldap/tests/ldap_search_variation6.phpt +++ b/ext/ldap/tests/ldap_search_variation6.phpt @@ -217,14 +217,26 @@ array(2) { [1]=> resource(%d) of type (ldap result) } -NULL -NULL +array(1) { + ["count"]=> + int(0) +} +array(1) { + ["count"]=> + int(0) +} array(2) { [0]=> resource(%d) of type (ldap result) [1]=> resource(%d) of type (ldap result) } -NULL -NULL +array(1) { + ["count"]=> + int(0) +} +array(1) { + ["count"]=> + int(0) +} ===DONE=== From e45eacd8fa4e32692697171e90f14d3c66d673de Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Mon, 30 Sep 2013 21:21:56 +0800 Subject: [PATCH 187/400] show method in error message --- ext/openssl/openssl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index c0d1b0bf2ddbc..c208d439d6232 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1679,7 +1679,7 @@ static int php_openssl_x509_fingerprint(X509 *peer, const char *method, int raw, int n; if (!(mdtype = EVP_get_digestbyname(method))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown signature algorithm"); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "`%s`: Unknown signature algorithm", method); return 0; } else if (!X509_digest(peer, mdtype, md, &n)) { php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not generate signature"); From d7baf0427fb56cbde55495e5c2071b1cdacb94ce Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Mon, 30 Sep 2013 15:46:22 -0700 Subject: [PATCH 188/400] Make 'make distclean' remove the downloaded pear PHAR --- Makefile.global | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile.global b/Makefile.global index 05c5d151b74cc..c56ef992d9b0c 100644 --- a/Makefile.global +++ b/Makefile.global @@ -125,6 +125,7 @@ distclean: clean 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 rm -f ext/phar/phar.phar ext/phar/phar.php + rm -f pear/install-pear-nozlib.phar if test "$(srcdir)" != "$(builddir)"; then \ rm -f ext/phar/phar/phar.inc; \ fi From 954a0f8bf4f8779f509b8361c1bc02246bd1ea20 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Mon, 30 Sep 2013 16:51:07 -0700 Subject: [PATCH 189/400] OCI8 2.0: Added a new oci_set_db_operation() user space function for the "DB Operation" tracing feature of Oracle DB 12c. Currently this code is #ifdef'd out, since I can't consider the feature stable until an Oracle-side fix for Oracle bug 16695981 is available. Having the code available in PHP OCI8 facilitates testing of any fix. --- ext/oci8/oci8.c | 16 ++++++++++++++++ ext/oci8/oci8_interface.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index 6723c22019ccf..eeb1ade7bb802 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -457,6 +457,13 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_oci_set_client_info, 0, 0, 2) ZEND_ARG_INFO(0, client_information) ZEND_END_ARG_INFO() +#ifdef WAITIING_ORACLE_BUG_16695981_FIX +ZEND_BEGIN_ARG_INFO_EX(arginfo_oci_set_db_operation, 0, 0, 2) +ZEND_ARG_INFO(0, connection_resource) +ZEND_ARG_INFO(0, action) +ZEND_END_ARG_INFO() +#endif + ZEND_BEGIN_ARG_INFO_EX(arginfo_oci_password_change, 0, 0, 4) ZEND_ARG_INFO(0, connection_resource_or_connection_string) ZEND_ARG_INFO(0, username) @@ -708,6 +715,9 @@ static unsigned char arginfo_oci_bind_array_by_name[] = { 3, BYREF_NONE, BYREF_N #define arginfo_oci_set_module_name NULL #define arginfo_oci_set_action NULL #define arginfo_oci_set_client_info NULL +#ifdef WAITIING_ORACLE_BUG_16695981_FIX +#define arginfo_oci_set_db_operation NULL +#endif #define arginfo_oci_password_change NULL #define arginfo_oci_new_cursor NULL #define arginfo_oci_result NULL @@ -799,6 +809,9 @@ PHP_FUNCTION(oci_statement_type); PHP_FUNCTION(oci_num_rows); PHP_FUNCTION(oci_set_prefetch); PHP_FUNCTION(oci_set_client_identifier); +#ifdef WAITIING_ORACLE_BUG_16695981_FIX +PHP_FUNCTION(oci_set_db_operation); +#endif PHP_FUNCTION(oci_set_edition); PHP_FUNCTION(oci_set_module_name); PHP_FUNCTION(oci_set_action); @@ -904,6 +917,9 @@ zend_function_entry php_oci_functions[] = { PHP_FE(oci_new_descriptor, arginfo_oci_new_descriptor) PHP_FE(oci_set_prefetch, arginfo_oci_set_prefetch) PHP_FE(oci_set_client_identifier, arginfo_oci_set_client_identifier) +#ifdef WAITIING_ORACLE_BUG_16695981_FIX + PHP_FE(oci_set_db_operation, arginfo_oci_set_db_operation) +#endif PHP_FE(oci_set_edition, arginfo_oci_set_edition) PHP_FE(oci_set_module_name, arginfo_oci_set_module_name) PHP_FE(oci_set_action, arginfo_oci_set_action) diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c index 0f17f935f114b..a452c1a7e2902 100644 --- a/ext/oci8/oci8_interface.c +++ b/ext/oci8/oci8_interface.c @@ -1928,6 +1928,38 @@ PHP_FUNCTION(oci_set_client_info) } /* }}} */ +#ifdef WAITIING_ORACLE_BUG_16695981_FIX +/* {{{ proto bool oci_set_db_operation(resource connection, string value) + Sets the "DB operation" on the connection for Oracle end-to-end tracing */ +PHP_FUNCTION(oci_set_db_operation) +{ +#if (OCI_MAJOR_VERSION > 11) + zval *z_connection; + php_oci_connection *connection; + char *dbop_name; + int dbop_name_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &z_connection, &dbop_name, &dbop_name_len) == FAILURE) { + return; + } + + PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); + + PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) dbop_name, (ub4) dbop_name_len, (ub4) OCI_ATTR_DBOP, OCI_G(err))); + + if (OCI_G(errcode) != OCI_SUCCESS) { + php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + RETURN_FALSE; + } + RETURN_TRUE; +#else + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unsupported attribute type"); + RETURN_FALSE; +#endif +} +/* }}} */ +#endif /* WAITIING_ORACLE_BUG_16695981_FIX */ + /* {{{ proto bool oci_password_change(resource connection, string username, string old_password, string new_password) Changes the password of an account */ PHP_FUNCTION(oci_password_change) From 51fca2b4b35c5db11a7136087fbf8cf3651200c1 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 1 Oct 2013 11:32:11 +0400 Subject: [PATCH 190/400] Reverted patch (it was used for internal testing and was committed by accident) --- sapi/cgi/cgi_main.c | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c index 4f3d5040e1b8c..4c78fcafec08f 100644 --- a/sapi/cgi/cgi_main.c +++ b/sapi/cgi/cgi_main.c @@ -154,7 +154,6 @@ static const opt_struct OPTIONS[] = { {'?', 0, "usage"},/* help alias (both '?' and 'usage') */ {'v', 0, "version"}, {'z', 1, "zend-extension"}, - {'W', 1, "warmup"}, {'T', 1, "timing"}, {'-', 0, NULL} /* end of args */ }; @@ -1755,7 +1754,6 @@ int main(int argc, char *argv[]) int fcgi_fd = 0; fcgi_request *request = NULL; int repeats = 1; - int warmup_repeats = 0; int benchmark = 0; #if HAVE_GETTIMEOFDAY struct timeval start, end; @@ -2105,9 +2103,6 @@ consult the installation file that came with this distribution, or visit \n\ time(&start); #endif break; - case 'W': - warmup_repeats = atoi(php_optarg); - break; case 'h': case '?': if (request) { @@ -2521,24 +2516,12 @@ consult the installation file that came with this distribution, or visit \n\ if (!fastcgi) { if (benchmark) { - if (warmup_repeats) { - warmup_repeats--; - if (!warmup_repeats) { -#ifdef HAVE_GETTIMEOFDAY - gettimeofday(&start, NULL); -#else - time(&start); -#endif - } + repeats--; + if (repeats > 0) { + script_file = NULL; + php_optind = orig_optind; + php_optarg = orig_optarg; continue; - } else { - repeats--; - if (repeats > 0) { - script_file = NULL; - php_optind = orig_optind; - php_optarg = orig_optarg; - continue; - } } } break; From 18b04b480ebc41841b2004cc11797eda40fb3958 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Tue, 1 Oct 2013 11:07:55 +0200 Subject: [PATCH 191/400] Fixed bug #61548 --- NEWS | 4 + ext/standard/http_fopen_wrapper.c | 61 ++++++------- ext/standard/tests/http/bug61548.phpt | 118 ++++++++++++++++++++++++++ 3 files changed, 153 insertions(+), 30 deletions(-) create mode 100644 ext/standard/tests/http/bug61548.phpt diff --git a/NEWS b/NEWS index 4dc7ef7c18e9d..9bb60327fa9dd 100644 --- a/NEWS +++ b/NEWS @@ -26,6 +26,10 @@ PHP NEWS . Fixed bug #65721 (configure script broken in 5.5.4 and 5.4.20 when enabling imap). (ryotakatsuki at gmail dot com) +- Standard: + . Fixed bug #61548 (content-type must appear at the end of headers for 201 + Location to work in http). (Mike) + 19 Sep 2013, PHP 5.4.20 - Core: diff --git a/ext/standard/http_fopen_wrapper.c b/ext/standard/http_fopen_wrapper.c index b8676bbba4df6..4605e7494fa3d 100644 --- a/ext/standard/http_fopen_wrapper.c +++ b/ext/standard/http_fopen_wrapper.c @@ -84,6 +84,30 @@ #define HTTP_WRAPPER_HEADER_INIT 1 #define HTTP_WRAPPER_REDIRECTED 2 +static inline void strip_header(char *header_bag, char *lc_header_bag, + const char *lc_header_name) +{ + char *lc_header_start = strstr(lc_header_bag, lc_header_name); + char *header_start = header_bag + (lc_header_start - lc_header_bag); + + if (lc_header_start + && (lc_header_start == lc_header_bag || *(lc_header_start-1) == '\n') + ) { + char *lc_eol = strchr(lc_header_start, '\n'); + char *eol = header_start + (lc_eol - lc_header_start); + + if (lc_eol) { + size_t eollen = strlen(lc_eol); + + memmove(lc_header_start, lc_eol+1, eollen); + memmove(header_start, eol+1, eollen); + } else { + *lc_header_start = '\0'; + *header_start = '\0'; + } + } +} + 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 *stream = NULL; @@ -425,40 +449,17 @@ php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper, char *path, if (tmp && strlen(tmp) > 0) { char *s; - if (!header_init) { /* Remove post headers for redirects */ - int l = strlen(tmp); - char *s2, *tmp_c = estrdup(tmp); - - php_strtolower(tmp_c, l); - if ((s = strstr(tmp_c, "content-length:"))) { - if ((s2 = memchr(s, '\n', tmp_c + l - s))) { - int b = tmp_c + l - 1 - s2; - memmove(tmp, tmp + (s2 + 1 - tmp_c), b); - memmove(tmp_c, s2 + 1, b); - - } else { - tmp[s - tmp_c] = *s = '\0'; - } - l = strlen(tmp_c); - } - if ((s = strstr(tmp_c, "content-type:"))) { - if ((s2 = memchr(s, '\n', tmp_c + l - s))) { - memmove(tmp, tmp + (s2 + 1 - tmp_c), tmp_c + l - 1 - s2); - } else { - tmp[s - tmp_c] = '\0'; - } - } - - efree(tmp_c); - tmp_c = php_trim(tmp, strlen(tmp), NULL, 0, NULL, 3 TSRMLS_CC); - efree(tmp); - tmp = tmp_c; - } - user_headers = estrdup(tmp); /* Make lowercase for easy comparison against 'standard' headers */ php_strtolower(tmp, strlen(tmp)); + + if (!header_init) { + /* strip POST headers on redirect */ + strip_header(user_headers, tmp, "content-length:"); + strip_header(user_headers, tmp, "content-type:"); + } + if ((s = strstr(tmp, "user-agent:")) && (s == tmp || *(s-1) == '\r' || *(s-1) == '\n' || *(s-1) == '\t' || *(s-1) == ' ')) { diff --git a/ext/standard/tests/http/bug61548.phpt b/ext/standard/tests/http/bug61548.phpt new file mode 100644 index 0000000000000..138b15a338c06 --- /dev/null +++ b/ext/standard/tests/http/bug61548.phpt @@ -0,0 +1,118 @@ +--TEST-- +Bug #61548 (content-type must appear at the end of headers) +--INI-- +allow_url_fopen=1 +--SKIPIF-- + +--FILE-- + [ + 'method' => 'POST', + 'header' => $header, + 'follow_location' => true, + ], + ]; + + $ctx = stream_context_create($options); + + $responses = [ + "data://text/plain,HTTP/1.1 201\r\nLocation: /foo\r\n\r\n", + "data://text/plain,HTTP/1.1 200\r\nConnection: close\r\n\r\n", + ]; + $pid = http_server('tcp://127.0.0.1:12342', $responses, $output); + + $fd = fopen('http://127.0.0.1:12342/', 'rb', false, $ctx); + fseek($output, 0, SEEK_SET); + echo stream_get_contents($output); + + http_server_kill($pid); +} + +do_test("First:1\nSecond:2\nContent-type: text/plain"); +do_test("First:1\nSecond:2\nContent-type: text/plain\n"); +do_test("First:1\nSecond:2\nContent-type: text/plain\nThird:"); +do_test("First:1\nContent-type:text/plain\nSecond:2"); +do_test("First:1\nContent-type:text/plain\nSecond:2\n"); +do_test("First:1\nContent-type:text/plain\nSecond:2\nThird:"); + +?> +Done +--EXPECT-- +POST / HTTP/1.0 +Host: 127.0.0.1:12342 +First:1 +Second:2 +Content-type: text/plain + +GET /foo HTTP/1.0 +Host: 127.0.0.1:12342 +First:1 +Second:2 + + +POST / HTTP/1.0 +Host: 127.0.0.1:12342 +First:1 +Second:2 +Content-type: text/plain + +GET /foo HTTP/1.0 +Host: 127.0.0.1:12342 +First:1 +Second:2 + + +POST / HTTP/1.0 +Host: 127.0.0.1:12342 +First:1 +Second:2 +Content-type: text/plain +Third: + +GET /foo HTTP/1.0 +Host: 127.0.0.1:12342 +First:1 +Second:2 +Third: + +POST / HTTP/1.0 +Host: 127.0.0.1:12342 +First:1 +Content-type:text/plain +Second:2 + +GET /foo HTTP/1.0 +Host: 127.0.0.1:12342 +First:1 +Second:2 + +POST / HTTP/1.0 +Host: 127.0.0.1:12342 +First:1 +Content-type:text/plain +Second:2 + +GET /foo HTTP/1.0 +Host: 127.0.0.1:12342 +First:1 +Second:2 + +POST / HTTP/1.0 +Host: 127.0.0.1:12342 +First:1 +Content-type:text/plain +Second:2 +Third: + +GET /foo HTTP/1.0 +Host: 127.0.0.1:12342 +First:1 +Second:2 +Third: + +Done + From cd1cab3f4726751a0476ac8701ce09cc37cb36df Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Tue, 1 Oct 2013 17:01:03 +0200 Subject: [PATCH 192/400] fix bug #62396 'make test' crashes starting with 5.3.14 (missing gzencode()) --- NEWS | 5 +++++ run-tests.php | 12 +++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 9bb60327fa9dd..b889e66271b14 100644 --- a/NEWS +++ b/NEWS @@ -30,6 +30,11 @@ PHP NEWS . Fixed bug #61548 (content-type must appear at the end of headers for 201 Location to work in http). (Mike) +- Build system: + . Fixed bug #62396 ('make test' crashes starting with 5.3.14 (missing + gzencode())). (Mike) + + 19 Sep 2013, PHP 5.4.20 - Core: diff --git a/run-tests.php b/run-tests.php index 935f821f4e683..317f6077a3dc9 100755 --- a/run-tests.php +++ b/run-tests.php @@ -455,7 +455,7 @@ function save_or_mail_results() $compression = 0; $output_file = $CUR_DIR . '/php_test_results_' . date('Ymd_Hi') . '.txt'; -if ($compression) { +if ($compression && in_array("compress.zlib", stream_get_filters())) { $output_file = 'compress.zlib://' . $output_file . '.gz'; } @@ -1545,6 +1545,16 @@ function run_test($php, $file, $env) } } } + + if (!extension_loaded("zlib") + && ( array_key_exists("GZIP_POST", $section_text) + || array_key_exists("DEFLATE_POST", $section_text)) + ) { + $message = "ext/zlib required"; + show_result('SKIP', $tested, $tested_file, "reason: $message", $temp_filenames); + junit_mark_test_as('SKIP', $shortname, $tested, null, ""); + return 'SKIPPED'; + } if (@count($section_text['REDIRECTTEST']) == 1) { $test_files = array(); From 60e38b3243577abc80ce6bbcfb0b4125b08acb85 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Tue, 1 Oct 2013 10:33:39 -0700 Subject: [PATCH 193/400] Revert "Make 'make distclean' remove the downloaded pear PHAR" This reverts commit d7baf0427fb56cbde55495e5c2071b1cdacb94ce. --- Makefile.global | 1 - 1 file changed, 1 deletion(-) diff --git a/Makefile.global b/Makefile.global index c56ef992d9b0c..05c5d151b74cc 100644 --- a/Makefile.global +++ b/Makefile.global @@ -125,7 +125,6 @@ distclean: clean 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 rm -f ext/phar/phar.phar ext/phar/phar.php - rm -f pear/install-pear-nozlib.phar if test "$(srcdir)" != "$(builddir)"; then \ rm -f ext/phar/phar/phar.inc; \ fi From b2f8f35a889e77c3123ade348907e73bf6d6689e Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Tue, 1 Oct 2013 22:25:56 -0700 Subject: [PATCH 194/400] 5.4.22-dev now --- NEWS | 2 ++ configure.in | 2 +- main/php_version.h | 6 +++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index b889e66271b14..9bef174d37a9e 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,7 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +?? ??? 2013, PHP 5.4.22 + ?? ??? 2013, PHP 5.4.21 - Core: diff --git a/configure.in b/configure.in index 30de2c3aaa803..aa58df613b6c2 100644 --- a/configure.in +++ b/configure.in @@ -119,7 +119,7 @@ int zend_sprintf(char *buffer, const char *format, ...); PHP_MAJOR_VERSION=5 PHP_MINOR_VERSION=4 -PHP_RELEASE_VERSION=21 +PHP_RELEASE_VERSION=22 PHP_EXTRA_VERSION="-dev" PHP_VERSION="$PHP_MAJOR_VERSION.$PHP_MINOR_VERSION.$PHP_RELEASE_VERSION$PHP_EXTRA_VERSION" PHP_VERSION_ID=`expr [$]PHP_MAJOR_VERSION \* 10000 + [$]PHP_MINOR_VERSION \* 100 + [$]PHP_RELEASE_VERSION` diff --git a/main/php_version.h b/main/php_version.h index e30528ed51d00..3058fef6132f0 100644 --- a/main/php_version.h +++ b/main/php_version.h @@ -2,7 +2,7 @@ /* edit configure.in to change version number */ #define PHP_MAJOR_VERSION 5 #define PHP_MINOR_VERSION 4 -#define PHP_RELEASE_VERSION 21 +#define PHP_RELEASE_VERSION 22 #define PHP_EXTRA_VERSION "-dev" -#define PHP_VERSION "5.4.21-dev" -#define PHP_VERSION_ID 50421 +#define PHP_VERSION "5.4.22-dev" +#define PHP_VERSION_ID 50422 From 9209c19f8f7eef807cb457b32d3ab517ff8dc178 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Wed, 2 Oct 2013 15:19:25 +0200 Subject: [PATCH 195/400] fix bug #65808 the socket_connect() won't work with IPv6 address --- NEWS | 4 +++ ext/sockets/sockets.c | 59 ++++++++++++++++++++++++++++++------------- 2 files changed, 46 insertions(+), 17 deletions(-) diff --git a/NEWS b/NEWS index 9bef174d37a9e..c2086c07910b8 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2013, PHP 5.4.22 +- Sockets: + . Fixed bug #65808 (the socket_connect() won't work with IPv6 address). + (Mike) + ?? ??? 2013, PHP 5.4.21 - Core: diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index d0d02946477d7..d094b3cc1d692 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -607,6 +607,8 @@ static char *php_strerror(int error TSRMLS_DC) /* {{{ */ /* }}} */ #if HAVE_IPV6 +static int php_get_if_index_from_string(const char *val, unsigned *out TSRMLS_DC); + /* Sets addr by hostname, or by ip in string form (AF_INET6) */ static int php_set_inet6_addr(struct sockaddr_in6 *sin6, char *string, php_socket *php_sock TSRMLS_DC) /* {{{ */ { @@ -615,6 +617,7 @@ static int php_set_inet6_addr(struct sockaddr_in6 *sin6, char *string, php_socke struct addrinfo hints; struct addrinfo *addrinfo = NULL; #endif + char *scope = strchr(string, '%'); if (inet_pton(AF_INET6, string, &tmp)) { memcpy(&(sin6->sin6_addr.s6_addr), &(tmp.s6_addr), sizeof(struct in6_addr)); @@ -649,6 +652,22 @@ static int php_set_inet6_addr(struct sockaddr_in6 *sin6, char *string, php_socke } + if (scope++) { + long lval = 0; + double dval = 0; + unsigned scope_id = 0; + + if (IS_LONG == is_numeric_string(scope, strlen(scope), &lval, &dval, 0)) { + if (lval > 0 && lval <= UINT_MAX) { + scope_id = lval; + } + } else { + php_get_if_index_from_string(scope, &scope_id TSRMLS_CC); + } + + sin6->sin6_scope_id = scope_id; + } + return 1; } /* }}} */ @@ -714,6 +733,28 @@ static int php_set_inet46_addr(php_sockaddr_storage *ss, socklen_t *ss_len, char return 0; } +static int php_get_if_index_from_string(const char *val, unsigned *out TSRMLS_DC) +{ +#if HAVE_IF_NAMETOINDEX + unsigned int ind; + + ind = if_nametoindex(val); + if (ind == 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, + "no interface with name \"%s\" could be found", val); + return FAILURE; + } else { + *out = ind; + return SUCCESS; + } +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, + "this platform does not support looking up an interface by " + "name, an integer interface index must be supplied instead"); + return FAILURE; +#endif +} + static int php_get_if_index_from_zval(zval *val, unsigned *out TSRMLS_DC) { int ret; @@ -729,26 +770,10 @@ static int php_get_if_index_from_zval(zval *val, unsigned *out TSRMLS_DC) ret = SUCCESS; } } else { -#if HAVE_IF_NAMETOINDEX - unsigned int ind; zval_add_ref(&val); convert_to_string_ex(&val); - ind = if_nametoindex(Z_STRVAL_P(val)); - if (ind == 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, - "no interface with name \"%s\" could be found", Z_STRVAL_P(val)); - ret = FAILURE; - } else { - *out = ind; - ret = SUCCESS; - } + ret = php_get_if_index_from_string(Z_STRVAL_P(val), out TSRMLS_CC); zval_ptr_dtor(&val); -#else - php_error_docref(NULL TSRMLS_CC, E_WARNING, - "this platform does not support looking up an interface by " - "name, an integer interface index must be supplied instead"); - ret = FAILURE; -#endif } return ret; From 60d9175280cbab5967966e38f42fced854d10408 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Thu, 3 Oct 2013 08:45:31 +0200 Subject: [PATCH 196/400] Fix Bug #60633 build warning in bcmath --- ext/bcmath/libbcmath/src/recmul.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/ext/bcmath/libbcmath/src/recmul.c b/ext/bcmath/libbcmath/src/recmul.c index c31d09dc72db5..64014f3a6e8a0 100644 --- a/ext/bcmath/libbcmath/src/recmul.c +++ b/ext/bcmath/libbcmath/src/recmul.c @@ -183,7 +183,6 @@ _bc_rec_mul (bc_num u, int ulen, bc_num v, int vlen, bc_num *prod, int full_scale TSRMLS_DC) { bc_num u0, u1, v0, v1; - int u0len, v0len; bc_num m1, m2, m3, d1, d2; int n, prodlen, m1zero; int d1len, d2len; @@ -216,10 +215,8 @@ _bc_rec_mul (bc_num u, int ulen, bc_num v, int vlen, bc_num *prod, } _bc_rm_leading_zeros (u1); _bc_rm_leading_zeros (u0); - u0len = u0->n_len; _bc_rm_leading_zeros (v1); _bc_rm_leading_zeros (v0); - v0len = v0->n_len; m1zero = bc_is_zero(u1 TSRMLS_CC) || bc_is_zero(v1 TSRMLS_CC); From fc3f8a8f54d8b3c864125bf32028d4550882839c Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 3 Oct 2013 13:28:41 +0200 Subject: [PATCH 197/400] fix bug #59613 (Crash with clone XMLReader) --- NEWS | 4 ++++ ext/xmlreader/php_xmlreader.c | 1 + ext/xmlreader/tests/bug51963.phpt | 22 ++++++++++++++++++++++ 3 files changed, 27 insertions(+) create mode 100644 ext/xmlreader/tests/bug51963.phpt diff --git a/NEWS b/NEWS index c2086c07910b8..c6961bd24fc8b 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,10 @@ PHP NEWS . Fixed bug #65808 (the socket_connect() won't work with IPv6 address). (Mike) +- XMLReader: + . Fixed bug #59613 (Crash with clone XMLReader). (Mike) + + ?? ??? 2013, PHP 5.4.21 - Core: diff --git a/ext/xmlreader/php_xmlreader.c b/ext/xmlreader/php_xmlreader.c index f4c2643212f27..8b803200976de 100644 --- a/ext/xmlreader/php_xmlreader.c +++ b/ext/xmlreader/php_xmlreader.c @@ -1320,6 +1320,7 @@ PHP_MINIT_FUNCTION(xmlreader) xmlreader_object_handlers.read_property = xmlreader_read_property; xmlreader_object_handlers.write_property = xmlreader_write_property; xmlreader_object_handlers.get_property_ptr_ptr = xmlreader_get_property_ptr_ptr; + xmlreader_object_handlers.clone_obj = NULL; INIT_CLASS_ENTRY(ce, "XMLReader", xmlreader_functions); ce.create_object = xmlreader_objects_new; diff --git a/ext/xmlreader/tests/bug51963.phpt b/ext/xmlreader/tests/bug51963.phpt new file mode 100644 index 0000000000000..af47f9750b2cb --- /dev/null +++ b/ext/xmlreader/tests/bug51963.phpt @@ -0,0 +1,22 @@ +--TEST-- +Bug #59613 (Crash with clone XMLReader) +--SKIPIF-- + +--FILE-- +xml(""); + +$xmlreader->next(); +$xmlreader2 = clone $xmlreader; +$xmlreader2->next(); +?> +Done +--EXPECTF-- +Test + +Fatal error: Trying to clone an uncloneable object of class XMLReader in %s on line %d From dc3d360a0ff8c17cb2ce2030813d30b578249be9 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 3 Oct 2013 13:34:31 +0200 Subject: [PATCH 198/400] typo: really fix bug #51936 Crash with clone xmlreader --- NEWS | 2 +- ext/xmlreader/tests/{bug51963.phpt => bug51936.phpt} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename ext/xmlreader/tests/{bug51963.phpt => bug51936.phpt} (90%) diff --git a/NEWS b/NEWS index c6961bd24fc8b..ffde3012f971d 100644 --- a/NEWS +++ b/NEWS @@ -7,7 +7,7 @@ PHP NEWS (Mike) - XMLReader: - . Fixed bug #59613 (Crash with clone XMLReader). (Mike) + . Fixed bug #51936 (Crash with clone XMLReader). (Mike) ?? ??? 2013, PHP 5.4.21 diff --git a/ext/xmlreader/tests/bug51963.phpt b/ext/xmlreader/tests/bug51936.phpt similarity index 90% rename from ext/xmlreader/tests/bug51963.phpt rename to ext/xmlreader/tests/bug51936.phpt index af47f9750b2cb..4b5f1012e79c0 100644 --- a/ext/xmlreader/tests/bug51963.phpt +++ b/ext/xmlreader/tests/bug51936.phpt @@ -1,5 +1,5 @@ --TEST-- -Bug #59613 (Crash with clone XMLReader) +Bug #51936 (Crash with clone XMLReader) --SKIPIF-- Date: Thu, 3 Oct 2013 15:23:05 +0200 Subject: [PATCH 199/400] fix bug #55285 XMLReader::getAttribute/No/Ns methods inconsistency --- NEWS | 4 ++++ UPGRADING | 4 ++++ ext/xmlreader/php_xmlreader.c | 6 ------ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/NEWS b/NEWS index 95acaa66692f7..e1a191f3ddbbd 100644 --- a/NEWS +++ b/NEWS @@ -55,4 +55,8 @@ PHP NEWS . Implemented FR #65634 (HTTP wrapper is very slow with protocol_version 1.1). (Adam) +- XMLReader: + . Fixed bug #55285 (XMLReader::getAttribute/No/Ns methods inconsistency). + (Mike) + <<< NOTE: Insert NEWS from last stable release here prior to actual release! >>> diff --git a/UPGRADING b/UPGRADING index 87b9eefeedb52..f4138875004f1 100755 --- a/UPGRADING +++ b/UPGRADING @@ -61,6 +61,10 @@ PHP X.Y UPGRADE NOTES CURLOPT_SAFE_UPLOAD is now turned on by default and uploads with @file do not work unless it is explicitly set to false. +- XMLReader: + XMLReader::getAttributeNs and XMLReader::getAttributeNo now return NULL if + the attribute could not be found, just like XMLReader::getAttribute. + ======================================== 5. New Functions ======================================== diff --git a/ext/xmlreader/php_xmlreader.c b/ext/xmlreader/php_xmlreader.c index 464998ce62f20..6ef25a235cd64 100644 --- a/ext/xmlreader/php_xmlreader.c +++ b/ext/xmlreader/php_xmlreader.c @@ -588,9 +588,6 @@ PHP_METHOD(xmlreader, getAttributeNo) if (retchar) { RETVAL_STRING(retchar, 1); xmlFree(retchar); - return; - } else { - RETURN_EMPTY_STRING(); } } /* }}} */ @@ -622,9 +619,6 @@ PHP_METHOD(xmlreader, getAttributeNs) if (retchar) { RETVAL_STRING(retchar, 1); xmlFree(retchar); - return; - } else { - RETURN_EMPTY_STRING(); } } /* }}} */ From 099b295646b108ad56d1ec3b37dfcb5812fd378c Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 3 Oct 2013 16:23:59 +0200 Subject: [PATCH 200/400] add NEWS and UPGRADING about gost-crypto --- NEWS | 3 +++ UPGRADING | 2 ++ 2 files changed, 5 insertions(+) diff --git a/NEWS b/NEWS index e1a191f3ddbbd..8113514420b8d 100644 --- a/NEWS +++ b/NEWS @@ -26,6 +26,9 @@ PHP NEWS improvements based on this. (RFC: https://wiki.php.net/rfc/operator_overloading_gmp). (Nikita) +- Hash: + . Added gost-crypto (CryptoPro S-box) GOST hash algo. (Manuel Mausz) + - mysqlnd: . Disabled flag for SP OUT variables for 5.5+ servers as they are not natively supported by the overlying APIs. (Andrey) diff --git a/UPGRADING b/UPGRADING index f4138875004f1..fb8daab2d609c 100755 --- a/UPGRADING +++ b/UPGRADING @@ -40,6 +40,8 @@ PHP X.Y UPGRADE NOTES - The php://input stream is now re-usable and can be used concurrently with enable_post_data_reading=0. +- Added gost-crypto (CryptoPro S-box) hash algo. + ======================================== 2. Changes in SAPI modules ======================================== From f6ff3a28d60c24dea2a05344d9b7eb823f09b4e5 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Fri, 4 Oct 2013 11:22:17 +0200 Subject: [PATCH 201/400] Fixed bug #64230 (XMLReader does not suppress errors) --- NEWS | 1 + ext/xmlreader/php_xmlreader.c | 2 -- ext/xmlreader/tests/bug64230.phpt | 50 +++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 ext/xmlreader/tests/bug64230.phpt diff --git a/NEWS b/NEWS index ffde3012f971d..9963714679693 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,7 @@ PHP NEWS - XMLReader: . Fixed bug #51936 (Crash with clone XMLReader). (Mike) + . Fixed bug #64230 (XMLReader does not suppress errors). (Mike) ?? ??? 2013, PHP 5.4.21 diff --git a/ext/xmlreader/php_xmlreader.c b/ext/xmlreader/php_xmlreader.c index 8b803200976de..adf282120e0b9 100644 --- a/ext/xmlreader/php_xmlreader.c +++ b/ext/xmlreader/php_xmlreader.c @@ -805,7 +805,6 @@ PHP_METHOD(xmlreader, read) if (intern != NULL && intern->ptr != NULL) { retval = xmlTextReaderRead(intern->ptr); if (retval == -1) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "An Error Occurred while reading"); RETURN_FALSE; } else { RETURN_BOOL(retval); @@ -847,7 +846,6 @@ PHP_METHOD(xmlreader, next) retval = xmlTextReaderNext(intern->ptr); } if (retval == -1) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "An Error Occurred while reading"); RETURN_FALSE; } else { RETURN_BOOL(retval); diff --git a/ext/xmlreader/tests/bug64230.phpt b/ext/xmlreader/tests/bug64230.phpt new file mode 100644 index 0000000000000..0b070925f30d3 --- /dev/null +++ b/ext/xmlreader/tests/bug64230.phpt @@ -0,0 +1,50 @@ +--TEST-- +Bug #64230 (XMLReader does not suppress errors) +--SKIPIF-- + +--FILE-- +message); + } + libxml_clear_errors(); +} + +echo "Internal errors TRUE\n"; +libxml_use_internal_errors(true); + +$x = new XMLReader; +$x->xml(""); +$x->read(); + +show_internal_errors(); + +echo "Internal errors FALSE\n"; +libxml_use_internal_errors(false); + +$x = new XMLReader; +$x->xml(""); +$x->read(); + +show_internal_errors(); + +?> +Done +--EXPECTF-- +Test +Internal errors TRUE +Internal: Specification mandate value for attribute att + +Internal errors FALSE + +Warning: XMLReader::read(): %s: parser error : Specification mandate value for attribute att in %s on line %d + +Warning: XMLReader::read(): in %s on line %d + +Warning: XMLReader::read(): ^ in %s on line %d +Done From 536260f2c52af7057a657af96d991acf27c0cc86 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 4 Oct 2013 13:13:46 +0200 Subject: [PATCH 202/400] Fix bug #65821: By-ref foreach on property access of string offset segfaults This removes the now unnecessary ZEND_FETCH_ADD_LOCK on the container of a property fetch of a by-reference foreach. --- NEWS | 2 ++ Zend/zend_compile.c | 33 ++--------------------- Zend/zend_vm_def.h | 5 ---- Zend/zend_vm_execute.h | 60 ------------------------------------------ 4 files changed, 4 insertions(+), 96 deletions(-) diff --git a/NEWS b/NEWS index 1b1f9c4bdf543..796f82f207847 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,8 @@ PHP NEWS - Core: . Fixed bug #64979 (Wrong behavior of static variables in closure generators). (Nikita) + . Fixed bug #65821 (By-ref foreach on property access of string offset + segfaults). (Nikita) - CLI server: . Fixed bug #65633 (built-in server treat some http headers as diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index f250b2be20879..9008f23369d35 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1749,7 +1749,6 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n zend_op dummy_opline; dummy_opline.result_type = IS_UNUSED; - dummy_opline.op1_type = IS_UNUSED; zend_stack_push(&CG(foreach_copy_stack), (void *) &dummy_opline, sizeof(zend_op)); } @@ -2662,7 +2661,7 @@ static int generate_free_switch_expr(const zend_switch_entry *switch_entry TSRML opline->opcode = (switch_entry->cond.op_type == IS_TMP_VAR) ? ZEND_FREE : ZEND_SWITCH_FREE; SET_NODE(opline->op1, &switch_entry->cond); SET_UNUSED(opline->op2); - opline->extended_value = 0; + return 0; } /* }}} */ @@ -2672,7 +2671,7 @@ static int generate_free_foreach_copy(const zend_op *foreach_copy TSRMLS_DC) /* zend_op *opline; /* If we reach the separator then stop applying the stack */ - if (foreach_copy->result_type == IS_UNUSED && foreach_copy->op1_type == IS_UNUSED) { + if (foreach_copy->result_type == IS_UNUSED) { return 1; } @@ -2681,16 +2680,6 @@ static int generate_free_foreach_copy(const zend_op *foreach_copy TSRMLS_DC) /* opline->opcode = (foreach_copy->result_type == IS_TMP_VAR) ? ZEND_FREE : ZEND_SWITCH_FREE; COPY_NODE(opline->op1, foreach_copy->result); SET_UNUSED(opline->op2); - opline->extended_value = 1; - - if (foreach_copy->op1_type != IS_UNUSED) { - opline = get_next_op(CG(active_op_array) TSRMLS_CC); - - opline->opcode = (foreach_copy->op1_type == IS_TMP_VAR) ? ZEND_FREE : ZEND_SWITCH_FREE; - COPY_NODE(opline->op1, foreach_copy->op1); - SET_UNUSED(opline->op2); - opline->extended_value = 0; - } return 0; } @@ -6227,7 +6216,6 @@ void zend_do_foreach_begin(znode *foreach_token, znode *open_brackets_token, zno { zend_op *opline; zend_bool is_variable; - zend_bool push_container = 0; zend_op dummy_opline; if (variable) { @@ -6239,14 +6227,6 @@ void zend_do_foreach_begin(znode *foreach_token, znode *open_brackets_token, zno /* save the location of FETCH_W instruction(s) */ open_brackets_token->u.op.opline_num = get_next_op_number(CG(active_op_array)); zend_do_end_variable_parse(array, BP_VAR_W, 0 TSRMLS_CC); - if (CG(active_op_array)->last > 0 && - CG(active_op_array)->opcodes[CG(active_op_array)->last-1].opcode == ZEND_FETCH_OBJ_W) { - /* Only lock the container if we are fetching from a real container and not $this */ - if (CG(active_op_array)->opcodes[CG(active_op_array)->last-1].op1_type == IS_VAR) { - CG(active_op_array)->opcodes[CG(active_op_array)->last-1].extended_value |= ZEND_FETCH_ADD_LOCK; - push_container = 1; - } - } } else { is_variable = 0; open_brackets_token->u.op.opline_num = get_next_op_number(CG(active_op_array)); @@ -6266,11 +6246,6 @@ void zend_do_foreach_begin(znode *foreach_token, znode *open_brackets_token, zno opline->extended_value = is_variable ? ZEND_FE_RESET_VARIABLE : 0; COPY_NODE(dummy_opline.result, opline->result); - if (push_container) { - COPY_NODE(dummy_opline.op1, CG(active_op_array)->opcodes[CG(active_op_array)->last-2].op1); - } else { - dummy_opline.op1_type = IS_UNUSED; - } zend_stack_push(&CG(foreach_copy_stack), (void *) &dummy_opline, sizeof(zend_op)); /* save the location of FE_FETCH */ @@ -6327,7 +6302,6 @@ void zend_do_foreach_cont(znode *foreach_token, const znode *open_brackets_token opline->extended_value |= ZEND_FE_FETCH_BYREF; CG(active_op_array)->opcodes[foreach_token->u.op.opline_num].extended_value |= ZEND_FE_RESET_REFERENCE; } else { - zend_op *foreach_copy; zend_op *fetch = &CG(active_op_array)->opcodes[foreach_token->u.op.opline_num]; zend_op *end = &CG(active_op_array)->opcodes[open_brackets_token->u.op.opline_num]; @@ -6344,9 +6318,6 @@ void zend_do_foreach_cont(znode *foreach_token, const znode *open_brackets_token fetch->opcode -= 3; /* FETCH_W -> FETCH_R */ } } - /* prevent double SWITCH_FREE */ - zend_stack_top(&CG(foreach_copy_stack), (void **) &foreach_copy); - foreach_copy->op1_type = IS_UNUSED; } GET_NODE(&value_node, opline->result); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index ada20ca3083c1..201ae49e05a68 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1392,11 +1392,6 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|CV, CONST|TMP|VAR|CV) SAVE_OPLINE(); property = GET_OP2_ZVAL_PTR(BP_VAR_R); - if (OP1_TYPE == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (IS_OP2_TMP_FREE()) { MAKE_REAL_ZVAL_PTR(property); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 2ba6bfef1d93b..74a8c12d400e4 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -14997,11 +14997,6 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HA SAVE_OPLINE(); property = opline->op2.zv; - if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (0) { MAKE_REAL_ZVAL_PTR(property); } @@ -17353,11 +17348,6 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAND SAVE_OPLINE(); property = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (1) { MAKE_REAL_ZVAL_PTR(property); } @@ -19616,11 +19606,6 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAND SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (0) { MAKE_REAL_ZVAL_PTR(property); } @@ -23081,11 +23066,6 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDL SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); - if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (0) { MAKE_REAL_ZVAL_PTR(property); } @@ -24867,11 +24847,6 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE SAVE_OPLINE(); property = opline->op2.zv; - if (IS_UNUSED == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (0) { MAKE_REAL_ZVAL_PTR(property); } @@ -26285,11 +26260,6 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_H SAVE_OPLINE(); property = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - if (IS_UNUSED == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (1) { MAKE_REAL_ZVAL_PTR(property); } @@ -27606,11 +27576,6 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_H SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - if (IS_UNUSED == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (0) { MAKE_REAL_ZVAL_PTR(property); } @@ -29349,11 +29314,6 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HA SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); - if (IS_UNUSED == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (0) { MAKE_REAL_ZVAL_PTR(property); } @@ -32493,11 +32453,6 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HAN SAVE_OPLINE(); property = opline->op2.zv; - if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (0) { MAKE_REAL_ZVAL_PTR(property); } @@ -34614,11 +34569,6 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDL SAVE_OPLINE(); property = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (1) { MAKE_REAL_ZVAL_PTR(property); } @@ -36739,11 +36689,6 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDL SAVE_OPLINE(); property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (0) { MAKE_REAL_ZVAL_PTR(property); } @@ -39917,11 +39862,6 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLE SAVE_OPLINE(); property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); - if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr); - EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr; - } - if (0) { MAKE_REAL_ZVAL_PTR(property); } From e8ae795529eff83482797dff0d1a1de7f0a84c8d Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Fri, 4 Oct 2013 16:11:49 +0200 Subject: [PATCH 203/400] such a weird hack probably helps in finding regressions in the future --- ext/standard/tests/serialize/bug65806.phpt | 83 ++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 ext/standard/tests/serialize/bug65806.phpt diff --git a/ext/standard/tests/serialize/bug65806.phpt b/ext/standard/tests/serialize/bug65806.phpt new file mode 100644 index 0000000000000..19fab95c6430d --- /dev/null +++ b/ext/standard/tests/serialize/bug65806.phpt @@ -0,0 +1,83 @@ +--TEST-- +Bug #65806 (unserialize fails with object which is referenced multiple times) +--FILE-- +_obj = $obj; + $this->_serialized = serialize($this->_obj); + } + public function get() + { + return $this->_obj; + } + public function __sleep() + { + $this->_serialized = serialize($this->_obj); + return array( + "\0" . __CLASS__ . "\0_serialized", + ); + } + public function __wakeup() + { + $this->_obj = unserialize($this->_serialized); + } +} + +echo "SCRIPT START" . PHP_EOL; + +$objA = new myObjA(); +$objB = new myObjB(); +$objC = new myObjC(); + +$objB->attrA = new ArrayIterator(); +$objB->attrB = $objA; + +$objC->attrC = $objB; +$objC->attrD = $objA; + +$list = new myList($objC); + +echo 'check ' . check($list->get()) . PHP_EOL; + +echo "start serialize/unserialize" . PHP_EOL; +$newList = unserialize(serialize($list)); +echo "finish serialize/unserialize" . PHP_EOL; + +//after unserialize the property myObjC::attrD is null instead of expected object +echo 'check ' . check($newList->get()) . PHP_EOL; + +echo "SCRIPT END" . PHP_EOL ; + +function check(myObjC $obj) { + + if (!is_object($obj->attrC)) { + return 'failed (myObjC::attrC => ' . var_export($obj->attrC, true) . ')'; + } + if (!is_object($obj->attrD)) { + return 'failed (myObjC::attrD => ' . var_export($obj->attrD, true) . ')'; + } + return 'successful'; +} +?> +--EXPECT-- +SCRIPT START +check successful +start serialize/unserialize +finish serialize/unserialize +check successful +SCRIPT END + From 8973390541faaadfdfc0f838421f037060188e5e Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Fri, 4 Oct 2013 16:16:15 +0200 Subject: [PATCH 204/400] fix bug #64146 (serialize incorrectly saving objects when they are cloned) --- ext/standard/tests/serialize/bug64146.phpt | 60 ++++++++++++++++++++++ ext/standard/var.c | 6 +-- 2 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 ext/standard/tests/serialize/bug64146.phpt diff --git a/ext/standard/tests/serialize/bug64146.phpt b/ext/standard/tests/serialize/bug64146.phpt new file mode 100644 index 0000000000000..18ae78d0cecad --- /dev/null +++ b/ext/standard/tests/serialize/bug64146.phpt @@ -0,0 +1,60 @@ +--TEST-- +Bug #64146 (serialize incorrectly saving objects when they are cloned) +--FILE-- +a[] = new B(1); + $this->a[] = new B(2); + } +} + +class B implements Serializable +{ + public $b; + + public function __construct($c) + { + $this->b = new C($c); + } + + public function serialize() + { + return serialize(clone $this->b); + } + + public function unserialize($data) + { + $this->b = unserialize($data); + } +} + +class C +{ + public $c; + + public function __construct($c) + { + $this->c = $c; + } +} + +$a = unserialize(serialize(new A())); + +print $a->a[0]->b->c . "\n"; +print $a->a[1]->b->c . "\n"; + +?> +Done +--EXPECT-- +Test +1 +2 +Done diff --git a/ext/standard/var.c b/ext/standard/var.c index f76a14cfa6641..f71c4a4fdc3e8 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -549,11 +549,9 @@ static inline int php_add_var_hash(HashTable *var_hash, zval *var, void *var_old char id[32], *p; register int len; - /* relies on "(long)" being a perfect hash function for data pointers, - * however the actual identity of an object has had to be determined - * by its object handle since 5.0. */ if ((Z_TYPE_P(var) == IS_OBJECT) && Z_OBJ_HT_P(var)->get_class_entry) { - p = smart_str_print_long(id + sizeof(id) - 1, (long) Z_OBJ_HANDLE_P(var)); + p = smart_str_print_long(id + sizeof(id) - 1, + (long) zend_objects_get_address(var TSRMLS_CC)); *(--p) = 'O'; len = id + sizeof(id) - 1 - p; } else { From 96cc419924c38874f9e2f2e5ccf3cd0430d90f43 Mon Sep 17 00:00:00 2001 From: Philip Hofstetter Date: Wed, 2 Oct 2013 08:35:02 +0200 Subject: [PATCH 205/400] Fix bug #65667: ftp_nb_continue produces segfault the idea behind ftp_nb_get is for it to be followed by multiple calls to ftp_nb_continue in order to download a file piece-by-piece. As such, it's unwise to close the stream used to write the downloaded data to when the file hasn't been completely downloaded within the first call to ftp_nb_get. This regression was added in a93a462dcefd62e07963dd2da506fbb3409c88b5 and this patch restores the behavior that was seen pre-patch. --- NEWS | 3 + ext/ftp/php_ftp.c | 4 +- ext/ftp/tests/ftp_nb_continue.phpt | 182 +++++++++++++++++++++++++++++ ext/ftp/tests/server.inc | 7 ++ 4 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 ext/ftp/tests/ftp_nb_continue.phpt diff --git a/NEWS b/NEWS index 9963714679693..7a7cecacda7f6 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,9 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2013, PHP 5.4.22 +- FTP: + . Fixed bug #65667 (ftp_nb_continue produces segfault). (Philip Hofstetter) + - Sockets: . Fixed bug #65808 (the socket_connect() won't work with IPv6 address). (Mike) diff --git a/ext/ftp/php_ftp.c b/ext/ftp/php_ftp.c index da22e0b63eb3a..21e13ea460563 100644 --- a/ext/ftp/php_ftp.c +++ b/ext/ftp/php_ftp.c @@ -968,7 +968,9 @@ PHP_FUNCTION(ftp_nb_get) RETURN_LONG(PHP_FTP_FAILED); } - php_stream_close(outstream); + if (ret == PHP_FTP_FINISHED){ + php_stream_close(outstream); + } RETURN_LONG(ret); } diff --git a/ext/ftp/tests/ftp_nb_continue.phpt b/ext/ftp/tests/ftp_nb_continue.phpt new file mode 100644 index 0000000000000..1f703399139bf --- /dev/null +++ b/ext/ftp/tests/ftp_nb_continue.phpt @@ -0,0 +1,182 @@ +--TEST-- +Testing whether ftp_nb_continue() fetches more data +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECT-- +This is line 0 of the test data. +This is line 1 of the test data. +This is line 2 of the test data. +This is line 3 of the test data. +This is line 4 of the test data. +This is line 5 of the test data. +This is line 6 of the test data. +This is line 7 of the test data. +This is line 8 of the test data. +This is line 9 of the test data. +This is line 10 of the test data. +This is line 11 of the test data. +This is line 12 of the test data. +This is line 13 of the test data. +This is line 14 of the test data. +This is line 15 of the test data. +This is line 16 of the test data. +This is line 17 of the test data. +This is line 18 of the test data. +This is line 19 of the test data. +This is line 20 of the test data. +This is line 21 of the test data. +This is line 22 of the test data. +This is line 23 of the test data. +This is line 24 of the test data. +This is line 25 of the test data. +This is line 26 of the test data. +This is line 27 of the test data. +This is line 28 of the test data. +This is line 29 of the test data. +This is line 30 of the test data. +This is line 31 of the test data. +This is line 32 of the test data. +This is line 33 of the test data. +This is line 34 of the test data. +This is line 35 of the test data. +This is line 36 of the test data. +This is line 37 of the test data. +This is line 38 of the test data. +This is line 39 of the test data. +This is line 40 of the test data. +This is line 41 of the test data. +This is line 42 of the test data. +This is line 43 of the test data. +This is line 44 of the test data. +This is line 45 of the test data. +This is line 46 of the test data. +This is line 47 of the test data. +This is line 48 of the test data. +This is line 49 of the test data. +This is line 50 of the test data. +This is line 51 of the test data. +This is line 52 of the test data. +This is line 53 of the test data. +This is line 54 of the test data. +This is line 55 of the test data. +This is line 56 of the test data. +This is line 57 of the test data. +This is line 58 of the test data. +This is line 59 of the test data. +This is line 60 of the test data. +This is line 61 of the test data. +This is line 62 of the test data. +This is line 63 of the test data. +This is line 64 of the test data. +This is line 65 of the test data. +This is line 66 of the test data. +This is line 67 of the test data. +This is line 68 of the test data. +This is line 69 of the test data. +This is line 70 of the test data. +This is line 71 of the test data. +This is line 72 of the test data. +This is line 73 of the test data. +This is line 74 of the test data. +This is line 75 of the test data. +This is line 76 of the test data. +This is line 77 of the test data. +This is line 78 of the test data. +This is line 79 of the test data. +This is line 80 of the test data. +This is line 81 of the test data. +This is line 82 of the test data. +This is line 83 of the test data. +This is line 84 of the test data. +This is line 85 of the test data. +This is line 86 of the test data. +This is line 87 of the test data. +This is line 88 of the test data. +This is line 89 of the test data. +This is line 90 of the test data. +This is line 91 of the test data. +This is line 92 of the test data. +This is line 93 of the test data. +This is line 94 of the test data. +This is line 95 of the test data. +This is line 96 of the test data. +This is line 97 of the test data. +This is line 98 of the test data. +This is line 99 of the test data. +This is line 100 of the test data. +This is line 101 of the test data. +This is line 102 of the test data. +This is line 103 of the test data. +This is line 104 of the test data. +This is line 105 of the test data. +This is line 106 of the test data. +This is line 107 of the test data. +This is line 108 of the test data. +This is line 109 of the test data. +This is line 110 of the test data. +This is line 111 of the test data. +This is line 112 of the test data. +This is line 113 of the test data. +This is line 114 of the test data. +This is line 115 of the test data. +This is line 116 of the test data. +This is line 117 of the test data. +This is line 118 of the test data. +This is line 119 of the test data. +This is line 120 of the test data. +This is line 121 of the test data. +This is line 122 of the test data. +This is line 123 of the test data. +This is line 124 of the test data. +This is line 125 of the test data. +This is line 126 of the test data. +This is line 127 of the test data. +This is line 128 of the test data. +This is line 129 of the test data. +This is line 130 of the test data. +This is line 131 of the test data. +This is line 132 of the test data. +This is line 133 of the test data. +This is line 134 of the test data. +This is line 135 of the test data. +This is line 136 of the test data. +This is line 137 of the test data. +This is line 138 of the test data. +This is line 139 of the test data. +This is line 140 of the test data. +This is line 141 of the test data. +This is line 142 of the test data. +This is line 143 of the test data. +This is line 144 of the test data. +This is line 145 of the test data. +This is line 146 of the test data. +This is line 147 of the test data. +This is line 148 of the test data. +This is line 149 of the test data. diff --git a/ext/ftp/tests/server.inc b/ext/ftp/tests/server.inc index 7dc8fa08d99ff..bb0c1ff10bec9 100644 --- a/ext/ftp/tests/server.inc +++ b/ext/ftp/tests/server.inc @@ -368,6 +368,13 @@ if ($pid) { } fputs($s, "226 Closing data Connection.\r\n"); break; + case "mediumfile": + fputs($s, "150 File status okay; about to open data connection.\r\n"); + for($i = 0; $i < 150; $i++){ + fputs($fs, "This is line $i of the test data.\n"); + } + fputs($s, "226 Closing data Connection.\r\n"); + default: fputs($s, "550 {$matches[1]}: No such file or directory \r\n"); break; From 047877e8106ef9cb53f6a32dc8b645693d59e4b0 Mon Sep 17 00:00:00 2001 From: Martin Jansen Date: Fri, 4 Oct 2013 21:55:29 +0200 Subject: [PATCH 206/400] Add unit test that covers setting the crypto method. --- ext/openssl/tests/streams_crypto_method.pem | 33 +++++++++ ext/openssl/tests/streams_crypto_method.phpt | 77 ++++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 ext/openssl/tests/streams_crypto_method.pem create mode 100644 ext/openssl/tests/streams_crypto_method.phpt diff --git a/ext/openssl/tests/streams_crypto_method.pem b/ext/openssl/tests/streams_crypto_method.pem new file mode 100644 index 0000000000000..9d754d460d57c --- /dev/null +++ b/ext/openssl/tests/streams_crypto_method.pem @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIC5jCCAk+gAwIBAgIBADANBgkqhkiG9w0BAQQFADBcMQswCQYDVQQGEwJBVTET +MBEGA1UECBMKUXVlZW5zbGFuZDEaMBgGA1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQx +HDAaBgNVBAMTE1Rlc3QgUENBICgxMDI0IGJpdCkwHhcNOTkxMjAyMjEzNTQ4WhcN +MDUwNzExMjEzNTQ4WjBcMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFu +ZDEaMBgGA1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQxHDAaBgNVBAMTE1Rlc3QgUENB +ICgxMDI0IGJpdCkwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJ2haT/f5Zwy +V+MiuSDjSR62adBoSiBB7Usty44lXqsp9RICw+DCCxpsn/CfxPEDXLLd4olsWXc6 +JRcxGynbYmnzk+Z6aIPPJQhK3CTvaqGnWKZsA1m+WaUIUqJCuNTK4N+7hMAGaf6S +S3e9HVgEQ4a34gXJ7VQFVIBNV1EnZRWHAgMBAAGjgbcwgbQwHQYDVR0OBBYEFE0R +aEcrj18q1dw+G6nJbsTWR213MIGEBgNVHSMEfTB7gBRNEWhHK49fKtXcPhupyW7E +1kdtd6FgpF4wXDELMAkGA1UEBhMCQVUxEzARBgNVBAgTClF1ZWVuc2xhbmQxGjAY +BgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMRwwGgYDVQQDExNUZXN0IFBDQSAoMTAy +NCBiaXQpggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAUa8B3pho ++Mvxeq9HsEzJxHIFQla05S5J/e/V+DQTYoKiRFchKPrDAdrzYSEvP3h4QJEtsNqQ +JfOxg5M42uLFq7aPGWkF6ZZqZsYS+zA9IVT14g7gNA6Ne+5QtJqQtH9HA24st0T0 +Tga/lZ9M2ovImovaxSL/kRHbpCWcqWVxpOw= +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQCdoWk/3+WcMlfjIrkg40ketmnQaEogQe1LLcuOJV6rKfUSAsPg +wgsabJ/wn8TxA1yy3eKJbFl3OiUXMRsp22Jp85PmemiDzyUIStwk72qhp1imbANZ +vlmlCFKiQrjUyuDfu4TABmn+kkt3vR1YBEOGt+IFye1UBVSATVdRJ2UVhwIDAQAB +AoGAba4fTtuap5l7/8ZsbE7Z1O32KJY4ZcOZukLOLUUhXxXduT+FTgGWujc0/rgc +z9qYCLlNZHOouMYTgtSfYvuMuLZ11VIt0GYH+nRioLShE59Yy+zCRyC+gPigS1kz +xvo14AsOIPYV14Tk/SsHyq6E0eTk7VzaIE197giiINUERPECQQDSKmtPTh/lRKw7 +HSZSM0I1mFWn/1zqrAbontRQY5w98QWIOe5qmzYyFbPXYT3d9BzlsMyhgiRNoBbD +yvohSHXJAkEAwAHx6ezAZeWWzD5yXD36nyjpkVCw7Tk7TSmOceLJMWt1QcrCfqlS +xA5jjpQ6Z8suU5DdtWAryM2sAir1WisYzwJAd6Zcx56jvAQ3xcPXsE6scBTVFzrj +7FqZ6E+cclPzfLQ+QQsyOBE7bpI6e/FJppY26XGZXo3YGzV8IGXrt40oOQJALETG +h86EFXo3qGOFbmsDy4pdP5nBERCu8X1xUCSfintiD4c2DInxgS5oGclnJeMcjTvL +QjQoJCX3UJCi/OUO1QJBAKgcDHWjMvt+l1pjJBsSEZ0HX9AAIIVx0RQmbFGS+F2Q +hhu5l77WnnZOQ9vvhV5u7NPCUF9nhU3jh60qWWO8mkc= +-----END RSA PRIVATE KEY----- diff --git a/ext/openssl/tests/streams_crypto_method.phpt b/ext/openssl/tests/streams_crypto_method.phpt new file mode 100644 index 0000000000000..7ac195bfb6ad9 --- /dev/null +++ b/ext/openssl/tests/streams_crypto_method.phpt @@ -0,0 +1,77 @@ +--TEST-- +Specific crypto method for ssl:// transports. +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +Hello World! From 5bc377457e155ceaddd27a536467a4d353fdcd4f Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Fri, 4 Oct 2013 15:50:16 -0700 Subject: [PATCH 207/400] Allow the ldap extension to be compiled with Oracle's LDAP implementation, if desired. Note the implementations differ so you will see different ldap behavior. The patch allows configuration similar to: --with-ldap=$HOME/instantclient --with-oci8=instantclient,$HOME/instantclient The patch doesn't support configuration similar to: --with-ldap --with-oci8=instantclient,$HOME/instantclient since this would try and mix the default LDAP and Oracle LDAP implementations. This patch closes out bug #61450 and the associated github PR. Regardless of this patch, my recommended way to install both OCI8 and ldap extensions is to statically configure PHP with ldap, and then add OCI8 as a shared extension from PECL. --- ext/ldap/config.m4 | 39 +++++++++++++++++++++++++++++++++++---- ext/ldap/ldap.c | 40 ++++++++++++++++++++-------------------- 2 files changed, 55 insertions(+), 24 deletions(-) diff --git a/ext/ldap/config.m4 b/ext/ldap/config.m4 index 3c8e23ea8e852..2804cd5968ebf 100644 --- a/ext/ldap/config.m4 +++ b/ext/ldap/config.m4 @@ -15,6 +15,28 @@ AC_DEFUN([PHP_LDAP_CHECKS], [ LDAP_DIR=$1 LDAP_INCDIR=$1/ldap/public LDAP_LIBDIR=$1/$PHP_LIBDIR + else + + dnl Find Oracle Instant Client RPM header location corresponding to the given lib path e.g. for --with-ldap=/usr/lib/oracle/12.1/client64/lib + AC_CHECK_SIZEOF(long int, 4) + if test "$ac_cv_sizeof_long_int" = "4"; then + PHP_OCI8_IC_LIBDIR_SUFFIX="" + else + PHP_OCI8_IC_LIBDIR_SUFFIX=64 + fi + OCISDKRPMINC=`echo "$1" | $SED -e 's!^/usr/lib/oracle/\(.*\)/client\('${PHP_OCI8_IC_LIBDIR_SUFFIX}'\)*/lib[/]*$!/usr/include/oracle/\1/client\2!'` + + dnl Check for Oracle Instant Client RPM install + if test -f $OCISDKRPMINC/ldap.h; then + LDAP_DIR=$1 + LDAP_INCDIR=$OCISDKRPMINC + LDAP_LIBDIR=$1 + dnl Check for Oracle Instant Client ZIP install + elif test -f $1/sdk/include/ldap.h; then + LDAP_DIR=$1 + LDAP_INCDIR=$1/sdk/include + LDAP_LIBDIR=$1 + fi fi ]) @@ -143,12 +165,21 @@ if test "$PHP_LDAP" != "no"; then PHP_ADD_LIBRARY_WITH_PATH(umich_lber, $LDAP_LIBDIR, LDAP_SHARED_LIBADD) PHP_ADD_LIBRARY_WITH_PATH(umich_ldap, $LDAP_LIBDIR, LDAP_SHARED_LIBADD) - elif test -f $LDAP_LIBDIR/libclntsh.$SHLIB_SUFFIX_NAME; then + elif test -f $LDAP_LIBDIR/libclntsh.$SHLIB_SUFFIX_NAME.12.1; then PHP_ADD_LIBRARY_WITH_PATH(clntsh, $LDAP_LIBDIR, LDAP_SHARED_LIBADD) AC_DEFINE(HAVE_ORALDAP,1,[ ]) - if test -f $LDAP_LIBDIR/libclntsh.$SHLIB_SUFFIX_NAME.10.1; then - AC_DEFINE(HAVE_ORALDAP_10,1,[ ]) - fi + AC_DEFINE(HAVE_ORALDAP_12,1,[ ]) + + elif test -f $LDAP_LIBDIR/libclntsh.$SHLIB_SUFFIX_NAME.11.1; then + PHP_ADD_LIBRARY_WITH_PATH(clntsh, $LDAP_LIBDIR, LDAP_SHARED_LIBADD) + AC_DEFINE(HAVE_ORALDAP,1,[ ]) + AC_DEFINE(HAVE_ORALDAP_11,1,[ ]) + + elif test -f $LDAP_LIBDIR/libclntsh.$SHLIB_SUFFIX_NAME; then + PHP_ADD_LIBRARY_WITH_PATH(clntsh, $LDAP_LIBDIR, LDAP_SHARED_LIBADD) + AC_DEFINE(HAVE_ORALDAP,1,[ ]) + AC_DEFINE(HAVE_ORALDAP_10,1,[ ]) + else AC_MSG_ERROR(Cannot find ldap libraries in $LDAP_LIBDIR.) fi diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c index 71d57d6d9b9ef..e95f898c156f7 100644 --- a/ext/ldap/ldap.c +++ b/ext/ldap/ldap.c @@ -152,7 +152,7 @@ PHP_MINIT_FUNCTION(ldap) REGISTER_LONG_CONSTANT("LDAP_DEREF_FINDING", LDAP_DEREF_FINDING, CONST_PERSISTENT | CONST_CS); REGISTER_LONG_CONSTANT("LDAP_DEREF_ALWAYS", LDAP_DEREF_ALWAYS, CONST_PERSISTENT | CONST_CS); -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP /* LDAP options */ REGISTER_LONG_CONSTANT("LDAP_OPT_DEREF", LDAP_OPT_DEREF, CONST_PERSISTENT | CONST_CS); REGISTER_LONG_CONSTANT("LDAP_OPT_SIZELIMIT", LDAP_OPT_SIZELIMIT, CONST_PERSISTENT | CONST_CS); @@ -361,7 +361,7 @@ PHP_FUNCTION(ldap_connect) static int _get_lderrno(LDAP *ldap) { #if !HAVE_NSLDAP -#if LDAP_API_VERSION > 2000 || HAVE_ORALDAP_10 +#if LDAP_API_VERSION > 2000 || HAVE_ORALDAP int lderr; /* New versions of OpenLDAP do it this way */ @@ -550,7 +550,7 @@ static void php_set_opts(LDAP *ldap, int sizelimit, int timelimit, int deref, in { /* sizelimit */ if (sizelimit > -1) { -#if (LDAP_API_VERSION >= 2004) || HAVE_NSLDAP || HAVE_ORALDAP_10 +#if (LDAP_API_VERSION >= 2004) || HAVE_NSLDAP || HAVE_ORALDAP ldap_get_option(ldap, LDAP_OPT_SIZELIMIT, old_sizelimit); ldap_set_option(ldap, LDAP_OPT_SIZELIMIT, &sizelimit); #else @@ -561,7 +561,7 @@ static void php_set_opts(LDAP *ldap, int sizelimit, int timelimit, int deref, in /* timelimit */ if (timelimit > -1) { -#if (LDAP_API_VERSION >= 2004) || HAVE_NSLDAP || HAVE_ORALDAP_10 +#if (LDAP_API_VERSION >= 2004) || HAVE_NSLDAP || HAVE_ORALDAP ldap_get_option(ldap, LDAP_OPT_SIZELIMIT, old_timelimit); ldap_set_option(ldap, LDAP_OPT_TIMELIMIT, &timelimit); #else @@ -572,7 +572,7 @@ static void php_set_opts(LDAP *ldap, int sizelimit, int timelimit, int deref, in /* deref */ if (deref > -1) { -#if (LDAP_API_VERSION >= 2004) || HAVE_NSLDAP || HAVE_ORALDAP_10 +#if (LDAP_API_VERSION >= 2004) || HAVE_NSLDAP || HAVE_ORALDAP ldap_get_option(ldap, LDAP_OPT_SIZELIMIT, old_deref); ldap_set_option(ldap, LDAP_OPT_DEREF, &deref); #else @@ -975,12 +975,12 @@ PHP_FUNCTION(ldap_get_entries) add_index_string(tmp1, num_attrib, attribute, 1); num_attrib++; -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP || WINDOWS ldap_memfree(attribute); #endif attribute = ldap_next_attribute(ldap, ldap_result_entry, ber); } -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP || WINDOWS if (ber != NULL) { ber_free(ber, 0); } @@ -989,7 +989,7 @@ PHP_FUNCTION(ldap_get_entries) add_assoc_long(tmp1, "count", num_attrib); dn = ldap_get_dn(ldap, ldap_result_entry); add_assoc_string(tmp1, "dn", dn, 1); -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP || WINDOWS ldap_memfree(dn); #else free(dn); @@ -1027,7 +1027,7 @@ PHP_FUNCTION(ldap_first_attribute) RETURN_FALSE; } else { RETVAL_STRING(attribute, 1); -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP || WINDOWS ldap_memfree(attribute); #endif } @@ -1057,7 +1057,7 @@ PHP_FUNCTION(ldap_next_attribute) } if ((attribute = ldap_next_attribute(ld->link, resultentry->data, resultentry->ber)) == NULL) { -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP || WINDOWS if (resultentry->ber != NULL) { ber_free(resultentry->ber, 0); resultentry->ber = NULL; @@ -1066,7 +1066,7 @@ PHP_FUNCTION(ldap_next_attribute) RETURN_FALSE; } else { RETVAL_STRING(attribute, 1); -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP || WINDOWS ldap_memfree(attribute); #endif } @@ -1113,12 +1113,12 @@ PHP_FUNCTION(ldap_get_attributes) add_index_string(return_value, num_attrib, attribute, 1); num_attrib++; -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP || WINDOWS ldap_memfree(attribute); #endif attribute = ldap_next_attribute(ld->link, resultentry->data, ber); } -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP || WINDOWS if (ber != NULL) { ber_free(ber, 0); } @@ -1183,7 +1183,7 @@ PHP_FUNCTION(ldap_get_dn) text = ldap_get_dn(ld->link, resultentry->data); if (text != NULL) { RETVAL_STRING(text, 1); -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP || WINDOWS ldap_memfree(text); #else free(text); @@ -1241,7 +1241,7 @@ PHP_FUNCTION(ldap_dn2ufn) if (ufn != NULL) { RETVAL_STRING(ufn, 1); -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP || WINDOWS ldap_memfree(ufn); #endif } else { @@ -1546,7 +1546,7 @@ PHP_FUNCTION(ldap_sort) } /* }}} */ -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP /* {{{ proto bool ldap_get_option(resource link, int option, mixed retval) Get the current value of various session-wide parameters */ PHP_FUNCTION(ldap_get_option) @@ -2003,7 +2003,7 @@ PHP_FUNCTION(ldap_rename) newparent = NULL; } -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP rc = ldap_rename_s(ld->link, dn, newrdn, newparent, deleteoldrdn, NULL, NULL); #else if (newparent_len != 0) { @@ -2047,7 +2047,7 @@ PHP_FUNCTION(ldap_start_tls) } /* }}} */ #endif -#endif /* (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 */ +#endif /* (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP */ #if defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC) /* {{{ _ldap_rebind_proc() @@ -2567,7 +2567,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_control_paged_result_response, 0, 0, 2) ZEND_END_ARG_INFO(); #endif -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_rename, 0, 0, 5) ZEND_ARG_INFO(0, link_identifier) ZEND_ARG_INFO(0, dn) @@ -2683,7 +2683,7 @@ const zend_function_entry ldap_functions[] = { PHP_FE(ldap_compare, arginfo_ldap_compare) PHP_FE(ldap_sort, arginfo_ldap_sort) -#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP PHP_FE(ldap_rename, arginfo_ldap_rename) PHP_FE(ldap_get_option, arginfo_ldap_get_option) PHP_FE(ldap_set_option, arginfo_ldap_set_option) From 248afd1c3c0c923c15d7544b4a588396ad0c136e Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 5 Oct 2013 12:52:32 -0300 Subject: [PATCH 208/400] - BFN --- NEWS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NEWS b/NEWS index 7a7cecacda7f6..fcf34c3fb9ec9 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2013, PHP 5.4.22 +- CLI server: + . Fixed bug #65818 (Segfault with built-in webserver and chunked transfer + encoding). (Felipe) + - FTP: . Fixed bug #65667 (ftp_nb_continue produces segfault). (Philip Hofstetter) From 3aaee86ee33af276d2e879f5a645cc6dc850de22 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 5 Oct 2013 12:52:55 -0300 Subject: [PATCH 209/400] - Fixed bug #65818 (Segfault with built-in webserver and chunked transfer encoding) --- sapi/cli/php_cli_server.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c index 4da55acc6c2bc..aa4b2cd622116 100644 --- a/sapi/cli/php_cli_server.c +++ b/sapi/cli/php_cli_server.c @@ -1589,6 +1589,7 @@ static int php_cli_server_client_read_request_on_body(php_http_parser *parser, c } client->request.content_len = 0; } + client->request.content = perealloc(client->request.content, client->request.content_len + length, 1); memmove(client->request.content + client->request.content_len, at, length); client->request.content_len += length; return 0; From 690bbe170d9ed4597629e4e986575fbe0a2cb796 Mon Sep 17 00:00:00 2001 From: Stanley Sufficool Date: Sat, 5 Oct 2013 09:54:45 -0700 Subject: [PATCH 210/400] FIX BUG #65219 - USE DB not being sent for FreeTDS version < 0.92 FreeTDS <0.92 does not support DBSETLDBNAME option and therefore will not work with SQL Azure. Fallback to dbuse command in letter versions. --- ext/pdo_dblib/dblib_driver.c | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/ext/pdo_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c index 2aaf3975db18e..13444b89c3db6 100644 --- a/ext/pdo_dblib/dblib_driver.c +++ b/ext/pdo_dblib/dblib_driver.c @@ -350,9 +350,10 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ DBSETLAPP(H->login, vars[1].optval); +/* DBSETLDBNAME is only available in FreeTDS 0.92 or above */ #ifdef DBSETLDBNAME if (vars[3].optval) { - DBSETLDBNAME(H->login, vars[3].optval); + if(FAIL == DBSETLDBNAME(H->login, vars[3].optval)) goto cleanup; } #endif @@ -362,6 +363,16 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ goto cleanup; } +/* + * FreeTDS < 0.92 does not support the DBSETLDBNAME option + * Send use database here after login (Will not work with SQL Azure) + */ +#ifndef DBSETLDBNAME + if (vars[3].optval) { + if(FAIL == dbuse(H->link, vars[3].optval)) goto gleanup; + } +#endif + #if PHP_DBLIB_IS_MSSQL /* dblib do not return more than this length from text/image */ DBSETOPT(H->link, DBTEXTLIMIT, "2147483647"); @@ -377,23 +388,6 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ dbh->max_escaped_char_length = 2; dbh->alloc_own_columns = 1; -#if 0 - /* Cache the supported data types from the servers systypes table */ - if(dbcmd(H->link, "select usertype, name from systypes order by usertype") != FAIL) { - if(dbsqlexec(H->link) != FAIL) { - dbresults(H->link); - while (dbnextrow(H->link) == SUCCESS) { - val = dbdata(H->link, 1); - add_index_string(pdo_dblib_datatypes, *val, dbdata(H->link, 2), 1); - } - } - /* Throw out any remaining resultsets */ - dbcancel(H-link); - } -#endif - - - cleanup: for (i = 0; i < nvars; i++) { if (vars[i].freeme) { From 5ce23f39d51b1fc53a731d9fd7d419714d3de9fb Mon Sep 17 00:00:00 2001 From: Stanley Sufficool Date: Sat, 5 Oct 2013 09:54:45 -0700 Subject: [PATCH 211/400] FIX BUG #65219 - USE DB not being sent for FreeTDS version < 0.92 FreeTDS <0.92 does not support DBSETLDBNAME option and therefore will not work with SQL Azure. Fallback to dbuse command in letter versions. --- ext/pdo_dblib/dblib_driver.c | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/ext/pdo_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c index 2aaf3975db18e..13444b89c3db6 100644 --- a/ext/pdo_dblib/dblib_driver.c +++ b/ext/pdo_dblib/dblib_driver.c @@ -350,9 +350,10 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ DBSETLAPP(H->login, vars[1].optval); +/* DBSETLDBNAME is only available in FreeTDS 0.92 or above */ #ifdef DBSETLDBNAME if (vars[3].optval) { - DBSETLDBNAME(H->login, vars[3].optval); + if(FAIL == DBSETLDBNAME(H->login, vars[3].optval)) goto cleanup; } #endif @@ -362,6 +363,16 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ goto cleanup; } +/* + * FreeTDS < 0.92 does not support the DBSETLDBNAME option + * Send use database here after login (Will not work with SQL Azure) + */ +#ifndef DBSETLDBNAME + if (vars[3].optval) { + if(FAIL == dbuse(H->link, vars[3].optval)) goto gleanup; + } +#endif + #if PHP_DBLIB_IS_MSSQL /* dblib do not return more than this length from text/image */ DBSETOPT(H->link, DBTEXTLIMIT, "2147483647"); @@ -377,23 +388,6 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ dbh->max_escaped_char_length = 2; dbh->alloc_own_columns = 1; -#if 0 - /* Cache the supported data types from the servers systypes table */ - if(dbcmd(H->link, "select usertype, name from systypes order by usertype") != FAIL) { - if(dbsqlexec(H->link) != FAIL) { - dbresults(H->link); - while (dbnextrow(H->link) == SUCCESS) { - val = dbdata(H->link, 1); - add_index_string(pdo_dblib_datatypes, *val, dbdata(H->link, 2), 1); - } - } - /* Throw out any remaining resultsets */ - dbcancel(H-link); - } -#endif - - - cleanup: for (i = 0; i < nvars; i++) { if (vars[i].freeme) { From 9c7dbb0487f5991fde03873ea8f5e66d6688415f Mon Sep 17 00:00:00 2001 From: Stanley Sufficool Date: Sat, 5 Oct 2013 18:26:25 -0700 Subject: [PATCH 212/400] Fix bug #64338 pdo_dblib can't connect to Azure SQL --- ext/pdo_dblib/dblib_driver.c | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/ext/pdo_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c index 8e4cbb7a486fc..daf5494d5839f 100644 --- a/ext/pdo_dblib/dblib_driver.c +++ b/ext/pdo_dblib/dblib_driver.c @@ -350,9 +350,10 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ DBSETLAPP(H->login, vars[1].optval); +/* DBSETLDBNAME is only available in FreeTDS 0.92 or above */ #ifdef DBSETLDBNAME if (vars[3].optval) { - DBSETLDBNAME(H->login, vars[3].optval); + if(FAIL == DBSETLDBNAME(H->login, vars[3].optval)) goto cleanup; } #endif @@ -362,6 +363,16 @@ static int pdo_dblib_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_ goto cleanup; } +/* + * FreeTDS < 0.92 does not support the DBSETLDBNAME option + * Send use database here after login (Will not work with SQL Azure) + */ +#ifndef DBSETLDBNAME + if (vars[3].optval) { + if(FAIL == dbuse(H->link, vars[3].optval)) goto cleanup; + } +#endif + #if PHP_DBLIB_IS_MSSQL /* dblib do not return more than this length from text/image */ DBSETOPT(H->link, DBTEXTLIMIT, "2147483647"); @@ -371,29 +382,12 @@ 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, NULL); + DBSETOPT(H->link, DBQUOTEDIDENT, "1"); ret = 1; dbh->max_escaped_char_length = 2; dbh->alloc_own_columns = 1; -#if 0 - /* Cache the supported data types from the servers systypes table */ - if(dbcmd(H->link, "select usertype, name from systypes order by usertype") != FAIL) { - if(dbsqlexec(H->link) != FAIL) { - dbresults(H->link); - while (dbnextrow(H->link) == SUCCESS) { - val = dbdata(H->link, 1); - add_index_string(pdo_dblib_datatypes, *val, dbdata(H->link, 2), 1); - } - } - /* Throw out any remaining resultsets */ - dbcancel(H-link); - } -#endif - - - cleanup: for (i = 0; i < nvars; i++) { if (vars[i].freeme) { From 63f242178d33fa22346d2e976b06a76455dbd6ab Mon Sep 17 00:00:00 2001 From: Stanley Sufficool Date: Sat, 5 Oct 2013 20:59:20 -0700 Subject: [PATCH 213/400] FIX BUG #65219 - Typo correction --- ext/pdo_dblib/dblib_driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/pdo_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c index 13444b89c3db6..daf5494d5839f 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_ */ #ifndef DBSETLDBNAME if (vars[3].optval) { - if(FAIL == dbuse(H->link, vars[3].optval)) goto gleanup; + if(FAIL == dbuse(H->link, vars[3].optval)) goto cleanup; } #endif From fa40290fb76370c923e8f048daf1af144ff87604 Mon Sep 17 00:00:00 2001 From: Stanley Sufficool Date: Sat, 5 Oct 2013 21:00:47 -0700 Subject: [PATCH 214/400] FIX BUG #65219 - Typo correction --- ext/pdo_dblib/dblib_driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/pdo_dblib/dblib_driver.c b/ext/pdo_dblib/dblib_driver.c index 13444b89c3db6..daf5494d5839f 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_ */ #ifndef DBSETLDBNAME if (vars[3].optval) { - if(FAIL == dbuse(H->link, vars[3].optval)) goto gleanup; + if(FAIL == dbuse(H->link, vars[3].optval)) goto cleanup; } #endif From b5a0f128718d93a236b450bb9b409477f0a97888 Mon Sep 17 00:00:00 2001 From: ArunSK Date: Mon, 7 Oct 2013 00:26:49 +0200 Subject: [PATCH 215/400] fixing a minor typo in CODING_STANDARDS document --- CODING_STANDARDS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODING_STANDARDS b/CODING_STANDARDS index 7413be453ca6b..5ceacdc4dce55 100644 --- a/CODING_STANDARDS +++ b/CODING_STANDARDS @@ -151,7 +151,7 @@ Naming Conventions 7. Classes should be given descriptive names. Avoid using abbreviations where possible. Each word in the class name should start with a capital letter, - without underscore delimiters (CampelCaps starting with a capital letter). + without underscore delimiters (CamelCaps starting with a capital letter). The class name should be prefixed with the name of the 'parent set' (e.g. the name of the extension):: From 955bc1d91bd772cbb782830220048511b657f063 Mon Sep 17 00:00:00 2001 From: datibbaw Date: Mon, 7 Oct 2013 15:38:48 +0800 Subject: [PATCH 216/400] Using SUCCESS and FAILURE for return values Using zend_bool for boolean arguments and return values Reduced one level of zval indirection where possible --- ext/openssl/openssl.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index c208d439d6232..d963f86af9ecb 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1672,18 +1672,18 @@ PHP_FUNCTION(openssl_x509_export) } /* }}} */ -static int php_openssl_x509_fingerprint(X509 *peer, const char *method, int raw, char **out, int *out_len) +static int php_openssl_x509_fingerprint(X509 *peer, const char *method, zend_bool raw, char **out, int *out_len) { unsigned char md[EVP_MAX_MD_SIZE]; const EVP_MD *mdtype; int n; if (!(mdtype = EVP_get_digestbyname(method))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "`%s`: Unknown signature algorithm", method); - return 0; + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown signature algorithm"); + return FAILURE; } else if (!X509_digest(peer, mdtype, md, &n)) { php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not generate signature"); - return 0; + return FAILURE; } if (raw) { @@ -1696,7 +1696,7 @@ static int php_openssl_x509_fingerprint(X509 *peer, const char *method, int raw, make_digest_ex(*out, md, n); } - return 1; + return SUCCESS; } static int php_x509_fingerprint_cmp(X509 *peer, const char *method, const char *expected) @@ -1705,7 +1705,7 @@ static int php_x509_fingerprint_cmp(X509 *peer, const char *method, const char * int fingerprint_len; int result = -1; - if (php_openssl_x509_fingerprint(peer, method, 0, &fingerprint, &fingerprint_len)) { + if (php_openssl_x509_fingerprint(peer, method, 0, &fingerprint, &fingerprint_len) == SUCCESS) { result = strcmp(expected, fingerprint); efree(fingerprint); } @@ -1713,12 +1713,12 @@ static int php_x509_fingerprint_cmp(X509 *peer, const char *method, const char * return result; } -static int php_x509_fingerprint_match(X509 *peer, zval **val) +static zend_bool php_x509_fingerprint_match(X509 *peer, zval *val) { - if (Z_TYPE_PP(val) == IS_STRING) { + if (Z_TYPE_P(val) == IS_STRING) { const char *method = NULL; - switch (Z_STRLEN_PP(val)) { + switch (Z_STRLEN_P(val)) { case 32: method = "md5"; break; @@ -1728,19 +1728,19 @@ static int php_x509_fingerprint_match(X509 *peer, zval **val) break; } - return method && php_x509_fingerprint_cmp(peer, method, Z_STRVAL_PP(val)) == 0; - } else if (Z_TYPE_PP(val) == IS_ARRAY) { + return method && php_x509_fingerprint_cmp(peer, method, Z_STRVAL_P(val)) == 0; + } else if (Z_TYPE_P(val) == IS_ARRAY) { HashPosition pos; zval **current; char *key; uint key_len; ulong key_index; - for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL_PP(val), &pos); - zend_hash_get_current_data_ex(Z_ARRVAL_PP(val), (void **)¤t, &pos) == SUCCESS; - zend_hash_move_forward_ex(Z_ARRVAL_PP(val), &pos) + for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(val), &pos); + zend_hash_get_current_data_ex(Z_ARRVAL_P(val), (void **)¤t, &pos) == SUCCESS; + zend_hash_move_forward_ex(Z_ARRVAL_P(val), &pos) ) { - int key_type = zend_hash_get_current_key_ex(Z_ARRVAL_PP(val), &key, &key_len, &key_index, 0, &pos); + int key_type = zend_hash_get_current_key_ex(Z_ARRVAL_P(val), &key, &key_len, &key_index, 0, &pos); if (key_type == HASH_KEY_IS_STRING && Z_TYPE_PP(current) == IS_STRING @@ -1776,7 +1776,7 @@ PHP_FUNCTION(openssl_x509_fingerprint) RETURN_FALSE; } - if (php_openssl_x509_fingerprint(cert, method, raw_output, &fingerprint, &fingerprint_len)) { + if (php_openssl_x509_fingerprint(cert, method, raw_output, &fingerprint, &fingerprint_len) == SUCCESS) { RETVAL_STRINGL(fingerprint, fingerprint_len, 0); } else { RETVAL_FALSE; @@ -4989,7 +4989,7 @@ int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stre if (GET_VER_OPT("peer_fingerprint")) { if (Z_TYPE_PP(val) == IS_STRING || Z_TYPE_PP(val) == IS_ARRAY) { - if (!php_x509_fingerprint_match(peer, val)) { + if (!php_x509_fingerprint_match(peer, *val)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer fingerprint doesn't match"); return FAILURE; } From 4840b0a749454335218f6131892031333d66142d Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Mon, 7 Oct 2013 13:49:10 +0200 Subject: [PATCH 217/400] fixed failing tests for ICU >= 51.2 --- ext/intl/tests/bug58756_MessageFormatter.phpt | 5 ++++- ext/intl/tests/collator_asort.phpt | 1 + ext/intl/tests/collator_compare.phpt | 1 + ext/intl/tests/collator_get_sort_key.phpt | 4 +++- ext/intl/tests/collator_sort.phpt | 1 + ext/intl/tests/collator_sort_with_sort_keys.phpt | 1 + ext/intl/tests/dateformat_calendars.phpt | 4 ++-- ext/intl/tests/dateformat_create_cal_arg.phpt | 4 ++-- ext/intl/tests/dateformat_format.phpt | 1 + ext/intl/tests/dateformat_formatObject_calendar.phpt | 4 ++-- ext/intl/tests/dateformat_formatObject_datetime.phpt | 4 ++-- ext/intl/tests/dateformat_format_parse.phpt | 1 + ext/intl/tests/dateformat_get_set_calendar.phpt | 4 ++-- ext/intl/tests/dateformat_get_set_timezone.phpt | 4 ++-- ext/intl/tests/dateformat_set_timezone_id2.phpt | 1 + .../tests/dateformat_timezone_arg_variations.phpt | 4 ++-- ext/intl/tests/formatter_get_locale.phpt | 1 + ext/intl/tests/locale_filter_matches2.phpt | 3 ++- ext/intl/tests/locale_get_display_name2.phpt | 3 ++- ext/intl/tests/locale_get_display_region2.phpt | 3 ++- ext/intl/tests/locale_lookup.phpt | 1 + ext/intl/tests/msgfmt_format_intlcalendar.phpt | 6 +++--- .../tests/resourcebundle_null_mandatory_args.phpt | 8 +++----- .../tests/timezone_getDisplayName_variant2-49+.phpt | 12 +++++------- 24 files changed, 47 insertions(+), 34 deletions(-) diff --git a/ext/intl/tests/bug58756_MessageFormatter.phpt b/ext/intl/tests/bug58756_MessageFormatter.phpt index bbe96b7045a10..18566b666c9c4 100644 --- a/ext/intl/tests/bug58756_MessageFormatter.phpt +++ b/ext/intl/tests/bug58756_MessageFormatter.phpt @@ -4,6 +4,9 @@ Bug #58756: w.r.t MessageFormatter = 0) + die('skip for ICU < 51.2'); +?> --FILE-- format(array($time, 'date')), " ", --EXPECT-- date: Tuesday, July 7, 2009 8:41:13 PM EDT msgf: Tuesday, July 7, 2009 8:41:13 PM EDT -==DONE== \ No newline at end of file +==DONE== diff --git a/ext/intl/tests/collator_asort.phpt b/ext/intl/tests/collator_asort.phpt index a614ddc3f88e2..308f3a3ca3742 100644 --- a/ext/intl/tests/collator_asort.phpt +++ b/ext/intl/tests/collator_asort.phpt @@ -2,6 +2,7 @@ asort() --SKIPIF-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- = 4.8 only'; ?> += 4.8 and < 51.2 */ +if (version_compare(INTL_ICU_VERSION, '51.2') >= 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- = 4.8 +locale_filter_matches.phpt() icu >= 4.8 && icu < 51.2 --SKIPIF-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- = 4.8 +locale_get_display_name() icu >= 4.8 && icu < 51.2 --SKIPIF-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- = 4.8 +locale_get_display_region() icu >= 4.8 && icu < 51.2 --SKIPIF-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- += 0) die('skip for ICU < 51.2'); ?> --FILE-- format(array($time, 'date')), " ", ==DONE== --EXPECT-- Quinta-feira, 17 de Maio de 2012 5:35:36 p.m. WEST -==DONE== \ No newline at end of file +==DONE== diff --git a/ext/intl/tests/resourcebundle_null_mandatory_args.phpt b/ext/intl/tests/resourcebundle_null_mandatory_args.phpt index 17fab6d630a5e..bbbc1b1e91ce2 100644 --- a/ext/intl/tests/resourcebundle_null_mandatory_args.phpt +++ b/ext/intl/tests/resourcebundle_null_mandatory_args.phpt @@ -3,11 +3,9 @@ ResourceBundle constructor bundle accepts NULL for first two arguments --INI-- date.timezone=Atlantic/Azores --SKIPIF-- -= 4.8 only'); + += 4.8 only'); ?> += 0) die('skip for ICU < 51.2'); ?> --FILE-- = 49) +IntlTimeZone::getDisplayName(): type parameter (ICU >= 49 && ICU < 51.2) --SKIPIF-- - + += 0) die('skip for ICU < 51.2'); ?> --FILE-- Date: Mon, 7 Oct 2013 13:49:55 +0200 Subject: [PATCH 218/400] added fixed tests for ICU >= 51.2 --- .../bug58756_MessageFormatter_variant2.phpt | 37 ++ ext/intl/tests/collator_asort_variant2.phpt | 243 ++++++++++ ext/intl/tests/collator_compare_variant2.phpt | 135 ++++++ .../tests/collator_get_sort_key_variant2.phpt | 98 ++++ ext/intl/tests/collator_sort_variant2.phpt | 248 ++++++++++ ...collator_sort_with_sort_keys_variant2.phpt | 190 ++++++++ .../tests/dateformat_calendars_variant2.phpt | 45 ++ .../dateformat_create_cal_arg_variant2.phpt | 53 +++ ...format_formatObject_calendar_variant2.phpt | 40 ++ ...format_formatObject_datetime_variant2.phpt | 33 ++ .../dateformat_format_parse_version2.phpt | 295 ++++++++++++ .../tests/dateformat_format_variant2.phpt | 423 ++++++++++++++++++ .../dateformat_get_set_calendar_variant2.phpt | 55 +++ .../dateformat_get_set_timezone_variant2.phpt | 62 +++ .../tests/dateformat_set_timezone_id3.phpt | 85 ++++ .../dateformat_timezone_arg_variations2.phpt | 45 ++ .../tests/formatter_get_locale_variant2.phpt | 50 +++ ext/intl/tests/locale_filter_matches3.phpt | 366 +++++++++++++++ ext/intl/tests/locale_get_display_name3.phpt | 342 ++++++++++++++ .../tests/locale_get_display_region3.phpt | 275 ++++++++++++ ext/intl/tests/locale_lookup_variant2.phpt | 100 +++++ .../msgfmt_format_intlcalendar_variant2.phpt | 30 ++ ...cebundle_null_mandatory_args_variant2.phpt | 26 ++ .../timezone_getDisplayName_variant4.phpt | 35 ++ 24 files changed, 3311 insertions(+) create mode 100644 ext/intl/tests/bug58756_MessageFormatter_variant2.phpt create mode 100644 ext/intl/tests/collator_asort_variant2.phpt create mode 100644 ext/intl/tests/collator_compare_variant2.phpt create mode 100644 ext/intl/tests/collator_get_sort_key_variant2.phpt create mode 100644 ext/intl/tests/collator_sort_variant2.phpt create mode 100644 ext/intl/tests/collator_sort_with_sort_keys_variant2.phpt create mode 100644 ext/intl/tests/dateformat_calendars_variant2.phpt create mode 100644 ext/intl/tests/dateformat_create_cal_arg_variant2.phpt create mode 100644 ext/intl/tests/dateformat_formatObject_calendar_variant2.phpt create mode 100644 ext/intl/tests/dateformat_formatObject_datetime_variant2.phpt create mode 100644 ext/intl/tests/dateformat_format_parse_version2.phpt create mode 100644 ext/intl/tests/dateformat_format_variant2.phpt create mode 100644 ext/intl/tests/dateformat_get_set_calendar_variant2.phpt create mode 100644 ext/intl/tests/dateformat_get_set_timezone_variant2.phpt create mode 100644 ext/intl/tests/dateformat_set_timezone_id3.phpt create mode 100644 ext/intl/tests/dateformat_timezone_arg_variations2.phpt create mode 100644 ext/intl/tests/formatter_get_locale_variant2.phpt create mode 100644 ext/intl/tests/locale_filter_matches3.phpt create mode 100644 ext/intl/tests/locale_get_display_name3.phpt create mode 100644 ext/intl/tests/locale_get_display_region3.phpt create mode 100644 ext/intl/tests/locale_lookup_variant2.phpt create mode 100644 ext/intl/tests/msgfmt_format_intlcalendar_variant2.phpt create mode 100644 ext/intl/tests/resourcebundle_null_mandatory_args_variant2.phpt create mode 100644 ext/intl/tests/timezone_getDisplayName_variant4.phpt diff --git a/ext/intl/tests/bug58756_MessageFormatter_variant2.phpt b/ext/intl/tests/bug58756_MessageFormatter_variant2.phpt new file mode 100644 index 0000000000000..4fcfdbc08c073 --- /dev/null +++ b/ext/intl/tests/bug58756_MessageFormatter_variant2.phpt @@ -0,0 +1,37 @@ +--TEST-- +Bug #58756: w.r.t MessageFormatter +--SKIPIF-- += 51.2'); +?> +--FILE-- +format(array($time)) . "\n"; + +//NOT FIXED: +/*$msgf = new MessageFormatter('en_US', +'{1, select, date {{0,date,full}} other {{0,time,h:m:s a V}}}'); + +echo "msgf2: ", $msgf->format(array($time, 'date')), " ", + $msgf->format(array($time, 'time')), "\n"; +*/ + +?> +==DONE== +--EXPECT-- +date: Tuesday, July 7, 2009 8:41:13 PM EDT +msgf: Tuesday, July 7, 2009 8:41:13 PM usnyc +==DONE== diff --git a/ext/intl/tests/collator_asort_variant2.phpt b/ext/intl/tests/collator_asort_variant2.phpt new file mode 100644 index 0000000000000..f9dff136083f7 --- /dev/null +++ b/ext/intl/tests/collator_asort_variant2.phpt @@ -0,0 +1,243 @@ +--TEST-- +asort() +--SKIPIF-- + += 51.2'); ?> +--FILE-- + 'y' , + 'c' => 'i' , + 'a' => 'k' ), + + array( 'a' => 'a' , + 'b' => 'aaa', + 'c' => 'aa' ), + + array( 'a' => 'a' , + 'aaa'=> 'a' , + 'aa' => 'a' ), + + array( '1' => 'abc', + '5' => '!' , + '2' => null , + '7' => '' ), + + array( '1' => '100', + '2' => '25' , + '3' => '36' ), + + array( '1' => 5 , + '2' => '30' , + '3' => 2 ) + ); + + $res_str .= sort_arrays( 'en_US', $test_params ); + + // Sort an array in SORT_STRING mode using en_US locale. + $test_params = array( + array( '1' => '100', + '2' => '25' , + '3' => '36' ), + + array( '1' => 5 , + '2' => '30' , + '3' => 2 ), + + array( '1' => 'd' , + '2' => '' , + '3' => ' a' ), + + array( '1' => 'y' , + '2' => 'k' , + '3' => 'i' ) + ); + + $res_str .= sort_arrays( 'en_US', $test_params, Collator::SORT_STRING ); + + // Sort a non-ASCII array using ru_RU locale. + $test_params = array( + array( 'п' => 'у', + 'б' => 'в', + 'е' => 'а' ), + + array( '1' => 'п', + '4' => '', + '7' => 'd', + '2' => 'пп' ) + ); + + $res_str .= sort_arrays( 'ru_RU', $test_params ); + + + // Sort an array using Lithuanian locale. + $test_params = array( + array( 'd' => 'y', + 'c' => 'i', + 'a' => 'k' ) + ); + + $res_str .= sort_arrays( 'lt_LT', $test_params ); + + return $res_str . "\n"; +} + +include_once( 'ut_common.inc' ); +ut_run(); +?> +--EXPECT-- +Test 1.162b81ac12878b817fc39063097e45b5: +array ( + 'c' => 'i', + 'a' => 'k', + 'd' => 'y', +) + Result: true + +Test 2.93d96e22f692d8a281b0a389f01f8d1e: +array ( + 'a' => 'a', + 'c' => 'aa', + 'b' => 'aaa', +) + Result: true + +Test 3.9f25de4482bc7b58de508e278113317c: +array ( + 'aa' => 'a', + 'aaa' => 'a', + 'a' => 'a', +) + Result: true + +Test 4.a85a41ea78e45b651080cfd98c0b431d: +array ( + 7 => '', + 2 => NULL, + 5 => '!', + 1 => 'abc', +) + Result: true + +Test 5.99dc71f405b286e03d489061b36e6900: +array ( + 2 => '25', + 3 => '36', + 1 => '100', +) + Result: true + +Test 6.bf5bba243307c9d12934e756ad4be190: +array ( + 3 => 2, + 1 => 5, + 2 => '30', +) + Result: true + +Test 7.e4ee7024c61476e9e7a6c28b5e47df6f: +array ( + 1 => '100', + 2 => '25', + 3 => '36', +) + Result: true + +Test 8.5fa7033dd43784be0db1474eb48b83c8: +array ( + 3 => 2, + 2 => '30', + 1 => 5, +) + Result: true + +Test 9.588cdf4692bc09aa92ffe7e48f9e4579: +array ( + 2 => '', + 3 => ' a', + 1 => 'd', +) + Result: true + +Test 10.be02641a47ebcccd23e4183ca3a415f7: +array ( + 3 => 'i', + 2 => 'k', + 1 => 'y', +) + Result: true + +Test 11.153d9b11d1e5936afc917a94a4e11f34: +array ( + 'е' => 'а', + 'б' => 'в', + 'п' => 'у', +) + Result: true + +Test 12.e1f5cb037b564dce39ffbd0a61562d59: +array ( + 4 => '', + 1 => 'п', + 2 => 'пп', + 7 => 'd', +) + Result: true + +Test 13.8800d48abb960a59002eef77f1d73ae0: +array ( + 'c' => 'i', + 'd' => 'y', + 'a' => 'k', +) + Result: true diff --git a/ext/intl/tests/collator_compare_variant2.phpt b/ext/intl/tests/collator_compare_variant2.phpt new file mode 100644 index 0000000000000..15c725bc4fb5f --- /dev/null +++ b/ext/intl/tests/collator_compare_variant2.phpt @@ -0,0 +1,135 @@ +--TEST-- +compare() +--SKIPIF-- + += 51.2'); ?> +--FILE-- +'; + case -1: // UCOL_LESS + return '<'; + default: + return '?'; + } +} + +/* + * Compare string pairs in the given array + * using specified locale. + */ +function compare_pairs( $locale, $test_array ) +{ + $res_str = ''; + + $coll = ut_coll_create( $locale ); + + foreach( $test_array as $test_strings ) + { + list( $str1, $str2 ) = $test_strings; + + // Compare strings. + $res_val = cmp_to_char( ut_coll_compare( $coll, $str1, $str2 ) ); + + // Concatenate result strings. + $res_str .= dump( $str1 ) . + ' ' . $res_val . ' ' . + dump( $str2 ) . "\n"; + } + + return $res_str; + +} + +function ut_main() +{ + $res_str = ''; + + // Compare strings using en_US locale. + $test_params = array( + array( 'abc', 'abc' ), + array( 'Abc', 'abc' ), + array( 'a' , 'abc' ), + array( 'a' , '' ), + array( '' , '' ), + array( 'a' , 'b' ), + array( 'ab' , 'b' ), + array( 'ab' , 'a' ), + array( 123 , 'abc' ), + array( 'ac' , null ), + array( '.' , '.' ), + // Try to compare long strings. + array( 'abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcde', + 'abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdea'), + array( null , null ) + ); + + $res_str .= compare_pairs( 'en_US', $test_params ); + + + // Compare strings using ru_RU locale. + $test_params = array( + array( 'а', 'б' ), + array( 'а', 'аа' ), + array( 'аб', 'ба' ), + array( 'а', ',' ), + array( 'а', 'b' ), + array( 'а', 'bb' ), + array( 'а', 'ab' ), + array( 'а', null ) + ); + + $res_str .= compare_pairs( 'ru_RU', $test_params ); + + + // Compare strings using lt_LT locale. + $test_params = array( + array( 'y', 'k' ) + ); + + $res_str .= compare_pairs( 'lt_LT', $test_params ); + + return $res_str; +} + +include_once( 'ut_common.inc' ); +ut_run(); +?> +--EXPECT-- +'abc' = 'abc' +'Abc' > 'abc' +'a' < 'abc' +'a' > '' +'' = '' +'a' < 'b' +'ab' < 'b' +'ab' > 'a' +123 < 'abc' +'ac' > NULL +'.' = '.' +'abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcde' < 'abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdea' +NULL = NULL +'а' < 'б' +'а' < 'аа' +'аб' < 'ба' +'а' > ',' +'а' < 'b' +'а' < 'bb' +'а' < 'ab' +'а' > NULL +'y' < 'k' diff --git a/ext/intl/tests/collator_get_sort_key_variant2.phpt b/ext/intl/tests/collator_get_sort_key_variant2.phpt new file mode 100644 index 0000000000000..bb09256d6bdae --- /dev/null +++ b/ext/intl/tests/collator_get_sort_key_variant2.phpt @@ -0,0 +1,98 @@ +--TEST-- +collator_get_sort_key() +--SKIPIF-- + += 51.2'); ?> +--FILE-- + +--EXPECT-- +source: abc +key: 27292b01070107 +source: abd +key: 27292d01070107 +source: aaa +key: 27272701070107 +source: аа +key: 5c0a0a01060106 +source: а +key: 5c0a01050105 +source: z +key: 5901050105 +source: +key: 0101 +source: +key: 0101 +source: 3 +key: 1801050105 +source: y +key: 5701050105 +source: i +key: 3701050105 +source: k +key: 3b01050105 +source: абг +key: 260a161a01070107 +source: абв +key: 260a161801070107 +source: жжж +key: 263a3a3a01070107 +source: эюя +key: 273b3f4501070107 +source: абг +key: 5c0a161a01070107 +source: абв +key: 5c0a161801070107 +source: жжж +key: 5c3a3a3a01070107 +source: эюя +key: 5d3b3f4501070107 diff --git a/ext/intl/tests/collator_sort_variant2.phpt b/ext/intl/tests/collator_sort_variant2.phpt new file mode 100644 index 0000000000000..29a5082fda409 --- /dev/null +++ b/ext/intl/tests/collator_sort_variant2.phpt @@ -0,0 +1,248 @@ +--TEST-- +sort() +--SKIPIF-- + += 51.2'); ?> +--FILE-- + +--EXPECT-- +Test 1.e8f1cd28133d79ecd660002f1c660d0e: +array ( + 0 => 'aaa', + 1 => 'abc', + 2 => 'abd', +) + Result: true + +Test 2.c2ded12173dd2996927378cae37eb275: +array ( + 0 => '_', + 1 => '1', + 2 => 'm', +) + Result: true + +Test 3.54071c968d71cb98c5d379145f8d7d38: +array ( + 0 => 'a', + 1 => 'aa', + 2 => 'aaa', +) + Result: true + +Test 4.19abe63d6f6dfef65b0e3c9ab4826b07: +array ( + 0 => 'ab', + 1 => 'b', + 2 => 'ba', +) + Result: true + +Test 5.9a8dc0a9bc771368c2f1fc3d02754610: +array ( + 0 => 'a', + 1 => 'c', + 2 => 'e', +) + Result: true + +Test 6.ab530b060e5e54a65bfb8b9f8fc61870: +array ( + 0 => '25', + 1 => '36', + 2 => '100', +) + Result: true + +Test 7.0718dd838509017bded2ed307a6e785f: +array ( + 0 => 2, + 1 => 5, + 2 => '30', +) + Result: true + +Test 8.923d65739c5219c634616ffd100a50e4: +array ( + 0 => '', + 1 => ' a', + 2 => 'd', +) + Result: true + +Test 9.289bc2f28e87d3201ec9d7e8477ae1b0: +array ( + 0 => ' a', + 1 => 'd ', + 2 => 'f ', +) + Result: true + +Test 10.de0fd958484f2377a645835d7fbcf124: +array ( + 0 => NULL, + 1 => '3', + 2 => 'a', +) + Result: true + +Test 11.dd2b8f0adb37c45d528cad1a0cc0f361: +array ( + 0 => 'i', + 1 => 'k', + 2 => 'y', +) + Result: true + +Test 12.1e6b4d6f7df9d4580317634ea46d8208: +array ( + 0 => '100', + 1 => '25', + 2 => '36', +) + Result: true + +Test 13.cec115dc9850b98dfbdf102efa09e61b: +array ( + 0 => 2, + 1 => '30', + 2 => 5, +) + Result: true + +Test 14.923d65739c5219c634616ffd100a50e4: +array ( + 0 => '', + 1 => ' a', + 2 => 'd', +) + Result: true + +Test 15.dd2b8f0adb37c45d528cad1a0cc0f361: +array ( + 0 => 'i', + 1 => 'k', + 2 => 'y', +) + Result: true + +Test 16.49056308afb2b800363c5baa735ed247: +array ( + 0 => 'ааа', + 1 => 'абв', + 2 => 'абг', + 3 => 'abc', +) + Result: true + +Test 17.91480b10473a0c96a4cd6d88c23c577a: +array ( + 0 => 'а', + 1 => 'аа', + 2 => 'ааа', +) + Result: true + +Test 18.fdd3fe3981476039164aa000bf9177f2: +array ( + 0 => 'i', + 1 => 'y', + 2 => 'k', +) + Result: true diff --git a/ext/intl/tests/collator_sort_with_sort_keys_variant2.phpt b/ext/intl/tests/collator_sort_with_sort_keys_variant2.phpt new file mode 100644 index 0000000000000..5257f8a6ffa07 --- /dev/null +++ b/ext/intl/tests/collator_sort_with_sort_keys_variant2.phpt @@ -0,0 +1,190 @@ +--TEST-- +sort_with_sort_keys() +--SKIPIF-- + += 51.2'); ?> +--FILE-- + +--EXPECT-- +Test 1.e8f1cd28133d79ecd660002f1c660d0e: +array ( + 0 => 'aaa', + 1 => 'abc', + 2 => 'abd', +) + Result: true + +Test 2.c2ded12173dd2996927378cae37eb275: +array ( + 0 => '_', + 1 => '1', + 2 => 'm', +) + Result: true + +Test 3.54071c968d71cb98c5d379145f8d7d38: +array ( + 0 => 'a', + 1 => 'aa', + 2 => 'aaa', +) + Result: true + +Test 4.19abe63d6f6dfef65b0e3c9ab4826b07: +array ( + 0 => 'ab', + 1 => 'b', + 2 => 'ba', +) + Result: true + +Test 5.9a8dc0a9bc771368c2f1fc3d02754610: +array ( + 0 => 'a', + 1 => 'c', + 2 => 'e', +) + Result: true + +Test 6.923d65739c5219c634616ffd100a50e4: +array ( + 0 => '', + 1 => ' a', + 2 => 'd', +) + Result: true + +Test 7.289bc2f28e87d3201ec9d7e8477ae1b0: +array ( + 0 => ' a', + 1 => 'd ', + 2 => 'f ', +) + Result: true + +Test 8.de0fd958484f2377a645835d7fbcf124: +array ( + 0 => NULL, + 1 => '3', + 2 => 'a', +) + Result: true + +Test 9.dd2b8f0adb37c45d528cad1a0cc0f361: +array ( + 0 => 'i', + 1 => 'k', + 2 => 'y', +) + Result: true + +Test 10.49056308afb2b800363c5baa735ed247: +array ( + 0 => 'ааа', + 1 => 'абв', + 2 => 'абг', + 3 => 'abc', +) + Result: true + +Test 11.91480b10473a0c96a4cd6d88c23c577a: +array ( + 0 => 'а', + 1 => 'аа', + 2 => 'ааа', +) + Result: true + +Test 12.fdd3fe3981476039164aa000bf9177f2: +array ( + 0 => 'i', + 1 => 'y', + 2 => 'k', +) + Result: true diff --git a/ext/intl/tests/dateformat_calendars_variant2.phpt b/ext/intl/tests/dateformat_calendars_variant2.phpt new file mode 100644 index 0000000000000..61cdea840836c --- /dev/null +++ b/ext/intl/tests/dateformat_calendars_variant2.phpt @@ -0,0 +1,45 @@ +--TEST-- +IntlDateFormatter, calendars and time zone +--INI-- +date.timezone=Atlantic/Azores +--SKIPIF-- + += 51.2'); ?> +--FILE-- +format(strtotime('2012-01-01 00:00:00 +0000'))); +var_dump($fmt2->format(strtotime('2012-01-01 00:00:00 +0000'))); +var_dump($fmt3->format(strtotime('2012-01-01 00:00:00 +0000'))); + +new IntlDateFormatter('en_US@calendar=hebrew', + IntlDateFormatter::FULL, + IntlDateFormatter::FULL, + 'GMT+05:12', + -1); +?> +==DONE== +--EXPECTF-- +string(47) "Sunday, January 1, 2012 at 5:12:00 AM GMT+05:12" +string(47) "Sunday, January 1, 2012 at 5:12:00 AM GMT+05:12" +string(48) "Sunday, Tevet 6, 5772 AM at 5:12:00 AM GMT+05:12" + +Warning: IntlDateFormatter::__construct(): datefmt_create: invalid value for calendar type; it must be one of IntlDateFormatter::TRADITIONAL (locale's default calendar) or IntlDateFormatter::GREGORIAN. Alternatively, it can be an IntlCalendar object in %sdateformat_calendars_variant2.php on line %d +==DONE== diff --git a/ext/intl/tests/dateformat_create_cal_arg_variant2.phpt b/ext/intl/tests/dateformat_create_cal_arg_variant2.phpt new file mode 100644 index 0000000000000..70b862017bbbf --- /dev/null +++ b/ext/intl/tests/dateformat_create_cal_arg_variant2.phpt @@ -0,0 +1,53 @@ +--TEST-- +IntlDateFormatter: several forms of the calendar arg +--SKIPIF-- + += 51.2'); ?> +--FILE-- +format($ts), "\n"; + +$cal = IntlCalendar::createInstance('UTC', 'en@calendar=islamic'); +$df = new IntlDateFormatter('es_ES', 0, 0, NULL, $cal); +echo $df->format($ts), "\n"; + +//override calendar's timezone +$cal = new IntlGregorianCalendar('UTC', NULL); +$df = new IntlDateFormatter('es_ES', 0, 0, 'Europe/Madrid', $cal); +echo $df->format($ts), "\n"; + +//default calendar is gregorian +$df = new IntlDateFormatter('es_ES@calendar=islamic', 0, 0); +echo $df->format($ts), "\n"; + +//try now with traditional +$df = new IntlDateFormatter('es_ES@calendar=islamic', 0, 0, NULL, IntlDateFormatter::TRADITIONAL); +echo $df->format($ts), "\n"; + +//the timezone can be overridden when not specifying a calendar +$df = new IntlDateFormatter('es_ES@calendar=islamic', 0, 0, 'UTC', IntlDateFormatter::TRADITIONAL); +echo $df->format($ts), "\n"; + +$df = new IntlDateFormatter('es_ES', 0, 0, 'UTC', 0); +echo $df->format($ts), "\n"; + +?> +==DONE== +--EXPECTF-- +domingo%S 1 de enero de 2012 00:00:00 GMT +domingo%S 8 de Safar de 1433 00:00:00 GMT +domingo%S 1 de enero de 2012 01:00:00 Hora estándar de Europa central +sábado%S 31 de diciembre de 2011 d.C. 23:00:00 Hora %Sde las Azores +sábado%S 7 de Safar de 1433 AH 23:00:00 Hora %Sde las Azores +domingo%S 8 de Safar de 1433 AH 00:00:00 GMT +domingo%S 1 de enero de 2012 00:00:00 GMT +==DONE== diff --git a/ext/intl/tests/dateformat_formatObject_calendar_variant2.phpt b/ext/intl/tests/dateformat_formatObject_calendar_variant2.phpt new file mode 100644 index 0000000000000..1ec1fa669a1a0 --- /dev/null +++ b/ext/intl/tests/dateformat_formatObject_calendar_variant2.phpt @@ -0,0 +1,40 @@ +--TEST-- +IntlDateFormatter::formatObject(): IntlCalendar tests +--SKIPIF-- + += 51.2'); ?> +--FILE-- +setTime(strtotime('2012-01-01 00:00:00')*1000.); +echo IntlDateFormatter::formatObject($cal), "\n"; +echo IntlDateFormatter::formatObject($cal, IntlDateFormatter::FULL, "en-US"), "\n"; + +?> +==DONE== + +--EXPECTF-- +01/01/2012, 00:00:00 +Domingo, 1 de Janeiro de 2012 às 00:00:00 Hora %Sda Europa Ocidental +Jan 1, 2012, 12:00:00 AM +1/1/12, 12:00:00 AM Western European Standard %STime +Sun 2012-01-1 00,00,00.000 Portugal Time +Domingo, 1 de Janeiro de 2012 às 05:00:00 GMT+03:00 +06/02/1433, 00:00:00 +Sunday, Safar 6, 1433 at 12:00:00 AM Western European Standard Time +==DONE== diff --git a/ext/intl/tests/dateformat_formatObject_datetime_variant2.phpt b/ext/intl/tests/dateformat_formatObject_datetime_variant2.phpt new file mode 100644 index 0000000000000..2ca9ffd7e8e41 --- /dev/null +++ b/ext/intl/tests/dateformat_formatObject_datetime_variant2.phpt @@ -0,0 +1,33 @@ +--TEST-- +IntlDateFormatter::formatObject(): DateTime tests +--SKIPIF-- + += 51.2'); ?> +--FILE-- + +==DONE== + +--EXPECTF-- +01/01/2012, 00:00:00 +Domingo, 1 de Janeiro de 2012 às 00:00:00 Hora %Sda Europa Ocidental +Jan 1, 2012, 12:00:00 AM +1/1/12, 12:00:00 AM Western European Standard %STime +Sun 2012-01-1 00,00,00.000 Portugal Time +Domingo, 1 de Janeiro de 2012 às 05:00:00 GMT+03:00 +==DONE== diff --git a/ext/intl/tests/dateformat_format_parse_version2.phpt b/ext/intl/tests/dateformat_format_parse_version2.phpt new file mode 100644 index 0000000000000..8c6f00ef54e93 --- /dev/null +++ b/ext/intl/tests/dateformat_format_parse_version2.phpt @@ -0,0 +1,295 @@ +--TEST-- +datefmt_format_code() and datefmt_parse_code() +--SKIPIF-- + += 51.2'); ?> +--FILE-- + 24 , + 'tm_min' => 3, + 'tm_hour' => 19, + 'tm_mday' => 3, + 'tm_mon' => 3, + 'tm_year' => 105, + ); + $localtime_arr2 = array ( + 'tm_sec' => 21, + 'tm_min' => 5, + 'tm_hour' => 7, + 'tm_mday' => 13, + 'tm_mon' => 7, + 'tm_year' => 205, + ); + $localtime_arr3 = array ( + 'tm_sec' => 11, + 'tm_min' => 13, + 'tm_hour' => 0, + 'tm_mday' => 17, + 'tm_mon' => 11, + 'tm_year' => -5 + ); + + $localtime_arr = array ( + $localtime_arr1, + $localtime_arr2, + $localtime_arr3 + ); + + //Test format and parse with a timestamp : long + foreach( $time_arr as $timestamp_entry){ + $res_str .= "\n------------\n"; + $res_str .= "\nInput timestamp is : $timestamp_entry"; + $res_str .= "\n------------\n"; + foreach( $locale_arr as $locale_entry ){ + foreach( $datetype_arr as $datetype_entry ) { + $res_str .= "\nIntlDateFormatter locale= $locale_entry ,datetype = $datetype_entry ,timetype =$datetype_entry "; + $fmt = ut_datefmt_create( $locale_entry , $datetype_entry ,$datetype_entry,$timezone); + $formatted = ut_datefmt_format( $fmt , $timestamp_entry); + $res_str .= "\nFormatted timestamp is : $formatted"; + $parsed = ut_datefmt_parse( $fmt , $formatted); + if( intl_get_error_code() == U_ZERO_ERROR){ + $res_str .= "\nParsed timestamp is : $parsed"; + }else{ + $res_str .= "\nError while parsing as: '".intl_get_error_message()."'"; + } + } + } + } + + //Test format and parse with a localtime :array + foreach( $localtime_arr as $localtime_entry){ + $res_str .= "\n------------\n"; + $res_str .= "\nInput localtime is : "; + foreach( $localtime_entry as $key => $value){ + $res_str .= "$key : '$value' , "; + } + + $res_str .= "\n------------\n"; + foreach( $locale_arr as $locale_entry ){ + foreach( $datetype_arr as $datetype_entry ) { + $res_str .= "\nIntlDateFormatter locale= $locale_entry ,datetype = $datetype_entry ,timetype =$datetype_entry "; + $fmt = ut_datefmt_create( $locale_entry , $datetype_entry ,$datetype_entry,$timezone); + $formatted1 = ut_datefmt_format( $fmt , $localtime_entry); + if( intl_get_error_code() == U_ZERO_ERROR){ + $res_str .= "\nFormatted localtime_array is : $formatted1"; + }else{ + $res_str .= "\nError while formatting as: '".intl_get_error_message()."'"; + } + //Parsing + $parsed_arr = ut_datefmt_localtime( $fmt, $formatted1 ); + + if( $parsed_arr){ + $res_str .= "\nParsed array is: "; + foreach( $parsed_arr as $key => $value){ + $res_str .= "$key : '$value' , "; + } + } +/* + else{ + //$res_str .= "No values found from LocaleTime parsing."; + $res_str .= "\tError : '".intl_get_error_message()."'"; + } +*/ + } + } + } + + return $res_str; + +} + +include_once( 'ut_common.inc' ); + +// Run the test +ut_run(); +?> +--EXPECT-- +------------ + +Input timestamp is : 0 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Thursday, January 1, 1970 at 5:00:00 AM GMT+05:00 +Parsed timestamp is : 0 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : January 1, 1970 at 5:00:00 AM GMT+5 +Parsed timestamp is : 0 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Jan 1, 1970, 5:00:00 AM +Parsed timestamp is : 0 +------------ + +Input timestamp is : -1200000 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Thursday, December 18, 1969 at 7:40:00 AM GMT+05:00 +Parsed timestamp is : -1200000 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : December 18, 1969 at 7:40:00 AM GMT+5 +Parsed timestamp is : -1200000 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Dec 18, 1969, 7:40:00 AM +Parsed timestamp is : -1200000 +------------ + +Input timestamp is : 1200000 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Thursday, January 15, 1970 at 2:20:00 AM GMT+05:00 +Parsed timestamp is : 1200000 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : January 15, 1970 at 2:20:00 AM GMT+5 +Parsed timestamp is : 1200000 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Jan 15, 1970, 2:20:00 AM +Parsed timestamp is : 1200000 +------------ + +Input timestamp is : 2200000000 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Monday, September 19, 2039 at 4:06:40 AM GMT+05:00 +Parsed timestamp is : 2200000000 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : September 19, 2039 at 4:06:40 AM GMT+5 +Parsed timestamp is : 2200000000 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Sep 19, 2039, 4:06:40 AM +Parsed timestamp is : 2200000000 +------------ + +Input timestamp is : -2200000000 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Sunday, April 15, 1900 at 5:53:20 AM GMT+05:00 +Parsed timestamp is : -2200000000 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : April 15, 1900 at 5:53:20 AM GMT+5 +Parsed timestamp is : -2200000000 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Apr 15, 1900, 5:53:20 AM +Parsed timestamp is : -2200000000 +------------ + +Input timestamp is : 90099999 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Thursday, November 9, 1972 at 12:46:39 AM GMT+05:00 +Parsed timestamp is : 90099999 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : November 9, 1972 at 12:46:39 AM GMT+5 +Parsed timestamp is : 90099999 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Nov 9, 1972, 12:46:39 AM +Parsed timestamp is : 90099999 +------------ + +Input timestamp is : 3600 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Thursday, January 1, 1970 at 6:00:00 AM GMT+05:00 +Parsed timestamp is : 3600 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : January 1, 1970 at 6:00:00 AM GMT+5 +Parsed timestamp is : 3600 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Jan 1, 1970, 6:00:00 AM +Parsed timestamp is : 3600 +------------ + +Input timestamp is : -3600 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Thursday, January 1, 1970 at 4:00:00 AM GMT+05:00 +Parsed timestamp is : -3600 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : January 1, 1970 at 4:00:00 AM GMT+5 +Parsed timestamp is : -3600 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Jan 1, 1970, 4:00:00 AM +Parsed timestamp is : -3600 +------------ + +Input localtime is : tm_sec : '24' , tm_min : '3' , tm_hour : '19' , tm_mday : '3' , tm_mon : '3' , tm_year : '105' , +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted localtime_array is : Sunday, April 3, 2005 at 7:03:24 PM GMT+05:00 +Parsed array is: tm_sec : '24' , tm_min : '3' , tm_hour : '19' , tm_year : '105' , tm_mday : '3' , tm_wday : '0' , tm_yday : '93' , tm_mon : '3' , tm_isdst : '0' , +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted localtime_array is : April 3, 2005 at 7:03:24 PM GMT+5 +Parsed array is: tm_sec : '24' , tm_min : '3' , tm_hour : '19' , tm_year : '105' , tm_mday : '3' , tm_wday : '0' , tm_yday : '93' , tm_mon : '3' , tm_isdst : '0' , +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted localtime_array is : Apr 3, 2005, 7:03:24 PM +Parsed array is: tm_sec : '24' , tm_min : '3' , tm_hour : '19' , tm_year : '105' , tm_mday : '3' , tm_wday : '0' , tm_yday : '93' , tm_mon : '3' , tm_isdst : '0' , +------------ + +Input localtime is : tm_sec : '21' , tm_min : '5' , tm_hour : '7' , tm_mday : '13' , tm_mon : '7' , tm_year : '205' , +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted localtime_array is : Thursday, August 13, 2105 at 7:05:21 AM GMT+05:00 +Parsed array is: tm_sec : '21' , tm_min : '5' , tm_hour : '7' , tm_year : '205' , tm_mday : '13' , tm_wday : '4' , tm_yday : '225' , tm_mon : '7' , tm_isdst : '0' , +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted localtime_array is : August 13, 2105 at 7:05:21 AM GMT+5 +Parsed array is: tm_sec : '21' , tm_min : '5' , tm_hour : '7' , tm_year : '205' , tm_mday : '13' , tm_wday : '4' , tm_yday : '225' , tm_mon : '7' , tm_isdst : '0' , +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted localtime_array is : Aug 13, 2105, 7:05:21 AM +Parsed array is: tm_sec : '21' , tm_min : '5' , tm_hour : '7' , tm_year : '205' , tm_mday : '13' , tm_wday : '4' , tm_yday : '225' , tm_mon : '7' , tm_isdst : '0' , +------------ + +Input localtime is : tm_sec : '11' , tm_min : '13' , tm_hour : '0' , tm_mday : '17' , tm_mon : '11' , tm_year : '-5' , +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted localtime_array is : Tuesday, December 17, 1895 at 12:13:11 AM GMT+05:00 +Parsed array is: tm_sec : '11' , tm_min : '13' , tm_hour : '0' , tm_year : '-5' , tm_mday : '17' , tm_wday : '2' , tm_yday : '351' , tm_mon : '11' , tm_isdst : '0' , +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted localtime_array is : December 17, 1895 at 12:13:11 AM GMT+5 +Parsed array is: tm_sec : '11' , tm_min : '13' , tm_hour : '0' , tm_year : '-5' , tm_mday : '17' , tm_wday : '2' , tm_yday : '351' , tm_mon : '11' , tm_isdst : '0' , +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted localtime_array is : Dec 17, 1895, 12:13:11 AM +Parsed array is: tm_sec : '11' , tm_min : '13' , tm_hour : '0' , tm_year : '-5' , tm_mday : '17' , tm_wday : '2' , tm_yday : '351' , tm_mon : '11' , tm_isdst : '0' , diff --git a/ext/intl/tests/dateformat_format_variant2.phpt b/ext/intl/tests/dateformat_format_variant2.phpt new file mode 100644 index 0000000000000..7c5bcfcfd43f5 --- /dev/null +++ b/ext/intl/tests/dateformat_format_variant2.phpt @@ -0,0 +1,423 @@ +--TEST-- +datefmt_format_code() +--SKIPIF-- + += 51.2'); ?> +--FILE-- + 24 , + 'tm_min' => 3, + 'tm_hour' => 19, + 'tm_mday' => 3, + 'tm_mon' => 3, + 'tm_year' => 105, + ); + $localtime_arr2 = array ( + 'tm_sec' => 21, + 'tm_min' => 5, + 'tm_hour' => 7, + 'tm_mday' => 13, + 'tm_mon' => 4, + 'tm_year' => 205, + ); + $localtime_arr3 = array ( + 'tm_sec' => 11, + 'tm_min' => 13, + 'tm_hour' => 0, + 'tm_mday' => 17, + 'tm_mon' => 11, + 'tm_year' => -5 + ); + + $localtime_arr = array ( + $localtime_arr1, + $localtime_arr2, + $localtime_arr3 + ); + + $d1 = new DateTime("2010-01-01 01:02:03", new DateTimeZone("UTC")); + $d2 = new DateTime("2000-12-31 03:04:05", new DateTimeZone("UTC")); + $d2->setTimezone(new DateTimeZone("PDT")); + $dates = array( + $d1, + $d2, + new StdClass(), + ); + + //Test format with input as a timestamp : integer + foreach( $time_arr as $timestamp_entry){ + $res_str .= "\n------------\n"; + $res_str .= "\nInput timestamp is : $timestamp_entry"; + $res_str .= "\n------------\n"; + foreach( $locale_arr as $locale_entry ){ + foreach( $datetype_arr as $datetype_entry ) + { + $res_str .= "\nIntlDateFormatter locale= $locale_entry ,datetype = $datetype_entry ,timetype =$datetype_entry "; + $fmt = ut_datefmt_create( $locale_entry , $datetype_entry ,$datetype_entry, $timezone, IntlDateFormatter::GREGORIAN); + $formatted = ut_datefmt_format( $fmt , $timestamp_entry); + $res_str .= "\nFormatted timestamp is : $formatted"; + } + } + } + + //Test format with input as a localtime :array + foreach( $localtime_arr as $localtime_entry){ + $res_str .= "\n------------\n"; + $res_str .= "\nInput localtime is : "; + foreach( $localtime_entry as $key => $value){ + $res_str .= "$key : '$value' , "; + } + + $res_str .= "\n------------\n"; + foreach( $locale_arr as $locale_entry ){ + foreach( $datetype_arr as $datetype_entry ) + { + $res_str .= "\nIntlDateFormatter locale= $locale_entry ,datetype = $datetype_entry ,timetype =$datetype_entry "; + $fmt = ut_datefmt_create( $locale_entry , $datetype_entry ,$datetype_entry, $timezone, IntlDateFormatter::GREGORIAN ); + $formatted1 = ut_datefmt_format( $fmt , $localtime_entry); + if( intl_get_error_code() == U_ZERO_ERROR){ + $res_str .= "\nFormatted localtime_array is : $formatted1"; + }else{ + $res_str .= "\nError while formatting as: '".intl_get_error_message()."'"; + } + } + } + } + + foreach($dates as $date_entry) { + foreach( $locale_arr as $locale_entry ){ + foreach( $datetype_arr as $datetype_entry ) { + $res_str .= "\n------------"; + $res_str .= "\nDate is: ".var_export($date_entry, true); + $res_str .= "\n------------"; + + $fmt = ut_datefmt_create( $locale_entry , $datetype_entry ,$datetype_entry, $timezone, IntlDateFormatter::GREGORIAN ); + $formatted1 = ut_datefmt_format( $fmt , $date_entry); + if( intl_get_error_code() == U_ZERO_ERROR){ + $res_str .= "\nFormatted DateTime is : $formatted1"; + }else{ + $res_str .= "\nError while formatting as: '".intl_get_error_message()."'"; + } + } + } + } + + return $res_str; + +} + +include_once( 'ut_common.inc' ); + +// Run the test +ut_run(); +?> +--EXPECT-- +------------ + +Input timestamp is : 0 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Wednesday, December 31, 1969 at 2:00:00 PM GMT-10:00 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : December 31, 1969 at 2:00:00 PM GMT-10 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Dec 31, 1969, 2:00:00 PM +IntlDateFormatter locale= en_US ,datetype = 3 ,timetype =3 +Formatted timestamp is : 12/31/69, 2:00 PM +IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 +Formatted timestamp is : 19691231 02:00 PM +------------ + +Input timestamp is : -1200000 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Wednesday, December 17, 1969 at 4:40:00 PM GMT-10:00 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : December 17, 1969 at 4:40:00 PM GMT-10 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Dec 17, 1969, 4:40:00 PM +IntlDateFormatter locale= en_US ,datetype = 3 ,timetype =3 +Formatted timestamp is : 12/17/69, 4:40 PM +IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 +Formatted timestamp is : 19691217 04:40 PM +------------ + +Input timestamp is : 1200000 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Wednesday, January 14, 1970 at 11:20:00 AM GMT-10:00 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : January 14, 1970 at 11:20:00 AM GMT-10 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Jan 14, 1970, 11:20:00 AM +IntlDateFormatter locale= en_US ,datetype = 3 ,timetype =3 +Formatted timestamp is : 1/14/70, 11:20 AM +IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 +Formatted timestamp is : 19700114 11:20 AM +------------ + +Input timestamp is : 2200000000 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Sunday, September 18, 2039 at 1:06:40 PM GMT-10:00 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : September 18, 2039 at 1:06:40 PM GMT-10 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Sep 18, 2039, 1:06:40 PM +IntlDateFormatter locale= en_US ,datetype = 3 ,timetype =3 +Formatted timestamp is : 9/18/39, 1:06 PM +IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 +Formatted timestamp is : 20390918 01:06 PM +------------ + +Input timestamp is : -2200000000 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Saturday, April 14, 1900 at 2:53:20 PM GMT-10:00 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : April 14, 1900 at 2:53:20 PM GMT-10 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Apr 14, 1900, 2:53:20 PM +IntlDateFormatter locale= en_US ,datetype = 3 ,timetype =3 +Formatted timestamp is : 4/14/00, 2:53 PM +IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 +Formatted timestamp is : 19000414 02:53 PM +------------ + +Input timestamp is : 90099999 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Wednesday, November 8, 1972 at 9:46:39 AM GMT-10:00 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : November 8, 1972 at 9:46:39 AM GMT-10 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Nov 8, 1972, 9:46:39 AM +IntlDateFormatter locale= en_US ,datetype = 3 ,timetype =3 +Formatted timestamp is : 11/8/72, 9:46 AM +IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 +Formatted timestamp is : 19721108 09:46 AM +------------ + +Input timestamp is : 3600 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Wednesday, December 31, 1969 at 3:00:00 PM GMT-10:00 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : December 31, 1969 at 3:00:00 PM GMT-10 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Dec 31, 1969, 3:00:00 PM +IntlDateFormatter locale= en_US ,datetype = 3 ,timetype =3 +Formatted timestamp is : 12/31/69, 3:00 PM +IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 +Formatted timestamp is : 19691231 03:00 PM +------------ + +Input timestamp is : -3600 +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted timestamp is : Wednesday, December 31, 1969 at 1:00:00 PM GMT-10:00 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted timestamp is : December 31, 1969 at 1:00:00 PM GMT-10 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted timestamp is : Dec 31, 1969, 1:00:00 PM +IntlDateFormatter locale= en_US ,datetype = 3 ,timetype =3 +Formatted timestamp is : 12/31/69, 1:00 PM +IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 +Formatted timestamp is : 19691231 01:00 PM +------------ + +Input localtime is : tm_sec : '24' , tm_min : '3' , tm_hour : '19' , tm_mday : '3' , tm_mon : '3' , tm_year : '105' , +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted localtime_array is : Sunday, April 3, 2005 at 7:03:24 PM GMT-10:00 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted localtime_array is : April 3, 2005 at 7:03:24 PM GMT-10 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted localtime_array is : Apr 3, 2005, 7:03:24 PM +IntlDateFormatter locale= en_US ,datetype = 3 ,timetype =3 +Formatted localtime_array is : 4/3/05, 7:03 PM +IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 +Formatted localtime_array is : 20050403 07:03 PM +------------ + +Input localtime is : tm_sec : '21' , tm_min : '5' , tm_hour : '7' , tm_mday : '13' , tm_mon : '4' , tm_year : '205' , +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted localtime_array is : Wednesday, May 13, 2105 at 7:05:21 AM GMT-10:00 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted localtime_array is : May 13, 2105 at 7:05:21 AM GMT-10 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted localtime_array is : May 13, 2105, 7:05:21 AM +IntlDateFormatter locale= en_US ,datetype = 3 ,timetype =3 +Formatted localtime_array is : 5/13/05, 7:05 AM +IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 +Formatted localtime_array is : 21050513 07:05 AM +------------ + +Input localtime is : tm_sec : '11' , tm_min : '13' , tm_hour : '0' , tm_mday : '17' , tm_mon : '11' , tm_year : '-5' , +------------ + +IntlDateFormatter locale= en_US ,datetype = 0 ,timetype =0 +Formatted localtime_array is : Tuesday, December 17, 1895 at 12:13:11 AM GMT-10:00 +IntlDateFormatter locale= en_US ,datetype = 1 ,timetype =1 +Formatted localtime_array is : December 17, 1895 at 12:13:11 AM GMT-10 +IntlDateFormatter locale= en_US ,datetype = 2 ,timetype =2 +Formatted localtime_array is : Dec 17, 1895, 12:13:11 AM +IntlDateFormatter locale= en_US ,datetype = 3 ,timetype =3 +Formatted localtime_array is : 12/17/95, 12:13 AM +IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 +Formatted localtime_array is : 18951217 12:13 AM +------------ +Date is: DateTime::__set_state(array( + 'date' => '2010-01-01 01:02:03', + 'timezone_type' => 3, + 'timezone' => 'UTC', +)) +------------ +Formatted DateTime is : Thursday, December 31, 2009 at 3:02:03 PM GMT-10:00 +------------ +Date is: DateTime::__set_state(array( + 'date' => '2010-01-01 01:02:03', + 'timezone_type' => 3, + 'timezone' => 'UTC', +)) +------------ +Formatted DateTime is : December 31, 2009 at 3:02:03 PM GMT-10 +------------ +Date is: DateTime::__set_state(array( + 'date' => '2010-01-01 01:02:03', + 'timezone_type' => 3, + 'timezone' => 'UTC', +)) +------------ +Formatted DateTime is : Dec 31, 2009, 3:02:03 PM +------------ +Date is: DateTime::__set_state(array( + 'date' => '2010-01-01 01:02:03', + 'timezone_type' => 3, + 'timezone' => 'UTC', +)) +------------ +Formatted DateTime is : 12/31/09, 3:02 PM +------------ +Date is: DateTime::__set_state(array( + 'date' => '2010-01-01 01:02:03', + 'timezone_type' => 3, + 'timezone' => 'UTC', +)) +------------ +Formatted DateTime is : 20091231 03:02 PM +------------ +Date is: DateTime::__set_state(array( + 'date' => '2000-12-30 19:04:05', + 'timezone_type' => 3, + 'timezone' => 'America/Los_Angeles', +)) +------------ +Formatted DateTime is : Saturday, December 30, 2000 at 5:04:05 PM GMT-10:00 +------------ +Date is: DateTime::__set_state(array( + 'date' => '2000-12-30 19:04:05', + 'timezone_type' => 3, + 'timezone' => 'America/Los_Angeles', +)) +------------ +Formatted DateTime is : December 30, 2000 at 5:04:05 PM GMT-10 +------------ +Date is: DateTime::__set_state(array( + 'date' => '2000-12-30 19:04:05', + 'timezone_type' => 3, + 'timezone' => 'America/Los_Angeles', +)) +------------ +Formatted DateTime is : Dec 30, 2000, 5:04:05 PM +------------ +Date is: DateTime::__set_state(array( + 'date' => '2000-12-30 19:04:05', + 'timezone_type' => 3, + 'timezone' => 'America/Los_Angeles', +)) +------------ +Formatted DateTime is : 12/30/00, 5:04 PM +------------ +Date is: DateTime::__set_state(array( + 'date' => '2000-12-30 19:04:05', + 'timezone_type' => 3, + 'timezone' => 'America/Los_Angeles', +)) +------------ +Formatted DateTime is : 20001230 05:04 PM +------------ +Date is: stdClass::__set_state(array( +)) +------------ +Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR' +------------ +Date is: stdClass::__set_state(array( +)) +------------ +Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR' +------------ +Date is: stdClass::__set_state(array( +)) +------------ +Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR' +------------ +Date is: stdClass::__set_state(array( +)) +------------ +Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR' +------------ +Date is: stdClass::__set_state(array( +)) +------------ +Error while formatting as: 'datefmt_format: invalid object type for date/time (only IntlCalendar and DateTime permitted): U_ILLEGAL_ARGUMENT_ERROR' diff --git a/ext/intl/tests/dateformat_get_set_calendar_variant2.phpt b/ext/intl/tests/dateformat_get_set_calendar_variant2.phpt new file mode 100644 index 0000000000000..1c5169e65dddd --- /dev/null +++ b/ext/intl/tests/dateformat_get_set_calendar_variant2.phpt @@ -0,0 +1,55 @@ +--TEST-- +IntlDateFormatter: setCalendar()/getCalendar()/getCalendarObject() +--SKIPIF-- + += 51.2'); ?> +--FILE-- +format($ts), "\n"; +var_dump($df->getCalendar(), +$df->getCalendarObject()->getType(), +$df->getCalendarObject()->getTimeZone()->getId()); +echo "\n"; +} + +$df = new IntlDateFormatter('fr@calendar=islamic', 0, 0, 'Europe/Minsk'); +d($df); + + +//changing the calendar with a cal type should not change tz +$df->setCalendar(IntlDateFormatter::TRADITIONAL); +d($df); + +//but changing with an actual calendar should +$cal = IntlCalendar::createInstance("UTC"); +$df->setCalendar($cal); +d($df); + +?> +==DONE== +--EXPECT-- +dimanche 1 janvier 2012 ap. J.-C. 03:00:00 UTC+03:00 +int(1) +string(9) "gregorian" +string(12) "Europe/Minsk" + +dimanche 8 safar 1433 AH 03:00:00 UTC+03:00 +int(0) +string(7) "islamic" +string(12) "Europe/Minsk" + +dimanche 1 janvier 2012 ap. J.-C. 00:00:00 UTC +bool(false) +string(9) "gregorian" +string(3) "UTC" + +==DONE== diff --git a/ext/intl/tests/dateformat_get_set_timezone_variant2.phpt b/ext/intl/tests/dateformat_get_set_timezone_variant2.phpt new file mode 100644 index 0000000000000..af9ddf29a46f6 --- /dev/null +++ b/ext/intl/tests/dateformat_get_set_timezone_variant2.phpt @@ -0,0 +1,62 @@ +--TEST-- +IntlDateFormatter: get/setTimeZone() +--SKIPIF-- + += 51.2'); ?> +--FILE-- +format($ts), "\n"; +var_dump( +$df->getTimeZoneID(), +$df->getTimeZone()->getID()); +echo "\n"; +} + +$df = new IntlDateFormatter('pt_PT', 0, 0, 'Europe/Minsk'); +d($df); + +$df->setTimeZone(NULL); +d($df); + +$df->setTimeZone('Europe/Madrid'); +d($df); + +$df->setTimeZone(IntlTimeZone::createTimeZone('Europe/Paris')); +d($df); + +$df->setTimeZone(new DateTimeZone('Europe/Amsterdam')); +d($df); + +?> +==DONE== +--EXPECTF-- +Domingo, 1 de Janeiro de 2012 às 03:00:00 GMT+03:00 +string(12) "Europe/Minsk" +string(12) "Europe/Minsk" + +Sábado, 31 de Dezembro de 2011 às 23:00:00 Hor%s %Sdos Açores +string(15) "Atlantic/Azores" +string(15) "Atlantic/Azores" + +Domingo, 1 de Janeiro de 2012 às 01:00:00 Hor%s %Sda Europa Central +string(13) "Europe/Madrid" +string(13) "Europe/Madrid" + +Domingo, 1 de Janeiro de 2012 às 01:00:00 Hor%s %Sda Europa Central +string(12) "Europe/Paris" +string(12) "Europe/Paris" + +Domingo, 1 de Janeiro de 2012 às 01:00:00 Hor%s %Sda Europa Central +string(16) "Europe/Amsterdam" +string(16) "Europe/Amsterdam" + +==DONE== diff --git a/ext/intl/tests/dateformat_set_timezone_id3.phpt b/ext/intl/tests/dateformat_set_timezone_id3.phpt new file mode 100644 index 0000000000000..b3968f9ac01cc --- /dev/null +++ b/ext/intl/tests/dateformat_set_timezone_id3.phpt @@ -0,0 +1,85 @@ +--TEST-- +datefmt_set_timezone_id_code() icu >= 4.8 +--INI-- +date.timezone=Atlantic/Azores +--SKIPIF-- + += 51.2'); ?> +--FILE-- + +--EXPECTF-- +Warning: IntlDateFormatter::setTimeZoneId(): datefmt_set_timezone: no such time zone: 'CN' in %sut_common.inc on line %d + +Warning: datefmt_set_timezone_id(): datefmt_set_timezone: no such time zone: 'CN' in %sut_common.inc on line %d + +After creation of the dateformatter : timezone_id= US/Pacific +----------- +Trying to set timezone_id= America/New_York +After call to set_timezone_id : timezone_id= America/New_York +Formatting timestamp=0 resulted in Wednesday, December 31, 1969 at 7:00:00 PM Eastern Standard Time +Formatting timestamp=3600 resulted in Wednesday, December 31, 1969 at 8:00:00 PM Eastern Standard Time +----------- +Trying to set timezone_id= America/Los_Angeles +After call to set_timezone_id : timezone_id= America/Los_Angeles +Formatting timestamp=0 resulted in Wednesday, December 31, 1969 at 4:00:00 PM Pacific Standard Time +Formatting timestamp=3600 resulted in Wednesday, December 31, 1969 at 5:00:00 PM Pacific Standard Time +----------- +Trying to set timezone_id= America/Chicago +After call to set_timezone_id : timezone_id= America/Chicago +Formatting timestamp=0 resulted in Wednesday, December 31, 1969 at 6:00:00 PM Central Standard Time +Formatting timestamp=3600 resulted in Wednesday, December 31, 1969 at 7:00:00 PM Central Standard Time +----------- +Trying to set timezone_id= CN +After call to set_timezone_id : timezone_id= America/Chicago +Formatting timestamp=0 resulted in Wednesday, December 31, 1969 at 6:00:00 PM Central Standard Time +Formatting timestamp=3600 resulted in Wednesday, December 31, 1969 at 7:00:00 PM Central Standard Time diff --git a/ext/intl/tests/dateformat_timezone_arg_variations2.phpt b/ext/intl/tests/dateformat_timezone_arg_variations2.phpt new file mode 100644 index 0000000000000..a957963a440e6 --- /dev/null +++ b/ext/intl/tests/dateformat_timezone_arg_variations2.phpt @@ -0,0 +1,45 @@ +--TEST-- +IntlDateFormatter: several forms of the timezone arg +--SKIPIF-- + += 51.2'); ?> +--FILE-- +format($ts), "\n"; + +$df = new IntlDateFormatter('es_ES', 0, 0, 'Europe/Amsterdam'); +echo $df->format($ts), "\n"; + +$df = new IntlDateFormatter('es_ES', 0, 0, new DateTimeZone('Europe/Lisbon')); +echo $df->format($ts), "\n"; + +$df = new IntlDateFormatter('es_ES', 0, 0, IntlTimeZone::createTimeZone('America/New_York')); +echo $df->format($ts), "\n"; + +//time zone has priority +$df = new IntlDateFormatter('es_ES', 0, 0, 'Europe/Amsterdam', new IntlGregorianCalendar('Europe/Lisbon')); +echo $df->format($ts), "\n"; + +//calendar has priority +$df = new IntlDateFormatter('es_ES', 0, 0, NULL, new IntlGregorianCalendar('Europe/Lisbon')); +echo $df->format($ts), "\n"; + +$df = new IntlDateFormatter('es_ES', 0, 0, 'Europe/Amsterdam', 0); +echo $df->format($ts), "\n"; + +--EXPECTF-- +sábado%S, 31 de diciembre de 2011 23:00:00 Hora estándar de las Azores +domingo%S, 1 de enero de 2012 01:00:00 Hora estándar de Europa central +domingo%S, 1 de enero de 2012 00:00:00 Hora%S de Europa occidental +sábado%S, 31 de diciembre de 2011 19:00:00 Hora estándar oriental +domingo%S, 1 de enero de 2012 01:00:00 Hora estándar de Europa central +domingo%S, 1 de enero de 2012 00:00:00 Hora%S de Europa occidental +domingo%S, 1 de enero de 2012 01:00:00 Hora estándar de Europa central diff --git a/ext/intl/tests/formatter_get_locale_variant2.phpt b/ext/intl/tests/formatter_get_locale_variant2.phpt new file mode 100644 index 0000000000000..9d25d1cf902de --- /dev/null +++ b/ext/intl/tests/formatter_get_locale_variant2.phpt @@ -0,0 +1,50 @@ +--TEST-- +numfmt_get_locale() +--SKIPIF-- + += 51.2'); ?> +--FILE-- + 'actual', + Locale::VALID_LOCALE => 'valid', + ); + + $res_str = ''; + + foreach( $locales as $locale ) + { + $fmt = ut_nfmt_create( $locale, NumberFormatter::DECIMAL ); + $res_str .= "$locale: "; + foreach( $loc_types as $loc_type => $loc_type_name ) + $res_str .= sprintf( " %s=%s", + $loc_type_name, + dump( ut_nfmt_get_locale( $fmt, $loc_type ) ) ); + $res_str .= "\n"; + } + + return $res_str; +} + +include_once( 'ut_common.inc' ); + +// Run the test +ut_run(); +?> +--EXPECT-- +en_UK: actual='en' valid='en' +en_US@California: actual='en' valid='en' +fr_CA: actual='fr' valid='fr_CA' diff --git a/ext/intl/tests/locale_filter_matches3.phpt b/ext/intl/tests/locale_filter_matches3.phpt new file mode 100644 index 0000000000000..4c1d4d3898ec9 --- /dev/null +++ b/ext/intl/tests/locale_filter_matches3.phpt @@ -0,0 +1,366 @@ +--TEST-- +locale_filter_matches.phpt() ICU >= 51.2 +--SKIPIF-- + += 51.2'); ?> +--FILE-- + +--EXPECT-- +-------------- +loc_range:de-de matches lang_tag de-DEVA ? NO +loc_range:de_DE canonically matches lang_tag de_Deva ? NO +-------------- +loc_range:de-de matches lang_tag de-DE-1996 ? YES +loc_range:de_DE canonically matches lang_tag de_DE_1996 ? YES +-------------- +loc_range:de-de matches lang_tag de-DE ? YES +loc_range:de_DE canonically matches lang_tag de_DE ? YES +-------------- +loc_range:de-de matches lang_tag zh_Hans ? NO +loc_range:de_DE canonically matches lang_tag zh_Hans ? NO +-------------- +loc_range:de-de matches lang_tag de-CH-1996 ? NO +loc_range:de_DE canonically matches lang_tag de_CH_1996 ? NO +-------------- +loc_range:de-de matches lang_tag sl_IT ? NO +loc_range:de_DE canonically matches lang_tag sl_IT ? NO +-------------- +loc_range:de-de matches lang_tag sl_IT_nedis-a-kirti-x-xyz ? NO +loc_range:de_DE canonically matches lang_tag sl_IT_NEDIS_A_KIRTI_X_XYZ ? NO +-------------- +loc_range:de-de matches lang_tag sl_IT_rozaj ? NO +loc_range:de_DE canonically matches lang_tag sl_IT_ROZAJ ? NO +-------------- +loc_range:de-de matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? NO +loc_range:de_DE canonically matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? NO +-------------- +loc_range:de-de matches lang_tag i-enochian ? NO +loc_range:de_DE canonically matches lang_tag @x=i-enochian ? NO +-------------- +loc_range:de-de matches lang_tag sgn-CH-de ? NO +loc_range:de_DE canonically matches lang_tag sgn_CH_DE ? NO +-------------- +loc_range:de-de matches lang_tag art-lojban ? NO +loc_range:de_DE canonically matches lang_tag art__LOJBAN ? NO +-------------- +loc_range:de-de matches lang_tag i-lux ? NO +loc_range:de_DE canonically matches lang_tag lb ? NO +-------------- +loc_range:de-de matches lang_tag art-lojban ? NO +loc_range:de_DE canonically matches lang_tag art__LOJBAN ? NO +-------------- +loc_range:de-de matches lang_tag jbo ? NO +loc_range:de_DE canonically matches lang_tag jbo ? NO +-------------- +loc_range:de-de matches lang_tag en_sl_IT ? NO +loc_range:de_DE canonically matches lang_tag en_SL_IT ? NO +-------------- +loc_range:sl_IT matches lang_tag de-DEVA ? NO +loc_range:sl_IT canonically matches lang_tag de_Deva ? NO +-------------- +loc_range:sl_IT matches lang_tag de-DE-1996 ? NO +loc_range:sl_IT canonically matches lang_tag de_DE_1996 ? NO +-------------- +loc_range:sl_IT matches lang_tag de-DE ? NO +loc_range:sl_IT canonically matches lang_tag de_DE ? NO +-------------- +loc_range:sl_IT matches lang_tag zh_Hans ? NO +loc_range:sl_IT canonically matches lang_tag zh_Hans ? NO +-------------- +loc_range:sl_IT matches lang_tag de-CH-1996 ? NO +loc_range:sl_IT canonically matches lang_tag de_CH_1996 ? NO +-------------- +loc_range:sl_IT matches lang_tag sl_IT ? YES +loc_range:sl_IT canonically matches lang_tag sl_IT ? YES +-------------- +loc_range:sl_IT matches lang_tag sl_IT_nedis-a-kirti-x-xyz ? YES +loc_range:sl_IT canonically matches lang_tag sl_IT_NEDIS_A_KIRTI_X_XYZ ? YES +-------------- +loc_range:sl_IT matches lang_tag sl_IT_rozaj ? YES +loc_range:sl_IT canonically matches lang_tag sl_IT_ROZAJ ? YES +-------------- +loc_range:sl_IT matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? YES +loc_range:sl_IT canonically matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? YES +-------------- +loc_range:sl_IT matches lang_tag i-enochian ? NO +loc_range:sl_IT canonically matches lang_tag @x=i-enochian ? NO +-------------- +loc_range:sl_IT matches lang_tag sgn-CH-de ? NO +loc_range:sl_IT canonically matches lang_tag sgn_CH_DE ? NO +-------------- +loc_range:sl_IT matches lang_tag art-lojban ? NO +loc_range:sl_IT canonically matches lang_tag art__LOJBAN ? NO +-------------- +loc_range:sl_IT matches lang_tag i-lux ? NO +loc_range:sl_IT canonically matches lang_tag lb ? NO +-------------- +loc_range:sl_IT matches lang_tag art-lojban ? NO +loc_range:sl_IT canonically matches lang_tag art__LOJBAN ? NO +-------------- +loc_range:sl_IT matches lang_tag jbo ? NO +loc_range:sl_IT canonically matches lang_tag jbo ? NO +-------------- +loc_range:sl_IT matches lang_tag en_sl_IT ? NO +loc_range:sl_IT canonically matches lang_tag en_SL_IT ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag de-DEVA ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag de_Deva ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag de-DE-1996 ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag de_DE_1996 ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag de-DE ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag de_DE ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag zh_Hans ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag zh_Hans ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag de-CH-1996 ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag de_CH_1996 ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag sl_IT ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag sl_IT ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag sl_IT_nedis-a-kirti-x-xyz ? YES +loc_range:sl_IT_NEDIS canonically matches lang_tag sl_IT_NEDIS_A_KIRTI_X_XYZ ? YES +-------------- +loc_range:sl_IT_Nedis matches lang_tag sl_IT_rozaj ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag sl_IT_ROZAJ ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? YES +loc_range:sl_IT_NEDIS canonically matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? YES +-------------- +loc_range:sl_IT_Nedis matches lang_tag i-enochian ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag @x=i-enochian ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag sgn-CH-de ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag sgn_CH_DE ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag art-lojban ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag art__LOJBAN ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag i-lux ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag lb ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag art-lojban ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag art__LOJBAN ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag jbo ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag jbo ? NO +-------------- +loc_range:sl_IT_Nedis matches lang_tag en_sl_IT ? NO +loc_range:sl_IT_NEDIS canonically matches lang_tag en_SL_IT ? NO +-------------- +loc_range:jbo matches lang_tag de-DEVA ? NO +loc_range:jbo canonically matches lang_tag de_Deva ? NO +-------------- +loc_range:jbo matches lang_tag de-DE-1996 ? NO +loc_range:jbo canonically matches lang_tag de_DE_1996 ? NO +-------------- +loc_range:jbo matches lang_tag de-DE ? NO +loc_range:jbo canonically matches lang_tag de_DE ? NO +-------------- +loc_range:jbo matches lang_tag zh_Hans ? NO +loc_range:jbo canonically matches lang_tag zh_Hans ? NO +-------------- +loc_range:jbo matches lang_tag de-CH-1996 ? NO +loc_range:jbo canonically matches lang_tag de_CH_1996 ? NO +-------------- +loc_range:jbo matches lang_tag sl_IT ? NO +loc_range:jbo canonically matches lang_tag sl_IT ? NO +-------------- +loc_range:jbo matches lang_tag sl_IT_nedis-a-kirti-x-xyz ? NO +loc_range:jbo canonically matches lang_tag sl_IT_NEDIS_A_KIRTI_X_XYZ ? NO +-------------- +loc_range:jbo matches lang_tag sl_IT_rozaj ? NO +loc_range:jbo canonically matches lang_tag sl_IT_ROZAJ ? NO +-------------- +loc_range:jbo matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? NO +loc_range:jbo canonically matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? NO +-------------- +loc_range:jbo matches lang_tag i-enochian ? NO +loc_range:jbo canonically matches lang_tag @x=i-enochian ? NO +-------------- +loc_range:jbo matches lang_tag sgn-CH-de ? NO +loc_range:jbo canonically matches lang_tag sgn_CH_DE ? NO +-------------- +loc_range:jbo matches lang_tag art-lojban ? NO +loc_range:jbo canonically matches lang_tag art__LOJBAN ? NO +-------------- +loc_range:jbo matches lang_tag i-lux ? NO +loc_range:jbo canonically matches lang_tag lb ? NO +-------------- +loc_range:jbo matches lang_tag art-lojban ? NO +loc_range:jbo canonically matches lang_tag art__LOJBAN ? NO +-------------- +loc_range:jbo matches lang_tag jbo ? YES +loc_range:jbo canonically matches lang_tag jbo ? YES +-------------- +loc_range:jbo matches lang_tag en_sl_IT ? NO +loc_range:jbo canonically matches lang_tag en_SL_IT ? NO +-------------- +loc_range:art-lojban matches lang_tag de-DEVA ? NO +loc_range:art__LOJBAN canonically matches lang_tag de_Deva ? NO +-------------- +loc_range:art-lojban matches lang_tag de-DE-1996 ? NO +loc_range:art__LOJBAN canonically matches lang_tag de_DE_1996 ? NO +-------------- +loc_range:art-lojban matches lang_tag de-DE ? NO +loc_range:art__LOJBAN canonically matches lang_tag de_DE ? NO +-------------- +loc_range:art-lojban matches lang_tag zh_Hans ? NO +loc_range:art__LOJBAN canonically matches lang_tag zh_Hans ? NO +-------------- +loc_range:art-lojban matches lang_tag de-CH-1996 ? NO +loc_range:art__LOJBAN canonically matches lang_tag de_CH_1996 ? NO +-------------- +loc_range:art-lojban matches lang_tag sl_IT ? NO +loc_range:art__LOJBAN canonically matches lang_tag sl_IT ? NO +-------------- +loc_range:art-lojban matches lang_tag sl_IT_nedis-a-kirti-x-xyz ? NO +loc_range:art__LOJBAN canonically matches lang_tag sl_IT_NEDIS_A_KIRTI_X_XYZ ? NO +-------------- +loc_range:art-lojban matches lang_tag sl_IT_rozaj ? NO +loc_range:art__LOJBAN canonically matches lang_tag sl_IT_ROZAJ ? NO +-------------- +loc_range:art-lojban matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? NO +loc_range:art__LOJBAN canonically matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? NO +-------------- +loc_range:art-lojban matches lang_tag i-enochian ? NO +loc_range:art__LOJBAN canonically matches lang_tag @x=i-enochian ? NO +-------------- +loc_range:art-lojban matches lang_tag sgn-CH-de ? NO +loc_range:art__LOJBAN canonically matches lang_tag sgn_CH_DE ? NO +-------------- +loc_range:art-lojban matches lang_tag art-lojban ? YES +loc_range:art__LOJBAN canonically matches lang_tag art__LOJBAN ? YES +-------------- +loc_range:art-lojban matches lang_tag i-lux ? NO +loc_range:art__LOJBAN canonically matches lang_tag lb ? NO +-------------- +loc_range:art-lojban matches lang_tag art-lojban ? YES +loc_range:art__LOJBAN canonically matches lang_tag art__LOJBAN ? YES +-------------- +loc_range:art-lojban matches lang_tag jbo ? NO +loc_range:art__LOJBAN canonically matches lang_tag jbo ? NO +-------------- +loc_range:art-lojban matches lang_tag en_sl_IT ? NO +loc_range:art__LOJBAN canonically matches lang_tag en_SL_IT ? NO +-------------- +loc_range:sl_IT matches lang_tag de-DEVA ? NO +loc_range:sl_IT canonically matches lang_tag de_Deva ? NO +-------------- +loc_range:sl_IT matches lang_tag de-DE-1996 ? NO +loc_range:sl_IT canonically matches lang_tag de_DE_1996 ? NO +-------------- +loc_range:sl_IT matches lang_tag de-DE ? NO +loc_range:sl_IT canonically matches lang_tag de_DE ? NO +-------------- +loc_range:sl_IT matches lang_tag zh_Hans ? NO +loc_range:sl_IT canonically matches lang_tag zh_Hans ? NO +-------------- +loc_range:sl_IT matches lang_tag de-CH-1996 ? NO +loc_range:sl_IT canonically matches lang_tag de_CH_1996 ? NO +-------------- +loc_range:sl_IT matches lang_tag sl_IT ? YES +loc_range:sl_IT canonically matches lang_tag sl_IT ? YES +-------------- +loc_range:sl_IT matches lang_tag sl_IT_nedis-a-kirti-x-xyz ? YES +loc_range:sl_IT canonically matches lang_tag sl_IT_NEDIS_A_KIRTI_X_XYZ ? YES +-------------- +loc_range:sl_IT matches lang_tag sl_IT_rozaj ? YES +loc_range:sl_IT canonically matches lang_tag sl_IT_ROZAJ ? YES +-------------- +loc_range:sl_IT matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? YES +loc_range:sl_IT canonically matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? YES +-------------- +loc_range:sl_IT matches lang_tag i-enochian ? NO +loc_range:sl_IT canonically matches lang_tag @x=i-enochian ? NO +-------------- +loc_range:sl_IT matches lang_tag sgn-CH-de ? NO +loc_range:sl_IT canonically matches lang_tag sgn_CH_DE ? NO +-------------- +loc_range:sl_IT matches lang_tag art-lojban ? NO +loc_range:sl_IT canonically matches lang_tag art__LOJBAN ? NO +-------------- +loc_range:sl_IT matches lang_tag i-lux ? NO +loc_range:sl_IT canonically matches lang_tag lb ? NO +-------------- +loc_range:sl_IT matches lang_tag art-lojban ? NO +loc_range:sl_IT canonically matches lang_tag art__LOJBAN ? NO +-------------- +loc_range:sl_IT matches lang_tag jbo ? NO +loc_range:sl_IT canonically matches lang_tag jbo ? NO +-------------- +loc_range:sl_IT matches lang_tag en_sl_IT ? NO +loc_range:sl_IT canonically matches lang_tag en_SL_IT ? NO diff --git a/ext/intl/tests/locale_get_display_name3.phpt b/ext/intl/tests/locale_get_display_name3.phpt new file mode 100644 index 0000000000000..3f3d26fcfa1bb --- /dev/null +++ b/ext/intl/tests/locale_get_display_name3.phpt @@ -0,0 +1,342 @@ +--TEST-- +locale_get_display_name() icu >= 51.2 +--SKIPIF-- + += 51.2'); ?> +--FILE-- + +--EXPECTREGEX-- +locale='sl_IT_nedis_KIRTI' +disp_locale=en : display_name=Slovenian #Italy, NEDIS_KIRTI# +disp_locale=fr : display_name=slovène #Italie, NEDIS_KIRTI# +disp_locale=de : display_name=Slowenisch #Italien, NEDIS_KIRTI# +----------------- +locale='sl_IT_nedis-a-kirti-x-xyz' +disp_locale=en : display_name=Slovenian #Italy, NEDIS_A_KIRTI_X_XYZ# +disp_locale=fr : display_name=slovène #Italie, NEDIS_A_KIRTI_X_XYZ# +disp_locale=de : display_name=Slowenisch #Italien, NEDIS_A_KIRTI_X_XYZ# +----------------- +locale='sl_IT_rozaj' +disp_locale=en : display_name=Slovenian #Italy, Resian# +disp_locale=fr : display_name=slovène #Italie, dialecte de Resia# +disp_locale=de : display_name=Slowenisch #Italien, (ROZAJ|Resianisch)# +----------------- +locale='sl_IT_NEDIS_ROJAZ_1901' +disp_locale=en : display_name=Slovenian #Italy, NEDIS_ROJAZ_1901# +disp_locale=fr : display_name=slovène #Italie, NEDIS_ROJAZ_1901# +disp_locale=de : display_name=Slowenisch #Italien, NEDIS_ROJAZ_1901# +----------------- +locale='i-enochian' +disp_locale=en : display_name=i-enochian #Private-Use=i-enochian# +disp_locale=fr : display_name=i-enochian #Usage privé=i-enochian# +disp_locale=de : display_name=i-enochian #Privatnutzung=i-enochian# +----------------- +locale='zh-hakka' +disp_locale=en : display_name=Chinese( #HAKKA#)? +disp_locale=fr : display_name=chinois( #HAKKA#)? +disp_locale=de : display_name=Chinesisch( #HAKKA#)? +----------------- +locale='zh-wuu' +disp_locale=en : display_name=Chinese #WUU# +disp_locale=fr : display_name=chinois #WUU# +disp_locale=de : display_name=Chinesisch #WUU# +----------------- +locale='i-tay' +disp_locale=en : display_name=i-tay +disp_locale=fr : display_name=i-tay +disp_locale=de : display_name=i-tay +----------------- +locale='sgn-BE-nl' +disp_locale=en : display_name=Sign Languages? #Belgium, NL# +disp_locale=fr : display_name=langues? des signes #Belgique, NL# +disp_locale=de : display_name=Gebärdensprache #Belgien, NL# +----------------- +locale='sgn-CH-de' +disp_locale=en : display_name=Sign Languages? #Switzerland, DE# +disp_locale=fr : display_name=langues? des signes #Suisse, DE# +disp_locale=de : display_name=Gebärdensprache #Schweiz, DE# +----------------- +locale='sl_IT_rozaj@currency=EUR' +disp_locale=en : display_name=Slovenian #Italy, Resian, [Cc]urrency=Euro# +disp_locale=fr : display_name=slovène #Italie, dialecte de Resia, [Dd]evise=euro# +disp_locale=de : display_name=Slowenisch #Italien, (ROZAJ|Resianisch), Währung=Euro# +----------------- +locale='uk-ua_CALIFORNIA@currency=;currency=GRN' +disp_locale=en : display_name=Ukrainian #Ukraine, CALIFORNIA, [Cc]urrency# +disp_locale=fr : display_name=ukrainien #Ukraine, CALIFORNIA, [Dd]evise# +disp_locale=de : display_name=Ukrainisch #Ukraine, CALIFORNIA, Währung# +----------------- +locale='root' +disp_locale=en : display_name=Root +disp_locale=fr : display_name=racine +disp_locale=de : display_name=[Rr]oot +----------------- +locale='uk@currency=EURO' +disp_locale=en : display_name=Ukrainian #[Cc]urrency=EURO# +disp_locale=fr : display_name=ukrainien #[Dd]evise=EURO# +disp_locale=de : display_name=Ukrainisch #Währung=EURO# +----------------- +locale='Hindi' +disp_locale=en : display_name=hindi +disp_locale=fr : display_name=hindi +disp_locale=de : display_name=hindi +----------------- +locale='de' +disp_locale=en : display_name=German +disp_locale=fr : display_name=allemand +disp_locale=de : display_name=Deutsch +----------------- +locale='fr' +disp_locale=en : display_name=French +disp_locale=fr : display_name=français +disp_locale=de : display_name=Französisch +----------------- +locale='ja' +disp_locale=en : display_name=Japanese +disp_locale=fr : display_name=japonais +disp_locale=de : display_name=Japanisch +----------------- +locale='i-enochian' +disp_locale=en : display_name=i-enochian #Private-Use=i-enochian# +disp_locale=fr : display_name=i-enochian #Usage privé=i-enochian# +disp_locale=de : display_name=i-enochian #Privatnutzung=i-enochian# +----------------- +locale='zh-Hant' +disp_locale=en : display_name=Chinese #Traditional# +disp_locale=fr : display_name=chinois #traditionnel# +disp_locale=de : display_name=Chinesisch #Traditionell# +----------------- +locale='zh-Hans' +disp_locale=en : display_name=Chinese #Simplified# +disp_locale=fr : display_name=chinois #simplifié# +disp_locale=de : display_name=Chinesisch #Vereinfacht# +----------------- +locale='sr-Cyrl' +disp_locale=en : display_name=Serbian #Cyrillic# +disp_locale=fr : display_name=serbe #cyrillique# +disp_locale=de : display_name=Serbisch #Kyrillisch# +----------------- +locale='sr-Latn' +disp_locale=en : display_name=Serbian #Latin# +disp_locale=fr : display_name=serbe #latin# +disp_locale=de : display_name=Serbisch #Lateinisch# +----------------- +locale='zh-Hans-CN' +disp_locale=en : display_name=Chinese #Simplified, China# +disp_locale=fr : display_name=chinois #simplifié, Chine# +disp_locale=de : display_name=Chinesisch #Vereinfacht, China# +----------------- +locale='sr-Latn-CS' +disp_locale=en : display_name=Serbian #Latin, Serbia# +disp_locale=fr : display_name=serbe #latin, Serbie# +disp_locale=de : display_name=Serbisch #Lateinisch, Serbien# +----------------- +locale='sl-rozaj' +disp_locale=en : display_name=Slovenian #Resian# +disp_locale=fr : display_name=slovène #dialecte de Resia# +disp_locale=de : display_name=Slowenisch( #(ROZAJ|Resianisch)#)? +----------------- +locale='sl-nedis' +disp_locale=en : display_name=Slovenian #Natisone dialect# +disp_locale=fr : display_name=slovène #dialecte de Natisone# +disp_locale=de : display_name=Slowenisch #Natisone-Dialekt# +----------------- +locale='de-CH-1901' +disp_locale=en : display_name=German #Switzerland, Traditional German orthography# +disp_locale=fr : display_name=allemand #Suisse, orthographe allemande traditionnelle# +disp_locale=de : display_name=Deutsch #Schweiz, (1901|[aA]lte deutsche Rechtschreibung)# +----------------- +locale='sl-IT-nedis' +disp_locale=en : display_name=Slovenian #Italy, Natisone dialect# +disp_locale=fr : display_name=slovène #Italie, dialecte de Natisone# +disp_locale=de : display_name=Slowenisch #Italien, (NEDIS|Natisone-Dialekt)# +----------------- +locale='sl-Latn-IT-nedis' +disp_locale=en : display_name=Slovenian #Latin, Italy, Natisone dialect# +disp_locale=fr : display_name=slovène #latin, Italie, dialecte de Natisone# +disp_locale=de : display_name=Slowenisch #Lateinisch, Italien, (NEDIS|Natisone-Dialekt)# +----------------- +locale='de-DE' +disp_locale=en : display_name=German #Germany# +disp_locale=fr : display_name=allemand #Allemagne# +disp_locale=de : display_name=Deutsch #Deutschland# +----------------- +locale='en-US' +disp_locale=en : display_name=English #United States# +disp_locale=fr : display_name=anglais #États-Unis# +disp_locale=de : display_name=Englisch #Vereinigte Staaten# +----------------- +locale='es-419' +disp_locale=en : display_name=Spanish #Latin America# +disp_locale=fr : display_name=espagnol #Amérique latine# +disp_locale=de : display_name=Spanisch #Lateinamerika# +----------------- +locale='de-CH-x-phonebk' +disp_locale=en : display_name=German #Switzerland, Private-Use=phonebk# +disp_locale=fr : display_name=allemand #Suisse, Usage privé=phonebk# +disp_locale=de : display_name=Deutsch #Schweiz, Privatnutzung=phonebk# +----------------- +locale='az-Arab-x-AZE-derbend' +disp_locale=en : display_name=Azerbaijani #Arabic, Private-Use=aze-derbend# +disp_locale=fr : display_name=azéri #arabe, Usage privé=aze-derbend# +disp_locale=de : display_name=Aserbaidschanisch #Arabisch, Privatnutzung=aze-derbend# +----------------- +locale='zh-min' +disp_locale=en : display_name=Chinese #MIN# +disp_locale=fr : display_name=chinois #MIN# +disp_locale=de : display_name=Chinesisch #MIN# +----------------- +locale='zh-min-nan-Hant-CN' +disp_locale=en : display_name=Chinese #MIN, NAN_HANT_CN# +disp_locale=fr : display_name=chinois #MIN, NAN_HANT_CN# +disp_locale=de : display_name=Chinesisch #MIN, NAN_HANT_CN# +----------------- +locale='x-whatever' +disp_locale=en : display_name=x-whatever #Private-Use=whatever# +disp_locale=fr : display_name=x-whatever #Usage privé=whatever# +disp_locale=de : display_name=x-whatever #Privatnutzung=whatever# +----------------- +locale='qaa-Qaaa-QM-x-southern' +disp_locale=en : display_name=qaa #Qaaa, QM, Private-Use=southern# +disp_locale=fr : display_name=qaa #Qaaa, QM, Usage privé=southern# +disp_locale=de : display_name=qaa #Qaaa, QM, Privatnutzung=southern# +----------------- +locale='sr-Latn-QM' +disp_locale=en : display_name=Serbian #Latin, QM# +disp_locale=fr : display_name=serbe #latin, QM# +disp_locale=de : display_name=Serbisch #Lateinisch, QM# +----------------- +locale='sr-Qaaa-CS' +disp_locale=en : display_name=Serbian #Qaaa, Serbia# +disp_locale=fr : display_name=serbe #Qaaa, Serbie# +disp_locale=de : display_name=Serbisch #Qaaa, Serbien# +----------------- +locale='en-US-u-islamCal' +disp_locale=en : display_name=English #United States, attribute=islamcal# +disp_locale=fr : display_name=anglais #États-Unis, attribute=islamcal# +disp_locale=de : display_name=Englisch #Vereinigte Staaten, attribute=islamcal# +----------------- +locale='zh-CN-a-myExt-x-private' +disp_locale=en : display_name=Chinese #China, a=myext, Private-Use=private# +disp_locale=fr : display_name=chinois #Chine, a=myext, Usage privé=private# +disp_locale=de : display_name=Chinesisch #China, a=myext, Privatnutzung=private# +----------------- +locale='en-a-myExt-b-another' +disp_locale=en : display_name=English #a=myext, b=another# +disp_locale=fr : display_name=anglais #a=myext, b=another# +disp_locale=de : display_name=Englisch #a=myext, b=another# +----------------- +locale='de-419-DE' +disp_locale=en : display_name=German #Latin America, DE# +disp_locale=fr : display_name=allemand #Amérique latine, DE# +disp_locale=de : display_name=Deutsch #Lateinamerika, DE# +----------------- +locale='a-DE' +disp_locale=en : display_name=a #Germany# +disp_locale=fr : display_name=a #Allemagne# +disp_locale=de : display_name=a #Deutschland# +----------------- +locale='ar-a-aaa-b-bbb-a-ccc' +disp_locale=en : display_name=Arabic #a=aaa, b=bbb# +disp_locale=fr : display_name=arabe #a=aaa, b=bbb# +disp_locale=de : display_name=Arabisch #a=aaa, b=bbb# +----------------- diff --git a/ext/intl/tests/locale_get_display_region3.phpt b/ext/intl/tests/locale_get_display_region3.phpt new file mode 100644 index 0000000000000..ec287a64462aa --- /dev/null +++ b/ext/intl/tests/locale_get_display_region3.phpt @@ -0,0 +1,275 @@ +--TEST-- +locale_get_display_region() icu >= 51.2 +--SKIPIF-- + += 51.2'); ?> +--FILE-- + +--EXPECTREGEX-- +locale='uk-ua_CALIFORNIA@currency=;currency=GRN' +disp_locale=en : display_region=Ukraine +disp_locale=fr : display_region=Ukraine +disp_locale=de : display_region=Ukraine +----------------- +locale='root' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='uk@currency=EURO' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='Hindi' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='de' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='fr' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='ja' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='i-enochian' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='zh-Hant' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='zh-Hans' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='sr-Cyrl' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='sr-Latn' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='zh-Hans-CN' +disp_locale=en : display_region=China +disp_locale=fr : display_region=Chine +disp_locale=de : display_region=China +----------------- +locale='sr-Latn-CS' +disp_locale=en : display_region=Serbia +disp_locale=fr : display_region=Serbie +disp_locale=de : display_region=Serbien +----------------- +locale='sl-rozaj' +disp_locale=en : display_region=(ROZAJ)? +disp_locale=fr : display_region=(ROZAJ)? +disp_locale=de : display_region=(ROZAJ)? +----------------- +locale='sl-nedis' +disp_locale=en : display_region=(NEDIS)? +disp_locale=fr : display_region=(NEDIS)? +disp_locale=de : display_region=(NEDIS)? +----------------- +locale='de-CH-1901' +disp_locale=en : display_region=Switzerland +disp_locale=fr : display_region=Suisse +disp_locale=de : display_region=Schweiz +----------------- +locale='sl-IT-nedis' +disp_locale=en : display_region=Italy +disp_locale=fr : display_region=Italie +disp_locale=de : display_region=Italien +----------------- +locale='sl-Latn-IT-nedis' +disp_locale=en : display_region=Italy +disp_locale=fr : display_region=Italie +disp_locale=de : display_region=Italien +----------------- +locale='de-DE' +disp_locale=en : display_region=Germany +disp_locale=fr : display_region=Allemagne +disp_locale=de : display_region=Deutschland +----------------- +locale='en-US' +disp_locale=en : display_region=United States +disp_locale=fr : display_region=États-Unis +disp_locale=de : display_region=Vereinigte Staaten +----------------- +locale='es-419' +disp_locale=en : display_region=Latin America +disp_locale=fr : display_region=Amérique latine +disp_locale=de : display_region=Lateinamerika +----------------- +locale='de-CH-x-phonebk' +disp_locale=en : display_region=Switzerland +disp_locale=fr : display_region=Suisse +disp_locale=de : display_region=Schweiz +----------------- +locale='az-Arab-x-AZE-derbend' +disp_locale=en : display_region=X? +disp_locale=fr : display_region=X? +disp_locale=de : display_region=X? +----------------- +locale='zh-min' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='zh-min-nan-Hant-CN' +disp_locale=en : display_region=MIN +disp_locale=fr : display_region=MIN +disp_locale=de : display_region=MIN +----------------- +locale='x-whatever' +disp_locale=en : display_region= +disp_locale=fr : display_region= +disp_locale=de : display_region= +----------------- +locale='qaa-Qaaa-QM-x-southern' +disp_locale=en : display_region=QM +disp_locale=fr : display_region=QM +disp_locale=de : display_region=QM +----------------- +locale='sr-Latn-QM' +disp_locale=en : display_region=QM +disp_locale=fr : display_region=QM +disp_locale=de : display_region=QM +----------------- +locale='sr-Qaaa-CS' +disp_locale=en : display_region=Serbia +disp_locale=fr : display_region=Serbie +disp_locale=de : display_region=Serbien +----------------- +locale='en-US-u-islamCal' +disp_locale=en : display_region=United States +disp_locale=fr : display_region=États-Unis +disp_locale=de : display_region=Vereinigte Staaten +----------------- +locale='zh-CN-a-myExt-x-private' +disp_locale=en : display_region=China +disp_locale=fr : display_region=Chine +disp_locale=de : display_region=China +----------------- +locale='en-a-myExt-b-another' +disp_locale=en : display_region=A? +disp_locale=fr : display_region=A? +disp_locale=de : display_region=A? +----------------- +locale='de-419-DE' +disp_locale=en : display_region=Latin America +disp_locale=fr : display_region=Amérique latine +disp_locale=de : display_region=Lateinamerika +----------------- +locale='a-DE' +disp_locale=en : display_region=Germany +disp_locale=fr : display_region=Allemagne +disp_locale=de : display_region=Deutschland +----------------- +locale='ar-a-aaa-b-bbb-a-ccc' +disp_locale=en : display_region=A? +disp_locale=fr : display_region=A? +disp_locale=de : display_region=A? +----------------- diff --git a/ext/intl/tests/locale_lookup_variant2.phpt b/ext/intl/tests/locale_lookup_variant2.phpt new file mode 100644 index 0000000000000..4715951e9abb0 --- /dev/null +++ b/ext/intl/tests/locale_lookup_variant2.phpt @@ -0,0 +1,100 @@ +--TEST-- +locale_lookup.phpt() +--SKIPIF-- + += 51.2'); ?> +--FILE-- + +--EXPECT-- +-------------- +loc_range:de-de +lang_tags: de-DEVA,de-DE-1996,de-DE,zh_Hans,de-CH-1996,sl_IT,sl_IT_nedis-a-kirti-x-xyz,sl_IT_rozaj,sl_IT_NEDIS_ROJAZ_1901,i-enochian,sgn-CH-de,art-lojban,i-lux,art-lojban,jbo,en_sl_IT,zh-Hant-CN-x-prv1-prv2 + +lookup result:de-DE +Canonical lookup result:de_de +-------------- +loc_range:sl_IT +lang_tags: de-DEVA,de-DE-1996,de-DE,zh_Hans,de-CH-1996,sl_IT,sl_IT_nedis-a-kirti-x-xyz,sl_IT_rozaj,sl_IT_NEDIS_ROJAZ_1901,i-enochian,sgn-CH-de,art-lojban,i-lux,art-lojban,jbo,en_sl_IT,zh-Hant-CN-x-prv1-prv2 + +lookup result:sl_IT +Canonical lookup result:sl_it +-------------- +loc_range:sl_IT_Nedis +lang_tags: de-DEVA,de-DE-1996,de-DE,zh_Hans,de-CH-1996,sl_IT,sl_IT_nedis-a-kirti-x-xyz,sl_IT_rozaj,sl_IT_NEDIS_ROJAZ_1901,i-enochian,sgn-CH-de,art-lojban,i-lux,art-lojban,jbo,en_sl_IT,zh-Hant-CN-x-prv1-prv2 + +lookup result:sl_IT +Canonical lookup result:sl_it +-------------- +loc_range:jbo +lang_tags: de-DEVA,de-DE-1996,de-DE,zh_Hans,de-CH-1996,sl_IT,sl_IT_nedis-a-kirti-x-xyz,sl_IT_rozaj,sl_IT_NEDIS_ROJAZ_1901,i-enochian,sgn-CH-de,art-lojban,i-lux,art-lojban,jbo,en_sl_IT,zh-Hant-CN-x-prv1-prv2 + +lookup result:jbo +Canonical lookup result:jbo +-------------- +loc_range:art-lojban +lang_tags: de-DEVA,de-DE-1996,de-DE,zh_Hans,de-CH-1996,sl_IT,sl_IT_nedis-a-kirti-x-xyz,sl_IT_rozaj,sl_IT_NEDIS_ROJAZ_1901,i-enochian,sgn-CH-de,art-lojban,i-lux,art-lojban,jbo,en_sl_IT,zh-Hant-CN-x-prv1-prv2 + +lookup result:art-lojban +Canonical lookup result:art__lojban diff --git a/ext/intl/tests/msgfmt_format_intlcalendar_variant2.phpt b/ext/intl/tests/msgfmt_format_intlcalendar_variant2.phpt new file mode 100644 index 0000000000000..f2d16b899dcdf --- /dev/null +++ b/ext/intl/tests/msgfmt_format_intlcalendar_variant2.phpt @@ -0,0 +1,30 @@ +--TEST-- +MessageFormat accepts IntlCalendar args +--SKIPIF-- + += 51.2'); ?> +--FILE-- +format(array($cal)), "\n"; + +//NOT FIXED: +/*$msgf = new MessageFormatter('en_US', +'{1, select, date {{0,date,full}} other {{0,time,h:m:s a V}}}'); + +echo "msgf2: ", $msgf->format(array($time, 'date')), " ", + $msgf->format(array($time, 'time')), "\n"; +*/ + +?> +==DONE== +--EXPECT-- +Quinta-feira, 17 de Maio de 2012 5:35:36 PM ptlis +==DONE== diff --git a/ext/intl/tests/resourcebundle_null_mandatory_args_variant2.phpt b/ext/intl/tests/resourcebundle_null_mandatory_args_variant2.phpt new file mode 100644 index 0000000000000..cf721c8ef2538 --- /dev/null +++ b/ext/intl/tests/resourcebundle_null_mandatory_args_variant2.phpt @@ -0,0 +1,26 @@ +--TEST-- +ResourceBundle constructor bundle accepts NULL for first two arguments +--INI-- +date.timezone=Atlantic/Azores +--SKIPIF-- + += 51.2'); ?> +--FILE-- +get('calendar')->get('gregorian')->get('DateTimePatterns')->get(0); +var_dump($c); + +ini_set('intl.default_locale', 'pt_PT'); +$r = new ResourceBundle(NULL, NULL); +$c = $r->get('calendar')->get('gregorian')->get('DateTimePatterns')->get(0); +var_dump($c); +?> +==DONE== +--EXPECT-- +string(14) "h:mm:ss a zzzz" +string(13) "HH:mm:ss zzzz" +==DONE== diff --git a/ext/intl/tests/timezone_getDisplayName_variant4.phpt b/ext/intl/tests/timezone_getDisplayName_variant4.phpt new file mode 100644 index 0000000000000..39e28892a448d --- /dev/null +++ b/ext/intl/tests/timezone_getDisplayName_variant4.phpt @@ -0,0 +1,35 @@ +--TEST-- +IntlTimeZone::getDisplayName(): type parameter (ICU >= 51.2) +--SKIPIF-- + += 51.2'); ?> +--FILE-- +getDisplayName(false, IntlTimeZone::DISPLAY_SHORT)); +var_dump($lsb->getDisplayName(false, IntlTimeZone::DISPLAY_LONG)); +var_dump($lsb->getDisplayName(false, IntlTimeZone::DISPLAY_SHORT_GENERIC)); +var_dump($lsb->getDisplayName(false, IntlTimeZone::DISPLAY_LONG_GENERIC)); +var_dump($lsb->getDisplayName(false, IntlTimeZone::DISPLAY_SHORT_GMT)); +var_dump($lsb->getDisplayName(false, IntlTimeZone::DISPLAY_LONG_GMT)); +var_dump($lsb->getDisplayName(false, IntlTimeZone::DISPLAY_SHORT_COMMONLY_USED)); +var_dump($lsb->getDisplayName(false, IntlTimeZone::DISPLAY_GENERIC_LOCATION)); + +?> +==DONE== +--EXPECT-- +string(3) "GMT" +string(30) "Western European Standard Time" +string(13) "Portugal Time" +string(21) "Western European Time" +string(5) "+0000" +string(3) "GMT" +string(3) "GMT" +string(13) "Portugal Time" +==DONE== From 674dd73f8c34b9faf1e777a301e5302348b48b9d Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Mon, 7 Oct 2013 22:10:05 +0800 Subject: [PATCH 219/400] Added two more test cases for CN matching. --- ext/openssl/tests/bug65729.phpt | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/ext/openssl/tests/bug65729.phpt b/ext/openssl/tests/bug65729.phpt index d4645d9f5b432..7008f3c7b56c4 100644 --- a/ext/openssl/tests/bug65729.phpt +++ b/ext/openssl/tests/bug65729.phpt @@ -13,24 +13,28 @@ stream_context_set_option($context, 'ssl', 'allow_self_signed', true); $server = stream_socket_server('ssl://127.0.0.1:64321', $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context); +$expected_names = array('foo.test.com.sg', 'foo.test.com', 'foo.bar.test.com'); + $pid = pcntl_fork(); if ($pid == -1) { die('could not fork'); } else if ($pid) { - $contextC = stream_context_create( - array( + foreach ($expected_names as $expected_name) { + $contextC = stream_context_create(array( 'ssl' => array( 'verify_peer' => true, 'allow_self_signed' => true, - 'CN_match' => 'foo.test.com.sg', + 'CN_match' => $expected_name, ) - ) - ); - var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, + )); + var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $contextC)); + } } else { @pcntl_wait($status); - @stream_socket_accept($server, 1); + foreach ($expected_names as $name) { + @stream_socket_accept($server, 1); + } } --EXPECTF-- Warning: stream_socket_client(): Peer certificate CN=`*.test.com' did not match expected CN=`foo.test.com.sg' in %s on line %d @@ -39,4 +43,11 @@ Warning: stream_socket_client(): Failed to enable crypto in %s on line %d Warning: stream_socket_client(): unable to connect to ssl://127.0.0.1:64321 (Unknown error) in %s on line %d bool(false) +resource(%d) of type (stream) + +Warning: stream_socket_client(): Peer certificate CN=`*.test.com' did not match expected CN=`foo.bar.test.com' in %s on line %d + +Warning: stream_socket_client(): Failed to enable crypto in %s on line %d +Warning: stream_socket_client(): unable to connect to ssl://127.0.0.1:64321 (Unknown error) in %s on line %d +bool(false) From 39c0daeb71f76ce22dc604bda8a063319fd55e59 Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Mon, 7 Oct 2013 23:04:24 +0800 Subject: [PATCH 220/400] Use zend_bool as return value for _match() --- ext/openssl/openssl.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 2aa850ad1c0db..2b345700ff853 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -4829,7 +4829,7 @@ static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx) /* {{{ */ } /* }}} */ -static int php_openssl_match_cn(const char *subjectname, const char *certname) +static zend_bool php_openssl_match_cn(const char *subjectname, const char *certname) { char *wildcard; int prefix_len, suffix_len, subject_len; @@ -4902,7 +4902,6 @@ int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stre /* Does the common name match ? (used primarily for https://) */ GET_VER_OPT_STRING("CN_match", cnmatch); if (cnmatch) { - int match = 0; int name_len = X509_NAME_get_text_by_NID(name, NID_commonName, buf, sizeof(buf)); if (name_len == -1) { @@ -4913,9 +4912,7 @@ int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stre return FAILURE; } - match = php_openssl_match_cn(cnmatch, buf); - - if (!match) { + if (!php_openssl_match_cn(cnmatch, buf)) { /* didn't match */ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer certificate CN=`%.*s' did not match expected CN=`%s'", name_len, buf, cnmatch); return FAILURE; From 12f9939b790a02ca3f22b91813029e78208f2c24 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Mon, 7 Oct 2013 17:23:11 -0700 Subject: [PATCH 221/400] Bump mininum requirements for PHP OCI8 2.0 to PHP 5.2 and Oracle client library 10.2 (Note this will connect to Oracle Database 8.1.7 onwards). Use the older OCI8 1.4 from PECL if using an earlier PHP version or older Oracle client library support is necessary. --- ext/oci8/config.m4 | 25 ++++-------------------- ext/oci8/config.w32 | 2 -- ext/oci8/oci8.c | 40 +++----------------------------------- ext/oci8/oci8_collection.c | 12 ------------ ext/oci8/oci8_interface.c | 12 ------------ ext/oci8/oci8_lob.c | 38 ------------------------------------ ext/oci8/package.xml | 25 ++++++++++++++---------- ext/oci8/php_oci8_int.h | 4 ---- 8 files changed, 22 insertions(+), 136 deletions(-) diff --git a/ext/oci8/config.m4 b/ext/oci8/config.m4 index 3873a2205aa36..0d08d21c29e61 100644 --- a/ext/oci8/config.m4 +++ b/ext/oci8/config.m4 @@ -208,8 +208,8 @@ if test "$PHP_OCI8" != "no"; then IFS=$ac_IFS oci8_php_version=`expr [$]1 \* 1000000 + [$]2 \* 1000 + [$]3` - 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]) + if test "$oci8_php_version" -lt "5002000"; then + AC_MSG_ERROR([You need at least PHP 5.2.0 to be able to use this version of OCI8. PHP $php_version found]) else AC_MSG_RESULT([$php_version, ok]) fi @@ -332,24 +332,8 @@ if test "$PHP_OCI8" != "no"; then AC_OCI8_ORACLE_VERSION($OCI8_DIR) case $OCI8_ORACLE_VERSION in - 7.3|8.0|8.1) - AC_MSG_ERROR([Oracle client libraries < 9.2 are not supported]) - ;; - - 9.0) - PHP_CHECK_LIBRARY(clntsh, OCIEnvNlsCreate, - [ - OCI8_ORACLE_VERSION=9.2 - ], - [ - AC_MSG_ERROR([Oracle client libraries < 9.2 are not supported]) - ], [ - -L$OCI8_DIR/$OCI8_LIB_DIR $OCI8_SHARED_LIBADD - ]) - ;; - - *) - AC_DEFINE(HAVE_OCI_LOB_READ2,1,[Defined to 1 if OCI8 configuration located Oracle's OCILobRead2 function]) + 7.3|8.0|8.1|9.0) + AC_MSG_ERROR([Oracle client libraries < 10 are not supported]) ;; esac @@ -425,7 +409,6 @@ if test "$PHP_OCI8" != "no"; then PHP_ADD_LIBPATH($PHP_OCI8_INSTANT_CLIENT, OCI8_SHARED_LIBADD) 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,[Defined to 1 if the PHP OCI8 extension for Oracle Database is configured]) diff --git a/ext/oci8/config.w32 b/ext/oci8/config.w32 index ac573a8af39a1..750f163950cc9 100644 --- a/ext/oci8/config.w32 +++ b/ext/oci8/config.w32 @@ -29,8 +29,6 @@ if (PHP_OCI8_12C != "no") { AC_DEFINE('HAVE_OCI8', 1); AC_DEFINE('HAVE_OCI_INSTANT_CLIENT', 1); - AC_DEFINE('HAVE_OCI_LOB_READ2', 1); - } else { WARNING("oci8-12c not enabled: Oracle Database client libraries or Oracle Database 12c Instant Client not found"); PHP_OCI8_12C = "no" diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index eeb1ade7bb802..f8abacf3e6c6a 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -39,12 +39,9 @@ #if HAVE_OCI8 -#if PHP_MAJOR_VERSION > 5 -#error This version of the PHP OCI8 extension is not compatible with PHP 6 or later -#elif PHP_MAJOR_VERSION < 5 -#ifdef ZTS -#error The PHP OCI8 extension does not support ZTS mode in PHP 4 -#endif +/* PHP 5.2 is the minimum supported version for OCI8 2.0 */ +#if PHP_MAJOR_VERSION < 5 || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION <= 1) +#error Use PHP OCI8 1.4 for your version of PHP #endif #include "php_oci8.h" @@ -66,11 +63,8 @@ #endif ZEND_DECLARE_MODULE_GLOBALS(oci) -#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5) -/* This "if" allows PECL builds from this file to be portable to older PHP releases */ static PHP_GINIT_FUNCTION(oci); static PHP_GSHUTDOWN_FUNCTION(oci); -#endif /* Allow PHP 5.3 branch to be used in PECL for 5.x compatible builds */ #ifndef Z_ADDREF_P @@ -1055,16 +1049,11 @@ zend_module_entry oci8_module_entry = { PHP_RSHUTDOWN(oci), /* per-request shutdown function */ PHP_MINFO(oci), /* information function */ PHP_OCI8_VERSION, -#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5) - /* This check allows PECL builds from this file to be portable to older PHP releases */ PHP_MODULE_GLOBALS(oci), /* globals descriptor */ PHP_GINIT(oci), /* globals ctor */ PHP_GSHUTDOWN(oci), /* globals dtor */ NULL, /* post deactivate */ STANDARD_MODULE_PROPERTIES_EX -#else - STANDARD_MODULE_PROPERTIES -#endif }; /* }}} */ @@ -1183,12 +1172,7 @@ static void php_oci_cleanup_global_handles(TSRMLS_D) * * Zerofill globals during module init */ -#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5) -/* This check allows PECL builds from this file to be portable to older PHP releases */ static PHP_GINIT_FUNCTION(oci) -#else -static void php_oci_init_globals(zend_oci_globals *oci_globals TSRMLS_DC) -#endif { memset(oci_globals, 0, sizeof(zend_oci_globals)); } @@ -1198,12 +1182,7 @@ static void php_oci_init_globals(zend_oci_globals *oci_globals TSRMLS_DC) * * Called for thread shutdown in ZTS, after module shutdown for non-ZTS */ -/* This check allows PECL builds from this file to be portable to older PHP releases */ -#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5) static PHP_GSHUTDOWN_FUNCTION(oci) -#else -static void php_oci_shutdown_globals(zend_oci_globals *oci_globals TSRMLS_DC) -#endif { php_oci_cleanup_global_handles(TSRMLS_C); } @@ -1214,12 +1193,6 @@ PHP_MINIT_FUNCTION(oci) zend_class_entry oci_lob_class_entry; zend_class_entry oci_coll_class_entry; -#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5) - /* This check allows PECL builds from this file to be portable to older PHP releases */ - /* this is handled by new globals management code */ -#else - ZEND_INIT_MODULE_GLOBALS(oci, php_oci_init_globals, php_oci_shutdown_globals); -#endif REGISTER_INI_ENTRIES(); le_statement = zend_register_list_destructors_ex(php_oci_statement_list_dtor, NULL, "oci8 statement", module_number); @@ -1331,13 +1304,6 @@ PHP_RINIT_FUNCTION(oci) PHP_MSHUTDOWN_FUNCTION(oci) { -/* Work around PHP_GSHUTDOWN_FUNCTION not being called in older versions of PHP */ -#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 2) || (PHP_MAJOR_VERSION < 5) -#ifndef ZTS - php_oci_cleanup_global_handles(TSRMLS_C); -#endif -#endif - OCI_G(shutdown) = 1; UNREGISTER_INI_ENTRIES(); diff --git a/ext/oci8/oci8_collection.c b/ext/oci8/oci8_collection.c index 320e90a5b8999..35b70fa7af73f 100644 --- a/ext/oci8/oci8_collection.c +++ b/ext/oci8/oci8_collection.c @@ -361,13 +361,7 @@ int php_oci_collection_append_number(php_oci_collection *collection, char *numbe 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 */ - element_double = strtod(number, NULL); -#else - /* zend_strtod was introduced in PHP 4.3.10 */ element_double = zend_strtod(number, NULL); -#endif PHP_OCI_CALL_RETURN(errstatus, OCINumberFromReal, (connection->err, &element_double, sizeof(double), &oci_number)); @@ -666,13 +660,7 @@ int php_oci_collection_element_set_number(php_oci_collection *collection, long i 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 */ - element_double = strtod(number, NULL); -#else - /* zend_strtod was introduced in PHP 4.3.10 */ element_double = zend_strtod(number, NULL); -#endif PHP_OCI_CALL_RETURN(errstatus, OCINumberFromReal, (connection->err, &element_double, sizeof(double), &oci_number)); diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c index a452c1a7e2902..ccaed797429f1 100644 --- a/ext/oci8/oci8_interface.c +++ b/ext/oci8/oci8_interface.c @@ -1429,13 +1429,7 @@ PHP_FUNCTION(oci_fetch_all) if (flags & PHP_OCI_NUM) { zend_hash_next_index_insert(Z_ARRVAL_P(row), &element, sizeof(zval*), NULL); } else { /* default to ASSOC */ -#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5) - /* zend_symtable_update is only available in 5.2+ */ zend_symtable_update(Z_ARRVAL_P(row), columns[ i ]->name, columns[ i ]->name_len+1, &element, sizeof(zval*), NULL); -#else - /* This code path means Bug #45458 will remain broken when OCI8 is built with PHP 4 */ - zend_hash_update(Z_ARRVAL_P(row), columns[ i ]->name, columns[ i ]->name_len+1, &element, sizeof(zval*), NULL); -#endif } } @@ -1467,13 +1461,7 @@ PHP_FUNCTION(oci_fetch_all) MAKE_STD_ZVAL(tmp); array_init(tmp); -#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5) - /* zend_symtable_update is only available in 5.2+ */ zend_symtable_update(Z_ARRVAL_P(array), columns[ i ]->name, columns[ i ]->name_len+1, (void *) &tmp, sizeof(zval*), (void **) &(outarrs[ i ])); -#else - /* This code path means Bug #45458 will remain broken when OCI8 is built with PHP 4 */ - zend_hash_update(Z_ARRVAL_P(array), columns[ i ]->name, columns[ i ]->name_len+1, (void *) &tmp, sizeof(zval*), (void **) &(outarrs[ i ])); -#endif } } diff --git a/ext/oci8/oci8_lob.c b/ext/oci8/oci8_lob.c index 8d14dc3f503aa..4f58c65737f97 100644 --- a/ext/oci8/oci8_lob.c +++ b/ext/oci8/oci8_lob.c @@ -165,11 +165,7 @@ int php_oci_lob_get_length (php_oci_descriptor *descriptor, ub4 *length TSRMLS_D /* {{{ php_oci_lob_callback() Append LOB portion to a memory buffer */ -#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) -#else -sb4 php_oci_lob_callback (dvoid *ctxp, CONST dvoid *bufxp, ub4 len, ub1 piece) -#endif { ub4 lenp = (ub4) len; php_oci_lob_ctx *ctx = (php_oci_lob_ctx *)ctxp; @@ -251,14 +247,9 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini int buffer_size = PHP_OCI_LOB_BUFFER_SIZE; php_oci_lob_ctx ctx; ub1 *bufp; -#if defined(HAVE_OCI_LOB_READ2) oraub8 bytes_read, offset = 0; oraub8 requested_len = read_length; /* this is by default */ oraub8 chars_read = 0; -#else - int bytes_read, offset = 0; - int requested_len = read_length; /* this is by default */ -#endif int is_clob = 0; sb4 bytes_per_char = 1; sword errstatus; @@ -336,7 +327,6 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini ctx.alloc_len = (requested_len + 1) * bytes_per_char; *data = ecalloc(bytes_per_char, requested_len + 1); -#ifdef HAVE_OCI_LOB_READ2 if (is_clob) { chars_read = requested_len; bytes_read = 0; @@ -374,34 +364,6 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini } else { offset = descriptor->lob_current_position + bytes_read; } - -#else - - bytes_read = requested_len; - buffer_size = (requested_len < buffer_size ) ? requested_len : buffer_size; /* optimize buffer size */ - 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(errstatus, OCILobRead, - ( - connection->svc, - connection->err, - descriptor->descriptor, - &bytes_read, /* IN/OUT bytes toread/read */ - offset + 1, /* offset (starts with 1) */ - (dvoid *) bufp, - (ub4) buffer_size, /* size of buffer */ - (dvoid *)&ctx, - (OCICallbackLobRead) php_oci_lob_callback, /* callback... */ - (ub2) descriptor->charset_id, /* The character set ID of the buffer data. */ - (ub1) descriptor->charset_form /* The character set form of the buffer data. */ - ) - ); - - efree(bufp); - offset = descriptor->lob_current_position + bytes_read; - -#endif if (errstatus != OCI_SUCCESS) { connection->errcode = php_oci_error(connection->err, errstatus TSRMLS_CC); diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index 1161b031f33a0..d2c49726a877c 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -8,12 +8,15 @@ http://pear.php.net/dtd/package-2.0.xsd"> Extension for Oracle Database - 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. +The PHP OCI8 extension gives access to Oracle Database. The extension +can be linked with Oracle client libraries from Oracle Database 10.2, +11, or 12.1. These libraries are found in the database installation, +or in the free Oracle Instant Client. Oracle's standard cross-version +connectivity applies. For example, PHP OCI8 linked with Instant +Client 11.2 can connect to Oracle Database 9.2 onwards. PHP OCI8 2.0 +can be built with PHP 5.2 onwards. Use the older PHP OCI8 1.4.10 when +using PHP 4.3.9 through to PHP 5.1.x, or when only Oracle Database 9.2 +client libraries are available. Christopher Jones @@ -40,7 +43,7 @@ http://pear.php.net/dtd/package-2.0.xsd"> no - 2013-09-27 + 2013-10-08 @@ -53,7 +56,10 @@ http://pear.php.net/dtd/package-2.0.xsd"> PHP - - no notes yet +Bump mininum requirements for PHP OCI8 2.0 to PHP 5.2 and Oracle +client library 10.2 (Note this will connect to Oracle Database 8.1.7 +onwards). Use the older OCI8 1.4 if an earlier PHP version or older +Oracle client library support is necessary. @@ -438,8 +444,7 @@ http://pear.php.net/dtd/package-2.0.xsd"> - 4.3.9 - 6.0.0 + 5.2.0 1.4.0b1 diff --git a/ext/oci8/php_oci8_int.h b/ext/oci8/php_oci8_int.h index 2d4ff26947e99..e50983d75eb53 100644 --- a/ext/oci8/php_oci8_int.h +++ b/ext/oci8/php_oci8_int.h @@ -438,11 +438,7 @@ int php_oci_lob_append(php_oci_descriptor *descriptor_dest, php_oci_descriptor * 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); -#else -sb4 php_oci_lob_callback(dvoid *ctxp, CONST dvoid *bufxp, ub4 len, ub1 piece); -#endif /* }}} */ /* {{{ collection related prototypes */ From 1675fd22775c7067c5d21e0cc1a0cc81f9434a5c Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Mon, 7 Oct 2013 17:26:00 -0700 Subject: [PATCH 222/400] Add new tests --- ext/oci8/tests/db_op_1.phpt | 61 ++++++++++++++++++++++++++++++++ ext/oci8/tests/db_op_2.phpt | 69 +++++++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 ext/oci8/tests/db_op_1.phpt create mode 100644 ext/oci8/tests/db_op_2.phpt diff --git a/ext/oci8/tests/db_op_1.phpt b/ext/oci8/tests/db_op_1.phpt new file mode 100644 index 0000000000000..f645cf80ff3b2 --- /dev/null +++ b/ext/oci8/tests/db_op_1.phpt @@ -0,0 +1,61 @@ +--TEST-- +oci_set_db_operation: basic test for end-to-end tracing +--SKIPIF-- + true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +if (strcasecmp($user, "system") && strcasecmp($user, "sys")) { + die("skip needs to be run as a DBA user"); +} +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"); +} +if (!function_exists('oci_set_db_operation')) +{ + die("skip function oci_set_db_operation() does not exist"); +} +?> +--FILE-- + +===DONE=== + +--EXPECTF-- +Test 1 +array(1) { + ["DUMMY"]=> + string(1) "X" +} +array(1) { + ["DBOP_NAME"]=> + string(7) "db_op_1" +} +===DONE=== + diff --git a/ext/oci8/tests/db_op_2.phpt b/ext/oci8/tests/db_op_2.phpt new file mode 100644 index 0000000000000..05c2269ae0bfd --- /dev/null +++ b/ext/oci8/tests/db_op_2.phpt @@ -0,0 +1,69 @@ +--TEST-- +oci_set_db_operation: basic test for end-to-end tracing +--SKIPIF-- + true, 'timesten' => false); // test runs on these DBs +require(dirname(__FILE__).'/skipif.inc'); +if (strcasecmp($user, "system") && strcasecmp($user, "sys")) { + die("skip needs to be run as a DBA user"); +} +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"); +} +if (!function_exists('oci_set_db_operation')) +{ + die("skip function oci_set_db_operation() does not exist"); +} +?> +--FILE-- + +===DONE=== + +--XFAIL-- +Fails due to Oracle Bug 16695981 +--EXPECTF-- +Test 1 +array(1) { + ["DUMMY"]=> + string(1) "X" +} +Test 2 +array(1) { + ["DUMMY"]=> + string(1) "X" +} +Test 3 +array(2) { + ["DBOP_NAME"]=> + string(7) "db_op_2a" +} +===DONE=== + From f0863fa43aa2201b7e2a749f5a8e98e519cfd47f Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Mon, 7 Oct 2013 17:38:56 -0700 Subject: [PATCH 223/400] Add new tests to package.xml --- ext/oci8/package.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index d2c49726a877c..47e5415aa8394 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -227,6 +227,8 @@ Oracle client library support is necessary. + + From 6106896440572dd8093acdd11ea691a07d9b169c Mon Sep 17 00:00:00 2001 From: datibbaw Date: Tue, 8 Oct 2013 10:07:54 +0800 Subject: [PATCH 224/400] DNS name comparison is now case insensitive. --- ext/openssl/openssl.c | 6 +++--- ext/openssl/tests/bug65729.phpt | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 2b345700ff853..15cf798ddba33 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -4834,7 +4834,7 @@ static zend_bool php_openssl_match_cn(const char *subjectname, const char *certn char *wildcard; int prefix_len, suffix_len, subject_len; - if (strcmp(subjectname, certname) == 0) { + if (strcasecmp(subjectname, certname) == 0) { return 1; } @@ -4844,7 +4844,7 @@ static zend_bool php_openssl_match_cn(const char *subjectname, const char *certn // 1) prefix, if not empty, must match subject prefix_len = wildcard - certname; - if (prefix_len && strncmp(subjectname, certname, prefix_len) != 0) { + if (prefix_len && strncasecmp(subjectname, certname, prefix_len) != 0) { return 0; } @@ -4854,7 +4854,7 @@ static zend_bool php_openssl_match_cn(const char *subjectname, const char *certn /* 2) suffix must match * 3) no . between prefix and suffix **/ - return strcmp(wildcard + 1, subjectname + subject_len - suffix_len) == 0 && + return strcasecmp(wildcard + 1, subjectname + subject_len - suffix_len) == 0 && memchr(subjectname + prefix_len, '.', subject_len - suffix_len - prefix_len) == NULL; } diff --git a/ext/openssl/tests/bug65729.phpt b/ext/openssl/tests/bug65729.phpt index 7008f3c7b56c4..c0ee4443ebee5 100644 --- a/ext/openssl/tests/bug65729.phpt +++ b/ext/openssl/tests/bug65729.phpt @@ -13,7 +13,7 @@ stream_context_set_option($context, 'ssl', 'allow_self_signed', true); $server = stream_socket_server('ssl://127.0.0.1:64321', $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context); -$expected_names = array('foo.test.com.sg', 'foo.test.com', 'foo.bar.test.com'); +$expected_names = array('foo.test.com.sg', 'foo.test.com', 'FOO.TEST.COM', 'foo.bar.test.com'); $pid = pcntl_fork(); if ($pid == -1) { @@ -44,6 +44,7 @@ Warning: stream_socket_client(): Failed to enable crypto in %s on line %d Warning: stream_socket_client(): unable to connect to ssl://127.0.0.1:64321 (Unknown error) in %s on line %d bool(false) resource(%d) of type (stream) +resource(%d) of type (stream) Warning: stream_socket_client(): Peer certificate CN=`*.test.com' did not match expected CN=`foo.bar.test.com' in %s on line %d From f32d2ac3aaa7d4af7c348b00ebebb9ae64955704 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Tue, 8 Oct 2013 08:37:08 +0200 Subject: [PATCH 225/400] fix bug #51076 (race condition in shtool's mkdir -p) --- NEWS | 4 ++++ build/shtool | 9 ++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 796f82f207847..6649a4965acf9 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2013, PHP 5.5.5 +- Buildsystem: + . Fixed bug #51076 (race condition in shtool's mkdir -p implementation). + (Mike, Raphael Geissert) + - Core: . Fixed bug #64979 (Wrong behavior of static variables in closure generators). (Nikita) diff --git a/build/shtool b/build/shtool index 684a01f5df968..fc6ae1e6efbbb 100755 --- a/build/shtool +++ b/build/shtool @@ -1003,7 +1003,14 @@ mkdir ) if [ ".$opt_t" = .yes ]; then echo "mkdir $pathcomp" 1>&2 fi - mkdir $pathcomp || errstatus=$? + # See https://bugs.php.net/51076 + # The fix is from Debian who have sent it + # upstream, too; but upstream seems dead. + mkdir $pathcomp || { + _errstatus=$? + [ -d "$pathcomp" ] || errstatus=${_errstatus} + unset _errstatus + } if [ ".$opt_o" != . ]; then if [ ".$opt_t" = .yes ]; then echo "chown $opt_o $pathcomp" 1>&2 From 5d430ad90257e353321789d9dfe529554028ff6e Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Tue, 8 Oct 2013 11:16:53 +0200 Subject: [PATCH 226/400] fix bad cast --- ext/standard/php_fopen_wrapper.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/standard/php_fopen_wrapper.c b/ext/standard/php_fopen_wrapper.c index 76f77ebf7b5f4..0adb1e05290a0 100644 --- a/ext/standard/php_fopen_wrapper.c +++ b/ext/standard/php_fopen_wrapper.c @@ -120,11 +120,11 @@ static int php_stream_input_flush(php_stream *stream TSRMLS_DC) /* {{{ */ static int php_stream_input_seek(php_stream *stream, off_t offset, int whence, off_t *newoffset TSRMLS_DC) /* {{{ */ { - php_stream *inner = stream->abstract; + php_stream_input_t *input = stream->abstract; - if (inner) { - int sought = php_stream_seek(inner, offset, whence); - *newoffset = inner->position; + if (*input->body_ptr) { + int sought = php_stream_seek(*input->body_ptr, offset, whence); + *newoffset = (*input->body_ptr)->position; return sought; } From cf6413ae7ca9773ea154df3b94ce9299435f0e33 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Tue, 8 Oct 2013 16:20:07 +0200 Subject: [PATCH 227/400] openssl NEWS,UPGRADING --- NEWS | 5 +++++ UPGRADING | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/NEWS b/NEWS index 8113514420b8d..c2cf3d76d21d9 100644 --- a/NEWS +++ b/NEWS @@ -40,6 +40,11 @@ PHP NEWS cache_slots) in op_array->literals table. (Laruence, Dmitry) . Added script level constant replacement optimization pass. (Dmitry) +- Openssl: + . Added crypto_method option for the ssl stream context. (Martin Jansen) + . Added certificate fingerprint support. (Tjerk Meesters) + . Fixed bug #65729 (CN_match gives false positive). (Tjerk Meesters) + - PDO_pgsql: . Fixed Bug #42614 (PDO_pgsql: add pg_get_notify support). (Matteo) . Fixed Bug #63657 (pgsqlCopyFromFile, pgsqlCopyToArray use Postgres < 7.3 diff --git a/UPGRADING b/UPGRADING index fb8daab2d609c..238aa5ea41a9c 100755 --- a/UPGRADING +++ b/UPGRADING @@ -42,6 +42,11 @@ PHP X.Y UPGRADE NOTES - Added gost-crypto (CryptoPro S-box) hash algo. +- Added openssl certificate fingerprint support (inclusive stream context + option). + +- Added openssl crypto method stream context option. + ======================================== 2. Changes in SAPI modules ======================================== @@ -71,6 +76,8 @@ PHP X.Y UPGRADE NOTES 5. New Functions ======================================== +- Openssl: + Added string openssl_x509_fingerprint($x509, $type, $binary). ======================================== 6. New Classes and Interfaces @@ -106,6 +113,11 @@ PHP X.Y UPGRADE NOTES 9. New Global Constants ======================================== +- Openssl: + . STREAM_CRYPTO_METHOD_SSLv2_CLIENT + . STREAM_CRYPTO_METHOD_SSLv3_CLIENT + . STREAM_CRYPTO_METHOD_SSLv23_CLIENT + . STREAM_CRYPTO_METHOD_TLS_CLIENT ======================================== 10. Changes to INI File Handling From 1970b964430a357d9c9acf01268849d86a99f4ec Mon Sep 17 00:00:00 2001 From: Daniel Lowrey Date: Tue, 8 Oct 2013 12:37:44 -0400 Subject: [PATCH 228/400] Added SAN matching during peer verification --- ext/openssl/openssl.c | 71 +++++++++++++++++------- ext/openssl/tests/san-ca.pem | 15 +++++ ext/openssl/tests/san-cert.pem | 31 +++++++++++ ext/openssl/tests/san-peer-matching.phpt | 60 ++++++++++++++++++++ 4 files changed, 158 insertions(+), 19 deletions(-) create mode 100644 ext/openssl/tests/san-ca.pem create mode 100644 ext/openssl/tests/san-cert.pem create mode 100644 ext/openssl/tests/san-peer-matching.phpt diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 90329d06caa6d..c77405762304b 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -4951,7 +4951,7 @@ static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx) /* {{{ */ } /* }}} */ -static zend_bool php_openssl_match_cn(const char *subjectname, const char *certname) +static int matches_wildcard_name(const char *subjectname, const char *certname) { char *wildcard; int prefix_len, suffix_len, subject_len; @@ -4983,12 +4983,55 @@ static zend_bool php_openssl_match_cn(const char *subjectname, const char *certn return 0; } +static int matches_san_list(X509 *peer, const char *subject_name) +{ + int is_match, i; + unsigned char *cert_name; + GENERAL_NAMES *alt_names = X509_get_ext_d2i(peer, NID_subject_alt_name, 0, 0); + int alt_name_count = sk_GENERAL_NAME_num(alt_names); + + for (i = 0; i < alt_name_count; i++) { + GENERAL_NAME *san = sk_GENERAL_NAME_value(alt_names, i); + + if (GEN_DNS == san->type) { + ASN1_STRING_to_UTF8(&cert_name, san->d.dNSName); + is_match = matches_wildcard_name(subject_name, cert_name); + OPENSSL_free(cert_name); + } + + if (is_match) { + break; + } + } + + return is_match; +} + +static int matches_common_name(X509 *peer, const char *subject_name) +{ + char buf[1024]; + X509_NAME *cert_name; + cert_name = X509_get_subject_name(peer); + int cert_name_len = X509_NAME_get_text_by_NID(cert_name, NID_commonName, buf, sizeof(buf)); + + if (cert_name_len == -1) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to locate peer certificate CN"); + return 0; + } else if (cert_name_len != strlen(buf)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer certificate CN=`%.*s' is malformed", cert_name_len, buf); + return 0; + } else if (matches_wildcard_name(subject_name, buf)) { + return 1; + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer certificate CN=`%.*s' did not match expected CN=`%s'", cert_name_len, buf, subject_name); + return 0; + } +} + int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stream TSRMLS_DC) /* {{{ */ { zval **val = NULL; char *cnmatch = NULL; - X509_NAME *name; - char buf[1024]; int err; /* verification is turned off */ @@ -5030,24 +5073,14 @@ int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stre } } - name = X509_get_subject_name(peer); - - /* Does the common name match ? (used primarily for https://) */ GET_VER_OPT_STRING("CN_match", cnmatch); - if (cnmatch) { - int name_len = X509_NAME_get_text_by_NID(name, NID_commonName, buf, sizeof(buf)); - if (name_len == -1) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to locate peer certificate CN"); - return FAILURE; - } else if (name_len != strlen(buf)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer certificate CN=`%.*s' is malformed", name_len, buf); - return FAILURE; - } - - if (!php_openssl_match_cn(cnmatch, buf)) { - /* didn't match */ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer certificate CN=`%.*s' did not match expected CN=`%s'", name_len, buf, cnmatch); + if (cnmatch) { + if (matches_san_list(peer, cnmatch)) { + return SUCCESS; + } else if (matches_common_name(peer, cnmatch)) { + return SUCCESS; + } else { return FAILURE; } } diff --git a/ext/openssl/tests/san-ca.pem b/ext/openssl/tests/san-ca.pem new file mode 100644 index 0000000000000..88682ba2dcf65 --- /dev/null +++ b/ext/openssl/tests/san-ca.pem @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICYTCCAcqgAwIBAgIJAIaqxtY5dwjtMA0GCSqGSIb3DQEBBQUAMFMxCzAJBgNV +BAYTAlVTMQswCQYDVQQIEwJNTjEUMBIGA1UEBxMLTWlubmVhcG9saXMxITAfBgNV +BAsTGERvbWFpbiBDb250cm9sIFZhbGlkYXRlZDAeFw0xMzA5MjQwODA1NTFaFw0y +MTEyMTEwODA1NTFaMFMxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJNTjEUMBIGA1UE +BxMLTWlubmVhcG9saXMxITAfBgNVBAsTGERvbWFpbiBDb250cm9sIFZhbGlkYXRl +ZDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAsFGqfbU/8D+KjroQl4XMyt9m +dcSP7iZtqphOu9nVZxYAAqfaqj8FnC/pwYV3TU6ZHndLTQAllwYT3sQBQPPGmZQ9 +clSIMEL003t3pi4ZVXkttG6Vvr+Z9PBcHhlKLQ7WMHnn4qctllWXTSoyTQpkETF3 +Fc3mrG5G37BhoUno7NECAwEAAaM9MDswOQYDVR0RBDIwMIILZXhhbXBsZS5vcmeC +D3d3dy5leGFtcGxlLm9yZ4IQdGVzdC5leGFtcGxlLm9yZzANBgkqhkiG9w0BAQUF +AAOBgQBf/FZhzheIcQJ+dyTk8xQ/nJLvpmBhbd1LNtfwk/MsC9UHsz4QXs9sBw1k +rH0FjoqgM6avj7zKHJFTj6q7Rd+OX5V4HynYPhX67sWbN3KWEHffL98nGGd/bo3X +pSjNk5vnyKYiwdUUe11Ac9csh0HcSBbhOYjy0T/i9AlQcKbuCg== +-----END CERTIFICATE----- diff --git a/ext/openssl/tests/san-cert.pem b/ext/openssl/tests/san-cert.pem new file mode 100644 index 0000000000000..923d490e72fd3 --- /dev/null +++ b/ext/openssl/tests/san-cert.pem @@ -0,0 +1,31 @@ +-----BEGIN CERTIFICATE----- +MIICYTCCAcqgAwIBAgIJAIaqxtY5dwjtMA0GCSqGSIb3DQEBBQUAMFMxCzAJBgNV +BAYTAlVTMQswCQYDVQQIEwJNTjEUMBIGA1UEBxMLTWlubmVhcG9saXMxITAfBgNV +BAsTGERvbWFpbiBDb250cm9sIFZhbGlkYXRlZDAeFw0xMzA5MjQwODA1NTFaFw0y +MTEyMTEwODA1NTFaMFMxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJNTjEUMBIGA1UE +BxMLTWlubmVhcG9saXMxITAfBgNVBAsTGERvbWFpbiBDb250cm9sIFZhbGlkYXRl +ZDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAsFGqfbU/8D+KjroQl4XMyt9m +dcSP7iZtqphOu9nVZxYAAqfaqj8FnC/pwYV3TU6ZHndLTQAllwYT3sQBQPPGmZQ9 +clSIMEL003t3pi4ZVXkttG6Vvr+Z9PBcHhlKLQ7WMHnn4qctllWXTSoyTQpkETF3 +Fc3mrG5G37BhoUno7NECAwEAAaM9MDswOQYDVR0RBDIwMIILZXhhbXBsZS5vcmeC +D3d3dy5leGFtcGxlLm9yZ4IQdGVzdC5leGFtcGxlLm9yZzANBgkqhkiG9w0BAQUF +AAOBgQBf/FZhzheIcQJ+dyTk8xQ/nJLvpmBhbd1LNtfwk/MsC9UHsz4QXs9sBw1k +rH0FjoqgM6avj7zKHJFTj6q7Rd+OX5V4HynYPhX67sWbN3KWEHffL98nGGd/bo3X +pSjNk5vnyKYiwdUUe11Ac9csh0HcSBbhOYjy0T/i9AlQcKbuCg== +-----END CERTIFICATE----- +-----BEGIN PRIVATE KEY----- +MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALBRqn21P/A/io66 +EJeFzMrfZnXEj+4mbaqYTrvZ1WcWAAKn2qo/BZwv6cGFd01OmR53S00AJZcGE97E +AUDzxpmUPXJUiDBC9NN7d6YuGVV5LbRulb6/mfTwXB4ZSi0O1jB55+KnLZZVl00q +Mk0KZBExdxXN5qxuRt+wYaFJ6OzRAgMBAAECgYB11e5iWvqjPmQEZRdnnJU0VD8u +n7ItT+Nk6qtb4gY8Abj6DWIW+01th5vqqJ8FvGyartFVYa69kuM+srG/zevAZWeu +fGZtwiwZR4DRSyRcPp4rnNiksK3dkAZA6UewmRDPv8uyHJlXc5i+Ft1ILJ5Q5jgn +UkC4z3EJP5Se9KZywQJBAOO4lRq42wLsYr2SDrQDSs4leie3FKc2bgvjF7Djosh1 +ZYbf55F5b9w1zgnccmni2HkqOnyFu4SKarmXyCsYxrkCQQDGNvnUh7/zZswrdWZ/ +PMp9zVDTh/5Oc2B4ByNLw1ERDwYhjchKgPRlQvn4cp3Pwf3UYPQ/8XGXzzEJey3A +r0rZAkBf/tDEOgcBPXsGZQrTscuYCU5sbY5ESvqrAilbhSp7DJom+D5bIfEYyIm5 +uHd20Yzlzvpmwc1huyPwZt6X5FLpAkATDReoGMAXSesXxjnqwtIHk2NQYYLM0YQV +JUJ8NrKk/Bevw+vbVVeoH+7ctU97t36JGiR/vNoZKD3jVmaIXZDJAkEA4wJbwzIo +L32mu9VmZa7wjmfkraQEmXTPaA5D9lNC0AwRTgkj+x2Qe1vawNblNK9PPLBDdplQ +L//53ADq/wv5rA== +-----END PRIVATE KEY----- diff --git a/ext/openssl/tests/san-peer-matching.phpt b/ext/openssl/tests/san-peer-matching.phpt new file mode 100644 index 0000000000000..4e6531d6cc6b6 --- /dev/null +++ b/ext/openssl/tests/san-peer-matching.phpt @@ -0,0 +1,60 @@ +--TEST-- +Peer verification matches SAN names +--SKIPIF-- + array( + 'local_cert' => __DIR__ . '/san-cert.pem', + 'allow_self_signed' => true, + ), +)); + +$server = stream_socket_server('ssl://127.0.0.1:64321', $errno, $errstr, + STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context); + + +$pid = pcntl_fork(); +if ($pid == -1) { + die('could not fork'); +} else if ($pid) { + $contextC = stream_context_create( + array( + 'ssl' => array( + 'verify_peer' => true, + 'cafile' => __DIR__ . '/san-ca.pem', + 'CN_match' => 'example.org', + ) + ) + ); + var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, + STREAM_CLIENT_CONNECT, $contextC)); + + $contextC = stream_context_create(array( + 'ssl' => array( + 'verify_peer' => true, + 'cafile' => __DIR__ . '/san-ca.pem', + 'CN_match' => 'moar.example.org', + ) + )); + + var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, + STREAM_CLIENT_CONNECT, $contextC)); + +} else { + @pcntl_wait($status); + @stream_socket_accept($server, 1); + @stream_socket_accept($server, 1); +} +--EXPECTF-- +resource(%d) of type (stream) + +Warning: stream_socket_client(): Unable to locate peer certificate CN in %s on line %d + +Warning: stream_socket_client(): Failed to enable crypto in %s on line %d + +Warning: stream_socket_client(): unable to connect to ssl://127.0.0.1:64321 (Unknown error) in %s on line %d +bool(false) From 2ddefbd2b3027882490eb997fc7bc13185a67207 Mon Sep 17 00:00:00 2001 From: Daniel Lowrey Date: Tue, 8 Oct 2013 13:54:22 -0400 Subject: [PATCH 229/400] Added support for TLSv1.1 and TLSv1.2 --- ext/openssl/openssl.c | 8 +++ ext/openssl/tests/tlsv1.1_wrapper_001.phpt | 46 ++++++++++++++++ ext/openssl/tests/tlsv1.2_wrapper_002.phpt | 46 ++++++++++++++++ ext/openssl/xp_ssl.c | 62 +++++++++++++++++++++- ext/standard/file.c | 4 ++ main/streams/php_stream_transport.h | 6 ++- 6 files changed, 170 insertions(+), 2 deletions(-) create mode 100644 ext/openssl/tests/tlsv1.1_wrapper_001.phpt create mode 100644 ext/openssl/tests/tlsv1.2_wrapper_002.phpt diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 90329d06caa6d..d6f02f22c32d9 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1183,6 +1183,10 @@ PHP_MINIT_FUNCTION(openssl) php_stream_xport_register("sslv2", php_openssl_ssl_socket_factory TSRMLS_CC); #endif php_stream_xport_register("tls", php_openssl_ssl_socket_factory TSRMLS_CC); +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + php_stream_xport_register("tlsv1.1", php_openssl_ssl_socket_factory TSRMLS_CC); + php_stream_xport_register("tlsv1.2", php_openssl_ssl_socket_factory TSRMLS_CC); +#endif /* override the default tcp socket provider */ php_stream_xport_register("tcp", php_openssl_ssl_socket_factory TSRMLS_CC); @@ -1221,6 +1225,10 @@ PHP_MSHUTDOWN_FUNCTION(openssl) #endif php_stream_xport_unregister("sslv3" TSRMLS_CC); php_stream_xport_unregister("tls" TSRMLS_CC); +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + php_stream_xport_unregister("tlsv1.1" TSRMLS_CC); + php_stream_xport_unregister("tlsv1.2" TSRMLS_CC); +#endif /* reinstate the default tcp handler */ php_stream_xport_register("tcp", php_stream_generic_socket_factory TSRMLS_CC); diff --git a/ext/openssl/tests/tlsv1.1_wrapper_001.phpt b/ext/openssl/tests/tlsv1.1_wrapper_001.phpt new file mode 100644 index 0000000000000..56211f0b965e0 --- /dev/null +++ b/ext/openssl/tests/tlsv1.1_wrapper_001.phpt @@ -0,0 +1,46 @@ +--TEST-- +tlsv1.1 stream wrapper +--SKIPIF-- + array( + 'local_cert' => __DIR__ . '/streams_crypto_method.pem', +))); + +$server = stream_socket_server('tlsv1.1://127.0.0.1:64321', $errno, $errstr, $flags, $ctx); +var_dump($server); + +$pid = pcntl_fork(); +if ($pid == -1) { + die('could not fork'); +} elseif ($pid) { + $flags = STREAM_CLIENT_CONNECT; + $ctx = stream_context_create(array('ssl' => array( + 'verify_peer' => false + ))); + + $client = stream_socket_client("tlsv1.1://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); + var_dump($client); + + $client = @stream_socket_client("sslv3://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); + var_dump($client); + + $client = @stream_socket_client("tlsv1.2://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); + var_dump($client); + +} else { + @pcntl_wait($status); + for ($i=0; $i < 3; $i++) { + @stream_socket_accept($server, 1); + } +} +--EXPECTF-- +resource(%d) of type (stream) +resource(%d) of type (stream) +bool(false) +bool(false) diff --git a/ext/openssl/tests/tlsv1.2_wrapper_002.phpt b/ext/openssl/tests/tlsv1.2_wrapper_002.phpt new file mode 100644 index 0000000000000..cb3f4106c727e --- /dev/null +++ b/ext/openssl/tests/tlsv1.2_wrapper_002.phpt @@ -0,0 +1,46 @@ +--TEST-- +tlsv1.2 stream wrapper +--SKIPIF-- + array( + 'local_cert' => __DIR__ . '/streams_crypto_method.pem', +))); + +$server = stream_socket_server('tlsv1.2://127.0.0.1:64321', $errno, $errstr, $flags, $ctx); +var_dump($server); + +$pid = pcntl_fork(); +if ($pid == -1) { + die('could not fork'); +} elseif ($pid) { + $flags = STREAM_CLIENT_CONNECT; + $ctx = stream_context_create(array('ssl' => array( + 'verify_peer' => false + ))); + + $client = stream_socket_client("tlsv1.2://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); + var_dump($client); + + $client = @stream_socket_client("sslv3://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); + var_dump($client); + + $client = @stream_socket_client("tlsv1.1://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); + var_dump($client); + +} else { + @pcntl_wait($status); + for ($i=0; $i < 3; $i++) { + @stream_socket_accept($server, 1); + } +} +--EXPECTF-- +resource(%d) of type (stream) +resource(%d) of type (stream) +bool(false) +bool(false) diff --git a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c index 1ac8a0220e3a0..9154a03773a2c 100644 --- a/ext/openssl/xp_ssl.c +++ b/ext/openssl/xp_ssl.c @@ -346,6 +346,24 @@ static inline int php_openssl_setup_crypto(php_stream *stream, sslsock->is_client = 1; method = TLSv1_client_method(); break; + case STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT: +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + sslsock->is_client = 1; + method = TLSv1_1_client_method(); + break; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.1 support is not compiled into the OpenSSL library PHP is linked against"); + return -1; +#endif + case STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT: +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + sslsock->is_client = 1; + method = TLSv1_2_client_method(); + break; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.2 support is not compiled into the OpenSSL library PHP is linked against"); + return -1; +#endif case STREAM_CRYPTO_METHOD_SSLv23_SERVER: sslsock->is_client = 0; method = SSLv23_server_method(); @@ -367,6 +385,24 @@ static inline int php_openssl_setup_crypto(php_stream *stream, sslsock->is_client = 0; method = TLSv1_server_method(); break; + case STREAM_CRYPTO_METHOD_TLSv1_1_SERVER: +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + sslsock->is_client = 0; + method = TLSv1_1_server_method(); + break; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.1 support is not compiled into the OpenSSL library PHP is linked against"); + return -1; +#endif + case STREAM_CRYPTO_METHOD_TLSv1_2_SERVER: +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + sslsock->is_client = 0; + method = TLSv1_2_server_method(); + break; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.2 support is not compiled into the OpenSSL library PHP is linked against"); + return -1; +#endif default: return -1; @@ -667,6 +703,12 @@ static inline int php_openssl_tcp_sockop_accept(php_stream *stream, php_openssl_ case STREAM_CRYPTO_METHOD_TLS_CLIENT: sock->method = STREAM_CRYPTO_METHOD_TLS_SERVER; break; + case STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT: + sock->method = STREAM_CRYPTO_METHOD_TLSv1_1_SERVER; + break; + case STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT: + sock->method = STREAM_CRYPTO_METHOD_TLSv1_2_SERVER; + break; default: break; } @@ -867,6 +909,8 @@ static int get_crypto_method(php_stream_context *ctx) { case STREAM_CRYPTO_METHOD_SSLv3_CLIENT: case STREAM_CRYPTO_METHOD_SSLv23_CLIENT: case STREAM_CRYPTO_METHOD_TLS_CLIENT: + case STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT: + case STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT: return crypto_method; } @@ -982,8 +1026,24 @@ php_stream *php_openssl_ssl_socket_factory(const char *proto, size_t protolen, } else if (strncmp(proto, "tls", protolen) == 0) { sslsock->enable_on_connect = 1; sslsock->method = STREAM_CRYPTO_METHOD_TLS_CLIENT; + } else if (strncmp(proto, "tlsv1.1", protolen) == 0) { +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + sslsock->enable_on_connect = 1; + sslsock->method = STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.1 support is not compiled into the OpenSSL library PHP is linked against"); + return NULL; +#endif + } else if (strncmp(proto, "tlsv1.2", protolen) == 0) { +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + sslsock->enable_on_connect = 1; + sslsock->method = STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.2 support is not compiled into the OpenSSL library PHP is linked against"); + return NULL; +#endif } - + return stream; } diff --git a/ext/standard/file.c b/ext/standard/file.c index 1ec6a74f3f0b5..2bd35bf8941ae 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -223,10 +223,14 @@ PHP_MINIT_FUNCTION(file) REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv3_CLIENT", STREAM_CRYPTO_METHOD_SSLv3_CLIENT, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv23_CLIENT", STREAM_CRYPTO_METHOD_SSLv23_CLIENT, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLS_CLIENT", STREAM_CRYPTO_METHOD_TLS_CLIENT, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT", STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT", STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv2_SERVER", STREAM_CRYPTO_METHOD_SSLv2_SERVER, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv3_SERVER", STREAM_CRYPTO_METHOD_SSLv3_SERVER, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv23_SERVER", STREAM_CRYPTO_METHOD_SSLv23_SERVER, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLS_SERVER", STREAM_CRYPTO_METHOD_TLS_SERVER, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_1_SERVER", STREAM_CRYPTO_METHOD_TLSv1_1_SERVER, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_2_SERVER", STREAM_CRYPTO_METHOD_TLSv1_2_SERVER, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_SHUT_RD", STREAM_SHUT_RD, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_SHUT_WR", STREAM_SHUT_WR, CONST_CS|CONST_PERSISTENT); diff --git a/main/streams/php_stream_transport.h b/main/streams/php_stream_transport.h index 52df73d731a44..15ba09430f981 100644 --- a/main/streams/php_stream_transport.h +++ b/main/streams/php_stream_transport.h @@ -170,10 +170,14 @@ typedef enum { STREAM_CRYPTO_METHOD_SSLv3_CLIENT, STREAM_CRYPTO_METHOD_SSLv23_CLIENT, STREAM_CRYPTO_METHOD_TLS_CLIENT, + STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT, + STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT, STREAM_CRYPTO_METHOD_SSLv2_SERVER, STREAM_CRYPTO_METHOD_SSLv3_SERVER, STREAM_CRYPTO_METHOD_SSLv23_SERVER, - STREAM_CRYPTO_METHOD_TLS_SERVER + STREAM_CRYPTO_METHOD_TLS_SERVER, + STREAM_CRYPTO_METHOD_TLSv1_1_SERVER, + STREAM_CRYPTO_METHOD_TLSv1_2_SERVER } php_stream_xport_crypt_method_t; BEGIN_EXTERN_C() From e3c7b487099f317378cc747aea4dbe044f7faba8 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Wed, 9 Oct 2013 08:16:00 +0200 Subject: [PATCH 230/400] consolidate NEWS with 5.4 --- NEWS | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 6649a4965acf9..b70bdcc71b98a 100644 --- a/NEWS +++ b/NEWS @@ -2,22 +2,23 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2013, PHP 5.5.5 -- Buildsystem: - . Fixed bug #51076 (race condition in shtool's mkdir -p implementation). - (Mike, Raphael Geissert) - - Core: . Fixed bug #64979 (Wrong behavior of static variables in closure generators). (Nikita) + . Fixed bug #65322 (compile time errors won't trigger auto loading). (Nikita) . Fixed bug #65821 (By-ref foreach on property access of string offset segfaults). (Nikita) - CLI server: . Fixed bug #65633 (built-in server treat some http headers as case-sensitive). (Adam) + . Fixed bug #65818 (Segfault with built-in webserver and chunked transfer + encoding). (Felipe) . Added application/pdf to PHP CLI Web Server mime types (Chris Jones) - Datetime: + . Fixed bug #64157 (DateTime::createFromFormat() reports confusing error + message). (Boro Sitnikovski) . Fixed bug #65502 (DateTimeImmutable::createFromFormat returns DateTime). (Boro Sitnikovski) . Fixed bug #65548 (Comparison for DateTimeImmutable doesn't work). @@ -27,6 +28,14 @@ PHP NEWS . Fixed bug #65708 (dba functions cast $key param to string in-place, bypassing copy on write). (Adam) +- Filter: + . Add RFC 6598 IPs to reserved addresses. (Sebastian Nohn) + . Fixed bug #64441 (FILTER_VALIDATE_URL rejects fully qualified domain names). + (Syra) + +- FTP: + . Fixed bug #65667 (ftp_nb_continue produces segfault). (Philip Hofstetter) + - GD . Ensure that the defined interpolation method is used with the generic scaling methods. (Pierre) @@ -45,10 +54,29 @@ PHP NEWS . Fixed issue #135 (segfault in interned strings if initial memory is too low). (Julien) +- Sockets: + . Fixed bug #65808 (the socket_connect() won't work with IPv6 address). + (Mike) + - SPL: . Fix bug #64782 (SplFileObject constructor make $context optional / give it a default value). (Nikita) +- Standard: + . Fixed bug #61548 (content-type must appear at the end of headers for 201 + Location to work in http). (Mike) + +- XMLReader: + . Fixed bug #51936 (Crash with clone XMLReader). (Mike) + . Fixed bug #64230 (XMLReader does not suppress errors). (Mike) + +- Build system: + . Fixed bug #51076 (race condition in shtool's mkdir -p implementation). + (Mike, Raphael Geissert) + . Fixed bug #62396 ('make test' crashes starting with 5.3.14 (missing + gzencode())). (Mike) + + 19 Sep 2013, PHP 5.5.4 - Core: @@ -59,6 +87,7 @@ PHP NEWS DTRACE_FUNCTION_*). (Chris Jones) . Fixed bug #65483 (quoted-printable encode stream filter incorrectly encoding spaces). (Michael M Slusarz) + . Fixed bug #65481 (shutdown segfault due to serialize) (Mike) . 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) @@ -85,6 +114,10 @@ PHP NEWS . Fixed bug #64802 (openssl_x509_parse fails to parse subject properly in some cases). (Mark Jones) +- PDO: + . Fixed bug #64953 (Postgres prepared statement positional parameter + casting). (Mike) + - Session: . Fixed bug #65475 (Session ID is not initialized properly when strict session is enabled). (Yasuo) @@ -95,6 +128,10 @@ PHP NEWS . Fix issue with return types of password API helper functions. Found via static analysis by cjones. (Anthony Ferrara) +- Zlib: + . Fixed bug #65391 (Unable to send vary header user-agent when + ob_start('ob_gzhandler') is called) (Mike) + 22 Aug 2013, PHP 5.5.3 - Openssl: From 1815942f53a976555e9cb60ac3ce2425142d1cb1 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Wed, 9 Oct 2013 08:22:33 +0200 Subject: [PATCH 231/400] Thanks Daniel, I didn't think long enough --- UPGRADING | 5 ----- 1 file changed, 5 deletions(-) diff --git a/UPGRADING b/UPGRADING index 238aa5ea41a9c..b19c3dd5410e5 100755 --- a/UPGRADING +++ b/UPGRADING @@ -113,11 +113,6 @@ PHP X.Y UPGRADE NOTES 9. New Global Constants ======================================== -- Openssl: - . STREAM_CRYPTO_METHOD_SSLv2_CLIENT - . STREAM_CRYPTO_METHOD_SSLv3_CLIENT - . STREAM_CRYPTO_METHOD_SSLv23_CLIENT - . STREAM_CRYPTO_METHOD_TLS_CLIENT ======================================== 10. Changes to INI File Handling From b026993a74f452c5f6a689124b4ad4d7b3ac2491 Mon Sep 17 00:00:00 2001 From: Daniel Lowrey Date: Mon, 7 Oct 2013 15:02:48 -0400 Subject: [PATCH 232/400] Fixed segfault when built with OpenSSL >= 1.0.1 (PR #481) --- ext/openssl/openssl.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index f1dfa5024ae95..a2cdfb5c1649a 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -4613,9 +4613,6 @@ SSL *php_SSL_new_from_context(SSL_CTX *ctx, php_stream *stream TSRMLS_DC) /* {{{ GET_VER_OPT_STRING("local_cert", certfile); if (certfile) { - X509 *cert = NULL; - EVP_PKEY *key = NULL; - SSL *tmpssl; char resolved_path_buff[MAXPATHLEN]; const char * private_key = NULL; @@ -4642,7 +4639,11 @@ SSL *php_SSL_new_from_context(SSL_CTX *ctx, php_stream *stream TSRMLS_DC) /* {{{ } } - tmpssl = SSL_new(ctx); +#if OPENSSL_VERSION_NUMBER < 0x10001001L + /* Unnecessary as of OpenSSLv1.0.1 (will segfault if used with >= 10001001 ) */ + X509 *cert = NULL; + EVP_PKEY *key = NULL; + SSL *tmpssl = SSL_new(ctx); cert = SSL_get_certificate(tmpssl); if (cert) { @@ -4651,7 +4652,7 @@ SSL *php_SSL_new_from_context(SSL_CTX *ctx, php_stream *stream TSRMLS_DC) /* {{{ EVP_PKEY_free(key); } SSL_free(tmpssl); - +#endif if (!SSL_CTX_check_private_key(ctx)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Private key does not match certificate!"); } From 22700890d4c332b76866c73a5a68c76f601257a6 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Wed, 9 Oct 2013 12:30:31 +0200 Subject: [PATCH 233/400] C89 compatibility --- ext/openssl/openssl.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index a2cdfb5c1649a..26792e2428822 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -4640,18 +4640,20 @@ SSL *php_SSL_new_from_context(SSL_CTX *ctx, php_stream *stream TSRMLS_DC) /* {{{ } #if OPENSSL_VERSION_NUMBER < 0x10001001L - /* Unnecessary as of OpenSSLv1.0.1 (will segfault if used with >= 10001001 ) */ - X509 *cert = NULL; - EVP_PKEY *key = NULL; - SSL *tmpssl = SSL_new(ctx); - cert = SSL_get_certificate(tmpssl); - - if (cert) { - key = X509_get_pubkey(cert); - EVP_PKEY_copy_parameters(key, SSL_get_privatekey(tmpssl)); - EVP_PKEY_free(key); - } - SSL_free(tmpssl); + do { + /* Unnecessary as of OpenSSLv1.0.1 (will segfault if used with >= 10001001 ) */ + X509 *cert = NULL; + EVP_PKEY *key = NULL; + SSL *tmpssl = SSL_new(ctx); + cert = SSL_get_certificate(tmpssl); + + if (cert) { + key = X509_get_pubkey(cert); + EVP_PKEY_copy_parameters(key, SSL_get_privatekey(tmpssl)); + EVP_PKEY_free(key); + } + SSL_free(tmpssl); + } while (0); #endif if (!SSL_CTX_check_private_key(ctx)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Private key does not match certificate!"); From a40dd6e963e35ecc0708eebaa22a63700ade69e3 Mon Sep 17 00:00:00 2001 From: Daniel Lowrey Date: Wed, 9 Oct 2013 09:55:36 -0400 Subject: [PATCH 234/400] Changed return types to zend_bool, renamed test --- ext/openssl/openssl.c | 19 +++++++++++-------- ...r-matching.phpt => san_peer_matching.phpt} | 0 2 files changed, 11 insertions(+), 8 deletions(-) rename ext/openssl/tests/{san-peer-matching.phpt => san_peer_matching.phpt} (100%) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index c77405762304b..43b3e0cadd285 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -4951,7 +4951,7 @@ static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx) /* {{{ */ } /* }}} */ -static int matches_wildcard_name(const char *subjectname, const char *certname) +static zend_bool matches_wildcard_name(const char *subjectname, const char *certname) { char *wildcard; int prefix_len, suffix_len, subject_len; @@ -4983,10 +4983,12 @@ static int matches_wildcard_name(const char *subjectname, const char *certname) return 0; } -static int matches_san_list(X509 *peer, const char *subject_name) +static zend_bool matches_san_list(X509 *peer, const char *subject_name) { - int is_match, i; + int i; + zend_bool is_match = 0; unsigned char *cert_name; + GENERAL_NAMES *alt_names = X509_get_ext_d2i(peer, NID_subject_alt_name, 0, 0); int alt_name_count = sk_GENERAL_NAME_num(alt_names); @@ -5007,25 +5009,26 @@ static int matches_san_list(X509 *peer, const char *subject_name) return is_match; } -static int matches_common_name(X509 *peer, const char *subject_name) +static zend_bool matches_common_name(X509 *peer, const char *subject_name) { char buf[1024]; X509_NAME *cert_name; + zend_bool is_match = 0; + cert_name = X509_get_subject_name(peer); int cert_name_len = X509_NAME_get_text_by_NID(cert_name, NID_commonName, buf, sizeof(buf)); if (cert_name_len == -1) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to locate peer certificate CN"); - return 0; } else if (cert_name_len != strlen(buf)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer certificate CN=`%.*s' is malformed", cert_name_len, buf); - return 0; } else if (matches_wildcard_name(subject_name, buf)) { - return 1; + is_match = 1; } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer certificate CN=`%.*s' did not match expected CN=`%s'", cert_name_len, buf, subject_name); - return 0; } + + return is_match; } int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stream TSRMLS_DC) /* {{{ */ diff --git a/ext/openssl/tests/san-peer-matching.phpt b/ext/openssl/tests/san_peer_matching.phpt similarity index 100% rename from ext/openssl/tests/san-peer-matching.phpt rename to ext/openssl/tests/san_peer_matching.phpt From e2d123a72092cf010209607d6aa504cfda743e75 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Wed, 9 Oct 2013 17:16:25 +0200 Subject: [PATCH 235/400] C89 --- ext/openssl/openssl.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 4bacfb7d0347a..952bd75927ff5 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -5014,9 +5014,10 @@ static zend_bool matches_common_name(X509 *peer, const char *subject_name) char buf[1024]; X509_NAME *cert_name; zend_bool is_match = 0; + int cert_name_len; cert_name = X509_get_subject_name(peer); - int cert_name_len = X509_NAME_get_text_by_NID(cert_name, NID_commonName, buf, sizeof(buf)); + cert_name_len = X509_NAME_get_text_by_NID(cert_name, NID_commonName, buf, sizeof(buf)); if (cert_name_len == -1) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to locate peer certificate CN"); From 141c2cb97aa1ce682d97704249ec23067bd1b89a Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Wed, 9 Oct 2013 12:17:11 -0700 Subject: [PATCH 236/400] Re-enable OCI8 DLL builds with Oracle 10g & 11g client libraries on Windows, in addition to Oracle 12c. From discussions with Anatol & Pierre this seems to be the most direct way for the Windows PECL build scripts to automatically create links to the generated DLLs. The issue is that the name php_oci8_12c.dll doesn't match the package name. In the far future when php_oci8.dll (with Oracle 10g) is no longer built then another Windows PECL packaging fix will be needed. --- ext/oci8/config.w32 | 91 ++++++++++++++++++++++++++++++++++++++++++++ ext/oci8/package.xml | 3 ++ 2 files changed, 94 insertions(+) diff --git a/ext/oci8/config.w32 b/ext/oci8/config.w32 index 750f163950cc9..d83bf3fbdb7d5 100644 --- a/ext/oci8/config.w32 +++ b/ext/oci8/config.w32 @@ -1,6 +1,97 @@ // $Id$ // vim:ft=javascript +if (PHP_OCI8 != "no" && PHP_OCI8_11G != "no") { + if (!PHP_OCI8_SHARED && !PHP_OCI8_11G_SHARED) { + WARNING("oci8 and oci8-11g provide the same extension and cannot both be built statically"); + PHP_OCI8 = "no" + } +} + +if (PHP_OCI8 != "no" && PHP_OCI8_12C != "no") { + if (!PHP_OCI8_SHARED && !PHP_OCI8_12C_SHARED) { + WARNING("oci8 and oci8-12c provide the same extension and cannot both be built statically"); + PHP_OCI8 = "no" + } +} + +if (PHP_OCI8_11G != "no" && PHP_OCI8_12C != "no") { + if (!PHP_OCI8_11G_SHARED && !PHP_OCI8_12C_SHARED) { + WARNING("oci8-11g and oci8-12c provide the same extension and cannot both be built statically"); + PHP_OCI8_11G = "no" + } +} + +ARG_WITH("oci8", "OCI8 support", "no"); + +if (PHP_OCI8 != "no") { + + oci8_dirs = new Array( + PHP_OCI8 + ); + + oci8_lib_paths = ""; + oci8_inc_paths = ""; + + // find the Oracle install + for (i = 0; i < oci8_dirs.length; i++) { + oci8_lib_paths += oci8_dirs[i] + "\\lib;"; + oci8_lib_paths += oci8_dirs[i] + "\\lib\\msvc;"; + oci8_inc_paths += oci8_dirs[i] + "\\include;"; + } + + oci8_inc_paths += PHP_PHP_BUILD + "\\include\\instantclient;" + oci8_lib_paths += PHP_PHP_BUILD + "\\lib\\instantclient;"; + + if (CHECK_HEADER_ADD_INCLUDE("oci.h", "CFLAGS_OCI8", oci8_inc_paths) && + CHECK_LIB("oci.lib", "oci8", oci8_lib_paths)) + { + EXTENSION('oci8', 'oci8.c oci8_lob.c oci8_statement.c oci8_collection.c oci8_interface.c'); + + AC_DEFINE('HAVE_OCI8', 1); + AC_DEFINE('HAVE_OCI_INSTANT_CLIENT', 1); + + } else { + WARNING("oci8 not enabled: Oracle Database client libraries or Oracle 10g Instant Client not found"); + PHP_OCI8 = "no" + } +} + +ARG_WITH("oci8-11g", "OCI8 support using Oracle 11g Instant Client", "no"); + +if (PHP_OCI8_11G != "no") { + + oci8_11g_dirs = new Array( + PHP_OCI8_11G + ); + + oci8_11g_lib_paths = ""; + oci8_11g_inc_paths = ""; + + // find the Oracle install + for (i = 0; i < oci8_11g_dirs.length; i++) { + oci8_11g_lib_paths += oci8_11g_dirs[i] + "\\lib;"; + oci8_11g_lib_paths += oci8_11g_dirs[i] + "\\lib\\msvc;"; + oci8_11g_inc_paths += oci8_11g_dirs[i] + "\\include;"; + } + + oci8_11g_inc_paths += PHP_PHP_BUILD + "\\include\\instantclient_11;" + oci8_11g_lib_paths += PHP_PHP_BUILD + "\\lib\\instantclient_11;"; + + if (CHECK_HEADER_ADD_INCLUDE("oci.h", "CFLAGS_OCI8_11G", oci8_11g_inc_paths) && + CHECK_LIB("oci.lib", "oci8_11g", oci8_11g_lib_paths)) + { + EXTENSION('oci8_11g', 'oci8.c oci8_lob.c oci8_statement.c oci8_collection.c oci8_interface.c', null, null, null, "ext\\oci8_11g") + + AC_DEFINE('HAVE_OCI8', 1); + AC_DEFINE('HAVE_OCI_INSTANT_CLIENT', 1); + + } else { + WARNING("oci8-11g not enabled: Oracle Database client libraries or Oracle 11g Instant Client not found"); + PHP_OCI8_11G = "no" + } +} + ARG_WITH("oci8-12c", "OCI8 support using Oracle Database 12c Instant Client", "no"); if (PHP_OCI8_12C != "no") { diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index 47e5415aa8394..d85faf046c970 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -60,6 +60,9 @@ Bump mininum requirements for PHP OCI8 2.0 to PHP 5.2 and Oracle client library 10.2 (Note this will connect to Oracle Database 8.1.7 onwards). Use the older OCI8 1.4 if an earlier PHP version or older Oracle client library support is necessary. + +Re-enable php_oci8.dll and php_oci8_11g.dll for Windows builds so URL +linking works in the new Windows PECL infrastructure. From ef8cf76815e10db08d07897296c09b925a1511a1 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 10 Oct 2013 15:32:30 +0400 Subject: [PATCH 237/400] Fixed bug #65845 (Error when Zend Opcache Optimizer is fully enabled). --- NEWS | 2 + ext/opcache/Optimizer/pass1_5.c | 130 ++---------------------- ext/opcache/Optimizer/zend_optimizer.c | 131 +++++++++++++++++++++++++ ext/opcache/tests/bug65845.phpt | 14 +++ 4 files changed, 154 insertions(+), 123 deletions(-) create mode 100644 ext/opcache/tests/bug65845.phpt diff --git a/NEWS b/NEWS index b70bdcc71b98a..9436fe98835b2 100644 --- a/NEWS +++ b/NEWS @@ -48,6 +48,8 @@ PHP NEWS . Added support for GNU Hurd. (Svante Signell) . Added function opcache_compile_file() to load PHP scripts into cache without execution. (Julien) + . Fixed bug #65845 (Error when Zend Opcache Optimizer is fully enabled). + (Dmitry) . Fixed bug #65665 (Exception not properly caught when opcache enabled). (Laruence) . Fixed bug #65510 (5.5.2 crashes in _get_zval_ptr_ptr_var). (Dmitry) diff --git a/ext/opcache/Optimizer/pass1_5.c b/ext/opcache/Optimizer/pass1_5.c index 795b954173e7b..70ec6d5e2ec11 100644 --- a/ext/opcache/Optimizer/pass1_5.c +++ b/ext/opcache/Optimizer/pass1_5.c @@ -37,7 +37,6 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) { int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC) = get_binary_op(opline->opcode); zend_uint tv = ZEND_RESULT(opline).var; /* temporary variable */ zval result; - zend_op *tmp_opline; int er; if (opline->opcode == ZEND_DIV && @@ -61,95 +60,7 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) { literal_dtor(&ZEND_OP2_LITERAL(opline)); MAKE_NOP(opline); - /* substitute the following TMP_VAR usage with constant */ - for (tmp_opline = opline + 1; tmp_opline < end; tmp_opline++) { - if (ZEND_OP1_TYPE(tmp_opline) == IS_TMP_VAR && - ZEND_OP1(tmp_opline).var == tv) { - if (tmp_opline->opcode == ZEND_FREE) { - MAKE_NOP(tmp_opline); - zval_dtor(&result); - } else { - ZEND_OP1_TYPE(tmp_opline) = IS_CONST; -#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO - tmp_opline->op1.constant = zend_optimizer_add_literal(op_array, &result TSRMLS_CC); - if (Z_TYPE(result) == IS_STRING) { - Z_HASH_P(&ZEND_OP1_LITERAL(tmp_opline)) = zend_hash_func(Z_STRVAL(ZEND_OP1_LITERAL(tmp_opline)), Z_STRLEN(ZEND_OP1_LITERAL(tmp_opline)) + 1); - if (tmp_opline->opcode == ZEND_INIT_STATIC_METHOD_CALL || - tmp_opline->opcode == ZEND_DO_FCALL || - tmp_opline->opcode == ZEND_CATCH || - tmp_opline->opcode == ZEND_FETCH_CONSTANT) { - op_array->literals[tmp_opline->op1.constant].cache_slot = op_array->last_cache_slot++; - } - } -#else - ZEND_OP1_LITERAL(tmp_opline) = result; -#endif - } - /* TMP_VAR my be used only once */ - break; - } - if (ZEND_OP2_TYPE(tmp_opline) == IS_TMP_VAR && - ZEND_OP2(tmp_opline).var == tv) { - ZEND_OP2_TYPE(tmp_opline) = IS_CONST; -#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO - tmp_opline->op2.constant = zend_optimizer_add_literal(op_array, &result TSRMLS_CC); - if (Z_TYPE(result) == IS_STRING) { - Z_HASH_P(&ZEND_OP2_LITERAL(tmp_opline)) = zend_hash_func(Z_STRVAL(ZEND_OP2_LITERAL(tmp_opline)), Z_STRLEN(ZEND_OP2_LITERAL(tmp_opline)) + 1); - if (tmp_opline->opcode == ZEND_FETCH_R || - tmp_opline->opcode == ZEND_FETCH_W || - tmp_opline->opcode == ZEND_FETCH_RW || - tmp_opline->opcode == ZEND_FETCH_IS || - tmp_opline->opcode == ZEND_FETCH_UNSET || - tmp_opline->opcode == ZEND_FETCH_FUNC_ARG || - tmp_opline->opcode == ZEND_FETCH_CLASS || - tmp_opline->opcode == ZEND_INIT_FCALL_BY_NAME || - tmp_opline->opcode == ZEND_INIT_NS_FCALL_BY_NAME || - tmp_opline->opcode == ZEND_UNSET_VAR || - tmp_opline->opcode == ZEND_ISSET_ISEMPTY_VAR || - tmp_opline->opcode == ZEND_ADD_INTERFACE || - tmp_opline->opcode == ZEND_ADD_TRAIT) { - op_array->literals[tmp_opline->op2.constant].cache_slot = op_array->last_cache_slot++; - } else if (tmp_opline->opcode == ZEND_INIT_METHOD_CALL || - tmp_opline->opcode == ZEND_INIT_STATIC_METHOD_CALL || - tmp_opline->opcode == ZEND_FETCH_CONSTANT || - tmp_opline->opcode == ZEND_ASSIGN_OBJ || - tmp_opline->opcode == ZEND_FETCH_OBJ_R || - tmp_opline->opcode == ZEND_FETCH_OBJ_W || - tmp_opline->opcode == ZEND_FETCH_OBJ_RW || - tmp_opline->opcode == ZEND_FETCH_OBJ_IS || - tmp_opline->opcode == ZEND_FETCH_OBJ_UNSET || - tmp_opline->opcode == ZEND_FETCH_OBJ_FUNC_ARG || - tmp_opline->opcode == ZEND_UNSET_OBJ || - tmp_opline->opcode == ZEND_PRE_INC_OBJ || - tmp_opline->opcode == ZEND_PRE_DEC_OBJ || - tmp_opline->opcode == ZEND_POST_INC_OBJ || - tmp_opline->opcode == ZEND_POST_DEC_OBJ || - tmp_opline->opcode == ZEND_ISSET_ISEMPTY_PROP_OBJ) { - op_array->literals[tmp_opline->op2.constant].cache_slot = op_array->last_cache_slot; - op_array->last_cache_slot += 2; - } else if (tmp_opline->opcode == ZEND_ASSIGN_ADD || - tmp_opline->opcode == ZEND_ASSIGN_SUB || - tmp_opline->opcode == ZEND_ASSIGN_MUL || - tmp_opline->opcode == ZEND_ASSIGN_DIV || - tmp_opline->opcode == ZEND_ASSIGN_MOD || - tmp_opline->opcode == ZEND_ASSIGN_SL || - tmp_opline->opcode == ZEND_ASSIGN_SR || - tmp_opline->opcode == ZEND_ASSIGN_CONCAT || - tmp_opline->opcode == ZEND_ASSIGN_BW_OR || - tmp_opline->opcode == ZEND_ASSIGN_BW_AND || - tmp_opline->opcode == ZEND_ASSIGN_BW_XOR) { - if (tmp_opline->extended_value == ZEND_ASSIGN_OBJ) { - op_array->literals[tmp_opline->op2.constant].cache_slot = op_array->last_cache_slot; - op_array->last_cache_slot += 2; - } - } - } -#else - ZEND_OP2_LITERAL(tmp_opline) = result; -#endif - break; - } - } + replace_tmp_by_const(op_array, opline + 1, tv, &result TSRMLS_CC); } break; @@ -159,6 +70,7 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) { opline->extended_value != IS_OBJECT && opline->extended_value != IS_RESOURCE) { /* cast of constant operand */ + zend_uint tv = ZEND_RESULT(opline).var; /* temporary variable */ zval res; res = ZEND_OP1_LITERAL(opline); zval_copy_ctor(&res); @@ -179,11 +91,11 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) { convert_to_string(&res); break; } + literal_dtor(&ZEND_OP1_LITERAL(opline)); - opline->opcode = ZEND_QM_ASSIGN; - opline->extended_value = 0; - ZEND_OP1_LITERAL(opline) = res; - SET_UNUSED(opline->op2); + MAKE_NOP(opline); + + replace_tmp_by_const(op_array, opline + 1, tv, &res TSRMLS_CC); } else if (opline->extended_value == IS_BOOL) { /* T = CAST(X, IS_BOOL) => T = BOOL(X) */ opline->opcode = ZEND_BOOL; @@ -197,7 +109,6 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) { /* unary operation on constant operand */ unary_op_type unary_op = get_unary_op(opline->opcode); zval result; - zend_op *tmp_opline; zend_uint tv = ZEND_RESULT(opline).var; /* temporary variable */ int er; @@ -218,34 +129,7 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) { literal_dtor(&ZEND_OP1_LITERAL(opline)); MAKE_NOP(opline); - /* substitute the following TMP_VAR usage with constant */ - for (tmp_opline = opline + 1; tmp_opline < end; tmp_opline++) { - if (ZEND_OP1_TYPE(tmp_opline) == IS_TMP_VAR && - ZEND_OP1(tmp_opline).var == tv) { - if (tmp_opline->opcode == ZEND_FREE) { - MAKE_NOP(tmp_opline); - zval_dtor(&result); - } else { - ZEND_OP1_TYPE(tmp_opline) = IS_CONST; -#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO - tmp_opline->op1.constant = zend_optimizer_add_literal(op_array, &result TSRMLS_CC); -#else - ZEND_OP1_LITERAL(tmp_opline) = result; -#endif - } - break; - } - if (ZEND_OP2_TYPE(tmp_opline) == IS_TMP_VAR && - ZEND_OP2(tmp_opline).var == tv) { - ZEND_OP2_TYPE(tmp_opline) = IS_CONST; -#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO - tmp_opline->op2.constant = zend_optimizer_add_literal(op_array, &result TSRMLS_CC); -#else - ZEND_OP2_LITERAL(tmp_opline) = result; -#endif - break; - } - } + replace_tmp_by_const(op_array, opline + 1, tv, &result TSRMLS_CC); } break; diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 1f411d5da8073..28085cb441e22 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -110,6 +110,137 @@ int zend_optimizer_add_literal(zend_op_array *op_array, const zval *zv TSRMLS_DC #endif +static void replace_tmp_by_const(zend_op_array *op_array, + zend_op *opline, + zend_uint var, + zval *val + TSRMLS_DC) +{ + zend_op *end = op_array->opcodes + op_array->last; + + while (opline < end) { + if (ZEND_OP1_TYPE(opline) == IS_TMP_VAR && + ZEND_OP1(opline).var == var) { + + if (opline->opcode == ZEND_FREE) { + MAKE_NOP(opline); + zval_dtor(val); + } else { + ZEND_OP1_TYPE(opline) = IS_CONST; +#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO + if (Z_TYPE_P(val) == IS_STRING) { + switch (opline->opcode) { + case ZEND_INIT_STATIC_METHOD_CALL: + case ZEND_CATCH: + case ZEND_FETCH_CONSTANT: + opline->op1.constant = zend_optimizer_add_literal(op_array, val TSRMLS_CC); + Z_HASH_P(&ZEND_OP1_LITERAL(opline)) = zend_hash_func(Z_STRVAL(ZEND_OP1_LITERAL(opline)), Z_STRLEN(ZEND_OP1_LITERAL(opline)) + 1); + op_array->literals[opline->op1.constant].cache_slot = op_array->last_cache_slot++; + zend_str_tolower(Z_STRVAL_P(val), Z_STRLEN_P(val)); + zend_optimizer_add_literal(op_array, val TSRMLS_CC); + op_array->literals[opline->op1.constant+1].hash_value = zend_hash_func(Z_STRVAL(op_array->literals[opline->op1.constant+1].constant), Z_STRLEN(op_array->literals[opline->op1.constant+1].constant) + 1); + break; + case ZEND_DO_FCALL: + zend_str_tolower(Z_STRVAL_P(val), Z_STRLEN_P(val)); + opline->op1.constant = zend_optimizer_add_literal(op_array, val TSRMLS_CC); + Z_HASH_P(&ZEND_OP1_LITERAL(opline)) = zend_hash_func(Z_STRVAL(ZEND_OP1_LITERAL(opline)), Z_STRLEN(ZEND_OP1_LITERAL(opline)) + 1); + op_array->literals[opline->op1.constant].cache_slot = op_array->last_cache_slot++; + break; + default: + opline->op1.constant = zend_optimizer_add_literal(op_array, val TSRMLS_CC); + Z_HASH_P(&ZEND_OP1_LITERAL(opline)) = zend_hash_func(Z_STRVAL(ZEND_OP1_LITERAL(opline)), Z_STRLEN(ZEND_OP1_LITERAL(opline)) + 1); + break; + } + } else { + opline->op1.constant = zend_optimizer_add_literal(op_array, val TSRMLS_CC); + } +#else + ZEND_OP1_LITERAL(opline) = *val; +#endif + } + /* TMP_VAR my be used only once */ + break; + } + + if (ZEND_OP2_TYPE(opline) == IS_TMP_VAR && + ZEND_OP2(opline).var == var) { + + ZEND_OP2_TYPE(opline) = IS_CONST; +#if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO + opline->op2.constant = zend_optimizer_add_literal(op_array, val TSRMLS_CC); + if (Z_TYPE_P(val) == IS_STRING) { + Z_HASH_P(&ZEND_OP2_LITERAL(opline)) = zend_hash_func(Z_STRVAL(ZEND_OP2_LITERAL(opline)), Z_STRLEN(ZEND_OP2_LITERAL(opline)) + 1); + switch (opline->opcode) { + 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_FETCH_CLASS: + case ZEND_INIT_FCALL_BY_NAME: + /*case ZEND_INIT_NS_FCALL_BY_NAME:*/ + case ZEND_UNSET_VAR: + case ZEND_ISSET_ISEMPTY_VAR: + case ZEND_ADD_INTERFACE: + case ZEND_ADD_TRAIT: + op_array->literals[opline->op2.constant].cache_slot = op_array->last_cache_slot++; + zend_str_tolower(Z_STRVAL_P(val), Z_STRLEN_P(val)); + zend_optimizer_add_literal(op_array, val TSRMLS_CC); + op_array->literals[opline->op2.constant+1].hash_value = zend_hash_func(Z_STRVAL(op_array->literals[opline->op2.constant+1].constant), Z_STRLEN(op_array->literals[opline->op2.constant+1].constant) + 1); + break; + case ZEND_INIT_METHOD_CALL: + case ZEND_INIT_STATIC_METHOD_CALL: + zend_str_tolower(Z_STRVAL_P(val), Z_STRLEN_P(val)); + zend_optimizer_add_literal(op_array, val TSRMLS_CC); + op_array->literals[opline->op2.constant+1].hash_value = zend_hash_func(Z_STRVAL(op_array->literals[opline->op2.constant+1].constant), Z_STRLEN(op_array->literals[opline->op2.constant+1].constant) + 1); + /* break missing intentionally */ + /*case ZEND_FETCH_CONSTANT:*/ + 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: + op_array->literals[opline->op2.constant].cache_slot = op_array->last_cache_slot; + op_array->last_cache_slot += 2; + 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 (opline->extended_value == ZEND_ASSIGN_OBJ) { + op_array->literals[opline->op2.constant].cache_slot = op_array->last_cache_slot; + op_array->last_cache_slot += 2; + } + break; + default: + break; + } + } +#else + ZEND_OP2_LITERAL(opline) = *val; +#endif + break; + } + opline++; + } +} + #include "Optimizer/nop_removal.c" #include "Optimizer/block_pass.c" #include "Optimizer/optimize_temp_vars_5.c" diff --git a/ext/opcache/tests/bug65845.phpt b/ext/opcache/tests/bug65845.phpt new file mode 100644 index 0000000000000..2ae5f3974ae93 --- /dev/null +++ b/ext/opcache/tests/bug65845.phpt @@ -0,0 +1,14 @@ +--TEST-- +Bug #65845 (Error when Zend Opcache Optimizer is fully enabled) +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +--SKIPIF-- + +--FILE-- + +--EXPECT-- +string(4) "tutu" From 5ae8c51e688060d0a3263b67ff9fb24ba2c8c1d2 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Thu, 10 Oct 2013 13:38:38 -0700 Subject: [PATCH 238/400] OCI8: sync README and package.xml descriptions --- ext/oci8/README | 21 ++++++++++++++------- ext/oci8/package.xml | 20 +++++++++++--------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/ext/oci8/README b/ext/oci8/README index af5beeb5c0745..d662072743fd1 100644 --- a/ext/oci8/README +++ b/ext/oci8/README @@ -1,13 +1,20 @@ The OCI8 Extension ------------------ -Use the OCI8 extension to access Oracle Database. +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 -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. +The extension can be linked with Oracle client libraries from Oracle +Database 10.2, 11, or 12.1. These libraries are found in the database +installation, or in the free Oracle Instant Client available from +Oracle. + +Oracle's standard cross-version connectivity applies. For example, +PHP OCI8 linked with Instant Client 11.2 can connect to Oracle +Database 9.2 onward. See Oracle's note "Oracle Client / Server +Interoperability Support" (ID 207303.1) for details. + +PHP OCI8 2.0 can be built with PHP 5.2 onward. Use the older PHP OCI8 +1.4.10 when using PHP 4.3.9 through to PHP 5.1.x, or when only Oracle +Database 9.2 client libraries are available. diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index d85faf046c970..f61def59c9851 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -8,15 +8,17 @@ http://pear.php.net/dtd/package-2.0.xsd"> Extension for Oracle Database -The PHP OCI8 extension gives access to Oracle Database. The extension -can be linked with Oracle client libraries from Oracle Database 10.2, -11, or 12.1. These libraries are found in the database installation, -or in the free Oracle Instant Client. Oracle's standard cross-version -connectivity applies. For example, PHP OCI8 linked with Instant -Client 11.2 can connect to Oracle Database 9.2 onwards. PHP OCI8 2.0 -can be built with PHP 5.2 onwards. Use the older PHP OCI8 1.4.10 when -using PHP 4.3.9 through to PHP 5.1.x, or when only Oracle Database 9.2 -client libraries are available. +Use the OCI8 extension to access Oracle Database. The extension can +be linked with Oracle client libraries from Oracle Database 10.2, 11, +or 12.1. These libraries are found in the database installation, or +in the free Oracle Instant Client available from Oracle. Oracle's +standard cross-version connectivity applies. For example, PHP OCI8 +linked with Instant Client 11.2 can connect to Oracle Database 9.2 +onward. See Oracle's note "Oracle Client / Server Interoperability +Support" (ID 207303.1) for details. PHP OCI8 2.0 can be built with +PHP 5.2 onward. Use the older PHP OCI8 1.4.10 when using PHP 4.3.9 +through to PHP 5.1.x, or when only Oracle Database 9.2 client +libraries are available. Christopher Jones From 7f3b5b77cca19b6e9c80a58abc93733cd52eaaaf Mon Sep 17 00:00:00 2001 From: Levi Morrison Date: Fri, 11 Oct 2013 10:32:40 -0600 Subject: [PATCH 239/400] Standardized usage of zpp_none and the order of the comparison zpp(...) == FAILURE --- ext/spl/spl_dllist.c | 14 +++++++------- ext/spl/spl_fixedarray.c | 14 +++++++------- ext/spl/spl_heap.c | 14 +++++++------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/ext/spl/spl_dllist.c b/ext/spl/spl_dllist.c index 273bc7506aa74..d5a9f83ae1411 100644 --- a/ext/spl/spl_dllist.c +++ b/ext/spl/spl_dllist.c @@ -603,7 +603,7 @@ SPL_METHOD(SplDoublyLinkedList, pop) zval *value; spl_dllist_object *intern; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -626,7 +626,7 @@ SPL_METHOD(SplDoublyLinkedList, shift) zval *value; spl_dllist_object *intern; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -649,7 +649,7 @@ SPL_METHOD(SplDoublyLinkedList, top) zval *value; spl_dllist_object *intern; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -672,7 +672,7 @@ SPL_METHOD(SplDoublyLinkedList, bottom) zval *value; spl_dllist_object *intern; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -695,7 +695,7 @@ SPL_METHOD(SplDoublyLinkedList, count) long count; spl_dllist_object *intern = (spl_dllist_object*)zend_object_store_get_object(getThis() TSRMLS_CC); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -710,7 +710,7 @@ SPL_METHOD(SplDoublyLinkedList, isEmpty) { long count; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -750,7 +750,7 @@ SPL_METHOD(SplDoublyLinkedList, getIteratorMode) { spl_dllist_object *intern; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c index 86a5371ed30d3..8624b35a4b616 100644 --- a/ext/spl/spl_fixedarray.c +++ b/ext/spl/spl_fixedarray.c @@ -583,7 +583,7 @@ SPL_METHOD(SplFixedArray, __construct) spl_fixedarray_object *intern; long size = 0; - if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &size)) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &size) == FAILURE) { return; } @@ -613,7 +613,7 @@ SPL_METHOD(SplFixedArray, __wakeup) HashTable *intern_ht = zend_std_get_properties(getThis() TSRMLS_CC); zval **data; - if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "")) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -643,7 +643,7 @@ SPL_METHOD(SplFixedArray, count) zval *object = getThis(); spl_fixedarray_object *intern; - if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "")) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -661,7 +661,7 @@ SPL_METHOD(SplFixedArray, toArray) { spl_fixedarray_object *intern; - if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "")) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -693,7 +693,7 @@ SPL_METHOD(SplFixedArray, fromArray) int num; zend_bool save_indexes = 1; - if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|b", &data, &save_indexes)) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|b", &data, &save_indexes) == FAILURE) { return; } @@ -777,7 +777,7 @@ SPL_METHOD(SplFixedArray, getSize) zval *object = getThis(); spl_fixedarray_object *intern; - if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "")) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -797,7 +797,7 @@ SPL_METHOD(SplFixedArray, setSize) spl_fixedarray_object *intern; long size; - if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &size)) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &size) == FAILURE) { return; } diff --git a/ext/spl/spl_heap.c b/ext/spl/spl_heap.c index cb1f68dcf1196..77b31c06dcdc7 100644 --- a/ext/spl/spl_heap.c +++ b/ext/spl/spl_heap.c @@ -587,7 +587,7 @@ SPL_METHOD(SplHeap, count) long count; spl_heap_object *intern = (spl_heap_object*)zend_object_store_get_object(getThis() TSRMLS_CC); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -602,7 +602,7 @@ SPL_METHOD(SplHeap, isEmpty) { spl_heap_object *intern = (spl_heap_object*)zend_object_store_get_object(getThis() TSRMLS_CC); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -643,7 +643,7 @@ SPL_METHOD(SplHeap, extract) zval *value; spl_heap_object *intern; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -705,7 +705,7 @@ SPL_METHOD(SplPriorityQueue, extract) zval *value, *value_out, **value_out_pp; spl_heap_object *intern; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -748,7 +748,7 @@ SPL_METHOD(SplPriorityQueue, top) zval *value, **value_out; spl_heap_object *intern; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -802,7 +802,7 @@ SPL_METHOD(SplHeap, recoverFromCorruption) { spl_heap_object *intern; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } @@ -835,7 +835,7 @@ SPL_METHOD(SplHeap, top) zval *value; spl_heap_object *intern; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + if (zend_parse_parameters_none() == FAILURE) { return; } From 73c44d6e6adcaefe64bbeb69de07741e93905d48 Mon Sep 17 00:00:00 2001 From: Levi Morrison Date: Fri, 11 Oct 2013 10:13:51 -0600 Subject: [PATCH 240/400] Fixed assumption that the temporary directory is located in /tmp --- sapi/cli/tests/upload_2G.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapi/cli/tests/upload_2G.phpt b/sapi/cli/tests/upload_2G.phpt index fe13d90007036..b8416ea730972 100644 --- a/sapi/cli/tests/upload_2G.phpt +++ b/sapi/cli/tests/upload_2G.phpt @@ -89,7 +89,7 @@ array(1) { ["type"]=> string(10) "text/plain" ["tmp_name"]=> - string(14) "/tmp/php%s" + string(%d) "%s" ["error"]=> int(0) ["size"]=> From 5c6dbc35e73a9dd6d6ffc8bb57c4b98a8918e008 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 12 Oct 2013 17:25:26 -0300 Subject: [PATCH 241/400] - Fixed resource leak --- ext/opcache/zend_accelerator_blacklist.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/opcache/zend_accelerator_blacklist.c b/ext/opcache/zend_accelerator_blacklist.c index da83cfd3119e1..eb0bc2146cd55 100644 --- a/ext/opcache/zend_accelerator_blacklist.c +++ b/ext/opcache/zend_accelerator_blacklist.c @@ -314,6 +314,7 @@ void zend_accel_blacklist_load(zend_blacklist *blacklist, char *filename) blacklist->entries[blacklist->pos].path = (char *)malloc(path_length + 1); if (!blacklist->entries[blacklist->pos].path) { zend_accel_error(ACCEL_LOG_ERROR, "malloc() failed\n"); + fclose(fp); return; } blacklist->entries[blacklist->pos].id = blacklist->pos; From 9d572437949689b51fcd7a90cdaba2af9f052598 Mon Sep 17 00:00:00 2001 From: Daniel Lowrey Date: Wed, 9 Oct 2013 15:39:06 -0400 Subject: [PATCH 242/400] Fixes broken zts build (recent openssl changes) --- ext/openssl/openssl.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 952bd75927ff5..a52ade0e5ce17 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1672,7 +1672,7 @@ PHP_FUNCTION(openssl_x509_export) } /* }}} */ -static int php_openssl_x509_fingerprint(X509 *peer, const char *method, zend_bool raw, char **out, int *out_len) +static int php_openssl_x509_fingerprint(X509 *peer, const char *method, zend_bool raw, char **out, int *out_len TSRMLS_DC) { unsigned char md[EVP_MAX_MD_SIZE]; const EVP_MD *mdtype; @@ -1699,13 +1699,13 @@ static int php_openssl_x509_fingerprint(X509 *peer, const char *method, zend_boo return SUCCESS; } -static int php_x509_fingerprint_cmp(X509 *peer, const char *method, const char *expected) +static int php_x509_fingerprint_cmp(X509 *peer, const char *method, const char *expected TSRMLS_DC) { char *fingerprint; int fingerprint_len; int result = -1; - if (php_openssl_x509_fingerprint(peer, method, 0, &fingerprint, &fingerprint_len) == SUCCESS) { + if (php_openssl_x509_fingerprint(peer, method, 0, &fingerprint, &fingerprint_len TSRMLS_CC) == SUCCESS) { result = strcmp(expected, fingerprint); efree(fingerprint); } @@ -1713,7 +1713,7 @@ static int php_x509_fingerprint_cmp(X509 *peer, const char *method, const char * return result; } -static zend_bool php_x509_fingerprint_match(X509 *peer, zval *val) +static zend_bool php_x509_fingerprint_match(X509 *peer, zval *val TSRMLS_DC) { if (Z_TYPE_P(val) == IS_STRING) { const char *method = NULL; @@ -1728,7 +1728,7 @@ static zend_bool php_x509_fingerprint_match(X509 *peer, zval *val) break; } - return method && php_x509_fingerprint_cmp(peer, method, Z_STRVAL_P(val)) == 0; + return method && php_x509_fingerprint_cmp(peer, method, Z_STRVAL_P(val) TSRMLS_CC) == 0; } else if (Z_TYPE_P(val) == IS_ARRAY) { HashPosition pos; zval **current; @@ -1744,7 +1744,7 @@ static zend_bool php_x509_fingerprint_match(X509 *peer, zval *val) if (key_type == HASH_KEY_IS_STRING && Z_TYPE_PP(current) == IS_STRING - && php_x509_fingerprint_cmp(peer, key, Z_STRVAL_PP(current)) != 0 + && php_x509_fingerprint_cmp(peer, key, Z_STRVAL_PP(current) TSRMLS_CC) != 0 ) { return 0; } @@ -1776,7 +1776,7 @@ PHP_FUNCTION(openssl_x509_fingerprint) RETURN_FALSE; } - if (php_openssl_x509_fingerprint(cert, method, raw_output, &fingerprint, &fingerprint_len) == SUCCESS) { + if (php_openssl_x509_fingerprint(cert, method, raw_output, &fingerprint, &fingerprint_len TSRMLS_CC) == SUCCESS) { RETVAL_STRINGL(fingerprint, fingerprint_len, 0); } else { RETVAL_FALSE; @@ -5009,7 +5009,7 @@ static zend_bool matches_san_list(X509 *peer, const char *subject_name) return is_match; } -static zend_bool matches_common_name(X509 *peer, const char *subject_name) +static zend_bool matches_common_name(X509 *peer, const char *subject_name TSRMLS_DC) { char buf[1024]; X509_NAME *cert_name; @@ -5068,7 +5068,7 @@ int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stre if (GET_VER_OPT("peer_fingerprint")) { if (Z_TYPE_PP(val) == IS_STRING || Z_TYPE_PP(val) == IS_ARRAY) { - if (!php_x509_fingerprint_match(peer, *val)) { + if (!php_x509_fingerprint_match(peer, *val TSRMLS_CC)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Peer fingerprint doesn't match"); return FAILURE; } @@ -5082,7 +5082,7 @@ int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stre if (cnmatch) { if (matches_san_list(peer, cnmatch)) { return SUCCESS; - } else if (matches_common_name(peer, cnmatch)) { + } else if (matches_common_name(peer, cnmatch TSRMLS_CC)) { return SUCCESS; } else { return FAILURE; From 960b4e81f316528fc554ec1bff7daf46faa7129f Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 12 Oct 2013 18:06:20 -0300 Subject: [PATCH 243/400] - Fixed possible memory leak --- win32/readdir.c | 1 + 1 file changed, 1 insertion(+) diff --git a/win32/readdir.c b/win32/readdir.c index 9525fc0d6b499..0edd5764d4988 100644 --- a/win32/readdir.c +++ b/win32/readdir.c @@ -45,6 +45,7 @@ DIR *opendir(const char *dir) dp = (DIR *) malloc(sizeof(DIR)); if (dp == NULL) { + free(filespec); return NULL; } dp->offset = 0; From c092d286fc5bcf6875c96451aa230c2e144aeb77 Mon Sep 17 00:00:00 2001 From: Jakub Zelenka Date: Sun, 13 Oct 2013 15:52:39 +0100 Subject: [PATCH 244/400] Fix compiler warnings in openssl.c --- ext/openssl/openssl.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index a52ade0e5ce17..a0495eaae53dd 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1602,7 +1602,7 @@ PHP_FUNCTION(openssl_spki_export_challenge) goto cleanup; } - RETVAL_STRING(ASN1_STRING_data(spki->spkac->challenge), 1); + RETVAL_STRING((char *) ASN1_STRING_data(spki->spkac->challenge), 1); goto cleanup; cleanup: @@ -1676,7 +1676,7 @@ static int php_openssl_x509_fingerprint(X509 *peer, const char *method, zend_boo { unsigned char md[EVP_MAX_MD_SIZE]; const EVP_MD *mdtype; - int n; + unsigned int n; if (!(mdtype = EVP_get_digestbyname(method))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown signature algorithm"); @@ -1688,7 +1688,7 @@ static int php_openssl_x509_fingerprint(X509 *peer, const char *method, zend_boo if (raw) { *out_len = n; - *out = estrndup(md, n); + *out = estrndup((char *) md, n); } else { *out_len = n * 2; *out = emalloc(*out_len + 1); @@ -4916,14 +4916,12 @@ static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx) /* {{{ */ { php_stream *stream; SSL *ssl; - X509 *err_cert; int err, depth, ret; zval **val; ret = preverify_ok; /* determine the status for the current cert */ - err_cert = X509_STORE_CTX_get_current_cert(ctx); err = X509_STORE_CTX_get_error(ctx); depth = X509_STORE_CTX_get_error_depth(ctx); @@ -4997,7 +4995,7 @@ static zend_bool matches_san_list(X509 *peer, const char *subject_name) if (GEN_DNS == san->type) { ASN1_STRING_to_UTF8(&cert_name, san->d.dNSName); - is_match = matches_wildcard_name(subject_name, cert_name); + is_match = matches_wildcard_name(subject_name, (char *) cert_name); OPENSSL_free(cert_name); } From 7a038ccbe61c88b007a3a3ba1580185058792e91 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Mon, 14 Oct 2013 14:18:43 +0200 Subject: [PATCH 245/400] fixed skeleton to produce the normalized ext version macros See http://news.php.net/php.pecl.dev/11191 for more info. --- ext/skeleton/php_skeleton.h | 2 ++ ext/skeleton/skeleton.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ext/skeleton/php_skeleton.h b/ext/skeleton/php_skeleton.h index 495907bbd16ed..0716ae05e6241 100644 --- a/ext/skeleton/php_skeleton.h +++ b/ext/skeleton/php_skeleton.h @@ -6,6 +6,8 @@ extern zend_module_entry extname_module_entry; #define phpext_extname_ptr &extname_module_entry +#define PHP_EXTNAME_VERSION "0.1.0" /* Replace with version number for your extension */ + #ifdef PHP_WIN32 # define PHP_EXTNAME_API __declspec(dllexport) #elif defined(__GNUC__) && __GNUC__ >= 4 diff --git a/ext/skeleton/skeleton.c b/ext/skeleton/skeleton.c index ee4ea74e16866..2e373442d8dd1 100644 --- a/ext/skeleton/skeleton.c +++ b/ext/skeleton/skeleton.c @@ -41,7 +41,7 @@ zend_module_entry extname_module_entry = { 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 */ + PHP_EXTNAME_VERSION, #endif STANDARD_MODULE_PROPERTIES }; From dcfd753104085d8337b8a5f4a21ce3b629ad4651 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Mon, 14 Oct 2013 14:37:39 +0200 Subject: [PATCH 246/400] fixed skeleton to produce the normalized ext version macros See http://news.php.net/php.pecl.dev/11191 for more info. --- ext/skeleton/php_skeleton.h | 2 ++ ext/skeleton/skeleton.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ext/skeleton/php_skeleton.h b/ext/skeleton/php_skeleton.h index 86836c03e287a..d0ba6f04abea4 100644 --- a/ext/skeleton/php_skeleton.h +++ b/ext/skeleton/php_skeleton.h @@ -6,6 +6,8 @@ extern zend_module_entry extname_module_entry; #define phpext_extname_ptr &extname_module_entry +#define PHP_EXTNAME_VERSION "0.1.0" /* Replace with version number for your extension */ + #ifdef PHP_WIN32 # define PHP_EXTNAME_API __declspec(dllexport) #elif defined(__GNUC__) && __GNUC__ >= 4 diff --git a/ext/skeleton/skeleton.c b/ext/skeleton/skeleton.c index b9a918806c810..462e48756ff07 100644 --- a/ext/skeleton/skeleton.c +++ b/ext/skeleton/skeleton.c @@ -142,7 +142,7 @@ zend_module_entry extname_module_entry = { 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 */ + PHP_EXTNAME_VERSION, STANDARD_MODULE_PROPERTIES }; /* }}} */ From 9ccde8a41571282521c677edf2b481a526ae03c9 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Mon, 14 Oct 2013 16:07:26 +0200 Subject: [PATCH 247/400] added notes about the PECL site conformity --- README.EXTENSIONS | 2 +- README.EXT_SKEL | 5 +++++ README.SELF-CONTAINED-EXTENSIONS | 15 +++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/README.EXTENSIONS b/README.EXTENSIONS index 51e3b730e7de7..7f06c0fb1bc3c 100644 --- a/README.EXTENSIONS +++ b/README.EXTENSIONS @@ -30,7 +30,7 @@ zend_module_entry foo_module_entry = { PHP_RSHUTDOWN(foo), /* per-request shutdown function */ PHP_MINFO(foo), /* information function */ #if ZEND_MODULE_API_NO >= 20010901 - FOO_VERSION, /* extension version number (string) */ + PHP_FOO_VERSION, /* extension version number (string) */ #endif STANDARD_MODULE_PROPERTIES }; diff --git a/README.EXT_SKEL b/README.EXT_SKEL index b0db843a42ba0..d44fcc5c6a92c 100644 --- a/README.EXT_SKEL +++ b/README.EXT_SKEL @@ -31,6 +31,11 @@ HOW TO USE IT ./buildconf; ./configure --enable-module_name; make + The definition of PHP_MODULE_NAME_VERSION will be present in the + php_module_name.h and injected into the zend_module_entry definition. This + is required by the PECL website for the version string conformity checks + against package.xml + But if you already have planned the overall scheme of your module, what functions it will contain, their return types and the arguments they take (a very good idea) and don't want to bother yourself with creating function diff --git a/README.SELF-CONTAINED-EXTENSIONS b/README.SELF-CONTAINED-EXTENSIONS index e6a375331b4a5..5287230e1aea0 100644 --- a/README.SELF-CONTAINED-EXTENSIONS +++ b/README.SELF-CONTAINED-EXTENSIONS @@ -153,3 +153,18 @@ ADDING SHARED MODULE SUPPORT TO A MODULE #ifdef COMPILE_DL_FOO ZEND_GET_MODULE(foo) #endif + +PECL SITE CONFORMITY + + If you plan to release an extension to the PECL website, there are several + points to be regarded. + + 1. Add LICENSE or COPYING to the package.xml + + 2. The following should be defined in one of the extension header files + + #define PHP_FOO_VERSION "1.2.3" + + This macros has to be used within your foo_module_entry to indicate the + extension version. + From b0a36007abb522b6b1e3a6b3108eb726053b9d72 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Mon, 14 Oct 2013 17:12:32 +0200 Subject: [PATCH 248/400] fix whitespaces --- README.EXTENSIONS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.EXTENSIONS b/README.EXTENSIONS index 7f06c0fb1bc3c..06d6cdd85f2e4 100644 --- a/README.EXTENSIONS +++ b/README.EXTENSIONS @@ -30,7 +30,7 @@ zend_module_entry foo_module_entry = { PHP_RSHUTDOWN(foo), /* per-request shutdown function */ PHP_MINFO(foo), /* information function */ #if ZEND_MODULE_API_NO >= 20010901 - PHP_FOO_VERSION, /* extension version number (string) */ + PHP_FOO_VERSION, /* extension version number (string) */ #endif STANDARD_MODULE_PROPERTIES }; From a2eacd8a2c417027fda4c19e54e2b6af9f1fa90d Mon Sep 17 00:00:00 2001 From: Paul Tarjan Date: Mon, 14 Oct 2013 23:54:59 -0700 Subject: [PATCH 249/400] fix typo in copy_variation16 test --- ext/standard/tests/file/copy_variation16-win32.phpt | 4 ++-- ext/standard/tests/file/copy_variation16.phpt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/standard/tests/file/copy_variation16-win32.phpt b/ext/standard/tests/file/copy_variation16-win32.phpt index 7688f5eeabf86..d95d24adacb56 100644 --- a/ext/standard/tests/file/copy_variation16-win32.phpt +++ b/ext/standard/tests/file/copy_variation16-win32.phpt @@ -22,7 +22,7 @@ mkdir($base_dir); $sub_dir = $base_dir."/copy_variation16_sub"; mkdir($sub_dir); -$dirname_with_blank = $sub_dir."/copy variation6"; +$dirname_with_blank = $sub_dir."/copy variation16"; mkdir($dirname_with_blank); $src_file_name = dirname(__FILE__)."/copy_variation16.tmp"; @@ -139,6 +139,6 @@ Existence of destination file => bool(false) Size of source file => int(3500) Copy operation => bool(true) Existence of destination file => bool(true) -Destination file name is => %s/copy_variation16/copy_variation16_sub/copy variation6/copy_copy_variation16.tmp +Destination file name is => %s/copy_variation16/copy_variation16_sub/copy variation16/copy_copy_variation16.tmp Size of destination file => int(3500) *** Done *** diff --git a/ext/standard/tests/file/copy_variation16.phpt b/ext/standard/tests/file/copy_variation16.phpt index 9ad834bdb4192..e36fee1d666b7 100644 --- a/ext/standard/tests/file/copy_variation16.phpt +++ b/ext/standard/tests/file/copy_variation16.phpt @@ -22,7 +22,7 @@ mkdir($base_dir); $sub_dir = $base_dir."/copy_variation16_sub"; mkdir($sub_dir); -$dirname_with_blank = $sub_dir."/copy variation6"; +$dirname_with_blank = $sub_dir."/copy variation16"; mkdir($dirname_with_blank); $src_file_name = dirname(__FILE__)."/copy_variation16.tmp"; @@ -138,6 +138,6 @@ Size of destination file => int(3500) Size of source file => int(3500) Copy operation => bool(true) Existence of destination file => bool(true) -Destination file name is => %s/copy_variation16/copy_variation16_sub/copy variation6/copy_copy_variation16.tmp +Destination file name is => %s/copy_variation16/copy_variation16_sub/copy variation16/copy_copy_variation16.tmp Size of destination file => int(3500) *** Done *** From aa76f779ef76e15d40b3db68c14033cac5ef0637 Mon Sep 17 00:00:00 2001 From: Julien Pauli Date: Tue, 15 Oct 2013 16:11:11 +0200 Subject: [PATCH 250/400] 5.5.6 now --- NEWS | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 9436fe98835b2..a15204c05bde4 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,8 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| -?? ??? 2013, PHP 5.5.5 +?? ??? 2013, PHP 5.5.6 + +17 Oct 2013, PHP 5.5.5 - Core: . Fixed bug #64979 (Wrong behavior of static variables in closure generators). From 4c0bb6d76eb0c8b9fdc74c3c8858a146ab34e2f8 Mon Sep 17 00:00:00 2001 From: bwoebi Date: Wed, 16 Oct 2013 16:04:23 +0200 Subject: [PATCH 251/400] Fixed bug #65911 ($this not usable as static property) In context of static accesses like classname::$this, the string "$this" should not be handled like a $this variable, but as an identifier for a static variable. --- NEWS | 4 ++++ Zend/tests/bug65911.phpt | 20 ++++++++++++++++++++ Zend/zend_compile.c | 1 + 3 files changed, 25 insertions(+) create mode 100644 Zend/tests/bug65911.phpt diff --git a/NEWS b/NEWS index fcf34c3fb9ec9..6c2c6ed13b5aa 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2013, PHP 5.4.22 +- Core: + . Fixed bug #65911 (scope resolution operator - strange behavior with $this). + (Bob Weinand) + - CLI server: . Fixed bug #65818 (Segfault with built-in webserver and chunked transfer encoding). (Felipe) diff --git a/Zend/tests/bug65911.phpt b/Zend/tests/bug65911.phpt new file mode 100644 index 0000000000000..b9f37b7bd6a45 --- /dev/null +++ b/Zend/tests/bug65911.phpt @@ -0,0 +1,20 @@ +--TEST-- +Bug #65911 (scope resolution operator - strange behavior with $this) +--FILE-- +foo = 'bar'; + echo A::$this->foo; // should not output 'bar' + } +} + +$obj = new B(); +$obj->go(); +?> +--EXPECTF-- +Fatal error: Access to undeclared static property: A::$this in %s on line %d diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 326d4ef976795..10390b04a8df0 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -905,6 +905,7 @@ static zend_bool opline_is_fetch_this(const zend_op *opline TSRMLS_DC) /* {{{ */ { if ((opline->opcode == ZEND_FETCH_W) && (opline->op1_type == IS_CONST) && (Z_TYPE(CONSTANT(opline->op1.constant)) == IS_STRING) + && ((opline->extended_value & ZEND_FETCH_STATIC_MEMBER) != ZEND_FETCH_STATIC_MEMBER) && (Z_HASH_P(&CONSTANT(opline->op1.constant)) == THIS_HASHVAL) && (Z_STRLEN(CONSTANT(opline->op1.constant)) == (sizeof("this")-1)) && !memcmp(Z_STRVAL(CONSTANT(opline->op1.constant)), "this", sizeof("this"))) { From 06994a419d625291c2ae071e3b22716901b45cf6 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Thu, 17 Oct 2013 12:23:09 +0800 Subject: [PATCH 252/400] Add ability of alias resolving (it cause problem while work with opcache) --- ext/phar/config.m4 | 2 ++ ext/phar/php_phar.h | 7 +++++-- ext/phar/util.c | 11 +++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/ext/phar/config.m4 b/ext/phar/config.m4 index d424060f2a247..614d672eabd9d 100644 --- a/ext/phar/config.m4 +++ b/ext/phar/config.m4 @@ -28,5 +28,7 @@ if test "$PHP_PHAR" != "no"; then PHP_ADD_EXTENSION_DEP(phar, spl, true) PHP_ADD_MAKEFILE_FRAGMENT + PHP_INSTALL_HEADERS([ext/phar], [php_phar.h]) + PHP_OUTPUT(ext/phar/phar.1 ext/phar/phar.phar.1) fi diff --git a/ext/phar/php_phar.h b/ext/phar/php_phar.h index a6d7bff414b8c..4146e28f770da 100644 --- a/ext/phar/php_phar.h +++ b/ext/phar/php_phar.h @@ -22,7 +22,7 @@ #ifndef PHP_PHAR_H #define PHP_PHAR_H -#define PHP_PHAR_VERSION "2.0.1" +#define PHP_PHAR_VERSION "2.0.2" #include "ext/standard/basic_functions.h" extern zend_module_entry phar_module_entry; @@ -31,9 +31,12 @@ extern zend_module_entry phar_module_entry; #ifdef PHP_WIN32 #define PHP_PHAR_API __declspec(dllexport) #else -#define PHP_PHAR_API +#define PHP_PHAR_API PHPAPI #endif +#define PHAR_HAVE_RESOLVE_ALIAS +PHP_PHAR_API int phar_resolve_alias(char *alias, int alias_len, char **filename, int *filename_len TSRMLS_DC); + #endif /* PHP_PHAR_H */ diff --git a/ext/phar/util.c b/ext/phar/util.c index 8348a47874eab..e9f1b1673c324 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -1185,6 +1185,17 @@ phar_entry_info * phar_open_jit(phar_archive_data *phar, phar_entry_info *entry, } /* }}} */ +PHP_PHAR_API int phar_resolve_alias(char *alias, int alias_len, char **filename, int *filename_len TSRMLS_DC) /* {{{ */ { + phar_archive_data **fd_ptr; + if (SUCCESS == zend_hash_find(&(PHAR_GLOBALS->phar_alias_map), alias, alias_len, (void**)&fd_ptr)) { + *filename = (*fd_ptr)->fname; + *filename_len = (*fd_ptr)->fname_len; + return 1; + } + return 0; +} +/* }}} */ + int phar_free_alias(phar_archive_data *phar, char *alias, int alias_len TSRMLS_DC) /* {{{ */ { if (phar->refcount || phar->is_persistent) { From 0d909f5bfcfa54d7bfad41270df435500e909da7 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Wed, 16 Oct 2013 22:02:32 -0700 Subject: [PATCH 253/400] OCI8: Mostly SKIPIF version updates to simplify version checks at the expense of not testing some edge cases with older Oracle patch set versions. Delete two obsolete .phpt's. --- ext/oci8/package.xml | 8 +- ext/oci8/tests/bind_char_1.phpt | 11 +- ext/oci8/tests/bind_char_1_11gR1.phpt | 7 +- ext/oci8/tests/bind_char_2.phpt | 11 +- ext/oci8/tests/bind_char_2_11gR1.phpt | 7 +- ext/oci8/tests/bind_char_3.phpt | 11 +- ext/oci8/tests/bind_char_3_11gR1.phpt | 7 +- ext/oci8/tests/bind_char_4.phpt | 11 +- ext/oci8/tests/bind_char_4_11gR1.phpt | 7 +- ext/oci8/tests/bind_misccoltypes.phpt | 3 - ext/oci8/tests/bind_number.phpt | 3 - ext/oci8/tests/bind_sqltnum.phpt | 3 - ext/oci8/tests/bind_unsupported_2.phpt | 4 - ext/oci8/tests/bug27303_1.phpt | 11 +- ext/oci8/tests/bug27303_1_11gR1.phpt | 8 +- ext/oci8/tests/bug27303_2.phpt | 11 +- ext/oci8/tests/bug27303_2_11gR1.phpt | 8 +- ext/oci8/tests/bug27303_4.phpt | 12 +- ext/oci8/tests/bug27303_4_11gR1.phpt | 8 +- ext/oci8/tests/bug36403.phpt | 4 - ext/oci8/tests/bug43497.phpt | 4 - ext/oci8/tests/bug43497_92.phpt | 305 ------------------ ext/oci8/tests/bug47281.phpt | 4 +- ext/oci8/tests/clientversion.phpt | 3 - ext/oci8/tests/clientversion_92.phpt | 20 -- ext/oci8/tests/conn_attr_1.phpt | 4 - ext/oci8/tests/conn_attr_2.phpt | 4 - ext/oci8/tests/conn_attr_3.phpt | 4 - ext/oci8/tests/conn_attr_4.phpt | 4 - ext/oci8/tests/conn_attr_5.phpt | 4 - .../tests/connect_without_oracle_home.phpt | 6 +- .../tests/connect_without_oracle_home_11.phpt | 6 +- .../connect_without_oracle_home_old.phpt | 3 - .../connect_without_oracle_home_old_11.phpt | 6 +- ext/oci8/tests/drcp_cclass1.phpt | 14 +- ext/oci8/tests/drcp_connection_class.phpt | 8 +- ext/oci8/tests/driver_name.phpt | 17 +- ext/oci8/tests/edition_1.phpt | 15 +- ext/oci8/tests/edition_2.phpt | 16 +- ext/oci8/tests/ini_1.phpt | 8 +- ext/oci8/tests/password_new.phpt | 28 +- ext/oci8/tests/password_old.phpt | 29 +- ext/oci8/tests/pecl_bug16035.phpt | 3 - ext/oci8/tests/refcur_prefetch_1.phpt | 13 +- ext/oci8/tests/refcur_prefetch_2.phpt | 13 +- ext/oci8/tests/refcur_prefetch_3.phpt | 16 +- ext/oci8/tests/refcur_prefetch_4.phpt | 13 +- 47 files changed, 168 insertions(+), 557 deletions(-) delete mode 100644 ext/oci8/tests/bug43497_92.phpt delete mode 100644 ext/oci8/tests/clientversion_92.phpt diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index f61def59c9851..7eccd9d8f9950 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -45,7 +45,7 @@ libraries are available. no - 2013-10-08 + 2013-10-17 @@ -53,8 +53,8 @@ libraries are available. 2.0.5 - devel - devel + stable + stable PHP @@ -150,7 +150,6 @@ linking works in the new Windows PECL infrastructure. - @@ -163,7 +162,6 @@ linking works in the new Windows PECL infrastructure. - diff --git a/ext/oci8/tests/bind_char_1.phpt b/ext/oci8/tests/bind_char_1.phpt index d68991a7f2baf..dc162ff943182 100644 --- a/ext/oci8/tests/bind_char_1.phpt +++ b/ext/oci8/tests/bind_char_1.phpt @@ -6,15 +6,8 @@ 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. 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"); -} -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"); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle 12c database"); } ?> --ENV-- diff --git a/ext/oci8/tests/bind_char_1_11gR1.phpt b/ext/oci8/tests/bind_char_1_11gR1.phpt index 2a7c713aa7f15..bdc29f766dab3 100644 --- a/ext/oci8/tests/bind_char_1_11gR1.phpt +++ b/ext/oci8/tests/bind_char_1_11gR1.phpt @@ -6,11 +6,8 @@ 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. 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"); +if (!(isset($matches[0]) && $matches[1] < 12)) { + die("skip expected output only valid when using pre-Oracle 12c database"); } ?> --ENV-- diff --git a/ext/oci8/tests/bind_char_2.phpt b/ext/oci8/tests/bind_char_2.phpt index 3695c85854904..9c61a858c8e71 100644 --- a/ext/oci8/tests/bind_char_2.phpt +++ b/ext/oci8/tests/bind_char_2.phpt @@ -6,15 +6,8 @@ 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. 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"); -} -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"); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle 12c database"); } ?> --ENV-- diff --git a/ext/oci8/tests/bind_char_2_11gR1.phpt b/ext/oci8/tests/bind_char_2_11gR1.phpt index b9afd6940bcca..06c37afc93e20 100644 --- a/ext/oci8/tests/bind_char_2_11gR1.phpt +++ b/ext/oci8/tests/bind_char_2_11gR1.phpt @@ -6,11 +6,8 @@ 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. 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"); +if (!(isset($matches[0]) && $matches[1] < 12)) { + die("skip expected output only valid when using pre-Oracle 12c database"); } ?> --ENV-- diff --git a/ext/oci8/tests/bind_char_3.phpt b/ext/oci8/tests/bind_char_3.phpt index 009e60a542b6a..177676e25ca3b 100644 --- a/ext/oci8/tests/bind_char_3.phpt +++ b/ext/oci8/tests/bind_char_3.phpt @@ -6,15 +6,8 @@ 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. 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"); -} -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"); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle 12c database"); } ?> --ENV-- diff --git a/ext/oci8/tests/bind_char_3_11gR1.phpt b/ext/oci8/tests/bind_char_3_11gR1.phpt index a894de00c075f..c3ec999d0f10d 100644 --- a/ext/oci8/tests/bind_char_3_11gR1.phpt +++ b/ext/oci8/tests/bind_char_3_11gR1.phpt @@ -6,11 +6,8 @@ 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. 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"); +if (!(isset($matches[0]) && $matches[1] < 12)) { + die("skip expected output only valid when using pre-Oracle 12c database"); } ?> --ENV-- diff --git a/ext/oci8/tests/bind_char_4.phpt b/ext/oci8/tests/bind_char_4.phpt index 0ac60e503de87..b4d3e089b136f 100644 --- a/ext/oci8/tests/bind_char_4.phpt +++ b/ext/oci8/tests/bind_char_4.phpt @@ -6,15 +6,8 @@ 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. 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"); -} -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"); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle 12c database"); } ?> --ENV-- diff --git a/ext/oci8/tests/bind_char_4_11gR1.phpt b/ext/oci8/tests/bind_char_4_11gR1.phpt index d5ce116afb65a..ccad2cb7894c1 100644 --- a/ext/oci8/tests/bind_char_4_11gR1.phpt +++ b/ext/oci8/tests/bind_char_4_11gR1.phpt @@ -6,11 +6,8 @@ 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. 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"); +if (!(isset($matches[0]) && $matches[1] < 12)) { + die("skip expected output only valid when using pre-Oracle 12c database"); } ?> --ENV-- diff --git a/ext/oci8/tests/bind_misccoltypes.phpt b/ext/oci8/tests/bind_misccoltypes.phpt index 0da8c8bf8803a..9e55b3b1ff74b 100644 --- a/ext/oci8/tests/bind_misccoltypes.phpt +++ b/ext/oci8/tests/bind_misccoltypes.phpt @@ -4,9 +4,6 @@ Bind miscellaneous column types using default types true, 'timesten' => false); // test runs on these DBs require(dirname(__FILE__).'/skipif.inc'); -if (preg_match('/^1[012]\./', oci_client_version()) != 1) { - die("skip test expected to work only with Oracle 10g or greater version of client"); -} ?> --FILE-- --INI-- precision = 14 diff --git a/ext/oci8/tests/bind_sqltnum.phpt b/ext/oci8/tests/bind_sqltnum.phpt index d3828b73eea95..93fc4809ec10d 100644 --- a/ext/oci8/tests/bind_sqltnum.phpt +++ b/ext/oci8/tests/bind_sqltnum.phpt @@ -3,9 +3,6 @@ Bind with SQLT_NUM --SKIPIF-- --FILE-- --FILE-- = 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"); -} -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"); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle 12c database"); } ?> --ENV-- diff --git a/ext/oci8/tests/bug27303_1_11gR1.phpt b/ext/oci8/tests/bug27303_1_11gR1.phpt index 7b4c158561959..d2018783bc925 100644 --- a/ext/oci8/tests/bug27303_1_11gR1.phpt +++ b/ext/oci8/tests/bug27303_1_11gR1.phpt @@ -6,12 +6,8 @@ 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. 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"); +if (!(isset($matches[0]) && $matches[1] < 12)) { + die("skip expected output only valid when using pre-Oracle 12c database"); } ?> --FILE-- diff --git a/ext/oci8/tests/bug27303_2.phpt b/ext/oci8/tests/bug27303_2.phpt index 72d4e5a7ddbcf..ee2f7b52aa5e6 100644 --- a/ext/oci8/tests/bug27303_2.phpt +++ b/ext/oci8/tests/bug27303_2.phpt @@ -6,15 +6,8 @@ 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. 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"); -} -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"); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle 12c database"); } ?> --ENV-- diff --git a/ext/oci8/tests/bug27303_2_11gR1.phpt b/ext/oci8/tests/bug27303_2_11gR1.phpt index 27d8a585bd452..06133e0115723 100644 --- a/ext/oci8/tests/bug27303_2_11gR1.phpt +++ b/ext/oci8/tests/bug27303_2_11gR1.phpt @@ -6,12 +6,8 @@ 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. 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"); +if (!(isset($matches[0]) && $matches[1] < 12)) { + die("skip expected output only valid when using pre-Oracle 12c database"); } ?> --FILE-- diff --git a/ext/oci8/tests/bug27303_4.phpt b/ext/oci8/tests/bug27303_4.phpt index a24ae705aba57..ed9d5a1fe6d43 100644 --- a/ext/oci8/tests/bug27303_4.phpt +++ b/ext/oci8/tests/bug27303_4.phpt @@ -6,16 +6,8 @@ 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. 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 -} -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"); +if (!(isset($matches[0]) && $matches[1] >= 12)) { + die("skip expected output only valid when using Oracle 12c database"); } ?> --ENV-- diff --git a/ext/oci8/tests/bug27303_4_11gR1.phpt b/ext/oci8/tests/bug27303_4_11gR1.phpt index 01db1dc5a0bef..550d89fdcc52f 100644 --- a/ext/oci8/tests/bug27303_4_11gR1.phpt +++ b/ext/oci8/tests/bug27303_4_11gR1.phpt @@ -6,12 +6,8 @@ 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. 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"); +if (!(isset($matches[0]) && $matches[1] < 12)) { + die("skip expected output only valid when using pre-Oracle 12c database"); } ?> --FILE-- diff --git a/ext/oci8/tests/bug36403.phpt b/ext/oci8/tests/bug36403.phpt index 4ac32c4b069a5..122b06bbfa2b0 100644 --- a/ext/oci8/tests/bug36403.phpt +++ b/ext/oci8/tests/bug36403.phpt @@ -3,10 +3,6 @@ Bug #36403 (oci_execute no longer supports OCI_DESCRIBE_ONLY) --SKIPIF-- --FILE-- 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'); -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-- 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'); -ob_start(); -phpinfo(INFO_MODULES); -$phpinfo = ob_get_clean(); -$iv = preg_match('/Oracle .*Version => (9\.2)/', $phpinfo); -if ($iv != 1) { - die ("skip tests a feature that works only with Oracle 9iR2 client"); -} -?> ---FILE-- -free(); // cleanup properly - ++$cntchk; - } - } - echo "Loop count check = $cntchk\n"; -} - -// Read all XML data using explicit LOB locator but without freeing the temp lobs -function readxmltab_ex_nofree($c) -{ - $stmt = oci_parse($c, "select extract(xml, '/').getclobval() from bug43497_tab"); - - $cntchk = 0; - if (oci_execute($stmt)) { - while ($result = oci_fetch_array($stmt, OCI_NUM)) { - ++$cntchk; - } - } - echo "Loop count check = $cntchk\n"; -} - -// Read all XML data using implicit LOB locator -function readxmltab_im($c) -{ - $stmt = oci_parse($c, "select extract(xml, '/').getclobval() from bug43497_tab"); - - $cntchk = 0; - if (oci_execute($stmt)) { - while ($result = oci_fetch_array($stmt, OCI_NUM+OCI_RETURN_LOBS)) { - ++$cntchk; - } - } - echo "Loop count check = $cntchk\n"; -} - -function createxmltab($c) // create table w/ field of XML type -{ - @dropxmltab($c); - $stmt = oci_parse($c, "create table bug43497_tab (id number primary key, xml xmltype)"); - oci_execute($stmt); -} - -function dropxmltab($c) // delete table -{ - $stmt = oci_parse($c, "drop table bug43497_tab"); - oci_execute($stmt); -} - - -function fillxmltab($c) -{ - for ($id = 1; $id <= 100; $id++) { - - // create an XML element string with random data - $s = ""; - for ($j = 0; $j < 128; $j++) { - $s .= rand(); - } - $s .= "\n"; - for ($j = 0; $j < 4; $j++) { - $s .= $s; - } - $data = "" . $s . ""; - - // insert XML data into database - - $stmt = oci_parse($c, "insert into bug43497_tab(id, xml) values (:id, sys.xmltype.createxml(:xml))"); - oci_bind_by_name($stmt, ":id", $id); - $clob = oci_new_descriptor($c, OCI_D_LOB); - oci_bind_by_name($stmt, ":xml", $clob, -1, OCI_B_CLOB); - $clob->writetemporary($data); - oci_execute($stmt); - - $clob->close(); - $clob->free(); - } -} - - -// Initialize - -createxmltab($c); -fillxmltab($c); - -// Run Test - -$sid = sessionid($c); - -echo "Explicit LOB use\n"; -for ($i = 1; $i <= 10; $i++) { - echo "\nRun = " . $i . "\n"; - echo "Temporary LOBs = " . templobs($c, $sid) . "\n"; - readxmltab_ex($c); -} - -echo "\nImplicit LOB use\n"; -for ($i = 1; $i <= 10; $i++) { - echo "\nRun = " . $i . "\n"; - echo "Temporary LOBs = " . templobs($c, $sid) . "\n"; - readxmltab_im($c); -} - -echo "\nExplicit LOB with no free (i.e. a temp lob leak)\n"; -for ($i = 1; $i <= 10; $i++) { - echo "\nRun = " . $i . "\n"; - echo "Temporary LOBs = " . templobs($c, $sid) . "\n"; - readxmltab_ex_nofree($c); -} - - - -// Cleanup - -dropxmltab($c); - -oci_close($c); - -echo "Done\n"; -?> ---EXPECT-- -Explicit LOB use - -Run = 1 -Temporary LOBs = 0 -Loop count check = 100 - -Run = 2 -Temporary LOBs = 100 -Loop count check = 100 - -Run = 3 -Temporary LOBs = 200 -Loop count check = 100 - -Run = 4 -Temporary LOBs = 300 -Loop count check = 100 - -Run = 5 -Temporary LOBs = 400 -Loop count check = 100 - -Run = 6 -Temporary LOBs = 500 -Loop count check = 100 - -Run = 7 -Temporary LOBs = 600 -Loop count check = 100 - -Run = 8 -Temporary LOBs = 700 -Loop count check = 100 - -Run = 9 -Temporary LOBs = 800 -Loop count check = 100 - -Run = 10 -Temporary LOBs = 900 -Loop count check = 100 - -Implicit LOB use - -Run = 1 -Temporary LOBs = 1000 -Loop count check = 100 - -Run = 2 -Temporary LOBs = 1100 -Loop count check = 100 - -Run = 3 -Temporary LOBs = 1200 -Loop count check = 100 - -Run = 4 -Temporary LOBs = 1300 -Loop count check = 100 - -Run = 5 -Temporary LOBs = 1400 -Loop count check = 100 - -Run = 6 -Temporary LOBs = 1500 -Loop count check = 100 - -Run = 7 -Temporary LOBs = 1600 -Loop count check = 100 - -Run = 8 -Temporary LOBs = 1700 -Loop count check = 100 - -Run = 9 -Temporary LOBs = 1800 -Loop count check = 100 - -Run = 10 -Temporary LOBs = 1900 -Loop count check = 100 - -Explicit LOB with no free (i.e. a temp lob leak) - -Run = 1 -Temporary LOBs = 2000 -Loop count check = 100 - -Run = 2 -Temporary LOBs = 2100 -Loop count check = 100 - -Run = 3 -Temporary LOBs = 2200 -Loop count check = 100 - -Run = 4 -Temporary LOBs = 2300 -Loop count check = 100 - -Run = 5 -Temporary LOBs = 2400 -Loop count check = 100 - -Run = 6 -Temporary LOBs = 2500 -Loop count check = 100 - -Run = 7 -Temporary LOBs = 2600 -Loop count check = 100 - -Run = 8 -Temporary LOBs = 2700 -Loop count check = 100 - -Run = 9 -Temporary LOBs = 2800 -Loop count check = 100 - -Run = 10 -Temporary LOBs = 2900 -Loop count check = 100 -Done \ No newline at end of file diff --git a/ext/oci8/tests/bug47281.phpt b/ext/oci8/tests/bug47281.phpt index 0098ec5ebb772..00c43c22dac7c 100644 --- a/ext/oci8/tests/bug47281.phpt +++ b/ext/oci8/tests/bug47281.phpt @@ -6,9 +6,9 @@ $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 -preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +preg_match('/^([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[: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) + ($matches[1] > 11 || ($matches[1] == 11 && $matches[2] > 2) || ($matches[1] == 11 && $matches[2] == 2 && $matches[4] >= 3) )) { die("skip test works only with Oracle 11.2.0.2 or earlier Oracle client libraries"); } diff --git a/ext/oci8/tests/clientversion.phpt b/ext/oci8/tests/clientversion.phpt index db70b5affcea4..262ded462f9d9 100644 --- a/ext/oci8/tests/clientversion.phpt +++ b/ext/oci8/tests/clientversion.phpt @@ -3,9 +3,6 @@ oci_client_version() --SKIPIF-- --FILE-- ---FILE-- - -===DONE=== - ---EXPECTF-- -Unknown -===DONE=== diff --git a/ext/oci8/tests/conn_attr_1.phpt b/ext/oci8/tests/conn_attr_1.phpt index 631bc19c1d416..745b1cd93f906 100644 --- a/ext/oci8/tests/conn_attr_1.phpt +++ b/ext/oci8/tests/conn_attr_1.phpt @@ -13,10 +13,6 @@ preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit if (!(isset($matches[0]) && $matches[1] >= 10)) { die("skip expected output only valid when using Oracle 10g or greater database server"); } -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-- = 10)) { die("skip expected output only valid when using Oracle 10g or greater database server"); } -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 diff --git a/ext/oci8/tests/conn_attr_3.phpt b/ext/oci8/tests/conn_attr_3.phpt index 921487c9a00e1..1b00ac5a4ff45 100644 --- a/ext/oci8/tests/conn_attr_3.phpt +++ b/ext/oci8/tests/conn_attr_3.phpt @@ -12,10 +12,6 @@ preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit if (!(isset($matches[0]) && $matches[1] >= 10)) { die("skip expected output only valid when using Oracle 10g or greater database server"); } -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-- --FILE-- = 10)) { die("skip expected output only valid when using Oracle 10g or greater database server"); } -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-- --ENV-- diff --git a/ext/oci8/tests/connect_without_oracle_home_11.phpt b/ext/oci8/tests/connect_without_oracle_home_11.phpt index 40dc5a98fc7e3..42c45644567c4 100644 --- a/ext/oci8/tests/connect_without_oracle_home_11.phpt +++ b/ext/oci8/tests/connect_without_oracle_home_11.phpt @@ -10,10 +10,10 @@ $ov = preg_match('/Compile-time ORACLE_HOME/', $phpinfo); if ($ov != 1) { die ("skip Test only valid when OCI8 is built with an ORACLE_HOME"); } -preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +preg_match('/^([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); if (!(isset($matches[0]) && - (($matches[0] == 11 && $matches[1] >= 2) || - ($matches[0] >= 12) + (($matches[1] == 11 && $matches[2] >= 2) || + ($matches[1] >= 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.phpt b/ext/oci8/tests/connect_without_oracle_home_old.phpt index 5a731337af13c..82d8ae451bc70 100644 --- a/ext/oci8/tests/connect_without_oracle_home_old.phpt +++ b/ext/oci8/tests/connect_without_oracle_home_old.phpt @@ -10,9 +10,6 @@ $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('/^10\.2\./', oci_client_version()) != 1) { - die("skip test expected to work only with Oracle 10gR2 client libraries"); -} ?> --ENV-- ORACLE_HOME="" 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 e04016f41a766..eb5fb0cc4d333 100644 --- a/ext/oci8/tests/connect_without_oracle_home_old_11.phpt +++ b/ext/oci8/tests/connect_without_oracle_home_old_11.phpt @@ -10,10 +10,10 @@ $ov = preg_match('/Compile-time ORACLE_HOME/', $phpinfo); if ($ov !== 1) { die ("skip Test only valid when OCI8 is built with an ORACLE_HOME"); } -preg_match('/^[[:digit:]]+/', oci_client_version(), $matches); +preg_match('/^([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); if (!(isset($matches[0]) && - (($matches[0] == 11 && $matches[1] >= 2) || - ($matches[0] >= 12) + (($matches[1] == 11 && $matches[2] >= 2) || + ($matches[1] >= 12) ))) { die("skip test expected to work only with Oracle 11gR2 or greater version of client"); } diff --git a/ext/oci8/tests/drcp_cclass1.phpt b/ext/oci8/tests/drcp_cclass1.phpt index 068331e5a95ae..5c78a2943e94e 100644 --- a/ext/oci8/tests/drcp_cclass1.phpt +++ b/ext/oci8/tests/drcp_cclass1.phpt @@ -3,9 +3,21 @@ DRCP: Test setting connection class inline --SKIPIF-- = 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-- += 11)) { + die("skip works only with Oracle 11g or greater version of Oracle client libraries"); +} +?> --INI-- oci8.connection_class=test --FILE-- diff --git a/ext/oci8/tests/driver_name.phpt b/ext/oci8/tests/driver_name.phpt index bf86e66e7b64f..f63979d6b54c0 100644 --- a/ext/oci8/tests/driver_name.phpt +++ b/ext/oci8/tests/driver_name.phpt @@ -7,10 +7,19 @@ require(dirname(__FILE__)."/connect.inc"); if (strcasecmp($user, "system") && strcasecmp($user, "sys")) die("skip needs to be run as a DBA user"); if ($test_drcp) die("skip as Output might vary with DRCP"); -if (preg_match('/Release (11\.2|12)/', oci_server_version($c), $matches) !== 1) { - die("skip expected output only valid when using Oracle 11gR2 or greater databases"); -} else if (preg_match('/^(11\.2|12\.)/', oci_client_version()) != 1) { - die("skip test expected to work only with Oracle 11g or greater version of client"); +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) + ))) { + die("skip expected output only valid when using Oracle 11gR2 or greater database server"); +} +preg_match('/^([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 11 && $matches[2] >= 2) || + ($matches[1] >= 12) + ))) { + die("skip test expected to work only with Oracle 11gR2 or greater version of client"); } ?> diff --git a/ext/oci8/tests/edition_1.phpt b/ext/oci8/tests/edition_1.phpt index d8ca53cddf061..3e55ee902c970 100644 --- a/ext/oci8/tests/edition_1.phpt +++ b/ext/oci8/tests/edition_1.phpt @@ -10,9 +10,18 @@ if (strcasecmp($user, "system") && strcasecmp($user, "sys")) { if ($test_drcp) { die("skip as Output might vary with DRCP"); } -if (preg_match('/Release (1[1]\.2|12)\./', oci_server_version($c), $matches) !== 1) { - die("skip expected output only valid when using Oracle 11gR2 or greater databases"); -} else if (preg_match('/^(11\.2|12)\./', oci_client_version()) != 1) { +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) + ))) { + die("skip expected output only valid when using Oracle 11gR2 or greater database server"); +} +preg_match('/^([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 11 && $matches[2] >= 2) || + ($matches[1] >= 12) + ))) { die("skip test expected to work only with Oracle 11gR2 or greater version of client"); } ?> diff --git a/ext/oci8/tests/edition_2.phpt b/ext/oci8/tests/edition_2.phpt index 0ffb62dc32633..12e902667e621 100644 --- a/ext/oci8/tests/edition_2.phpt +++ b/ext/oci8/tests/edition_2.phpt @@ -8,10 +8,18 @@ if (strcasecmp($user, "system") && strcasecmp($user, "sys")) die("skip needs to be run as a DBA user"); if ($test_drcp) die("skip as Output might vary with DRCP"); - -if (preg_match('/Release (1[1]\.2|12)\./', oci_server_version($c), $matches) !== 1) { - die("skip expected output only valid when using Oracle 11gR2 or greater databases"); -} else if (preg_match('/^(11\.2|12)\./', oci_client_version()) != 1) { +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) + ))) { + die("skip expected output only valid when using Oracle 11gR2 or greater database server"); +} +preg_match('/^([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 11 && $matches[2] >= 2) || + ($matches[1] >= 12) + ))) { die("skip test expected to work only with Oracle 11gR2 or greater version of client"); } diff --git a/ext/oci8/tests/ini_1.phpt b/ext/oci8/tests/ini_1.phpt index 4c23b72b41fdb..2fba79813e845 100644 --- a/ext/oci8/tests/ini_1.phpt +++ b/ext/oci8/tests/ini_1.phpt @@ -1,7 +1,13 @@ --TEST-- Test OCI8 php.ini settings --SKIPIF-- - += 11)) { + die("skip works only with Oracle 11g or greater version of Oracle client libraries"); +} +?> --INI-- oci8.privileged_connect = On oci8.max_persistent = 111 diff --git a/ext/oci8/tests/password_new.phpt b/ext/oci8/tests/password_new.phpt index 2c66dd94ab7dc..a29fb8f52ff2b 100644 --- a/ext/oci8/tests/password_new.phpt +++ b/ext/oci8/tests/password_new.phpt @@ -8,15 +8,18 @@ if (empty($dbase)) die ("skip requires database connection string be set"); if ($test_drcp) die("skip password change not supported in DRCP Mode"); 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)"); - } +preg_match('/([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); +if (!(isset($matches_sv[0]) && isset($matches[0]) + && $matches_sv[1] == $matches[1] + && $matches_sv[2] == $matches[2] + && $matches_sv[3] == $matches[3] + && $matches_sv[4] == $matches[4])) { + // Avoid diffs due to cross version protocol changes (e.g. like 11.2.0.2-11.2.0.3) and bugs like Oracle bug: 6277160 + die ("skip test only runs when database client libraries and database server are the same version"); } // This test in Oracle 12c needs a non-CDB or the root container -if (isset($matches_sv[1]) && $matches_sv[1] >= 12) { +if (isset($matches_sv[0]) && $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) @@ -29,22 +32,11 @@ if (isset($matches_sv[1]) && $matches_sv[1] >= 12) { --FILE-- = 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)"); - } +preg_match('/([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); +if (!(isset($matches_sv[0]) && isset($matches[0]) + && $matches_sv[1] == $matches[1] + && $matches_sv[2] == $matches[2] + && $matches_sv[3] == $matches[3] + && $matches_sv[4] == $matches[4])) { + // Avoid diffs due to cross version protocol changes (e.g. like 11.2.0.2-11.2.0.3) and bugs like Oracle bug: 6277160 + die ("skip test only runs when database client libraries and database server are the same version"); } // This test in Oracle 12c needs a non-CDB or the root container -if (isset($matches_sv[1]) && $matches_sv[1] >= 12) { +if (isset($matches_sv[0]) && $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) @@ -29,25 +32,13 @@ if (isset($matches_sv[1]) && $matches_sv[1] >= 12) { --FILE-- diff --git a/ext/oci8/tests/pecl_bug16035.phpt b/ext/oci8/tests/pecl_bug16035.phpt index ddd0038de1524..29ff6439d1c8a 100644 --- a/ext/oci8/tests/pecl_bug16035.phpt +++ b/ext/oci8/tests/pecl_bug16035.phpt @@ -10,9 +10,6 @@ $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('/Unknown/', oci_client_version()) == 1) { - die("skip expected output only valid with Oracle clients > 9gR2"); -} ?> --ENV-- ORACLE_HOME="" diff --git a/ext/oci8/tests/refcur_prefetch_1.phpt b/ext/oci8/tests/refcur_prefetch_1.phpt index ea09fbcd979cf..c7e200932aece 100644 --- a/ext/oci8/tests/refcur_prefetch_1.phpt +++ b/ext/oci8/tests/refcur_prefetch_1.phpt @@ -4,9 +4,16 @@ Prefetch with REF cursor. Test different values for prefetch with oci_set_prefet = 10))) { + die("skip expected output only valid when using Oracle 10g or greater database server"); +} +preg_match('/^([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 11 && $matches[2] >= 2) || + ($matches[1] >= 12) + ))) { die("skip test expected to work only with Oracle 11gR2 or greater version of client"); } ?> diff --git a/ext/oci8/tests/refcur_prefetch_2.phpt b/ext/oci8/tests/refcur_prefetch_2.phpt index 8d65251077ea3..9b2472db5df44 100644 --- a/ext/oci8/tests/refcur_prefetch_2.phpt +++ b/ext/oci8/tests/refcur_prefetch_2.phpt @@ -4,9 +4,16 @@ Prefetch with REF cursor. Test No 2 = 10))) { + die("skip expected output only valid when using Oracle 10g or greater database server"); +} +preg_match('/^([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 11 && $matches[2] >= 2) || + ($matches[1] >= 12) + ))) { die("skip test expected to work only with Oracle 11gR2 or greater version of client"); } ?> diff --git a/ext/oci8/tests/refcur_prefetch_3.phpt b/ext/oci8/tests/refcur_prefetch_3.phpt index 974864cbd90e7..f29345e515d47 100644 --- a/ext/oci8/tests/refcur_prefetch_3.phpt +++ b/ext/oci8/tests/refcur_prefetch_3.phpt @@ -6,12 +6,20 @@ oci8.default_prefetch=5 = 2) || + ($matches[1] >= 12) + ))) { + die("skip expected output only valid when using Oracle 11gR2 or greater database server"); +} +preg_match('/^([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 11 && $matches[2] >= 2) || + ($matches[1] >= 12) + ))) { die("skip test expected to work only with Oracle 11gR2 or greater version of client"); } - ?> --FILE-- = 10))) { + die("skip expected output only valid when using Oracle 10g or greater database server"); +} +preg_match('/^([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); +if (!(isset($matches[0]) && + (($matches[1] == 11 && $matches[2] >= 2) || + ($matches[1] >= 12) + ))) { die("skip test expected to work only with Oracle 11gR2 or greater version of client"); } ?> From 89e93bd2a27d66c9d56218e31cd42441298548e6 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Wed, 16 Oct 2013 22:33:34 -0700 Subject: [PATCH 254/400] OCI8: More test updates --- .../tests/connect_without_oracle_home_old.phpt | 3 +++ ext/oci8/tests/drcp_privileged.phpt | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/ext/oci8/tests/connect_without_oracle_home_old.phpt b/ext/oci8/tests/connect_without_oracle_home_old.phpt index 82d8ae451bc70..d6d12b47ba338 100644 --- a/ext/oci8/tests/connect_without_oracle_home_old.phpt +++ b/ext/oci8/tests/connect_without_oracle_home_old.phpt @@ -30,5 +30,8 @@ else { --EXPECTF-- Warning: ocilogon(): OCIEnvNlsCreate() failed. There is something wrong with your system - please check that ORACLE_HOME and %s are set and point to the right directories in %s on line %d + +Warning: ocilogon(): %s ORA-01804 + in %s on line %d bool(false) ===DONE=== diff --git a/ext/oci8/tests/drcp_privileged.phpt b/ext/oci8/tests/drcp_privileged.phpt index da8702e3c9204..3871341bc50cc 100644 --- a/ext/oci8/tests/drcp_privileged.phpt +++ b/ext/oci8/tests/drcp_privileged.phpt @@ -3,7 +3,8 @@ DRCP: privileged connect --SKIPIF-- = 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'); +} ?> --INI-- oci8.privileged_connect=1 From e30b2aae5ad93405eee19bca6125ea872f409c82 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Thu, 17 Oct 2013 09:43:52 +0200 Subject: [PATCH 255/400] initial move on renaming files and fixing includes --- TSRM/Makefile.am | 2 +- TSRM/TSRM.dsp | 4 - TSRM/config.w32 | 2 +- TSRM/tsrm_win32.c | 2 +- Zend/Makefile.am | 2 +- Zend/Zend.dsp | 4 + Zend/zend_compile.c | 2 +- Zend/zend_execute.c | 2 +- Zend/zend_ini_scanner.c | 9326 ++++++++--------- Zend/zend_language_scanner.c | 2 +- Zend/zend_language_scanner.l | 2 +- .../zend_virtual_cwd.c | 2 +- .../zend_virtual_cwd.h | 0 configure.in | 5 +- ext/opcache/ZendAccelerator.c | 2 +- ext/opcache/zend_accelerator_module.c | 2 +- ext/soap/php_sdl.c | 2 +- main/php.h | 2 +- win32/build/config.w32 | 2 +- 19 files changed, 4684 insertions(+), 4683 deletions(-) rename TSRM/tsrm_virtual_cwd.c => Zend/zend_virtual_cwd.c (99%) rename TSRM/tsrm_virtual_cwd.h => Zend/zend_virtual_cwd.h (100%) diff --git a/TSRM/Makefile.am b/TSRM/Makefile.am index 91e585b65c89a..e232381a019e1 100644 --- a/TSRM/Makefile.am +++ b/TSRM/Makefile.am @@ -1,6 +1,6 @@ ## process this file with automake to produce Makefile.am AUTOMAKE_OPTIONS=foreign noinst_LTLIBRARIES=libtsrm.la -libtsrm_la_SOURCES = TSRM.c tsrm_strtok_r.c tsrm_virtual_cwd.c +libtsrm_la_SOURCES = TSRM.c tsrm_strtok_r.c depend: diff --git a/TSRM/TSRM.dsp b/TSRM/TSRM.dsp index 1a5693f5a23c4..6c3e8bfb8bede 100644 --- a/TSRM/TSRM.dsp +++ b/TSRM/TSRM.dsp @@ -143,10 +143,6 @@ SOURCE=.\tsrm_strtok_r.c # End Source File # Begin Source File -SOURCE=.\tsrm_virtual_cwd.c -# End Source File -# Begin Source File - SOURCE=.\tsrm_win32.c # End Source File # End Group diff --git a/TSRM/config.w32 b/TSRM/config.w32 index 5498f8e7bd3ec..91b4eead2a07d 100644 --- a/TSRM/config.w32 +++ b/TSRM/config.w32 @@ -1,5 +1,5 @@ // vim:ft=javascript // $Id$ -ADD_SOURCES("TSRM", "TSRM.c tsrm_strtok_r.c tsrm_virtual_cwd.c tsrm_win32.c"); +ADD_SOURCES("TSRM", "TSRM.c tsrm_strtok_r.c tsrm_win32.c"); diff --git a/TSRM/tsrm_win32.c b/TSRM/tsrm_win32.c index 2ec97be0116bc..7b9ebc3061b34 100644 --- a/TSRM/tsrm_win32.c +++ b/TSRM/tsrm_win32.c @@ -32,7 +32,7 @@ #ifdef TSRM_WIN32 #include #include "tsrm_win32.h" -#include "tsrm_virtual_cwd.h" +#include "zend_virtual_cwd.h" #ifdef ZTS static ts_rsrc_id win32_globals_id; diff --git a/Zend/Makefile.am b/Zend/Makefile.am index 6417f3eb141ed..924a00daebb39 100644 --- a/Zend/Makefile.am +++ b/Zend/Makefile.am @@ -18,7 +18,7 @@ libZend_la_SOURCES=\ zend_default_classes.c \ zend_iterators.c zend_interfaces.c zend_exceptions.c \ zend_strtod.c zend_closures.c zend_float.c zend_string.c zend_signal.c \ - zend_generators.c + zend_generators.c zend_virtual_cwd.c libZend_la_LDFLAGS = libZend_la_LIBADD = @ZEND_EXTRA_LIBS@ diff --git a/Zend/Zend.dsp b/Zend/Zend.dsp index 23ebd4532b5e7..d1b3b8903004d 100644 --- a/Zend/Zend.dsp +++ b/Zend/Zend.dsp @@ -429,6 +429,10 @@ SOURCE=.\zend_ts_hash.h SOURCE=.\zend_variables.h # End Source File +# Begin Source File + +SOURCE=.\zend_virtual_cwd.c +# End Source File # End Group # Begin Group "Parsers" diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 85536f43b7ce2..d5be53e8bf7c2 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -26,7 +26,7 @@ #include "zend_llist.h" #include "zend_API.h" #include "zend_exceptions.h" -#include "tsrm_virtual_cwd.h" +#include "zend_virtual_cwd.h" #include "zend_multibyte.h" #include "zend_language_scanner.h" diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 9f78218d3de35..270b449e4327d 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -40,7 +40,7 @@ #include "zend_dtrace.h" /* Virtual current working directory support */ -#include "tsrm_virtual_cwd.h" +#include "zend_virtual_cwd.h" #define _CONST_CODE 0 #define _TMP_CODE 1 diff --git a/Zend/zend_ini_scanner.c b/Zend/zend_ini_scanner.c index 87ba664312712..a3ecdef4949ac 100644 --- a/Zend/zend_ini_scanner.c +++ b/Zend/zend_ini_scanner.c @@ -1,4663 +1,4663 @@ -/* Generated by re2c 0.13.5 */ -#line 1 "Zend/zend_ini_scanner.l" -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998-2013 Zend Technologies Ltd. (http://www.zend.com) | - +----------------------------------------------------------------------+ - | This source file is subject to version 2.00 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/2_00.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. | - +----------------------------------------------------------------------+ - | Authors: Zeev Suraski | - | Jani Taskinen | - | Marcus Boerger | - | Nuno Lopes | - | Scott MacVicar | - +----------------------------------------------------------------------+ -*/ - -/* $Id$ */ - -#include -#include "zend.h" -#include "zend_globals.h" -#include -#include "zend_ini_scanner.h" - -#if 0 -# define YYDEBUG(s, c) printf("state: %d char: %c\n", s, c) -#else -# define YYDEBUG(s, c) -#endif - -#include "zend_ini_scanner_defs.h" - -#define YYCTYPE unsigned char -/* allow the scanner to read one null byte after the end of the string (from ZEND_MMAP_AHEAD) - * so that if will be able to terminate to match the current token (e.g. non-enclosed string) */ -#define YYFILL(n) { if (YYCURSOR > YYLIMIT) return 0; } -#define YYCURSOR SCNG(yy_cursor) -#define YYLIMIT SCNG(yy_limit) -#define YYMARKER SCNG(yy_marker) - -#define YYGETCONDITION() SCNG(yy_state) -#define YYSETCONDITION(s) SCNG(yy_state) = s - -#define STATE(name) yyc##name - -/* emulate flex constructs */ -#define BEGIN(state) YYSETCONDITION(STATE(state)) -#define YYSTATE YYGETCONDITION() -#define yytext ((char*)SCNG(yy_text)) -#define yyleng SCNG(yy_leng) -#define yyless(x) do { YYCURSOR = (unsigned char*)yytext + x; \ - yyleng = (unsigned int)x; } while(0) - -/* #define yymore() goto yymore_restart */ - -/* perform sanity check. If this message is triggered you should - increase the ZEND_MMAP_AHEAD value in the zend_streams.h file */ -#define YYMAXFILL 6 -#if ZEND_MMAP_AHEAD < (YYMAXFILL + 1) -# error ZEND_MMAP_AHEAD should be greater than YYMAXFILL -#endif - - -/* How it works (for the core ini directives): - * =========================================== - * - * 1. Scanner scans file for tokens and passes them to parser. - * 2. Parser parses the tokens and passes the name/value pairs to the callback - * function which stores them in the configuration hash table. - * 3. Later REGISTER_INI_ENTRIES() is called which triggers the actual - * registering of ini entries and uses zend_get_configuration_directive() - * to fetch the previously stored name/value pair from configuration hash table - * and registers the static ini entries which match the name to the value - * into EG(ini_directives) hash table. - * 4. PATH section entries are used per-request from down to top, each overriding - * previous if one exists. zend_alter_ini_entry() is called for each entry. - * Settings in PATH section are ZEND_INI_SYSTEM accessible and thus mimics the - * php_admin_* directives used within Apache httpd.conf when PHP is compiled as - * module for Apache. - * 5. User defined ini files (like .htaccess for apache) are parsed for each request and - * stored in separate hash defined by SAPI. - */ - -/* TODO: (ordered by importance :-) - * =============================================================================== - * - * - Separate constant lookup totally from plain strings (using CONSTANT pattern) - * - Add #if .. #else .. #endif and ==, !=, <, > , <=, >= operators - * - Add #include "some.ini" - * - Allow variables to refer to options also when using parse_ini_file() - * - */ - -/* Globals Macros */ -#define SCNG INI_SCNG -#ifdef ZTS -ZEND_API ts_rsrc_id ini_scanner_globals_id; -#else -ZEND_API zend_ini_scanner_globals ini_scanner_globals; -#endif - -/* Eat leading whitespace */ -#define EAT_LEADING_WHITESPACE() \ - while (yytext[0]) { \ - if (yytext[0] == ' ' || yytext[0] == '\t') { \ - SCNG(yy_text)++; \ - yyleng--; \ - } else { \ - break; \ - } \ - } - -/* Eat trailing whitespace + extra char */ -#define EAT_TRAILING_WHITESPACE_EX(ch) \ - while (yyleng > 0 && ( \ - (ch != 'X' && yytext[yyleng - 1] == ch) || \ - yytext[yyleng - 1] == '\n' || \ - yytext[yyleng - 1] == '\r' || \ - yytext[yyleng - 1] == '\t' || \ - yytext[yyleng - 1] == ' ') \ - ) { \ - yyleng--; \ - } - -/* Eat trailing whitespace */ -#define EAT_TRAILING_WHITESPACE() EAT_TRAILING_WHITESPACE_EX('X') - -#define zend_ini_copy_value(retval, str, len) { \ - Z_STRVAL_P(retval) = zend_strndup(str, len); \ - Z_STRLEN_P(retval) = len; \ - Z_TYPE_P(retval) = IS_STRING; \ -} - -#define RETURN_TOKEN(type, str, len) { \ - zend_ini_copy_value(ini_lval, str, len); \ - return type; \ -} - -static void _yy_push_state(int new_state TSRMLS_DC) -{ - zend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION(), sizeof(int)); - YYSETCONDITION(new_state); -} - -#define yy_push_state(state_and_tsrm) _yy_push_state(yyc##state_and_tsrm) - -static void yy_pop_state(TSRMLS_D) -{ - int *stack_state; - zend_stack_top(&SCNG(state_stack), (void **) &stack_state); - YYSETCONDITION(*stack_state); - zend_stack_del_top(&SCNG(state_stack)); -} - -static void yy_scan_buffer(char *str, unsigned int len TSRMLS_DC) -{ - YYCURSOR = (YYCTYPE*)str; - SCNG(yy_start) = YYCURSOR; - YYLIMIT = YYCURSOR + len; -} - -#define ini_filename SCNG(filename) - -/* {{{ init_ini_scanner() -*/ -static int init_ini_scanner(int scanner_mode, zend_file_handle *fh TSRMLS_DC) -{ - /* Sanity check */ - if (scanner_mode != ZEND_INI_SCANNER_NORMAL && scanner_mode != ZEND_INI_SCANNER_RAW) { - zend_error(E_WARNING, "Invalid scanner mode"); - return FAILURE; - } - - SCNG(lineno) = 1; - SCNG(scanner_mode) = scanner_mode; - SCNG(yy_in) = fh; - - if (fh != NULL) { - ini_filename = zend_strndup(fh->filename, strlen(fh->filename)); - } else { - ini_filename = NULL; - } - - zend_stack_init(&SCNG(state_stack)); - BEGIN(INITIAL); - - return SUCCESS; -} -/* }}} */ - -/* {{{ shutdown_ini_scanner() -*/ -void shutdown_ini_scanner(TSRMLS_D) -{ - zend_stack_destroy(&SCNG(state_stack)); - if (ini_filename) { - free(ini_filename); - } -} -/* }}} */ - -/* {{{ zend_ini_scanner_get_lineno() -*/ -int zend_ini_scanner_get_lineno(TSRMLS_D) -{ - return SCNG(lineno); -} -/* }}} */ - -/* {{{ zend_ini_scanner_get_filename() -*/ -char *zend_ini_scanner_get_filename(TSRMLS_D) -{ - return ini_filename ? ini_filename : "Unknown"; -} -/* }}} */ - -/* {{{ zend_ini_open_file_for_scanning() -*/ -int zend_ini_open_file_for_scanning(zend_file_handle *fh, int scanner_mode TSRMLS_DC) -{ - char *buf; - size_t size; - - if (zend_stream_fixup(fh, &buf, &size TSRMLS_CC) == FAILURE) { - return FAILURE; - } - - if (init_ini_scanner(scanner_mode, fh TSRMLS_CC) == FAILURE) { - zend_file_handle_dtor(fh TSRMLS_CC); - return FAILURE; - } - - yy_scan_buffer(buf, size TSRMLS_CC); - - return SUCCESS; -} -/* }}} */ - -/* {{{ zend_ini_prepare_string_for_scanning() -*/ -int zend_ini_prepare_string_for_scanning(char *str, int scanner_mode TSRMLS_DC) -{ - int len = strlen(str); - - if (init_ini_scanner(scanner_mode, NULL TSRMLS_CC) == FAILURE) { - return FAILURE; - } - - yy_scan_buffer(str, len TSRMLS_CC); - - return SUCCESS; -} -/* }}} */ - -/* {{{ zend_ini_escape_string() - */ -static void zend_ini_escape_string(zval *lval, char *str, int len, char quote_type TSRMLS_DC) -{ - register char *s, *t; - char *end; - - zend_ini_copy_value(lval, str, len); - - /* convert escape sequences */ - s = t = Z_STRVAL_P(lval); - end = s + Z_STRLEN_P(lval); - - while (s < end) { - if (*s == '\\') { - s++; - if (s >= end) { - *t++ = '\\'; - continue; - } - switch (*s) { - case '"': - if (*s != quote_type) { - *t++ = '\\'; - *t++ = *s; - break; - } - case '\\': - case '$': - *t++ = *s; - Z_STRLEN_P(lval)--; - break; - default: - *t++ = '\\'; - *t++ = *s; - break; - } - } else { - *t++ = *s; - } - if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) { - SCNG(lineno)++; - } - s++; - } - *t = 0; -} -/* }}} */ - -int ini_lex(zval *ini_lval TSRMLS_DC) -{ -restart: - SCNG(yy_text) = YYCURSOR; - -/* yymore_restart: */ - /* detect EOF */ - if (YYCURSOR >= YYLIMIT) { - if (YYSTATE == STATE(ST_VALUE) || YYSTATE == STATE(ST_RAW)) { - BEGIN(INITIAL); - return END_OF_LINE; - } - return 0; - } - - /* Eat any UTF-8 BOM we find in the first 3 bytes */ - if (YYCURSOR == SCNG(yy_start) && YYCURSOR + 3 < YYLIMIT) { - if (memcmp(YYCURSOR, "\xef\xbb\xbf", 3) == 0) { - YYCURSOR += 3; - goto restart; - } - } - -#line 337 "Zend/zend_ini_scanner.c" -{ - YYCTYPE yych; - unsigned int yyaccept = 0; - if (YYGETCONDITION() < 4) { - if (YYGETCONDITION() < 2) { - if (YYGETCONDITION() < 1) { - goto yyc_INITIAL; - } else { - goto yyc_ST_OFFSET; - } - } else { - if (YYGETCONDITION() < 3) { - goto yyc_ST_SECTION_VALUE; - } else { - goto yyc_ST_VALUE; - } - } - } else { - if (YYGETCONDITION() < 6) { - if (YYGETCONDITION() < 5) { - goto yyc_ST_SECTION_RAW; - } else { - goto yyc_ST_DOUBLE_QUOTES; - } - } else { - if (YYGETCONDITION() < 7) { - goto yyc_ST_VARNAME; - } else { - goto yyc_ST_RAW; - } - } - } -/* *********************************** */ -yyc_INITIAL: - { - static const unsigned char yybm[] = { - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 160, 0, 144, 144, 0, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 240, 128, 128, 144, 128, 144, 128, 144, - 128, 128, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 128, 144, 128, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 128, 144, 144, 128, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 128, 128, 128, 128, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, - }; - - YYDEBUG(0, *YYCURSOR); - YYFILL(5); - yych = *YYCURSOR; - YYDEBUG(-1, yych); - switch (yych) { - case '\t': goto yy4; - case '\n': goto yy6; - case '\r': goto yy8; - case ' ': goto yy9; - case '!': - case '"': - case '$': - case '&': - case '(': - case ')': - case '^': - case '{': - case '|': - case '}': - case '~': goto yy10; - case '#': goto yy12; - case '%': - case '\'': - case '*': - case '+': - case ',': - case '-': - case '.': - case '/': - case ':': - case '<': - case '>': - case '?': - case '@': - case ']': goto yy13; - case ';': goto yy14; - case '=': goto yy16; - case 'F': - case 'f': goto yy18; - case 'N': - case 'n': goto yy19; - case 'O': - case 'o': goto yy20; - case 'T': - case 't': goto yy21; - case 'Y': - case 'y': goto yy22; - case '[': goto yy23; - default: goto yy2; - } -yy2: - YYDEBUG(2, *YYCURSOR); - ++YYCURSOR; - yych = *YYCURSOR; - goto yy26; -yy3: - YYDEBUG(3, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 429 "Zend/zend_ini_scanner.l" - { /* Get option name */ - /* Eat leading whitespace */ - EAT_LEADING_WHITESPACE(); - - /* Eat trailing whitespace */ - EAT_TRAILING_WHITESPACE(); - - RETURN_TOKEN(TC_LABEL, yytext, yyleng); -} -#line 476 "Zend/zend_ini_scanner.c" -yy4: - YYDEBUG(4, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - goto yy68; -yy5: - YYDEBUG(5, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 575 "Zend/zend_ini_scanner.l" - { - /* eat whitespace */ - goto restart; -} -#line 490 "Zend/zend_ini_scanner.c" -yy6: - YYDEBUG(6, *YYCURSOR); - ++YYCURSOR; -yy7: - YYDEBUG(7, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 580 "Zend/zend_ini_scanner.l" - { - SCNG(lineno)++; - return END_OF_LINE; -} -#line 502 "Zend/zend_ini_scanner.c" -yy8: - YYDEBUG(8, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '\n') goto yy71; - goto yy7; -yy9: - YYDEBUG(9, *YYCURSOR); - yyaccept = 1; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= ' ') { - if (yych <= '\n') { - if (yych <= 0x08) goto yy26; - if (yych <= '\t') goto yy67; - goto yy71; - } else { - if (yych == '\r') goto yy72; - if (yych <= 0x1F) goto yy26; - goto yy69; - } - } else { - if (yych <= ':') { - if (yych == '#') goto yy58; - goto yy26; - } else { - if (yych <= ';') goto yy53; - if (yych == '=') goto yy51; - goto yy26; - } - } -yy10: - YYDEBUG(10, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(11, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 503 "Zend/zend_ini_scanner.l" - { /* Disallow these chars outside option values */ - return yytext[0]; -} -#line 541 "Zend/zend_ini_scanner.c" -yy12: - YYDEBUG(12, *YYCURSOR); - yyaccept = 1; - yych = *(YYMARKER = ++YYCURSOR); - goto yy59; -yy13: - YYDEBUG(13, *YYCURSOR); - yych = *++YYCURSOR; - goto yy26; -yy14: - YYDEBUG(14, *YYCURSOR); - yyaccept = 2; - yych = *(YYMARKER = ++YYCURSOR); - goto yy54; - YYDEBUG(15, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 603 "Zend/zend_ini_scanner.l" - { - return 0; -} -#line 562 "Zend/zend_ini_scanner.c" -yy16: - YYDEBUG(16, *YYCURSOR); - ++YYCURSOR; - yych = *YYCURSOR; - goto yy52; -yy17: - YYDEBUG(17, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 439 "Zend/zend_ini_scanner.l" - { /* Start option value */ - if (SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW) { - yy_push_state(ST_RAW TSRMLS_CC); - } else { - yy_push_state(ST_VALUE TSRMLS_CC); - } - return '='; -} -#line 580 "Zend/zend_ini_scanner.c" -yy18: - YYDEBUG(18, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'A') goto yy48; - if (yych == 'a') goto yy48; - goto yy26; -yy19: - YYDEBUG(19, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'U') { - if (yych == 'O') goto yy44; - if (yych <= 'T') goto yy26; - goto yy45; - } else { - if (yych <= 'o') { - if (yych <= 'n') goto yy26; - goto yy44; - } else { - if (yych == 'u') goto yy45; - goto yy26; - } - } -yy20: - YYDEBUG(20, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'N') { - if (yych == 'F') goto yy38; - if (yych <= 'M') goto yy26; - goto yy31; - } else { - if (yych <= 'f') { - if (yych <= 'e') goto yy26; - goto yy38; - } else { - if (yych == 'n') goto yy31; - goto yy26; - } - } -yy21: - YYDEBUG(21, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'R') goto yy36; - if (yych == 'r') goto yy36; - goto yy26; -yy22: - YYDEBUG(22, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy27; - if (yych == 'e') goto yy27; - goto yy26; -yy23: - YYDEBUG(23, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(24, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 358 "Zend/zend_ini_scanner.l" - { /* Section start */ - /* Enter section data lookup state */ - if (SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW) { - yy_push_state(ST_SECTION_RAW TSRMLS_CC); - } else { - yy_push_state(ST_SECTION_VALUE TSRMLS_CC); - } - return TC_SECTION; -} -#line 646 "Zend/zend_ini_scanner.c" -yy25: - YYDEBUG(25, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; -yy26: - YYDEBUG(26, *YYCURSOR); - if (yybm[0+yych] & 16) { - goto yy25; - } - if (yych == '[') goto yy28; - goto yy3; -yy27: - YYDEBUG(27, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'S') goto yy31; - if (yych == 's') goto yy31; - goto yy26; -yy28: - YYDEBUG(28, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(29, *YYCURSOR); - if (yybm[0+yych] & 32) { - goto yy28; - } - YYDEBUG(30, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 383 "Zend/zend_ini_scanner.l" - { /* Start of option with offset */ - /* Eat leading whitespace */ - EAT_LEADING_WHITESPACE(); - - /* Eat trailing whitespace and [ */ - EAT_TRAILING_WHITESPACE_EX('['); - - /* Enter offset lookup state */ - yy_push_state(ST_OFFSET TSRMLS_CC); - - RETURN_TOKEN(TC_OFFSET, yytext, yyleng); -} -#line 689 "Zend/zend_ini_scanner.c" -yy31: - YYDEBUG(31, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(32, *YYCURSOR); - if (yybm[0+yych] & 64) { - goto yy31; - } - if (yych <= '\'') { - if (yych <= ' ') { - if (yych <= '\n') { - if (yych <= 0x08) goto yy25; - if (yych <= '\t') goto yy34; - } else { - if (yych != '\r') goto yy25; - } - } else { - if (yych <= '$') { - if (yych == '#') goto yy25; - } else { - if (yych != '&') goto yy25; - } - } - } else { - if (yych <= 'Z') { - if (yych <= ';') { - if (yych <= ')') goto yy33; - if (yych <= ':') goto yy25; - } else { - if (yych != '=') goto yy25; - } - } else { - if (yych <= '^') { - if (yych <= '[') goto yy28; - if (yych <= ']') goto yy25; - } else { - if (yych <= 'z') goto yy25; - if (yych >= 0x7F) goto yy25; - } - } - } -yy33: - YYDEBUG(33, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 421 "Zend/zend_ini_scanner.l" - { /* TRUE value (when used outside option value/offset this causes parse error!) */ - RETURN_TOKEN(BOOL_TRUE, "1", 1); -} -#line 739 "Zend/zend_ini_scanner.c" -yy34: - YYDEBUG(34, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(35, *YYCURSOR); - if (yych == '\t') goto yy34; - if (yych == ' ') goto yy34; - goto yy33; -yy36: - YYDEBUG(36, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'U') goto yy37; - if (yych != 'u') goto yy26; -yy37: - YYDEBUG(37, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy31; - if (yych == 'e') goto yy31; - goto yy26; -yy38: - YYDEBUG(38, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'F') goto yy39; - if (yych != 'f') goto yy26; -yy39: - YYDEBUG(39, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(40, *YYCURSOR); - if (yych <= '&') { - if (yych <= 0x1F) { - if (yych <= '\n') { - if (yych <= 0x08) goto yy25; - if (yych <= '\t') goto yy42; - } else { - if (yych != '\r') goto yy25; - } - } else { - if (yych <= '#') { - if (yych <= ' ') goto yy39; - if (yych >= '#') goto yy25; - } else { - if (yych == '%') goto yy25; - } - } - } else { - if (yych <= '=') { - if (yych <= ':') { - if (yych <= '\'') goto yy25; - if (yych >= '*') goto yy25; - } else { - if (yych == '<') goto yy25; - } - } else { - if (yych <= ']') { - if (yych == '[') goto yy28; - goto yy25; - } else { - if (yych <= '^') goto yy41; - if (yych <= 'z') goto yy25; - if (yych >= 0x7F) goto yy25; - } - } - } -yy41: - YYDEBUG(41, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 425 "Zend/zend_ini_scanner.l" - { /* FALSE value (when used outside option value/offset this causes parse error!)*/ - RETURN_TOKEN(BOOL_FALSE, "", 0); -} -#line 813 "Zend/zend_ini_scanner.c" -yy42: - YYDEBUG(42, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(43, *YYCURSOR); - if (yych == '\t') goto yy42; - if (yych == ' ') goto yy42; - goto yy41; -yy44: - YYDEBUG(44, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= '\'') { - if (yych <= 0x1F) { - if (yych <= '\n') { - if (yych <= 0x08) goto yy26; - if (yych <= '\t') goto yy42; - goto yy41; - } else { - if (yych == '\r') goto yy41; - goto yy26; - } - } else { - if (yych <= '#') { - if (yych <= ' ') goto yy39; - if (yych <= '"') goto yy41; - goto yy26; - } else { - if (yych == '%') goto yy26; - if (yych <= '&') goto yy41; - goto yy26; - } - } - } else { - if (yych <= 'N') { - if (yych <= ';') { - if (yych <= ')') goto yy41; - if (yych <= ':') goto yy26; - goto yy41; - } else { - if (yych == '=') goto yy41; - if (yych <= 'M') goto yy26; - goto yy47; - } - } else { - if (yych <= 'm') { - if (yych == '^') goto yy41; - goto yy26; - } else { - if (yych <= 'n') goto yy47; - if (yych <= 'z') goto yy26; - if (yych <= '~') goto yy41; - goto yy26; - } - } - } -yy45: - YYDEBUG(45, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy46; - if (yych != 'l') goto yy26; -yy46: - YYDEBUG(46, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy39; - if (yych == 'l') goto yy39; - goto yy26; -yy47: - YYDEBUG(47, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy39; - if (yych == 'e') goto yy39; - goto yy26; -yy48: - YYDEBUG(48, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy49; - if (yych != 'l') goto yy26; -yy49: - YYDEBUG(49, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'S') goto yy50; - if (yych != 's') goto yy26; -yy50: - YYDEBUG(50, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy39; - if (yych == 'e') goto yy39; - goto yy26; -yy51: - YYDEBUG(51, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; -yy52: - YYDEBUG(52, *YYCURSOR); - if (yych == '\t') goto yy51; - if (yych == ' ') goto yy51; - goto yy17; -yy53: - YYDEBUG(53, *YYCURSOR); - ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; -yy54: - YYDEBUG(54, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy53; - } - if (yych >= '\r') goto yy57; -yy55: - YYDEBUG(55, *YYCURSOR); - ++YYCURSOR; -yy56: - YYDEBUG(56, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 585 "Zend/zend_ini_scanner.l" - { /* Comment */ - BEGIN(INITIAL); - SCNG(lineno)++; - return END_OF_LINE; -} -#line 936 "Zend/zend_ini_scanner.c" -yy57: - YYDEBUG(57, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '\n') goto yy55; - goto yy56; -yy58: - YYDEBUG(58, *YYCURSOR); - yyaccept = 1; - YYMARKER = ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; -yy59: - YYDEBUG(59, *YYCURSOR); - if (yych <= '\'') { - if (yych <= ' ') { - if (yych <= '\n') { - if (yych <= 0x08) goto yy58; - if (yych >= '\n') goto yy64; - } else { - if (yych == '\r') goto yy66; - goto yy58; - } - } else { - if (yych <= '$') { - if (yych == '#') goto yy58; - } else { - if (yych != '&') goto yy58; - } - } - } else { - if (yych <= 'Z') { - if (yych <= ';') { - if (yych <= ')') goto yy60; - if (yych <= ':') goto yy58; - } else { - if (yych != '=') goto yy58; - } - } else { - if (yych <= '^') { - if (yych <= '[') goto yy62; - if (yych <= ']') goto yy58; - } else { - if (yych <= 'z') goto yy58; - if (yych >= 0x7F) goto yy58; - } - } - } -yy60: - YYDEBUG(60, *YYCURSOR); - ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; - YYDEBUG(61, *YYCURSOR); - if (yych == '\n') goto yy64; - if (yych == '\r') goto yy66; - goto yy60; -yy62: - YYDEBUG(62, *YYCURSOR); - yyaccept = 3; - YYMARKER = ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; - YYDEBUG(63, *YYCURSOR); - if (yych <= '\f') { - if (yych <= 0x08) goto yy60; - if (yych <= '\t') goto yy62; - if (yych >= '\v') goto yy60; - } else { - if (yych <= '\r') goto yy66; - if (yych == ' ') goto yy62; - goto yy60; - } -yy64: - YYDEBUG(64, *YYCURSOR); - ++YYCURSOR; -yy65: - YYDEBUG(65, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 591 "Zend/zend_ini_scanner.l" - { /* #Comment */ - zend_error(E_DEPRECATED, "Comments starting with '#' are deprecated in %s on line %d", zend_ini_scanner_get_filename(TSRMLS_C), SCNG(lineno)); - BEGIN(INITIAL); - SCNG(lineno)++; - return END_OF_LINE; -} -#line 1022 "Zend/zend_ini_scanner.c" -yy66: - YYDEBUG(66, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '\n') goto yy64; - goto yy65; -yy67: - YYDEBUG(67, *YYCURSOR); - yyaccept = 0; - YYMARKER = ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; -yy68: - YYDEBUG(68, *YYCURSOR); - if (yych <= ' ') { - if (yych <= '\n') { - if (yych <= 0x08) goto yy5; - if (yych <= '\t') goto yy67; - goto yy71; - } else { - if (yych == '\r') goto yy72; - if (yych <= 0x1F) goto yy5; - goto yy67; - } - } else { - if (yych <= ':') { - if (yych == '#') goto yy60; - goto yy5; - } else { - if (yych <= ';') goto yy53; - if (yych == '=') goto yy51; - goto yy5; - } - } -yy69: - YYDEBUG(69, *YYCURSOR); - yyaccept = 1; - YYMARKER = ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; - YYDEBUG(70, *YYCURSOR); - if (yych <= '&') { - if (yych <= 0x1F) { - if (yych <= '\n') { - if (yych <= 0x08) goto yy25; - if (yych <= '\t') goto yy67; - } else { - if (yych == '\r') goto yy72; - goto yy25; - } - } else { - if (yych <= '#') { - if (yych <= ' ') goto yy69; - if (yych <= '"') goto yy3; - goto yy58; - } else { - if (yych == '%') goto yy25; - goto yy3; - } - } - } else { - if (yych <= '=') { - if (yych <= ':') { - if (yych <= '\'') goto yy25; - if (yych <= ')') goto yy3; - goto yy25; - } else { - if (yych <= ';') goto yy53; - if (yych <= '<') goto yy25; - goto yy51; - } - } else { - if (yych <= ']') { - if (yych == '[') goto yy28; - goto yy25; - } else { - if (yych <= '^') goto yy3; - if (yych <= 'z') goto yy25; - if (yych <= '~') goto yy3; - goto yy25; - } - } - } -yy71: - YYDEBUG(71, *YYCURSOR); - yych = *++YYCURSOR; - goto yy7; -yy72: - YYDEBUG(72, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) == '\n') goto yy71; - goto yy7; - } -/* *********************************** */ -yyc_ST_DOUBLE_QUOTES: - { - static const unsigned char yybm[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 128, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 128, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }; - YYDEBUG(73, *YYCURSOR); - YYFILL(2); - yych = *YYCURSOR; - if (yych == '"') goto yy77; - if (yych == '$') goto yy79; - YYDEBUG(75, *YYCURSOR); - ++YYCURSOR; -yy76: - YYDEBUG(76, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 535 "Zend/zend_ini_scanner.l" - { /* Escape double quoted string contents */ - if (YYCURSOR > YYLIMIT) { - return 0; - } - - while (YYCURSOR < YYLIMIT) { - switch (*YYCURSOR++) { - case '"': - if (YYCURSOR < YYLIMIT && YYCURSOR[-2] == '\\' && *YYCURSOR != '\r' && *YYCURSOR != '\n') { - continue; - } - break; - case '$': - if (*YYCURSOR == '{') { - break; - } - continue; - case '\\': - if (YYCURSOR < YYLIMIT && *YYCURSOR != '"') { - YYCURSOR++; - } - /* fall through */ - default: - continue; - } - - YYCURSOR--; - break; - } - - yyleng = YYCURSOR - SCNG(yy_text); - - zend_ini_escape_string(ini_lval, yytext, yyleng, '"' TSRMLS_CC); - return TC_QUOTED_STRING; -} -#line 1198 "Zend/zend_ini_scanner.c" -yy77: - YYDEBUG(77, *YYCURSOR); - ++YYCURSOR; - yych = *YYCURSOR; - goto yy83; -yy78: - YYDEBUG(78, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 530 "Zend/zend_ini_scanner.l" - { /* Double quoted '"' string ends */ - yy_pop_state(TSRMLS_C); - return '"'; -} -#line 1212 "Zend/zend_ini_scanner.c" -yy79: - YYDEBUG(79, *YYCURSOR); - yych = *++YYCURSOR; - if (yych != '{') goto yy76; - YYDEBUG(80, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(81, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 401 "Zend/zend_ini_scanner.l" - { /* Variable start */ - yy_push_state(ST_VARNAME TSRMLS_CC); - return TC_DOLLAR_CURLY; -} -#line 1226 "Zend/zend_ini_scanner.c" -yy82: - YYDEBUG(82, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; -yy83: - YYDEBUG(83, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy82; - } - goto yy78; - } -/* *********************************** */ -yyc_ST_OFFSET: - { - static const unsigned char yybm[] = { - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 194, 64, 66, 66, 64, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 194, 66, 64, 66, 68, 66, 66, 0, - 66, 66, 66, 66, 66, 66, 66, 66, - 114, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 66, 64, 66, 66, 66, 66, - 66, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 66, 72, 64, 66, 82, - 66, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - }; - YYDEBUG(84, *YYCURSOR); - YYFILL(2); - yych = *YYCURSOR; - if (yych <= '-') { - if (yych <= ' ') { - if (yych <= '\n') { - if (yych <= 0x08) goto yy86; - if (yych <= '\t') goto yy88; - goto yy89; - } else { - if (yych == '\r') goto yy89; - if (yych >= ' ') goto yy88; - } - } else { - if (yych <= '$') { - if (yych == '"') goto yy91; - if (yych >= '$') goto yy93; - } else { - if (yych == '\'') goto yy94; - if (yych >= '-') goto yy95; - } - } - } else { - if (yych <= 'Z') { - if (yych <= '9') { - if (yych <= '.') goto yy96; - if (yych >= '0') goto yy97; - } else { - if (yych == ';') goto yy89; - if (yych >= 'A') goto yy99; - } - } else { - if (yych <= '^') { - if (yych <= '[') goto yy86; - if (yych <= '\\') goto yy101; - if (yych <= ']') goto yy102; - } else { - if (yych == '`') goto yy86; - if (yych <= 'z') goto yy99; - } - } - } -yy86: - YYDEBUG(86, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - goto yy105; -yy87: - YYDEBUG(87, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 521 "Zend/zend_ini_scanner.l" - { /* Get rest as section/offset value */ - RETURN_TOKEN(TC_STRING, yytext, yyleng); -} -#line 1330 "Zend/zend_ini_scanner.c" -yy88: - YYDEBUG(88, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy131; - } - if (yych == '"') goto yy133; - if (yych == ']') goto yy134; - goto yy105; -yy89: - YYDEBUG(89, *YYCURSOR); - ++YYCURSOR; -yy90: - YYDEBUG(90, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 603 "Zend/zend_ini_scanner.l" - { - return 0; -} -#line 1351 "Zend/zend_ini_scanner.c" -yy91: - YYDEBUG(91, *YYCURSOR); - ++YYCURSOR; -yy92: - YYDEBUG(92, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 525 "Zend/zend_ini_scanner.l" - { /* Double quoted '"' string start */ - yy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC); - return '"'; -} -#line 1363 "Zend/zend_ini_scanner.c" -yy93: - YYDEBUG(93, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= '\\') { - if (yych <= 0x00) goto yy90; - if (yych <= '[') goto yy104; - goto yy109; - } else { - if (yych == '{') goto yy129; - goto yy104; - } -yy94: - YYDEBUG(94, *YYCURSOR); - yyaccept = 1; - yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 64) { - goto yy125; - } - goto yy90; -yy95: - YYDEBUG(95, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy105; - if (yych <= '9') goto yy123; - goto yy105; -yy96: - YYDEBUG(96, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy105; - if (yych <= '9') goto yy121; - goto yy105; -yy97: - YYDEBUG(97, *YYCURSOR); - yyaccept = 2; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '\'') { - if (yych <= '\r') { - if (yych == '\n') goto yy98; - if (yych <= '\f') goto yy105; - } else { - if (yych == '"') goto yy98; - if (yych <= '&') goto yy105; - } - } else { - if (yych <= '9') { - if (yych == '.') goto yy117; - if (yych <= '/') goto yy105; - goto yy119; - } else { - if (yych <= ';') { - if (yych <= ':') goto yy105; - } else { - if (yych != ']') goto yy105; - } - } - } -yy98: - YYDEBUG(98, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 499 "Zend/zend_ini_scanner.l" - { /* Get number option value as string */ - RETURN_TOKEN(TC_NUMBER, yytext, yyleng); -} -#line 1429 "Zend/zend_ini_scanner.c" -yy99: - YYDEBUG(99, *YYCURSOR); - yyaccept = 3; - yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 16) { - goto yy115; - } - if (yych <= '"') { - if (yych <= '\f') { - if (yych != '\n') goto yy105; - } else { - if (yych <= '\r') goto yy100; - if (yych <= '!') goto yy105; - } - } else { - if (yych <= ':') { - if (yych != '\'') goto yy105; - } else { - if (yych <= ';') goto yy100; - if (yych != ']') goto yy105; - } - } -yy100: - YYDEBUG(100, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 495 "Zend/zend_ini_scanner.l" - { /* Get constant option value */ - RETURN_TOKEN(TC_CONSTANT, yytext, yyleng); -} -#line 1459 "Zend/zend_ini_scanner.c" -yy101: - YYDEBUG(101, *YYCURSOR); - yych = *++YYCURSOR; - goto yy104; -yy102: - YYDEBUG(102, *YYCURSOR); - ++YYCURSOR; -yy103: - YYDEBUG(103, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 396 "Zend/zend_ini_scanner.l" - { /* End of section or an option offset */ - BEGIN(INITIAL); - return ']'; -} -#line 1475 "Zend/zend_ini_scanner.c" -yy104: - YYDEBUG(104, *YYCURSOR); - yyaccept = 0; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; -yy105: - YYDEBUG(105, *YYCURSOR); - if (yybm[0+yych] & 2) { - goto yy104; - } - if (yych == '$') goto yy107; - if (yych != '\\') goto yy87; -yy106: - YYDEBUG(106, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - goto yy104; -yy107: - YYDEBUG(107, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - if (yych <= '\\') { - if (yych <= 0x00) goto yy108; - if (yych <= '[') goto yy104; - goto yy109; - } else { - if (yych != '{') goto yy104; - } -yy108: - YYDEBUG(108, *YYCURSOR); - YYCURSOR = YYMARKER; - if (yyaccept <= 1) { - if (yyaccept <= 0) { - goto yy87; - } else { - goto yy90; - } - } else { - if (yyaccept <= 2) { - goto yy98; - } else { - goto yy100; - } - } -yy109: - YYDEBUG(109, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - if (yybm[0+yych] & 4) { - goto yy110; - } - if (yych == '\\') goto yy112; - goto yy104; -yy110: - YYDEBUG(110, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(111, *YYCURSOR); - if (yybm[0+yych] & 4) { - goto yy110; - } - if (yych == '\\') goto yy114; - goto yy104; -yy112: - YYDEBUG(112, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(113, *YYCURSOR); - if (yybm[0+yych] & 4) { - goto yy110; - } - if (yych == '\\') goto yy112; - goto yy104; -yy114: - YYDEBUG(114, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - if (yybm[0+yych] & 4) { - goto yy110; - } - if (yych == '\\') goto yy112; - goto yy104; -yy115: - YYDEBUG(115, *YYCURSOR); - yyaccept = 3; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(116, *YYCURSOR); - if (yybm[0+yych] & 16) { - goto yy115; - } - if (yych <= '$') { - if (yych <= '\r') { - if (yych == '\n') goto yy100; - if (yych <= '\f') goto yy104; - goto yy100; - } else { - if (yych == '"') goto yy100; - if (yych <= '#') goto yy104; - goto yy107; - } - } else { - if (yych <= ';') { - if (yych == '\'') goto yy100; - if (yych <= ':') goto yy104; - goto yy100; - } else { - if (yych <= '[') goto yy104; - if (yych <= '\\') goto yy106; - if (yych <= ']') goto yy100; - goto yy104; - } - } -yy117: - YYDEBUG(117, *YYCURSOR); - yyaccept = 2; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(118, *YYCURSOR); - if (yybm[0+yych] & 32) { - goto yy117; - } - if (yych <= '$') { - if (yych <= '\r') { - if (yych == '\n') goto yy98; - if (yych <= '\f') goto yy104; - goto yy98; - } else { - if (yych == '"') goto yy98; - if (yych <= '#') goto yy104; - goto yy107; - } - } else { - if (yych <= ';') { - if (yych == '\'') goto yy98; - if (yych <= ':') goto yy104; - goto yy98; - } else { - if (yych <= '[') goto yy104; - if (yych <= '\\') goto yy106; - if (yych <= ']') goto yy98; - goto yy104; - } - } -yy119: - YYDEBUG(119, *YYCURSOR); - yyaccept = 2; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(120, *YYCURSOR); - if (yych <= '\'') { - if (yych <= '!') { - if (yych <= '\n') { - if (yych <= '\t') goto yy104; - goto yy98; - } else { - if (yych == '\r') goto yy98; - goto yy104; - } - } else { - if (yych <= '#') { - if (yych <= '"') goto yy98; - goto yy104; - } else { - if (yych <= '$') goto yy107; - if (yych <= '&') goto yy104; - goto yy98; - } - } - } else { - if (yych <= ':') { - if (yych <= '.') { - if (yych <= '-') goto yy104; - goto yy117; - } else { - if (yych <= '/') goto yy104; - if (yych <= '9') goto yy119; - goto yy104; - } - } else { - if (yych <= '[') { - if (yych <= ';') goto yy98; - goto yy104; - } else { - if (yych <= '\\') goto yy106; - if (yych <= ']') goto yy98; - goto yy104; - } - } - } -yy121: - YYDEBUG(121, *YYCURSOR); - yyaccept = 2; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(122, *YYCURSOR); - if (yych <= '&') { - if (yych <= '\r') { - if (yych == '\n') goto yy98; - if (yych <= '\f') goto yy104; - goto yy98; - } else { - if (yych <= '"') { - if (yych <= '!') goto yy104; - goto yy98; - } else { - if (yych == '$') goto yy107; - goto yy104; - } - } - } else { - if (yych <= ':') { - if (yych <= '\'') goto yy98; - if (yych <= '/') goto yy104; - if (yych <= '9') goto yy121; - goto yy104; - } else { - if (yych <= '[') { - if (yych <= ';') goto yy98; - goto yy104; - } else { - if (yych <= '\\') goto yy106; - if (yych <= ']') goto yy98; - goto yy104; - } - } - } -yy123: - YYDEBUG(123, *YYCURSOR); - yyaccept = 2; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(124, *YYCURSOR); - if (yych <= '&') { - if (yych <= '\r') { - if (yych == '\n') goto yy98; - if (yych <= '\f') goto yy104; - goto yy98; - } else { - if (yych <= '"') { - if (yych <= '!') goto yy104; - goto yy98; - } else { - if (yych == '$') goto yy107; - goto yy104; - } - } - } else { - if (yych <= ':') { - if (yych <= '\'') goto yy98; - if (yych <= '/') goto yy104; - if (yych <= '9') goto yy123; - goto yy104; - } else { - if (yych <= '[') { - if (yych <= ';') goto yy98; - goto yy104; - } else { - if (yych <= '\\') goto yy106; - if (yych <= ']') goto yy98; - goto yy104; - } - } - } -yy125: - YYDEBUG(125, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(126, *YYCURSOR); - if (yybm[0+yych] & 64) { - goto yy125; - } - YYDEBUG(127, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(128, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 368 "Zend/zend_ini_scanner.l" - { /* Raw string */ - /* Eat leading and trailing single quotes */ - if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') { - SCNG(yy_text)++; - yyleng = yyleng - 2; - } - RETURN_TOKEN(TC_RAW, yytext, yyleng); -} -#line 1774 "Zend/zend_ini_scanner.c" -yy129: - YYDEBUG(129, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(130, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 401 "Zend/zend_ini_scanner.l" - { /* Variable start */ - yy_push_state(ST_VARNAME TSRMLS_CC); - return TC_DOLLAR_CURLY; -} -#line 1785 "Zend/zend_ini_scanner.c" -yy131: - YYDEBUG(131, *YYCURSOR); - yyaccept = 0; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(132, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy131; - } - if (yych <= '$') { - if (yych <= '\r') { - if (yych == '\n') goto yy87; - if (yych <= '\f') goto yy104; - goto yy87; - } else { - if (yych == '"') goto yy133; - if (yych <= '#') goto yy104; - goto yy107; - } - } else { - if (yych <= ';') { - if (yych == '\'') goto yy87; - if (yych <= ':') goto yy104; - goto yy87; - } else { - if (yych <= '[') goto yy104; - if (yych <= '\\') goto yy106; - if (yych <= ']') goto yy134; - goto yy104; - } - } -yy133: - YYDEBUG(133, *YYCURSOR); - yych = *++YYCURSOR; - goto yy92; -yy134: - YYDEBUG(134, *YYCURSOR); - ++YYCURSOR; - yych = *YYCURSOR; - goto yy103; - } -/* *********************************** */ -yyc_ST_RAW: - { - static const unsigned char yybm[] = { - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 192, 0, 64, 64, 0, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 192, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - }; - YYDEBUG(135, *YYCURSOR); - YYFILL(3); - yych = *YYCURSOR; - if (yych <= '\f') { - if (yych <= 0x08) { - if (yych >= 0x01) goto yy139; - } else { - if (yych <= '\t') goto yy141; - if (yych <= '\n') goto yy142; - goto yy139; - } - } else { - if (yych <= ' ') { - if (yych <= '\r') goto yy144; - if (yych <= 0x1F) goto yy139; - goto yy141; - } else { - if (yych == ';') goto yy145; - goto yy139; - } - } - YYDEBUG(137, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(138, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 598 "Zend/zend_ini_scanner.l" - { /* End of option value (if EOF is reached before EOL */ - BEGIN(INITIAL); - return END_OF_LINE; -} -#line 1895 "Zend/zend_ini_scanner.c" -yy139: - YYDEBUG(139, *YYCURSOR); - ++YYCURSOR; -yy140: - YYDEBUG(140, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 448 "Zend/zend_ini_scanner.l" - { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */ - char *sc = NULL; - while (YYCURSOR < YYLIMIT) { - switch (*YYCURSOR) { - case '\n': - case '\r': - goto end_raw_value_chars; - break; - case ';': - if (sc == NULL) { - sc = YYCURSOR; - } - /* no break */ - default: - YYCURSOR++; - break; - } - } -end_raw_value_chars: - yyleng = YYCURSOR - SCNG(yy_text); - - /* Eat trailing semicolons */ - while (yytext[yyleng - 1] == ';') { - yyleng--; - } - - /* Eat leading and trailing double quotes */ - if (yytext[0] == '"' && yytext[yyleng - 1] == '"') { - SCNG(yy_text)++; - yyleng = yyleng - 2; - } else if (sc) { - YYCURSOR = sc; - yyleng = YYCURSOR - SCNG(yy_text); - } - RETURN_TOKEN(TC_RAW, yytext, yyleng); -} -#line 1939 "Zend/zend_ini_scanner.c" -yy141: - YYDEBUG(141, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '\r') { - if (yych <= 0x08) goto yy140; - if (yych <= '\n') goto yy153; - if (yych <= '\f') goto yy140; - goto yy153; - } else { - if (yych <= ' ') { - if (yych <= 0x1F) goto yy140; - goto yy153; - } else { - if (yych == ';') goto yy153; - goto yy140; - } - } -yy142: - YYDEBUG(142, *YYCURSOR); - ++YYCURSOR; -yy143: - YYDEBUG(143, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 489 "Zend/zend_ini_scanner.l" - { /* End of option value */ - BEGIN(INITIAL); - SCNG(lineno)++; - return END_OF_LINE; -} -#line 1970 "Zend/zend_ini_scanner.c" -yy144: - YYDEBUG(144, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '\n') goto yy151; - goto yy143; -yy145: - YYDEBUG(145, *YYCURSOR); - yyaccept = 1; - yych = *(YYMARKER = ++YYCURSOR); - goto yy147; -yy146: - YYDEBUG(146, *YYCURSOR); - ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; -yy147: - YYDEBUG(147, *YYCURSOR); - if (yybm[0+yych] & 64) { - goto yy146; - } - if (yych >= '\r') goto yy150; -yy148: - YYDEBUG(148, *YYCURSOR); - ++YYCURSOR; -yy149: - YYDEBUG(149, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 585 "Zend/zend_ini_scanner.l" - { /* Comment */ - BEGIN(INITIAL); - SCNG(lineno)++; - return END_OF_LINE; -} -#line 2004 "Zend/zend_ini_scanner.c" -yy150: - YYDEBUG(150, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '\n') goto yy148; - goto yy149; -yy151: - YYDEBUG(151, *YYCURSOR); - yych = *++YYCURSOR; - goto yy143; -yy152: - YYDEBUG(152, *YYCURSOR); - yyaccept = 2; - YYMARKER = ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; -yy153: - YYDEBUG(153, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy152; - } - if (yych <= '\f') { - if (yych == '\n') goto yy151; - } else { - if (yych <= '\r') goto yy155; - if (yych == ';') goto yy146; - } - YYDEBUG(154, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 575 "Zend/zend_ini_scanner.l" - { - /* eat whitespace */ - goto restart; -} -#line 2038 "Zend/zend_ini_scanner.c" -yy155: - YYDEBUG(155, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) == '\n') goto yy151; - goto yy143; - } -/* *********************************** */ -yyc_ST_SECTION_RAW: - { - static const unsigned char yybm[] = { - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 192, 0, 128, 128, 0, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 192, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 0, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - }; - YYDEBUG(156, *YYCURSOR); - YYFILL(3); - yych = *YYCURSOR; - if (yych <= '\f') { - if (yych == '\n') goto yy160; - } else { - if (yych <= '\r') goto yy160; - if (yych == ']') goto yy162; - } - YYDEBUG(158, *YYCURSOR); - ++YYCURSOR; - yych = *YYCURSOR; - goto yy169; -yy159: - YYDEBUG(159, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 485 "Zend/zend_ini_scanner.l" - { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */ - RETURN_TOKEN(TC_RAW, yytext, yyleng); -} -#line 2102 "Zend/zend_ini_scanner.c" -yy160: - YYDEBUG(160, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(161, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 603 "Zend/zend_ini_scanner.l" - { - return 0; -} -#line 2112 "Zend/zend_ini_scanner.c" -yy162: - YYDEBUG(162, *YYCURSOR); - ++YYCURSOR; - yych = *YYCURSOR; - goto yy165; -yy163: - YYDEBUG(163, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 377 "Zend/zend_ini_scanner.l" - { /* End of section */ - BEGIN(INITIAL); - SCNG(lineno)++; - return ']'; -} -#line 2127 "Zend/zend_ini_scanner.c" -yy164: - YYDEBUG(164, *YYCURSOR); - ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; -yy165: - YYDEBUG(165, *YYCURSOR); - if (yybm[0+yych] & 64) { - goto yy164; - } - if (yych == '\n') goto yy166; - if (yych == '\r') goto yy167; - goto yy163; -yy166: - YYDEBUG(166, *YYCURSOR); - yych = *++YYCURSOR; - goto yy163; -yy167: - YYDEBUG(167, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '\n') goto yy166; - goto yy163; -yy168: - YYDEBUG(168, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; -yy169: - YYDEBUG(169, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy168; - } - goto yy159; - } -/* *********************************** */ -yyc_ST_SECTION_VALUE: - { - static const unsigned char yybm[] = { - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 134, 128, 132, 132, 128, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 134, 132, 128, 132, 136, 132, 132, 0, - 132, 132, 132, 132, 132, 132, 132, 132, - 228, 228, 228, 228, 228, 228, 228, 228, - 228, 228, 132, 128, 132, 132, 132, 132, - 132, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 132, 144, 128, 132, 164, - 132, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - }; - YYDEBUG(170, *YYCURSOR); - YYFILL(3); - yych = *YYCURSOR; - if (yych <= '-') { - if (yych <= ' ') { - if (yych <= '\n') { - if (yych <= 0x08) goto yy172; - if (yych <= '\t') goto yy174; - goto yy175; - } else { - if (yych == '\r') goto yy175; - if (yych >= ' ') goto yy174; - } - } else { - if (yych <= '$') { - if (yych == '"') goto yy177; - if (yych >= '$') goto yy179; - } else { - if (yych == '\'') goto yy180; - if (yych >= '-') goto yy181; - } - } - } else { - if (yych <= 'Z') { - if (yych <= '9') { - if (yych <= '.') goto yy182; - if (yych >= '0') goto yy183; - } else { - if (yych == ';') goto yy175; - if (yych >= 'A') goto yy185; - } - } else { - if (yych <= '^') { - if (yych <= '[') goto yy172; - if (yych <= '\\') goto yy187; - if (yych <= ']') goto yy188; - } else { - if (yych == '`') goto yy172; - if (yych <= 'z') goto yy185; - } - } - } -yy172: - YYDEBUG(172, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - goto yy195; -yy173: - YYDEBUG(173, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 521 "Zend/zend_ini_scanner.l" - { /* Get rest as section/offset value */ - RETURN_TOKEN(TC_STRING, yytext, yyleng); -} -#line 2253 "Zend/zend_ini_scanner.c" -yy174: - YYDEBUG(174, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 0x1F) { - if (yych == '\t') goto yy221; - goto yy195; - } else { - if (yych <= ' ') goto yy221; - if (yych == '"') goto yy223; - goto yy195; - } -yy175: - YYDEBUG(175, *YYCURSOR); - ++YYCURSOR; -yy176: - YYDEBUG(176, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 603 "Zend/zend_ini_scanner.l" - { - return 0; -} -#line 2276 "Zend/zend_ini_scanner.c" -yy177: - YYDEBUG(177, *YYCURSOR); - ++YYCURSOR; -yy178: - YYDEBUG(178, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 525 "Zend/zend_ini_scanner.l" - { /* Double quoted '"' string start */ - yy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC); - return '"'; -} -#line 2288 "Zend/zend_ini_scanner.c" -yy179: - YYDEBUG(179, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= '\\') { - if (yych <= 0x00) goto yy176; - if (yych <= '[') goto yy194; - goto yy199; - } else { - if (yych == '{') goto yy219; - goto yy194; - } -yy180: - YYDEBUG(180, *YYCURSOR); - yyaccept = 1; - yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy215; - } - goto yy176; -yy181: - YYDEBUG(181, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy195; - if (yych <= '9') goto yy213; - goto yy195; -yy182: - YYDEBUG(182, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy195; - if (yych <= '9') goto yy211; - goto yy195; -yy183: - YYDEBUG(183, *YYCURSOR); - yyaccept = 2; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '\'') { - if (yych <= '\r') { - if (yych == '\n') goto yy184; - if (yych <= '\f') goto yy195; - } else { - if (yych == '"') goto yy184; - if (yych <= '&') goto yy195; - } - } else { - if (yych <= '9') { - if (yych == '.') goto yy207; - if (yych <= '/') goto yy195; - goto yy209; - } else { - if (yych <= ';') { - if (yych <= ':') goto yy195; - } else { - if (yych != ']') goto yy195; - } - } - } -yy184: - YYDEBUG(184, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 499 "Zend/zend_ini_scanner.l" - { /* Get number option value as string */ - RETURN_TOKEN(TC_NUMBER, yytext, yyleng); -} -#line 2354 "Zend/zend_ini_scanner.c" -yy185: - YYDEBUG(185, *YYCURSOR); - yyaccept = 3; - yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 32) { - goto yy205; - } - if (yych <= '"') { - if (yych <= '\f') { - if (yych != '\n') goto yy195; - } else { - if (yych <= '\r') goto yy186; - if (yych <= '!') goto yy195; - } - } else { - if (yych <= ':') { - if (yych != '\'') goto yy195; - } else { - if (yych <= ';') goto yy186; - if (yych != ']') goto yy195; - } - } -yy186: - YYDEBUG(186, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 495 "Zend/zend_ini_scanner.l" - { /* Get constant option value */ - RETURN_TOKEN(TC_CONSTANT, yytext, yyleng); -} -#line 2384 "Zend/zend_ini_scanner.c" -yy187: - YYDEBUG(187, *YYCURSOR); - yych = *++YYCURSOR; - goto yy194; -yy188: - YYDEBUG(188, *YYCURSOR); - ++YYCURSOR; - yych = *YYCURSOR; - goto yy191; -yy189: - YYDEBUG(189, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 377 "Zend/zend_ini_scanner.l" - { /* End of section */ - BEGIN(INITIAL); - SCNG(lineno)++; - return ']'; -} -#line 2403 "Zend/zend_ini_scanner.c" -yy190: - YYDEBUG(190, *YYCURSOR); - ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; -yy191: - YYDEBUG(191, *YYCURSOR); - if (yybm[0+yych] & 2) { - goto yy190; - } - if (yych == '\n') goto yy192; - if (yych == '\r') goto yy193; - goto yy189; -yy192: - YYDEBUG(192, *YYCURSOR); - yych = *++YYCURSOR; - goto yy189; -yy193: - YYDEBUG(193, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '\n') goto yy192; - goto yy189; -yy194: - YYDEBUG(194, *YYCURSOR); - yyaccept = 0; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; -yy195: - YYDEBUG(195, *YYCURSOR); - if (yybm[0+yych] & 4) { - goto yy194; - } - if (yych == '$') goto yy197; - if (yych != '\\') goto yy173; -yy196: - YYDEBUG(196, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - goto yy194; -yy197: - YYDEBUG(197, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - if (yych <= '\\') { - if (yych <= 0x00) goto yy198; - if (yych <= '[') goto yy194; - goto yy199; - } else { - if (yych != '{') goto yy194; - } -yy198: - YYDEBUG(198, *YYCURSOR); - YYCURSOR = YYMARKER; - if (yyaccept <= 1) { - if (yyaccept <= 0) { - goto yy173; - } else { - goto yy176; - } - } else { - if (yyaccept <= 2) { - goto yy184; - } else { - goto yy186; - } - } -yy199: - YYDEBUG(199, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - if (yybm[0+yych] & 8) { - goto yy200; - } - if (yych == '\\') goto yy202; - goto yy194; -yy200: - YYDEBUG(200, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(201, *YYCURSOR); - if (yybm[0+yych] & 8) { - goto yy200; - } - if (yych == '\\') goto yy204; - goto yy194; -yy202: - YYDEBUG(202, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(203, *YYCURSOR); - if (yybm[0+yych] & 8) { - goto yy200; - } - if (yych == '\\') goto yy202; - goto yy194; -yy204: - YYDEBUG(204, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - if (yybm[0+yych] & 8) { - goto yy200; - } - if (yych == '\\') goto yy202; - goto yy194; -yy205: - YYDEBUG(205, *YYCURSOR); - yyaccept = 3; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(206, *YYCURSOR); - if (yybm[0+yych] & 32) { - goto yy205; - } - if (yych <= '$') { - if (yych <= '\r') { - if (yych == '\n') goto yy186; - if (yych <= '\f') goto yy194; - goto yy186; - } else { - if (yych == '"') goto yy186; - if (yych <= '#') goto yy194; - goto yy197; - } - } else { - if (yych <= ';') { - if (yych == '\'') goto yy186; - if (yych <= ':') goto yy194; - goto yy186; - } else { - if (yych <= '[') goto yy194; - if (yych <= '\\') goto yy196; - if (yych <= ']') goto yy186; - goto yy194; - } - } -yy207: - YYDEBUG(207, *YYCURSOR); - yyaccept = 2; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(208, *YYCURSOR); - if (yybm[0+yych] & 64) { - goto yy207; - } - if (yych <= '$') { - if (yych <= '\r') { - if (yych == '\n') goto yy184; - if (yych <= '\f') goto yy194; - goto yy184; - } else { - if (yych == '"') goto yy184; - if (yych <= '#') goto yy194; - goto yy197; - } - } else { - if (yych <= ';') { - if (yych == '\'') goto yy184; - if (yych <= ':') goto yy194; - goto yy184; - } else { - if (yych <= '[') goto yy194; - if (yych <= '\\') goto yy196; - if (yych <= ']') goto yy184; - goto yy194; - } - } -yy209: - YYDEBUG(209, *YYCURSOR); - yyaccept = 2; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(210, *YYCURSOR); - if (yych <= '\'') { - if (yych <= '!') { - if (yych <= '\n') { - if (yych <= '\t') goto yy194; - goto yy184; - } else { - if (yych == '\r') goto yy184; - goto yy194; - } - } else { - if (yych <= '#') { - if (yych <= '"') goto yy184; - goto yy194; - } else { - if (yych <= '$') goto yy197; - if (yych <= '&') goto yy194; - goto yy184; - } - } - } else { - if (yych <= ':') { - if (yych <= '.') { - if (yych <= '-') goto yy194; - goto yy207; - } else { - if (yych <= '/') goto yy194; - if (yych <= '9') goto yy209; - goto yy194; - } - } else { - if (yych <= '[') { - if (yych <= ';') goto yy184; - goto yy194; - } else { - if (yych <= '\\') goto yy196; - if (yych <= ']') goto yy184; - goto yy194; - } - } - } -yy211: - YYDEBUG(211, *YYCURSOR); - yyaccept = 2; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(212, *YYCURSOR); - if (yych <= '&') { - if (yych <= '\r') { - if (yych == '\n') goto yy184; - if (yych <= '\f') goto yy194; - goto yy184; - } else { - if (yych <= '"') { - if (yych <= '!') goto yy194; - goto yy184; - } else { - if (yych == '$') goto yy197; - goto yy194; - } - } - } else { - if (yych <= ':') { - if (yych <= '\'') goto yy184; - if (yych <= '/') goto yy194; - if (yych <= '9') goto yy211; - goto yy194; - } else { - if (yych <= '[') { - if (yych <= ';') goto yy184; - goto yy194; - } else { - if (yych <= '\\') goto yy196; - if (yych <= ']') goto yy184; - goto yy194; - } - } - } -yy213: - YYDEBUG(213, *YYCURSOR); - yyaccept = 2; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(214, *YYCURSOR); - if (yych <= '&') { - if (yych <= '\r') { - if (yych == '\n') goto yy184; - if (yych <= '\f') goto yy194; - goto yy184; - } else { - if (yych <= '"') { - if (yych <= '!') goto yy194; - goto yy184; - } else { - if (yych == '$') goto yy197; - goto yy194; - } - } - } else { - if (yych <= ':') { - if (yych <= '\'') goto yy184; - if (yych <= '/') goto yy194; - if (yych <= '9') goto yy213; - goto yy194; - } else { - if (yych <= '[') { - if (yych <= ';') goto yy184; - goto yy194; - } else { - if (yych <= '\\') goto yy196; - if (yych <= ']') goto yy184; - goto yy194; - } - } - } -yy215: - YYDEBUG(215, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(216, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy215; - } - YYDEBUG(217, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(218, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 368 "Zend/zend_ini_scanner.l" - { /* Raw string */ - /* Eat leading and trailing single quotes */ - if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') { - SCNG(yy_text)++; - yyleng = yyleng - 2; - } - RETURN_TOKEN(TC_RAW, yytext, yyleng); -} -#line 2724 "Zend/zend_ini_scanner.c" -yy219: - YYDEBUG(219, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(220, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 401 "Zend/zend_ini_scanner.l" - { /* Variable start */ - yy_push_state(ST_VARNAME TSRMLS_CC); - return TC_DOLLAR_CURLY; -} -#line 2735 "Zend/zend_ini_scanner.c" -yy221: - YYDEBUG(221, *YYCURSOR); - yyaccept = 0; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(222, *YYCURSOR); - if (yych <= '"') { - if (yych <= '\f') { - if (yych <= 0x08) goto yy194; - if (yych <= '\t') goto yy221; - if (yych <= '\n') goto yy173; - goto yy194; - } else { - if (yych <= 0x1F) { - if (yych <= '\r') goto yy173; - goto yy194; - } else { - if (yych <= ' ') goto yy221; - if (yych <= '!') goto yy194; - } - } - } else { - if (yych <= ':') { - if (yych <= '$') { - if (yych <= '#') goto yy194; - goto yy197; - } else { - if (yych == '\'') goto yy173; - goto yy194; - } - } else { - if (yych <= '[') { - if (yych <= ';') goto yy173; - goto yy194; - } else { - if (yych <= '\\') goto yy196; - if (yych <= ']') goto yy173; - goto yy194; - } - } - } -yy223: - YYDEBUG(223, *YYCURSOR); - ++YYCURSOR; - yych = *YYCURSOR; - goto yy178; - } -/* *********************************** */ -yyc_ST_VALUE: - { - static const unsigned char yybm[] = { - 160, 162, 162, 162, 162, 162, 162, 162, - 162, 176, 128, 162, 162, 128, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 176, 160, 160, 162, 168, 162, 160, 32, - 160, 160, 162, 162, 162, 162, 162, 162, - 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 162, 160, 162, 160, 162, 162, - 162, 166, 166, 166, 166, 166, 166, 166, - 166, 166, 166, 166, 166, 166, 166, 166, - 166, 166, 166, 166, 166, 166, 166, 166, - 166, 166, 166, 162, 162, 162, 160, 166, - 162, 166, 166, 166, 166, 166, 166, 166, - 166, 166, 166, 166, 166, 166, 166, 166, - 166, 166, 166, 166, 166, 166, 166, 166, - 166, 166, 166, 162, 160, 162, 160, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - }; - YYDEBUG(224, *YYCURSOR); - YYFILL(6); - yych = *YYCURSOR; - YYDEBUG(-1, yych); - switch (yych) { - case 0x00: goto yy226; - case '\t': - case ' ': goto yy230; - case '\n': goto yy232; - case '\r': goto yy234; - case '!': - case '&': - case '(': - case ')': - case '^': - case '|': - case '~': goto yy235; - case '"': goto yy237; - case '$': goto yy239; - case '\'': goto yy240; - case '-': goto yy241; - case '.': goto yy242; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': goto yy243; - case ';': goto yy245; - case '=': goto yy246; - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Z': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'p': - case 'q': - case 'r': - case 's': - case 'u': - case 'v': - case 'w': - case 'x': - case 'z': goto yy248; - case 'F': - case 'f': goto yy250; - case 'N': - case 'n': goto yy251; - case 'O': - case 'o': goto yy252; - case 'T': - case 't': goto yy253; - case 'Y': - case 'y': goto yy254; - default: goto yy228; - } -yy226: - YYDEBUG(226, *YYCURSOR); - ++YYCURSOR; -yy227: - YYDEBUG(227, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 598 "Zend/zend_ini_scanner.l" - { /* End of option value (if EOF is reached before EOL */ - BEGIN(INITIAL); - return END_OF_LINE; -} -#line 2921 "Zend/zend_ini_scanner.c" -yy228: - YYDEBUG(228, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - goto yy256; -yy229: - YYDEBUG(229, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 517 "Zend/zend_ini_scanner.l" - { /* Get everything else as option/offset value */ - RETURN_TOKEN(TC_STRING, yytext, yyleng); -} -#line 2934 "Zend/zend_ini_scanner.c" -yy230: - YYDEBUG(230, *YYCURSOR); - yyaccept = 1; - yych = *(YYMARKER = ++YYCURSOR); - goto yy306; -yy231: - YYDEBUG(231, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 571 "Zend/zend_ini_scanner.l" - { - RETURN_TOKEN(TC_WHITESPACE, yytext, yyleng); -} -#line 2947 "Zend/zend_ini_scanner.c" -yy232: - YYDEBUG(232, *YYCURSOR); - ++YYCURSOR; -yy233: - YYDEBUG(233, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 489 "Zend/zend_ini_scanner.l" - { /* End of option value */ - BEGIN(INITIAL); - SCNG(lineno)++; - return END_OF_LINE; -} -#line 2960 "Zend/zend_ini_scanner.c" -yy234: - YYDEBUG(234, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '\n') goto yy304; - goto yy233; -yy235: - YYDEBUG(235, *YYCURSOR); - ++YYCURSOR; - yych = *YYCURSOR; - goto yy303; -yy236: - YYDEBUG(236, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 507 "Zend/zend_ini_scanner.l" - { /* Boolean operators */ - return yytext[0]; -} -#line 2978 "Zend/zend_ini_scanner.c" -yy237: - YYDEBUG(237, *YYCURSOR); - ++YYCURSOR; -yy238: - YYDEBUG(238, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 525 "Zend/zend_ini_scanner.l" - { /* Double quoted '"' string start */ - yy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC); - return '"'; -} -#line 2990 "Zend/zend_ini_scanner.c" -yy239: - YYDEBUG(239, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= '\\') { - if (yych <= 0x00) goto yy227; - if (yych <= '[') goto yy255; - goto yy262; - } else { - if (yych == '{') goto yy300; - goto yy255; - } -yy240: - YYDEBUG(240, *YYCURSOR); - yyaccept = 2; - yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy296; - } - goto yy227; -yy241: - YYDEBUG(241, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy256; - if (yych <= '9') goto yy294; - goto yy256; -yy242: - YYDEBUG(242, *YYCURSOR); - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy256; - if (yych <= '9') goto yy292; - goto yy256; -yy243: - YYDEBUG(243, *YYCURSOR); - yyaccept = 3; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '/') { - if (yych <= 0x1F) { - if (yych <= '\n') { - if (yych <= 0x00) goto yy244; - if (yych <= 0x08) goto yy256; - } else { - if (yych != '\r') goto yy256; - } - } else { - if (yych <= ')') { - if (yych <= '"') goto yy244; - if (yych <= '%') goto yy256; - } else { - if (yych == '.') goto yy288; - goto yy256; - } - } - } else { - if (yych <= ']') { - if (yych <= ';') { - if (yych <= '9') goto yy290; - if (yych <= ':') goto yy256; - } else { - if (yych != '=') goto yy256; - } - } else { - if (yych <= '|') { - if (yych <= '^') goto yy244; - if (yych <= '{') goto yy256; - } else { - if (yych != '~') goto yy256; - } - } - } -yy244: - YYDEBUG(244, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 499 "Zend/zend_ini_scanner.l" - { /* Get number option value as string */ - RETURN_TOKEN(TC_NUMBER, yytext, yyleng); -} -#line 3069 "Zend/zend_ini_scanner.c" -yy245: - YYDEBUG(245, *YYCURSOR); - yyaccept = 2; - yych = *(YYMARKER = ++YYCURSOR); - goto yy284; -yy246: - YYDEBUG(246, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(247, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 511 "Zend/zend_ini_scanner.l" - { /* Make = used in option value to trigger error */ - yyless(0); - BEGIN(INITIAL); - return END_OF_LINE; -} -#line 3086 "Zend/zend_ini_scanner.c" -yy248: - YYDEBUG(248, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 4) { - goto yy257; - } - if (yych <= ':') { - if (yych <= '\r') { - if (yych <= 0x08) { - if (yych >= 0x01) goto yy256; - } else { - if (yych <= '\n') goto yy249; - if (yych <= '\f') goto yy256; - } - } else { - if (yych <= '"') { - if (yych <= 0x1F) goto yy256; - } else { - if (yych <= '%') goto yy256; - if (yych >= '*') goto yy256; - } - } - } else { - if (yych <= '^') { - if (yych <= '<') { - if (yych >= '<') goto yy256; - } else { - if (yych <= '=') goto yy249; - if (yych <= ']') goto yy256; - } - } else { - if (yych <= '|') { - if (yych <= '{') goto yy256; - } else { - if (yych != '~') goto yy256; - } - } - } -yy249: - YYDEBUG(249, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 495 "Zend/zend_ini_scanner.l" - { /* Get constant option value */ - RETURN_TOKEN(TC_CONSTANT, yytext, yyleng); -} -#line 3133 "Zend/zend_ini_scanner.c" -yy250: - YYDEBUG(250, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '<') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '/') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - goto yy256; - } else { - if (yych <= '9') goto yy257; - if (yych == ';') goto yy249; - goto yy256; - } - } - } else { - if (yych <= '_') { - if (yych <= 'A') { - if (yych <= '=') goto yy249; - if (yych <= '@') goto yy256; - goto yy280; - } else { - if (yych <= 'Z') goto yy257; - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - goto yy257; - } - } else { - if (yych <= '{') { - if (yych <= '`') goto yy256; - if (yych <= 'a') goto yy280; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy251: - YYDEBUG(251, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 'N') { - if (yych <= '%') { - if (yych <= '\f') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - if (yych <= '\n') goto yy249; - goto yy256; - } else { - if (yych <= '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - if (yych <= '"') goto yy249; - goto yy256; - } - } else { - if (yych <= ':') { - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - if (yych <= '9') goto yy257; - goto yy256; - } else { - if (yych <= '<') { - if (yych <= ';') goto yy249; - goto yy256; - } else { - if (yych <= '=') goto yy249; - if (yych <= '@') goto yy256; - goto yy257; - } - } - } - } else { - if (yych <= 'n') { - if (yych <= 'Z') { - if (yych <= 'O') goto yy276; - if (yych == 'U') goto yy277; - goto yy257; - } else { - if (yych <= '^') { - if (yych <= ']') goto yy256; - goto yy249; - } else { - if (yych == '`') goto yy256; - goto yy257; - } - } - } else { - if (yych <= 'z') { - if (yych <= 'o') goto yy276; - if (yych == 'u') goto yy277; - goto yy257; - } else { - if (yych <= '|') { - if (yych <= '{') goto yy256; - goto yy249; - } else { - if (yych == '~') goto yy249; - goto yy256; - } - } - } - } -yy252: - YYDEBUG(252, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 'E') { - if (yych <= '%') { - if (yych <= '\f') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - if (yych <= '\n') goto yy249; - goto yy256; - } else { - if (yych <= '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - if (yych <= '"') goto yy249; - goto yy256; - } - } else { - if (yych <= ':') { - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - if (yych <= '9') goto yy257; - goto yy256; - } else { - if (yych <= '<') { - if (yych <= ';') goto yy249; - goto yy256; - } else { - if (yych <= '=') goto yy249; - if (yych <= '@') goto yy256; - goto yy257; - } - } - } - } else { - if (yych <= 'e') { - if (yych <= 'Z') { - if (yych <= 'F') goto yy271; - if (yych == 'N') goto yy265; - goto yy257; - } else { - if (yych <= '^') { - if (yych <= ']') goto yy256; - goto yy249; - } else { - if (yych == '`') goto yy256; - goto yy257; - } - } - } else { - if (yych <= 'z') { - if (yych <= 'f') goto yy271; - if (yych == 'n') goto yy265; - goto yy257; - } else { - if (yych <= '|') { - if (yych <= '{') goto yy256; - goto yy249; - } else { - if (yych == '~') goto yy249; - goto yy256; - } - } - } - } -yy253: - YYDEBUG(253, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '=') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '9') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - goto yy257; - } else { - if (yych == ';') goto yy249; - if (yych <= '<') goto yy256; - goto yy249; - } - } - } else { - if (yych <= '`') { - if (yych <= 'Z') { - if (yych <= '@') goto yy256; - if (yych == 'R') goto yy269; - goto yy257; - } else { - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - if (yych <= '_') goto yy257; - goto yy256; - } - } else { - if (yych <= '{') { - if (yych == 'r') goto yy269; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy254: - YYDEBUG(254, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '=') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '9') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - goto yy257; - } else { - if (yych == ';') goto yy249; - if (yych <= '<') goto yy256; - goto yy249; - } - } - } else { - if (yych <= '`') { - if (yych <= 'Z') { - if (yych <= '@') goto yy256; - if (yych == 'E') goto yy259; - goto yy257; - } else { - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - if (yych <= '_') goto yy257; - goto yy256; - } - } else { - if (yych <= '{') { - if (yych == 'e') goto yy259; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy255: - YYDEBUG(255, *YYCURSOR); - yyaccept = 0; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; -yy256: - YYDEBUG(256, *YYCURSOR); - if (yybm[0+yych] & 2) { - goto yy255; - } - if (yych == '$') goto yy260; - goto yy229; -yy257: - YYDEBUG(257, *YYCURSOR); - yyaccept = 4; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(258, *YYCURSOR); - if (yybm[0+yych] & 4) { - goto yy257; - } - if (yych <= ')') { - if (yych <= '\r') { - if (yych <= 0x08) { - if (yych <= 0x00) goto yy249; - goto yy255; - } else { - if (yych <= '\n') goto yy249; - if (yych <= '\f') goto yy255; - goto yy249; - } - } else { - if (yych <= '#') { - if (yych <= 0x1F) goto yy255; - if (yych <= '"') goto yy249; - goto yy255; - } else { - if (yych <= '$') goto yy260; - if (yych <= '%') goto yy255; - goto yy249; - } - } - } else { - if (yych <= ']') { - if (yych <= ';') { - if (yych <= ':') goto yy255; - goto yy249; - } else { - if (yych == '=') goto yy249; - goto yy255; - } - } else { - if (yych <= '|') { - if (yych <= '^') goto yy249; - if (yych <= '{') goto yy255; - goto yy249; - } else { - if (yych == '~') goto yy249; - goto yy255; - } - } - } -yy259: - YYDEBUG(259, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '=') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '9') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - goto yy257; - } else { - if (yych == ';') goto yy249; - if (yych <= '<') goto yy256; - goto yy249; - } - } - } else { - if (yych <= '`') { - if (yych <= 'Z') { - if (yych <= '@') goto yy256; - if (yych == 'S') goto yy265; - goto yy257; - } else { - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - if (yych <= '_') goto yy257; - goto yy256; - } - } else { - if (yych <= '{') { - if (yych == 's') goto yy265; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy260: - YYDEBUG(260, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - if (yych <= '\\') { - if (yych <= 0x00) goto yy261; - if (yych <= '[') goto yy255; - goto yy262; - } else { - if (yych != '{') goto yy255; - } -yy261: - YYDEBUG(261, *YYCURSOR); - YYCURSOR = YYMARKER; - if (yyaccept <= 3) { - if (yyaccept <= 1) { - if (yyaccept <= 0) { - goto yy229; - } else { - goto yy231; - } - } else { - if (yyaccept <= 2) { - goto yy227; - } else { - goto yy244; - } - } - } else { - if (yyaccept <= 5) { - if (yyaccept <= 4) { - goto yy249; - } else { - goto yy266; - } - } else { - goto yy273; - } - } -yy262: - YYDEBUG(262, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - if (yybm[0+yych] & 8) { - goto yy263; - } - goto yy255; -yy263: - YYDEBUG(263, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(264, *YYCURSOR); - if (yybm[0+yych] & 8) { - goto yy263; - } - if (yych <= 0x00) goto yy229; - if (yych == '\\') goto yy262; - goto yy255; -yy265: - YYDEBUG(265, *YYCURSOR); - yyaccept = 5; - yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 16) { - goto yy267; - } - if (yych <= ';') { - if (yych <= ' ') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy266; - if (yych <= '\t') goto yy256; - } else { - if (yych != '\r') goto yy256; - } - } else { - if (yych <= ')') { - if (yych <= '"') goto yy266; - if (yych <= '%') goto yy256; - } else { - if (yych <= '/') goto yy256; - if (yych <= '9') goto yy257; - if (yych <= ':') goto yy256; - } - } - } else { - if (yych <= '_') { - if (yych <= '@') { - if (yych != '=') goto yy256; - } else { - if (yych <= 'Z') goto yy257; - if (yych <= ']') goto yy256; - if (yych >= '_') goto yy257; - } - } else { - if (yych <= '{') { - if (yych <= '`') goto yy256; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych >= 0x7F) goto yy256; - } - } - } -yy266: - YYDEBUG(266, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 421 "Zend/zend_ini_scanner.l" - { /* TRUE value (when used outside option value/offset this causes parse error!) */ - RETURN_TOKEN(BOOL_TRUE, "1", 1); -} -#line 3645 "Zend/zend_ini_scanner.c" -yy267: - YYDEBUG(267, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(268, *YYCURSOR); - if (yybm[0+yych] & 16) { - goto yy267; - } - goto yy266; -yy269: - YYDEBUG(269, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '=') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '9') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - goto yy257; - } else { - if (yych == ';') goto yy249; - if (yych <= '<') goto yy256; - goto yy249; - } - } - } else { - if (yych <= '`') { - if (yych <= 'Z') { - if (yych <= '@') goto yy256; - if (yych != 'U') goto yy257; - } else { - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - if (yych <= '_') goto yy257; - goto yy256; - } - } else { - if (yych <= '{') { - if (yych == 'u') goto yy270; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy270: - YYDEBUG(270, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '=') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '9') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - goto yy257; - } else { - if (yych == ';') goto yy249; - if (yych <= '<') goto yy256; - goto yy249; - } - } - } else { - if (yych <= '`') { - if (yych <= 'Z') { - if (yych <= '@') goto yy256; - if (yych == 'E') goto yy265; - goto yy257; - } else { - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - if (yych <= '_') goto yy257; - goto yy256; - } - } else { - if (yych <= '{') { - if (yych == 'e') goto yy265; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy271: - YYDEBUG(271, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '=') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '9') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - goto yy257; - } else { - if (yych == ';') goto yy249; - if (yych <= '<') goto yy256; - goto yy249; - } - } - } else { - if (yych <= '`') { - if (yych <= 'Z') { - if (yych <= '@') goto yy256; - if (yych != 'F') goto yy257; - } else { - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - if (yych <= '_') goto yy257; - goto yy256; - } - } else { - if (yych <= '{') { - if (yych == 'f') goto yy272; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy272: - YYDEBUG(272, *YYCURSOR); - yyaccept = 6; - yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 4) { - goto yy257; - } - if (yych <= ')') { - if (yych <= '\f') { - if (yych <= 0x08) { - if (yych >= 0x01) goto yy256; - } else { - if (yych <= '\t') goto yy274; - if (yych >= '\v') goto yy256; - } - } else { - if (yych <= ' ') { - if (yych <= '\r') goto yy273; - if (yych <= 0x1F) goto yy256; - goto yy274; - } else { - if (yych <= '"') goto yy273; - if (yych <= '%') goto yy256; - } - } - } else { - if (yych <= ']') { - if (yych <= ';') { - if (yych <= ':') goto yy256; - } else { - if (yych != '=') goto yy256; - } - } else { - if (yych <= '|') { - if (yych <= '^') goto yy273; - if (yych <= '{') goto yy256; - } else { - if (yych != '~') goto yy256; - } - } - } -yy273: - YYDEBUG(273, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 425 "Zend/zend_ini_scanner.l" - { /* FALSE value (when used outside option value/offset this causes parse error!)*/ - RETURN_TOKEN(BOOL_FALSE, "", 0); -} -#line 3855 "Zend/zend_ini_scanner.c" -yy274: - YYDEBUG(274, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(275, *YYCURSOR); - if (yych == '\t') goto yy274; - if (yych == ' ') goto yy274; - goto yy273; -yy276: - YYDEBUG(276, *YYCURSOR); - yyaccept = 6; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '<') { - if (yych <= ' ') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy273; - if (yych <= 0x08) goto yy256; - if (yych <= '\t') goto yy274; - goto yy273; - } else { - if (yych == '\r') goto yy273; - if (yych <= 0x1F) goto yy256; - goto yy274; - } - } else { - if (yych <= '/') { - if (yych <= '"') goto yy273; - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy273; - goto yy256; - } else { - if (yych <= '9') goto yy257; - if (yych == ';') goto yy273; - goto yy256; - } - } - } else { - if (yych <= '_') { - if (yych <= 'N') { - if (yych <= '=') goto yy273; - if (yych <= '@') goto yy256; - if (yych <= 'M') goto yy257; - goto yy279; - } else { - if (yych <= 'Z') goto yy257; - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy273; - goto yy257; - } - } else { - if (yych <= 'z') { - if (yych <= '`') goto yy256; - if (yych == 'n') goto yy279; - goto yy257; - } else { - if (yych <= '|') { - if (yych <= '{') goto yy256; - goto yy273; - } else { - if (yych == '~') goto yy273; - goto yy256; - } - } - } - } -yy277: - YYDEBUG(277, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '=') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '9') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - goto yy257; - } else { - if (yych == ';') goto yy249; - if (yych <= '<') goto yy256; - goto yy249; - } - } - } else { - if (yych <= '`') { - if (yych <= 'Z') { - if (yych <= '@') goto yy256; - if (yych != 'L') goto yy257; - } else { - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - if (yych <= '_') goto yy257; - goto yy256; - } - } else { - if (yych <= '{') { - if (yych == 'l') goto yy278; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy278: - YYDEBUG(278, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '=') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '9') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - goto yy257; - } else { - if (yych == ';') goto yy249; - if (yych <= '<') goto yy256; - goto yy249; - } - } - } else { - if (yych <= '`') { - if (yych <= 'Z') { - if (yych <= '@') goto yy256; - if (yych == 'L') goto yy272; - goto yy257; - } else { - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - if (yych <= '_') goto yy257; - goto yy256; - } - } else { - if (yych <= '{') { - if (yych == 'l') goto yy272; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy279: - YYDEBUG(279, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '=') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '9') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - goto yy257; - } else { - if (yych == ';') goto yy249; - if (yych <= '<') goto yy256; - goto yy249; - } - } - } else { - if (yych <= '`') { - if (yych <= 'Z') { - if (yych <= '@') goto yy256; - if (yych == 'E') goto yy272; - goto yy257; - } else { - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - if (yych <= '_') goto yy257; - goto yy256; - } - } else { - if (yych <= '{') { - if (yych == 'e') goto yy272; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy280: - YYDEBUG(280, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '=') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '9') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - goto yy257; - } else { - if (yych == ';') goto yy249; - if (yych <= '<') goto yy256; - goto yy249; - } - } - } else { - if (yych <= '`') { - if (yych <= 'Z') { - if (yych <= '@') goto yy256; - if (yych != 'L') goto yy257; - } else { - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - if (yych <= '_') goto yy257; - goto yy256; - } - } else { - if (yych <= '{') { - if (yych == 'l') goto yy281; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy281: - YYDEBUG(281, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '=') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '9') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - goto yy257; - } else { - if (yych == ';') goto yy249; - if (yych <= '<') goto yy256; - goto yy249; - } - } - } else { - if (yych <= '`') { - if (yych <= 'Z') { - if (yych <= '@') goto yy256; - if (yych != 'S') goto yy257; - } else { - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - if (yych <= '_') goto yy257; - goto yy256; - } - } else { - if (yych <= '{') { - if (yych == 's') goto yy282; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy282: - YYDEBUG(282, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= '=') { - if (yych <= '"') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy249; - if (yych <= 0x08) goto yy256; - goto yy249; - } else { - if (yych == '\r') goto yy249; - if (yych <= 0x1F) goto yy256; - goto yy249; - } - } else { - if (yych <= '9') { - if (yych <= '%') goto yy256; - if (yych <= ')') goto yy249; - if (yych <= '/') goto yy256; - goto yy257; - } else { - if (yych == ';') goto yy249; - if (yych <= '<') goto yy256; - goto yy249; - } - } - } else { - if (yych <= '`') { - if (yych <= 'Z') { - if (yych <= '@') goto yy256; - if (yych == 'E') goto yy272; - goto yy257; - } else { - if (yych <= ']') goto yy256; - if (yych <= '^') goto yy249; - if (yych <= '_') goto yy257; - goto yy256; - } - } else { - if (yych <= '{') { - if (yych == 'e') goto yy272; - if (yych <= 'z') goto yy257; - goto yy256; - } else { - if (yych == '}') goto yy256; - if (yych <= '~') goto yy249; - goto yy256; - } - } - } -yy283: - YYDEBUG(283, *YYCURSOR); - ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; -yy284: - YYDEBUG(284, *YYCURSOR); - if (yybm[0+yych] & 32) { - goto yy283; - } - if (yych >= '\r') goto yy287; -yy285: - YYDEBUG(285, *YYCURSOR); - ++YYCURSOR; -yy286: - YYDEBUG(286, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 585 "Zend/zend_ini_scanner.l" - { /* Comment */ - BEGIN(INITIAL); - SCNG(lineno)++; - return END_OF_LINE; -} -#line 4248 "Zend/zend_ini_scanner.c" -yy287: - YYDEBUG(287, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '\n') goto yy285; - goto yy286; -yy288: - YYDEBUG(288, *YYCURSOR); - yyaccept = 3; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(289, *YYCURSOR); - if (yybm[0+yych] & 64) { - goto yy288; - } - if (yych <= ')') { - if (yych <= '\r') { - if (yych <= 0x08) { - if (yych <= 0x00) goto yy244; - goto yy255; - } else { - if (yych <= '\n') goto yy244; - if (yych <= '\f') goto yy255; - goto yy244; - } - } else { - if (yych <= '#') { - if (yych <= 0x1F) goto yy255; - if (yych <= '"') goto yy244; - goto yy255; - } else { - if (yych <= '$') goto yy260; - if (yych <= '%') goto yy255; - goto yy244; - } - } - } else { - if (yych <= ']') { - if (yych <= ';') { - if (yych <= ':') goto yy255; - goto yy244; - } else { - if (yych == '=') goto yy244; - goto yy255; - } - } else { - if (yych <= '|') { - if (yych <= '^') goto yy244; - if (yych <= '{') goto yy255; - goto yy244; - } else { - if (yych == '~') goto yy244; - goto yy255; - } - } - } -yy290: - YYDEBUG(290, *YYCURSOR); - yyaccept = 3; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(291, *YYCURSOR); - if (yych <= '.') { - if (yych <= 0x1F) { - if (yych <= '\n') { - if (yych <= 0x00) goto yy244; - if (yych <= 0x08) goto yy255; - goto yy244; - } else { - if (yych == '\r') goto yy244; - goto yy255; - } - } else { - if (yych <= '$') { - if (yych <= '"') goto yy244; - if (yych <= '#') goto yy255; - goto yy260; - } else { - if (yych <= '%') goto yy255; - if (yych <= ')') goto yy244; - if (yych <= '-') goto yy255; - goto yy288; - } - } - } else { - if (yych <= '=') { - if (yych <= ':') { - if (yych <= '/') goto yy255; - if (yych <= '9') goto yy290; - goto yy255; - } else { - if (yych == '<') goto yy255; - goto yy244; - } - } else { - if (yych <= '{') { - if (yych == '^') goto yy244; - goto yy255; - } else { - if (yych == '}') goto yy255; - if (yych <= '~') goto yy244; - goto yy255; - } - } - } -yy292: - YYDEBUG(292, *YYCURSOR); - yyaccept = 3; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(293, *YYCURSOR); - if (yych <= '/') { - if (yych <= 0x1F) { - if (yych <= '\n') { - if (yych <= 0x00) goto yy244; - if (yych <= 0x08) goto yy255; - goto yy244; - } else { - if (yych == '\r') goto yy244; - goto yy255; - } - } else { - if (yych <= '$') { - if (yych <= '"') goto yy244; - if (yych <= '#') goto yy255; - goto yy260; - } else { - if (yych <= '%') goto yy255; - if (yych <= ')') goto yy244; - goto yy255; - } - } - } else { - if (yych <= ']') { - if (yych <= ';') { - if (yych <= '9') goto yy292; - if (yych <= ':') goto yy255; - goto yy244; - } else { - if (yych == '=') goto yy244; - goto yy255; - } - } else { - if (yych <= '|') { - if (yych <= '^') goto yy244; - if (yych <= '{') goto yy255; - goto yy244; - } else { - if (yych == '~') goto yy244; - goto yy255; - } - } - } -yy294: - YYDEBUG(294, *YYCURSOR); - yyaccept = 3; - YYMARKER = ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(295, *YYCURSOR); - if (yych <= '/') { - if (yych <= 0x1F) { - if (yych <= '\n') { - if (yych <= 0x00) goto yy244; - if (yych <= 0x08) goto yy255; - goto yy244; - } else { - if (yych == '\r') goto yy244; - goto yy255; - } - } else { - if (yych <= '$') { - if (yych <= '"') goto yy244; - if (yych <= '#') goto yy255; - goto yy260; - } else { - if (yych <= '%') goto yy255; - if (yych <= ')') goto yy244; - goto yy255; - } - } - } else { - if (yych <= ']') { - if (yych <= ';') { - if (yych <= '9') goto yy294; - if (yych <= ':') goto yy255; - goto yy244; - } else { - if (yych == '=') goto yy244; - goto yy255; - } - } else { - if (yych <= '|') { - if (yych <= '^') goto yy244; - if (yych <= '{') goto yy255; - goto yy244; - } else { - if (yych == '~') goto yy244; - goto yy255; - } - } - } -yy296: - YYDEBUG(296, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(297, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy296; - } - YYDEBUG(298, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(299, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 368 "Zend/zend_ini_scanner.l" - { /* Raw string */ - /* Eat leading and trailing single quotes */ - if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') { - SCNG(yy_text)++; - yyleng = yyleng - 2; - } - RETURN_TOKEN(TC_RAW, yytext, yyleng); -} -#line 4475 "Zend/zend_ini_scanner.c" -yy300: - YYDEBUG(300, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(301, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 401 "Zend/zend_ini_scanner.l" - { /* Variable start */ - yy_push_state(ST_VARNAME TSRMLS_CC); - return TC_DOLLAR_CURLY; -} -#line 4486 "Zend/zend_ini_scanner.c" -yy302: - YYDEBUG(302, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; -yy303: - YYDEBUG(303, *YYCURSOR); - if (yych == '\t') goto yy302; - if (yych == ' ') goto yy302; - goto yy236; -yy304: - YYDEBUG(304, *YYCURSOR); - yych = *++YYCURSOR; - goto yy233; -yy305: - YYDEBUG(305, *YYCURSOR); - yyaccept = 1; - YYMARKER = ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; -yy306: - YYDEBUG(306, *YYCURSOR); - if (yych <= 0x1F) { - if (yych <= '\n') { - if (yych <= 0x08) goto yy231; - if (yych <= '\t') goto yy305; - goto yy304; - } else { - if (yych == '\r') goto yy308; - goto yy231; - } - } else { - if (yych <= '"') { - if (yych <= ' ') goto yy305; - if (yych <= '!') goto yy231; - } else { - if (yych == ';') goto yy283; - goto yy231; - } - } - YYDEBUG(307, *YYCURSOR); - yych = *++YYCURSOR; - goto yy238; -yy308: - YYDEBUG(308, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) == '\n') goto yy304; - goto yy233; - } -/* *********************************** */ -yyc_ST_VARNAME: - { - static const unsigned char yybm[] = { - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 0, 0, 128, 128, 0, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 0, 0, 128, 0, 128, 0, 128, - 0, 0, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 128, 0, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 128, 128, 0, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - }; - YYDEBUG(309, *YYCURSOR); - YYFILL(2); - yych = *YYCURSOR; - if (yych <= ')') { - if (yych <= '"') { - if (yych <= '\f') { - if (yych <= 0x08) goto yy311; - if (yych <= '\n') goto yy313; - } else { - if (yych <= '\r') goto yy313; - if (yych >= '!') goto yy313; - } - } else { - if (yych <= '%') { - if (yych == '$') goto yy313; - } else { - if (yych != '\'') goto yy313; - } - } - } else { - if (yych <= '[') { - if (yych <= '<') { - if (yych == ';') goto yy313; - } else { - if (yych <= '=') goto yy313; - if (yych >= '[') goto yy313; - } - } else { - if (yych <= 'z') { - if (yych == '^') goto yy313; - } else { - if (yych == '}') goto yy315; - if (yych <= '~') goto yy313; - } - } - } -yy311: - YYDEBUG(311, *YYCURSOR); - ++YYCURSOR; - yych = *YYCURSOR; - goto yy318; -yy312: - YYDEBUG(312, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 406 "Zend/zend_ini_scanner.l" - { /* Variable name */ - /* Eat leading whitespace */ - EAT_LEADING_WHITESPACE(); - - /* Eat trailing whitespace */ - EAT_TRAILING_WHITESPACE(); - - RETURN_TOKEN(TC_VARNAME, yytext, yyleng); -} -#line 4627 "Zend/zend_ini_scanner.c" -yy313: - YYDEBUG(313, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(314, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 603 "Zend/zend_ini_scanner.l" - { - return 0; -} -#line 4637 "Zend/zend_ini_scanner.c" -yy315: - YYDEBUG(315, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(316, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 416 "Zend/zend_ini_scanner.l" - { /* Variable end */ - yy_pop_state(TSRMLS_C); - return '}'; -} -#line 4648 "Zend/zend_ini_scanner.c" -yy317: - YYDEBUG(317, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; -yy318: - YYDEBUG(318, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy317; - } - goto yy312; - } -} -#line 607 "Zend/zend_ini_scanner.l" - -} +/* Generated by re2c 0.13.5 */ +#line 1 "Zend/zend_ini_scanner.l" +/* + +----------------------------------------------------------------------+ + | Zend Engine | + +----------------------------------------------------------------------+ + | Copyright (c) 1998-2013 Zend Technologies Ltd. (http://www.zend.com) | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.00 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/2_00.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. | + +----------------------------------------------------------------------+ + | Authors: Zeev Suraski | + | Jani Taskinen | + | Marcus Boerger | + | Nuno Lopes | + | Scott MacVicar | + +----------------------------------------------------------------------+ +*/ + +/* $Id$ */ + +#include +#include "zend.h" +#include "zend_globals.h" +#include +#include "zend_ini_scanner.h" + +#if 0 +# define YYDEBUG(s, c) printf("state: %d char: %c\n", s, c) +#else +# define YYDEBUG(s, c) +#endif + +#include "zend_ini_scanner_defs.h" + +#define YYCTYPE unsigned char +/* allow the scanner to read one null byte after the end of the string (from ZEND_MMAP_AHEAD) + * so that if will be able to terminate to match the current token (e.g. non-enclosed string) */ +#define YYFILL(n) { if (YYCURSOR > YYLIMIT) return 0; } +#define YYCURSOR SCNG(yy_cursor) +#define YYLIMIT SCNG(yy_limit) +#define YYMARKER SCNG(yy_marker) + +#define YYGETCONDITION() SCNG(yy_state) +#define YYSETCONDITION(s) SCNG(yy_state) = s + +#define STATE(name) yyc##name + +/* emulate flex constructs */ +#define BEGIN(state) YYSETCONDITION(STATE(state)) +#define YYSTATE YYGETCONDITION() +#define yytext ((char*)SCNG(yy_text)) +#define yyleng SCNG(yy_leng) +#define yyless(x) do { YYCURSOR = (unsigned char*)yytext + x; \ + yyleng = (unsigned int)x; } while(0) + +/* #define yymore() goto yymore_restart */ + +/* perform sanity check. If this message is triggered you should + increase the ZEND_MMAP_AHEAD value in the zend_streams.h file */ +#define YYMAXFILL 6 +#if ZEND_MMAP_AHEAD < (YYMAXFILL + 1) +# error ZEND_MMAP_AHEAD should be greater than YYMAXFILL +#endif + + +/* How it works (for the core ini directives): + * =========================================== + * + * 1. Scanner scans file for tokens and passes them to parser. + * 2. Parser parses the tokens and passes the name/value pairs to the callback + * function which stores them in the configuration hash table. + * 3. Later REGISTER_INI_ENTRIES() is called which triggers the actual + * registering of ini entries and uses zend_get_configuration_directive() + * to fetch the previously stored name/value pair from configuration hash table + * and registers the static ini entries which match the name to the value + * into EG(ini_directives) hash table. + * 4. PATH section entries are used per-request from down to top, each overriding + * previous if one exists. zend_alter_ini_entry() is called for each entry. + * Settings in PATH section are ZEND_INI_SYSTEM accessible and thus mimics the + * php_admin_* directives used within Apache httpd.conf when PHP is compiled as + * module for Apache. + * 5. User defined ini files (like .htaccess for apache) are parsed for each request and + * stored in separate hash defined by SAPI. + */ + +/* TODO: (ordered by importance :-) + * =============================================================================== + * + * - Separate constant lookup totally from plain strings (using CONSTANT pattern) + * - Add #if .. #else .. #endif and ==, !=, <, > , <=, >= operators + * - Add #include "some.ini" + * - Allow variables to refer to options also when using parse_ini_file() + * + */ + +/* Globals Macros */ +#define SCNG INI_SCNG +#ifdef ZTS +ZEND_API ts_rsrc_id ini_scanner_globals_id; +#else +ZEND_API zend_ini_scanner_globals ini_scanner_globals; +#endif + +/* Eat leading whitespace */ +#define EAT_LEADING_WHITESPACE() \ + while (yytext[0]) { \ + if (yytext[0] == ' ' || yytext[0] == '\t') { \ + SCNG(yy_text)++; \ + yyleng--; \ + } else { \ + break; \ + } \ + } + +/* Eat trailing whitespace + extra char */ +#define EAT_TRAILING_WHITESPACE_EX(ch) \ + while (yyleng > 0 && ( \ + (ch != 'X' && yytext[yyleng - 1] == ch) || \ + yytext[yyleng - 1] == '\n' || \ + yytext[yyleng - 1] == '\r' || \ + yytext[yyleng - 1] == '\t' || \ + yytext[yyleng - 1] == ' ') \ + ) { \ + yyleng--; \ + } + +/* Eat trailing whitespace */ +#define EAT_TRAILING_WHITESPACE() EAT_TRAILING_WHITESPACE_EX('X') + +#define zend_ini_copy_value(retval, str, len) { \ + Z_STRVAL_P(retval) = zend_strndup(str, len); \ + Z_STRLEN_P(retval) = len; \ + Z_TYPE_P(retval) = IS_STRING; \ +} + +#define RETURN_TOKEN(type, str, len) { \ + zend_ini_copy_value(ini_lval, str, len); \ + return type; \ +} + +static void _yy_push_state(int new_state TSRMLS_DC) +{ + zend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION(), sizeof(int)); + YYSETCONDITION(new_state); +} + +#define yy_push_state(state_and_tsrm) _yy_push_state(yyc##state_and_tsrm) + +static void yy_pop_state(TSRMLS_D) +{ + int *stack_state; + zend_stack_top(&SCNG(state_stack), (void **) &stack_state); + YYSETCONDITION(*stack_state); + zend_stack_del_top(&SCNG(state_stack)); +} + +static void yy_scan_buffer(char *str, unsigned int len TSRMLS_DC) +{ + YYCURSOR = (YYCTYPE*)str; + SCNG(yy_start) = YYCURSOR; + YYLIMIT = YYCURSOR + len; +} + +#define ini_filename SCNG(filename) + +/* {{{ init_ini_scanner() +*/ +static int init_ini_scanner(int scanner_mode, zend_file_handle *fh TSRMLS_DC) +{ + /* Sanity check */ + if (scanner_mode != ZEND_INI_SCANNER_NORMAL && scanner_mode != ZEND_INI_SCANNER_RAW) { + zend_error(E_WARNING, "Invalid scanner mode"); + return FAILURE; + } + + SCNG(lineno) = 1; + SCNG(scanner_mode) = scanner_mode; + SCNG(yy_in) = fh; + + if (fh != NULL) { + ini_filename = zend_strndup(fh->filename, strlen(fh->filename)); + } else { + ini_filename = NULL; + } + + zend_stack_init(&SCNG(state_stack)); + BEGIN(INITIAL); + + return SUCCESS; +} +/* }}} */ + +/* {{{ shutdown_ini_scanner() +*/ +void shutdown_ini_scanner(TSRMLS_D) +{ + zend_stack_destroy(&SCNG(state_stack)); + if (ini_filename) { + free(ini_filename); + } +} +/* }}} */ + +/* {{{ zend_ini_scanner_get_lineno() +*/ +int zend_ini_scanner_get_lineno(TSRMLS_D) +{ + return SCNG(lineno); +} +/* }}} */ + +/* {{{ zend_ini_scanner_get_filename() +*/ +char *zend_ini_scanner_get_filename(TSRMLS_D) +{ + return ini_filename ? ini_filename : "Unknown"; +} +/* }}} */ + +/* {{{ zend_ini_open_file_for_scanning() +*/ +int zend_ini_open_file_for_scanning(zend_file_handle *fh, int scanner_mode TSRMLS_DC) +{ + char *buf; + size_t size; + + if (zend_stream_fixup(fh, &buf, &size TSRMLS_CC) == FAILURE) { + return FAILURE; + } + + if (init_ini_scanner(scanner_mode, fh TSRMLS_CC) == FAILURE) { + zend_file_handle_dtor(fh TSRMLS_CC); + return FAILURE; + } + + yy_scan_buffer(buf, size TSRMLS_CC); + + return SUCCESS; +} +/* }}} */ + +/* {{{ zend_ini_prepare_string_for_scanning() +*/ +int zend_ini_prepare_string_for_scanning(char *str, int scanner_mode TSRMLS_DC) +{ + int len = strlen(str); + + if (init_ini_scanner(scanner_mode, NULL TSRMLS_CC) == FAILURE) { + return FAILURE; + } + + yy_scan_buffer(str, len TSRMLS_CC); + + return SUCCESS; +} +/* }}} */ + +/* {{{ zend_ini_escape_string() + */ +static void zend_ini_escape_string(zval *lval, char *str, int len, char quote_type TSRMLS_DC) +{ + register char *s, *t; + char *end; + + zend_ini_copy_value(lval, str, len); + + /* convert escape sequences */ + s = t = Z_STRVAL_P(lval); + end = s + Z_STRLEN_P(lval); + + while (s < end) { + if (*s == '\\') { + s++; + if (s >= end) { + *t++ = '\\'; + continue; + } + switch (*s) { + case '"': + if (*s != quote_type) { + *t++ = '\\'; + *t++ = *s; + break; + } + case '\\': + case '$': + *t++ = *s; + Z_STRLEN_P(lval)--; + break; + default: + *t++ = '\\'; + *t++ = *s; + break; + } + } else { + *t++ = *s; + } + if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) { + SCNG(lineno)++; + } + s++; + } + *t = 0; +} +/* }}} */ + +int ini_lex(zval *ini_lval TSRMLS_DC) +{ +restart: + SCNG(yy_text) = YYCURSOR; + +/* yymore_restart: */ + /* detect EOF */ + if (YYCURSOR >= YYLIMIT) { + if (YYSTATE == STATE(ST_VALUE) || YYSTATE == STATE(ST_RAW)) { + BEGIN(INITIAL); + return END_OF_LINE; + } + return 0; + } + + /* Eat any UTF-8 BOM we find in the first 3 bytes */ + if (YYCURSOR == SCNG(yy_start) && YYCURSOR + 3 < YYLIMIT) { + if (memcmp(YYCURSOR, "\xef\xbb\xbf", 3) == 0) { + YYCURSOR += 3; + goto restart; + } + } + +#line 337 "Zend/zend_ini_scanner.c" +{ + YYCTYPE yych; + unsigned int yyaccept = 0; + if (YYGETCONDITION() < 4) { + if (YYGETCONDITION() < 2) { + if (YYGETCONDITION() < 1) { + goto yyc_INITIAL; + } else { + goto yyc_ST_OFFSET; + } + } else { + if (YYGETCONDITION() < 3) { + goto yyc_ST_SECTION_VALUE; + } else { + goto yyc_ST_VALUE; + } + } + } else { + if (YYGETCONDITION() < 6) { + if (YYGETCONDITION() < 5) { + goto yyc_ST_SECTION_RAW; + } else { + goto yyc_ST_DOUBLE_QUOTES; + } + } else { + if (YYGETCONDITION() < 7) { + goto yyc_ST_VARNAME; + } else { + goto yyc_ST_RAW; + } + } + } +/* *********************************** */ +yyc_INITIAL: + { + static const unsigned char yybm[] = { + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 160, 0, 144, 144, 0, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 240, 128, 128, 144, 128, 144, 128, 144, + 128, 128, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 128, 144, 128, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 128, 144, 144, 128, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 128, 128, 128, 128, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 144, + }; + + YYDEBUG(0, *YYCURSOR); + YYFILL(5); + yych = *YYCURSOR; + YYDEBUG(-1, yych); + switch (yych) { + case '\t': goto yy4; + case '\n': goto yy6; + case '\r': goto yy8; + case ' ': goto yy9; + case '!': + case '"': + case '$': + case '&': + case '(': + case ')': + case '^': + case '{': + case '|': + case '}': + case '~': goto yy10; + case '#': goto yy12; + case '%': + case '\'': + case '*': + case '+': + case ',': + case '-': + case '.': + case '/': + case ':': + case '<': + case '>': + case '?': + case '@': + case ']': goto yy13; + case ';': goto yy14; + case '=': goto yy16; + case 'F': + case 'f': goto yy18; + case 'N': + case 'n': goto yy19; + case 'O': + case 'o': goto yy20; + case 'T': + case 't': goto yy21; + case 'Y': + case 'y': goto yy22; + case '[': goto yy23; + default: goto yy2; + } +yy2: + YYDEBUG(2, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy26; +yy3: + YYDEBUG(3, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 429 "Zend/zend_ini_scanner.l" + { /* Get option name */ + /* Eat leading whitespace */ + EAT_LEADING_WHITESPACE(); + + /* Eat trailing whitespace */ + EAT_TRAILING_WHITESPACE(); + + RETURN_TOKEN(TC_LABEL, yytext, yyleng); +} +#line 476 "Zend/zend_ini_scanner.c" +yy4: + YYDEBUG(4, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + goto yy68; +yy5: + YYDEBUG(5, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 575 "Zend/zend_ini_scanner.l" + { + /* eat whitespace */ + goto restart; +} +#line 490 "Zend/zend_ini_scanner.c" +yy6: + YYDEBUG(6, *YYCURSOR); + ++YYCURSOR; +yy7: + YYDEBUG(7, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 580 "Zend/zend_ini_scanner.l" + { + SCNG(lineno)++; + return END_OF_LINE; +} +#line 502 "Zend/zend_ini_scanner.c" +yy8: + YYDEBUG(8, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy71; + goto yy7; +yy9: + YYDEBUG(9, *YYCURSOR); + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x08) goto yy26; + if (yych <= '\t') goto yy67; + goto yy71; + } else { + if (yych == '\r') goto yy72; + if (yych <= 0x1F) goto yy26; + goto yy69; + } + } else { + if (yych <= ':') { + if (yych == '#') goto yy58; + goto yy26; + } else { + if (yych <= ';') goto yy53; + if (yych == '=') goto yy51; + goto yy26; + } + } +yy10: + YYDEBUG(10, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(11, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 503 "Zend/zend_ini_scanner.l" + { /* Disallow these chars outside option values */ + return yytext[0]; +} +#line 541 "Zend/zend_ini_scanner.c" +yy12: + YYDEBUG(12, *YYCURSOR); + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + goto yy59; +yy13: + YYDEBUG(13, *YYCURSOR); + yych = *++YYCURSOR; + goto yy26; +yy14: + YYDEBUG(14, *YYCURSOR); + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + goto yy54; + YYDEBUG(15, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 603 "Zend/zend_ini_scanner.l" + { + return 0; +} +#line 562 "Zend/zend_ini_scanner.c" +yy16: + YYDEBUG(16, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy52; +yy17: + YYDEBUG(17, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 439 "Zend/zend_ini_scanner.l" + { /* Start option value */ + if (SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW) { + yy_push_state(ST_RAW TSRMLS_CC); + } else { + yy_push_state(ST_VALUE TSRMLS_CC); + } + return '='; +} +#line 580 "Zend/zend_ini_scanner.c" +yy18: + YYDEBUG(18, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'A') goto yy48; + if (yych == 'a') goto yy48; + goto yy26; +yy19: + YYDEBUG(19, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= 'U') { + if (yych == 'O') goto yy44; + if (yych <= 'T') goto yy26; + goto yy45; + } else { + if (yych <= 'o') { + if (yych <= 'n') goto yy26; + goto yy44; + } else { + if (yych == 'u') goto yy45; + goto yy26; + } + } +yy20: + YYDEBUG(20, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= 'N') { + if (yych == 'F') goto yy38; + if (yych <= 'M') goto yy26; + goto yy31; + } else { + if (yych <= 'f') { + if (yych <= 'e') goto yy26; + goto yy38; + } else { + if (yych == 'n') goto yy31; + goto yy26; + } + } +yy21: + YYDEBUG(21, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'R') goto yy36; + if (yych == 'r') goto yy36; + goto yy26; +yy22: + YYDEBUG(22, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy27; + if (yych == 'e') goto yy27; + goto yy26; +yy23: + YYDEBUG(23, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(24, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 358 "Zend/zend_ini_scanner.l" + { /* Section start */ + /* Enter section data lookup state */ + if (SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW) { + yy_push_state(ST_SECTION_RAW TSRMLS_CC); + } else { + yy_push_state(ST_SECTION_VALUE TSRMLS_CC); + } + return TC_SECTION; +} +#line 646 "Zend/zend_ini_scanner.c" +yy25: + YYDEBUG(25, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy26: + YYDEBUG(26, *YYCURSOR); + if (yybm[0+yych] & 16) { + goto yy25; + } + if (yych == '[') goto yy28; + goto yy3; +yy27: + YYDEBUG(27, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'S') goto yy31; + if (yych == 's') goto yy31; + goto yy26; +yy28: + YYDEBUG(28, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(29, *YYCURSOR); + if (yybm[0+yych] & 32) { + goto yy28; + } + YYDEBUG(30, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 383 "Zend/zend_ini_scanner.l" + { /* Start of option with offset */ + /* Eat leading whitespace */ + EAT_LEADING_WHITESPACE(); + + /* Eat trailing whitespace and [ */ + EAT_TRAILING_WHITESPACE_EX('['); + + /* Enter offset lookup state */ + yy_push_state(ST_OFFSET TSRMLS_CC); + + RETURN_TOKEN(TC_OFFSET, yytext, yyleng); +} +#line 689 "Zend/zend_ini_scanner.c" +yy31: + YYDEBUG(31, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(32, *YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy31; + } + if (yych <= '\'') { + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x08) goto yy25; + if (yych <= '\t') goto yy34; + } else { + if (yych != '\r') goto yy25; + } + } else { + if (yych <= '$') { + if (yych == '#') goto yy25; + } else { + if (yych != '&') goto yy25; + } + } + } else { + if (yych <= 'Z') { + if (yych <= ';') { + if (yych <= ')') goto yy33; + if (yych <= ':') goto yy25; + } else { + if (yych != '=') goto yy25; + } + } else { + if (yych <= '^') { + if (yych <= '[') goto yy28; + if (yych <= ']') goto yy25; + } else { + if (yych <= 'z') goto yy25; + if (yych >= 0x7F) goto yy25; + } + } + } +yy33: + YYDEBUG(33, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 421 "Zend/zend_ini_scanner.l" + { /* TRUE value (when used outside option value/offset this causes parse error!) */ + RETURN_TOKEN(BOOL_TRUE, "1", 1); +} +#line 739 "Zend/zend_ini_scanner.c" +yy34: + YYDEBUG(34, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(35, *YYCURSOR); + if (yych == '\t') goto yy34; + if (yych == ' ') goto yy34; + goto yy33; +yy36: + YYDEBUG(36, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'U') goto yy37; + if (yych != 'u') goto yy26; +yy37: + YYDEBUG(37, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy31; + if (yych == 'e') goto yy31; + goto yy26; +yy38: + YYDEBUG(38, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'F') goto yy39; + if (yych != 'f') goto yy26; +yy39: + YYDEBUG(39, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(40, *YYCURSOR); + if (yych <= '&') { + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x08) goto yy25; + if (yych <= '\t') goto yy42; + } else { + if (yych != '\r') goto yy25; + } + } else { + if (yych <= '#') { + if (yych <= ' ') goto yy39; + if (yych >= '#') goto yy25; + } else { + if (yych == '%') goto yy25; + } + } + } else { + if (yych <= '=') { + if (yych <= ':') { + if (yych <= '\'') goto yy25; + if (yych >= '*') goto yy25; + } else { + if (yych == '<') goto yy25; + } + } else { + if (yych <= ']') { + if (yych == '[') goto yy28; + goto yy25; + } else { + if (yych <= '^') goto yy41; + if (yych <= 'z') goto yy25; + if (yych >= 0x7F) goto yy25; + } + } + } +yy41: + YYDEBUG(41, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 425 "Zend/zend_ini_scanner.l" + { /* FALSE value (when used outside option value/offset this causes parse error!)*/ + RETURN_TOKEN(BOOL_FALSE, "", 0); +} +#line 813 "Zend/zend_ini_scanner.c" +yy42: + YYDEBUG(42, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(43, *YYCURSOR); + if (yych == '\t') goto yy42; + if (yych == ' ') goto yy42; + goto yy41; +yy44: + YYDEBUG(44, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= '\'') { + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x08) goto yy26; + if (yych <= '\t') goto yy42; + goto yy41; + } else { + if (yych == '\r') goto yy41; + goto yy26; + } + } else { + if (yych <= '#') { + if (yych <= ' ') goto yy39; + if (yych <= '"') goto yy41; + goto yy26; + } else { + if (yych == '%') goto yy26; + if (yych <= '&') goto yy41; + goto yy26; + } + } + } else { + if (yych <= 'N') { + if (yych <= ';') { + if (yych <= ')') goto yy41; + if (yych <= ':') goto yy26; + goto yy41; + } else { + if (yych == '=') goto yy41; + if (yych <= 'M') goto yy26; + goto yy47; + } + } else { + if (yych <= 'm') { + if (yych == '^') goto yy41; + goto yy26; + } else { + if (yych <= 'n') goto yy47; + if (yych <= 'z') goto yy26; + if (yych <= '~') goto yy41; + goto yy26; + } + } + } +yy45: + YYDEBUG(45, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'L') goto yy46; + if (yych != 'l') goto yy26; +yy46: + YYDEBUG(46, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'L') goto yy39; + if (yych == 'l') goto yy39; + goto yy26; +yy47: + YYDEBUG(47, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy39; + if (yych == 'e') goto yy39; + goto yy26; +yy48: + YYDEBUG(48, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'L') goto yy49; + if (yych != 'l') goto yy26; +yy49: + YYDEBUG(49, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'S') goto yy50; + if (yych != 's') goto yy26; +yy50: + YYDEBUG(50, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy39; + if (yych == 'e') goto yy39; + goto yy26; +yy51: + YYDEBUG(51, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy52: + YYDEBUG(52, *YYCURSOR); + if (yych == '\t') goto yy51; + if (yych == ' ') goto yy51; + goto yy17; +yy53: + YYDEBUG(53, *YYCURSOR); + ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy54: + YYDEBUG(54, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy53; + } + if (yych >= '\r') goto yy57; +yy55: + YYDEBUG(55, *YYCURSOR); + ++YYCURSOR; +yy56: + YYDEBUG(56, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 585 "Zend/zend_ini_scanner.l" + { /* Comment */ + BEGIN(INITIAL); + SCNG(lineno)++; + return END_OF_LINE; +} +#line 936 "Zend/zend_ini_scanner.c" +yy57: + YYDEBUG(57, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy55; + goto yy56; +yy58: + YYDEBUG(58, *YYCURSOR); + yyaccept = 1; + YYMARKER = ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy59: + YYDEBUG(59, *YYCURSOR); + if (yych <= '\'') { + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x08) goto yy58; + if (yych >= '\n') goto yy64; + } else { + if (yych == '\r') goto yy66; + goto yy58; + } + } else { + if (yych <= '$') { + if (yych == '#') goto yy58; + } else { + if (yych != '&') goto yy58; + } + } + } else { + if (yych <= 'Z') { + if (yych <= ';') { + if (yych <= ')') goto yy60; + if (yych <= ':') goto yy58; + } else { + if (yych != '=') goto yy58; + } + } else { + if (yych <= '^') { + if (yych <= '[') goto yy62; + if (yych <= ']') goto yy58; + } else { + if (yych <= 'z') goto yy58; + if (yych >= 0x7F) goto yy58; + } + } + } +yy60: + YYDEBUG(60, *YYCURSOR); + ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; + YYDEBUG(61, *YYCURSOR); + if (yych == '\n') goto yy64; + if (yych == '\r') goto yy66; + goto yy60; +yy62: + YYDEBUG(62, *YYCURSOR); + yyaccept = 3; + YYMARKER = ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; + YYDEBUG(63, *YYCURSOR); + if (yych <= '\f') { + if (yych <= 0x08) goto yy60; + if (yych <= '\t') goto yy62; + if (yych >= '\v') goto yy60; + } else { + if (yych <= '\r') goto yy66; + if (yych == ' ') goto yy62; + goto yy60; + } +yy64: + YYDEBUG(64, *YYCURSOR); + ++YYCURSOR; +yy65: + YYDEBUG(65, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 591 "Zend/zend_ini_scanner.l" + { /* #Comment */ + zend_error(E_DEPRECATED, "Comments starting with '#' are deprecated in %s on line %d", zend_ini_scanner_get_filename(TSRMLS_C), SCNG(lineno)); + BEGIN(INITIAL); + SCNG(lineno)++; + return END_OF_LINE; +} +#line 1022 "Zend/zend_ini_scanner.c" +yy66: + YYDEBUG(66, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy64; + goto yy65; +yy67: + YYDEBUG(67, *YYCURSOR); + yyaccept = 0; + YYMARKER = ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy68: + YYDEBUG(68, *YYCURSOR); + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x08) goto yy5; + if (yych <= '\t') goto yy67; + goto yy71; + } else { + if (yych == '\r') goto yy72; + if (yych <= 0x1F) goto yy5; + goto yy67; + } + } else { + if (yych <= ':') { + if (yych == '#') goto yy60; + goto yy5; + } else { + if (yych <= ';') goto yy53; + if (yych == '=') goto yy51; + goto yy5; + } + } +yy69: + YYDEBUG(69, *YYCURSOR); + yyaccept = 1; + YYMARKER = ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; + YYDEBUG(70, *YYCURSOR); + if (yych <= '&') { + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x08) goto yy25; + if (yych <= '\t') goto yy67; + } else { + if (yych == '\r') goto yy72; + goto yy25; + } + } else { + if (yych <= '#') { + if (yych <= ' ') goto yy69; + if (yych <= '"') goto yy3; + goto yy58; + } else { + if (yych == '%') goto yy25; + goto yy3; + } + } + } else { + if (yych <= '=') { + if (yych <= ':') { + if (yych <= '\'') goto yy25; + if (yych <= ')') goto yy3; + goto yy25; + } else { + if (yych <= ';') goto yy53; + if (yych <= '<') goto yy25; + goto yy51; + } + } else { + if (yych <= ']') { + if (yych == '[') goto yy28; + goto yy25; + } else { + if (yych <= '^') goto yy3; + if (yych <= 'z') goto yy25; + if (yych <= '~') goto yy3; + goto yy25; + } + } + } +yy71: + YYDEBUG(71, *YYCURSOR); + yych = *++YYCURSOR; + goto yy7; +yy72: + YYDEBUG(72, *YYCURSOR); + ++YYCURSOR; + if ((yych = *YYCURSOR) == '\n') goto yy71; + goto yy7; + } +/* *********************************** */ +yyc_ST_DOUBLE_QUOTES: + { + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + YYDEBUG(73, *YYCURSOR); + YYFILL(2); + yych = *YYCURSOR; + if (yych == '"') goto yy77; + if (yych == '$') goto yy79; + YYDEBUG(75, *YYCURSOR); + ++YYCURSOR; +yy76: + YYDEBUG(76, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 535 "Zend/zend_ini_scanner.l" + { /* Escape double quoted string contents */ + if (YYCURSOR > YYLIMIT) { + return 0; + } + + while (YYCURSOR < YYLIMIT) { + switch (*YYCURSOR++) { + case '"': + if (YYCURSOR < YYLIMIT && YYCURSOR[-2] == '\\' && *YYCURSOR != '\r' && *YYCURSOR != '\n') { + continue; + } + break; + case '$': + if (*YYCURSOR == '{') { + break; + } + continue; + case '\\': + if (YYCURSOR < YYLIMIT && *YYCURSOR != '"') { + YYCURSOR++; + } + /* fall through */ + default: + continue; + } + + YYCURSOR--; + break; + } + + yyleng = YYCURSOR - SCNG(yy_text); + + zend_ini_escape_string(ini_lval, yytext, yyleng, '"' TSRMLS_CC); + return TC_QUOTED_STRING; +} +#line 1198 "Zend/zend_ini_scanner.c" +yy77: + YYDEBUG(77, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy83; +yy78: + YYDEBUG(78, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 530 "Zend/zend_ini_scanner.l" + { /* Double quoted '"' string ends */ + yy_pop_state(TSRMLS_C); + return '"'; +} +#line 1212 "Zend/zend_ini_scanner.c" +yy79: + YYDEBUG(79, *YYCURSOR); + yych = *++YYCURSOR; + if (yych != '{') goto yy76; + YYDEBUG(80, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(81, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 401 "Zend/zend_ini_scanner.l" + { /* Variable start */ + yy_push_state(ST_VARNAME TSRMLS_CC); + return TC_DOLLAR_CURLY; +} +#line 1226 "Zend/zend_ini_scanner.c" +yy82: + YYDEBUG(82, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy83: + YYDEBUG(83, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy82; + } + goto yy78; + } +/* *********************************** */ +yyc_ST_OFFSET: + { + static const unsigned char yybm[] = { + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 194, 64, 66, 66, 64, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 194, 66, 64, 66, 68, 66, 66, 0, + 66, 66, 66, 66, 66, 66, 66, 66, + 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 66, 64, 66, 66, 66, 66, + 66, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 66, 72, 64, 66, 82, + 66, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + }; + YYDEBUG(84, *YYCURSOR); + YYFILL(2); + yych = *YYCURSOR; + if (yych <= '-') { + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x08) goto yy86; + if (yych <= '\t') goto yy88; + goto yy89; + } else { + if (yych == '\r') goto yy89; + if (yych >= ' ') goto yy88; + } + } else { + if (yych <= '$') { + if (yych == '"') goto yy91; + if (yych >= '$') goto yy93; + } else { + if (yych == '\'') goto yy94; + if (yych >= '-') goto yy95; + } + } + } else { + if (yych <= 'Z') { + if (yych <= '9') { + if (yych <= '.') goto yy96; + if (yych >= '0') goto yy97; + } else { + if (yych == ';') goto yy89; + if (yych >= 'A') goto yy99; + } + } else { + if (yych <= '^') { + if (yych <= '[') goto yy86; + if (yych <= '\\') goto yy101; + if (yych <= ']') goto yy102; + } else { + if (yych == '`') goto yy86; + if (yych <= 'z') goto yy99; + } + } + } +yy86: + YYDEBUG(86, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + goto yy105; +yy87: + YYDEBUG(87, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 521 "Zend/zend_ini_scanner.l" + { /* Get rest as section/offset value */ + RETURN_TOKEN(TC_STRING, yytext, yyleng); +} +#line 1330 "Zend/zend_ini_scanner.c" +yy88: + YYDEBUG(88, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy131; + } + if (yych == '"') goto yy133; + if (yych == ']') goto yy134; + goto yy105; +yy89: + YYDEBUG(89, *YYCURSOR); + ++YYCURSOR; +yy90: + YYDEBUG(90, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 603 "Zend/zend_ini_scanner.l" + { + return 0; +} +#line 1351 "Zend/zend_ini_scanner.c" +yy91: + YYDEBUG(91, *YYCURSOR); + ++YYCURSOR; +yy92: + YYDEBUG(92, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 525 "Zend/zend_ini_scanner.l" + { /* Double quoted '"' string start */ + yy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC); + return '"'; +} +#line 1363 "Zend/zend_ini_scanner.c" +yy93: + YYDEBUG(93, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= '\\') { + if (yych <= 0x00) goto yy90; + if (yych <= '[') goto yy104; + goto yy109; + } else { + if (yych == '{') goto yy129; + goto yy104; + } +yy94: + YYDEBUG(94, *YYCURSOR); + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy125; + } + goto yy90; +yy95: + YYDEBUG(95, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '/') goto yy105; + if (yych <= '9') goto yy123; + goto yy105; +yy96: + YYDEBUG(96, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '/') goto yy105; + if (yych <= '9') goto yy121; + goto yy105; +yy97: + YYDEBUG(97, *YYCURSOR); + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '\'') { + if (yych <= '\r') { + if (yych == '\n') goto yy98; + if (yych <= '\f') goto yy105; + } else { + if (yych == '"') goto yy98; + if (yych <= '&') goto yy105; + } + } else { + if (yych <= '9') { + if (yych == '.') goto yy117; + if (yych <= '/') goto yy105; + goto yy119; + } else { + if (yych <= ';') { + if (yych <= ':') goto yy105; + } else { + if (yych != ']') goto yy105; + } + } + } +yy98: + YYDEBUG(98, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 499 "Zend/zend_ini_scanner.l" + { /* Get number option value as string */ + RETURN_TOKEN(TC_NUMBER, yytext, yyleng); +} +#line 1429 "Zend/zend_ini_scanner.c" +yy99: + YYDEBUG(99, *YYCURSOR); + yyaccept = 3; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 16) { + goto yy115; + } + if (yych <= '"') { + if (yych <= '\f') { + if (yych != '\n') goto yy105; + } else { + if (yych <= '\r') goto yy100; + if (yych <= '!') goto yy105; + } + } else { + if (yych <= ':') { + if (yych != '\'') goto yy105; + } else { + if (yych <= ';') goto yy100; + if (yych != ']') goto yy105; + } + } +yy100: + YYDEBUG(100, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 495 "Zend/zend_ini_scanner.l" + { /* Get constant option value */ + RETURN_TOKEN(TC_CONSTANT, yytext, yyleng); +} +#line 1459 "Zend/zend_ini_scanner.c" +yy101: + YYDEBUG(101, *YYCURSOR); + yych = *++YYCURSOR; + goto yy104; +yy102: + YYDEBUG(102, *YYCURSOR); + ++YYCURSOR; +yy103: + YYDEBUG(103, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 396 "Zend/zend_ini_scanner.l" + { /* End of section or an option offset */ + BEGIN(INITIAL); + return ']'; +} +#line 1475 "Zend/zend_ini_scanner.c" +yy104: + YYDEBUG(104, *YYCURSOR); + yyaccept = 0; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy105: + YYDEBUG(105, *YYCURSOR); + if (yybm[0+yych] & 2) { + goto yy104; + } + if (yych == '$') goto yy107; + if (yych != '\\') goto yy87; +yy106: + YYDEBUG(106, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + goto yy104; +yy107: + YYDEBUG(107, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + if (yych <= '\\') { + if (yych <= 0x00) goto yy108; + if (yych <= '[') goto yy104; + goto yy109; + } else { + if (yych != '{') goto yy104; + } +yy108: + YYDEBUG(108, *YYCURSOR); + YYCURSOR = YYMARKER; + if (yyaccept <= 1) { + if (yyaccept <= 0) { + goto yy87; + } else { + goto yy90; + } + } else { + if (yyaccept <= 2) { + goto yy98; + } else { + goto yy100; + } + } +yy109: + YYDEBUG(109, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + if (yybm[0+yych] & 4) { + goto yy110; + } + if (yych == '\\') goto yy112; + goto yy104; +yy110: + YYDEBUG(110, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(111, *YYCURSOR); + if (yybm[0+yych] & 4) { + goto yy110; + } + if (yych == '\\') goto yy114; + goto yy104; +yy112: + YYDEBUG(112, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(113, *YYCURSOR); + if (yybm[0+yych] & 4) { + goto yy110; + } + if (yych == '\\') goto yy112; + goto yy104; +yy114: + YYDEBUG(114, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + if (yybm[0+yych] & 4) { + goto yy110; + } + if (yych == '\\') goto yy112; + goto yy104; +yy115: + YYDEBUG(115, *YYCURSOR); + yyaccept = 3; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(116, *YYCURSOR); + if (yybm[0+yych] & 16) { + goto yy115; + } + if (yych <= '$') { + if (yych <= '\r') { + if (yych == '\n') goto yy100; + if (yych <= '\f') goto yy104; + goto yy100; + } else { + if (yych == '"') goto yy100; + if (yych <= '#') goto yy104; + goto yy107; + } + } else { + if (yych <= ';') { + if (yych == '\'') goto yy100; + if (yych <= ':') goto yy104; + goto yy100; + } else { + if (yych <= '[') goto yy104; + if (yych <= '\\') goto yy106; + if (yych <= ']') goto yy100; + goto yy104; + } + } +yy117: + YYDEBUG(117, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(118, *YYCURSOR); + if (yybm[0+yych] & 32) { + goto yy117; + } + if (yych <= '$') { + if (yych <= '\r') { + if (yych == '\n') goto yy98; + if (yych <= '\f') goto yy104; + goto yy98; + } else { + if (yych == '"') goto yy98; + if (yych <= '#') goto yy104; + goto yy107; + } + } else { + if (yych <= ';') { + if (yych == '\'') goto yy98; + if (yych <= ':') goto yy104; + goto yy98; + } else { + if (yych <= '[') goto yy104; + if (yych <= '\\') goto yy106; + if (yych <= ']') goto yy98; + goto yy104; + } + } +yy119: + YYDEBUG(119, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(120, *YYCURSOR); + if (yych <= '\'') { + if (yych <= '!') { + if (yych <= '\n') { + if (yych <= '\t') goto yy104; + goto yy98; + } else { + if (yych == '\r') goto yy98; + goto yy104; + } + } else { + if (yych <= '#') { + if (yych <= '"') goto yy98; + goto yy104; + } else { + if (yych <= '$') goto yy107; + if (yych <= '&') goto yy104; + goto yy98; + } + } + } else { + if (yych <= ':') { + if (yych <= '.') { + if (yych <= '-') goto yy104; + goto yy117; + } else { + if (yych <= '/') goto yy104; + if (yych <= '9') goto yy119; + goto yy104; + } + } else { + if (yych <= '[') { + if (yych <= ';') goto yy98; + goto yy104; + } else { + if (yych <= '\\') goto yy106; + if (yych <= ']') goto yy98; + goto yy104; + } + } + } +yy121: + YYDEBUG(121, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(122, *YYCURSOR); + if (yych <= '&') { + if (yych <= '\r') { + if (yych == '\n') goto yy98; + if (yych <= '\f') goto yy104; + goto yy98; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy104; + goto yy98; + } else { + if (yych == '$') goto yy107; + goto yy104; + } + } + } else { + if (yych <= ':') { + if (yych <= '\'') goto yy98; + if (yych <= '/') goto yy104; + if (yych <= '9') goto yy121; + goto yy104; + } else { + if (yych <= '[') { + if (yych <= ';') goto yy98; + goto yy104; + } else { + if (yych <= '\\') goto yy106; + if (yych <= ']') goto yy98; + goto yy104; + } + } + } +yy123: + YYDEBUG(123, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(124, *YYCURSOR); + if (yych <= '&') { + if (yych <= '\r') { + if (yych == '\n') goto yy98; + if (yych <= '\f') goto yy104; + goto yy98; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy104; + goto yy98; + } else { + if (yych == '$') goto yy107; + goto yy104; + } + } + } else { + if (yych <= ':') { + if (yych <= '\'') goto yy98; + if (yych <= '/') goto yy104; + if (yych <= '9') goto yy123; + goto yy104; + } else { + if (yych <= '[') { + if (yych <= ';') goto yy98; + goto yy104; + } else { + if (yych <= '\\') goto yy106; + if (yych <= ']') goto yy98; + goto yy104; + } + } + } +yy125: + YYDEBUG(125, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(126, *YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy125; + } + YYDEBUG(127, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(128, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 368 "Zend/zend_ini_scanner.l" + { /* Raw string */ + /* Eat leading and trailing single quotes */ + if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') { + SCNG(yy_text)++; + yyleng = yyleng - 2; + } + RETURN_TOKEN(TC_RAW, yytext, yyleng); +} +#line 1774 "Zend/zend_ini_scanner.c" +yy129: + YYDEBUG(129, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(130, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 401 "Zend/zend_ini_scanner.l" + { /* Variable start */ + yy_push_state(ST_VARNAME TSRMLS_CC); + return TC_DOLLAR_CURLY; +} +#line 1785 "Zend/zend_ini_scanner.c" +yy131: + YYDEBUG(131, *YYCURSOR); + yyaccept = 0; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(132, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy131; + } + if (yych <= '$') { + if (yych <= '\r') { + if (yych == '\n') goto yy87; + if (yych <= '\f') goto yy104; + goto yy87; + } else { + if (yych == '"') goto yy133; + if (yych <= '#') goto yy104; + goto yy107; + } + } else { + if (yych <= ';') { + if (yych == '\'') goto yy87; + if (yych <= ':') goto yy104; + goto yy87; + } else { + if (yych <= '[') goto yy104; + if (yych <= '\\') goto yy106; + if (yych <= ']') goto yy134; + goto yy104; + } + } +yy133: + YYDEBUG(133, *YYCURSOR); + yych = *++YYCURSOR; + goto yy92; +yy134: + YYDEBUG(134, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy103; + } +/* *********************************** */ +yyc_ST_RAW: + { + static const unsigned char yybm[] = { + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 192, 0, 64, 64, 0, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 192, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, + }; + YYDEBUG(135, *YYCURSOR); + YYFILL(3); + yych = *YYCURSOR; + if (yych <= '\f') { + if (yych <= 0x08) { + if (yych >= 0x01) goto yy139; + } else { + if (yych <= '\t') goto yy141; + if (yych <= '\n') goto yy142; + goto yy139; + } + } else { + if (yych <= ' ') { + if (yych <= '\r') goto yy144; + if (yych <= 0x1F) goto yy139; + goto yy141; + } else { + if (yych == ';') goto yy145; + goto yy139; + } + } + YYDEBUG(137, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(138, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 598 "Zend/zend_ini_scanner.l" + { /* End of option value (if EOF is reached before EOL */ + BEGIN(INITIAL); + return END_OF_LINE; +} +#line 1895 "Zend/zend_ini_scanner.c" +yy139: + YYDEBUG(139, *YYCURSOR); + ++YYCURSOR; +yy140: + YYDEBUG(140, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 448 "Zend/zend_ini_scanner.l" + { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */ + char *sc = NULL; + while (YYCURSOR < YYLIMIT) { + switch (*YYCURSOR) { + case '\n': + case '\r': + goto end_raw_value_chars; + break; + case ';': + if (sc == NULL) { + sc = YYCURSOR; + } + /* no break */ + default: + YYCURSOR++; + break; + } + } +end_raw_value_chars: + yyleng = YYCURSOR - SCNG(yy_text); + + /* Eat trailing semicolons */ + while (yytext[yyleng - 1] == ';') { + yyleng--; + } + + /* Eat leading and trailing double quotes */ + if (yytext[0] == '"' && yytext[yyleng - 1] == '"') { + SCNG(yy_text)++; + yyleng = yyleng - 2; + } else if (sc) { + YYCURSOR = sc; + yyleng = YYCURSOR - SCNG(yy_text); + } + RETURN_TOKEN(TC_RAW, yytext, yyleng); +} +#line 1939 "Zend/zend_ini_scanner.c" +yy141: + YYDEBUG(141, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '\r') { + if (yych <= 0x08) goto yy140; + if (yych <= '\n') goto yy153; + if (yych <= '\f') goto yy140; + goto yy153; + } else { + if (yych <= ' ') { + if (yych <= 0x1F) goto yy140; + goto yy153; + } else { + if (yych == ';') goto yy153; + goto yy140; + } + } +yy142: + YYDEBUG(142, *YYCURSOR); + ++YYCURSOR; +yy143: + YYDEBUG(143, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 489 "Zend/zend_ini_scanner.l" + { /* End of option value */ + BEGIN(INITIAL); + SCNG(lineno)++; + return END_OF_LINE; +} +#line 1970 "Zend/zend_ini_scanner.c" +yy144: + YYDEBUG(144, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy151; + goto yy143; +yy145: + YYDEBUG(145, *YYCURSOR); + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + goto yy147; +yy146: + YYDEBUG(146, *YYCURSOR); + ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy147: + YYDEBUG(147, *YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy146; + } + if (yych >= '\r') goto yy150; +yy148: + YYDEBUG(148, *YYCURSOR); + ++YYCURSOR; +yy149: + YYDEBUG(149, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 585 "Zend/zend_ini_scanner.l" + { /* Comment */ + BEGIN(INITIAL); + SCNG(lineno)++; + return END_OF_LINE; +} +#line 2004 "Zend/zend_ini_scanner.c" +yy150: + YYDEBUG(150, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy148; + goto yy149; +yy151: + YYDEBUG(151, *YYCURSOR); + yych = *++YYCURSOR; + goto yy143; +yy152: + YYDEBUG(152, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy153: + YYDEBUG(153, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy152; + } + if (yych <= '\f') { + if (yych == '\n') goto yy151; + } else { + if (yych <= '\r') goto yy155; + if (yych == ';') goto yy146; + } + YYDEBUG(154, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 575 "Zend/zend_ini_scanner.l" + { + /* eat whitespace */ + goto restart; +} +#line 2038 "Zend/zend_ini_scanner.c" +yy155: + YYDEBUG(155, *YYCURSOR); + ++YYCURSOR; + if ((yych = *YYCURSOR) == '\n') goto yy151; + goto yy143; + } +/* *********************************** */ +yyc_ST_SECTION_RAW: + { + static const unsigned char yybm[] = { + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 192, 0, 128, 128, 0, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 192, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 0, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + }; + YYDEBUG(156, *YYCURSOR); + YYFILL(3); + yych = *YYCURSOR; + if (yych <= '\f') { + if (yych == '\n') goto yy160; + } else { + if (yych <= '\r') goto yy160; + if (yych == ']') goto yy162; + } + YYDEBUG(158, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy169; +yy159: + YYDEBUG(159, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 485 "Zend/zend_ini_scanner.l" + { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */ + RETURN_TOKEN(TC_RAW, yytext, yyleng); +} +#line 2102 "Zend/zend_ini_scanner.c" +yy160: + YYDEBUG(160, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(161, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 603 "Zend/zend_ini_scanner.l" + { + return 0; +} +#line 2112 "Zend/zend_ini_scanner.c" +yy162: + YYDEBUG(162, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy165; +yy163: + YYDEBUG(163, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 377 "Zend/zend_ini_scanner.l" + { /* End of section */ + BEGIN(INITIAL); + SCNG(lineno)++; + return ']'; +} +#line 2127 "Zend/zend_ini_scanner.c" +yy164: + YYDEBUG(164, *YYCURSOR); + ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy165: + YYDEBUG(165, *YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy164; + } + if (yych == '\n') goto yy166; + if (yych == '\r') goto yy167; + goto yy163; +yy166: + YYDEBUG(166, *YYCURSOR); + yych = *++YYCURSOR; + goto yy163; +yy167: + YYDEBUG(167, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy166; + goto yy163; +yy168: + YYDEBUG(168, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy169: + YYDEBUG(169, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy168; + } + goto yy159; + } +/* *********************************** */ +yyc_ST_SECTION_VALUE: + { + static const unsigned char yybm[] = { + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 134, 128, 132, 132, 128, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 134, 132, 128, 132, 136, 132, 132, 0, + 132, 132, 132, 132, 132, 132, 132, 132, + 228, 228, 228, 228, 228, 228, 228, 228, + 228, 228, 132, 128, 132, 132, 132, 132, + 132, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 132, 144, 128, 132, 164, + 132, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + }; + YYDEBUG(170, *YYCURSOR); + YYFILL(3); + yych = *YYCURSOR; + if (yych <= '-') { + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x08) goto yy172; + if (yych <= '\t') goto yy174; + goto yy175; + } else { + if (yych == '\r') goto yy175; + if (yych >= ' ') goto yy174; + } + } else { + if (yych <= '$') { + if (yych == '"') goto yy177; + if (yych >= '$') goto yy179; + } else { + if (yych == '\'') goto yy180; + if (yych >= '-') goto yy181; + } + } + } else { + if (yych <= 'Z') { + if (yych <= '9') { + if (yych <= '.') goto yy182; + if (yych >= '0') goto yy183; + } else { + if (yych == ';') goto yy175; + if (yych >= 'A') goto yy185; + } + } else { + if (yych <= '^') { + if (yych <= '[') goto yy172; + if (yych <= '\\') goto yy187; + if (yych <= ']') goto yy188; + } else { + if (yych == '`') goto yy172; + if (yych <= 'z') goto yy185; + } + } + } +yy172: + YYDEBUG(172, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + goto yy195; +yy173: + YYDEBUG(173, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 521 "Zend/zend_ini_scanner.l" + { /* Get rest as section/offset value */ + RETURN_TOKEN(TC_STRING, yytext, yyleng); +} +#line 2253 "Zend/zend_ini_scanner.c" +yy174: + YYDEBUG(174, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x1F) { + if (yych == '\t') goto yy221; + goto yy195; + } else { + if (yych <= ' ') goto yy221; + if (yych == '"') goto yy223; + goto yy195; + } +yy175: + YYDEBUG(175, *YYCURSOR); + ++YYCURSOR; +yy176: + YYDEBUG(176, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 603 "Zend/zend_ini_scanner.l" + { + return 0; +} +#line 2276 "Zend/zend_ini_scanner.c" +yy177: + YYDEBUG(177, *YYCURSOR); + ++YYCURSOR; +yy178: + YYDEBUG(178, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 525 "Zend/zend_ini_scanner.l" + { /* Double quoted '"' string start */ + yy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC); + return '"'; +} +#line 2288 "Zend/zend_ini_scanner.c" +yy179: + YYDEBUG(179, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= '\\') { + if (yych <= 0x00) goto yy176; + if (yych <= '[') goto yy194; + goto yy199; + } else { + if (yych == '{') goto yy219; + goto yy194; + } +yy180: + YYDEBUG(180, *YYCURSOR); + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy215; + } + goto yy176; +yy181: + YYDEBUG(181, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '/') goto yy195; + if (yych <= '9') goto yy213; + goto yy195; +yy182: + YYDEBUG(182, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '/') goto yy195; + if (yych <= '9') goto yy211; + goto yy195; +yy183: + YYDEBUG(183, *YYCURSOR); + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '\'') { + if (yych <= '\r') { + if (yych == '\n') goto yy184; + if (yych <= '\f') goto yy195; + } else { + if (yych == '"') goto yy184; + if (yych <= '&') goto yy195; + } + } else { + if (yych <= '9') { + if (yych == '.') goto yy207; + if (yych <= '/') goto yy195; + goto yy209; + } else { + if (yych <= ';') { + if (yych <= ':') goto yy195; + } else { + if (yych != ']') goto yy195; + } + } + } +yy184: + YYDEBUG(184, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 499 "Zend/zend_ini_scanner.l" + { /* Get number option value as string */ + RETURN_TOKEN(TC_NUMBER, yytext, yyleng); +} +#line 2354 "Zend/zend_ini_scanner.c" +yy185: + YYDEBUG(185, *YYCURSOR); + yyaccept = 3; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 32) { + goto yy205; + } + if (yych <= '"') { + if (yych <= '\f') { + if (yych != '\n') goto yy195; + } else { + if (yych <= '\r') goto yy186; + if (yych <= '!') goto yy195; + } + } else { + if (yych <= ':') { + if (yych != '\'') goto yy195; + } else { + if (yych <= ';') goto yy186; + if (yych != ']') goto yy195; + } + } +yy186: + YYDEBUG(186, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 495 "Zend/zend_ini_scanner.l" + { /* Get constant option value */ + RETURN_TOKEN(TC_CONSTANT, yytext, yyleng); +} +#line 2384 "Zend/zend_ini_scanner.c" +yy187: + YYDEBUG(187, *YYCURSOR); + yych = *++YYCURSOR; + goto yy194; +yy188: + YYDEBUG(188, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy191; +yy189: + YYDEBUG(189, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 377 "Zend/zend_ini_scanner.l" + { /* End of section */ + BEGIN(INITIAL); + SCNG(lineno)++; + return ']'; +} +#line 2403 "Zend/zend_ini_scanner.c" +yy190: + YYDEBUG(190, *YYCURSOR); + ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy191: + YYDEBUG(191, *YYCURSOR); + if (yybm[0+yych] & 2) { + goto yy190; + } + if (yych == '\n') goto yy192; + if (yych == '\r') goto yy193; + goto yy189; +yy192: + YYDEBUG(192, *YYCURSOR); + yych = *++YYCURSOR; + goto yy189; +yy193: + YYDEBUG(193, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy192; + goto yy189; +yy194: + YYDEBUG(194, *YYCURSOR); + yyaccept = 0; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy195: + YYDEBUG(195, *YYCURSOR); + if (yybm[0+yych] & 4) { + goto yy194; + } + if (yych == '$') goto yy197; + if (yych != '\\') goto yy173; +yy196: + YYDEBUG(196, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + goto yy194; +yy197: + YYDEBUG(197, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + if (yych <= '\\') { + if (yych <= 0x00) goto yy198; + if (yych <= '[') goto yy194; + goto yy199; + } else { + if (yych != '{') goto yy194; + } +yy198: + YYDEBUG(198, *YYCURSOR); + YYCURSOR = YYMARKER; + if (yyaccept <= 1) { + if (yyaccept <= 0) { + goto yy173; + } else { + goto yy176; + } + } else { + if (yyaccept <= 2) { + goto yy184; + } else { + goto yy186; + } + } +yy199: + YYDEBUG(199, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + if (yybm[0+yych] & 8) { + goto yy200; + } + if (yych == '\\') goto yy202; + goto yy194; +yy200: + YYDEBUG(200, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(201, *YYCURSOR); + if (yybm[0+yych] & 8) { + goto yy200; + } + if (yych == '\\') goto yy204; + goto yy194; +yy202: + YYDEBUG(202, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(203, *YYCURSOR); + if (yybm[0+yych] & 8) { + goto yy200; + } + if (yych == '\\') goto yy202; + goto yy194; +yy204: + YYDEBUG(204, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + if (yybm[0+yych] & 8) { + goto yy200; + } + if (yych == '\\') goto yy202; + goto yy194; +yy205: + YYDEBUG(205, *YYCURSOR); + yyaccept = 3; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(206, *YYCURSOR); + if (yybm[0+yych] & 32) { + goto yy205; + } + if (yych <= '$') { + if (yych <= '\r') { + if (yych == '\n') goto yy186; + if (yych <= '\f') goto yy194; + goto yy186; + } else { + if (yych == '"') goto yy186; + if (yych <= '#') goto yy194; + goto yy197; + } + } else { + if (yych <= ';') { + if (yych == '\'') goto yy186; + if (yych <= ':') goto yy194; + goto yy186; + } else { + if (yych <= '[') goto yy194; + if (yych <= '\\') goto yy196; + if (yych <= ']') goto yy186; + goto yy194; + } + } +yy207: + YYDEBUG(207, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(208, *YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy207; + } + if (yych <= '$') { + if (yych <= '\r') { + if (yych == '\n') goto yy184; + if (yych <= '\f') goto yy194; + goto yy184; + } else { + if (yych == '"') goto yy184; + if (yych <= '#') goto yy194; + goto yy197; + } + } else { + if (yych <= ';') { + if (yych == '\'') goto yy184; + if (yych <= ':') goto yy194; + goto yy184; + } else { + if (yych <= '[') goto yy194; + if (yych <= '\\') goto yy196; + if (yych <= ']') goto yy184; + goto yy194; + } + } +yy209: + YYDEBUG(209, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(210, *YYCURSOR); + if (yych <= '\'') { + if (yych <= '!') { + if (yych <= '\n') { + if (yych <= '\t') goto yy194; + goto yy184; + } else { + if (yych == '\r') goto yy184; + goto yy194; + } + } else { + if (yych <= '#') { + if (yych <= '"') goto yy184; + goto yy194; + } else { + if (yych <= '$') goto yy197; + if (yych <= '&') goto yy194; + goto yy184; + } + } + } else { + if (yych <= ':') { + if (yych <= '.') { + if (yych <= '-') goto yy194; + goto yy207; + } else { + if (yych <= '/') goto yy194; + if (yych <= '9') goto yy209; + goto yy194; + } + } else { + if (yych <= '[') { + if (yych <= ';') goto yy184; + goto yy194; + } else { + if (yych <= '\\') goto yy196; + if (yych <= ']') goto yy184; + goto yy194; + } + } + } +yy211: + YYDEBUG(211, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(212, *YYCURSOR); + if (yych <= '&') { + if (yych <= '\r') { + if (yych == '\n') goto yy184; + if (yych <= '\f') goto yy194; + goto yy184; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy194; + goto yy184; + } else { + if (yych == '$') goto yy197; + goto yy194; + } + } + } else { + if (yych <= ':') { + if (yych <= '\'') goto yy184; + if (yych <= '/') goto yy194; + if (yych <= '9') goto yy211; + goto yy194; + } else { + if (yych <= '[') { + if (yych <= ';') goto yy184; + goto yy194; + } else { + if (yych <= '\\') goto yy196; + if (yych <= ']') goto yy184; + goto yy194; + } + } + } +yy213: + YYDEBUG(213, *YYCURSOR); + yyaccept = 2; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(214, *YYCURSOR); + if (yych <= '&') { + if (yych <= '\r') { + if (yych == '\n') goto yy184; + if (yych <= '\f') goto yy194; + goto yy184; + } else { + if (yych <= '"') { + if (yych <= '!') goto yy194; + goto yy184; + } else { + if (yych == '$') goto yy197; + goto yy194; + } + } + } else { + if (yych <= ':') { + if (yych <= '\'') goto yy184; + if (yych <= '/') goto yy194; + if (yych <= '9') goto yy213; + goto yy194; + } else { + if (yych <= '[') { + if (yych <= ';') goto yy184; + goto yy194; + } else { + if (yych <= '\\') goto yy196; + if (yych <= ']') goto yy184; + goto yy194; + } + } + } +yy215: + YYDEBUG(215, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(216, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy215; + } + YYDEBUG(217, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(218, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 368 "Zend/zend_ini_scanner.l" + { /* Raw string */ + /* Eat leading and trailing single quotes */ + if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') { + SCNG(yy_text)++; + yyleng = yyleng - 2; + } + RETURN_TOKEN(TC_RAW, yytext, yyleng); +} +#line 2724 "Zend/zend_ini_scanner.c" +yy219: + YYDEBUG(219, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(220, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 401 "Zend/zend_ini_scanner.l" + { /* Variable start */ + yy_push_state(ST_VARNAME TSRMLS_CC); + return TC_DOLLAR_CURLY; +} +#line 2735 "Zend/zend_ini_scanner.c" +yy221: + YYDEBUG(221, *YYCURSOR); + yyaccept = 0; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(222, *YYCURSOR); + if (yych <= '"') { + if (yych <= '\f') { + if (yych <= 0x08) goto yy194; + if (yych <= '\t') goto yy221; + if (yych <= '\n') goto yy173; + goto yy194; + } else { + if (yych <= 0x1F) { + if (yych <= '\r') goto yy173; + goto yy194; + } else { + if (yych <= ' ') goto yy221; + if (yych <= '!') goto yy194; + } + } + } else { + if (yych <= ':') { + if (yych <= '$') { + if (yych <= '#') goto yy194; + goto yy197; + } else { + if (yych == '\'') goto yy173; + goto yy194; + } + } else { + if (yych <= '[') { + if (yych <= ';') goto yy173; + goto yy194; + } else { + if (yych <= '\\') goto yy196; + if (yych <= ']') goto yy173; + goto yy194; + } + } + } +yy223: + YYDEBUG(223, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy178; + } +/* *********************************** */ +yyc_ST_VALUE: + { + static const unsigned char yybm[] = { + 160, 162, 162, 162, 162, 162, 162, 162, + 162, 176, 128, 162, 162, 128, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 176, 160, 160, 162, 168, 162, 160, 32, + 160, 160, 162, 162, 162, 162, 162, 162, + 230, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 162, 160, 162, 160, 162, 162, + 162, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 162, 162, 162, 160, 166, + 162, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 162, 160, 162, 160, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, + }; + YYDEBUG(224, *YYCURSOR); + YYFILL(6); + yych = *YYCURSOR; + YYDEBUG(-1, yych); + switch (yych) { + case 0x00: goto yy226; + case '\t': + case ' ': goto yy230; + case '\n': goto yy232; + case '\r': goto yy234; + case '!': + case '&': + case '(': + case ')': + case '^': + case '|': + case '~': goto yy235; + case '"': goto yy237; + case '$': goto yy239; + case '\'': goto yy240; + case '-': goto yy241; + case '.': goto yy242; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy243; + case ';': goto yy245; + case '=': goto yy246; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'p': + case 'q': + case 'r': + case 's': + case 'u': + case 'v': + case 'w': + case 'x': + case 'z': goto yy248; + case 'F': + case 'f': goto yy250; + case 'N': + case 'n': goto yy251; + case 'O': + case 'o': goto yy252; + case 'T': + case 't': goto yy253; + case 'Y': + case 'y': goto yy254; + default: goto yy228; + } +yy226: + YYDEBUG(226, *YYCURSOR); + ++YYCURSOR; +yy227: + YYDEBUG(227, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 598 "Zend/zend_ini_scanner.l" + { /* End of option value (if EOF is reached before EOL */ + BEGIN(INITIAL); + return END_OF_LINE; +} +#line 2921 "Zend/zend_ini_scanner.c" +yy228: + YYDEBUG(228, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + goto yy256; +yy229: + YYDEBUG(229, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 517 "Zend/zend_ini_scanner.l" + { /* Get everything else as option/offset value */ + RETURN_TOKEN(TC_STRING, yytext, yyleng); +} +#line 2934 "Zend/zend_ini_scanner.c" +yy230: + YYDEBUG(230, *YYCURSOR); + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + goto yy306; +yy231: + YYDEBUG(231, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 571 "Zend/zend_ini_scanner.l" + { + RETURN_TOKEN(TC_WHITESPACE, yytext, yyleng); +} +#line 2947 "Zend/zend_ini_scanner.c" +yy232: + YYDEBUG(232, *YYCURSOR); + ++YYCURSOR; +yy233: + YYDEBUG(233, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 489 "Zend/zend_ini_scanner.l" + { /* End of option value */ + BEGIN(INITIAL); + SCNG(lineno)++; + return END_OF_LINE; +} +#line 2960 "Zend/zend_ini_scanner.c" +yy234: + YYDEBUG(234, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy304; + goto yy233; +yy235: + YYDEBUG(235, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy303; +yy236: + YYDEBUG(236, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 507 "Zend/zend_ini_scanner.l" + { /* Boolean operators */ + return yytext[0]; +} +#line 2978 "Zend/zend_ini_scanner.c" +yy237: + YYDEBUG(237, *YYCURSOR); + ++YYCURSOR; +yy238: + YYDEBUG(238, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 525 "Zend/zend_ini_scanner.l" + { /* Double quoted '"' string start */ + yy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC); + return '"'; +} +#line 2990 "Zend/zend_ini_scanner.c" +yy239: + YYDEBUG(239, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= '\\') { + if (yych <= 0x00) goto yy227; + if (yych <= '[') goto yy255; + goto yy262; + } else { + if (yych == '{') goto yy300; + goto yy255; + } +yy240: + YYDEBUG(240, *YYCURSOR); + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy296; + } + goto yy227; +yy241: + YYDEBUG(241, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '/') goto yy256; + if (yych <= '9') goto yy294; + goto yy256; +yy242: + YYDEBUG(242, *YYCURSOR); + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '/') goto yy256; + if (yych <= '9') goto yy292; + goto yy256; +yy243: + YYDEBUG(243, *YYCURSOR); + yyaccept = 3; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x00) goto yy244; + if (yych <= 0x08) goto yy256; + } else { + if (yych != '\r') goto yy256; + } + } else { + if (yych <= ')') { + if (yych <= '"') goto yy244; + if (yych <= '%') goto yy256; + } else { + if (yych == '.') goto yy288; + goto yy256; + } + } + } else { + if (yych <= ']') { + if (yych <= ';') { + if (yych <= '9') goto yy290; + if (yych <= ':') goto yy256; + } else { + if (yych != '=') goto yy256; + } + } else { + if (yych <= '|') { + if (yych <= '^') goto yy244; + if (yych <= '{') goto yy256; + } else { + if (yych != '~') goto yy256; + } + } + } +yy244: + YYDEBUG(244, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 499 "Zend/zend_ini_scanner.l" + { /* Get number option value as string */ + RETURN_TOKEN(TC_NUMBER, yytext, yyleng); +} +#line 3069 "Zend/zend_ini_scanner.c" +yy245: + YYDEBUG(245, *YYCURSOR); + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + goto yy284; +yy246: + YYDEBUG(246, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(247, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 511 "Zend/zend_ini_scanner.l" + { /* Make = used in option value to trigger error */ + yyless(0); + BEGIN(INITIAL); + return END_OF_LINE; +} +#line 3086 "Zend/zend_ini_scanner.c" +yy248: + YYDEBUG(248, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 4) { + goto yy257; + } + if (yych <= ':') { + if (yych <= '\r') { + if (yych <= 0x08) { + if (yych >= 0x01) goto yy256; + } else { + if (yych <= '\n') goto yy249; + if (yych <= '\f') goto yy256; + } + } else { + if (yych <= '"') { + if (yych <= 0x1F) goto yy256; + } else { + if (yych <= '%') goto yy256; + if (yych >= '*') goto yy256; + } + } + } else { + if (yych <= '^') { + if (yych <= '<') { + if (yych >= '<') goto yy256; + } else { + if (yych <= '=') goto yy249; + if (yych <= ']') goto yy256; + } + } else { + if (yych <= '|') { + if (yych <= '{') goto yy256; + } else { + if (yych != '~') goto yy256; + } + } + } +yy249: + YYDEBUG(249, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 495 "Zend/zend_ini_scanner.l" + { /* Get constant option value */ + RETURN_TOKEN(TC_CONSTANT, yytext, yyleng); +} +#line 3133 "Zend/zend_ini_scanner.c" +yy250: + YYDEBUG(250, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '<') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '/') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + goto yy256; + } else { + if (yych <= '9') goto yy257; + if (yych == ';') goto yy249; + goto yy256; + } + } + } else { + if (yych <= '_') { + if (yych <= 'A') { + if (yych <= '=') goto yy249; + if (yych <= '@') goto yy256; + goto yy280; + } else { + if (yych <= 'Z') goto yy257; + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + goto yy257; + } + } else { + if (yych <= '{') { + if (yych <= '`') goto yy256; + if (yych <= 'a') goto yy280; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy251: + YYDEBUG(251, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 'N') { + if (yych <= '%') { + if (yych <= '\f') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + if (yych <= '\n') goto yy249; + goto yy256; + } else { + if (yych <= '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + if (yych <= '"') goto yy249; + goto yy256; + } + } else { + if (yych <= ':') { + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + if (yych <= '9') goto yy257; + goto yy256; + } else { + if (yych <= '<') { + if (yych <= ';') goto yy249; + goto yy256; + } else { + if (yych <= '=') goto yy249; + if (yych <= '@') goto yy256; + goto yy257; + } + } + } + } else { + if (yych <= 'n') { + if (yych <= 'Z') { + if (yych <= 'O') goto yy276; + if (yych == 'U') goto yy277; + goto yy257; + } else { + if (yych <= '^') { + if (yych <= ']') goto yy256; + goto yy249; + } else { + if (yych == '`') goto yy256; + goto yy257; + } + } + } else { + if (yych <= 'z') { + if (yych <= 'o') goto yy276; + if (yych == 'u') goto yy277; + goto yy257; + } else { + if (yych <= '|') { + if (yych <= '{') goto yy256; + goto yy249; + } else { + if (yych == '~') goto yy249; + goto yy256; + } + } + } + } +yy252: + YYDEBUG(252, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 'E') { + if (yych <= '%') { + if (yych <= '\f') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + if (yych <= '\n') goto yy249; + goto yy256; + } else { + if (yych <= '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + if (yych <= '"') goto yy249; + goto yy256; + } + } else { + if (yych <= ':') { + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + if (yych <= '9') goto yy257; + goto yy256; + } else { + if (yych <= '<') { + if (yych <= ';') goto yy249; + goto yy256; + } else { + if (yych <= '=') goto yy249; + if (yych <= '@') goto yy256; + goto yy257; + } + } + } + } else { + if (yych <= 'e') { + if (yych <= 'Z') { + if (yych <= 'F') goto yy271; + if (yych == 'N') goto yy265; + goto yy257; + } else { + if (yych <= '^') { + if (yych <= ']') goto yy256; + goto yy249; + } else { + if (yych == '`') goto yy256; + goto yy257; + } + } + } else { + if (yych <= 'z') { + if (yych <= 'f') goto yy271; + if (yych == 'n') goto yy265; + goto yy257; + } else { + if (yych <= '|') { + if (yych <= '{') goto yy256; + goto yy249; + } else { + if (yych == '~') goto yy249; + goto yy256; + } + } + } + } +yy253: + YYDEBUG(253, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych == 'R') goto yy269; + goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'r') goto yy269; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy254: + YYDEBUG(254, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych == 'E') goto yy259; + goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'e') goto yy259; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy255: + YYDEBUG(255, *YYCURSOR); + yyaccept = 0; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy256: + YYDEBUG(256, *YYCURSOR); + if (yybm[0+yych] & 2) { + goto yy255; + } + if (yych == '$') goto yy260; + goto yy229; +yy257: + YYDEBUG(257, *YYCURSOR); + yyaccept = 4; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(258, *YYCURSOR); + if (yybm[0+yych] & 4) { + goto yy257; + } + if (yych <= ')') { + if (yych <= '\r') { + if (yych <= 0x08) { + if (yych <= 0x00) goto yy249; + goto yy255; + } else { + if (yych <= '\n') goto yy249; + if (yych <= '\f') goto yy255; + goto yy249; + } + } else { + if (yych <= '#') { + if (yych <= 0x1F) goto yy255; + if (yych <= '"') goto yy249; + goto yy255; + } else { + if (yych <= '$') goto yy260; + if (yych <= '%') goto yy255; + goto yy249; + } + } + } else { + if (yych <= ']') { + if (yych <= ';') { + if (yych <= ':') goto yy255; + goto yy249; + } else { + if (yych == '=') goto yy249; + goto yy255; + } + } else { + if (yych <= '|') { + if (yych <= '^') goto yy249; + if (yych <= '{') goto yy255; + goto yy249; + } else { + if (yych == '~') goto yy249; + goto yy255; + } + } + } +yy259: + YYDEBUG(259, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych == 'S') goto yy265; + goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 's') goto yy265; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy260: + YYDEBUG(260, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + if (yych <= '\\') { + if (yych <= 0x00) goto yy261; + if (yych <= '[') goto yy255; + goto yy262; + } else { + if (yych != '{') goto yy255; + } +yy261: + YYDEBUG(261, *YYCURSOR); + YYCURSOR = YYMARKER; + if (yyaccept <= 3) { + if (yyaccept <= 1) { + if (yyaccept <= 0) { + goto yy229; + } else { + goto yy231; + } + } else { + if (yyaccept <= 2) { + goto yy227; + } else { + goto yy244; + } + } + } else { + if (yyaccept <= 5) { + if (yyaccept <= 4) { + goto yy249; + } else { + goto yy266; + } + } else { + goto yy273; + } + } +yy262: + YYDEBUG(262, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + if (yybm[0+yych] & 8) { + goto yy263; + } + goto yy255; +yy263: + YYDEBUG(263, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(264, *YYCURSOR); + if (yybm[0+yych] & 8) { + goto yy263; + } + if (yych <= 0x00) goto yy229; + if (yych == '\\') goto yy262; + goto yy255; +yy265: + YYDEBUG(265, *YYCURSOR); + yyaccept = 5; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 16) { + goto yy267; + } + if (yych <= ';') { + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy266; + if (yych <= '\t') goto yy256; + } else { + if (yych != '\r') goto yy256; + } + } else { + if (yych <= ')') { + if (yych <= '"') goto yy266; + if (yych <= '%') goto yy256; + } else { + if (yych <= '/') goto yy256; + if (yych <= '9') goto yy257; + if (yych <= ':') goto yy256; + } + } + } else { + if (yych <= '_') { + if (yych <= '@') { + if (yych != '=') goto yy256; + } else { + if (yych <= 'Z') goto yy257; + if (yych <= ']') goto yy256; + if (yych >= '_') goto yy257; + } + } else { + if (yych <= '{') { + if (yych <= '`') goto yy256; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych >= 0x7F) goto yy256; + } + } + } +yy266: + YYDEBUG(266, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 421 "Zend/zend_ini_scanner.l" + { /* TRUE value (when used outside option value/offset this causes parse error!) */ + RETURN_TOKEN(BOOL_TRUE, "1", 1); +} +#line 3645 "Zend/zend_ini_scanner.c" +yy267: + YYDEBUG(267, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(268, *YYCURSOR); + if (yybm[0+yych] & 16) { + goto yy267; + } + goto yy266; +yy269: + YYDEBUG(269, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych != 'U') goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'u') goto yy270; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy270: + YYDEBUG(270, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych == 'E') goto yy265; + goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'e') goto yy265; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy271: + YYDEBUG(271, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych != 'F') goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'f') goto yy272; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy272: + YYDEBUG(272, *YYCURSOR); + yyaccept = 6; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 4) { + goto yy257; + } + if (yych <= ')') { + if (yych <= '\f') { + if (yych <= 0x08) { + if (yych >= 0x01) goto yy256; + } else { + if (yych <= '\t') goto yy274; + if (yych >= '\v') goto yy256; + } + } else { + if (yych <= ' ') { + if (yych <= '\r') goto yy273; + if (yych <= 0x1F) goto yy256; + goto yy274; + } else { + if (yych <= '"') goto yy273; + if (yych <= '%') goto yy256; + } + } + } else { + if (yych <= ']') { + if (yych <= ';') { + if (yych <= ':') goto yy256; + } else { + if (yych != '=') goto yy256; + } + } else { + if (yych <= '|') { + if (yych <= '^') goto yy273; + if (yych <= '{') goto yy256; + } else { + if (yych != '~') goto yy256; + } + } + } +yy273: + YYDEBUG(273, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 425 "Zend/zend_ini_scanner.l" + { /* FALSE value (when used outside option value/offset this causes parse error!)*/ + RETURN_TOKEN(BOOL_FALSE, "", 0); +} +#line 3855 "Zend/zend_ini_scanner.c" +yy274: + YYDEBUG(274, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(275, *YYCURSOR); + if (yych == '\t') goto yy274; + if (yych == ' ') goto yy274; + goto yy273; +yy276: + YYDEBUG(276, *YYCURSOR); + yyaccept = 6; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '<') { + if (yych <= ' ') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy273; + if (yych <= 0x08) goto yy256; + if (yych <= '\t') goto yy274; + goto yy273; + } else { + if (yych == '\r') goto yy273; + if (yych <= 0x1F) goto yy256; + goto yy274; + } + } else { + if (yych <= '/') { + if (yych <= '"') goto yy273; + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy273; + goto yy256; + } else { + if (yych <= '9') goto yy257; + if (yych == ';') goto yy273; + goto yy256; + } + } + } else { + if (yych <= '_') { + if (yych <= 'N') { + if (yych <= '=') goto yy273; + if (yych <= '@') goto yy256; + if (yych <= 'M') goto yy257; + goto yy279; + } else { + if (yych <= 'Z') goto yy257; + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy273; + goto yy257; + } + } else { + if (yych <= 'z') { + if (yych <= '`') goto yy256; + if (yych == 'n') goto yy279; + goto yy257; + } else { + if (yych <= '|') { + if (yych <= '{') goto yy256; + goto yy273; + } else { + if (yych == '~') goto yy273; + goto yy256; + } + } + } + } +yy277: + YYDEBUG(277, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych != 'L') goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'l') goto yy278; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy278: + YYDEBUG(278, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych == 'L') goto yy272; + goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'l') goto yy272; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy279: + YYDEBUG(279, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych == 'E') goto yy272; + goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'e') goto yy272; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy280: + YYDEBUG(280, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych != 'L') goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'l') goto yy281; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy281: + YYDEBUG(281, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych != 'S') goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 's') goto yy282; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy282: + YYDEBUG(282, *YYCURSOR); + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= '=') { + if (yych <= '"') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy249; + if (yych <= 0x08) goto yy256; + goto yy249; + } else { + if (yych == '\r') goto yy249; + if (yych <= 0x1F) goto yy256; + goto yy249; + } + } else { + if (yych <= '9') { + if (yych <= '%') goto yy256; + if (yych <= ')') goto yy249; + if (yych <= '/') goto yy256; + goto yy257; + } else { + if (yych == ';') goto yy249; + if (yych <= '<') goto yy256; + goto yy249; + } + } + } else { + if (yych <= '`') { + if (yych <= 'Z') { + if (yych <= '@') goto yy256; + if (yych == 'E') goto yy272; + goto yy257; + } else { + if (yych <= ']') goto yy256; + if (yych <= '^') goto yy249; + if (yych <= '_') goto yy257; + goto yy256; + } + } else { + if (yych <= '{') { + if (yych == 'e') goto yy272; + if (yych <= 'z') goto yy257; + goto yy256; + } else { + if (yych == '}') goto yy256; + if (yych <= '~') goto yy249; + goto yy256; + } + } + } +yy283: + YYDEBUG(283, *YYCURSOR); + ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy284: + YYDEBUG(284, *YYCURSOR); + if (yybm[0+yych] & 32) { + goto yy283; + } + if (yych >= '\r') goto yy287; +yy285: + YYDEBUG(285, *YYCURSOR); + ++YYCURSOR; +yy286: + YYDEBUG(286, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 585 "Zend/zend_ini_scanner.l" + { /* Comment */ + BEGIN(INITIAL); + SCNG(lineno)++; + return END_OF_LINE; +} +#line 4248 "Zend/zend_ini_scanner.c" +yy287: + YYDEBUG(287, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy285; + goto yy286; +yy288: + YYDEBUG(288, *YYCURSOR); + yyaccept = 3; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(289, *YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy288; + } + if (yych <= ')') { + if (yych <= '\r') { + if (yych <= 0x08) { + if (yych <= 0x00) goto yy244; + goto yy255; + } else { + if (yych <= '\n') goto yy244; + if (yych <= '\f') goto yy255; + goto yy244; + } + } else { + if (yych <= '#') { + if (yych <= 0x1F) goto yy255; + if (yych <= '"') goto yy244; + goto yy255; + } else { + if (yych <= '$') goto yy260; + if (yych <= '%') goto yy255; + goto yy244; + } + } + } else { + if (yych <= ']') { + if (yych <= ';') { + if (yych <= ':') goto yy255; + goto yy244; + } else { + if (yych == '=') goto yy244; + goto yy255; + } + } else { + if (yych <= '|') { + if (yych <= '^') goto yy244; + if (yych <= '{') goto yy255; + goto yy244; + } else { + if (yych == '~') goto yy244; + goto yy255; + } + } + } +yy290: + YYDEBUG(290, *YYCURSOR); + yyaccept = 3; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(291, *YYCURSOR); + if (yych <= '.') { + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x00) goto yy244; + if (yych <= 0x08) goto yy255; + goto yy244; + } else { + if (yych == '\r') goto yy244; + goto yy255; + } + } else { + if (yych <= '$') { + if (yych <= '"') goto yy244; + if (yych <= '#') goto yy255; + goto yy260; + } else { + if (yych <= '%') goto yy255; + if (yych <= ')') goto yy244; + if (yych <= '-') goto yy255; + goto yy288; + } + } + } else { + if (yych <= '=') { + if (yych <= ':') { + if (yych <= '/') goto yy255; + if (yych <= '9') goto yy290; + goto yy255; + } else { + if (yych == '<') goto yy255; + goto yy244; + } + } else { + if (yych <= '{') { + if (yych == '^') goto yy244; + goto yy255; + } else { + if (yych == '}') goto yy255; + if (yych <= '~') goto yy244; + goto yy255; + } + } + } +yy292: + YYDEBUG(292, *YYCURSOR); + yyaccept = 3; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(293, *YYCURSOR); + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x00) goto yy244; + if (yych <= 0x08) goto yy255; + goto yy244; + } else { + if (yych == '\r') goto yy244; + goto yy255; + } + } else { + if (yych <= '$') { + if (yych <= '"') goto yy244; + if (yych <= '#') goto yy255; + goto yy260; + } else { + if (yych <= '%') goto yy255; + if (yych <= ')') goto yy244; + goto yy255; + } + } + } else { + if (yych <= ']') { + if (yych <= ';') { + if (yych <= '9') goto yy292; + if (yych <= ':') goto yy255; + goto yy244; + } else { + if (yych == '=') goto yy244; + goto yy255; + } + } else { + if (yych <= '|') { + if (yych <= '^') goto yy244; + if (yych <= '{') goto yy255; + goto yy244; + } else { + if (yych == '~') goto yy244; + goto yy255; + } + } + } +yy294: + YYDEBUG(294, *YYCURSOR); + yyaccept = 3; + YYMARKER = ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(295, *YYCURSOR); + if (yych <= '/') { + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x00) goto yy244; + if (yych <= 0x08) goto yy255; + goto yy244; + } else { + if (yych == '\r') goto yy244; + goto yy255; + } + } else { + if (yych <= '$') { + if (yych <= '"') goto yy244; + if (yych <= '#') goto yy255; + goto yy260; + } else { + if (yych <= '%') goto yy255; + if (yych <= ')') goto yy244; + goto yy255; + } + } + } else { + if (yych <= ']') { + if (yych <= ';') { + if (yych <= '9') goto yy294; + if (yych <= ':') goto yy255; + goto yy244; + } else { + if (yych == '=') goto yy244; + goto yy255; + } + } else { + if (yych <= '|') { + if (yych <= '^') goto yy244; + if (yych <= '{') goto yy255; + goto yy244; + } else { + if (yych == '~') goto yy244; + goto yy255; + } + } + } +yy296: + YYDEBUG(296, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(297, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy296; + } + YYDEBUG(298, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(299, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 368 "Zend/zend_ini_scanner.l" + { /* Raw string */ + /* Eat leading and trailing single quotes */ + if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') { + SCNG(yy_text)++; + yyleng = yyleng - 2; + } + RETURN_TOKEN(TC_RAW, yytext, yyleng); +} +#line 4475 "Zend/zend_ini_scanner.c" +yy300: + YYDEBUG(300, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(301, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 401 "Zend/zend_ini_scanner.l" + { /* Variable start */ + yy_push_state(ST_VARNAME TSRMLS_CC); + return TC_DOLLAR_CURLY; +} +#line 4486 "Zend/zend_ini_scanner.c" +yy302: + YYDEBUG(302, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy303: + YYDEBUG(303, *YYCURSOR); + if (yych == '\t') goto yy302; + if (yych == ' ') goto yy302; + goto yy236; +yy304: + YYDEBUG(304, *YYCURSOR); + yych = *++YYCURSOR; + goto yy233; +yy305: + YYDEBUG(305, *YYCURSOR); + yyaccept = 1; + YYMARKER = ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; +yy306: + YYDEBUG(306, *YYCURSOR); + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x08) goto yy231; + if (yych <= '\t') goto yy305; + goto yy304; + } else { + if (yych == '\r') goto yy308; + goto yy231; + } + } else { + if (yych <= '"') { + if (yych <= ' ') goto yy305; + if (yych <= '!') goto yy231; + } else { + if (yych == ';') goto yy283; + goto yy231; + } + } + YYDEBUG(307, *YYCURSOR); + yych = *++YYCURSOR; + goto yy238; +yy308: + YYDEBUG(308, *YYCURSOR); + ++YYCURSOR; + if ((yych = *YYCURSOR) == '\n') goto yy304; + goto yy233; + } +/* *********************************** */ +yyc_ST_VARNAME: + { + static const unsigned char yybm[] = { + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 0, 0, 128, 128, 0, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 0, 0, 128, 0, 128, 0, 128, + 0, 0, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 128, 0, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 128, 128, 0, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + }; + YYDEBUG(309, *YYCURSOR); + YYFILL(2); + yych = *YYCURSOR; + if (yych <= ')') { + if (yych <= '"') { + if (yych <= '\f') { + if (yych <= 0x08) goto yy311; + if (yych <= '\n') goto yy313; + } else { + if (yych <= '\r') goto yy313; + if (yych >= '!') goto yy313; + } + } else { + if (yych <= '%') { + if (yych == '$') goto yy313; + } else { + if (yych != '\'') goto yy313; + } + } + } else { + if (yych <= '[') { + if (yych <= '<') { + if (yych == ';') goto yy313; + } else { + if (yych <= '=') goto yy313; + if (yych >= '[') goto yy313; + } + } else { + if (yych <= 'z') { + if (yych == '^') goto yy313; + } else { + if (yych == '}') goto yy315; + if (yych <= '~') goto yy313; + } + } + } +yy311: + YYDEBUG(311, *YYCURSOR); + ++YYCURSOR; + yych = *YYCURSOR; + goto yy318; +yy312: + YYDEBUG(312, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 406 "Zend/zend_ini_scanner.l" + { /* Variable name */ + /* Eat leading whitespace */ + EAT_LEADING_WHITESPACE(); + + /* Eat trailing whitespace */ + EAT_TRAILING_WHITESPACE(); + + RETURN_TOKEN(TC_VARNAME, yytext, yyleng); +} +#line 4627 "Zend/zend_ini_scanner.c" +yy313: + YYDEBUG(313, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(314, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 603 "Zend/zend_ini_scanner.l" + { + return 0; +} +#line 4637 "Zend/zend_ini_scanner.c" +yy315: + YYDEBUG(315, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(316, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 416 "Zend/zend_ini_scanner.l" + { /* Variable end */ + yy_pop_state(TSRMLS_C); + return '}'; +} +#line 4648 "Zend/zend_ini_scanner.c" +yy317: + YYDEBUG(317, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; +yy318: + YYDEBUG(318, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy317; + } + goto yy312; + } +} +#line 607 "Zend/zend_ini_scanner.l" + +} diff --git a/Zend/zend_language_scanner.c b/Zend/zend_language_scanner.c index 12ee1f59c2da0..76e3e5645129a 100644 --- a/Zend/zend_language_scanner.c +++ b/Zend/zend_language_scanner.c @@ -49,7 +49,7 @@ #include "zend_API.h" #include "zend_strtod.h" #include "zend_exceptions.h" -#include "tsrm_virtual_cwd.h" +#include "zend_virtual_cwd.h" #include "tsrm_config_common.h" #define YYCTYPE unsigned char diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index f620cb8b4695b..736d7712d5ab8 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -47,7 +47,7 @@ #include "zend_API.h" #include "zend_strtod.h" #include "zend_exceptions.h" -#include "tsrm_virtual_cwd.h" +#include "zend_virtual_cwd.h" #include "tsrm_config_common.h" #define YYCTYPE unsigned char diff --git a/TSRM/tsrm_virtual_cwd.c b/Zend/zend_virtual_cwd.c similarity index 99% rename from TSRM/tsrm_virtual_cwd.c rename to Zend/zend_virtual_cwd.c index a7d09630a26c7..e535e5c8db68e 100644 --- a/TSRM/tsrm_virtual_cwd.c +++ b/Zend/zend_virtual_cwd.c @@ -30,7 +30,7 @@ #include #include -#include "tsrm_virtual_cwd.h" +#include "zend_virtual_cwd.h" #include "tsrm_strtok_r.h" #ifdef TSRM_WIN32 diff --git a/TSRM/tsrm_virtual_cwd.h b/Zend/zend_virtual_cwd.h similarity index 100% rename from TSRM/tsrm_virtual_cwd.h rename to Zend/zend_virtual_cwd.h diff --git a/configure.in b/configure.in index 16738fe30ab67..805aa48f5940f 100644 --- a/configure.in +++ b/configure.in @@ -1440,7 +1440,7 @@ PHP_SUBST(install_binary_targets) PHP_INSTALL_HEADERS([Zend/ TSRM/ include/ main/ main/streams/]) -PHP_ADD_SOURCES(TSRM, TSRM.c tsrm_strtok_r.c tsrm_virtual_cwd.c) +PHP_ADD_SOURCES(TSRM, TSRM.c tsrm_strtok_r.c) PHP_ADD_SOURCES(main, main.c snprintf.c spprintf.c php_sprintf.c \ fopen_wrappers.c alloca.c php_scandir.c \ @@ -1475,7 +1475,8 @@ PHP_ADD_SOURCES(Zend, \ zend_list.c zend_indent.c zend_builtin_functions.c zend_sprintf.c \ zend_ini.c zend_qsort.c zend_multibyte.c zend_ts_hash.c zend_stream.c \ zend_iterators.c zend_interfaces.c zend_exceptions.c zend_strtod.c zend_gc.c \ - zend_closures.c zend_float.c zend_string.c zend_signal.c zend_generators.c) + zend_closures.c zend_float.c zend_string.c zend_signal.c zend_generators.c \ + zend_virtual_cwd.c) if test -r "$abs_srcdir/Zend/zend_objects.c"; then PHP_ADD_SOURCES(Zend, zend_objects.c zend_object_handlers.c zend_objects_API.c zend_default_classes.c) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 2860562a4539c..a546a77cb6b92 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -36,7 +36,7 @@ #include "main/php_open_temporary_file.h" #include "zend_API.h" #include "zend_ini.h" -#include "TSRM/tsrm_virtual_cwd.h" +#include "zend_virtual_cwd.h" #include "zend_accelerator_util_funcs.h" #include "zend_accelerator_hash.h" diff --git a/ext/opcache/zend_accelerator_module.c b/ext/opcache/zend_accelerator_module.c index dedb7215c1df3..7fbd9634ca6df 100644 --- a/ext/opcache/zend_accelerator_module.c +++ b/ext/opcache/zend_accelerator_module.c @@ -28,7 +28,7 @@ #include "zend_accelerator_blacklist.h" #include "php_ini.h" #include "SAPI.h" -#include "TSRM/tsrm_virtual_cwd.h" +#include "zend_virtual_cwd.h" #include "ext/standard/info.h" #include "ext/standard/php_filestat.h" diff --git a/ext/soap/php_sdl.c b/ext/soap/php_sdl.c index 0ac4c2ed7a9bf..2748eda070768 100644 --- a/ext/soap/php_sdl.c +++ b/ext/soap/php_sdl.c @@ -24,7 +24,7 @@ #include "libxml/uri.h" #include "ext/standard/md5.h" -#include "tsrm_virtual_cwd.h" +#include "zend_virtual_cwd.h" #include #include diff --git a/main/php.h b/main/php.h index 17ac8b4fd29d9..f9c6f2030c839 100644 --- a/main/php.h +++ b/main/php.h @@ -400,7 +400,7 @@ END_EXTERN_C() /* Virtual current working directory support */ -#include "tsrm_virtual_cwd.h" +#include "zend_virtual_cwd.h" #include "zend_constants.h" diff --git a/win32/build/config.w32 b/win32/build/config.w32 index 3401205c8fc1e..af92eb0d4c050 100644 --- a/win32/build/config.w32 +++ b/win32/build/config.w32 @@ -364,7 +364,7 @@ ADD_SOURCES("Zend", "zend_language_parser.c zend_language_scanner.c \ zend_stream.c zend_iterators.c zend_interfaces.c zend_objects.c \ zend_object_handlers.c zend_objects_API.c \ zend_default_classes.c zend_execute.c zend_strtod.c zend_gc.c zend_closures.c \ - zend_float.c zend_string.c zend_generators.c"); + zend_float.c zend_string.c zend_generators.c zend_virtual_cwd.c"); if (VCVERS == 1200) { AC_DEFINE('ZEND_DVAL_TO_LVAL_CAST_OK', 1); From cf6ab0e915f95f01a8db1ce7daf70ed36cf49c66 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Thu, 17 Oct 2013 10:40:43 +0200 Subject: [PATCH 256/400] applied and fixed the original patch initial work on the patch import done --- Zend/zend.c | 12 ++++ Zend/zend_virtual_cwd.c | 117 +++++++++++++++++++-------------- Zend/zend_virtual_cwd.h | 2 + ext/zip/php_zip.c | 16 ++--- main/SAPI.c | 4 -- main/fopen_wrappers.c | 6 +- main/main.c | 16 ++--- main/php_open_temporary_file.c | 10 +-- main/streams/plain_wrapper.c | 2 +- 9 files changed, 106 insertions(+), 79 deletions(-) diff --git a/Zend/zend.c b/Zend/zend.c index 11baf34c93566..b98d264a3c050 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -30,6 +30,7 @@ #include "zend_ini.h" #include "zend_vm.h" #include "zend_dtrace.h" +#include "zend_virtual_cwd.h" #ifdef ZTS # define GLOBAL_FUNCTION_TABLE global_function_table @@ -652,6 +653,8 @@ int zend_startup(zend_utility_functions *utility_functions, char **extensions TS start_memory_manager(TSRMLS_C); + virtual_cwd_startup(); /* Could use shutdown to free the main cwd but it would just slow it down for CGI */ + #if defined(__FreeBSD__) || defined(__DragonFly__) /* FreeBSD and DragonFly floating point precision fix */ fpsetmask(0); @@ -802,9 +805,14 @@ void zend_post_startup(TSRMLS_D) /* {{{ */ compiler_globals_ctor(compiler_globals, tsrm_ls); } free(EG(zend_constants)); + + virtual_cwd_deactivate(TSRMLS_C); + executor_globals_ctor(executor_globals, tsrm_ls); global_persistent_list = &EG(persistent_list); zend_copy_ini_directives(TSRMLS_C); +#else + virtual_cwd_deactivate(TSRMLS_C); #endif } /* }}} */ @@ -820,6 +828,9 @@ void zend_shutdown(TSRMLS_D) /* {{{ */ zend_destroy_rsrc_list(&EG(persistent_list) TSRMLS_CC); zend_destroy_modules(); + virtual_cwd_deactivate(TSRMLS_C); + virtual_cwd_shutdown(); + zend_hash_destroy(GLOBAL_FUNCTION_TABLE); zend_hash_destroy(GLOBAL_CLASS_TABLE); @@ -910,6 +921,7 @@ ZEND_API char *get_zend_version(void) /* {{{ */ void zend_activate(TSRMLS_D) /* {{{ */ { + virtual_cwd_activate(TSRMLS_C); gc_reset(TSRMLS_C); init_compiler(TSRMLS_C); init_executor(TSRMLS_C); diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c index e535e5c8db68e..968390d353925 100644 --- a/Zend/zend_virtual_cwd.c +++ b/Zend/zend_virtual_cwd.c @@ -30,6 +30,7 @@ #include #include +#include "zend.h" #include "zend_virtual_cwd.h" #include "tsrm_strtok_r.h" @@ -149,11 +150,12 @@ static int php_check_dots(const char *element, int n) #define CWD_STATE_COPY(d, s) \ (d)->cwd_length = (s)->cwd_length; \ - (d)->cwd = (char *) malloc((s)->cwd_length+1); \ + (d)->cwd = (char *) emalloc((s)->cwd_length+1); \ memcpy((d)->cwd, (s)->cwd, (s)->cwd_length+1); #define CWD_STATE_FREE(s) \ - free((s)->cwd); + efree((s)->cwd); \ + (s)->cwd = NULL; #ifdef TSRM_WIN32 @@ -337,16 +339,15 @@ CWD_API int php_sys_stat_ex(const char *path, struct stat *buf, int lstat) /* {{ HANDLE hLink = NULL; REPARSE_DATA_BUFFER * pbuffer; unsigned int retlength = 0; - TSRM_ALLOCA_FLAG(use_heap_large); hLink = CreateFile(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, NULL); if(hLink == INVALID_HANDLE_VALUE) { return -1; } - pbuffer = (REPARSE_DATA_BUFFER *)tsrm_do_alloca(MAXIMUM_REPARSE_DATA_BUFFER_SIZE, use_heap_large); + pbuffer = (REPARSE_DATA_BUFFER *)emalloc(MAXIMUM_REPARSE_DATA_BUFFER_SIZE); if(!DeviceIoControl(hLink, FSCTL_GET_REPARSE_POINT, NULL, 0, pbuffer, MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &retlength, NULL)) { - tsrm_free_alloca(pbuffer, use_heap_large); + efree(pbuffer); CloseHandle(hLink); return -1; } @@ -363,7 +364,7 @@ CWD_API int php_sys_stat_ex(const char *path, struct stat *buf, int lstat) /* {{ buf->st_mode |=; } #endif - tsrm_free_alloca(pbuffer, use_heap_large); + efree(pbuffer); } else { buf->st_mode = (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? (S_IFDIR|S_IEXEC|(S_IEXEC>>3)|(S_IEXEC>>6)) : S_IFREG; buf->st_mode |= (data.dwFileAttributes & FILE_ATTRIBUTE_READONLY) ? (S_IREAD|(S_IREAD>>3)|(S_IREAD>>6)) : (S_IREAD|(S_IREAD>>3)|(S_IREAD>>6)|S_IWRITE|(S_IWRITE>>3)|(S_IWRITE>>6)); @@ -424,12 +425,13 @@ static void cwd_globals_ctor(virtual_cwd_globals *cwd_g TSRMLS_DC) /* {{{ */ cwd_g->realpath_cache_size_limit = REALPATH_CACHE_SIZE; cwd_g->realpath_cache_ttl = REALPATH_CACHE_TTL; memset(cwd_g->realpath_cache, 0, sizeof(cwd_g->realpath_cache)); + virtual_cwd_activate(TSRMLS_C); } /* }}} */ static void cwd_globals_dtor(virtual_cwd_globals *cwd_g TSRMLS_DC) /* {{{ */ { - CWD_STATE_FREE(&cwd_g->cwd); +/* CWD_STATE_FREE(&cwd_globals->cwd); */ realpath_cache_clean(TSRMLS_C); } /* }}} */ @@ -490,6 +492,24 @@ CWD_API void virtual_cwd_shutdown(void) /* {{{ */ } /* }}} */ +CWD_API int virtual_cwd_activate(TSRMLS_D) /* {{{ */ +{ + if (CWDG(cwd).cwd == NULL) { + CWD_STATE_COPY(&CWDG(cwd), &main_cwd_state); + } + return 0; +} +/* }}} */ + +CWD_API int virtual_cwd_deactivate(TSRMLS_D) /* {{{ */ +{ + if (CWDG(cwd).cwd != NULL) { + CWD_STATE_FREE(&CWDG(cwd)); + } + return 0; +} +/* }}} */ + CWD_API char *virtual_getcwd_ex(size_t *length TSRMLS_DC) /* {{{ */ { cwd_state *state; @@ -500,7 +520,7 @@ CWD_API char *virtual_getcwd_ex(size_t *length TSRMLS_DC) /* {{{ */ char *retval; *length = 1; - retval = (char *) malloc(2); + retval = (char *) emalloc(2); if (retval == NULL) { return NULL; } @@ -515,7 +535,7 @@ CWD_API char *virtual_getcwd_ex(size_t *length TSRMLS_DC) /* {{{ */ char *retval; *length = state->cwd_length+1; - retval = (char *) malloc(*length+1); + retval = (char *) emalloc(*length+1); if (retval == NULL) { return NULL; } @@ -527,7 +547,7 @@ CWD_API char *virtual_getcwd_ex(size_t *length TSRMLS_DC) /* {{{ */ } #endif *length = state->cwd_length; - return strdup(state->cwd); + return estrdup(state->cwd); } /* }}} */ @@ -543,12 +563,12 @@ CWD_API char *virtual_getcwd(char *buf, size_t size TSRMLS_DC) /* {{{ */ return cwd; } if (length > size-1) { - free(cwd); + efree(cwd); errno = ERANGE; /* Is this OK? */ return NULL; } memcpy(buf, cwd, length+1); - free(cwd); + efree(cwd); return buf; } /* }}} */ @@ -754,13 +774,11 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i #ifdef TSRM_WIN32 WIN32_FIND_DATA data; HANDLE hFind; - TSRM_ALLOCA_FLAG(use_heap_large) #else struct stat st; #endif realpath_cache_bucket *bucket; char *tmp; - TSRM_ALLOCA_FLAG(use_heap) while (1) { if (len <= start) { @@ -860,7 +878,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i FindClose(hFind); } - tmp = tsrm_do_alloca(len+1, use_heap); + tmp = emalloc(len+1); memcpy(tmp, path, len+1); if(save && @@ -887,12 +905,12 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i return -1; } - pbuffer = (REPARSE_DATA_BUFFER *)tsrm_do_alloca(MAXIMUM_REPARSE_DATA_BUFFER_SIZE, use_heap_large); + pbuffer = (REPARSE_DATA_BUFFER *)emalloc(MAXIMUM_REPARSE_DATA_BUFFER_SIZE); if (pbuffer == NULL) { return -1; } if(!DeviceIoControl(hLink, FSCTL_GET_REPARSE_POINT, NULL, 0, pbuffer, MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &retlength, NULL)) { - tsrm_free_alloca(pbuffer, use_heap_large); + efree(pbuffer); CloseHandle(hLink); return -1; } @@ -908,7 +926,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i printname_len + 1, printname, MAX_PATH, NULL, NULL )) { - tsrm_free_alloca(pbuffer, use_heap_large); + efree(pbuffer); return -1; }; printname_len = pbuffer->MountPointReparseBuffer.PrintNameLength / sizeof(WCHAR); @@ -920,7 +938,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i substitutename_len + 1, substitutename, MAX_PATH, NULL, NULL )) { - tsrm_free_alloca(pbuffer, use_heap_large); + efree(pbuffer); return -1; }; substitutename[substitutename_len] = 0; @@ -934,7 +952,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i printname_len + 1, printname, MAX_PATH, NULL, NULL )) { - tsrm_free_alloca(pbuffer, use_heap_large); + efree(pbuffer); return -1; }; printname[pbuffer->MountPointReparseBuffer.PrintNameLength / sizeof(WCHAR)] = 0; @@ -945,7 +963,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i substitutename_len + 1, substitutename, MAX_PATH, NULL, NULL )) { - tsrm_free_alloca(pbuffer, use_heap_large); + efree(pbuffer); return -1; }; substitutename[substitutename_len] = 0; @@ -955,7 +973,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i memcpy(substitutename, path, len + 1); substitutename_len = len; } else { - tsrm_free_alloca(pbuffer, use_heap_large); + efree(pbuffer); return -1; } @@ -999,21 +1017,21 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i fprintf(stderr, "sub: %s ", substitutename); fprintf(stderr, "resolved: %s ", path); #endif - tsrm_free_alloca(pbuffer, use_heap_large); + efree(pbuffer); if(isabsolute == 1) { if (!((j == 3) && (path[1] == ':') && (path[2] == '\\'))) { /* use_realpath is 0 in the call below coz path is absolute*/ j = tsrm_realpath_r(path, 0, j, ll, t, 0, is_dir, &directory TSRMLS_CC); if(j < 0) { - tsrm_free_alloca(tmp, use_heap); + efree(tmp); return -1; } } } else { if(i + j >= MAXPATHLEN - 1) { - tsrm_free_alloca(tmp, use_heap); + efree(tmp); return -1; } @@ -1022,7 +1040,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i path[i-1] = DEFAULT_SLASH; j = tsrm_realpath_r(path, start, i + j, ll, t, use_realpath, is_dir, &directory TSRMLS_CC); if(j < 0) { - tsrm_free_alloca(tmp, use_heap); + efree(tmp); return -1; } } @@ -1043,7 +1061,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i #elif defined(NETWARE) save = 0; - tmp = tsrm_do_alloca(len+1, use_heap); + tmp = emalloc(len+1); memcpy(tmp, path, len+1); #else if (save && php_sys_lstat(path, &st) < 0) { @@ -1055,25 +1073,25 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i save = 0; } - tmp = tsrm_do_alloca(len+1, use_heap); + tmp = emalloc(len+1); memcpy(tmp, path, len+1); if (save && S_ISLNK(st.st_mode)) { if (++(*ll) > LINK_MAX || (j = php_sys_readlink(tmp, path, MAXPATHLEN)) < 0) { /* too many links or broken symlinks */ - tsrm_free_alloca(tmp, use_heap); + efree(tmp); return -1; } path[j] = 0; if (IS_ABSOLUTE_PATH(path, j)) { j = tsrm_realpath_r(path, 1, j, ll, t, use_realpath, is_dir, &directory TSRMLS_CC); if (j < 0) { - tsrm_free_alloca(tmp, use_heap); + efree(tmp); return -1; } } else { if (i + j >= MAXPATHLEN-1) { - tsrm_free_alloca(tmp, use_heap); + efree(tmp); return -1; /* buffer overflow */ } memmove(path+i, path, j+1); @@ -1081,7 +1099,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i path[i-1] = DEFAULT_SLASH; j = tsrm_realpath_r(path, start, i + j, ll, t, use_realpath, is_dir, &directory TSRMLS_CC); if (j < 0) { - tsrm_free_alloca(tmp, use_heap); + efree(tmp); return -1; } } @@ -1096,7 +1114,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i } if (is_dir && !directory) { /* not a directory */ - tsrm_free_alloca(tmp, use_heap); + efree(tmp); return -1; } } @@ -1112,7 +1130,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i } #ifdef TSRM_WIN32 if (j < 0 || j + len - i >= MAXPATHLEN-1) { - tsrm_free_alloca(tmp, use_heap); + efree(tmp); return -1; } if (save) { @@ -1127,7 +1145,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i } #else if (j < 0 || j + len - i >= MAXPATHLEN-1) { - tsrm_free_alloca(tmp, use_heap); + efree(tmp); return -1; } memcpy(path+j, tmp+i, len-i+1); @@ -1140,7 +1158,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i realpath_cache_add(tmp, len, path, j, directory, *t TSRMLS_CC); } - tsrm_free_alloca(tmp, use_heap); + efree(tmp); return j; } } @@ -1316,7 +1334,7 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func CWD_STATE_COPY(&old_state, state); state->cwd_length = path_length; - tmp = realloc(state->cwd, state->cwd_length+1); + tmp = erealloc(state->cwd, state->cwd_length+1); if (tmp == NULL) { #if VIRTUAL_CWD_DEBUG fprintf (stderr, "Out of memory\n"); @@ -1336,7 +1354,7 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func } } else { state->cwd_length = path_length; - tmp = realloc(state->cwd, state->cwd_length+1); + tmp = erealloc(state->cwd, state->cwd_length+1); if (tmp == NULL) { #if VIRTUAL_CWD_DEBUG fprintf (stderr, "Out of memory\n"); @@ -1367,7 +1385,6 @@ CWD_API int virtual_chdir_file(const char *path, int (*p_chdir)(const char *path int length = strlen(path); char *temp; int retval; - TSRM_ALLOCA_FLAG(use_heap) if (length == 0) { return 1; /* Can't cd to empty string */ @@ -1384,14 +1401,14 @@ CWD_API int virtual_chdir_file(const char *path, int (*p_chdir)(const char *path if (length == COPY_WHEN_ABSOLUTE(path) && IS_ABSOLUTE_PATH(path, length+1)) { /* Also use trailing slash if this is absolute */ length++; } - temp = (char *) tsrm_do_alloca(length+1, use_heap); + temp = (char *) emalloc(length+1); memcpy(temp, path, length); temp[length] = 0; #if VIRTUAL_CWD_DEBUG fprintf (stderr, "Changing directory to %s\n", temp); #endif retval = p_chdir(temp TSRMLS_CC); - tsrm_free_alloca(temp, use_heap); + efree(temp); return retval; } /* }}} */ @@ -1404,7 +1421,7 @@ CWD_API char *virtual_realpath(const char *path, char *real_path TSRMLS_DC) /* { /* realpath("") returns CWD */ if (!*path) { - new_state.cwd = (char*)malloc(1); + new_state.cwd = (char*)emalloc(1); if (new_state.cwd == NULL) { retval = NULL; goto end; @@ -1417,7 +1434,7 @@ CWD_API char *virtual_realpath(const char *path, char *real_path TSRMLS_DC) /* { } else if (!IS_ABSOLUTE_PATH(path, strlen(path))) { CWD_STATE_COPY(&new_state, &CWDG(cwd)); } else { - new_state.cwd = (char*)malloc(1); + new_state.cwd = (char*)emalloc(1); if (new_state.cwd == NULL) { retval = NULL; goto end; @@ -1882,7 +1899,7 @@ CWD_API FILE *virtual_popen(const char *command, const char *type TSRMLS_DC) /* dir_length = CWDG(cwd).cwd_length; dir = CWDG(cwd).cwd; - ptr = command_line = (char *) malloc(command_length + sizeof("cd '' ; ") + dir_length + extra+1+1); + ptr = command_line = (char *) emalloc(command_length + sizeof("cd '' ; ") + dir_length + extra+1+1); if (!command_line) { return NULL; } @@ -1916,7 +1933,7 @@ CWD_API FILE *virtual_popen(const char *command, const char *type TSRMLS_DC) /* memcpy(ptr, command, command_length+1); retval = popen(command_line, type); - free(command_line); + efree(command_line); return retval; } /* }}} */ @@ -1929,7 +1946,7 @@ CWD_API char *tsrm_realpath(const char *path, char *real_path TSRMLS_DC) /* {{{ /* realpath("") returns CWD */ if (!*path) { - new_state.cwd = (char*)malloc(1); + new_state.cwd = (char*)emalloc(1); if (new_state.cwd == NULL) { return NULL; } @@ -1940,10 +1957,10 @@ CWD_API char *tsrm_realpath(const char *path, char *real_path TSRMLS_DC) /* {{{ } } else if (!IS_ABSOLUTE_PATH(path, strlen(path)) && VCWD_GETCWD(cwd, MAXPATHLEN)) { - new_state.cwd = strdup(cwd); + new_state.cwd = estrdup(cwd); new_state.cwd_length = strlen(cwd); } else { - new_state.cwd = (char*)malloc(1); + new_state.cwd = (char*)emalloc(1); if (new_state.cwd == NULL) { return NULL; } @@ -1952,7 +1969,7 @@ CWD_API char *tsrm_realpath(const char *path, char *real_path TSRMLS_DC) /* {{{ } if (virtual_file_ex(&new_state, path, NULL, CWD_REALPATH TSRMLS_CC)) { - free(new_state.cwd); + efree(new_state.cwd); return NULL; } @@ -1960,7 +1977,7 @@ CWD_API char *tsrm_realpath(const char *path, char *real_path TSRMLS_DC) /* {{{ int copy_len = new_state.cwd_length>MAXPATHLEN-1 ? MAXPATHLEN-1 : new_state.cwd_length; memcpy(real_path, new_state.cwd, copy_len); real_path[copy_len] = '\0'; - free(new_state.cwd); + efree(new_state.cwd); return real_path; } else { return new_state.cwd; diff --git a/Zend/zend_virtual_cwd.h b/Zend/zend_virtual_cwd.h index 72c4424670566..a6ac0aeef7162 100644 --- a/Zend/zend_virtual_cwd.h +++ b/Zend/zend_virtual_cwd.h @@ -151,6 +151,8 @@ typedef int (*verify_path_func)(const cwd_state *); CWD_API void virtual_cwd_startup(void); CWD_API void virtual_cwd_shutdown(void); +CWD_API int virtual_cwd_activate(TSRMLS_D); +CWD_API int virtual_cwd_deactivate(TSRMLS_D); CWD_API char *virtual_getcwd_ex(size_t *length TSRMLS_DC); CWD_API char *virtual_getcwd(char *buf, size_t size TSRMLS_DC); CWD_API int virtual_chdir(const char *path TSRMLS_DC); diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index 969bac1aa6b5d..59e026baa245f 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -154,7 +154,7 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil size_t path_cleaned_len; cwd_state new_state; - new_state.cwd = (char*)malloc(1); + new_state.cwd = (char*)emalloc(1); new_state.cwd[0] = '\0'; new_state.cwd_length = 0; @@ -191,7 +191,7 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil if (ZIP_OPENBASEDIR_CHECKPATH(file_dirname_fullpath)) { efree(file_dirname_fullpath); efree(file_basename); - free(new_state.cwd); + efree(new_state.cwd); return 0; } } @@ -215,7 +215,7 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil efree(file_dirname_fullpath); if (!is_dir_only) { efree(file_basename); - free(new_state.cwd); + efree(new_state.cwd); } return 0; } @@ -224,7 +224,7 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil /* it is a standalone directory, job done */ if (is_dir_only) { efree(file_dirname_fullpath); - free(new_state.cwd); + efree(new_state.cwd); return 1; } @@ -232,13 +232,13 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil if (!len) { efree(file_dirname_fullpath); efree(file_basename); - free(new_state.cwd); + efree(new_state.cwd); return 0; } else if (len > MAXPATHLEN) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Full extraction path exceed MAXPATHLEN (%i)", MAXPATHLEN); efree(file_dirname_fullpath); efree(file_basename); - free(new_state.cwd); + efree(new_state.cwd); return 0; } @@ -250,7 +250,7 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil efree(fullpath); efree(file_dirname_fullpath); efree(file_basename); - free(new_state.cwd); + efree(new_state.cwd); return 0; } @@ -285,7 +285,7 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil efree(fullpath); efree(file_basename); efree(file_dirname_fullpath); - free(new_state.cwd); + efree(new_state.cwd); if (n<0) { return 0; diff --git a/main/SAPI.c b/main/SAPI.c index 8ee7649648d53..c9ba5d5dce851 100644 --- a/main/SAPI.c +++ b/main/SAPI.c @@ -91,8 +91,6 @@ SAPI_API void sapi_startup(sapi_module_struct *sf) sapi_globals_ctor(&sapi_globals); #endif - virtual_cwd_startup(); /* Could use shutdown to free the main cwd but it would just slow it down for CGI */ - #ifdef PHP_WIN32 tsrm_win32_startup(); #endif @@ -110,8 +108,6 @@ SAPI_API void sapi_shutdown(void) reentrancy_shutdown(); - virtual_cwd_shutdown(); - #ifdef PHP_WIN32 tsrm_win32_shutdown(); #endif diff --git a/main/fopen_wrappers.c b/main/fopen_wrappers.c index 1d99a4e20e93b..6722798598af5 100644 --- a/main/fopen_wrappers.c +++ b/main/fopen_wrappers.c @@ -791,11 +791,11 @@ PHPAPI char *expand_filepath_with_mode(const char *filepath, char *real_path, co } } - new_state.cwd = strdup(cwd); + new_state.cwd = estrdup(cwd); new_state.cwd_length = strlen(cwd); if (virtual_file_ex(&new_state, filepath, NULL, realpath_mode TSRMLS_CC)) { - free(new_state.cwd); + efree(new_state.cwd); return NULL; } @@ -806,7 +806,7 @@ PHPAPI char *expand_filepath_with_mode(const char *filepath, char *real_path, co } else { real_path = estrndup(new_state.cwd, new_state.cwd_length); } - free(new_state.cwd); + efree(new_state.cwd); return real_path; } diff --git a/main/main.c b/main/main.c index 1cc842b212944..2d018a74670fb 100644 --- a/main/main.c +++ b/main/main.c @@ -1816,6 +1816,9 @@ void php_request_shutdown(void *dummy) sapi_deactivate(TSRMLS_C); } zend_end_try(); + /* 9.5 free virtual CWD memory */ + virtual_cwd_deactivate(TSRMLS_C); + /* 10. Destroy stream hashes */ zend_try { php_shutdown_stream_hashes(TSRMLS_C); @@ -2243,9 +2246,7 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod } #endif -#ifdef ZTS zend_post_startup(TSRMLS_C); -#endif module_initialized = 1; @@ -2315,6 +2316,7 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod shutdown_memory_manager(1, 0 TSRMLS_CC); zend_interned_strings_snapshot(TSRMLS_C); + virtual_cwd_activate(TSRMLS_C); /* we're done */ return retval; @@ -2410,14 +2412,13 @@ PHPAPI int php_execute_script(zend_file_handle *primary_file TSRMLS_DC) volatile int old_cwd_fd = -1; #else char *old_cwd; - ALLOCA_FLAG(use_heap) #endif int retval = 0; EG(exit_status) = 0; #ifndef HAVE_BROKEN_GETCWD # define OLD_CWD_SIZE 4096 - old_cwd = do_alloca(OLD_CWD_SIZE, use_heap); + old_cwd = emalloc(OLD_CWD_SIZE); old_cwd[0] = '\0'; #endif @@ -2498,7 +2499,7 @@ PHPAPI int php_execute_script(zend_file_handle *primary_file TSRMLS_DC) if (old_cwd[0] != '\0') { php_ignore_value(VCWD_CHDIR(old_cwd)); } - free_alloca(old_cwd, use_heap); + efree(old_cwd); #endif return retval; } @@ -2509,11 +2510,10 @@ PHPAPI int php_execute_script(zend_file_handle *primary_file TSRMLS_DC) PHPAPI int php_execute_simple_script(zend_file_handle *primary_file, zval **ret TSRMLS_DC) { char *old_cwd; - ALLOCA_FLAG(use_heap) EG(exit_status) = 0; #define OLD_CWD_SIZE 4096 - old_cwd = do_alloca(OLD_CWD_SIZE, use_heap); + old_cwd = emalloc(OLD_CWD_SIZE); old_cwd[0] = '\0'; zend_try { @@ -2536,7 +2536,7 @@ PHPAPI int php_execute_simple_script(zend_file_handle *primary_file, zval **ret php_ignore_value(VCWD_CHDIR(old_cwd)); } - free_alloca(old_cwd, use_heap); + efree(old_cwd); return EG(exit_status); } /* }}} */ diff --git a/main/php_open_temporary_file.c b/main/php_open_temporary_file.c index 054d497be6d5c..8315297738165 100644 --- a/main/php_open_temporary_file.c +++ b/main/php_open_temporary_file.c @@ -124,11 +124,11 @@ static int php_do_open_temporary_file(const char *path, const char *pfx, char ** cwd[0] = '\0'; } - new_state.cwd = strdup(cwd); + new_state.cwd = estrdup(cwd); new_state.cwd_length = strlen(cwd); if (virtual_file_ex(&new_state, path, NULL, CWD_REALPATH TSRMLS_CC)) { - free(new_state.cwd); + efree(new_state.cwd); return -1; } @@ -140,7 +140,7 @@ static int php_do_open_temporary_file(const char *path, const char *pfx, char ** if (spprintf(&opened_path, 0, "%s%s%sXXXXXX", new_state.cwd, trailing_slash, pfx) >= MAXPATHLEN) { efree(opened_path); - free(new_state.cwd); + efree(new_state.cwd); return -1; } @@ -151,7 +151,7 @@ static int php_do_open_temporary_file(const char *path, const char *pfx, char ** * which means that opening it will fail... */ if (VCWD_CHMOD(opened_path, 0600)) { efree(opened_path); - free(new_state.cwd); + efree(new_state.cwd); return -1; } fd = VCWD_OPEN_MODE(opened_path, open_flags, 0600); @@ -170,7 +170,7 @@ static int php_do_open_temporary_file(const char *path, const char *pfx, char ** } else { *opened_path_p = opened_path; } - free(new_state.cwd); + efree(new_state.cwd); return fd; } /* }}} */ diff --git a/main/streams/plain_wrapper.c b/main/streams/plain_wrapper.c index 949b827679ecd..4dbf6889d7c11 100644 --- a/main/streams/plain_wrapper.c +++ b/main/streams/plain_wrapper.c @@ -1436,7 +1436,7 @@ PHPAPI php_stream *_php_stream_fopen_with_path(const char *filename, const char php_error_docref(NULL TSRMLS_CC, E_NOTICE, "%s/%s path was truncated to %d", cwd, filename, MAXPATHLEN); } - free(cwd); + efree(cwd); if (((options & STREAM_DISABLE_OPEN_BASEDIR) == 0) && php_check_open_basedir(trypath TSRMLS_CC)) { return NULL; From 51b809e3ad244df1102ca2f44a03ea1fee063579 Mon Sep 17 00:00:00 2001 From: Tjerk Meesters Date: Wed, 9 Oct 2013 09:06:33 +0800 Subject: [PATCH 257/400] Assume the free space is correct on Travis CI. --- ext/standard/tests/file/disk_free_space_basic.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/tests/file/disk_free_space_basic.phpt b/ext/standard/tests/file/disk_free_space_basic.phpt index 7ea8d36153f06..c3917a9417880 100644 --- a/ext/standard/tests/file/disk_free_space_basic.phpt +++ b/ext/standard/tests/file/disk_free_space_basic.phpt @@ -33,7 +33,7 @@ echo "\n Free Space after writing to a file\n"; $space2 = disk_free_space($file_path.$dir); var_dump( $space2 ); -if( $space1 > $space2 ) +if(getenv('TRAVIS') === 'true' || $space1 > $space2 ) echo "\n Free Space Value Is Correct\n"; else echo "\n Free Space Value Is Incorrect\n"; From 2aaa3d538a7b93d92c52aec95707d8230f21be65 Mon Sep 17 00:00:00 2001 From: Daniel Lowrey Date: Tue, 8 Oct 2013 13:54:22 -0400 Subject: [PATCH 258/400] Added support for TLSv1.1 and TLSv1.2 Conflicts: ext/openssl/xp_ssl.c --- ext/openssl/openssl.c | 8 ++ ext/openssl/tests/streams_crypto_method.pem | 33 ++++++++ ext/openssl/tests/tlsv1.1_wrapper_001.phpt | 46 +++++++++++ ext/openssl/tests/tlsv1.2_wrapper_002.phpt | 46 +++++++++++ ext/openssl/xp_ssl.c | 86 ++++++++++++++++++++- ext/standard/file.c | 4 + main/streams/php_stream_transport.h | 6 +- 7 files changed, 226 insertions(+), 3 deletions(-) create mode 100644 ext/openssl/tests/streams_crypto_method.pem create mode 100644 ext/openssl/tests/tlsv1.1_wrapper_001.phpt create mode 100644 ext/openssl/tests/tlsv1.2_wrapper_002.phpt diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 59a58b1c00256..5d0cf4384d156 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1151,6 +1151,10 @@ PHP_MINIT_FUNCTION(openssl) php_stream_xport_register("sslv2", php_openssl_ssl_socket_factory TSRMLS_CC); #endif php_stream_xport_register("tls", php_openssl_ssl_socket_factory TSRMLS_CC); +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + php_stream_xport_register("tlsv1.1", php_openssl_ssl_socket_factory TSRMLS_CC); + php_stream_xport_register("tlsv1.2", php_openssl_ssl_socket_factory TSRMLS_CC); +#endif /* override the default tcp socket provider */ php_stream_xport_register("tcp", php_openssl_ssl_socket_factory TSRMLS_CC); @@ -1189,6 +1193,10 @@ PHP_MSHUTDOWN_FUNCTION(openssl) #endif php_stream_xport_unregister("sslv3" TSRMLS_CC); php_stream_xport_unregister("tls" TSRMLS_CC); +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + php_stream_xport_unregister("tlsv1.1" TSRMLS_CC); + php_stream_xport_unregister("tlsv1.2" TSRMLS_CC); +#endif /* reinstate the default tcp handler */ php_stream_xport_register("tcp", php_stream_generic_socket_factory TSRMLS_CC); diff --git a/ext/openssl/tests/streams_crypto_method.pem b/ext/openssl/tests/streams_crypto_method.pem new file mode 100644 index 0000000000000..9d754d460d57c --- /dev/null +++ b/ext/openssl/tests/streams_crypto_method.pem @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIC5jCCAk+gAwIBAgIBADANBgkqhkiG9w0BAQQFADBcMQswCQYDVQQGEwJBVTET +MBEGA1UECBMKUXVlZW5zbGFuZDEaMBgGA1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQx +HDAaBgNVBAMTE1Rlc3QgUENBICgxMDI0IGJpdCkwHhcNOTkxMjAyMjEzNTQ4WhcN +MDUwNzExMjEzNTQ4WjBcMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFu +ZDEaMBgGA1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQxHDAaBgNVBAMTE1Rlc3QgUENB +ICgxMDI0IGJpdCkwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJ2haT/f5Zwy +V+MiuSDjSR62adBoSiBB7Usty44lXqsp9RICw+DCCxpsn/CfxPEDXLLd4olsWXc6 +JRcxGynbYmnzk+Z6aIPPJQhK3CTvaqGnWKZsA1m+WaUIUqJCuNTK4N+7hMAGaf6S +S3e9HVgEQ4a34gXJ7VQFVIBNV1EnZRWHAgMBAAGjgbcwgbQwHQYDVR0OBBYEFE0R +aEcrj18q1dw+G6nJbsTWR213MIGEBgNVHSMEfTB7gBRNEWhHK49fKtXcPhupyW7E +1kdtd6FgpF4wXDELMAkGA1UEBhMCQVUxEzARBgNVBAgTClF1ZWVuc2xhbmQxGjAY +BgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMRwwGgYDVQQDExNUZXN0IFBDQSAoMTAy +NCBiaXQpggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAUa8B3pho ++Mvxeq9HsEzJxHIFQla05S5J/e/V+DQTYoKiRFchKPrDAdrzYSEvP3h4QJEtsNqQ +JfOxg5M42uLFq7aPGWkF6ZZqZsYS+zA9IVT14g7gNA6Ne+5QtJqQtH9HA24st0T0 +Tga/lZ9M2ovImovaxSL/kRHbpCWcqWVxpOw= +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQCdoWk/3+WcMlfjIrkg40ketmnQaEogQe1LLcuOJV6rKfUSAsPg +wgsabJ/wn8TxA1yy3eKJbFl3OiUXMRsp22Jp85PmemiDzyUIStwk72qhp1imbANZ +vlmlCFKiQrjUyuDfu4TABmn+kkt3vR1YBEOGt+IFye1UBVSATVdRJ2UVhwIDAQAB +AoGAba4fTtuap5l7/8ZsbE7Z1O32KJY4ZcOZukLOLUUhXxXduT+FTgGWujc0/rgc +z9qYCLlNZHOouMYTgtSfYvuMuLZ11VIt0GYH+nRioLShE59Yy+zCRyC+gPigS1kz +xvo14AsOIPYV14Tk/SsHyq6E0eTk7VzaIE197giiINUERPECQQDSKmtPTh/lRKw7 +HSZSM0I1mFWn/1zqrAbontRQY5w98QWIOe5qmzYyFbPXYT3d9BzlsMyhgiRNoBbD +yvohSHXJAkEAwAHx6ezAZeWWzD5yXD36nyjpkVCw7Tk7TSmOceLJMWt1QcrCfqlS +xA5jjpQ6Z8suU5DdtWAryM2sAir1WisYzwJAd6Zcx56jvAQ3xcPXsE6scBTVFzrj +7FqZ6E+cclPzfLQ+QQsyOBE7bpI6e/FJppY26XGZXo3YGzV8IGXrt40oOQJALETG +h86EFXo3qGOFbmsDy4pdP5nBERCu8X1xUCSfintiD4c2DInxgS5oGclnJeMcjTvL +QjQoJCX3UJCi/OUO1QJBAKgcDHWjMvt+l1pjJBsSEZ0HX9AAIIVx0RQmbFGS+F2Q +hhu5l77WnnZOQ9vvhV5u7NPCUF9nhU3jh60qWWO8mkc= +-----END RSA PRIVATE KEY----- diff --git a/ext/openssl/tests/tlsv1.1_wrapper_001.phpt b/ext/openssl/tests/tlsv1.1_wrapper_001.phpt new file mode 100644 index 0000000000000..56211f0b965e0 --- /dev/null +++ b/ext/openssl/tests/tlsv1.1_wrapper_001.phpt @@ -0,0 +1,46 @@ +--TEST-- +tlsv1.1 stream wrapper +--SKIPIF-- + array( + 'local_cert' => __DIR__ . '/streams_crypto_method.pem', +))); + +$server = stream_socket_server('tlsv1.1://127.0.0.1:64321', $errno, $errstr, $flags, $ctx); +var_dump($server); + +$pid = pcntl_fork(); +if ($pid == -1) { + die('could not fork'); +} elseif ($pid) { + $flags = STREAM_CLIENT_CONNECT; + $ctx = stream_context_create(array('ssl' => array( + 'verify_peer' => false + ))); + + $client = stream_socket_client("tlsv1.1://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); + var_dump($client); + + $client = @stream_socket_client("sslv3://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); + var_dump($client); + + $client = @stream_socket_client("tlsv1.2://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); + var_dump($client); + +} else { + @pcntl_wait($status); + for ($i=0; $i < 3; $i++) { + @stream_socket_accept($server, 1); + } +} +--EXPECTF-- +resource(%d) of type (stream) +resource(%d) of type (stream) +bool(false) +bool(false) diff --git a/ext/openssl/tests/tlsv1.2_wrapper_002.phpt b/ext/openssl/tests/tlsv1.2_wrapper_002.phpt new file mode 100644 index 0000000000000..cb3f4106c727e --- /dev/null +++ b/ext/openssl/tests/tlsv1.2_wrapper_002.phpt @@ -0,0 +1,46 @@ +--TEST-- +tlsv1.2 stream wrapper +--SKIPIF-- + array( + 'local_cert' => __DIR__ . '/streams_crypto_method.pem', +))); + +$server = stream_socket_server('tlsv1.2://127.0.0.1:64321', $errno, $errstr, $flags, $ctx); +var_dump($server); + +$pid = pcntl_fork(); +if ($pid == -1) { + die('could not fork'); +} elseif ($pid) { + $flags = STREAM_CLIENT_CONNECT; + $ctx = stream_context_create(array('ssl' => array( + 'verify_peer' => false + ))); + + $client = stream_socket_client("tlsv1.2://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); + var_dump($client); + + $client = @stream_socket_client("sslv3://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); + var_dump($client); + + $client = @stream_socket_client("tlsv1.1://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); + var_dump($client); + +} else { + @pcntl_wait($status); + for ($i=0; $i < 3; $i++) { + @stream_socket_accept($server, 1); + } +} +--EXPECTF-- +resource(%d) of type (stream) +resource(%d) of type (stream) +bool(false) +bool(false) diff --git a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c index a1a7ffc3f4bdc..d62ab89fcf392 100644 --- a/ext/openssl/xp_ssl.c +++ b/ext/openssl/xp_ssl.c @@ -346,6 +346,24 @@ static inline int php_openssl_setup_crypto(php_stream *stream, sslsock->is_client = 1; method = TLSv1_client_method(); break; + case STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT: +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + sslsock->is_client = 1; + method = TLSv1_1_client_method(); + break; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.1 support is not compiled into the OpenSSL library PHP is linked against"); + return -1; +#endif + case STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT: +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + sslsock->is_client = 1; + method = TLSv1_2_client_method(); + break; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.2 support is not compiled into the OpenSSL library PHP is linked against"); + return -1; +#endif case STREAM_CRYPTO_METHOD_SSLv23_SERVER: sslsock->is_client = 0; method = SSLv23_server_method(); @@ -367,6 +385,24 @@ static inline int php_openssl_setup_crypto(php_stream *stream, sslsock->is_client = 0; method = TLSv1_server_method(); break; + case STREAM_CRYPTO_METHOD_TLSv1_1_SERVER: +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + sslsock->is_client = 0; + method = TLSv1_1_server_method(); + break; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.1 support is not compiled into the OpenSSL library PHP is linked against"); + return -1; +#endif + case STREAM_CRYPTO_METHOD_TLSv1_2_SERVER: +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + sslsock->is_client = 0; + method = TLSv1_2_server_method(); + break; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.2 support is not compiled into the OpenSSL library PHP is linked against"); + return -1; +#endif default: return -1; @@ -667,6 +703,12 @@ static inline int php_openssl_tcp_sockop_accept(php_stream *stream, php_openssl_ case STREAM_CRYPTO_METHOD_TLS_CLIENT: sock->method = STREAM_CRYPTO_METHOD_TLS_SERVER; break; + case STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT: + sock->method = STREAM_CRYPTO_METHOD_TLSv1_1_SERVER; + break; + case STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT: + sock->method = STREAM_CRYPTO_METHOD_TLSv1_2_SERVER; + break; default: break; } @@ -853,8 +895,32 @@ 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 int get_crypto_method(php_stream_context *ctx) { + if (ctx) { + zval **val = NULL; + long crypto_method; + + if (php_stream_context_get_option(ctx, "ssl", "crypto_method", &val) == SUCCESS) { + convert_to_long_ex(val); + crypto_method = (long)Z_LVAL_PP(val); + + switch (crypto_method) { + case STREAM_CRYPTO_METHOD_SSLv2_CLIENT: + case STREAM_CRYPTO_METHOD_SSLv3_CLIENT: + case STREAM_CRYPTO_METHOD_SSLv23_CLIENT: + case STREAM_CRYPTO_METHOD_TLS_CLIENT: + case STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT: + case STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT: + return crypto_method; + } + + } + } + + return STREAM_CRYPTO_METHOD_SSLv23_CLIENT; +} +static char * get_sni(php_stream_context *ctx, const char *resourcename, size_t resourcenamelen, int is_persistent TSRMLS_DC) { php_url *url; if (ctx) { @@ -954,8 +1020,24 @@ php_stream *php_openssl_ssl_socket_factory(const char *proto, long protolen, } else if (strncmp(proto, "tls", protolen) == 0) { sslsock->enable_on_connect = 1; sslsock->method = STREAM_CRYPTO_METHOD_TLS_CLIENT; + } else if (strncmp(proto, "tlsv1.1", protolen) == 0) { +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + sslsock->enable_on_connect = 1; + sslsock->method = STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.1 support is not compiled into the OpenSSL library PHP is linked against"); + return NULL; +#endif + } else if (strncmp(proto, "tlsv1.2", protolen) == 0) { +#if OPENSSL_VERSION_NUMBER >= 0x10001001L + sslsock->enable_on_connect = 1; + sslsock->method = STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT; +#else + php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.2 support is not compiled into the OpenSSL library PHP is linked against"); + return NULL; +#endif } - + return stream; } diff --git a/ext/standard/file.c b/ext/standard/file.c index ad6bdad34f2ed..13561aa3a9f09 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -223,10 +223,14 @@ PHP_MINIT_FUNCTION(file) REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv3_CLIENT", STREAM_CRYPTO_METHOD_SSLv3_CLIENT, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv23_CLIENT", STREAM_CRYPTO_METHOD_SSLv23_CLIENT, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLS_CLIENT", STREAM_CRYPTO_METHOD_TLS_CLIENT, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT", STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT", STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv2_SERVER", STREAM_CRYPTO_METHOD_SSLv2_SERVER, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv3_SERVER", STREAM_CRYPTO_METHOD_SSLv3_SERVER, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv23_SERVER", STREAM_CRYPTO_METHOD_SSLv23_SERVER, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLS_SERVER", STREAM_CRYPTO_METHOD_TLS_SERVER, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_1_SERVER", STREAM_CRYPTO_METHOD_TLSv1_1_SERVER, CONST_CS|CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_2_SERVER", STREAM_CRYPTO_METHOD_TLSv1_2_SERVER, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_SHUT_RD", STREAM_SHUT_RD, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_SHUT_WR", STREAM_SHUT_WR, CONST_CS|CONST_PERSISTENT); diff --git a/main/streams/php_stream_transport.h b/main/streams/php_stream_transport.h index c2d911032ef8a..3c276ad6d3002 100644 --- a/main/streams/php_stream_transport.h +++ b/main/streams/php_stream_transport.h @@ -170,10 +170,14 @@ typedef enum { STREAM_CRYPTO_METHOD_SSLv3_CLIENT, STREAM_CRYPTO_METHOD_SSLv23_CLIENT, STREAM_CRYPTO_METHOD_TLS_CLIENT, + STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT, + STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT, STREAM_CRYPTO_METHOD_SSLv2_SERVER, STREAM_CRYPTO_METHOD_SSLv3_SERVER, STREAM_CRYPTO_METHOD_SSLv23_SERVER, - STREAM_CRYPTO_METHOD_TLS_SERVER + STREAM_CRYPTO_METHOD_TLS_SERVER, + STREAM_CRYPTO_METHOD_TLSv1_1_SERVER, + STREAM_CRYPTO_METHOD_TLSv1_2_SERVER } php_stream_xport_crypt_method_t; BEGIN_EXTERN_C() From ad0a85b9e2e090b4a8f2997bb1e6fb89f1888913 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 17 Oct 2013 15:09:28 +0200 Subject: [PATCH 259/400] fix ws --- ext/openssl/tests/streams_crypto_method.phpt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ext/openssl/tests/streams_crypto_method.phpt b/ext/openssl/tests/streams_crypto_method.phpt index 7ac195bfb6ad9..97a6e9ee8ba85 100644 --- a/ext/openssl/tests/streams_crypto_method.phpt +++ b/ext/openssl/tests/streams_crypto_method.phpt @@ -19,13 +19,13 @@ function client($port, $method) { } function server($port, $transport) { - $context = stream_context_create(); + $context = stream_context_create(); - stream_context_set_option($context, 'ssl', 'local_cert', dirname(__FILE__) . '/streams_crypto_method.pem'); - stream_context_set_option($context, 'ssl', 'allow_self_signed', true); - stream_context_set_option($context, 'ssl', 'verify_peer', false); + stream_context_set_option($context, 'ssl', 'local_cert', dirname(__FILE__) . '/streams_crypto_method.pem'); + stream_context_set_option($context, 'ssl', 'allow_self_signed', true); + stream_context_set_option($context, 'ssl', 'verify_peer', false); - $server = stream_socket_server($transport . '127.0.0.1:' . $port, $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context); + $server = stream_socket_server($transport . '127.0.0.1:' . $port, $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context); $client = @stream_socket_accept($server); From 62be976abee38066a5c19f9badf14e8f12922d8a Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 17 Oct 2013 15:13:12 +0200 Subject: [PATCH 260/400] TLS news --- NEWS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/NEWS b/NEWS index 4978c7e722527..a5a6d8f197818 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,9 @@ PHP NEWS . Fixed bug #65911 (scope resolution operator - strange behavior with $this). (Bob Weinand) +- Openssl: + . Added explicit TLSv1.1 and TLSv1.2 stream transports. (Daniel Lowrey) + 17 Oct 2013, PHP 5.5.5 - Core: From 8aaecef524b6abbbebac5b2a72124ec4138ea00d Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 17 Oct 2013 15:20:38 +0200 Subject: [PATCH 261/400] Revert "Added support for TLSv1.1 and TLSv1.2" This reverts commit 2aaa3d538a7b93d92c52aec95707d8230f21be65. --- ext/openssl/openssl.c | 8 -- ext/openssl/tests/streams_crypto_method.pem | 33 -------- ext/openssl/tests/tlsv1.1_wrapper_001.phpt | 46 ----------- ext/openssl/tests/tlsv1.2_wrapper_002.phpt | 46 ----------- ext/openssl/xp_ssl.c | 86 +-------------------- ext/standard/file.c | 4 - main/streams/php_stream_transport.h | 6 +- 7 files changed, 3 insertions(+), 226 deletions(-) delete mode 100644 ext/openssl/tests/streams_crypto_method.pem delete mode 100644 ext/openssl/tests/tlsv1.1_wrapper_001.phpt delete mode 100644 ext/openssl/tests/tlsv1.2_wrapper_002.phpt diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 5d0cf4384d156..59a58b1c00256 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1151,10 +1151,6 @@ PHP_MINIT_FUNCTION(openssl) php_stream_xport_register("sslv2", php_openssl_ssl_socket_factory TSRMLS_CC); #endif php_stream_xport_register("tls", php_openssl_ssl_socket_factory TSRMLS_CC); -#if OPENSSL_VERSION_NUMBER >= 0x10001001L - php_stream_xport_register("tlsv1.1", php_openssl_ssl_socket_factory TSRMLS_CC); - php_stream_xport_register("tlsv1.2", php_openssl_ssl_socket_factory TSRMLS_CC); -#endif /* override the default tcp socket provider */ php_stream_xport_register("tcp", php_openssl_ssl_socket_factory TSRMLS_CC); @@ -1193,10 +1189,6 @@ PHP_MSHUTDOWN_FUNCTION(openssl) #endif php_stream_xport_unregister("sslv3" TSRMLS_CC); php_stream_xport_unregister("tls" TSRMLS_CC); -#if OPENSSL_VERSION_NUMBER >= 0x10001001L - php_stream_xport_unregister("tlsv1.1" TSRMLS_CC); - php_stream_xport_unregister("tlsv1.2" TSRMLS_CC); -#endif /* reinstate the default tcp handler */ php_stream_xport_register("tcp", php_stream_generic_socket_factory TSRMLS_CC); diff --git a/ext/openssl/tests/streams_crypto_method.pem b/ext/openssl/tests/streams_crypto_method.pem deleted file mode 100644 index 9d754d460d57c..0000000000000 --- a/ext/openssl/tests/streams_crypto_method.pem +++ /dev/null @@ -1,33 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC5jCCAk+gAwIBAgIBADANBgkqhkiG9w0BAQQFADBcMQswCQYDVQQGEwJBVTET -MBEGA1UECBMKUXVlZW5zbGFuZDEaMBgGA1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQx -HDAaBgNVBAMTE1Rlc3QgUENBICgxMDI0IGJpdCkwHhcNOTkxMjAyMjEzNTQ4WhcN -MDUwNzExMjEzNTQ4WjBcMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFu -ZDEaMBgGA1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQxHDAaBgNVBAMTE1Rlc3QgUENB -ICgxMDI0IGJpdCkwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJ2haT/f5Zwy -V+MiuSDjSR62adBoSiBB7Usty44lXqsp9RICw+DCCxpsn/CfxPEDXLLd4olsWXc6 -JRcxGynbYmnzk+Z6aIPPJQhK3CTvaqGnWKZsA1m+WaUIUqJCuNTK4N+7hMAGaf6S -S3e9HVgEQ4a34gXJ7VQFVIBNV1EnZRWHAgMBAAGjgbcwgbQwHQYDVR0OBBYEFE0R -aEcrj18q1dw+G6nJbsTWR213MIGEBgNVHSMEfTB7gBRNEWhHK49fKtXcPhupyW7E -1kdtd6FgpF4wXDELMAkGA1UEBhMCQVUxEzARBgNVBAgTClF1ZWVuc2xhbmQxGjAY -BgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMRwwGgYDVQQDExNUZXN0IFBDQSAoMTAy -NCBiaXQpggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAUa8B3pho -+Mvxeq9HsEzJxHIFQla05S5J/e/V+DQTYoKiRFchKPrDAdrzYSEvP3h4QJEtsNqQ -JfOxg5M42uLFq7aPGWkF6ZZqZsYS+zA9IVT14g7gNA6Ne+5QtJqQtH9HA24st0T0 -Tga/lZ9M2ovImovaxSL/kRHbpCWcqWVxpOw= ------END CERTIFICATE----- ------BEGIN RSA PRIVATE KEY----- -MIICXAIBAAKBgQCdoWk/3+WcMlfjIrkg40ketmnQaEogQe1LLcuOJV6rKfUSAsPg -wgsabJ/wn8TxA1yy3eKJbFl3OiUXMRsp22Jp85PmemiDzyUIStwk72qhp1imbANZ -vlmlCFKiQrjUyuDfu4TABmn+kkt3vR1YBEOGt+IFye1UBVSATVdRJ2UVhwIDAQAB -AoGAba4fTtuap5l7/8ZsbE7Z1O32KJY4ZcOZukLOLUUhXxXduT+FTgGWujc0/rgc -z9qYCLlNZHOouMYTgtSfYvuMuLZ11VIt0GYH+nRioLShE59Yy+zCRyC+gPigS1kz -xvo14AsOIPYV14Tk/SsHyq6E0eTk7VzaIE197giiINUERPECQQDSKmtPTh/lRKw7 -HSZSM0I1mFWn/1zqrAbontRQY5w98QWIOe5qmzYyFbPXYT3d9BzlsMyhgiRNoBbD -yvohSHXJAkEAwAHx6ezAZeWWzD5yXD36nyjpkVCw7Tk7TSmOceLJMWt1QcrCfqlS -xA5jjpQ6Z8suU5DdtWAryM2sAir1WisYzwJAd6Zcx56jvAQ3xcPXsE6scBTVFzrj -7FqZ6E+cclPzfLQ+QQsyOBE7bpI6e/FJppY26XGZXo3YGzV8IGXrt40oOQJALETG -h86EFXo3qGOFbmsDy4pdP5nBERCu8X1xUCSfintiD4c2DInxgS5oGclnJeMcjTvL -QjQoJCX3UJCi/OUO1QJBAKgcDHWjMvt+l1pjJBsSEZ0HX9AAIIVx0RQmbFGS+F2Q -hhu5l77WnnZOQ9vvhV5u7NPCUF9nhU3jh60qWWO8mkc= ------END RSA PRIVATE KEY----- diff --git a/ext/openssl/tests/tlsv1.1_wrapper_001.phpt b/ext/openssl/tests/tlsv1.1_wrapper_001.phpt deleted file mode 100644 index 56211f0b965e0..0000000000000 --- a/ext/openssl/tests/tlsv1.1_wrapper_001.phpt +++ /dev/null @@ -1,46 +0,0 @@ ---TEST-- -tlsv1.1 stream wrapper ---SKIPIF-- - array( - 'local_cert' => __DIR__ . '/streams_crypto_method.pem', -))); - -$server = stream_socket_server('tlsv1.1://127.0.0.1:64321', $errno, $errstr, $flags, $ctx); -var_dump($server); - -$pid = pcntl_fork(); -if ($pid == -1) { - die('could not fork'); -} elseif ($pid) { - $flags = STREAM_CLIENT_CONNECT; - $ctx = stream_context_create(array('ssl' => array( - 'verify_peer' => false - ))); - - $client = stream_socket_client("tlsv1.1://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); - var_dump($client); - - $client = @stream_socket_client("sslv3://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); - var_dump($client); - - $client = @stream_socket_client("tlsv1.2://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); - var_dump($client); - -} else { - @pcntl_wait($status); - for ($i=0; $i < 3; $i++) { - @stream_socket_accept($server, 1); - } -} ---EXPECTF-- -resource(%d) of type (stream) -resource(%d) of type (stream) -bool(false) -bool(false) diff --git a/ext/openssl/tests/tlsv1.2_wrapper_002.phpt b/ext/openssl/tests/tlsv1.2_wrapper_002.phpt deleted file mode 100644 index cb3f4106c727e..0000000000000 --- a/ext/openssl/tests/tlsv1.2_wrapper_002.phpt +++ /dev/null @@ -1,46 +0,0 @@ ---TEST-- -tlsv1.2 stream wrapper ---SKIPIF-- - array( - 'local_cert' => __DIR__ . '/streams_crypto_method.pem', -))); - -$server = stream_socket_server('tlsv1.2://127.0.0.1:64321', $errno, $errstr, $flags, $ctx); -var_dump($server); - -$pid = pcntl_fork(); -if ($pid == -1) { - die('could not fork'); -} elseif ($pid) { - $flags = STREAM_CLIENT_CONNECT; - $ctx = stream_context_create(array('ssl' => array( - 'verify_peer' => false - ))); - - $client = stream_socket_client("tlsv1.2://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); - var_dump($client); - - $client = @stream_socket_client("sslv3://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); - var_dump($client); - - $client = @stream_socket_client("tlsv1.1://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); - var_dump($client); - -} else { - @pcntl_wait($status); - for ($i=0; $i < 3; $i++) { - @stream_socket_accept($server, 1); - } -} ---EXPECTF-- -resource(%d) of type (stream) -resource(%d) of type (stream) -bool(false) -bool(false) diff --git a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c index d62ab89fcf392..a1a7ffc3f4bdc 100644 --- a/ext/openssl/xp_ssl.c +++ b/ext/openssl/xp_ssl.c @@ -346,24 +346,6 @@ static inline int php_openssl_setup_crypto(php_stream *stream, sslsock->is_client = 1; method = TLSv1_client_method(); break; - case STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT: -#if OPENSSL_VERSION_NUMBER >= 0x10001001L - sslsock->is_client = 1; - method = TLSv1_1_client_method(); - break; -#else - php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.1 support is not compiled into the OpenSSL library PHP is linked against"); - return -1; -#endif - case STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT: -#if OPENSSL_VERSION_NUMBER >= 0x10001001L - sslsock->is_client = 1; - method = TLSv1_2_client_method(); - break; -#else - php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.2 support is not compiled into the OpenSSL library PHP is linked against"); - return -1; -#endif case STREAM_CRYPTO_METHOD_SSLv23_SERVER: sslsock->is_client = 0; method = SSLv23_server_method(); @@ -385,24 +367,6 @@ static inline int php_openssl_setup_crypto(php_stream *stream, sslsock->is_client = 0; method = TLSv1_server_method(); break; - case STREAM_CRYPTO_METHOD_TLSv1_1_SERVER: -#if OPENSSL_VERSION_NUMBER >= 0x10001001L - sslsock->is_client = 0; - method = TLSv1_1_server_method(); - break; -#else - php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.1 support is not compiled into the OpenSSL library PHP is linked against"); - return -1; -#endif - case STREAM_CRYPTO_METHOD_TLSv1_2_SERVER: -#if OPENSSL_VERSION_NUMBER >= 0x10001001L - sslsock->is_client = 0; - method = TLSv1_2_server_method(); - break; -#else - php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.2 support is not compiled into the OpenSSL library PHP is linked against"); - return -1; -#endif default: return -1; @@ -703,12 +667,6 @@ static inline int php_openssl_tcp_sockop_accept(php_stream *stream, php_openssl_ case STREAM_CRYPTO_METHOD_TLS_CLIENT: sock->method = STREAM_CRYPTO_METHOD_TLS_SERVER; break; - case STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT: - sock->method = STREAM_CRYPTO_METHOD_TLSv1_1_SERVER; - break; - case STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT: - sock->method = STREAM_CRYPTO_METHOD_TLSv1_2_SERVER; - break; default: break; } @@ -895,32 +853,8 @@ php_stream_ops php_openssl_socket_ops = { php_openssl_sockop_set_option, }; -static int get_crypto_method(php_stream_context *ctx) { - if (ctx) { - zval **val = NULL; - long crypto_method; - - if (php_stream_context_get_option(ctx, "ssl", "crypto_method", &val) == SUCCESS) { - convert_to_long_ex(val); - crypto_method = (long)Z_LVAL_PP(val); - - switch (crypto_method) { - case STREAM_CRYPTO_METHOD_SSLv2_CLIENT: - case STREAM_CRYPTO_METHOD_SSLv3_CLIENT: - case STREAM_CRYPTO_METHOD_SSLv23_CLIENT: - case STREAM_CRYPTO_METHOD_TLS_CLIENT: - case STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT: - case STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT: - return crypto_method; - } - - } - } - - return STREAM_CRYPTO_METHOD_SSLv23_CLIENT; -} +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; if (ctx) { @@ -1020,24 +954,8 @@ php_stream *php_openssl_ssl_socket_factory(const char *proto, long protolen, } else if (strncmp(proto, "tls", protolen) == 0) { sslsock->enable_on_connect = 1; sslsock->method = STREAM_CRYPTO_METHOD_TLS_CLIENT; - } else if (strncmp(proto, "tlsv1.1", protolen) == 0) { -#if OPENSSL_VERSION_NUMBER >= 0x10001001L - sslsock->enable_on_connect = 1; - sslsock->method = STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT; -#else - php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.1 support is not compiled into the OpenSSL library PHP is linked against"); - return NULL; -#endif - } else if (strncmp(proto, "tlsv1.2", protolen) == 0) { -#if OPENSSL_VERSION_NUMBER >= 0x10001001L - sslsock->enable_on_connect = 1; - sslsock->method = STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT; -#else - php_error_docref(NULL TSRMLS_CC, E_WARNING, "TLSv1.2 support is not compiled into the OpenSSL library PHP is linked against"); - return NULL; -#endif } - + return stream; } diff --git a/ext/standard/file.c b/ext/standard/file.c index 13561aa3a9f09..ad6bdad34f2ed 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -223,14 +223,10 @@ PHP_MINIT_FUNCTION(file) REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv3_CLIENT", STREAM_CRYPTO_METHOD_SSLv3_CLIENT, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv23_CLIENT", STREAM_CRYPTO_METHOD_SSLv23_CLIENT, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLS_CLIENT", STREAM_CRYPTO_METHOD_TLS_CLIENT, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT", STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT", STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv2_SERVER", STREAM_CRYPTO_METHOD_SSLv2_SERVER, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv3_SERVER", STREAM_CRYPTO_METHOD_SSLv3_SERVER, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv23_SERVER", STREAM_CRYPTO_METHOD_SSLv23_SERVER, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLS_SERVER", STREAM_CRYPTO_METHOD_TLS_SERVER, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_1_SERVER", STREAM_CRYPTO_METHOD_TLSv1_1_SERVER, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLSv1_2_SERVER", STREAM_CRYPTO_METHOD_TLSv1_2_SERVER, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_SHUT_RD", STREAM_SHUT_RD, CONST_CS|CONST_PERSISTENT); REGISTER_LONG_CONSTANT("STREAM_SHUT_WR", STREAM_SHUT_WR, CONST_CS|CONST_PERSISTENT); diff --git a/main/streams/php_stream_transport.h b/main/streams/php_stream_transport.h index 3c276ad6d3002..c2d911032ef8a 100644 --- a/main/streams/php_stream_transport.h +++ b/main/streams/php_stream_transport.h @@ -170,14 +170,10 @@ typedef enum { STREAM_CRYPTO_METHOD_SSLv3_CLIENT, STREAM_CRYPTO_METHOD_SSLv23_CLIENT, STREAM_CRYPTO_METHOD_TLS_CLIENT, - STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT, - STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT, STREAM_CRYPTO_METHOD_SSLv2_SERVER, STREAM_CRYPTO_METHOD_SSLv3_SERVER, STREAM_CRYPTO_METHOD_SSLv23_SERVER, - STREAM_CRYPTO_METHOD_TLS_SERVER, - STREAM_CRYPTO_METHOD_TLSv1_1_SERVER, - STREAM_CRYPTO_METHOD_TLSv1_2_SERVER + STREAM_CRYPTO_METHOD_TLS_SERVER } php_stream_xport_crypt_method_t; BEGIN_EXTERN_C() From d89d46d9409309592b1896493d85ff35974321f3 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 17 Oct 2013 15:21:34 +0200 Subject: [PATCH 262/400] Revert "TLS news" This reverts commit 62be976abee38066a5c19f9badf14e8f12922d8a. --- NEWS | 3 --- 1 file changed, 3 deletions(-) diff --git a/NEWS b/NEWS index a5a6d8f197818..4978c7e722527 100644 --- a/NEWS +++ b/NEWS @@ -6,9 +6,6 @@ PHP NEWS . Fixed bug #65911 (scope resolution operator - strange behavior with $this). (Bob Weinand) -- Openssl: - . Added explicit TLSv1.1 and TLSv1.2 stream transports. (Daniel Lowrey) - 17 Oct 2013, PHP 5.5.5 - Core: From b95f9fa0aa097159d02627dd07cf9a9b129e113c Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 17 Oct 2013 15:32:18 +0200 Subject: [PATCH 263/400] previous revert killed that file --- ext/openssl/tests/streams_crypto_method.pem | 33 +++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 ext/openssl/tests/streams_crypto_method.pem diff --git a/ext/openssl/tests/streams_crypto_method.pem b/ext/openssl/tests/streams_crypto_method.pem new file mode 100644 index 0000000000000..9d754d460d57c --- /dev/null +++ b/ext/openssl/tests/streams_crypto_method.pem @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIC5jCCAk+gAwIBAgIBADANBgkqhkiG9w0BAQQFADBcMQswCQYDVQQGEwJBVTET +MBEGA1UECBMKUXVlZW5zbGFuZDEaMBgGA1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQx +HDAaBgNVBAMTE1Rlc3QgUENBICgxMDI0IGJpdCkwHhcNOTkxMjAyMjEzNTQ4WhcN +MDUwNzExMjEzNTQ4WjBcMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFu +ZDEaMBgGA1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQxHDAaBgNVBAMTE1Rlc3QgUENB +ICgxMDI0IGJpdCkwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJ2haT/f5Zwy +V+MiuSDjSR62adBoSiBB7Usty44lXqsp9RICw+DCCxpsn/CfxPEDXLLd4olsWXc6 +JRcxGynbYmnzk+Z6aIPPJQhK3CTvaqGnWKZsA1m+WaUIUqJCuNTK4N+7hMAGaf6S +S3e9HVgEQ4a34gXJ7VQFVIBNV1EnZRWHAgMBAAGjgbcwgbQwHQYDVR0OBBYEFE0R +aEcrj18q1dw+G6nJbsTWR213MIGEBgNVHSMEfTB7gBRNEWhHK49fKtXcPhupyW7E +1kdtd6FgpF4wXDELMAkGA1UEBhMCQVUxEzARBgNVBAgTClF1ZWVuc2xhbmQxGjAY +BgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMRwwGgYDVQQDExNUZXN0IFBDQSAoMTAy +NCBiaXQpggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAUa8B3pho ++Mvxeq9HsEzJxHIFQla05S5J/e/V+DQTYoKiRFchKPrDAdrzYSEvP3h4QJEtsNqQ +JfOxg5M42uLFq7aPGWkF6ZZqZsYS+zA9IVT14g7gNA6Ne+5QtJqQtH9HA24st0T0 +Tga/lZ9M2ovImovaxSL/kRHbpCWcqWVxpOw= +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQCdoWk/3+WcMlfjIrkg40ketmnQaEogQe1LLcuOJV6rKfUSAsPg +wgsabJ/wn8TxA1yy3eKJbFl3OiUXMRsp22Jp85PmemiDzyUIStwk72qhp1imbANZ +vlmlCFKiQrjUyuDfu4TABmn+kkt3vR1YBEOGt+IFye1UBVSATVdRJ2UVhwIDAQAB +AoGAba4fTtuap5l7/8ZsbE7Z1O32KJY4ZcOZukLOLUUhXxXduT+FTgGWujc0/rgc +z9qYCLlNZHOouMYTgtSfYvuMuLZ11VIt0GYH+nRioLShE59Yy+zCRyC+gPigS1kz +xvo14AsOIPYV14Tk/SsHyq6E0eTk7VzaIE197giiINUERPECQQDSKmtPTh/lRKw7 +HSZSM0I1mFWn/1zqrAbontRQY5w98QWIOe5qmzYyFbPXYT3d9BzlsMyhgiRNoBbD +yvohSHXJAkEAwAHx6ezAZeWWzD5yXD36nyjpkVCw7Tk7TSmOceLJMWt1QcrCfqlS +xA5jjpQ6Z8suU5DdtWAryM2sAir1WisYzwJAd6Zcx56jvAQ3xcPXsE6scBTVFzrj +7FqZ6E+cclPzfLQ+QQsyOBE7bpI6e/FJppY26XGZXo3YGzV8IGXrt40oOQJALETG +h86EFXo3qGOFbmsDy4pdP5nBERCu8X1xUCSfintiD4c2DInxgS5oGclnJeMcjTvL +QjQoJCX3UJCi/OUO1QJBAKgcDHWjMvt+l1pjJBsSEZ0HX9AAIIVx0RQmbFGS+F2Q +hhu5l77WnnZOQ9vvhV5u7NPCUF9nhU3jh60qWWO8mkc= +-----END RSA PRIVATE KEY----- From 66868c8fd4054eb99d8b4f255620d8630fa929c2 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 17 Oct 2013 15:47:55 +0200 Subject: [PATCH 264/400] TLS news --- NEWS | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS b/NEWS index c2cf3d76d21d9..57c2938bbf967 100644 --- a/NEWS +++ b/NEWS @@ -43,6 +43,7 @@ PHP NEWS - Openssl: . Added crypto_method option for the ssl stream context. (Martin Jansen) . Added certificate fingerprint support. (Tjerk Meesters) + . Added explicit TLSv1.1 and TLSv1.2 stream transports. (Daniel Lowrey) . Fixed bug #65729 (CN_match gives false positive). (Tjerk Meesters) - PDO_pgsql: From c59d79094925400bbcf208d0f2f03df0a0ac154f Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Thu, 17 Oct 2013 12:15:45 -0700 Subject: [PATCH 265/400] Prepare for OCI8 2.0.5 release --- ext/oci8/package.xml | 9 ++++----- ext/oci8/php_oci8.h | 5 ++--- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index 7eccd9d8f9950..1ef8f1fd855e5 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -58,13 +58,12 @@ libraries are available. PHP -Bump mininum requirements for PHP OCI8 2.0 to PHP 5.2 and Oracle -client library 10.2 (Note this will connect to Oracle Database 8.1.7 -onwards). Use the older OCI8 1.4 if an earlier PHP version or older -Oracle client library support is necessary. +Bump PHP OCI8 2.0 mininum requirements to PHP 5.2 and Oracle client +library 10.2. (Use OCI8 1.4 for older PHP version support or if only +Oracle 9.2 client libraries are available.) Re-enable php_oci8.dll and php_oci8_11g.dll for Windows builds so URL -linking works in the new Windows PECL infrastructure. +links work in the new Windows PECL infrastructure. diff --git a/ext/oci8/php_oci8.h b/ext/oci8/php_oci8.h index 1ea0411073e2e..ee8d83122114f 100644 --- a/ext/oci8/php_oci8.h +++ b/ext/oci8/php_oci8.h @@ -41,12 +41,11 @@ */ #ifdef PHP_OCI8_VERSION /* The definition of PHP_OCI8_VERSION changed in PHP 5.3 and building - * this code with PHP 5.2 and earlier (e.g. when using OCI8 from PECL) - * will conflict. + * this code with PHP 5.2 (e.g. when using OCI8 from PECL) will conflict. */ #undef PHP_OCI8_VERSION #endif -#define PHP_OCI8_VERSION "2.0.5-dev" +#define PHP_OCI8_VERSION "2.0.5" extern zend_module_entry oci8_module_entry; #define phpext_oci8_ptr &oci8_module_entry From 5e368b76ed985a50004126aeba4aaf5dae53aab8 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Thu, 17 Oct 2013 13:49:50 -0700 Subject: [PATCH 266/400] Add missing test to package.xml --- ext/oci8/package.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index 1ef8f1fd855e5..b180b0d5f0bdc 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -276,6 +276,7 @@ links work in the new Windows PECL infrastructure. + From 6b90f237879563497c888024947eb6064fb1b51c Mon Sep 17 00:00:00 2001 From: ArunSK Date: Thu, 17 Oct 2013 22:00:40 -0400 Subject: [PATCH 267/400] fixed typo and few grammar mistakes --- Zend/RFCs/003.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Zend/RFCs/003.txt b/Zend/RFCs/003.txt index 30fb4cec4912f..ac042183d426c 100644 --- a/Zend/RFCs/003.txt +++ b/Zend/RFCs/003.txt @@ -9,11 +9,11 @@ Modified: 2001-09-17 1. Background/Need ================== -Many internal function of PHP will reject parameters because of their +Many internal functions of PHP will reject parameters because of their type (the array and variable function come to mind). For userland this is not an easy task as there is no uniform way to do it. An addition to the engine for requiring loose types would allow -delevopers to know that the data passed to their functions is of the +developers to know that the data passed to their functions are of the correct type and reduce the need for duplicating the same code in every function to check for the type of data. @@ -57,7 +57,7 @@ function foo (array $var){ =========== Mis-matches in type should be reported as fatal errors and should halt -the execution of a script as that function can not be run and code +the execution of a script as that function cannot be run and code following could not reliably run. From 4417421ab6133ce0658e285a4e48d93a27931820 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Fri, 18 Oct 2013 10:33:53 +0800 Subject: [PATCH 268/400] Retruning SUCCESS/FAILURE instead of int --- UPGRADING | 2 ++ ext/phar/php_phar.h | 1 - ext/phar/util.c | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/UPGRADING b/UPGRADING index 39fe2d736929f..43e4118b21245 100755 --- a/UPGRADING +++ b/UPGRADING @@ -343,6 +343,8 @@ None - Intl: - This extension now requires ICU 4.0+. +- Phar: + - Added ability of resolving alias created by Phar::map ======================================== 9. New Global Constants diff --git a/ext/phar/php_phar.h b/ext/phar/php_phar.h index 4146e28f770da..f8325d0c635e3 100644 --- a/ext/phar/php_phar.h +++ b/ext/phar/php_phar.h @@ -34,7 +34,6 @@ extern zend_module_entry phar_module_entry; #define PHP_PHAR_API PHPAPI #endif -#define PHAR_HAVE_RESOLVE_ALIAS PHP_PHAR_API int phar_resolve_alias(char *alias, int alias_len, char **filename, int *filename_len TSRMLS_DC); #endif /* PHP_PHAR_H */ diff --git a/ext/phar/util.c b/ext/phar/util.c index e9f1b1673c324..dc4508f91cd7a 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -1190,9 +1190,9 @@ PHP_PHAR_API int phar_resolve_alias(char *alias, int alias_len, char **filename, if (SUCCESS == zend_hash_find(&(PHAR_GLOBALS->phar_alias_map), alias, alias_len, (void**)&fd_ptr)) { *filename = (*fd_ptr)->fname; *filename_len = (*fd_ptr)->fname_len; - return 1; + return SUCCESS; } - return 0; + return FAILURE; } /* }}} */ From 8713089f22a96e0a21adf79655e2143dc5e07a8b Mon Sep 17 00:00:00 2001 From: jrchamp Date: Fri, 18 Oct 2013 02:01:06 -0400 Subject: [PATCH 269/400] Fix 100.64 IPv4 Range Check --- ext/filter/logical_filters.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/filter/logical_filters.c b/ext/filter/logical_filters.c index 653cce23e6b26..39433d6ece8b4 100644 --- a/ext/filter/logical_filters.c +++ b/ext/filter/logical_filters.c @@ -714,7 +714,7 @@ void php_filter_validate_ip(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */ if (flags & FILTER_FLAG_NO_RES_RANGE) { if ( (ip[0] == 0) || - (ip[0] == 100 && (ip[1] >= 64 || ip[1] <= 127)) || + (ip[0] == 100 && (ip[1] >= 64 && ip[1] <= 127)) || (ip[0] == 128 && ip[1] == 0) || (ip[0] == 191 && ip[1] == 255) || (ip[0] == 169 && ip[1] == 254) || From fd06c5206a40d2d91825a49536ad862587ab6e58 Mon Sep 17 00:00:00 2001 From: jrchamp Date: Fri, 18 Oct 2013 02:04:15 -0400 Subject: [PATCH 270/400] Fix RFC 6598 IPv4 Range --- ext/filter/tests/018.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/filter/tests/018.phpt b/ext/filter/tests/018.phpt index 9c73fc3cfc4e6..75bbd13427994 100644 --- a/ext/filter/tests/018.phpt +++ b/ext/filter/tests/018.phpt @@ -15,7 +15,7 @@ var_dump(filter_var("192.168.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE var_dump(filter_var("192.0.34.166", FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)); var_dump(filter_var("127.0.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); var_dump(filter_var("192.0.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); -var_dump(filter_var("100.0.0.0", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); +var_dump(filter_var("100.64.0.0", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); var_dump(filter_var("100.127.255.255", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); var_dump(filter_var("192.0.34.166", FILTER_VALIDATE_IP)); var_dump(filter_var("256.1237.123.1", FILTER_VALIDATE_IP)); From a03b1328b807766c4104d2f1457660d7ebdcef26 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Fri, 18 Oct 2013 11:34:24 +0200 Subject: [PATCH 271/400] fix compiler warnings and type usage --- ext/ldap/ldap.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c index c5c87ae7072bd..d50b78321fb89 100644 --- a/ext/ldap/ldap.c +++ b/ext/ldap/ldap.c @@ -2143,45 +2143,47 @@ PHP_FUNCTION(ldap_set_rebind_proc) /* }}} */ #endif -static void php_ldap_do_escape(const zend_bool *map, const unsigned char *value, const int valuelen, unsigned char **result, int *resultlen) +static void php_ldap_do_escape(const zend_bool *map, const char *value, size_t valuelen, char **result, size_t *resultlen) { char hex[] = "0123456789abcdef"; int i, p = 0; size_t len = 0; for (i = 0; i < valuelen; i++) { - len += (map[value[i]]) ? 3 : 1; + len += (map[(unsigned char) value[i]]) ? 3 : 1; } - len += 1; - (*result) = (unsigned char *)emalloc(len); - (*resultlen) = (int)len; + (*result) = (char *) safe_emalloc(1, len, 1); + (*resultlen) = len; for (i = 0; i < valuelen; i++) { - if (map[value[i]]) { + unsigned char v = (unsigned char) value[i]; + + if (map[v]) { (*result)[p++] = '\\'; - (*result)[p++] = hex[value[i] >> 4]; - (*result)[p++] = hex[value[i] & 0x0f]; + (*result)[p++] = hex[v >> 4]; + (*result)[p++] = hex[v & 0x0f]; } else { - (*result)[p++] = value[i]; + (*result)[p++] = v; } } (*result)[p++] = '\0'; } -static void php_ldap_escape_map_set_chars(zend_bool *map, const unsigned char *chars, const int charslen, char escape) +static void php_ldap_escape_map_set_chars(zend_bool *map, const char *chars, const int charslen, char escape) { int i = 0; while (i < charslen) { - map[chars[i++]] = escape; + map[(unsigned char) chars[i++]] = escape; } } PHP_FUNCTION(ldap_escape) { - unsigned char *value, *ignores, *result; - int valuelen = 0, ignoreslen = 0, resultlen = 0, i; + char *value, *ignores, *result; + int valuelen = 0, ignoreslen = 0, i; + size_t resultlen; long flags = 0; zend_bool map[256] = {0}, havecharlist = 0; @@ -2215,7 +2217,7 @@ PHP_FUNCTION(ldap_escape) php_ldap_do_escape(map, value, valuelen, &result, &resultlen); - RETURN_STRINGL(result, resultlen - 1, 0); + RETURN_STRINGL(result, resultlen, 0); } #ifdef STR_TRANSLATION From 515ef09b62c6d47b79aad5d87db17b8f0bb15f7a Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Fri, 18 Oct 2013 05:01:16 -0700 Subject: [PATCH 272/400] preserve the error code otherwise it'd be cleared by a subsequent calls --- Zend/zend_virtual_cwd.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c index 968390d353925..e171386b1b3d9 100644 --- a/Zend/zend_virtual_cwd.c +++ b/Zend/zend_virtual_cwd.c @@ -1695,6 +1695,9 @@ CWD_API int virtual_rename(const char *oldname, const char *newname TSRMLS_DC) / cwd_state old_state; cwd_state new_state; int retval; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&old_state, &CWDG(cwd)); if (virtual_file_ex(&old_state, oldname, NULL, CWD_EXPAND TSRMLS_CC)) { @@ -1716,6 +1719,7 @@ CWD_API int virtual_rename(const char *oldname, const char *newname TSRMLS_DC) / #ifdef TSRM_WIN32 /* MoveFileEx returns 0 on failure, other way 'round for this function */ retval = (MoveFileEx(oldname, newname, MOVEFILE_REPLACE_EXISTING|MOVEFILE_COPY_ALLOWED) == 0) ? -1 : 0; + last_error = GetLastError(); #else retval = rename(oldname, newname); #endif @@ -1723,6 +1727,10 @@ CWD_API int virtual_rename(const char *oldname, const char *newname TSRMLS_DC) / CWD_STATE_FREE(&old_state); CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif + return retval; } /* }}} */ From 2786a2a1ab907e0e7d6b69a6feffef46ec956c33 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Fri, 18 Oct 2013 07:00:05 -0700 Subject: [PATCH 273/400] fixed all the places where last error could be lost whereby this commit should be applied to master anyway --- Zend/zend_virtual_cwd.c | 201 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c index e171386b1b3d9..f94227f99d9a7 100644 --- a/Zend/zend_virtual_cwd.c +++ b/Zend/zend_virtual_cwd.c @@ -1484,6 +1484,9 @@ CWD_API FILE *virtual_fopen(const char *path, const char *mode TSRMLS_DC) /* {{{ { cwd_state new_state; FILE *f; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif if (path[0] == '\0') { /* Fail to open empty path */ return NULL; @@ -1491,13 +1494,25 @@ CWD_API FILE *virtual_fopen(const char *path, const char *mode TSRMLS_DC) /* {{{ CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, path, NULL, CWD_EXPAND TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return NULL; } f = fopen(new_state.cwd, mode); +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return f; } /* }}} */ @@ -1506,20 +1521,33 @@ CWD_API int virtual_access(const char *pathname, int mode TSRMLS_DC) /* {{{ */ { cwd_state new_state; int ret; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, pathname, NULL, CWD_REALPATH TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } #if defined(TSRM_WIN32) ret = tsrm_win32_access(new_state.cwd, mode TSRMLS_CC); + last_error = GetLastError(); #else ret = access(new_state.cwd, mode); #endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return ret; } @@ -1579,20 +1607,33 @@ CWD_API int virtual_utime(const char *filename, struct utimbuf *buf TSRMLS_DC) / { cwd_state new_state; int ret; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, filename, NULL, CWD_REALPATH TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } #ifdef TSRM_WIN32 ret = win32_utime(new_state.cwd, buf); + last_error = GetLastError(); #else ret = utime(new_state.cwd, buf); #endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return ret; } /* }}} */ @@ -1602,16 +1643,31 @@ CWD_API int virtual_chmod(const char *filename, mode_t mode TSRMLS_DC) /* {{{ */ { cwd_state new_state; int ret; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, filename, NULL, CWD_REALPATH TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } ret = chmod(new_state.cwd, mode); +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return ret; } /* }}} */ @@ -1621,10 +1677,19 @@ CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group, int li { cwd_state new_state; int ret; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, filename, NULL, CWD_REALPATH TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } @@ -1638,7 +1703,13 @@ CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group, int li ret = chown(new_state.cwd, owner, group); } +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return ret; } /* }}} */ @@ -1648,10 +1719,19 @@ CWD_API int virtual_open(const char *path TSRMLS_DC, int flags, ...) /* {{{ */ { cwd_state new_state; int f; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, path, NULL, CWD_FILEPATH TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } @@ -1667,7 +1747,13 @@ CWD_API int virtual_open(const char *path TSRMLS_DC, int flags, ...) /* {{{ */ } else { f = open(new_state.cwd, flags); } +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return f; } /* }}} */ @@ -1676,16 +1762,31 @@ CWD_API int virtual_creat(const char *path, mode_t mode TSRMLS_DC) /* {{{ */ { cwd_state new_state; int f; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, path, NULL, CWD_FILEPATH TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } f = creat(new_state.cwd, mode); +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return f; } /* }}} */ @@ -1701,15 +1802,27 @@ CWD_API int virtual_rename(const char *oldname, const char *newname TSRMLS_DC) / CWD_STATE_COPY(&old_state, &CWDG(cwd)); if (virtual_file_ex(&old_state, oldname, NULL, CWD_EXPAND TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&old_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } oldname = old_state.cwd; CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, newname, NULL, CWD_EXPAND TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&old_state); CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } newname = new_state.cwd; @@ -1739,16 +1852,31 @@ CWD_API int virtual_stat(const char *path, struct stat *buf TSRMLS_DC) /* {{{ */ { cwd_state new_state; int retval; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, path, NULL, CWD_REALPATH TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } retval = php_sys_stat(new_state.cwd, buf); +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return retval; } /* }}} */ @@ -1757,16 +1885,31 @@ CWD_API int virtual_lstat(const char *path, struct stat *buf TSRMLS_DC) /* {{{ * { cwd_state new_state; int retval; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, path, NULL, CWD_EXPAND TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } retval = php_sys_lstat(new_state.cwd, buf); +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return retval; } /* }}} */ @@ -1775,16 +1918,31 @@ CWD_API int virtual_unlink(const char *path TSRMLS_DC) /* {{{ */ { cwd_state new_state; int retval; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, path, NULL, CWD_EXPAND TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } retval = unlink(new_state.cwd); +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return retval; } /* }}} */ @@ -1793,19 +1951,32 @@ CWD_API int virtual_mkdir(const char *pathname, mode_t mode TSRMLS_DC) /* {{{ */ { cwd_state new_state; int retval; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, pathname, NULL, CWD_FILEPATH TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } #ifdef TSRM_WIN32 retval = mkdir(new_state.cwd); + last_error = GetLastError(); #else retval = mkdir(new_state.cwd, mode); #endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return retval; } /* }}} */ @@ -1814,16 +1985,31 @@ CWD_API int virtual_rmdir(const char *pathname TSRMLS_DC) /* {{{ */ { cwd_state new_state; int retval; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, pathname, NULL, CWD_EXPAND TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return -1; } retval = rmdir(new_state.cwd); +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return retval; } /* }}} */ @@ -1836,16 +2022,31 @@ CWD_API DIR *virtual_opendir(const char *pathname TSRMLS_DC) /* {{{ */ { cwd_state new_state; DIR *retval; +#ifdef TSRM_WIN32 + DWORD last_error; +#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, pathname, NULL, CWD_REALPATH TSRMLS_CC)) { +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return NULL; } retval = opendir(new_state.cwd); +#ifdef TSRM_WIN32 + last_error = GetLastError(); +#endif CWD_STATE_FREE(&new_state); +#ifdef TSRM_WIN32 + SetLastError(last_error); +#endif return retval; } /* }}} */ From 423e1c77b58efe05cbb0d1209b0ea81a64fc5be2 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Fri, 18 Oct 2013 07:57:01 -0700 Subject: [PATCH 274/400] updated NEWS --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index c2cf3d76d21d9..2660df8f63193 100644 --- a/NEWS +++ b/NEWS @@ -16,6 +16,8 @@ PHP NEWS variable. (Mike) . Implemented dedicated syntax for variadic functions (RFC: https://wiki.php.net/rfc/variadics). (Nikita) + . Fixed bug #50333 (Improving multi-threaded scalability by using + emalloc/efree/estrdup)). (yoarvi at gmail dot com, Anatol) - cURL: . Implemented FR #65646 (re-enable CURLOPT_FOLLOWLOCATION with open_basedir From ecd03baf6121a708ff46105da133457d012b13c7 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Fri, 18 Oct 2013 10:02:19 -0700 Subject: [PATCH 275/400] fixed virtual cwd header in phar --- ext/phar/phar_internal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h index 64953f66b72d3..359f25b4c635b 100644 --- a/ext/phar/phar_internal.h +++ b/ext/phar/phar_internal.h @@ -54,7 +54,7 @@ #ifndef PHP_WIN32 #include "TSRM/tsrm_strtok_r.h" #endif -#include "TSRM/tsrm_virtual_cwd.h" +#include "Zend/zend_virtual_cwd.h" #if HAVE_SPL #include "ext/spl/spl_array.h" #include "ext/spl/spl_directory.h" From 1fe1f7305bdc8054dc0fb1f82e0fbd0e99309858 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Fri, 9 Aug 2013 08:32:39 +0200 Subject: [PATCH 276/400] use $YACC instead of 'bison' as suggested by Yasuo Conflicts: Zend/acinclude.m4 --- Zend/acinclude.m4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/acinclude.m4 b/Zend/acinclude.m4 index 77430aba791ea..95b5bf2061536 100644 --- a/Zend/acinclude.m4 +++ b/Zend/acinclude.m4 @@ -12,7 +12,7 @@ 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 From 6919d15a2ef73ae1b01dc881b9624b9a3ea653ce Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sat, 19 Oct 2013 00:01:13 -0700 Subject: [PATCH 277/400] Merge branch 'pull-request/499' Fix RFC 6598 IPv4 Reserved Range Checks --- ext/filter/logical_filters.c | 2 +- ext/filter/tests/018.phpt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/filter/logical_filters.c b/ext/filter/logical_filters.c index 14964883c1b26..03b00bd9f6d3b 100644 --- a/ext/filter/logical_filters.c +++ b/ext/filter/logical_filters.c @@ -714,7 +714,7 @@ void php_filter_validate_ip(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */ if (flags & FILTER_FLAG_NO_RES_RANGE) { if ( (ip[0] == 0) || - (ip[0] == 100 && (ip[1] >= 64 || ip[1] <= 127)) || + (ip[0] == 100 && (ip[1] >= 64 && ip[1] <= 127)) || (ip[0] == 128 && ip[1] == 0) || (ip[0] == 191 && ip[1] == 255) || (ip[0] == 169 && ip[1] == 254) || diff --git a/ext/filter/tests/018.phpt b/ext/filter/tests/018.phpt index 9c73fc3cfc4e6..75bbd13427994 100644 --- a/ext/filter/tests/018.phpt +++ b/ext/filter/tests/018.phpt @@ -15,7 +15,7 @@ var_dump(filter_var("192.168.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE var_dump(filter_var("192.0.34.166", FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)); var_dump(filter_var("127.0.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); var_dump(filter_var("192.0.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); -var_dump(filter_var("100.0.0.0", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); +var_dump(filter_var("100.64.0.0", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); var_dump(filter_var("100.127.255.255", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); var_dump(filter_var("192.0.34.166", FILTER_VALIDATE_IP)); var_dump(filter_var("256.1237.123.1", FILTER_VALIDATE_IP)); From 55b16f40a2db6de9f5de08d284b1c37149e25a49 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sat, 19 Oct 2013 00:01:13 -0700 Subject: [PATCH 278/400] Merge branch 'pull-request/499' Fix RFC 6598 IPv4 Reserved Range Checks --- ext/filter/logical_filters.c | 2 +- ext/filter/tests/018.phpt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/filter/logical_filters.c b/ext/filter/logical_filters.c index 653cce23e6b26..39433d6ece8b4 100644 --- a/ext/filter/logical_filters.c +++ b/ext/filter/logical_filters.c @@ -714,7 +714,7 @@ void php_filter_validate_ip(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */ if (flags & FILTER_FLAG_NO_RES_RANGE) { if ( (ip[0] == 0) || - (ip[0] == 100 && (ip[1] >= 64 || ip[1] <= 127)) || + (ip[0] == 100 && (ip[1] >= 64 && ip[1] <= 127)) || (ip[0] == 128 && ip[1] == 0) || (ip[0] == 191 && ip[1] == 255) || (ip[0] == 169 && ip[1] == 254) || diff --git a/ext/filter/tests/018.phpt b/ext/filter/tests/018.phpt index 9c73fc3cfc4e6..75bbd13427994 100644 --- a/ext/filter/tests/018.phpt +++ b/ext/filter/tests/018.phpt @@ -15,7 +15,7 @@ var_dump(filter_var("192.168.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE var_dump(filter_var("192.0.34.166", FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)); var_dump(filter_var("127.0.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); var_dump(filter_var("192.0.0.1", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); -var_dump(filter_var("100.0.0.0", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); +var_dump(filter_var("100.64.0.0", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); var_dump(filter_var("100.127.255.255", FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); var_dump(filter_var("192.0.34.166", FILTER_VALIDATE_IP)); var_dump(filter_var("256.1237.123.1", FILTER_VALIDATE_IP)); From 4d7d85640dd8e48166e4fd5dbf04aeb18a9e01c4 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Sat, 19 Oct 2013 22:16:31 +0800 Subject: [PATCH 279/400] Need a way to check whether this API exists --- ext/phar/php_phar.h | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/phar/php_phar.h b/ext/phar/php_phar.h index f8325d0c635e3..38ace455b926f 100644 --- a/ext/phar/php_phar.h +++ b/ext/phar/php_phar.h @@ -34,6 +34,7 @@ extern zend_module_entry phar_module_entry; #define PHP_PHAR_API PHPAPI #endif +#define PHP_PHAR_HAS_RESLOVE_ALIAS PHP_PHAR_API int phar_resolve_alias(char *alias, int alias_len, char **filename, int *filename_len TSRMLS_DC); #endif /* PHP_PHAR_H */ From d42fa2a0592a558d85b1dac498e9c5fd1413d49d Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Sat, 19 Oct 2013 22:18:37 +0800 Subject: [PATCH 280/400] Revert "Need a way to check whether this API exists" hmm, we can check whether the head file exists instead This reverts commit 4d7d85640dd8e48166e4fd5dbf04aeb18a9e01c4. --- ext/phar/php_phar.h | 1 - 1 file changed, 1 deletion(-) diff --git a/ext/phar/php_phar.h b/ext/phar/php_phar.h index 38ace455b926f..f8325d0c635e3 100644 --- a/ext/phar/php_phar.h +++ b/ext/phar/php_phar.h @@ -34,7 +34,6 @@ extern zend_module_entry phar_module_entry; #define PHP_PHAR_API PHPAPI #endif -#define PHP_PHAR_HAS_RESLOVE_ALIAS PHP_PHAR_API int phar_resolve_alias(char *alias, int alias_len, char **filename, int *filename_len TSRMLS_DC); #endif /* PHP_PHAR_H */ From df501fd464434967225f2ad8b413ed074db1a884 Mon Sep 17 00:00:00 2001 From: Lior Kaplan Date: Sat, 19 Oct 2013 23:52:43 +0300 Subject: [PATCH 281/400] Use minus sign instead of hyphen --- sapi/fpm/php-fpm.8.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapi/fpm/php-fpm.8.in b/sapi/fpm/php-fpm.8.in index a4e7e74e208d8..b02aa25ba74d4 100644 --- a/sapi/fpm/php-fpm.8.in +++ b/sapi/fpm/php-fpm.8.in @@ -96,7 +96,7 @@ Specify alternative path to FastCGI process manager configuration file (the defa .PD 1 .B \-t Test FPM configuration file and exit -If called twice (-tt), the configuration is dumped before exiting. +If called twice (\-tt), the configuration is dumped before exiting. .TP .PD 0 .B \-\-daemonize From a55d3b9295bec513553bff2522c4720737c4c398 Mon Sep 17 00:00:00 2001 From: Lior Kaplan Date: Sat, 19 Oct 2013 23:53:23 +0300 Subject: [PATCH 282/400] Typo fix: managment -> management --- sapi/fpm/fpm/fpm_children.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapi/fpm/fpm/fpm_children.c b/sapi/fpm/fpm/fpm_children.c index 84a9474332215..45cc075b42a6c 100644 --- a/sapi/fpm/fpm/fpm_children.c +++ b/sapi/fpm/fpm/fpm_children.c @@ -251,7 +251,7 @@ void fpm_children_bury() /* {{{ */ } zlog(severity, "[pool %s] child %d exited %s after %ld.%06d seconds from start", child->wp->config->name, (int) pid, buf, tv2.tv_sec, (int) tv2.tv_usec); } else { - zlog(ZLOG_DEBUG, "[pool %s] child %d has been killed by the process managment after %ld.%06d seconds from start", child->wp->config->name, (int) pid, tv2.tv_sec, (int) tv2.tv_usec); + zlog(ZLOG_DEBUG, "[pool %s] child %d has been killed by the process management after %ld.%06d seconds from start", child->wp->config->name, (int) pid, tv2.tv_sec, (int) tv2.tv_usec); } fpm_child_close(child, 1 /* in event_loop */); From 64caedd927164228c9de2bab97e62a717507bd84 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 19 Oct 2013 23:22:20 +0200 Subject: [PATCH 283/400] Use zend_error_noreturn for all E_COMPILE_ERRORs --- Zend/zend_compile.c | 270 ++++++++++++++++++------------------ Zend/zend_language_parser.y | 4 +- Zend/zend_opcode.c | 4 +- 3 files changed, 139 insertions(+), 139 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 85536f43b7ce2..7ee8dd1e74db3 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -877,7 +877,7 @@ void zend_do_abstract_method(const znode *function_name, znode *modifiers, const if (Z_LVAL(modifiers->u.constant) & ZEND_ACC_ABSTRACT) { if(Z_LVAL(modifiers->u.constant) & ZEND_ACC_PRIVATE) { - zend_error(E_COMPILE_ERROR, "%s function %s::%s() cannot be declared private", method_type, CG(active_class_entry)->name, Z_STRVAL(function_name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "%s function %s::%s() cannot be declared private", method_type, CG(active_class_entry)->name, Z_STRVAL(function_name->u.constant)); } if (Z_LVAL(body->u.constant) == ZEND_ACC_ABSTRACT) { zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC); @@ -887,11 +887,11 @@ void zend_do_abstract_method(const znode *function_name, znode *modifiers, const SET_UNUSED(opline->op2); } else { /* we had code in the function body */ - zend_error(E_COMPILE_ERROR, "%s function %s::%s() cannot contain body", method_type, CG(active_class_entry)->name, Z_STRVAL(function_name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "%s function %s::%s() cannot contain body", method_type, CG(active_class_entry)->name, Z_STRVAL(function_name->u.constant)); } } else { if (Z_LVAL(body->u.constant) == ZEND_ACC_ABSTRACT) { - zend_error(E_COMPILE_ERROR, "Non-abstract method %s::%s() must contain body", CG(active_class_entry)->name, Z_STRVAL(function_name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "Non-abstract method %s::%s() must contain body", CG(active_class_entry)->name, Z_STRVAL(function_name->u.constant)); } } } @@ -951,7 +951,7 @@ void zend_do_assign(znode *result, znode *variable, znode *value TSRMLS_DC) /* { if (variable->op_type == IS_CV) { if (variable->u.op.var == CG(active_op_array)->this_var) { - zend_error(E_COMPILE_ERROR, "Cannot re-assign $this"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot re-assign $this"); } } else if (variable->op_type == IS_VAR) { int n = 0; @@ -997,7 +997,7 @@ void zend_do_assign(znode *result, znode *variable, znode *value TSRMLS_DC) /* { GET_NODE(result, last_op->result); return; } else if (opline_is_fetch_this(last_op TSRMLS_CC)) { - zend_error(E_COMPILE_ERROR, "Cannot re-assign $this"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot re-assign $this"); } else { break; } @@ -1021,7 +1021,7 @@ void zend_do_assign_ref(znode *result, const znode *lvar, const znode *rvar TSRM if (lvar->op_type == IS_CV) { if (lvar->u.op.var == CG(active_op_array)->this_var) { - zend_error(E_COMPILE_ERROR, "Cannot re-assign $this"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot re-assign $this"); } } else if (lvar->op_type == IS_VAR) { int last_op_number = get_next_op_number(CG(active_op_array)); @@ -1029,7 +1029,7 @@ void zend_do_assign_ref(znode *result, const znode *lvar, const znode *rvar TSRM if (last_op_number > 0) { opline = &CG(active_op_array)->opcodes[last_op_number-1]; if (opline_is_fetch_this(opline TSRMLS_CC)) { - zend_error(E_COMPILE_ERROR, "Cannot re-assign $this"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot re-assign $this"); } } } @@ -1271,10 +1271,10 @@ void zend_check_writable_variable(const znode *variable) /* {{{ */ zend_uint type = variable->EA; if (type & ZEND_PARSED_METHOD_CALL) { - zend_error(E_COMPILE_ERROR, "Can't use method return value in write context"); + zend_error_noreturn(E_COMPILE_ERROR, "Can't use method return value in write context"); } if (type == ZEND_PARSED_FUNCTION_CALL) { - zend_error(E_COMPILE_ERROR, "Can't use function return value in write context"); + zend_error_noreturn(E_COMPILE_ERROR, "Can't use function return value in write context"); } } /* }}} */ @@ -1347,7 +1347,7 @@ void zend_do_end_variable_parse(znode *variable, int type, int arg_offset TSRMLS switch (type) { case BP_VAR_R: if (opline->opcode == ZEND_FETCH_DIM_W && opline->op2_type == IS_UNUSED) { - zend_error(E_COMPILE_ERROR, "Cannot use [] for reading"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use [] for reading"); } opline->opcode -= 3; break; @@ -1358,7 +1358,7 @@ void zend_do_end_variable_parse(znode *variable, int type, int arg_offset TSRMLS break; case BP_VAR_IS: if (opline->opcode == ZEND_FETCH_DIM_W && opline->op2_type == IS_UNUSED) { - zend_error(E_COMPILE_ERROR, "Cannot use [] for reading"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use [] for reading"); } opline->opcode += 6; /* 3+3 */ break; @@ -1368,7 +1368,7 @@ void zend_do_end_variable_parse(znode *variable, int type, int arg_offset TSRMLS break; case BP_VAR_UNSET: if (opline->opcode == ZEND_FETCH_DIM_W && opline->op2_type == IS_UNUSED) { - zend_error(E_COMPILE_ERROR, "Cannot use [] for unsetting"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use [] for unsetting"); } opline->opcode += 12; /* 3+3+3+3 */ break; @@ -1496,22 +1496,22 @@ int zend_do_verify_access_types(const znode *current_access_type, const znode *n { if ((Z_LVAL(current_access_type->u.constant) & ZEND_ACC_PPP_MASK) && (Z_LVAL(new_modifier->u.constant) & ZEND_ACC_PPP_MASK)) { - zend_error(E_COMPILE_ERROR, "Multiple access type modifiers are not allowed"); + zend_error_noreturn(E_COMPILE_ERROR, "Multiple access type modifiers are not allowed"); } if ((Z_LVAL(current_access_type->u.constant) & ZEND_ACC_ABSTRACT) && (Z_LVAL(new_modifier->u.constant) & ZEND_ACC_ABSTRACT)) { - zend_error(E_COMPILE_ERROR, "Multiple abstract modifiers are not allowed"); + zend_error_noreturn(E_COMPILE_ERROR, "Multiple abstract modifiers are not allowed"); } if ((Z_LVAL(current_access_type->u.constant) & ZEND_ACC_STATIC) && (Z_LVAL(new_modifier->u.constant) & ZEND_ACC_STATIC)) { - zend_error(E_COMPILE_ERROR, "Multiple static modifiers are not allowed"); + zend_error_noreturn(E_COMPILE_ERROR, "Multiple static modifiers are not allowed"); } if ((Z_LVAL(current_access_type->u.constant) & ZEND_ACC_FINAL) && (Z_LVAL(new_modifier->u.constant) & ZEND_ACC_FINAL)) { - zend_error(E_COMPILE_ERROR, "Multiple final modifiers are not allowed"); + zend_error_noreturn(E_COMPILE_ERROR, "Multiple final modifiers are not allowed"); } if (((Z_LVAL(current_access_type->u.constant) | Z_LVAL(new_modifier->u.constant)) & (ZEND_ACC_ABSTRACT | ZEND_ACC_FINAL)) == (ZEND_ACC_ABSTRACT | ZEND_ACC_FINAL)) { - zend_error(E_COMPILE_ERROR, "Cannot use the final modifier on an abstract class member"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use the final modifier on an abstract class member"); } return (Z_LVAL(current_access_type->u.constant) | Z_LVAL(new_modifier->u.constant)); } @@ -1531,7 +1531,7 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n if (is_method) { if (CG(active_class_entry)->ce_flags & ZEND_ACC_INTERFACE) { if ((Z_LVAL(fn_flags_znode->u.constant) & ~(ZEND_ACC_STATIC|ZEND_ACC_PUBLIC))) { - zend_error(E_COMPILE_ERROR, "Access type for interface method %s::%s() must be omitted", CG(active_class_entry)->name, Z_STRVAL(function_name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "Access type for interface method %s::%s() must be omitted", CG(active_class_entry)->name, Z_STRVAL(function_name->u.constant)); } Z_LVAL(fn_flags_znode->u.constant) |= ZEND_ACC_ABSTRACT; /* propagates to the rest of the parser */ } @@ -1567,7 +1567,7 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n lcname = zend_new_interned_string(zend_str_tolower_dup(name, name_len), name_len + 1, 1 TSRMLS_CC); hash = str_hash(lcname, name_len); if (zend_hash_quick_add(&CG(active_class_entry)->function_table, lcname, name_len+1, hash, &op_array, sizeof(zend_op_array), (void **) &CG(active_op_array)) == FAILURE) { - zend_error(E_COMPILE_ERROR, "Cannot redeclare %s::%s()", CG(active_class_entry)->name, name); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare %s::%s()", CG(active_class_entry)->name, name); } zend_stack_push(&CG(context_stack), (void *) &CG(context), sizeof(CG(context))); @@ -1808,7 +1808,7 @@ void zend_do_end_function_declaration(const znode *function_token TSRMLS_DC) /* zend_str_tolower_copy(lcname, CG(active_op_array)->function_name, MIN(name_len, sizeof(lcname)-1)); lcname[sizeof(lcname)-1] = '\0'; /* zend_str_tolower_copy won't necessarily set the zero byte */ if (name_len == sizeof(ZEND_AUTOLOAD_FUNC_NAME) - 1 && !memcmp(lcname, ZEND_AUTOLOAD_FUNC_NAME, sizeof(ZEND_AUTOLOAD_FUNC_NAME)) && CG(active_op_array)->num_args != 1) { - zend_error(E_COMPILE_ERROR, "%s() must take exactly 1 argument", ZEND_AUTOLOAD_FUNC_NAME); + zend_error_noreturn(E_COMPILE_ERROR, "%s() must take exactly 1 argument", ZEND_AUTOLOAD_FUNC_NAME); } } @@ -1829,7 +1829,7 @@ void zend_do_receive_param(zend_uchar op, znode *varname, const znode *initializ znode var; if (zend_is_auto_global(Z_STRVAL(varname->u.constant), Z_STRLEN(varname->u.constant) TSRMLS_CC)) { - zend_error(E_COMPILE_ERROR, "Cannot re-assign auto-global variable %s", Z_STRVAL(varname->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot re-assign auto-global variable %s", Z_STRVAL(varname->u.constant)); } else { var.op_type = IS_CV; var.u.op.var = lookup_cv(CG(active_op_array), Z_STRVAL(varname->u.constant), Z_STRLEN(varname->u.constant), 0 TSRMLS_CC); @@ -1840,19 +1840,19 @@ void zend_do_receive_param(zend_uchar op, znode *varname, const znode *initializ !memcmp(Z_STRVAL(varname->u.constant), "this", sizeof("this")-1)) { if (CG(active_op_array)->scope && (CG(active_op_array)->fn_flags & ZEND_ACC_STATIC) == 0) { - zend_error(E_COMPILE_ERROR, "Cannot re-assign $this"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot re-assign $this"); } CG(active_op_array)->this_var = var.u.op.var; } } if (CG(active_op_array)->fn_flags & ZEND_ACC_VARIADIC) { - zend_error(E_COMPILE_ERROR, "Only the last parameter can be variadic"); + zend_error_noreturn(E_COMPILE_ERROR, "Only the last parameter can be variadic"); } if (is_variadic) { if (op == ZEND_RECV_INIT) { - zend_error(E_COMPILE_ERROR, "Variadic parameter cannot have a default value"); + zend_error_noreturn(E_COMPILE_ERROR, "Variadic parameter cannot have a default value"); } op = ZEND_RECV_VARIADIC; @@ -1894,7 +1894,7 @@ void zend_do_receive_param(zend_uchar op, znode *varname, const znode *initializ if (Z_TYPE(initialization->u.constant) == IS_NULL || (Z_TYPE(initialization->u.constant) == IS_CONSTANT && !strcasecmp(Z_STRVAL(initialization->u.constant), "NULL"))) { cur_arg_info->allow_null = 1; } else if (Z_TYPE(initialization->u.constant) != IS_ARRAY && Z_TYPE(initialization->u.constant) != IS_CONSTANT_ARRAY) { - zend_error(E_COMPILE_ERROR, "Default value for parameters with array type hint can only be an array or NULL"); + zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters with array type hint can only be an array or NULL"); } } } else if (class_type->u.constant.type == IS_CALLABLE) { @@ -1903,7 +1903,7 @@ void zend_do_receive_param(zend_uchar op, znode *varname, const znode *initializ if (Z_TYPE(initialization->u.constant) == IS_NULL || (Z_TYPE(initialization->u.constant) == IS_CONSTANT && !strcasecmp(Z_STRVAL(initialization->u.constant), "NULL"))) { cur_arg_info->allow_null = 1; } else { - zend_error(E_COMPILE_ERROR, "Default value for parameters with callable type hint can only be NULL"); + zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters with callable type hint can only be NULL"); } } } else { @@ -1918,7 +1918,7 @@ void zend_do_receive_param(zend_uchar op, znode *varname, const znode *initializ if (Z_TYPE(initialization->u.constant) == IS_NULL || (Z_TYPE(initialization->u.constant) == IS_CONSTANT && !strcasecmp(Z_STRVAL(initialization->u.constant), "NULL"))) { cur_arg_info->allow_null = 1; } else { - zend_error(E_COMPILE_ERROR, "Default value for parameters with a class type hint can only be NULL"); + zend_error_noreturn(E_COMPILE_ERROR, "Default value for parameters with a class type hint can only be NULL"); } } } @@ -1979,7 +1979,7 @@ void zend_do_begin_method_call(znode *left_bracket TSRMLS_DC) /* {{{ */ if ((last_op->op2_type == IS_CONST) && (Z_TYPE(CONSTANT(last_op->op2.constant)) == IS_STRING) && (Z_STRLEN(CONSTANT(last_op->op2.constant)) == sizeof(ZEND_CLONE_FUNC_NAME)-1) && !zend_binary_strcasecmp(Z_STRVAL(CONSTANT(last_op->op2.constant)), Z_STRLEN(CONSTANT(last_op->op2.constant)), ZEND_CLONE_FUNC_NAME, sizeof(ZEND_CLONE_FUNC_NAME)-1)) { - zend_error(E_COMPILE_ERROR, "Cannot call __clone() method on objects - use 'clone $obj' instead"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot call __clone() method on objects - use 'clone $obj' instead"); } if (last_op->opcode == ZEND_FETCH_OBJ_R) { @@ -1987,7 +1987,7 @@ void zend_do_begin_method_call(znode *left_bracket TSRMLS_DC) /* {{{ */ zval name; name = CONSTANT(last_op->op2.constant); if (Z_TYPE(name) != IS_STRING) { - zend_error(E_COMPILE_ERROR, "Method name must be a string"); + zend_error_noreturn(E_COMPILE_ERROR, "Method name must be a string"); } Z_STRVAL(name) = str_estrndup(Z_STRVAL(name), Z_STRLEN(name)); FREE_POLYMORPHIC_CACHE_SLOT(last_op->op2.constant); @@ -2132,7 +2132,7 @@ void zend_do_resolve_class_name(znode *result, znode *class_name, int is_static switch (lctype) { case ZEND_FETCH_CLASS_SELF: if (!CG(active_class_entry)) { - zend_error(E_COMPILE_ERROR, "Cannot access self::class when no class scope is active"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot access self::class when no class scope is active"); } zval_dtor(&class_name->u.constant); class_name->op_type = IS_CONST; @@ -2142,13 +2142,13 @@ void zend_do_resolve_class_name(znode *result, znode *class_name, int is_static case ZEND_FETCH_CLASS_STATIC: case ZEND_FETCH_CLASS_PARENT: if (is_static) { - zend_error(E_COMPILE_ERROR, + zend_error_noreturn(E_COMPILE_ERROR, "%s::class cannot be used for compile-time class name resolution", lctype == ZEND_FETCH_CLASS_STATIC ? "static" : "parent" ); } if (!CG(active_class_entry)) { - zend_error(E_COMPILE_ERROR, + zend_error_noreturn(E_COMPILE_ERROR, "Cannot access %s::class when no class scope is active", lctype == ZEND_FETCH_CLASS_STATIC ? "static" : "parent" ); @@ -2188,7 +2188,7 @@ void zend_resolve_class_name(znode *class_name TSRMLS_DC) /* {{{ */ Z_STRLEN(class_name->u.constant) + 1); if (ZEND_FETCH_CLASS_DEFAULT != zend_get_class_fetch_type(Z_STRVAL(class_name->u.constant), Z_STRLEN(class_name->u.constant))) { - zend_error(E_COMPILE_ERROR, "'\\%s' is an invalid class name", Z_STRVAL(class_name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "'\\%s' is an invalid class name", Z_STRVAL(class_name->u.constant)); } } else { if (CG(current_import)) { @@ -2296,7 +2296,7 @@ void zend_do_label(znode *label TSRMLS_DC) /* {{{ */ dest.opline_num = get_next_op_number(CG(active_op_array)); if (zend_hash_add(CG(context).labels, Z_STRVAL(label->u.constant), Z_STRLEN(label->u.constant) + 1, (void**)&dest, sizeof(zend_label), NULL) == FAILURE) { - zend_error(E_COMPILE_ERROR, "Label '%s' already defined", Z_STRVAL(label->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "Label '%s' already defined", Z_STRVAL(label->u.constant)); } /* Done with label now */ @@ -2322,7 +2322,7 @@ void zend_resolve_goto_label(zend_op_array *op_array, zend_op *opline, int pass2 CG(in_compilation) = 1; CG(active_op_array) = op_array; CG(zend_lineno) = opline->lineno; - zend_error(E_COMPILE_ERROR, "'goto' to undefined label '%s'", Z_STRVAL_P(label)); + zend_error_noreturn(E_COMPILE_ERROR, "'goto' to undefined label '%s'", Z_STRVAL_P(label)); } else { /* Label is not defined. Delay to pass 2. */ INC_BPC(op_array); @@ -2343,7 +2343,7 @@ void zend_resolve_goto_label(zend_op_array *op_array, zend_op *opline, int pass2 CG(active_op_array) = op_array; CG(zend_lineno) = opline->lineno; } - zend_error(E_COMPILE_ERROR, "'goto' into loop or switch statement is disallowed"); + zend_error_noreturn(E_COMPILE_ERROR, "'goto' into loop or switch statement is disallowed"); } current = op_array->brk_cont_array[current].parent; } @@ -2430,7 +2430,7 @@ int zend_do_begin_class_member_function_call(znode *class_name, znode *method_na if (method_name->op_type == IS_CONST) { char *lcname; if (Z_TYPE(method_name->u.constant) != IS_STRING) { - zend_error(E_COMPILE_ERROR, "Method name must be a string"); + zend_error_noreturn(E_COMPILE_ERROR, "Method name must be a string"); } lcname = zend_str_tolower_dup(Z_STRVAL(method_name->u.constant), Z_STRLEN(method_name->u.constant)); if ((sizeof(ZEND_CONSTRUCTOR_FUNC_NAME)-1) == Z_STRLEN(method_name->u.constant) && @@ -2539,12 +2539,12 @@ void zend_do_pass_param(znode *param, zend_uchar op, int offset TSRMLS_DC) /* {{ function_ptr->common.function_name && function_ptr->common.type == ZEND_USER_FUNCTION && !ARG_SHOULD_BE_SENT_BY_REF(function_ptr, (zend_uint) offset)) { - zend_error(E_COMPILE_ERROR, + zend_error_noreturn(E_COMPILE_ERROR, "Call-time pass-by-reference has been removed; " "If you would like to pass argument by reference, modify the declaration of %s().", function_ptr->common.function_name); } else { - zend_error(E_COMPILE_ERROR, "Call-time pass-by-reference has been removed"); + zend_error_noreturn(E_COMPILE_ERROR, "Call-time pass-by-reference has been removed"); } return; } @@ -2585,7 +2585,7 @@ void zend_do_pass_param(znode *param, zend_uchar op, int offset TSRMLS_DC) /* {{ op = ZEND_SEND_REF; break; default: - zend_error(E_COMPILE_ERROR, "Only variables can be passed by reference"); + zend_error_noreturn(E_COMPILE_ERROR, "Only variables can be passed by reference"); break; } } @@ -2734,7 +2734,7 @@ void zend_do_yield(znode *result, znode *value, const znode *key, zend_bool is_v zend_op *opline; if (!CG(active_op_array)->function_name) { - zend_error(E_COMPILE_ERROR, "The \"yield\" expression can only be used inside a function"); + zend_error_noreturn(E_COMPILE_ERROR, "The \"yield\" expression can only be used inside a function"); } CG(active_op_array)->fn_flags |= ZEND_ACC_GENERATOR; @@ -2874,7 +2874,7 @@ void zend_do_begin_catch(znode *catch_token, znode *class_name, znode *catch_var zend_resolve_class_name(class_name TSRMLS_CC); catch_class = *class_name; } else { - zend_error(E_COMPILE_ERROR, "Bad class name in the catch statement"); + zend_error_noreturn(E_COMPILE_ERROR, "Bad class name in the catch statement"); } catch_op_number = get_next_op_number(CG(active_op_array)); @@ -2923,7 +2923,7 @@ void zend_do_bind_catch(znode *try_token, znode *catch_token TSRMLS_DC) /* {{{ * void zend_do_end_finally(znode *try_token, znode* catch_token, znode *finally_token TSRMLS_DC) /* {{{ */ { if (catch_token->op_type == IS_UNUSED && finally_token->op_type == IS_UNUSED) { - zend_error(E_COMPILE_ERROR, "Cannot use try without catch or finally"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use try without catch or finally"); } if (finally_token->op_type != IS_UNUSED) { zend_op *opline; @@ -3406,14 +3406,14 @@ static void do_inheritance_check_on_method(zend_function *child, zend_function * && parent->common.fn_flags & ZEND_ACC_ABSTRACT && parent->common.scope != (child->common.prototype ? child->common.prototype->common.scope : child->common.scope) && child->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_IMPLEMENTED_ABSTRACT)) { - zend_error(E_COMPILE_ERROR, "Can't inherit abstract function %s::%s() (previously declared abstract in %s)", + zend_error_noreturn(E_COMPILE_ERROR, "Can't inherit abstract function %s::%s() (previously declared abstract in %s)", parent->common.scope->name, child->common.function_name, child->common.prototype ? child->common.prototype->common.scope->name : child->common.scope->name); } if (parent_flags & ZEND_ACC_FINAL) { - zend_error(E_COMPILE_ERROR, "Cannot override final method %s::%s()", ZEND_FN_SCOPE_NAME(parent), child->common.function_name); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot override final method %s::%s()", ZEND_FN_SCOPE_NAME(parent), child->common.function_name); } child_flags = child->common.fn_flags; @@ -3421,15 +3421,15 @@ static void do_inheritance_check_on_method(zend_function *child, zend_function * */ if ((child_flags & ZEND_ACC_STATIC) != (parent_flags & ZEND_ACC_STATIC)) { if (child->common.fn_flags & ZEND_ACC_STATIC) { - zend_error(E_COMPILE_ERROR, "Cannot make non static method %s::%s() static in class %s", ZEND_FN_SCOPE_NAME(parent), child->common.function_name, ZEND_FN_SCOPE_NAME(child)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot make non static method %s::%s() static in class %s", ZEND_FN_SCOPE_NAME(parent), child->common.function_name, ZEND_FN_SCOPE_NAME(child)); } else { - zend_error(E_COMPILE_ERROR, "Cannot make static method %s::%s() non static in class %s", ZEND_FN_SCOPE_NAME(parent), child->common.function_name, ZEND_FN_SCOPE_NAME(child)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot make static method %s::%s() non static in class %s", ZEND_FN_SCOPE_NAME(parent), child->common.function_name, ZEND_FN_SCOPE_NAME(child)); } } /* Disallow making an inherited method abstract. */ if ((child_flags & ZEND_ACC_ABSTRACT) && !(parent_flags & ZEND_ACC_ABSTRACT)) { - zend_error(E_COMPILE_ERROR, "Cannot make non abstract method %s::%s() abstract in class %s", ZEND_FN_SCOPE_NAME(parent), child->common.function_name, ZEND_FN_SCOPE_NAME(child)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot make non abstract method %s::%s() abstract in class %s", ZEND_FN_SCOPE_NAME(parent), child->common.function_name, ZEND_FN_SCOPE_NAME(child)); } if (parent_flags & ZEND_ACC_CHANGED) { @@ -3438,7 +3438,7 @@ static void do_inheritance_check_on_method(zend_function *child, zend_function * /* Prevent derived classes from restricting access that was available in parent classes */ if ((child_flags & ZEND_ACC_PPP_MASK) > (parent_flags & ZEND_ACC_PPP_MASK)) { - zend_error(E_COMPILE_ERROR, "Access level to %s::%s() must be %s (as in class %s)%s", ZEND_FN_SCOPE_NAME(child), child->common.function_name, zend_visibility_string(parent_flags), ZEND_FN_SCOPE_NAME(parent), (parent_flags&ZEND_ACC_PUBLIC) ? "" : " or weaker"); + zend_error_noreturn(E_COMPILE_ERROR, "Access level to %s::%s() must be %s (as in class %s)%s", ZEND_FN_SCOPE_NAME(child), child->common.function_name, zend_visibility_string(parent_flags), ZEND_FN_SCOPE_NAME(parent), (parent_flags&ZEND_ACC_PUBLIC) ? "" : " or weaker"); } else if (((child_flags & ZEND_ACC_PPP_MASK) < (parent_flags & ZEND_ACC_PPP_MASK)) && ((parent_flags & ZEND_ACC_PPP_MASK) & ZEND_ACC_PRIVATE)) { child->common.fn_flags |= ZEND_ACC_CHANGED; @@ -3457,7 +3457,7 @@ static void do_inheritance_check_on_method(zend_function *child, zend_function * if (child->common.prototype && (child->common.prototype->common.fn_flags & ZEND_ACC_ABSTRACT)) { if (!zend_do_perform_implementation_check(child, child->common.prototype TSRMLS_CC)) { - zend_error(E_COMPILE_ERROR, "Declaration of %s::%s() must be compatible with %s", ZEND_FN_SCOPE_NAME(child), child->common.function_name, zend_get_function_declaration(child->common.prototype TSRMLS_CC)); + zend_error_noreturn(E_COMPILE_ERROR, "Declaration of %s::%s() must be compatible with %s", ZEND_FN_SCOPE_NAME(child), child->common.function_name, zend_get_function_declaration(child->common.prototype TSRMLS_CC)); } } else if (EG(error_reporting) & E_STRICT || EG(user_error_handler)) { /* Check E_STRICT (or custom error handler) before the check so that we save some time */ if (!zend_do_perform_implementation_check(child, parent TSRMLS_CC)) { @@ -3511,7 +3511,7 @@ static zend_bool do_inherit_property_access_check(HashTable *target_ht, zend_pro if (zend_hash_quick_find(&ce->properties_info, hash_key->arKey, hash_key->nKeyLength, hash_key->h, (void **) &child_info)==SUCCESS) { if ((parent_info->flags & ZEND_ACC_STATIC) != (child_info->flags & ZEND_ACC_STATIC)) { - zend_error(E_COMPILE_ERROR, "Cannot redeclare %s%s::$%s as %s%s::$%s", + zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare %s%s::$%s as %s%s::$%s", (parent_info->flags & ZEND_ACC_STATIC) ? "static " : "non static ", parent_ce->name, hash_key->arKey, (child_info->flags & ZEND_ACC_STATIC) ? "static " : "non static ", ce->name, hash_key->arKey); @@ -3522,7 +3522,7 @@ static zend_bool do_inherit_property_access_check(HashTable *target_ht, zend_pro } if ((child_info->flags & ZEND_ACC_PPP_MASK) > (parent_info->flags & ZEND_ACC_PPP_MASK)) { - zend_error(E_COMPILE_ERROR, "Access level to %s::$%s must be %s (as in class %s)%s", ce->name, hash_key->arKey, zend_visibility_string(parent_info->flags), parent_ce->name, (parent_info->flags&ZEND_ACC_PUBLIC) ? "" : " or weaker"); + zend_error_noreturn(E_COMPILE_ERROR, "Access level to %s::$%s must be %s (as in class %s)%s", ce->name, hash_key->arKey, zend_visibility_string(parent_info->flags), parent_ce->name, (parent_info->flags&ZEND_ACC_PUBLIC) ? "" : " or weaker"); } else if ((child_info->flags & ZEND_ACC_STATIC) == 0) { zval_ptr_dtor(&(ce->default_properties_table[parent_info->offset])); ce->default_properties_table[parent_info->offset] = ce->default_properties_table[child_info->offset]; @@ -3607,10 +3607,10 @@ ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent if ((ce->ce_flags & ZEND_ACC_INTERFACE) && !(parent_ce->ce_flags & ZEND_ACC_INTERFACE)) { - zend_error(E_COMPILE_ERROR, "Interface %s may not inherit from class (%s)", ce->name, parent_ce->name); + zend_error_noreturn(E_COMPILE_ERROR, "Interface %s may not inherit from class (%s)", ce->name, parent_ce->name); } if (parent_ce->ce_flags & ZEND_ACC_FINAL_CLASS) { - zend_error(E_COMPILE_ERROR, "Class %s may not inherit from final class (%s)", ce->name, parent_ce->name); + zend_error_noreturn(E_COMPILE_ERROR, "Class %s may not inherit from final class (%s)", ce->name, parent_ce->name); } ce->parent = parent_ce; @@ -3732,7 +3732,7 @@ static zend_bool do_inherit_constant_check(HashTable *child_constants_table, con if (zend_hash_quick_find(child_constants_table, hash_key->arKey, hash_key->nKeyLength, hash_key->h, (void**)&old_constant) == SUCCESS) { if (*old_constant != *parent_constant) { - zend_error(E_COMPILE_ERROR, "Cannot inherit previously-inherited or override constant %s from interface %s", hash_key->arKey, iface->name); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot inherit previously-inherited or override constant %s from interface %s", hash_key->arKey, iface->name); } return 0; } @@ -3764,7 +3764,7 @@ ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry if (i < parent_iface_num) { ignore = 1; } else { - zend_error(E_COMPILE_ERROR, "Class %s cannot implement previously implemented interface %s", ce->name, iface->name); + zend_error_noreturn(E_COMPILE_ERROR, "Class %s cannot implement previously implemented interface %s", ce->name, iface->name); } } } @@ -3837,7 +3837,7 @@ static void zend_add_magic_methods(zend_class_entry* ce, const char* mname, uint ce->clone = fe; fe->common.fn_flags |= ZEND_ACC_CLONE; } else if (!strncmp(mname, ZEND_CONSTRUCTOR_FUNC_NAME, mname_len)) { if (ce->constructor) { - zend_error(E_COMPILE_ERROR, "%s has colliding constructor definitions coming from traits", ce->name); + zend_error_noreturn(E_COMPILE_ERROR, "%s has colliding constructor definitions coming from traits", ce->name); } ce->constructor = fe; fe->common.fn_flags |= ZEND_ACC_CTOR; } else if (!strncmp(mname, ZEND_DESTRUCTOR_FUNC_NAME, mname_len)) { @@ -3862,7 +3862,7 @@ static void zend_add_magic_methods(zend_class_entry* ce, const char* mname, uint lowercase_name = (char*)zend_new_interned_string(lowercase_name, ce->name_length + 1, 1 TSRMLS_CC); if (!memcmp(mname, lowercase_name, mname_len)) { if (ce->constructor) { - zend_error(E_COMPILE_ERROR, "%s has colliding constructor definitions coming from traits", ce->name); + zend_error_noreturn(E_COMPILE_ERROR, "%s has colliding constructor definitions coming from traits", ce->name); } ce->constructor = fe; fe->common.fn_flags |= ZEND_ACC_CTOR; @@ -3886,14 +3886,14 @@ static void zend_add_trait_method(zend_class_entry *ce, const char *name, const if (existing_fn->common.fn_flags & ZEND_ACC_ABSTRACT) { /* Make sure the trait method is compatible with previosly declared abstract method */ if (!zend_traits_method_compatibility_check(fn, existing_fn TSRMLS_CC)) { - zend_error(E_COMPILE_ERROR, "Declaration of %s must be compatible with %s", + zend_error_noreturn(E_COMPILE_ERROR, "Declaration of %s must be compatible with %s", zend_get_function_declaration(fn TSRMLS_CC), zend_get_function_declaration(existing_fn TSRMLS_CC)); } } else if (fn->common.fn_flags & ZEND_ACC_ABSTRACT) { /* Make sure the abstract declaration is compatible with previous declaration */ if (!zend_traits_method_compatibility_check(existing_fn, fn TSRMLS_CC)) { - zend_error(E_COMPILE_ERROR, "Declaration of %s must be compatible with %s", + zend_error_noreturn(E_COMPILE_ERROR, "Declaration of %s must be compatible with %s", zend_get_function_declaration(fn TSRMLS_CC), zend_get_function_declaration(existing_fn TSRMLS_CC)); } @@ -3909,25 +3909,25 @@ static void zend_add_trait_method(zend_class_entry *ce, const char *name, const } else if (existing_fn->common.fn_flags & ZEND_ACC_ABSTRACT) { /* Make sure the trait method is compatible with previosly declared abstract method */ if (!zend_traits_method_compatibility_check(fn, existing_fn TSRMLS_CC)) { - zend_error(E_COMPILE_ERROR, "Declaration of %s must be compatible with %s", + zend_error_noreturn(E_COMPILE_ERROR, "Declaration of %s must be compatible with %s", zend_get_function_declaration(fn TSRMLS_CC), zend_get_function_declaration(existing_fn TSRMLS_CC)); } } else if (fn->common.fn_flags & ZEND_ACC_ABSTRACT) { /* Make sure the abstract declaration is compatible with previous declaration */ if (!zend_traits_method_compatibility_check(existing_fn, fn TSRMLS_CC)) { - zend_error(E_COMPILE_ERROR, "Declaration of %s must be compatible with %s", + zend_error_noreturn(E_COMPILE_ERROR, "Declaration of %s must be compatible with %s", zend_get_function_declaration(fn TSRMLS_CC), zend_get_function_declaration(existing_fn TSRMLS_CC)); } return; } else if ((existing_fn->common.scope->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) { - /* two trais can't define the same non-abstract method */ + /* two traits can't define the same non-abstract method */ #if 1 - zend_error(E_COMPILE_ERROR, "Trait method %s has not been applied, because there are collisions with other trait methods on %s", + zend_error_noreturn(E_COMPILE_ERROR, "Trait method %s has not been applied, because there are collisions with other trait methods on %s", name, ce->name); -#else /* TODO: better errot message */ - zend_error(E_COMPILE_ERROR, "Trait method %s::%s has not been applied as %s::%s, because of collision with %s::%s", +#else /* TODO: better error message */ + zend_error_noreturn(E_COMPILE_ERROR, "Trait method %s::%s has not been applied as %s::%s, because of collision with %s::%s", fn->common.scope->name, fn->common.function_name, ce->name, name, existing_fn->common.scope->name, existing_fn->common.function_name); @@ -4051,7 +4051,7 @@ static void zend_check_trait_usage(zend_class_entry *ce, zend_class_entry *trait zend_uint i; if ((trait->ce_flags & ZEND_ACC_TRAIT) != ZEND_ACC_TRAIT) { - zend_error(E_COMPILE_ERROR, "Class %s is not a trait, Only traits may be used in 'as' and 'insteadof' statements", trait->name); + zend_error_noreturn(E_COMPILE_ERROR, "Class %s is not a trait, Only traits may be used in 'as' and 'insteadof' statements", trait->name); } for (i = 0; i < ce->num_traits; i++) { @@ -4059,7 +4059,7 @@ static void zend_check_trait_usage(zend_class_entry *ce, zend_class_entry *trait return; } } - zend_error(E_COMPILE_ERROR, "Required Trait %s wasn't added to %s", trait->name, ce->name); + zend_error_noreturn(E_COMPILE_ERROR, "Required Trait %s wasn't added to %s", trait->name, ce->name); } /* }}} */ @@ -4080,7 +4080,7 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce TSRMLS_DC) /* cur_method_ref = cur_precedence->trait_method; if (!(cur_precedence->trait_method->ce = zend_fetch_class(cur_method_ref->class_name, cur_method_ref->cname_len, ZEND_FETCH_CLASS_TRAIT|ZEND_FETCH_CLASS_NO_AUTOLOAD TSRMLS_CC))) { - zend_error(E_COMPILE_ERROR, "Could not find trait %s", cur_method_ref->class_name); + zend_error_noreturn(E_COMPILE_ERROR, "Could not find trait %s", cur_method_ref->class_name); } zend_check_trait_usage(ce, cur_precedence->trait_method->ce TSRMLS_CC); @@ -4092,7 +4092,7 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce TSRMLS_DC) /* cur_method_ref->mname_len + 1); efree(lcname); if (!method_exists) { - zend_error(E_COMPILE_ERROR, + zend_error_noreturn(E_COMPILE_ERROR, "A precedence rule was defined for %s::%s but this method does not exist", cur_method_ref->ce->name, cur_method_ref->method_name); @@ -4110,14 +4110,14 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce TSRMLS_DC) /* zend_uint name_length = strlen(class_name); if (!(cur_precedence->exclude_from_classes[j] = zend_fetch_class(class_name, name_length, ZEND_FETCH_CLASS_TRAIT |ZEND_FETCH_CLASS_NO_AUTOLOAD TSRMLS_CC))) { - zend_error(E_COMPILE_ERROR, "Could not find trait %s", class_name); + zend_error_noreturn(E_COMPILE_ERROR, "Could not find trait %s", class_name); } zend_check_trait_usage(ce, cur_precedence->exclude_from_classes[j] TSRMLS_CC); /* make sure that the trait method is not from a class mentioned in exclude_from_classes, for consistency */ if (cur_precedence->trait_method->ce == cur_precedence->exclude_from_classes[i]) { - zend_error(E_COMPILE_ERROR, + zend_error_noreturn(E_COMPILE_ERROR, "Inconsistent insteadof definition. " "The method %s is to be used from %s, but %s is also on the exclude list", cur_method_ref->method_name, @@ -4140,7 +4140,7 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce TSRMLS_DC) /* if (ce->trait_aliases[i]->trait_method->class_name) { cur_method_ref = ce->trait_aliases[i]->trait_method; if (!(cur_method_ref->ce = zend_fetch_class(cur_method_ref->class_name, cur_method_ref->cname_len, ZEND_FETCH_CLASS_TRAIT|ZEND_FETCH_CLASS_NO_AUTOLOAD TSRMLS_CC))) { - zend_error(E_COMPILE_ERROR, "Could not find trait %s", cur_method_ref->class_name); + zend_error_noreturn(E_COMPILE_ERROR, "Could not find trait %s", cur_method_ref->class_name); } zend_check_trait_usage(ce, cur_method_ref->ce TSRMLS_CC); @@ -4152,7 +4152,7 @@ static void zend_traits_init_trait_structures(zend_class_entry *ce TSRMLS_DC) /* efree(lcname); if (!method_exists) { - zend_error(E_COMPILE_ERROR, "An alias was defined for %s::%s but this method does not exist", cur_method_ref->ce->name, cur_method_ref->method_name); + zend_error_noreturn(E_COMPILE_ERROR, "An alias was defined for %s::%s but this method does not exist", cur_method_ref->ce->name, cur_method_ref->method_name); } } i++; @@ -4178,7 +4178,7 @@ static void zend_traits_compile_exclude_table(HashTable* exclude_table, zend_tra if (zend_hash_add(exclude_table, lcname, lcname_len, NULL, 0, NULL) == FAILURE) { efree(lcname); - zend_error(E_COMPILE_ERROR, "Failed to evaluate a trait precedence (%s). Method of trait %s was defined to be excluded multiple times", precedences[i]->trait_method->method_name, trait->name); + zend_error_noreturn(E_COMPILE_ERROR, "Failed to evaluate a trait precedence (%s). Method of trait %s was defined to be excluded multiple times", precedences[i]->trait_method->method_name, trait->name); } efree(lcname); } @@ -4303,7 +4303,7 @@ static void zend_do_traits_property_binding(zend_class_entry *ce TSRMLS_DC) /* { } if (not_compatible) { - zend_error(E_COMPILE_ERROR, + zend_error_noreturn(E_COMPILE_ERROR, "%s and %s define the same property ($%s) in the composition of %s. However, the definition differs and is considered incompatible. Class was composed", find_first_definition(ce, i, prop_name, prop_name_length, prop_hash, coliding_prop->ce)->name, property_info->ce->name, @@ -4352,7 +4352,7 @@ static void zend_do_check_for_inconsistent_traits_aliasing(zend_class_entry *ce if (!cur_alias->trait_method->ce) { if (cur_alias->alias) { /** Plain old inconsistency/typo/bug */ - zend_error(E_COMPILE_ERROR, + zend_error_noreturn(E_COMPILE_ERROR, "An alias (%s) was defined for method %s(), but this method does not exist", cur_alias->alias, cur_alias->trait_method->method_name); @@ -4371,12 +4371,12 @@ static void zend_do_check_for_inconsistent_traits_aliasing(zend_class_entry *ce lc_method_name, cur_alias->trait_method->mname_len+1)) { efree(lc_method_name); - zend_error(E_COMPILE_ERROR, + zend_error_noreturn(E_COMPILE_ERROR, "The modifiers for the trait alias %s() need to be changed in the same statment in which the alias is defined. Error", cur_alias->trait_method->method_name); } else { efree(lc_method_name); - zend_error(E_COMPILE_ERROR, + zend_error_noreturn(E_COMPILE_ERROR, "The modifiers of the trait method %s() are changed, but this method does not exist. Error", cur_alias->trait_method->method_name); @@ -4485,13 +4485,13 @@ void zend_add_trait_alias(znode *method_reference, znode *modifiers, znode *alia zend_trait_alias *trait_alias; if (Z_LVAL(modifiers->u.constant) == ZEND_ACC_STATIC) { - zend_error(E_COMPILE_ERROR, "Cannot use 'static' as method modifier"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use 'static' as method modifier"); return; } else if (Z_LVAL(modifiers->u.constant) == ZEND_ACC_ABSTRACT) { - zend_error(E_COMPILE_ERROR, "Cannot use 'abstract' as method modifier"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use 'abstract' as method modifier"); return; } else if (Z_LVAL(modifiers->u.constant) == ZEND_ACC_FINAL) { - zend_error(E_COMPILE_ERROR, "Cannot use 'final' as method modifier"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use 'final' as method modifier"); return; } @@ -4533,7 +4533,7 @@ ZEND_API zend_class_entry *do_bind_class(const zend_op_array* op_array, const ze op2 = opline->op2.zv; } if (zend_hash_quick_find(class_table, Z_STRVAL_P(op1), Z_STRLEN_P(op1), Z_HASH_P(op1), (void **) &pce)==FAILURE) { - zend_error(E_COMPILE_ERROR, "Internal Zend error - Missing class information for %s", Z_STRVAL_P(op1)); + zend_error_noreturn(E_COMPILE_ERROR, "Internal Zend error - Missing class information for %s", Z_STRVAL_P(op1)); return NULL; } else { ce = *pce; @@ -4547,7 +4547,7 @@ ZEND_API zend_class_entry *do_bind_class(const zend_op_array* op_array, const ze * so we shut up about it. This allows the if (!defined('FOO')) { return; } * approach to work. */ - zend_error(E_COMPILE_ERROR, "Cannot redeclare class %s", ce->name); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare class %s", ce->name); } return NULL; } else { @@ -4582,7 +4582,7 @@ ZEND_API zend_class_entry *do_bind_inherited_class(const zend_op_array *op_array * so we shut up about it. This allows the if (!defined('FOO')) { return; } * approach to work. */ - zend_error(E_COMPILE_ERROR, "Cannot redeclare class %s", Z_STRVAL_P(op2)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare class %s", Z_STRVAL_P(op2)); } return NULL; } else { @@ -4590,9 +4590,9 @@ ZEND_API zend_class_entry *do_bind_inherited_class(const zend_op_array *op_array } if (parent_ce->ce_flags & ZEND_ACC_INTERFACE) { - zend_error(E_COMPILE_ERROR, "Class %s cannot extend from interface %s", ce->name, parent_ce->name); + zend_error_noreturn(E_COMPILE_ERROR, "Class %s cannot extend from interface %s", ce->name, parent_ce->name); } else if ((parent_ce->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) { - zend_error(E_COMPILE_ERROR, "Class %s cannot extend from trait %s", ce->name, parent_ce->name); + zend_error_noreturn(E_COMPILE_ERROR, "Class %s cannot extend from trait %s", ce->name, parent_ce->name); } zend_do_inheritance(ce, parent_ce TSRMLS_CC); @@ -4601,7 +4601,7 @@ ZEND_API zend_class_entry *do_bind_inherited_class(const zend_op_array *op_array /* Register the derived class */ if (zend_hash_quick_add(class_table, Z_STRVAL_P(op2), Z_STRLEN_P(op2)+1, Z_HASH_P(op2), pce, sizeof(zend_class_entry *), NULL)==FAILURE) { - zend_error(E_COMPILE_ERROR, "Cannot redeclare class %s", ce->name); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare class %s", ce->name); } return ce; } @@ -4670,7 +4670,7 @@ void zend_do_early_binding(TSRMLS_D) /* {{{ */ /* Classes with traits are handled exactly the same, no early-bind here */ return; default: - zend_error(E_COMPILE_ERROR, "Invalid binding type"); + zend_error_noreturn(E_COMPILE_ERROR, "Invalid binding type"); return; } @@ -4801,9 +4801,9 @@ void zend_do_brk_cont(zend_uchar op, const znode *expr TSRMLS_DC) /* {{{ */ SET_UNUSED(opline->op1); if (expr) { if (expr->op_type != IS_CONST) { - zend_error(E_COMPILE_ERROR, "'%s' operator with non-constant operand is no longer supported", op == ZEND_BRK ? "break" : "continue"); + zend_error_noreturn(E_COMPILE_ERROR, "'%s' operator with non-constant operand is no longer supported", op == ZEND_BRK ? "break" : "continue"); } else if (Z_TYPE(expr->u.constant) != IS_LONG || Z_LVAL(expr->u.constant) < 1) { - zend_error(E_COMPILE_ERROR, "'%s' operator accepts only positive numbers", op == ZEND_BRK ? "break" : "continue"); + zend_error_noreturn(E_COMPILE_ERROR, "'%s' operator accepts only positive numbers", op == ZEND_BRK ? "break" : "continue"); } SET_NODE(opline->op2, expr); } else { @@ -4962,7 +4962,7 @@ void zend_do_begin_class_declaration(const znode *class_token, znode *class_name zval **ns_name, key; if (CG(active_class_entry)) { - zend_error(E_COMPILE_ERROR, "Class declarations may not be nested"); + zend_error_noreturn(E_COMPILE_ERROR, "Class declarations may not be nested"); return; } @@ -4970,7 +4970,7 @@ void zend_do_begin_class_declaration(const znode *class_token, znode *class_name if (!(strcmp(lcname, "self") && strcmp(lcname, "parent"))) { efree(lcname); - zend_error(E_COMPILE_ERROR, "Cannot use '%s' as class name as it is reserved", Z_STRVAL(class_name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use '%s' as class name as it is reserved", Z_STRVAL(class_name->u.constant)); } /* Class name must not conflict with import names */ @@ -4997,7 +4997,7 @@ void zend_do_begin_class_declaration(const znode *class_token, znode *class_name if (Z_STRLEN_PP(ns_name) != Z_STRLEN(class_name->u.constant) || memcmp(tmp, lcname, Z_STRLEN(class_name->u.constant))) { - zend_error(E_COMPILE_ERROR, "Cannot declare class %s because the name is already in use", Z_STRVAL(class_name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot declare class %s because the name is already in use", Z_STRVAL(class_name->u.constant)); } efree(tmp); } @@ -5015,13 +5015,13 @@ void zend_do_begin_class_declaration(const znode *class_token, znode *class_name if (parent_class_name && parent_class_name->op_type != IS_UNUSED) { switch (parent_class_name->EA) { case ZEND_FETCH_CLASS_SELF: - zend_error(E_COMPILE_ERROR, "Cannot use 'self' as class name as it is reserved"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use 'self' as class name as it is reserved"); break; case ZEND_FETCH_CLASS_PARENT: - zend_error(E_COMPILE_ERROR, "Cannot use 'parent' as class name as it is reserved"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use 'parent' as class name as it is reserved"); break; case ZEND_FETCH_CLASS_STATIC: - zend_error(E_COMPILE_ERROR, "Cannot use 'static' as class name as it is reserved"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use 'static' as class name as it is reserved"); break; default: break; @@ -5040,7 +5040,7 @@ void zend_do_begin_class_declaration(const znode *class_token, znode *class_name if (doing_inheritance) { /* Make sure a trait does not try to extend a class */ if ((new_class_entry->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) { - zend_error(E_COMPILE_ERROR, "A trait (%s) cannot extend a class. Traits can only be composed from other traits with the 'use' keyword. Error", new_class_entry->name); + zend_error_noreturn(E_COMPILE_ERROR, "A trait (%s) cannot extend a class. Traits can only be composed from other traits with the 'use' keyword. Error", new_class_entry->name); } opline->extended_value = parent_class_name->u.op.var; @@ -5085,19 +5085,19 @@ void zend_do_end_class_declaration(const znode *class_token, const znode *parent if (ce->constructor) { ce->constructor->common.fn_flags |= ZEND_ACC_CTOR; if (ce->constructor->common.fn_flags & ZEND_ACC_STATIC) { - zend_error(E_COMPILE_ERROR, "Constructor %s::%s() cannot be static", ce->name, ce->constructor->common.function_name); + zend_error_noreturn(E_COMPILE_ERROR, "Constructor %s::%s() cannot be static", ce->name, ce->constructor->common.function_name); } } if (ce->destructor) { ce->destructor->common.fn_flags |= ZEND_ACC_DTOR; if (ce->destructor->common.fn_flags & ZEND_ACC_STATIC) { - zend_error(E_COMPILE_ERROR, "Destructor %s::%s() cannot be static", ce->name, ce->destructor->common.function_name); + zend_error_noreturn(E_COMPILE_ERROR, "Destructor %s::%s() cannot be static", ce->name, ce->destructor->common.function_name); } } if (ce->clone) { ce->clone->common.fn_flags |= ZEND_ACC_CLONE; if (ce->clone->common.fn_flags & ZEND_ACC_STATIC) { - zend_error(E_COMPILE_ERROR, "Clone method %s::%s() cannot be static", ce->name, ce->clone->common.function_name); + zend_error_noreturn(E_COMPILE_ERROR, "Clone method %s::%s() cannot be static", ce->name, ce->clone->common.function_name); } } @@ -5146,7 +5146,7 @@ void zend_do_implements_interface(znode *interface_name TSRMLS_DC) /* {{{ */ /* Traits can not implement interfaces */ if ((CG(active_class_entry)->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) { - zend_error(E_COMPILE_ERROR, "Cannot use '%s' as interface on '%s' since it is a Trait", + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use '%s' as interface on '%s' since it is a Trait", Z_STRVAL(interface_name->u.constant), CG(active_class_entry)->name); } @@ -5155,7 +5155,7 @@ void zend_do_implements_interface(znode *interface_name TSRMLS_DC) /* {{{ */ case ZEND_FETCH_CLASS_SELF: case ZEND_FETCH_CLASS_PARENT: case ZEND_FETCH_CLASS_STATIC: - zend_error(E_COMPILE_ERROR, "Cannot use '%s' as interface name as it is reserved", Z_STRVAL(interface_name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use '%s' as interface name as it is reserved", Z_STRVAL(interface_name->u.constant)); break; default: break; @@ -5177,7 +5177,7 @@ void zend_do_use_trait(znode *trait_name TSRMLS_DC) /* {{{ */ zend_op *opline; if ((CG(active_class_entry)->ce_flags & ZEND_ACC_INTERFACE)) { - zend_error(E_COMPILE_ERROR, + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use traits inside of interfaces. %s is used in %s", Z_STRVAL(trait_name->u.constant), CG(active_class_entry)->name); } @@ -5187,7 +5187,7 @@ void zend_do_use_trait(znode *trait_name TSRMLS_DC) /* {{{ */ case ZEND_FETCH_CLASS_SELF: case ZEND_FETCH_CLASS_PARENT: case ZEND_FETCH_CLASS_STATIC: - zend_error(E_COMPILE_ERROR, "Cannot use '%s' as trait name as it is reserved", Z_STRVAL(trait_name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use '%s' as trait name as it is reserved", Z_STRVAL(trait_name->u.constant)); break; default: break; @@ -5276,20 +5276,20 @@ void zend_do_declare_property(const znode *var_name, const znode *value, zend_ui int comment_len = 0; if (CG(active_class_entry)->ce_flags & ZEND_ACC_INTERFACE) { - zend_error(E_COMPILE_ERROR, "Interfaces may not include member variables"); + zend_error_noreturn(E_COMPILE_ERROR, "Interfaces may not include member variables"); } if (access_type & ZEND_ACC_ABSTRACT) { - zend_error(E_COMPILE_ERROR, "Properties cannot be declared abstract"); + zend_error_noreturn(E_COMPILE_ERROR, "Properties cannot be declared abstract"); } if (access_type & ZEND_ACC_FINAL) { - zend_error(E_COMPILE_ERROR, "Cannot declare property %s::$%s final, the final modifier is allowed only for methods and classes", + zend_error_noreturn(E_COMPILE_ERROR, "Cannot declare property %s::$%s final, the final modifier is allowed only for methods and classes", CG(active_class_entry)->name, Z_STRVAL(var_name->u.constant)); } if (zend_hash_find(&CG(active_class_entry)->properties_info, Z_STRVAL(var_name->u.constant), Z_STRLEN(var_name->u.constant)+1, (void **) &existing_property_info)==SUCCESS) { - zend_error(E_COMPILE_ERROR, "Cannot redeclare %s::$%s", CG(active_class_entry)->name, Z_STRVAL(var_name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare %s::$%s", CG(active_class_entry)->name, Z_STRVAL(var_name->u.constant)); } ALLOC_ZVAL(property); @@ -5319,11 +5319,11 @@ void zend_do_declare_class_constant(znode *var_name, const znode *value TSRMLS_D zend_ulong hash; if(Z_TYPE(value->u.constant) == IS_CONSTANT_ARRAY) { - zend_error(E_COMPILE_ERROR, "Arrays are not allowed in class constants"); + zend_error_noreturn(E_COMPILE_ERROR, "Arrays are not allowed in class constants"); return; } if ((CG(active_class_entry)->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) { - zend_error(E_COMPILE_ERROR, "Traits cannot have constants"); + zend_error_noreturn(E_COMPILE_ERROR, "Traits cannot have constants"); return; } @@ -5334,7 +5334,7 @@ void zend_do_declare_class_constant(znode *var_name, const znode *value TSRMLS_D hash = str_hash(cname, Z_STRLEN(var_name->u.constant)); if (zend_hash_quick_add(&CG(active_class_entry)->constants_table, cname, Z_STRLEN(var_name->u.constant)+1, hash, &property, sizeof(zval *), NULL) == FAILURE) { FREE_ZVAL(property); - zend_error(E_COMPILE_ERROR, "Cannot redefine class constant %s::%s", CG(active_class_entry)->name, Z_STRVAL(var_name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot redefine class constant %s::%s", CG(active_class_entry)->name, Z_STRVAL(var_name->u.constant)); } FREE_PNODE(var_name); @@ -5428,7 +5428,7 @@ void zend_do_halt_compiler_register(TSRMLS_D) /* {{{ */ int len, clen; if (CG(has_bracketed_namespaces) && CG(in_namespace)) { - zend_error(E_COMPILE_ERROR, "__HALT_COMPILER() can only be used from the outermost scope"); + zend_error_noreturn(E_COMPILE_ERROR, "__HALT_COMPILER() can only be used from the outermost scope"); } cfilename = zend_get_compiled_filename(TSRMLS_C); @@ -6004,7 +6004,7 @@ void zend_do_fetch_lexical_variable(znode *varname, zend_bool is_ref TSRMLS_DC) if (Z_STRLEN(varname->u.constant) == sizeof("this") - 1 && memcmp(Z_STRVAL(varname->u.constant), "this", sizeof("this") - 1) == 0) { - zend_error(E_COMPILE_ERROR, "Cannot use $this as lexical variable"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use $this as lexical variable"); return; } @@ -6148,7 +6148,7 @@ void zend_do_isset_or_isempty(int type, znode *result, znode *variable TSRMLS_DC /* empty(func()) can be transformed to !func() */ zend_do_unary_op(ZEND_BOOL_NOT, result, variable TSRMLS_CC); } else { - zend_error(E_COMPILE_ERROR, "Cannot use isset() on the result of a function call (you can use \"null !== func()\" instead)"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use isset() on the result of a function call (you can use \"null !== func()\" instead)"); } return; @@ -6196,7 +6196,7 @@ void zend_do_instanceof(znode *result, const znode *expr, const znode *class_zno } if (expr->op_type == IS_CONST) { - zend_error(E_COMPILE_ERROR, "instanceof expects an object instance, constant given"); + zend_error_noreturn(E_COMPILE_ERROR, "instanceof expects an object instance, constant given"); } opline = get_next_op(CG(active_op_array) TSRMLS_CC); @@ -6287,10 +6287,10 @@ void zend_do_foreach_cont(znode *foreach_token, const znode *open_brackets_token if ((key->op_type != IS_UNUSED)) { if (key->EA & ZEND_PARSED_REFERENCE_VARIABLE) { - zend_error(E_COMPILE_ERROR, "Key element cannot be a reference"); + zend_error_noreturn(E_COMPILE_ERROR, "Key element cannot be a reference"); } if (key->EA & ZEND_PARSED_LIST_EXPR) { - zend_error(E_COMPILE_ERROR, "Cannot use list as key element"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use list as key element"); } } @@ -6309,7 +6309,7 @@ void zend_do_foreach_cont(znode *foreach_token, const znode *open_brackets_token while (fetch != end) { --fetch; if (fetch->opcode == ZEND_FETCH_DIM_W && fetch->op2_type == IS_UNUSED) { - zend_error(E_COMPILE_ERROR, "Cannot use [] for reading"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use [] for reading"); } if (fetch->opcode == ZEND_SEPARATE) { MAKE_NOP(fetch); @@ -6323,7 +6323,7 @@ void zend_do_foreach_cont(znode *foreach_token, const znode *open_brackets_token if (value->EA & ZEND_PARSED_LIST_EXPR) { if (!CG(list_llist).head) { - zend_error(E_COMPILE_ERROR, "Cannot use empty list"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use empty list"); } zend_do_list_end(&dummy, &value_node TSRMLS_CC); zend_do_free(&dummy TSRMLS_CC); @@ -6391,7 +6391,7 @@ void zend_do_declare_stmt(znode *var, znode *val TSRMLS_DC) /* {{{ */ CG(declarables).ticks = val->u.constant; } else if (!zend_binary_strcasecmp(Z_STRVAL(var->u.constant), Z_STRLEN(var->u.constant), "encoding", sizeof("encoding")-1)) { if ((Z_TYPE(val->u.constant) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) { - zend_error(E_COMPILE_ERROR, "Cannot use constants as encoding"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use constants as encoding"); } /* @@ -6410,7 +6410,7 @@ void zend_do_declare_stmt(znode *var, znode *val TSRMLS_DC) /* {{{ */ } if (num > 0) { - zend_error(E_COMPILE_ERROR, "Encoding declaration pragma must be the very first statement in the script"); + zend_error_noreturn(E_COMPILE_ERROR, "Encoding declaration pragma must be the very first statement in the script"); } } @@ -6906,15 +6906,15 @@ void zend_do_begin_namespace(const znode *name, zend_bool with_bracket TSRMLS_DC if (CG(current_namespace)) { /* previous namespace declarations were unbracketed */ if (with_bracket) { - zend_error(E_COMPILE_ERROR, "Cannot mix bracketed namespace declarations with unbracketed namespace declarations"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot mix bracketed namespace declarations with unbracketed namespace declarations"); } } } else { /* previous namespace declarations were bracketed */ if (!with_bracket) { - zend_error(E_COMPILE_ERROR, "Cannot mix bracketed namespace declarations with unbracketed namespace declarations"); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot mix bracketed namespace declarations with unbracketed namespace declarations"); } else if (CG(current_namespace) || CG(in_namespace)) { - zend_error(E_COMPILE_ERROR, "Namespace declarations cannot be nested"); + zend_error_noreturn(E_COMPILE_ERROR, "Namespace declarations cannot be nested"); } } @@ -6927,7 +6927,7 @@ void zend_do_begin_namespace(const znode *name, zend_bool with_bracket TSRMLS_DC --num; } if (num > 0) { - zend_error(E_COMPILE_ERROR, "Namespace declaration statement has to be the very first statement in the script"); + zend_error_noreturn(E_COMPILE_ERROR, "Namespace declaration statement has to be the very first statement in the script"); } } @@ -6942,7 +6942,7 @@ void zend_do_begin_namespace(const znode *name, zend_bool with_bracket TSRMLS_DC !memcmp(lcname, "self", sizeof("self")-1)) || ((Z_STRLEN(name->u.constant) == sizeof("parent")-1) && !memcmp(lcname, "parent", sizeof("parent")-1))) { - zend_error(E_COMPILE_ERROR, "Cannot use '%s' as namespace name", Z_STRVAL(name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use '%s' as namespace name", Z_STRVAL(name->u.constant)); } efree(lcname); @@ -7012,7 +7012,7 @@ void zend_do_use(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{ !memcmp(lcname, "self", sizeof("self")-1)) || ((Z_STRLEN_P(name) == sizeof("parent")-1) && !memcmp(lcname, "parent", sizeof("parent")-1))) { - zend_error(E_COMPILE_ERROR, "Cannot use %s as %s because '%s' is a special class name", Z_STRVAL_P(ns), Z_STRVAL_P(name), Z_STRVAL_P(name)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use %s as %s because '%s' is a special class name", Z_STRVAL_P(ns), Z_STRVAL_P(name), Z_STRVAL_P(name)); } if (CG(current_namespace)) { @@ -7027,7 +7027,7 @@ void zend_do_use(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{ if (Z_STRLEN_P(ns) != Z_STRLEN_P(CG(current_namespace)) + 1 + Z_STRLEN_P(name) || memcmp(tmp2, c_ns_name, Z_STRLEN_P(ns))) { - zend_error(E_COMPILE_ERROR, "Cannot use %s as %s because the name is already in use", Z_STRVAL_P(ns), Z_STRVAL_P(name)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use %s as %s because the name is already in use", Z_STRVAL_P(ns), Z_STRVAL_P(name)); } efree(tmp2); } @@ -7039,17 +7039,17 @@ void zend_do_use(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{ if (Z_STRLEN_P(ns) != Z_STRLEN_P(name) || memcmp(c_tmp, lcname, Z_STRLEN_P(ns))) { - zend_error(E_COMPILE_ERROR, "Cannot use %s as %s because the name is already in use", Z_STRVAL_P(ns), Z_STRVAL_P(name)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use %s as %s because the name is already in use", Z_STRVAL_P(ns), Z_STRVAL_P(name)); } efree(c_tmp); } if (zend_hash_add(CG(current_import), lcname, Z_STRLEN_P(name)+1, &ns, sizeof(zval*), NULL) != SUCCESS) { - zend_error(E_COMPILE_ERROR, "Cannot use %s as %s because the name is already in use", Z_STRVAL_P(ns), Z_STRVAL_P(name)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use %s as %s because the name is already in use", Z_STRVAL_P(ns), Z_STRVAL_P(name)); } if (warn) { if (!strcmp(Z_STRVAL_P(name), "strict")) { - zend_error(E_COMPILE_ERROR, "You seem to be trying to use a different language..."); + zend_error_noreturn(E_COMPILE_ERROR, "You seem to be trying to use a different language..."); } zend_error(E_WARNING, "The use statement with non-compound name '%s' has no effect", Z_STRVAL_P(name)); } @@ -7063,11 +7063,11 @@ void zend_do_declare_constant(znode *name, znode *value TSRMLS_DC) /* {{{ */ zend_op *opline; if(Z_TYPE(value->u.constant) == IS_CONSTANT_ARRAY) { - zend_error(E_COMPILE_ERROR, "Arrays are not allowed as constants"); + zend_error_noreturn(E_COMPILE_ERROR, "Arrays are not allowed as constants"); } if (zend_get_ct_const(&name->u.constant, 0 TSRMLS_CC)) { - zend_error(E_COMPILE_ERROR, "Cannot redeclare constant '%s'", Z_STRVAL(name->u.constant)); + zend_error_noreturn(E_COMPILE_ERROR, "Cannot redeclare constant '%s'", Z_STRVAL(name->u.constant)); } if (CG(current_namespace)) { @@ -7092,7 +7092,7 @@ void zend_do_declare_constant(znode *name, znode *value TSRMLS_DC) /* {{{ */ void zend_verify_namespace(TSRMLS_D) /* {{{ */ { if (CG(has_bracketed_namespaces) && !CG(in_namespace)) { - zend_error(E_COMPILE_ERROR, "No code may exist outside of namespace {}"); + zend_error_noreturn(E_COMPILE_ERROR, "No code may exist outside of namespace {}"); } } /* }}} */ diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index d46149957ac5e..f76b77b555274 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -271,7 +271,7 @@ inner_statement: statement | function_declaration_statement | class_declaration_statement - | T_HALT_COMPILER '(' ')' ';' { zend_error(E_COMPILE_ERROR, "__HALT_COMPILER() can only be used from the outermost scope"); } + | T_HALT_COMPILER '(' ')' ';' { zend_error_noreturn(E_COMPILE_ERROR, "__HALT_COMPILER() can only be used from the outermost scope"); } ; @@ -1202,7 +1202,7 @@ isset_variables: isset_variable: variable { zend_do_isset_or_isempty(ZEND_ISSET, &$$, &$1 TSRMLS_CC); } - | expr_without_variable { zend_error(E_COMPILE_ERROR, "Cannot use isset() on the result of an expression (you can use \"null !== expression\" instead)"); } + | expr_without_variable { zend_error_noreturn(E_COMPILE_ERROR, "Cannot use isset() on the result of an expression (you can use \"null !== expression\" instead)"); } ; class_constant: diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index 41b4bd25710fd..ad0879888426c 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -499,7 +499,7 @@ static void zend_check_finally_breakout(zend_op_array *op_array, zend_uint op_nu CG(in_compilation) = 1; CG(active_op_array) = op_array; CG(zend_lineno) = op_array->opcodes[op_num].lineno; - zend_error(E_COMPILE_ERROR, "jump out of a finally block is disallowed"); + zend_error_noreturn(E_COMPILE_ERROR, "jump out of a finally block is disallowed"); } } } @@ -710,7 +710,7 @@ ZEND_API int pass_two(zend_op_array *op_array TSRMLS_DC) if (op_array->fn_flags & ZEND_ACC_GENERATOR) { if (opline->op1_type != IS_CONST || Z_TYPE_P(opline->op1.zv) != IS_NULL) { CG(zend_lineno) = opline->lineno; - zend_error(E_COMPILE_ERROR, "Generators cannot return values using \"return\""); + zend_error_noreturn(E_COMPILE_ERROR, "Generators cannot return values using \"return\""); } opline->opcode = ZEND_GENERATOR_RETURN; From a1ae79e11415237a89e041c3b96dd1dba6e7636e Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 19 Oct 2013 23:25:31 +0200 Subject: [PATCH 284/400] Fix assignment in dummy_encoding_list_parser --- Zend/zend_multibyte.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_multibyte.c b/Zend/zend_multibyte.c index dafcf18393578..a75d074936ec8 100644 --- a/Zend/zend_multibyte.c +++ b/Zend/zend_multibyte.c @@ -53,7 +53,7 @@ static size_t dummy_encoding_converter(unsigned char **to, size_t *to_length, co static int dummy_encoding_list_parser(const char *encoding_list, size_t encoding_list_len, const zend_encoding ***return_list, size_t *return_size, int persistent TSRMLS_DC) { *return_list = pemalloc(0, persistent); - return_size = 0; + *return_size = 0; return SUCCESS; } From 1292091670ed2b7bf7aad2146f1e7e44a786d97a Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 19 Oct 2013 23:43:05 +0200 Subject: [PATCH 285/400] Fix misleading sizeof An array of zval* is allocated, but sizeof(zval **) is used. Makes no practical difference as sizeof(zval *) == sizeof(zval **). --- ext/standard/assert.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/assert.c b/ext/standard/assert.c index 631834c97c0f3..1a24ade79e64f 100644 --- a/ext/standard/assert.c +++ b/ext/standard/assert.c @@ -200,7 +200,7 @@ PHP_FUNCTION(assert) } if (ASSERTG(callback)) { - zval **args = safe_emalloc(description_len == 0 ? 3 : 4, sizeof(zval **), 0); + zval **args = safe_emalloc(description_len == 0 ? 3 : 4, sizeof(zval *), 0); zval *retval; int i; uint lineno = zend_get_executed_lineno(TSRMLS_C); From 870d3e75ca4e220e431683906b616dfbdd164cdc Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 19 Oct 2013 23:46:09 +0200 Subject: [PATCH 286/400] Remove dead comparison (size_t < 0) --- ext/standard/password.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/password.c b/ext/standard/password.c index ca852038a67ed..9c5280a4cb7c2 100644 --- a/ext/standard/password.c +++ b/ext/standard/password.c @@ -183,7 +183,7 @@ PHP_FUNCTION(password_get_info) return; } - if (hash_len < 0 || (size_t) hash_len < 0) { + if (hash_len < 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Supplied password hash too long to safely identify"); RETURN_FALSE; } From 9b46a15a6e82f7f1fb3b921b44b89cd74dd0839e Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 19 Oct 2013 23:52:23 +0200 Subject: [PATCH 287/400] Remove extraneous NULL check of Z_ARRVAL_P() Z_ARRVAL_P() is never NULL --- ext/standard/var.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/var.c b/ext/standard/var.c index 5d104a90cfee8..08d43997f78b2 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -453,7 +453,7 @@ PHPAPI void php_var_export_ex(zval **struc, int level, smart_str *buf TSRMLS_DC) break; case IS_ARRAY: myht = Z_ARRVAL_PP(struc); - if(myht && myht->nApplyCount > 0){ + if (myht->nApplyCount > 0){ smart_str_appendl(buf, "NULL", 4); zend_error(E_WARNING, "var_export does not handle circular references"); return; From 813e86765263aa91a3c5c4f72b2c40b7becb58a4 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sat, 19 Oct 2013 17:37:59 -0700 Subject: [PATCH 288/400] Initialize these to make Coverity happy --- sapi/fpm/fpm/fastcgi.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sapi/fpm/fpm/fastcgi.c b/sapi/fpm/fpm/fastcgi.c index cf3f098c53676..56b6bfd8cf6da 100644 --- a/sapi/fpm/fpm/fastcgi.c +++ b/sapi/fpm/fpm/fastcgi.c @@ -426,8 +426,9 @@ static int fcgi_get_params(fcgi_request *req, unsigned char *p, unsigned char *e char buf[128]; char *tmp = buf; size_t buf_size = sizeof(buf); - int name_len, val_len; - uint eff_name_len; + int name_len = 0; + int val_len = 0; + uint eff_name_lenk = 0; char *s; int ret = 1; size_t bytes_consumed; From 4a205092f7d474ecfe4f7e00500ec516c1d23caa Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sat, 19 Oct 2013 17:55:34 -0700 Subject: [PATCH 289/400] Trivial Coverity fix --- ext/sockets/conversions.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/sockets/conversions.c b/ext/sockets/conversions.c index ed55ed52fa754..d81484521d8c0 100644 --- a/ext/sockets/conversions.c +++ b/ext/sockets/conversions.c @@ -1257,7 +1257,7 @@ void to_zval_read_msghdr(const char *msghdr_c, zval *zv, res_context *ctx) /* CONVERSIONS for if_index */ static void from_zval_write_ifindex(const zval *zv, char *uinteger, ser_context *ctx) { - unsigned ret; + unsigned ret = 0; zval lzval = zval_used_for_init; if (Z_TYPE_P(zv) == IS_LONG) { From 2be67ca457299179d5df05ee569d4efa227e33d9 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sat, 19 Oct 2013 19:24:17 -0700 Subject: [PATCH 290/400] Fix unitialized opened_path here - found by Coverity --- ext/dba/dba.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ext/dba/dba.c b/ext/dba/dba.c index 50a94dd2adca3..ced90f0c62299 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -625,7 +625,8 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent) char *file_mode; char mode[4], *pmode, *lock_file_mode = NULL; int persistent_flag = persistent ? STREAM_OPEN_PERSISTENT : 0; - char *opened_path, *lock_name; + char *opened_path = NULL; + char *lock_name; if(ac < 2) { WRONG_PARAM_COUNT; @@ -848,8 +849,10 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent) if (!persistent) { info->lock.name = opened_path; } else { - info->lock.name = pestrdup(opened_path, persistent); - efree(opened_path); + if (opened_path) { + info->lock.name = pestrdup(opened_path, persistent); + efree(opened_path); + } } } } From aa4f9b322b18e3dffbe0646c802e6ed3cf71367e Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 19 Oct 2013 23:29:34 -0300 Subject: [PATCH 291/400] - Fixed possible memory leak --- ext/bz2/bz2_filter.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/bz2/bz2_filter.c b/ext/bz2/bz2_filter.c index 5ed7921c17dba..868acec870348 100644 --- a/ext/bz2/bz2_filter.c +++ b/ext/bz2/bz2_filter.c @@ -97,6 +97,7 @@ static php_stream_filter_status_t php_bz2_decompress_filter( status = BZ2_bzDecompressInit(streamp, 0, data->small_footprint); if (BZ_OK != status) { + php_stream_bucket_delref(bucket TSRMLS_CC); return PSFS_ERR_FATAL; } From 85a622e42f815c3a62008eff21ec4ab259906e7e Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 19 Oct 2013 23:36:28 -0300 Subject: [PATCH 292/400] - Moved allocation to if block to make Coverity happy --- ext/soap/php_sdl.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/ext/soap/php_sdl.c b/ext/soap/php_sdl.c index 0ac4c2ed7a9bf..a7a5071c08535 100644 --- a/ext/soap/php_sdl.c +++ b/ext/soap/php_sdl.c @@ -2644,16 +2644,17 @@ static sdlAttributePtr make_persistent_sdl_attribute(sdlAttributePtr attr, HashT zend_hash_internal_pointer_reset(pattr->extraAttributes); while (zend_hash_get_current_data(attr->extraAttributes, (void**)&tmp) == SUCCESS) { - pextra = malloc(sizeof(sdlExtraAttribute)); - memset(pextra, 0, sizeof(sdlExtraAttribute)); - if ((*tmp)->ns) { - pextra->ns = strdup((*tmp)->ns); - } - if ((*tmp)->val) { - pextra->val = strdup((*tmp)->val); - } + if (zend_hash_get_current_key_ex(attr->extraAttributes, &key, &key_len, &index, 0, NULL) == HASH_KEY_IS_STRING) { + pextra = malloc(sizeof(sdlExtraAttribute)); + memset(pextra, 0, sizeof(sdlExtraAttribute)); - if (zend_hash_get_current_key_ex(attr->extraAttributes, &key, &key_len, &index, 0, NULL) == HASH_KEY_IS_STRING) { + if ((*tmp)->ns) { + pextra->ns = strdup((*tmp)->ns); + } + if ((*tmp)->val) { + pextra->val = strdup((*tmp)->val); + } + zend_hash_add(pattr->extraAttributes, key, key_len, (void*)&pextra, sizeof(sdlExtraAttributePtr), NULL); } From 420068c6e1806a2b12be481abba1afec5d73d82e Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 20 Oct 2013 01:04:55 -0200 Subject: [PATCH 293/400] - Fix possible memory leak --- ext/zip/php_zip.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index d7bd5f49e62be..df16383d10403 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -1856,15 +1856,16 @@ static ZIPARCHIVE_METHOD(addFromString) /* TODO: fix _zip_replace */ if (cur_idx >= 0) { if (zip_delete(intern, cur_idx) == -1) { - RETURN_FALSE; + goto fail; } } - if (zip_add(intern, name, zs) == -1) { - RETURN_FALSE; - } else { + if (zip_add(intern, name, zs) != -1) { RETURN_TRUE; } +fail: + zip_source_free(zs); + RETURN_FALSE; } /* }}} */ From a1daebefda6b481450e3b9ec7461609a09e4f578 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 20 Oct 2013 01:16:07 -0200 Subject: [PATCH 294/400] - Fix extern declaration according to definition --- ext/gd/php_gd.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/gd/php_gd.h b/ext/gd/php_gd.h index 45193768ea4c3..70bc85a08bfd2 100644 --- a/ext/gd/php_gd.h +++ b/ext/gd/php_gd.h @@ -61,7 +61,7 @@ PHPAPI extern const char php_sig_gif[3]; PHPAPI extern const char php_sig_jpg[3]; -PHPAPI extern const char php_sig_png[3]; +PHPAPI extern const char php_sig_png[8]; extern zend_module_entry gd_module_entry; #define phpext_gd_ptr &gd_module_entry From fb38fdc7fd97f1e057b8c9d9102ce8a39b430f81 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sat, 19 Oct 2013 20:55:02 -0700 Subject: [PATCH 295/400] Remove senseless check here --- ext/ftp/ftp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/ftp/ftp.c b/ext/ftp/ftp.c index 0d6704f9d21a0..58d3c2ec4d284 100644 --- a/ext/ftp/ftp.c +++ b/ext/ftp/ftp.c @@ -630,7 +630,7 @@ ftp_alloc(ftpbuf_t *ftp, const long size, char **response) return 0; } - if (response && ftp->inbuf) { + if (response) { *response = estrdup(ftp->inbuf); } From 33d377e7012865e1622e58886416653ec874dcd7 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 20 Oct 2013 08:51:09 -0200 Subject: [PATCH 296/400] - Fixed possible uninitialized scalar variable usage (spotted by Coverity) --- ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c | 2 +- ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c | 2 +- ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c | 2 +- ext/mbstring/libmbfl/mbfl/mbfilter.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c index 4deb02960c3a3..03e9633cae756 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c @@ -142,7 +142,7 @@ const struct mbfl_convert_vtbl vtbl_wchar_2022jp_kddi = { int mbfl_filt_conv_2022jp_mobile_wchar(int c, mbfl_convert_filter *filter) { - int c1, s, w, snd; + int c1, s, w, snd = 0; retry: switch (filter->status & 0xf) { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c index 4e1838f0601c5..87bb2f21fd5f2 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c @@ -134,7 +134,7 @@ int mbfl_filt_conv_jis2004_wchar(int c, mbfl_convert_filter *filter) { int k; - int c1, c2, s, s1, s2, w = 0, w1; + int c1, c2, s, s1 = 0, s2 = 0, w = 0, w1; retry: switch (filter->status & 0xf) { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c index 7a549af666587..93ac34644a833 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c @@ -605,7 +605,7 @@ mbfilter_unicode2sjis_emoji_sb(int c, int *s1, mbfl_convert_filter *filter) int mbfl_filt_conv_sjis_mobile_wchar(int c, mbfl_convert_filter *filter) { - int c1, s, s1, s2, w; + int c1, s, s1 = 0, s2 = 0, w; int snd = 0; retry: diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter.c b/ext/mbstring/libmbfl/mbfl/mbfilter.c index b3759f940d549..3b14727d6b6c1 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter.c +++ b/ext/mbstring/libmbfl/mbfl/mbfilter.c @@ -985,7 +985,7 @@ mbfl_strpos( { int result; mbfl_string _haystack_u8, _needle_u8; - const mbfl_string *haystack_u8, *needle_u8; + const mbfl_string *haystack_u8, *needle_u8 = NULL; const unsigned char *u8_tbl; if (haystack == NULL || haystack->val == NULL || needle == NULL || needle->val == NULL) { From 52555a78946cd91034f86eb4ad03c2d76cbef0cd Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 20 Oct 2013 09:04:24 -0200 Subject: [PATCH 297/400] - Fixed possible NULL ptr dereference --- ext/phar/util.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ext/phar/util.c b/ext/phar/util.c index 898d8bd4b2146..227bd15dc715c 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -1262,8 +1262,10 @@ int phar_get_archive(phar_archive_data **archive, char *fname, int fname_len, ch spprintf(error, 0, "alias \"%s\" is already used for archive \"%s\" cannot be overloaded with \"%s\"", alias, (*fd_ptr)->fname, fname); } if (SUCCESS == phar_free_alias(*fd_ptr, alias, alias_len TSRMLS_CC)) { - efree(*error); - *error = NULL; + if (error) { + efree(*error); + *error = NULL; + } } return FAILURE; } From 9976b5cd7f36d90b49d1dcf58ec6497f0e592b7d Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 20 Oct 2013 09:50:11 -0200 Subject: [PATCH 298/400] - Moved NULL check before dereferencing --- ext/zip/php_zip.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index df16383d10403..1f435bbb002ed 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -102,14 +102,14 @@ static char * php_zip_make_relative_path(char *path, int path_len) /* {{{ */ char *path_begin = path; size_t i; - if (IS_SLASH(path[0])) { - return path + 1; - } - if (path_len < 1 || path == NULL) { return NULL; } + if (IS_SLASH(path[0])) { + return path + 1; + } + i = path_len; while (1) { From 1494298231072d5991e76db5ef25f20e81018106 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sun, 20 Oct 2013 08:55:48 -0700 Subject: [PATCH 299/400] Minor Coverity tweaks --- ext/ftp/ftp.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/ftp/ftp.c b/ext/ftp/ftp.c index 58d3c2ec4d284..4da8d602c9083 100644 --- a/ext/ftp/ftp.c +++ b/ext/ftp/ftp.c @@ -1643,7 +1643,7 @@ ftp_genlist(ftpbuf_t *ftp, const char *cmd, const char *path TSRMLS_DC) if (ftp->resp == 226) { ftp->data = data_close(ftp, data); php_stream_close(tmpstream); - return ecalloc(1, sizeof(char**)); + return ecalloc(1, sizeof(char*)); } /* pull data buffer into tmpfile */ @@ -1671,11 +1671,11 @@ ftp_genlist(ftpbuf_t *ftp, const char *cmd, const char *path TSRMLS_DC) } } - ftp->data = data = data_close(ftp, data); + ftp->data = data_close(ftp, data); php_stream_rewind(tmpstream); - ret = safe_emalloc((lines + 1), sizeof(char**), size * sizeof(char*)); + ret = safe_emalloc((lines + 1), sizeof(char*), size * sizeof(char*)); entry = ret; text = (char*) (ret + lines + 1); From 8f4a6d6e1b6c36259a5dc865d16f0dad76f2f2c9 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sun, 20 Oct 2013 09:36:50 -0700 Subject: [PATCH 300/400] Clean up this weird safe_emalloc() call --- ext/ftp/ftp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/ftp/ftp.c b/ext/ftp/ftp.c index 4da8d602c9083..b82017e21f2a7 100644 --- a/ext/ftp/ftp.c +++ b/ext/ftp/ftp.c @@ -1675,7 +1675,7 @@ ftp_genlist(ftpbuf_t *ftp, const char *cmd, const char *path TSRMLS_DC) php_stream_rewind(tmpstream); - ret = safe_emalloc((lines + 1), sizeof(char*), size * sizeof(char*)); + ret = safe_emalloc((lines + 1), sizeof(char*), size); entry = ret; text = (char*) (ret + lines + 1); From 2129de4569bec4acd89e5824a471f59d887c5b57 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sun, 20 Oct 2013 14:04:47 -0700 Subject: [PATCH 301/400] These getpwnam('') tests are silly and not portable --- ext/posix/tests/posix_getgrnam.phpt | 19 ------------------- ext/posix/tests/posix_getgrnam_basic.phpt | 23 ----------------------- ext/posix/tests/posix_getpwnam.phpt | 19 ------------------- ext/posix/tests/posix_getpwnam_basic.phpt | 23 ----------------------- 4 files changed, 84 deletions(-) delete mode 100644 ext/posix/tests/posix_getgrnam.phpt delete mode 100644 ext/posix/tests/posix_getgrnam_basic.phpt delete mode 100644 ext/posix/tests/posix_getpwnam.phpt delete mode 100644 ext/posix/tests/posix_getpwnam_basic.phpt diff --git a/ext/posix/tests/posix_getgrnam.phpt b/ext/posix/tests/posix_getgrnam.phpt deleted file mode 100644 index 854db4ac1614d..0000000000000 --- a/ext/posix/tests/posix_getgrnam.phpt +++ /dev/null @@ -1,19 +0,0 @@ ---TEST-- -posix_getgrnam(): Basic tests ---SKIPIF-- - ---FILE-- - ---EXPECT-- -bool(false) -bool(false) -bool(false) diff --git a/ext/posix/tests/posix_getgrnam_basic.phpt b/ext/posix/tests/posix_getgrnam_basic.phpt deleted file mode 100644 index fd5bf23172d86..0000000000000 --- a/ext/posix/tests/posix_getgrnam_basic.phpt +++ /dev/null @@ -1,23 +0,0 @@ ---TEST-- -posix_getgrnam(): Basic tests ---SKIPIF-- - ---FILE-- - -===DONE=== ---EXPECT-- -Basic test of POSIX posix_getgrnam function -bool(false) -bool(false) -bool(false) -===DONE=== \ No newline at end of file diff --git a/ext/posix/tests/posix_getpwnam.phpt b/ext/posix/tests/posix_getpwnam.phpt deleted file mode 100644 index b5de1e4ce233d..0000000000000 --- a/ext/posix/tests/posix_getpwnam.phpt +++ /dev/null @@ -1,19 +0,0 @@ ---TEST-- -posix_getpwnam(): Basic tests ---SKIPIF-- - ---FILE-- - ---EXPECT-- -bool(false) -bool(false) -bool(false) diff --git a/ext/posix/tests/posix_getpwnam_basic.phpt b/ext/posix/tests/posix_getpwnam_basic.phpt deleted file mode 100644 index d675d6c182382..0000000000000 --- a/ext/posix/tests/posix_getpwnam_basic.phpt +++ /dev/null @@ -1,23 +0,0 @@ ---TEST-- -posix_getpwnam(): Basic tests ---SKIPIF-- - ---FILE-- - -===DONE==== ---EXPECT-- -Basic test of POSIX posix_getpwnam function -bool(false) -bool(false) -bool(false) -===DONE==== From 18cc5386de399f4410d8e5bf0a7aa5a06b0309be Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sun, 20 Oct 2013 17:55:55 -0700 Subject: [PATCH 302/400] Fix typo --- sapi/fpm/fpm/fastcgi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapi/fpm/fpm/fastcgi.c b/sapi/fpm/fpm/fastcgi.c index 56b6bfd8cf6da..10fd9efa95664 100644 --- a/sapi/fpm/fpm/fastcgi.c +++ b/sapi/fpm/fpm/fastcgi.c @@ -428,7 +428,7 @@ static int fcgi_get_params(fcgi_request *req, unsigned char *p, unsigned char *e size_t buf_size = sizeof(buf); int name_len = 0; int val_len = 0; - uint eff_name_lenk = 0; + uint eff_name_len = 0; char *s; int ret = 1; size_t bytes_consumed; From 9aad9114e3566780c3c7a383acd983b7b861a3f4 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 20 Oct 2013 19:59:39 -0700 Subject: [PATCH 303/400] 5.4.21 release date --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 6c2c6ed13b5aa..6f3c00caea886 100644 --- a/NEWS +++ b/NEWS @@ -22,7 +22,7 @@ PHP NEWS . Fixed bug #64230 (XMLReader does not suppress errors). (Mike) -?? ??? 2013, PHP 5.4.21 +17 Oct 2013, PHP 5.4.21 - Core: . Fixed bug #65322 (compile time errors won't trigger auto loading). (Nikita) From 646813a37a061763656829ab6470231aa6f38d33 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 20 Oct 2013 21:57:33 -0700 Subject: [PATCH 304/400] fix possibility of access to *storedType without initialization --- ext/intl/msgformat/msgformat_helpers.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ext/intl/msgformat/msgformat_helpers.cpp b/ext/intl/msgformat/msgformat_helpers.cpp index c4456d54f3c84..f75fd91dce775 100644 --- a/ext/intl/msgformat/msgformat_helpers.cpp +++ b/ext/intl/msgformat/msgformat_helpers.cpp @@ -209,6 +209,9 @@ static HashTable *umsg_parse_format(MessageFormatter_object *mfo, continue; } } + } else { + intl_errors_set(&err, U_INVALID_FORMAT_ERROR, "Invalid part type encountered", 0 TSRMLS_CC); + continue; } UMessagePatternArgType argType = p.getArgType(); From dab1d76e9def81acd51d2ea9ed55c74af1a093ed Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 20 Oct 2013 22:04:21 -0700 Subject: [PATCH 305/400] Fix coverity issue with -1 returned by findOffset not being handled by getPreferredTag --- ext/intl/locale/locale_methods.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ext/intl/locale/locale_methods.c b/ext/intl/locale/locale_methods.c index 1707c69f93324..9c5b09a7bcc96 100644 --- a/ext/intl/locale/locale_methods.c +++ b/ext/intl/locale/locale_methods.c @@ -127,6 +127,9 @@ static char* getPreferredTag(char* gf_tag) int grOffset = 0; grOffset = findOffset( LOC_GRANDFATHERED ,gf_tag); + if(grOffset < 0) { + return NULL; + } if( grOffset < LOC_PREFERRED_GRANDFATHERED_LEN ){ /* return preferred tag */ result = estrdup( LOC_PREFERRED_GRANDFATHERED[grOffset] ); From 2186e1583d9d65d0e79d05ec706f1e12b97bb035 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sun, 20 Oct 2013 22:15:35 -0700 Subject: [PATCH 306/400] When src->src is null this doesn't get initialized but it is still used, so the passed in *ze will point to unitialized memory. Hopefully src->src is never null, but just in case this initialization doesn't hurt. --- ext/zip/lib/zip_source_error.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/zip/lib/zip_source_error.c b/ext/zip/lib/zip_source_error.c index ffb4652d33621..70ec8bc5d452f 100644 --- a/ext/zip/lib/zip_source_error.c +++ b/ext/zip/lib/zip_source_error.c @@ -40,7 +40,7 @@ ZIP_EXTERN(void) zip_source_error(struct zip_source *src, int *ze, int *se) { - int e[2]; + int e[2] = { 0, 0 }; if (src->src == NULL) { } From ef9069b4ef71ecf1b514e7f8544f0d470e00dca5 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 20 Oct 2013 22:32:20 -0700 Subject: [PATCH 307/400] fix const warnings in intl methods --- ext/intl/collator/collator_create.c | 2 +- ext/intl/formatter/formatter_main.c | 2 +- ext/intl/locale/locale_methods.c | 46 +++++++++++++-------------- ext/intl/msgformat/msgformat.c | 2 +- ext/intl/msgformat/msgformat_format.c | 2 +- ext/intl/msgformat/msgformat_parse.c | 2 +- 6 files changed, 28 insertions(+), 28 deletions(-) diff --git a/ext/intl/collator/collator_create.c b/ext/intl/collator/collator_create.c index b2a8c7f6bac07..7ed4c534394b4 100644 --- a/ext/intl/collator/collator_create.c +++ b/ext/intl/collator/collator_create.c @@ -27,7 +27,7 @@ /* {{{ */ static void collator_ctor(INTERNAL_FUNCTION_PARAMETERS) { - char* locale; + const char* locale; int locale_len = 0; zval* object; Collator_object* co; diff --git a/ext/intl/formatter/formatter_main.c b/ext/intl/formatter/formatter_main.c index d0671a88b5e47..0a568472c4835 100644 --- a/ext/intl/formatter/formatter_main.c +++ b/ext/intl/formatter/formatter_main.c @@ -27,7 +27,7 @@ /* {{{ */ static void numfmt_ctor(INTERNAL_FUNCTION_PARAMETERS) { - char* locale; + const char* locale; char* pattern = NULL; int locale_len = 0, pattern_len = 0; long style; diff --git a/ext/intl/locale/locale_methods.c b/ext/intl/locale/locale_methods.c index 915f4d5af47d8..21b5847f2d339 100644 --- a/ext/intl/locale/locale_methods.c +++ b/ext/intl/locale/locale_methods.c @@ -121,7 +121,7 @@ static int16_t findOffset(const char* const* list, const char* key) } /*}}}*/ -static char* getPreferredTag(char* gf_tag) +static char* getPreferredTag(const char* gf_tag) { char* result = NULL; int grOffset = 0; @@ -175,7 +175,7 @@ static int getStrrtokenPos(char* str, int savedPos) * returns -1 if no singleton * strtok equivalent search for singleton */ -static int getSingletonPos(char* str) +static int getSingletonPos(const char* str) { int result =-1; int i=0; @@ -251,7 +251,7 @@ PHP_NAMED_FUNCTION(zif_locale_set_default) * common code shared by get_primary_language,get_script or get_region or get_variant * result = 0 if error, 1 if successful , -1 if no value */ -static char* get_icu_value_internal( char* loc_name , char* tag_name, int* result , int fromParseLocale) +static char* get_icu_value_internal( const char* loc_name , char* tag_name, int* result , int fromParseLocale) { char* tag_value = NULL; int32_t tag_value_len = 512; @@ -281,7 +281,7 @@ static char* get_icu_value_internal( char* loc_name , char* tag_name, int* resul /* Handle singletons */ if( strcmp(tag_name , LOC_LANG_TAG)==0 ){ if( strlen(loc_name)>1 && (isIDPrefix(loc_name) ==1 ) ){ - return loc_name; + return (char *)loc_name; } } @@ -370,7 +370,7 @@ static char* get_icu_value_internal( char* loc_name , char* tag_name, int* resul static void get_icu_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAMETERS) { - char* loc_name = NULL; + const char* loc_name = NULL; int loc_name_len = 0; char* tag_value = NULL; @@ -465,10 +465,10 @@ PHP_FUNCTION(locale_get_primary_language ) }}} */ static void get_icu_disp_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAMETERS) { - char* loc_name = NULL; + const char* loc_name = NULL; int loc_name_len = 0; - char* disp_loc_name = NULL; + const char* disp_loc_name = NULL; int disp_loc_name_len = 0; int free_loc_name = 0; @@ -561,7 +561,7 @@ static void get_icu_disp_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAME efree( mod_loc_name ); } if (free_loc_name) { - efree(disp_loc_name); + efree((void *)disp_loc_name); disp_loc_name = NULL; } RETURN_FALSE; @@ -572,7 +572,7 @@ static void get_icu_disp_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAME efree( mod_loc_name ); } if (free_loc_name) { - efree(disp_loc_name); + efree((void *)disp_loc_name); disp_loc_name = NULL; } /* Convert display locale name from UTF-16 to UTF-8. */ @@ -666,10 +666,10 @@ PHP_FUNCTION( locale_get_keywords ) UEnumeration* e = NULL; UErrorCode status = U_ZERO_ERROR; - const char* kw_key = NULL; + const char* kw_key = NULL; int32_t kw_key_len = 0; - char* loc_name = NULL; + const char* loc_name = NULL; int loc_name_len = 0; /* @@ -716,7 +716,7 @@ PHP_FUNCTION( locale_get_keywords ) kw_value = erealloc( kw_value , kw_value_len+1); } if (U_FAILURE(status)) { - intl_error_set( NULL, FAILURE, "locale_get_keywords: Error encountered while getting the keyword value for the keyword", 0 TSRMLS_CC ); + intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "locale_get_keywords: Error encountered while getting the keyword value for the keyword", 0 TSRMLS_CC ); if( kw_value){ efree( kw_value ); } @@ -974,12 +974,12 @@ PHP_FUNCTION(locale_compose) * e.g. for locale='en_US-x-prv1-prv2-prv3' * returns a pointer to the string 'prv1-prv2-prv3' */ -static char* get_private_subtags(char* loc_name) +static char* get_private_subtags(const char* loc_name) { char* result =NULL; int singletonPos = 0; int len =0; - char* mod_loc_name =NULL; + const char* mod_loc_name =NULL; if( loc_name && (len = strlen(loc_name)>0 ) ){ mod_loc_name = loc_name ; @@ -1019,7 +1019,7 @@ static char* get_private_subtags(char* loc_name) /* {{{ code used by locale_parse */ -static int add_array_entry(char* loc_name, zval* hash_arr, char* key_name TSRMLS_DC) +static int add_array_entry(const char* loc_name, zval* hash_arr, char* key_name TSRMLS_DC) { char* key_value = NULL; char* cur_key_name = NULL; @@ -1084,7 +1084,7 @@ static int add_array_entry(char* loc_name, zval* hash_arr, char* key_name TSRMLS */ PHP_FUNCTION(locale_parse) { - char* loc_name = NULL; + const char* loc_name = NULL; int loc_name_len = 0; int grOffset = 0; @@ -1128,8 +1128,8 @@ PHP_FUNCTION(locale_parse) */ PHP_FUNCTION(locale_get_all_variants) { - char* loc_name = NULL; - int loc_name_len = 0; + const char* loc_name = NULL; + int loc_name_len = 0; int result = 0; char* token = NULL; @@ -1182,10 +1182,10 @@ PHP_FUNCTION(locale_get_all_variants) /*{{{ * Converts to lower case and also replaces all hyphens with the underscore */ -static int strToMatch(char* str ,char *retstr) +static int strToMatch(const char* str ,char *retstr) { char* anchor = NULL; - char* anchor1 = NULL; + const char* anchor1 = NULL; int result = 0; int len = 0; @@ -1225,7 +1225,7 @@ PHP_FUNCTION(locale_filter_matches) { char* lang_tag = NULL; int lang_tag_len = 0; - char* loc_range = NULL; + const char* loc_range = NULL; int loc_range_len = 0; int result = 0; @@ -1401,7 +1401,7 @@ static void array_cleanup( char* arr[] , int arr_size) * returns the lookup result to lookup_loc_range_src_php * internal function */ -static char* lookup_loc_range(char* loc_range, HashTable* hash_arr, int canonicalize TSRMLS_DC) +static char* lookup_loc_range(const char* loc_range, HashTable* hash_arr, int canonicalize TSRMLS_DC) { int i = 0; int cur_arr_len = 0; @@ -1523,7 +1523,7 @@ PHP_FUNCTION(locale_lookup) { char* fallback_loc = NULL; int fallback_loc_len = 0; - char* loc_range = NULL; + const char* loc_range = NULL; int loc_range_len = 0; zval* arr = NULL; diff --git a/ext/intl/msgformat/msgformat.c b/ext/intl/msgformat/msgformat.c index 6a9f04f32b463..7d8cd958e3c08 100644 --- a/ext/intl/msgformat/msgformat.c +++ b/ext/intl/msgformat/msgformat.c @@ -28,7 +28,7 @@ /* {{{ */ static void msgfmt_ctor(INTERNAL_FUNCTION_PARAMETERS) { - char* locale; + const char* locale; char* pattern; int locale_len = 0, pattern_len = 0; UChar* spattern = NULL; diff --git a/ext/intl/msgformat/msgformat_format.c b/ext/intl/msgformat/msgformat_format.c index 4b81cfe2b454c..55ec9e84ba0e8 100644 --- a/ext/intl/msgformat/msgformat_format.c +++ b/ext/intl/msgformat/msgformat_format.c @@ -103,7 +103,7 @@ PHP_FUNCTION( msgfmt_format_message ) int spattern_len = 0; char *pattern = NULL; int pattern_len = 0; - char *slocale = NULL; + const char *slocale = NULL; int slocale_len = 0; MessageFormatter_object mf = {0}; MessageFormatter_object *mfo = &mf; diff --git a/ext/intl/msgformat/msgformat_parse.c b/ext/intl/msgformat/msgformat_parse.c index 413d3b1f15d89..14a6363424bf0 100644 --- a/ext/intl/msgformat/msgformat_parse.c +++ b/ext/intl/msgformat/msgformat_parse.c @@ -93,7 +93,7 @@ PHP_FUNCTION( msgfmt_parse_message ) int spattern_len = 0; char *pattern = NULL; int pattern_len = 0; - char *slocale = NULL; + const char *slocale = NULL; int slocale_len = 0; char *source = NULL; int src_len = 0; From 8bef8e66cfaa575b63b5032b2cce32c5f73b3c94 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 20 Oct 2013 22:59:07 -0700 Subject: [PATCH 308/400] fix argument type & remove warning --- ext/intl/dateformat/dateformat_parse.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/intl/dateformat/dateformat_parse.c b/ext/intl/dateformat/dateformat_parse.c index 4193e890175b9..993077854646e 100644 --- a/ext/intl/dateformat/dateformat_parse.c +++ b/ext/intl/dateformat/dateformat_parse.c @@ -62,7 +62,7 @@ static void internal_parse_to_timestamp(IntlDateFormatter_object *dfo, char* tex } /* }}} */ -static void add_to_localtime_arr( IntlDateFormatter_object *dfo, zval* return_value, UCalendar parsed_calendar, long calendar_field, char* key_name TSRMLS_DC) +static void add_to_localtime_arr( IntlDateFormatter_object *dfo, zval* return_value, const UCalendar *parsed_calendar, long calendar_field, char* key_name TSRMLS_DC) { long calendar_field_val = ucal_get( parsed_calendar, calendar_field, &INTL_DATA_ERROR_CODE(dfo)); INTL_METHOD_CHECK_STATUS( dfo, "Date parsing - localtime failed : could not get a field from calendar" ); @@ -83,7 +83,7 @@ static void add_to_localtime_arr( IntlDateFormatter_object *dfo, zval* return_va */ static void internal_parse_to_localtime(IntlDateFormatter_object *dfo, char* text_to_parse, int32_t text_len, int32_t *parse_pos, zval *return_value TSRMLS_DC) { - UCalendar* parsed_calendar = NULL; + UCalendar *parsed_calendar = NULL; UChar* text_utf16 = NULL; int32_t text_utf16_len = 0; long isInDST = 0; @@ -92,7 +92,7 @@ static void internal_parse_to_localtime(IntlDateFormatter_object *dfo, char* tex intl_convert_utf8_to_utf16(&text_utf16, &text_utf16_len, text_to_parse, text_len, &INTL_DATA_ERROR_CODE(dfo)); INTL_METHOD_CHECK_STATUS(dfo, "Error converting timezone to UTF-16" ); - parsed_calendar = udat_getCalendar(DATE_FORMAT_OBJECT(dfo)); + parsed_calendar = (UCalendar *)udat_getCalendar(DATE_FORMAT_OBJECT(dfo)); udat_parseCalendar( DATE_FORMAT_OBJECT(dfo), parsed_calendar, text_utf16, text_utf16_len, parse_pos, &INTL_DATA_ERROR_CODE(dfo)); if (text_utf16) { From 27ebcb8d0e2f657ffe666a8ea4a81ae7a9b15cd1 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 20 Oct 2013 19:59:39 -0700 Subject: [PATCH 309/400] 5.4.21 release date --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 6c2c6ed13b5aa..6f3c00caea886 100644 --- a/NEWS +++ b/NEWS @@ -22,7 +22,7 @@ PHP NEWS . Fixed bug #64230 (XMLReader does not suppress errors). (Mike) -?? ??? 2013, PHP 5.4.21 +17 Oct 2013, PHP 5.4.21 - Core: . Fixed bug #65322 (compile time errors won't trigger auto loading). (Nikita) From 297324146e772fc41d79c23511f66d7d66f6784c Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 20 Oct 2013 22:04:21 -0700 Subject: [PATCH 310/400] Fix coverity issue with -1 returned by findOffset not being handled by getPreferredTag --- ext/intl/locale/locale_methods.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ext/intl/locale/locale_methods.c b/ext/intl/locale/locale_methods.c index 1707c69f93324..9c5b09a7bcc96 100644 --- a/ext/intl/locale/locale_methods.c +++ b/ext/intl/locale/locale_methods.c @@ -127,6 +127,9 @@ static char* getPreferredTag(char* gf_tag) int grOffset = 0; grOffset = findOffset( LOC_GRANDFATHERED ,gf_tag); + if(grOffset < 0) { + return NULL; + } if( grOffset < LOC_PREFERRED_GRANDFATHERED_LEN ){ /* return preferred tag */ result = estrdup( LOC_PREFERRED_GRANDFATHERED[grOffset] ); From 219a682e8e977ebe1df49c29c51d52a044a09f8f Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 20 Oct 2013 21:57:33 -0700 Subject: [PATCH 311/400] fix possibility of access to *storedType without initialization --- ext/intl/msgformat/msgformat_helpers.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ext/intl/msgformat/msgformat_helpers.cpp b/ext/intl/msgformat/msgformat_helpers.cpp index c4456d54f3c84..f75fd91dce775 100644 --- a/ext/intl/msgformat/msgformat_helpers.cpp +++ b/ext/intl/msgformat/msgformat_helpers.cpp @@ -209,6 +209,9 @@ static HashTable *umsg_parse_format(MessageFormatter_object *mfo, continue; } } + } else { + intl_errors_set(&err, U_INVALID_FORMAT_ERROR, "Invalid part type encountered", 0 TSRMLS_CC); + continue; } UMessagePatternArgType argType = p.getArgType(); From 444612cdc48d68e94c5a94aa47153a2b3933470a Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 20 Oct 2013 22:04:21 -0700 Subject: [PATCH 312/400] Fix coverity issue with -1 returned by findOffset not being handled by getPreferredTag --- ext/intl/locale/locale_methods.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ext/intl/locale/locale_methods.c b/ext/intl/locale/locale_methods.c index d1a86d8ee27f4..915f4d5af47d8 100644 --- a/ext/intl/locale/locale_methods.c +++ b/ext/intl/locale/locale_methods.c @@ -127,6 +127,9 @@ static char* getPreferredTag(char* gf_tag) int grOffset = 0; grOffset = findOffset( LOC_GRANDFATHERED ,gf_tag); + if(grOffset < 0) { + return NULL; + } if( grOffset < LOC_PREFERRED_GRANDFATHERED_LEN ){ /* return preferred tag */ result = estrdup( LOC_PREFERRED_GRANDFATHERED[grOffset] ); From 06954d1bc1966ade0815db3f4ec8983b954950c1 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 20 Oct 2013 22:32:20 -0700 Subject: [PATCH 313/400] fix const warnings in intl methods --- ext/intl/collator/collator_create.c | 2 +- ext/intl/formatter/formatter_main.c | 2 +- ext/intl/locale/locale_methods.c | 46 +++++++++++++-------------- ext/intl/msgformat/msgformat.c | 2 +- ext/intl/msgformat/msgformat_format.c | 2 +- ext/intl/msgformat/msgformat_parse.c | 2 +- 6 files changed, 28 insertions(+), 28 deletions(-) diff --git a/ext/intl/collator/collator_create.c b/ext/intl/collator/collator_create.c index b2a8c7f6bac07..7ed4c534394b4 100644 --- a/ext/intl/collator/collator_create.c +++ b/ext/intl/collator/collator_create.c @@ -27,7 +27,7 @@ /* {{{ */ static void collator_ctor(INTERNAL_FUNCTION_PARAMETERS) { - char* locale; + const char* locale; int locale_len = 0; zval* object; Collator_object* co; diff --git a/ext/intl/formatter/formatter_main.c b/ext/intl/formatter/formatter_main.c index d0671a88b5e47..0a568472c4835 100644 --- a/ext/intl/formatter/formatter_main.c +++ b/ext/intl/formatter/formatter_main.c @@ -27,7 +27,7 @@ /* {{{ */ static void numfmt_ctor(INTERNAL_FUNCTION_PARAMETERS) { - char* locale; + const char* locale; char* pattern = NULL; int locale_len = 0, pattern_len = 0; long style; diff --git a/ext/intl/locale/locale_methods.c b/ext/intl/locale/locale_methods.c index 915f4d5af47d8..21b5847f2d339 100644 --- a/ext/intl/locale/locale_methods.c +++ b/ext/intl/locale/locale_methods.c @@ -121,7 +121,7 @@ static int16_t findOffset(const char* const* list, const char* key) } /*}}}*/ -static char* getPreferredTag(char* gf_tag) +static char* getPreferredTag(const char* gf_tag) { char* result = NULL; int grOffset = 0; @@ -175,7 +175,7 @@ static int getStrrtokenPos(char* str, int savedPos) * returns -1 if no singleton * strtok equivalent search for singleton */ -static int getSingletonPos(char* str) +static int getSingletonPos(const char* str) { int result =-1; int i=0; @@ -251,7 +251,7 @@ PHP_NAMED_FUNCTION(zif_locale_set_default) * common code shared by get_primary_language,get_script or get_region or get_variant * result = 0 if error, 1 if successful , -1 if no value */ -static char* get_icu_value_internal( char* loc_name , char* tag_name, int* result , int fromParseLocale) +static char* get_icu_value_internal( const char* loc_name , char* tag_name, int* result , int fromParseLocale) { char* tag_value = NULL; int32_t tag_value_len = 512; @@ -281,7 +281,7 @@ static char* get_icu_value_internal( char* loc_name , char* tag_name, int* resul /* Handle singletons */ if( strcmp(tag_name , LOC_LANG_TAG)==0 ){ if( strlen(loc_name)>1 && (isIDPrefix(loc_name) ==1 ) ){ - return loc_name; + return (char *)loc_name; } } @@ -370,7 +370,7 @@ static char* get_icu_value_internal( char* loc_name , char* tag_name, int* resul static void get_icu_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAMETERS) { - char* loc_name = NULL; + const char* loc_name = NULL; int loc_name_len = 0; char* tag_value = NULL; @@ -465,10 +465,10 @@ PHP_FUNCTION(locale_get_primary_language ) }}} */ static void get_icu_disp_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAMETERS) { - char* loc_name = NULL; + const char* loc_name = NULL; int loc_name_len = 0; - char* disp_loc_name = NULL; + const char* disp_loc_name = NULL; int disp_loc_name_len = 0; int free_loc_name = 0; @@ -561,7 +561,7 @@ static void get_icu_disp_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAME efree( mod_loc_name ); } if (free_loc_name) { - efree(disp_loc_name); + efree((void *)disp_loc_name); disp_loc_name = NULL; } RETURN_FALSE; @@ -572,7 +572,7 @@ static void get_icu_disp_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAME efree( mod_loc_name ); } if (free_loc_name) { - efree(disp_loc_name); + efree((void *)disp_loc_name); disp_loc_name = NULL; } /* Convert display locale name from UTF-16 to UTF-8. */ @@ -666,10 +666,10 @@ PHP_FUNCTION( locale_get_keywords ) UEnumeration* e = NULL; UErrorCode status = U_ZERO_ERROR; - const char* kw_key = NULL; + const char* kw_key = NULL; int32_t kw_key_len = 0; - char* loc_name = NULL; + const char* loc_name = NULL; int loc_name_len = 0; /* @@ -716,7 +716,7 @@ PHP_FUNCTION( locale_get_keywords ) kw_value = erealloc( kw_value , kw_value_len+1); } if (U_FAILURE(status)) { - intl_error_set( NULL, FAILURE, "locale_get_keywords: Error encountered while getting the keyword value for the keyword", 0 TSRMLS_CC ); + intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "locale_get_keywords: Error encountered while getting the keyword value for the keyword", 0 TSRMLS_CC ); if( kw_value){ efree( kw_value ); } @@ -974,12 +974,12 @@ PHP_FUNCTION(locale_compose) * e.g. for locale='en_US-x-prv1-prv2-prv3' * returns a pointer to the string 'prv1-prv2-prv3' */ -static char* get_private_subtags(char* loc_name) +static char* get_private_subtags(const char* loc_name) { char* result =NULL; int singletonPos = 0; int len =0; - char* mod_loc_name =NULL; + const char* mod_loc_name =NULL; if( loc_name && (len = strlen(loc_name)>0 ) ){ mod_loc_name = loc_name ; @@ -1019,7 +1019,7 @@ static char* get_private_subtags(char* loc_name) /* {{{ code used by locale_parse */ -static int add_array_entry(char* loc_name, zval* hash_arr, char* key_name TSRMLS_DC) +static int add_array_entry(const char* loc_name, zval* hash_arr, char* key_name TSRMLS_DC) { char* key_value = NULL; char* cur_key_name = NULL; @@ -1084,7 +1084,7 @@ static int add_array_entry(char* loc_name, zval* hash_arr, char* key_name TSRMLS */ PHP_FUNCTION(locale_parse) { - char* loc_name = NULL; + const char* loc_name = NULL; int loc_name_len = 0; int grOffset = 0; @@ -1128,8 +1128,8 @@ PHP_FUNCTION(locale_parse) */ PHP_FUNCTION(locale_get_all_variants) { - char* loc_name = NULL; - int loc_name_len = 0; + const char* loc_name = NULL; + int loc_name_len = 0; int result = 0; char* token = NULL; @@ -1182,10 +1182,10 @@ PHP_FUNCTION(locale_get_all_variants) /*{{{ * Converts to lower case and also replaces all hyphens with the underscore */ -static int strToMatch(char* str ,char *retstr) +static int strToMatch(const char* str ,char *retstr) { char* anchor = NULL; - char* anchor1 = NULL; + const char* anchor1 = NULL; int result = 0; int len = 0; @@ -1225,7 +1225,7 @@ PHP_FUNCTION(locale_filter_matches) { char* lang_tag = NULL; int lang_tag_len = 0; - char* loc_range = NULL; + const char* loc_range = NULL; int loc_range_len = 0; int result = 0; @@ -1401,7 +1401,7 @@ static void array_cleanup( char* arr[] , int arr_size) * returns the lookup result to lookup_loc_range_src_php * internal function */ -static char* lookup_loc_range(char* loc_range, HashTable* hash_arr, int canonicalize TSRMLS_DC) +static char* lookup_loc_range(const char* loc_range, HashTable* hash_arr, int canonicalize TSRMLS_DC) { int i = 0; int cur_arr_len = 0; @@ -1523,7 +1523,7 @@ PHP_FUNCTION(locale_lookup) { char* fallback_loc = NULL; int fallback_loc_len = 0; - char* loc_range = NULL; + const char* loc_range = NULL; int loc_range_len = 0; zval* arr = NULL; diff --git a/ext/intl/msgformat/msgformat.c b/ext/intl/msgformat/msgformat.c index 6a9f04f32b463..7d8cd958e3c08 100644 --- a/ext/intl/msgformat/msgformat.c +++ b/ext/intl/msgformat/msgformat.c @@ -28,7 +28,7 @@ /* {{{ */ static void msgfmt_ctor(INTERNAL_FUNCTION_PARAMETERS) { - char* locale; + const char* locale; char* pattern; int locale_len = 0, pattern_len = 0; UChar* spattern = NULL; diff --git a/ext/intl/msgformat/msgformat_format.c b/ext/intl/msgformat/msgformat_format.c index 4b81cfe2b454c..55ec9e84ba0e8 100644 --- a/ext/intl/msgformat/msgformat_format.c +++ b/ext/intl/msgformat/msgformat_format.c @@ -103,7 +103,7 @@ PHP_FUNCTION( msgfmt_format_message ) int spattern_len = 0; char *pattern = NULL; int pattern_len = 0; - char *slocale = NULL; + const char *slocale = NULL; int slocale_len = 0; MessageFormatter_object mf = {0}; MessageFormatter_object *mfo = &mf; diff --git a/ext/intl/msgformat/msgformat_parse.c b/ext/intl/msgformat/msgformat_parse.c index 413d3b1f15d89..14a6363424bf0 100644 --- a/ext/intl/msgformat/msgformat_parse.c +++ b/ext/intl/msgformat/msgformat_parse.c @@ -93,7 +93,7 @@ PHP_FUNCTION( msgfmt_parse_message ) int spattern_len = 0; char *pattern = NULL; int pattern_len = 0; - char *slocale = NULL; + const char *slocale = NULL; int slocale_len = 0; char *source = NULL; int src_len = 0; From 3900ce97a3bc775bb44a8879e03a13dd47d10190 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 20 Oct 2013 22:59:07 -0700 Subject: [PATCH 314/400] fix argument type & remove warning --- ext/intl/dateformat/dateformat_parse.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/intl/dateformat/dateformat_parse.c b/ext/intl/dateformat/dateformat_parse.c index 4193e890175b9..993077854646e 100644 --- a/ext/intl/dateformat/dateformat_parse.c +++ b/ext/intl/dateformat/dateformat_parse.c @@ -62,7 +62,7 @@ static void internal_parse_to_timestamp(IntlDateFormatter_object *dfo, char* tex } /* }}} */ -static void add_to_localtime_arr( IntlDateFormatter_object *dfo, zval* return_value, UCalendar parsed_calendar, long calendar_field, char* key_name TSRMLS_DC) +static void add_to_localtime_arr( IntlDateFormatter_object *dfo, zval* return_value, const UCalendar *parsed_calendar, long calendar_field, char* key_name TSRMLS_DC) { long calendar_field_val = ucal_get( parsed_calendar, calendar_field, &INTL_DATA_ERROR_CODE(dfo)); INTL_METHOD_CHECK_STATUS( dfo, "Date parsing - localtime failed : could not get a field from calendar" ); @@ -83,7 +83,7 @@ static void add_to_localtime_arr( IntlDateFormatter_object *dfo, zval* return_va */ static void internal_parse_to_localtime(IntlDateFormatter_object *dfo, char* text_to_parse, int32_t text_len, int32_t *parse_pos, zval *return_value TSRMLS_DC) { - UCalendar* parsed_calendar = NULL; + UCalendar *parsed_calendar = NULL; UChar* text_utf16 = NULL; int32_t text_utf16_len = 0; long isInDST = 0; @@ -92,7 +92,7 @@ static void internal_parse_to_localtime(IntlDateFormatter_object *dfo, char* tex intl_convert_utf8_to_utf16(&text_utf16, &text_utf16_len, text_to_parse, text_len, &INTL_DATA_ERROR_CODE(dfo)); INTL_METHOD_CHECK_STATUS(dfo, "Error converting timezone to UTF-16" ); - parsed_calendar = udat_getCalendar(DATE_FORMAT_OBJECT(dfo)); + parsed_calendar = (UCalendar *)udat_getCalendar(DATE_FORMAT_OBJECT(dfo)); udat_parseCalendar( DATE_FORMAT_OBJECT(dfo), parsed_calendar, text_utf16, text_utf16_len, parse_pos, &INTL_DATA_ERROR_CODE(dfo)); if (text_utf16) { From f860486de5805eefd63af5d750c913e1515970c8 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Mon, 21 Oct 2013 00:01:24 -0700 Subject: [PATCH 315/400] fix memory leak on error (from Coverity scan) --- ext/date/php_date.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 70960b161f627..7e4de09c1ec7e 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -1362,6 +1362,7 @@ PHPAPI signed long php_parse_date(char *string, signed long *now) parsed_time = timelib_strtotime(string, strlen(string), &error, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper); if (error->error_count) { + timelib_time_dtor(parsed_time); timelib_error_container_dtor(error); return -1; } From 098855433dc5d609e3970f0bc9d6766c007273f3 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Mon, 21 Oct 2013 17:40:39 +0800 Subject: [PATCH 316/400] Fixed issue #115 (path issue when using phar). --- NEWS | 1 + ext/opcache/ZendAccelerator.c | 44 +++++++++++++++++++++++++++++++---- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index 4978c7e722527..a3d075af09eb7 100644 --- a/NEWS +++ b/NEWS @@ -51,6 +51,7 @@ PHP NEWS imap). (ryotakatsuki at gmail dot com) - OPcache: + . Fixed issue #115 (path issue when using phar). (Laruence) . Added support for GNU Hurd. (Svante Signell) . Added function opcache_compile_file() to load PHP scripts into cache without execution. (Julien) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 72b5a1b9fe7e7..48ff73019b8f6 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -37,6 +37,7 @@ #include "zend_API.h" #include "zend_ini.h" #include "TSRM/tsrm_virtual_cwd.h" +#include "ext/phar/php_phar.h" #include "zend_accelerator_util_funcs.h" #include "zend_accelerator_hash.h" @@ -144,6 +145,21 @@ static inline int is_cacheable_stream_path(const char *filename) memcmp(filename, "phar://", sizeof("phar://") - 1) == 0; } +static inline int is_phar_relative_alias_path(const char *filename, char **alias, int *alias_len) +{ + if (memcmp(filename, "phar://", sizeof("phar://") - 1) == 0 + && filename[sizeof("phar://") - 1] != '\0' && filename[sizeof("phar://") - 1] != '/') { + char *slash; + *alias = filename + sizeof("phar://") - 1; + slash = strstr(*alias, "/"); + if (slash) { + *alias_len = slash - *alias; + return 1; + } + } + return 0; +} + /* O+ overrides PHP chdir() function and remembers the current working directory * in ZCG(cwd) and ZCG(cwd_len). Later accel_getcwd() can use stored value and * avoid getcwd() call. @@ -1028,15 +1044,33 @@ char *accel_make_persistent_key_ex(zend_file_handle *file_handle, int path_lengt } memcpy(ZCG(key) + cur_len, include_path, include_path_len); ZCG(key)[key_length] = '\0'; - } else { - /* not use_cwd */ - key_length = path_length; + } else { + /* not use_cwd */ + key_length = path_length; if ((size_t)key_length >= sizeof(ZCG(key))) { ZCG(key_len) = 0; return NULL; + } else { + char *alias; + int alias_len; + if (is_phar_relative_alias_path(file_handle->filename, &alias, &alias_len)) { + char *phar_path; + int phar_path_len; + if (phar_resolve_alias(alias, alias_len, &phar_path, &phar_path_len TSRMLS_CC) == SUCCESS) { + int filename_len = strlen(file_handle->filename); + memcpy(ZCG(key), "phar://", sizeof("phar://") -1); + memcpy(ZCG(key) + sizeof("phar://") - 1, phar_path, phar_path_len); + memcpy(ZCG(key) + sizeof("phar://") - 1 + phar_path_len, + alias + alias_len, filename_len - alias_len - sizeof("phar://") + 2); + key_length = filename_len + (phar_path_len - alias_len); + } else { + memcpy(ZCG(key), file_handle->filename, key_length + 1); + } + } else { + memcpy(ZCG(key), file_handle->filename, key_length + 1); + } } - memcpy(ZCG(key), file_handle->filename, key_length + 1); - } + } *key_len = ZCG(key_len) = key_length; return ZCG(key); From 2ecf94e07efae6059e40069a7c1a895514c24466 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Mon, 21 Oct 2013 12:16:41 +0200 Subject: [PATCH 317/400] Just SKIP that test on travis --- ext/standard/tests/file/disk_free_space_basic.phpt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ext/standard/tests/file/disk_free_space_basic.phpt b/ext/standard/tests/file/disk_free_space_basic.phpt index 7ea8d36153f06..9dc663ae16e31 100644 --- a/ext/standard/tests/file/disk_free_space_basic.phpt +++ b/ext/standard/tests/file/disk_free_space_basic.phpt @@ -1,5 +1,9 @@ --TEST-- Test disk_free_space and its alias diskfreespace() functions : basic functionality +--SKIPIF-- + --INI-- memory_limit=32M --FILE-- From 60ce3811ae3b86eb7bfb86cc965e3f79e61bfc4a Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 21 Oct 2013 14:17:10 +0400 Subject: [PATCH 318/400] Fixed compilation warning --- ext/opcache/ZendAccelerator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 48ff73019b8f6..8cee80f77693d 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -150,7 +150,7 @@ static inline int is_phar_relative_alias_path(const char *filename, char **alias if (memcmp(filename, "phar://", sizeof("phar://") - 1) == 0 && filename[sizeof("phar://") - 1] != '\0' && filename[sizeof("phar://") - 1] != '/') { char *slash; - *alias = filename + sizeof("phar://") - 1; + *alias = (char*)filename + sizeof("phar://") - 1; slash = strstr(*alias, "/"); if (slash) { *alias_len = slash - *alias; From fb610b4e808c770800434d1a42d606f274927a94 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Mon, 21 Oct 2013 12:18:58 +0200 Subject: [PATCH 319/400] remove TRAVIS check in test source --- ext/standard/tests/file/disk_free_space_basic.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/tests/file/disk_free_space_basic.phpt b/ext/standard/tests/file/disk_free_space_basic.phpt index e0bc367bf4fa5..200e92ab43e84 100644 --- a/ext/standard/tests/file/disk_free_space_basic.phpt +++ b/ext/standard/tests/file/disk_free_space_basic.phpt @@ -37,7 +37,7 @@ echo "\n Free Space after writing to a file\n"; $space2 = disk_free_space($file_path.$dir); var_dump( $space2 ); -if(getenv('TRAVIS') === 'true' || $space1 > $space2 ) +if($space1 > $space2 ) echo "\n Free Space Value Is Correct\n"; else echo "\n Free Space Value Is Incorrect\n"; From b636c03426193ecf0b7e166126a14b70ce8185e9 Mon Sep 17 00:00:00 2001 From: Antony Dovgal Date: Mon, 21 Oct 2013 15:09:29 +0400 Subject: [PATCH 320/400] fix bug #65936 (dangling context pointer causes crash) reported by Leon Sorokin --- NEWS | 1 + ext/standard/basic_functions.c | 1 + 2 files changed, 2 insertions(+) diff --git a/NEWS b/NEWS index a3d075af09eb7..69b1658158db8 100644 --- a/NEWS +++ b/NEWS @@ -14,6 +14,7 @@ PHP NEWS . Fixed bug #65322 (compile time errors won't trigger auto loading). (Nikita) . Fixed bug #65821 (By-ref foreach on property access of string offset segfaults). (Nikita) + . Fixed bug #65936 (dangling context pointer causes crash). (Tony) - CLI server: . Fixed bug #65633 (built-in server treat some http headers as diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index eca7d903680fa..b4128e066b7f8 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -3639,6 +3639,7 @@ PHP_MINIT_FUNCTION(basic) /* {{{ */ BASIC_ADD_SUBMODULE(dl) BASIC_ADD_SUBMODULE(mail) + BASIC_ADD_SUBMODULE(streams) BASIC_MINIT_SUBMODULE(file) BASIC_MINIT_SUBMODULE(pack) BASIC_MINIT_SUBMODULE(browscap) From 8591a52fab3fa6656669ed853466a01774398ed9 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Mon, 21 Oct 2013 11:15:31 -0700 Subject: [PATCH 321/400] fixed invalid free --- sapi/cgi/cgi_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c index 221b0021756dc..ec397bf3aeef4 100644 --- a/sapi/cgi/cgi_main.c +++ b/sapi/cgi/cgi_main.c @@ -815,7 +815,7 @@ static void php_cgi_ini_activate_user_config(char *path, int path_len, const cha } if (real_path) { - free(real_path); + efree(real_path); } entry->expires = request_time + PG(user_ini_cache_ttl); } @@ -1396,7 +1396,7 @@ static void init_request_info(fcgi_request *request TSRMLS_DC) } else { SG(request_info).request_uri = env_script_name; } - free(real_path); + efree(real_path); } } else { /* pre 4.3 behaviour, shouldn't be used but provides BC */ From 1b43f9504020a1fa607eb58b81defaba9d8cfd6b Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Mon, 21 Oct 2013 21:48:27 +0200 Subject: [PATCH 322/400] Merged PR #293 (Exif crash on unknown encoding was fixed) By: Draal Conflicts: configure.in main/php_version.h --- ext/exif/exif.c | 12 +++++++----- ext/exif/tests/exif_encoding_crash.jpg | Bin 0 -> 7599 bytes ext/exif/tests/exif_encoding_crash.phpt | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 ext/exif/tests/exif_encoding_crash.jpg create mode 100644 ext/exif/tests/exif_encoding_crash.phpt diff --git a/ext/exif/exif.c b/ext/exif/exif.c index bd646d9adf15a..2fe54f7b31c3c 100644 --- a/ext/exif/exif.c +++ b/ext/exif/exif.c @@ -2643,6 +2643,7 @@ static int exif_process_user_comment(image_info_type *ImageInfo, char **pszInfoP } else { decode = ImageInfo->decode_unicode_le; } + /* XXX this will fail again if encoding_converter returns on error something different than SIZE_MAX */ if (zend_multibyte_encoding_converter( (unsigned char**)pszInfoPtr, &len, @@ -2650,7 +2651,7 @@ static int exif_process_user_comment(image_info_type *ImageInfo, char **pszInfoP ByteCount, zend_multibyte_fetch_encoding(ImageInfo->encode_unicode TSRMLS_CC), zend_multibyte_fetch_encoding(decode TSRMLS_CC) - TSRMLS_CC) < 0) { + TSRMLS_CC) == (size_t)-1) { len = exif_process_string_raw(pszInfoPtr, szValuePtr, ByteCount); } return len; @@ -2663,6 +2664,7 @@ static int exif_process_user_comment(image_info_type *ImageInfo, char **pszInfoP *pszEncoding = estrdup((const char*)szValuePtr); szValuePtr = szValuePtr+8; ByteCount -= 8; + /* XXX this will fail again if encoding_converter returns on error something different than SIZE_MAX */ if (zend_multibyte_encoding_converter( (unsigned char**)pszInfoPtr, &len, @@ -2670,7 +2672,7 @@ static int exif_process_user_comment(image_info_type *ImageInfo, char **pszInfoP ByteCount, zend_multibyte_fetch_encoding(ImageInfo->encode_jis TSRMLS_CC), zend_multibyte_fetch_encoding(ImageInfo->motorola_intel ? ImageInfo->decode_jis_be : ImageInfo->decode_jis_le TSRMLS_CC) - TSRMLS_CC) < 0) { + TSRMLS_CC) == (size_t)-1) { len = exif_process_string_raw(pszInfoPtr, szValuePtr, ByteCount); } return len; @@ -2700,8 +2702,8 @@ static int exif_process_user_comment(image_info_type *ImageInfo, char **pszInfoP static int exif_process_unicode(image_info_type *ImageInfo, xp_field_type *xp_field, int tag, char *szValuePtr, int ByteCount TSRMLS_DC) { xp_field->tag = tag; - - /* Copy the comment */ + + /* XXX this will fail again if encoding_converter returns on error something different than SIZE_MAX */ if (zend_multibyte_encoding_converter( (unsigned char**)&xp_field->value, &xp_field->size, @@ -2709,7 +2711,7 @@ static int exif_process_unicode(image_info_type *ImageInfo, xp_field_type *xp_fi ByteCount, zend_multibyte_fetch_encoding(ImageInfo->encode_unicode TSRMLS_CC), zend_multibyte_fetch_encoding(ImageInfo->motorola_intel ? ImageInfo->decode_unicode_be : ImageInfo->decode_unicode_le TSRMLS_CC) - TSRMLS_CC) < 0) { + TSRMLS_CC) == (size_t)-1) { xp_field->size = exif_process_string_raw(&xp_field->value, szValuePtr, ByteCount); } return xp_field->size; diff --git a/ext/exif/tests/exif_encoding_crash.jpg b/ext/exif/tests/exif_encoding_crash.jpg new file mode 100644 index 0000000000000000000000000000000000000000..55138abe55210de94674b32ad39676608e88b3ab GIT binary patch literal 7599 zcmeHMTW}Lq7(Sa#nlvrYlyVUnUCJeep-r-Ffvjn;qy&ogLRu~OWSVT7we4=$-I}yB zK7bd{@u7`(24{d)MIW321yN^I6a{<(Z-72n@A4wx-O-8vIoWK|(jrmu#hmPE{`2pD zzW@Kf^Y58%PV#i}Q&h6S-{?mawB^)tgpy-L53Y?1T?jQbp=Agm3o4>!AOlFH&=XV% zk*y$)Ql*H7Zwfw$nukn8M(BC!T3tRwRcJPVK)J}=>%i_ciY0Ox$e$QyW^lF($e6;R zxLvz2GTH$BJap9DcvDL=<7)}Dwgl?i8(W$+O@rGBcX9M267pRimO6Q+H6p2!5|N^e zuWbcW(IJRoDW)t%tkYG^Ia$uRiorrP$GQ>oFMS}2CEIqU8K5oOp48=%9pzf4z}pVH zCWjFkLdXpBj82wy4bf?4=($5iU0yy+rEDkz4aOpAl z9L)w+eR|k(Wr)rGafbSF-J#D8h$0{3p5$q zr}M>fI$taoX4zP?BcZa$93QVj9LVG3?I%;V74LAUC)Q_HwmuG$S(rk=8N2;FcD zQa*(ca~L7h37Cr;U~N2rP?-&6{3KAou7NTTAJ`8y{~Y`UHu5dcK%Rj-19=AW4CER3 ze=?99o3SsVs!`725S6MR{-3rgB=tGs!KlMk<#Zs=>UcC5>fu$UlkXP9I{SC8zHVoP zaGkxQw#nHP_3;s5{h-XZ4K}xj275y8uzj`H>WOplzGxq>2AOzYuc&bGIy(X9K*nl^ zogpS_Po2H7FWAj<9DXTim!w|CUB$9?z>vdTT%f_PA;754u7w(l#j0Y}Rg&E8aJk)X zhm&=%Y$aG!Dg&Y#j8}@vLO`%G1fzjhLb4E51xaKuX0TK0SL^I{E2Ba4;918WM+3e? zcmOnp@!%onllr2P$cw7tlf*8eyI&4sXl#)3*T!!lgVd;3@VYz>>=z_#qpR7;)zy=$ zo#WK0f#%8M_^ZG&k;}ZI@ZmLrsLorq>|25VA|nCy*^>HuhS>DN{WCz31YW5?d*~p(KY^)OLlptgG4Zx?J^^cajsudAjm+<-|Zv#`)^X)0GngIT`1x zD^FKW4CG||-&9xTt(zC&RXYan)X9&L4}Qm|@TE1{MB`RqG}0z>f!U0^rLd^bVzFAx zX6rPowWt`Hxp4Z7X~omAj6v{pJPWR3i`jxLa%;&qkj(&hm7DW5to5&3-?*Wz{gzuh zHf_Ew6z03SBf=eu+J9#(J}`LqJ@?+XeaHO|Bp!PBkw+hU{E3}=M@FA|`k8&tK6l`S z7Y`nK>F~?1y!qDAx8FH-{KUJb-h2Op4?jA6=Iq#KpMUY?S6_eg?YRpVzyIOKpML)3 z*WYknaAK57OV4aVUN(HZ0&8G2ntj!;b6!{+t6zC$M1U|sGyT){scQ3 BQ}O@+ literal 0 HcmV?d00001 diff --git a/ext/exif/tests/exif_encoding_crash.phpt b/ext/exif/tests/exif_encoding_crash.phpt new file mode 100644 index 0000000000000..1c4ad63860346 --- /dev/null +++ b/ext/exif/tests/exif_encoding_crash.phpt @@ -0,0 +1,14 @@ +--TEST-- +PHP crash when zend_multibyte_encoding_converter returns (size_t)-1) +--SKIPIF-- + +--FILE-- + +===DONE=== +--EXPECT-- +*** no core dump *** +===DONE=== From 2fa5f39e4c489495b886214aa788d0fbffe06446 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Mon, 21 Oct 2013 22:15:09 +0200 Subject: [PATCH 323/400] add tests for bug #62523 --- ext/exif/tests/bug62523_1.jpg | 9 +++++++++ ext/exif/tests/bug62523_1.phpt | 18 ++++++++++++++++++ ext/exif/tests/bug62523_2.jpg | Bin 0 -> 516533 bytes ext/exif/tests/bug62523_2.phpt | 16 ++++++++++++++++ ext/exif/tests/bug62523_3.jpg | 12 ++++++++++++ ext/exif/tests/bug62523_3.phpt | 18 ++++++++++++++++++ 6 files changed, 73 insertions(+) create mode 100644 ext/exif/tests/bug62523_1.jpg create mode 100644 ext/exif/tests/bug62523_1.phpt create mode 100644 ext/exif/tests/bug62523_2.jpg create mode 100644 ext/exif/tests/bug62523_2.phpt create mode 100644 ext/exif/tests/bug62523_3.jpg create mode 100644 ext/exif/tests/bug62523_3.phpt diff --git a/ext/exif/tests/bug62523_1.jpg b/ext/exif/tests/bug62523_1.jpg new file mode 100644 index 0000000000000..9a63d1e84d90b --- /dev/null +++ b/ext/exif/tests/bug62523_1.jpg @@ -0,0 +1,9 @@ + + +301 Moved Permanently + +

Moved Permanently

+

The document has moved here.

+
+
Apache Server at getid3.org Port 80
+ diff --git a/ext/exif/tests/bug62523_1.phpt b/ext/exif/tests/bug62523_1.phpt new file mode 100644 index 0000000000000..28d42f021d073 --- /dev/null +++ b/ext/exif/tests/bug62523_1.phpt @@ -0,0 +1,18 @@ +--TEST-- +Bug 62523 (php crashes with segfault when exif_read_data called) +--SKIPIF-- + +--FILE-- + +Done +--EXPECTF-- +Test + +Warning: exif_read_data(bug62523_1.jpg): File not supported in %sbug62523_1.php on line %d +int(1) +Done diff --git a/ext/exif/tests/bug62523_2.jpg b/ext/exif/tests/bug62523_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8d7fc6c5f41ba1ddfeb20e0a90959ef9b347687f GIT binary patch literal 516533 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

RrZi=NZ({|KaQAsm{F>3o-&j- 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 z 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 z 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 +--FILE-- + +Done +--EXPECT-- +Test +int(76) +Done diff --git a/ext/exif/tests/bug62523_3.jpg b/ext/exif/tests/bug62523_3.jpg new file mode 100644 index 0000000000000..3ee91368ceb86 --- /dev/null +++ b/ext/exif/tests/bug62523_3.jpg @@ -0,0 +1,12 @@ + + Found + +

Found

+

The resource was found at http://dl.dropboxusercontent.com/u/7562584/Bugs/Php/bad_exif.jpeg; +you should be redirected automatically. + +

+
+
WSGI Server
+ + diff --git a/ext/exif/tests/bug62523_3.phpt b/ext/exif/tests/bug62523_3.phpt new file mode 100644 index 0000000000000..6e11354c5a725 --- /dev/null +++ b/ext/exif/tests/bug62523_3.phpt @@ -0,0 +1,18 @@ +--TEST-- +Bug 62523 (php crashes with segfault when exif_read_data called) +--SKIPIF-- + +--FILE-- + +Done +--EXPECTF-- +Test + +Warning: exif_read_data(bug62523_3.jpg): File not supported in %sbug62523_3.php on line %d +int(1) +Done From 5cc797d119bb3936a8acce48ede04fa29a3219c6 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Mon, 21 Oct 2013 22:44:37 +0200 Subject: [PATCH 324/400] exif NEWS --- NEWS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/NEWS b/NEWS index 6f3c00caea886..9439136ef6e16 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,9 @@ PHP NEWS . Fixed bug #65818 (Segfault with built-in webserver and chunked transfer encoding). (Felipe) +- Exif: + . Fixed crash on unknown encoding. (Draal) + - FTP: . Fixed bug #65667 (ftp_nb_continue produces segfault). (Philip Hofstetter) From b6ceea4a25f667bfed6c26899dd55a274a3270d3 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Mon, 21 Oct 2013 14:20:35 -0700 Subject: [PATCH 325/400] Fixed bug #65939 (Space before ";" breaks php.ini parsing). (brainstorm at nopcode dot org) --- NEWS | 2 ++ php.ini-development | 2 +- php.ini-production | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 69b1658158db8..b51b8b23eb3cf 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,8 @@ PHP NEWS ?? ??? 2013, PHP 5.5.6 - Core: + . Fixed bug #65939 (Space before ";" breaks php.ini parsing). + (brainstorm at nopcode dot org) . Fixed bug #65911 (scope resolution operator - strange behavior with $this). (Bob Weinand) diff --git a/php.ini-development b/php.ini-development index 630f9e94e574a..2ef47a40a2448 100644 --- a/php.ini-development +++ b/php.ini-development @@ -1907,7 +1907,7 @@ ldap.max_links = -1 ;opcache.revalidate_path=0 ; If disabled, all PHPDoc comments are dropped from the code to reduce the - ;size of the optimized code. +; size of the optimized code. ;opcache.save_comments=1 ; If disabled, PHPDoc comments are not loaded from SHM, so "Doc Comments" diff --git a/php.ini-production b/php.ini-production index ba30f90880f45..c39de742db8b1 100644 --- a/php.ini-production +++ b/php.ini-production @@ -1907,7 +1907,7 @@ ldap.max_links = -1 ;opcache.revalidate_path=0 ; If disabled, all PHPDoc comments are dropped from the code to reduce the - ;size of the optimized code. +; size of the optimized code. ;opcache.save_comments=1 ; If disabled, PHPDoc comments are not loaded from SHM, so "Doc Comments" From 1f5b1cfb2b238b282c48adb663aaa084e28290c0 Mon Sep 17 00:00:00 2001 From: Yasuo Ohgaki Date: Tue, 22 Oct 2013 12:27:18 +0900 Subject: [PATCH 326/400] Fix Coverity issue reporting wrong sizeof() --- ext/pgsql/pgsql.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index f4c4cb37e785c..c8f7d3d4326e6 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -2639,7 +2639,7 @@ static void php_pgsql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, long result_type, Bucket *p; fci.param_count = 0; - fci.params = safe_emalloc(sizeof(zval*), ht->nNumOfElements, 0); + fci.params = safe_emalloc(sizeof(zval***), ht->nNumOfElements, 0); p = ht->pListHead; while (p != NULL) { fci.params[fci.param_count++] = (zval**)p->pData; From e68c1ef2ec3d890d958126cfa9f5330e9bfe1b31 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Tue, 22 Oct 2013 11:03:09 -0700 Subject: [PATCH 327/400] Added a LICENSE file to make it easier for PECL binary distributions to conform with the license. --- ext/oci8/LICENSE | 68 ++++++++++++++++++++++++++++++++++++++++++++ ext/oci8/package.xml | 34 ++++++++++++++++------ ext/oci8/php_oci8.h | 2 +- 3 files changed, 94 insertions(+), 10 deletions(-) create mode 100644 ext/oci8/LICENSE diff --git a/ext/oci8/LICENSE b/ext/oci8/LICENSE new file mode 100644 index 0000000000000..42536af320686 --- /dev/null +++ b/ext/oci8/LICENSE @@ -0,0 +1,68 @@ +-------------------------------------------------------------------- + The PHP License, version 3.01 +Copyright (c) 1999 - 2012 The PHP Group. All rights reserved. +-------------------------------------------------------------------- + +Redistribution and use in source and binary forms, with or without +modification, is permitted provided that the following conditions +are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + 3. The name "PHP" must not be used to endorse or promote products + derived from this software without prior written permission. For + written permission, please contact group@php.net. + + 4. Products derived from this software may not be called "PHP", nor + may "PHP" appear in their name, without prior written permission + from group@php.net. You may indicate that your software works in + conjunction with PHP by saying "Foo for PHP" instead of calling + it "PHP Foo" or "phpfoo" + + 5. The PHP Group may publish revised and/or new versions of the + license from time to time. Each version will be given a + distinguishing version number. + Once covered code has been published under a particular version + of the license, you may always continue to use it under the terms + of that version. You may also choose to use such covered code + under the terms of any subsequent version of the license + published by the PHP Group. No one other than the PHP Group has + the right to modify the terms applicable to covered code created + under this License. + + 6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes PHP software, freely available from + ". + +THIS SOFTWARE IS PROVIDED BY THE PHP DEVELOPMENT TEAM ``AS IS'' AND +ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PHP +DEVELOPMENT TEAM OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------- + +This software consists of voluntary contributions made by many +individuals on behalf of the PHP Group. + +The PHP Group can be contacted via Email at group@php.net. + +For more information on the PHP Group and the PHP project, +please see . + +PHP includes the Zend Engine, freely available at +. diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index b180b0d5f0bdc..7be825b895b39 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -45,12 +45,12 @@ libraries are available. no - 2013-10-17 + 2013-10-22 - 2.0.5 - 2.0.5 + 2.0.6 + 2.0.6 stable @@ -58,12 +58,8 @@ libraries are available. PHP -Bump PHP OCI8 2.0 mininum requirements to PHP 5.2 and Oracle client -library 10.2. (Use OCI8 1.4 for older PHP version support or if only -Oracle 9.2 client libraries are available.) - -Re-enable php_oci8.dll and php_oci8_11g.dll for Windows builds so URL -links work in the new Windows PECL infrastructure. +Added a LICENSE file to make it easier for PECL binary distributions +to conform with the license. @@ -462,6 +458,26 @@ links work in the new Windows PECL infrastructure. + + + 2.0.5 + 2.0.5 + + + stable + stable + + PHP + +Bump PHP OCI8 2.0 mininum requirements to PHP 5.2 and Oracle client +library 10.2. (Use OCI8 1.4 for older PHP version support or if only +Oracle 9.2 client libraries are available.) + +Re-enable php_oci8.dll and php_oci8_11g.dll for Windows builds so URL +links work in the new Windows PECL infrastructure. + + + 2.0.4 diff --git a/ext/oci8/php_oci8.h b/ext/oci8/php_oci8.h index ee8d83122114f..751041554982f 100644 --- a/ext/oci8/php_oci8.h +++ b/ext/oci8/php_oci8.h @@ -45,7 +45,7 @@ */ #undef PHP_OCI8_VERSION #endif -#define PHP_OCI8_VERSION "2.0.5" +#define PHP_OCI8_VERSION "2.0.6" extern zend_module_entry oci8_module_entry; #define phpext_oci8_ptr &oci8_module_entry From 0adba0abb9df1493c8b38299d4139d7bf0ecc4f5 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Wed, 23 Oct 2013 19:26:24 +0800 Subject: [PATCH 328/400] Added Zend Debugger to the note about the load order (by trash4you at online dot de) --- ext/opcache/README | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/opcache/README b/ext/opcache/README index 6c3cc746e77c0..46521587fa719 100644 --- a/ext/opcache/README +++ b/ext/opcache/README @@ -31,8 +31,8 @@ Quick Install zend_extension=/...full path.../opcache.so -NOTE: In case you are going to use Zend OPcache together with Xdebug, -be sure that Xdebug is loaded after OPcache. "php -v" must show Xdebug +NOTE: In case you are going to use Zend OPcache together with Xdebug or Zend Debugger, +be sure that the debugger is loaded after OPcache. "php -v" must show the debugger after OPcache. - Restart PHP From 70c3a722e2561cb33d408f3c65e58f9468d2f667 Mon Sep 17 00:00:00 2001 From: Adam Harvey Date: Wed, 23 Oct 2013 12:36:27 -0700 Subject: [PATCH 329/400] Increment version number, since this will be 5.5.6. --- configure.in | 2 +- main/php_version.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/configure.in b/configure.in index 40130626cb9f9..7e444b0ac4a03 100644 --- a/configure.in +++ b/configure.in @@ -119,7 +119,7 @@ int zend_sprintf(char *buffer, const char *format, ...); PHP_MAJOR_VERSION=5 PHP_MINOR_VERSION=5 -PHP_RELEASE_VERSION=5 +PHP_RELEASE_VERSION=6 PHP_EXTRA_VERSION="-dev" PHP_VERSION="$PHP_MAJOR_VERSION.$PHP_MINOR_VERSION.$PHP_RELEASE_VERSION$PHP_EXTRA_VERSION" PHP_VERSION_ID=`expr [$]PHP_MAJOR_VERSION \* 10000 + [$]PHP_MINOR_VERSION \* 100 + [$]PHP_RELEASE_VERSION` diff --git a/main/php_version.h b/main/php_version.h index d9ea4aab3cd61..2d98a3f80789a 100644 --- a/main/php_version.h +++ b/main/php_version.h @@ -2,7 +2,7 @@ /* edit configure.in to change version number */ #define PHP_MAJOR_VERSION 5 #define PHP_MINOR_VERSION 5 -#define PHP_RELEASE_VERSION 5 +#define PHP_RELEASE_VERSION 6 #define PHP_EXTRA_VERSION "-dev" -#define PHP_VERSION "5.5.5-dev" -#define PHP_VERSION_ID 50505 +#define PHP_VERSION "5.5.6-dev" +#define PHP_VERSION_ID 50506 From 9cb3a759a78f26c5af3e20ef9b3143fa0809db52 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Wed, 23 Oct 2013 22:33:53 +0100 Subject: [PATCH 330/400] - Updated to version 2013.7 (2013g) --- ext/date/lib/timezonedb.h | 1180 +++++++++++++++++++------------------ 1 file changed, 591 insertions(+), 589 deletions(-) diff --git a/ext/date/lib/timezonedb.h b/ext/date/lib/timezonedb.h index 8142aab565eb0..99280062b22a7 100644 --- a/ext/date/lib/timezonedb.h +++ b/ext/date/lib/timezonedb.h @@ -14,573 +14,573 @@ const timelib_tzdb_index_entry timezonedb_idx_builtin[579] = { { "Africa/Bujumbura" , 0x000571 }, { "Africa/Cairo" , 0x0005B5 }, { "Africa/Casablanca" , 0x000878 }, - { "Africa/Ceuta" , 0x000ABC }, - { "Africa/Conakry" , 0x000DC3 }, - { "Africa/Dakar" , 0x000E2E }, - { "Africa/Dar_es_Salaam" , 0x000E94 }, - { "Africa/Djibouti" , 0x000F01 }, - { "Africa/Douala" , 0x000F56 }, - { "Africa/El_Aaiun" , 0x000FAB }, - { "Africa/Freetown" , 0x001011 }, - { "Africa/Gaborone" , 0x001120 }, - { "Africa/Harare" , 0x00118D }, - { "Africa/Johannesburg" , 0x0011E2 }, - { "Africa/Juba" , 0x001250 }, - { "Africa/Kampala" , 0x001363 }, - { "Africa/Khartoum" , 0x0013E2 }, - { "Africa/Kigali" , 0x0014F5 }, - { "Africa/Kinshasa" , 0x00154A }, - { "Africa/Lagos" , 0x0015A5 }, - { "Africa/Libreville" , 0x0015FA }, - { "Africa/Lome" , 0x00164F }, - { "Africa/Luanda" , 0x001693 }, - { "Africa/Lubumbashi" , 0x0016E8 }, - { "Africa/Lusaka" , 0x001743 }, - { "Africa/Malabo" , 0x001798 }, - { "Africa/Maputo" , 0x0017FE }, - { "Africa/Maseru" , 0x001853 }, - { "Africa/Mbabane" , 0x0018BB }, - { "Africa/Mogadishu" , 0x001911 }, - { "Africa/Monrovia" , 0x00196C }, - { "Africa/Nairobi" , 0x0019D2 }, - { "Africa/Ndjamena" , 0x001A51 }, - { "Africa/Niamey" , 0x001ABD }, - { "Africa/Nouakchott" , 0x001B30 }, - { "Africa/Ouagadougou" , 0x001B9B }, - { "Africa/Porto-Novo" , 0x001BF0 }, - { "Africa/Sao_Tome" , 0x001C56 }, - { "Africa/Timbuktu" , 0x001CAB }, - { "Africa/Tripoli" , 0x001D16 }, - { "Africa/Tunis" , 0x001F0F }, - { "Africa/Windhoek" , 0x002021 }, - { "America/Adak" , 0x002268 }, - { "America/Anchorage" , 0x0025DE }, - { "America/Anguilla" , 0x002952 }, - { "America/Antigua" , 0x0029A7 }, - { "America/Araguaina" , 0x002A0D }, - { "America/Argentina/Buenos_Aires" , 0x002B72 }, - { "America/Argentina/Catamarca" , 0x002D20 }, - { "America/Argentina/ComodRivadavia" , 0x002EE1 }, - { "America/Argentina/Cordoba" , 0x003087 }, - { "America/Argentina/Jujuy" , 0x00325C }, - { "America/Argentina/La_Rioja" , 0x003410 }, - { "America/Argentina/Mendoza" , 0x0035C8 }, - { "America/Argentina/Rio_Gallegos" , 0x003788 }, - { "America/Argentina/Salta" , 0x00393D }, - { "America/Argentina/San_Juan" , 0x003AE9 }, - { "America/Argentina/San_Luis" , 0x003CA1 }, - { "America/Argentina/Tucuman" , 0x003E67 }, - { "America/Argentina/Ushuaia" , 0x004023 }, - { "America/Aruba" , 0x0041DE }, - { "America/Asuncion" , 0x004244 }, - { "America/Atikokan" , 0x004529 }, - { "America/Atka" , 0x0045FF }, - { "America/Bahia" , 0x004965 }, - { "America/Bahia_Banderas" , 0x004AF8 }, - { "America/Barbados" , 0x004D71 }, - { "America/Belem" , 0x004E0B }, - { "America/Belize" , 0x004F06 }, - { "America/Blanc-Sablon" , 0x005082 }, - { "America/Boa_Vista" , 0x005136 }, - { "America/Bogota" , 0x00523F }, - { "America/Boise" , 0x0052AB }, - { "America/Buenos_Aires" , 0x005642 }, - { "America/Cambridge_Bay" , 0x0057DB }, - { "America/Campo_Grande" , 0x005B03 }, - { "America/Cancun" , 0x005DF2 }, - { "America/Caracas" , 0x006034 }, - { "America/Catamarca" , 0x00609B }, - { "America/Cayenne" , 0x006241 }, - { "America/Cayman" , 0x0062A3 }, - { "America/Chicago" , 0x0062F8 }, - { "America/Chihuahua" , 0x00680F }, - { "America/Coral_Harbour" , 0x006A7A }, - { "America/Cordoba" , 0x006B0C }, - { "America/Costa_Rica" , 0x006CB2 }, - { "America/Creston" , 0x006D3C }, - { "America/Cuiaba" , 0x006DC8 }, - { "America/Curacao" , 0x0070A6 }, - { "America/Danmarkshavn" , 0x00710C }, - { "America/Dawson" , 0x007250 }, - { "America/Dawson_Creek" , 0x00756D }, - { "America/Denver" , 0x007747 }, - { "America/Detroit" , 0x007ACD }, - { "America/Dominica" , 0x007E2C }, - { "America/Edmonton" , 0x007E81 }, - { "America/Eirunepe" , 0x008239 }, - { "America/El_Salvador" , 0x00834C }, - { "America/Ensenada" , 0x0083C1 }, - { "America/Fort_Wayne" , 0x008868 }, - { "America/Fortaleza" , 0x00872A }, - { "America/Glace_Bay" , 0x008AD2 }, - { "America/Godthab" , 0x008E49 }, - { "America/Goose_Bay" , 0x00910D }, - { "America/Grand_Turk" , 0x0095CA }, - { "America/Grenada" , 0x009879 }, - { "America/Guadeloupe" , 0x0098CE }, - { "America/Guatemala" , 0x009923 }, - { "America/Guayaquil" , 0x0099AC }, - { "America/Guyana" , 0x009A09 }, - { "America/Halifax" , 0x009A8A }, - { "America/Havana" , 0x009FA0 }, - { "America/Hermosillo" , 0x00A313 }, - { "America/Indiana/Indianapolis" , 0x00A3F1 }, - { "America/Indiana/Knox" , 0x00A682 }, - { "America/Indiana/Marengo" , 0x00AA19 }, - { "America/Indiana/Petersburg" , 0x00ACBF }, - { "America/Indiana/Tell_City" , 0x00B20C }, - { "America/Indiana/Vevay" , 0x00B4A5 }, - { "America/Indiana/Vincennes" , 0x00B6E0 }, - { "America/Indiana/Winamac" , 0x00B994 }, - { "America/Indianapolis" , 0x00AFA2 }, - { "America/Inuvik" , 0x00BC4D }, - { "America/Iqaluit" , 0x00BF44 }, - { "America/Jamaica" , 0x00C266 }, - { "America/Jujuy" , 0x00C32B }, - { "America/Juneau" , 0x00C4D5 }, - { "America/Kentucky/Louisville" , 0x00C853 }, - { "America/Kentucky/Monticello" , 0x00CC71 }, - { "America/Knox_IN" , 0x00CFF6 }, - { "America/Kralendijk" , 0x00D367 }, - { "America/La_Paz" , 0x00D3CD }, - { "America/Lima" , 0x00D434 }, - { "America/Los_Angeles" , 0x00D4DC }, - { "America/Louisville" , 0x00D8ED }, - { "America/Lower_Princes" , 0x00DCE2 }, - { "America/Maceio" , 0x00DD48 }, - { "America/Managua" , 0x00DE82 }, - { "America/Manaus" , 0x00DF35 }, - { "America/Marigot" , 0x00E037 }, - { "America/Martinique" , 0x00E08C }, - { "America/Matamoros" , 0x00E0F8 }, - { "America/Mazatlan" , 0x00E351 }, - { "America/Mendoza" , 0x00E5BE }, - { "America/Menominee" , 0x00E772 }, - { "America/Merida" , 0x00EAF3 }, - { "America/Metlakatla" , 0x00ED2E }, - { "America/Mexico_City" , 0x00EE68 }, - { "America/Miquelon" , 0x00F0E3 }, - { "America/Moncton" , 0x00F355 }, - { "America/Monterrey" , 0x00F7EC }, - { "America/Montevideo" , 0x00FA4F }, - { "America/Montreal" , 0x00FD61 }, - { "America/Montserrat" , 0x010251 }, - { "America/Nassau" , 0x0102A6 }, - { "America/New_York" , 0x0105EB }, - { "America/Nipigon" , 0x010AF6 }, - { "America/Nome" , 0x010E47 }, - { "America/Noronha" , 0x0111C5 }, - { "America/North_Dakota/Beulah" , 0x0112F5 }, - { "America/North_Dakota/Center" , 0x011689 }, - { "America/North_Dakota/New_Salem" , 0x011A1D }, - { "America/Ojinaga" , 0x011DC6 }, - { "America/Panama" , 0x012027 }, - { "America/Pangnirtung" , 0x01207C }, - { "America/Paramaribo" , 0x0123B2 }, - { "America/Phoenix" , 0x012444 }, - { "America/Port-au-Prince" , 0x012502 }, - { "America/Port_of_Spain" , 0x012821 }, - { "America/Porto_Acre" , 0x012722 }, - { "America/Porto_Velho" , 0x012876 }, - { "America/Puerto_Rico" , 0x01296C }, - { "America/Rainy_River" , 0x0129D7 }, - { "America/Rankin_Inlet" , 0x012D0F }, - { "America/Recife" , 0x012FF5 }, - { "America/Regina" , 0x01311F }, - { "America/Resolute" , 0x0132DD }, - { "America/Rio_Branco" , 0x0135CE }, - { "America/Rosario" , 0x0136D1 }, - { "America/Santa_Isabel" , 0x013877 }, - { "America/Santarem" , 0x013C1A }, - { "America/Santiago" , 0x013D1F }, - { "America/Santo_Domingo" , 0x0140C8 }, - { "America/Sao_Paulo" , 0x01418E }, - { "America/Scoresbysund" , 0x01449D }, - { "America/Shiprock" , 0x01478B }, - { "America/Sitka" , 0x014B04 }, - { "America/St_Barthelemy" , 0x014E8C }, - { "America/St_Johns" , 0x014EE1 }, - { "America/St_Kitts" , 0x015434 }, - { "America/St_Lucia" , 0x015489 }, - { "America/St_Thomas" , 0x0154DE }, - { "America/St_Vincent" , 0x015533 }, - { "America/Swift_Current" , 0x015588 }, - { "America/Tegucigalpa" , 0x0156A9 }, - { "America/Thule" , 0x015728 }, - { "America/Thunder_Bay" , 0x01596F }, - { "America/Tijuana" , 0x015CB8 }, - { "America/Toronto" , 0x016051 }, - { "America/Tortola" , 0x016571 }, - { "America/Vancouver" , 0x0165C6 }, - { "America/Virgin" , 0x016A03 }, - { "America/Whitehorse" , 0x016A58 }, - { "America/Winnipeg" , 0x016D75 }, - { "America/Yakutat" , 0x0171B5 }, - { "America/Yellowknife" , 0x017520 }, - { "Antarctica/Casey" , 0x017830 }, - { "Antarctica/Davis" , 0x0178CD }, - { "Antarctica/DumontDUrville" , 0x01796E }, - { "Antarctica/Macquarie" , 0x017A00 }, - { "Antarctica/Mawson" , 0x017C47 }, - { "Antarctica/McMurdo" , 0x017CC3 }, - { "Antarctica/Palmer" , 0x01806E }, - { "Antarctica/Rothera" , 0x01838A }, - { "Antarctica/South_Pole" , 0x018400 }, - { "Antarctica/Syowa" , 0x01877E }, - { "Antarctica/Vostok" , 0x0187EC }, - { "Arctic/Longyearbyen" , 0x01885D }, - { "Asia/Aden" , 0x018B8F }, - { "Asia/Almaty" , 0x018BE4 }, - { "Asia/Amman" , 0x018D63 }, - { "Asia/Anadyr" , 0x018F35 }, - { "Asia/Aqtau" , 0x01911A }, - { "Asia/Aqtobe" , 0x019319 }, - { "Asia/Ashgabat" , 0x0194D1 }, - { "Asia/Ashkhabad" , 0x0195EE }, - { "Asia/Baghdad" , 0x01970B }, - { "Asia/Bahrain" , 0x019880 }, - { "Asia/Baku" , 0x0198E6 }, - { "Asia/Bangkok" , 0x019BCE }, - { "Asia/Beirut" , 0x019C23 }, - { "Asia/Bishkek" , 0x019F30 }, - { "Asia/Brunei" , 0x01A0DC }, - { "Asia/Calcutta" , 0x01A13E }, - { "Asia/Choibalsan" , 0x01A1B7 }, - { "Asia/Chongqing" , 0x01A330 }, - { "Asia/Chungking" , 0x01A41F }, - { "Asia/Colombo" , 0x01A4CE }, - { "Asia/Dacca" , 0x01A56A }, - { "Asia/Damascus" , 0x01A610 }, - { "Asia/Dhaka" , 0x01A960 }, - { "Asia/Dili" , 0x01AA06 }, - { "Asia/Dubai" , 0x01AA90 }, - { "Asia/Dushanbe" , 0x01AAE5 }, - { "Asia/Gaza" , 0x01ABE8 }, - { "Asia/Harbin" , 0x01AF3B }, - { "Asia/Hebron" , 0x01B022 }, - { "Asia/Ho_Chi_Minh" , 0x01B37E }, - { "Asia/Hong_Kong" , 0x01B3F6 }, - { "Asia/Hovd" , 0x01B5B8 }, - { "Asia/Irkutsk" , 0x01B730 }, - { "Asia/Istanbul" , 0x01B916 }, - { "Asia/Jakarta" , 0x01BD03 }, - { "Asia/Jayapura" , 0x01BDAD }, - { "Asia/Jerusalem" , 0x01BE49 }, - { "Asia/Kabul" , 0x01C178 }, - { "Asia/Kamchatka" , 0x01C1C9 }, - { "Asia/Karachi" , 0x01C3A5 }, - { "Asia/Kashgar" , 0x01C45A }, - { "Asia/Kathmandu" , 0x01C52B }, - { "Asia/Katmandu" , 0x01C591 }, - { "Asia/Khandyga" , 0x01C5F7 }, - { "Asia/Kolkata" , 0x01C81C }, - { "Asia/Krasnoyarsk" , 0x01C895 }, - { "Asia/Kuala_Lumpur" , 0x01CA7D }, - { "Asia/Kuching" , 0x01CB3A }, - { "Asia/Kuwait" , 0x01CC28 }, - { "Asia/Macao" , 0x01CC7D }, - { "Asia/Macau" , 0x01CDB8 }, - { "Asia/Magadan" , 0x01CEF3 }, - { "Asia/Makassar" , 0x01D0D5 }, - { "Asia/Manila" , 0x01D19A }, - { "Asia/Muscat" , 0x01D21F }, - { "Asia/Nicosia" , 0x01D274 }, - { "Asia/Novokuznetsk" , 0x01D55C }, - { "Asia/Novosibirsk" , 0x01D75E }, - { "Asia/Omsk" , 0x01D949 }, - { "Asia/Oral" , 0x01DB30 }, - { "Asia/Phnom_Penh" , 0x01DD00 }, - { "Asia/Pontianak" , 0x01DD78 }, - { "Asia/Pyongyang" , 0x01DE3A }, - { "Asia/Qatar" , 0x01DEA7 }, - { "Asia/Qyzylorda" , 0x01DF0D }, - { "Asia/Rangoon" , 0x01E0E3 }, - { "Asia/Riyadh" , 0x01E15B }, - { "Asia/Saigon" , 0x01E1B0 }, - { "Asia/Sakhalin" , 0x01E228 }, - { "Asia/Samarkand" , 0x01E41F }, - { "Asia/Seoul" , 0x01E555 }, - { "Asia/Shanghai" , 0x01E5F9 }, - { "Asia/Singapore" , 0x01E6D9 }, - { "Asia/Taipei" , 0x01E790 }, - { "Asia/Tashkent" , 0x01E8A8 }, - { "Asia/Tbilisi" , 0x01E9D9 }, - { "Asia/Tehran" , 0x01EB93 }, - { "Asia/Tel_Aviv" , 0x01EE01 }, - { "Asia/Thimbu" , 0x01F130 }, - { "Asia/Thimphu" , 0x01F196 }, - { "Asia/Tokyo" , 0x01F1FC }, - { "Asia/Ujung_Pandang" , 0x01F285 }, - { "Asia/Ulaanbaatar" , 0x01F302 }, - { "Asia/Ulan_Bator" , 0x01F45D }, - { "Asia/Urumqi" , 0x01F5AA }, - { "Asia/Ust-Nera" , 0x01F671 }, - { "Asia/Vientiane" , 0x01F876 }, - { "Asia/Vladivostok" , 0x01F8EE }, - { "Asia/Yakutsk" , 0x01FADA }, - { "Asia/Yekaterinburg" , 0x01FCBF }, - { "Asia/Yerevan" , 0x01FECA }, - { "Atlantic/Azores" , 0x0200CA }, - { "Atlantic/Bermuda" , 0x0205CD }, - { "Atlantic/Canary" , 0x0208AE }, - { "Atlantic/Cape_Verde" , 0x020B84 }, - { "Atlantic/Faeroe" , 0x020BFD }, - { "Atlantic/Faroe" , 0x020EA1 }, - { "Atlantic/Jan_Mayen" , 0x021145 }, - { "Atlantic/Madeira" , 0x021477 }, - { "Atlantic/Reykjavik" , 0x021980 }, - { "Atlantic/South_Georgia" , 0x021B39 }, - { "Atlantic/St_Helena" , 0x021D4B }, - { "Atlantic/Stanley" , 0x021B7D }, - { "Australia/ACT" , 0x021DA0 }, - { "Australia/Adelaide" , 0x0220BD }, - { "Australia/Brisbane" , 0x0223E9 }, - { "Australia/Broken_Hill" , 0x0224B0 }, - { "Australia/Canberra" , 0x0227EE }, - { "Australia/Currie" , 0x022B0B }, - { "Australia/Darwin" , 0x022E3E }, - { "Australia/Eucla" , 0x022EC4 }, - { "Australia/Hobart" , 0x022F99 }, - { "Australia/LHI" , 0x0232F7 }, - { "Australia/Lindeman" , 0x023592 }, - { "Australia/Lord_Howe" , 0x023673 }, - { "Australia/Melbourne" , 0x02391E }, - { "Australia/North" , 0x023C43 }, - { "Australia/NSW" , 0x023CB7 }, - { "Australia/Perth" , 0x023FD4 }, - { "Australia/Queensland" , 0x0240AC }, - { "Australia/South" , 0x024158 }, - { "Australia/Sydney" , 0x024475 }, - { "Australia/Tasmania" , 0x0247B2 }, - { "Australia/Victoria" , 0x024AF7 }, - { "Australia/West" , 0x024E14 }, - { "Australia/Yancowinna" , 0x024ECA }, - { "Brazil/Acre" , 0x0251EC }, - { "Brazil/DeNoronha" , 0x0252EB }, - { "Brazil/East" , 0x02540B }, - { "Brazil/West" , 0x0256E8 }, - { "Canada/Atlantic" , 0x0257E0 }, - { "Canada/Central" , 0x025CC8 }, - { "Canada/East-Saskatchewan" , 0x0265D2 }, - { "Canada/Eastern" , 0x0260E2 }, - { "Canada/Mountain" , 0x02675B }, - { "Canada/Newfoundland" , 0x026AD1 }, - { "Canada/Pacific" , 0x026FFC }, - { "Canada/Saskatchewan" , 0x027415 }, - { "Canada/Yukon" , 0x02759E }, - { "CET" , 0x0278A1 }, - { "Chile/Continental" , 0x027BAA }, - { "Chile/EasterIsland" , 0x027F45 }, - { "CST6CDT" , 0x028287 }, - { "Cuba" , 0x0285D8 }, - { "EET" , 0x02894B }, - { "Egypt" , 0x028BFE }, - { "Eire" , 0x028EC1 }, - { "EST" , 0x0293D2 }, - { "EST5EDT" , 0x029416 }, - { "Etc/GMT" , 0x029767 }, - { "Etc/GMT+0" , 0x029833 }, - { "Etc/GMT+1" , 0x0298BD }, - { "Etc/GMT+10" , 0x02994A }, - { "Etc/GMT+11" , 0x0299D8 }, - { "Etc/GMT+12" , 0x029A66 }, - { "Etc/GMT+2" , 0x029B81 }, - { "Etc/GMT+3" , 0x029C0D }, - { "Etc/GMT+4" , 0x029C99 }, - { "Etc/GMT+5" , 0x029D25 }, - { "Etc/GMT+6" , 0x029DB1 }, - { "Etc/GMT+7" , 0x029E3D }, - { "Etc/GMT+8" , 0x029EC9 }, - { "Etc/GMT+9" , 0x029F55 }, - { "Etc/GMT-0" , 0x0297EF }, - { "Etc/GMT-1" , 0x029877 }, - { "Etc/GMT-10" , 0x029903 }, - { "Etc/GMT-11" , 0x029991 }, - { "Etc/GMT-12" , 0x029A1F }, - { "Etc/GMT-13" , 0x029AAD }, - { "Etc/GMT-14" , 0x029AF4 }, - { "Etc/GMT-2" , 0x029B3B }, - { "Etc/GMT-3" , 0x029BC7 }, - { "Etc/GMT-4" , 0x029C53 }, - { "Etc/GMT-5" , 0x029CDF }, - { "Etc/GMT-6" , 0x029D6B }, - { "Etc/GMT-7" , 0x029DF7 }, - { "Etc/GMT-8" , 0x029E83 }, - { "Etc/GMT-9" , 0x029F0F }, - { "Etc/GMT0" , 0x0297AB }, - { "Etc/Greenwich" , 0x029F9B }, - { "Etc/UCT" , 0x029FDF }, - { "Etc/Universal" , 0x02A023 }, - { "Etc/UTC" , 0x02A067 }, - { "Etc/Zulu" , 0x02A0AB }, - { "Europe/Amsterdam" , 0x02A0EF }, - { "Europe/Andorra" , 0x02A52D }, - { "Europe/Athens" , 0x02A7A9 }, - { "Europe/Belfast" , 0x02AAEC }, - { "Europe/Belgrade" , 0x02B023 }, - { "Europe/Berlin" , 0x02B2EC }, - { "Europe/Bratislava" , 0x02B650 }, - { "Europe/Brussels" , 0x02B982 }, - { "Europe/Bucharest" , 0x02BDB9 }, - { "Europe/Budapest" , 0x02C0E3 }, - { "Europe/Busingen" , 0x02C456 }, - { "Europe/Chisinau" , 0x02C70D }, - { "Europe/Copenhagen" , 0x02CA9B }, - { "Europe/Dublin" , 0x02CDA5 }, - { "Europe/Gibraltar" , 0x02D2B6 }, - { "Europe/Guernsey" , 0x02D70D }, - { "Europe/Helsinki" , 0x02DC44 }, - { "Europe/Isle_of_Man" , 0x02DEFA }, - { "Europe/Istanbul" , 0x02E431 }, - { "Europe/Jersey" , 0x02E81E }, - { "Europe/Kaliningrad" , 0x02ED55 }, - { "Europe/Kiev" , 0x02EFBB }, - { "Europe/Lisbon" , 0x02F2D2 }, - { "Europe/Ljubljana" , 0x02F7D6 }, - { "Europe/London" , 0x02FA9F }, - { "Europe/Luxembourg" , 0x02FFD6 }, - { "Europe/Madrid" , 0x03042C }, - { "Europe/Malta" , 0x0307F2 }, - { "Europe/Mariehamn" , 0x030BAB }, - { "Europe/Minsk" , 0x030E61 }, - { "Europe/Monaco" , 0x03106F }, - { "Europe/Moscow" , 0x0314AA }, - { "Europe/Nicosia" , 0x0316FB }, - { "Europe/Oslo" , 0x0319E3 }, - { "Europe/Paris" , 0x031D15 }, - { "Europe/Podgorica" , 0x03215B }, - { "Europe/Prague" , 0x032424 }, - { "Europe/Riga" , 0x032756 }, - { "Europe/Rome" , 0x032A9B }, - { "Europe/Samara" , 0x032E5E }, - { "Europe/San_Marino" , 0x033091 }, - { "Europe/Sarajevo" , 0x033454 }, - { "Europe/Simferopol" , 0x03371D }, - { "Europe/Skopje" , 0x033A48 }, - { "Europe/Sofia" , 0x033D11 }, - { "Europe/Stockholm" , 0x034019 }, - { "Europe/Tallinn" , 0x0342C8 }, - { "Europe/Tirane" , 0x034602 }, - { "Europe/Tiraspol" , 0x034908 }, - { "Europe/Uzhgorod" , 0x034C96 }, - { "Europe/Vaduz" , 0x034FAD }, - { "Europe/Vatican" , 0x03525C }, - { "Europe/Vienna" , 0x03561F }, - { "Europe/Vilnius" , 0x03594C }, - { "Europe/Volgograd" , 0x035C8B }, - { "Europe/Warsaw" , 0x035E8B }, - { "Europe/Zagreb" , 0x03626C }, - { "Europe/Zaporozhye" , 0x036535 }, - { "Europe/Zurich" , 0x036876 }, - { "Factory" , 0x036B25 }, - { "GB" , 0x036B96 }, - { "GB-Eire" , 0x0370CD }, - { "GMT" , 0x037604 }, - { "GMT+0" , 0x0376D0 }, - { "GMT-0" , 0x03768C }, - { "GMT0" , 0x037648 }, - { "Greenwich" , 0x037714 }, - { "Hongkong" , 0x037758 }, - { "HST" , 0x03791A }, - { "Iceland" , 0x03795E }, - { "Indian/Antananarivo" , 0x037B17 }, - { "Indian/Chagos" , 0x037B8B }, - { "Indian/Christmas" , 0x037BED }, - { "Indian/Cocos" , 0x037C31 }, - { "Indian/Comoro" , 0x037C75 }, - { "Indian/Kerguelen" , 0x037CCA }, - { "Indian/Mahe" , 0x037D1F }, - { "Indian/Maldives" , 0x037D74 }, - { "Indian/Mauritius" , 0x037DC9 }, - { "Indian/Mayotte" , 0x037E3F }, - { "Indian/Reunion" , 0x037E94 }, - { "Iran" , 0x037EE9 }, - { "Israel" , 0x038157 }, - { "Jamaica" , 0x038486 }, - { "Japan" , 0x03854B }, - { "Kwajalein" , 0x0385D4 }, - { "Libya" , 0x038637 }, - { "MET" , 0x038830 }, - { "Mexico/BajaNorte" , 0x038B39 }, - { "Mexico/BajaSur" , 0x038EA2 }, - { "Mexico/General" , 0x0390E7 }, - { "MST" , 0x039345 }, - { "MST7MDT" , 0x039389 }, - { "Navajo" , 0x0396DA }, - { "NZ" , 0x039A53 }, - { "NZ-CHAT" , 0x039DD1 }, - { "Pacific/Apia" , 0x03A0B9 }, - { "Pacific/Auckland" , 0x03A255 }, - { "Pacific/Chatham" , 0x03A5E1 }, - { "Pacific/Chuuk" , 0x03A8D8 }, - { "Pacific/Easter" , 0x03A931 }, - { "Pacific/Efate" , 0x03AC8F }, - { "Pacific/Enderbury" , 0x03AD55 }, - { "Pacific/Fakaofo" , 0x03ADC3 }, - { "Pacific/Fiji" , 0x03AE14 }, - { "Pacific/Funafuti" , 0x03AFA7 }, - { "Pacific/Galapagos" , 0x03AFEB }, - { "Pacific/Gambier" , 0x03B063 }, - { "Pacific/Guadalcanal" , 0x03B0C8 }, - { "Pacific/Guam" , 0x03B11D }, - { "Pacific/Honolulu" , 0x03B173 }, - { "Pacific/Johnston" , 0x03B1EA }, - { "Pacific/Kiritimati" , 0x03B269 }, - { "Pacific/Kosrae" , 0x03B2D4 }, - { "Pacific/Kwajalein" , 0x03B331 }, - { "Pacific/Majuro" , 0x03B39D }, - { "Pacific/Marquesas" , 0x03B3FC }, - { "Pacific/Midway" , 0x03B463 }, - { "Pacific/Nauru" , 0x03B4ED }, - { "Pacific/Niue" , 0x03B565 }, - { "Pacific/Norfolk" , 0x03B5C3 }, - { "Pacific/Noumea" , 0x03B618 }, - { "Pacific/Pago_Pago" , 0x03B6A8 }, - { "Pacific/Palau" , 0x03B731 }, - { "Pacific/Pitcairn" , 0x03B775 }, - { "Pacific/Pohnpei" , 0x03B7CA }, - { "Pacific/Ponape" , 0x03B81F }, - { "Pacific/Port_Moresby" , 0x03B864 }, - { "Pacific/Rarotonga" , 0x03B8A8 }, - { "Pacific/Saipan" , 0x03B984 }, - { "Pacific/Samoa" , 0x03B9E7 }, - { "Pacific/Tahiti" , 0x03BA70 }, - { "Pacific/Tarawa" , 0x03BAD5 }, - { "Pacific/Tongatapu" , 0x03BB29 }, - { "Pacific/Truk" , 0x03BBB5 }, - { "Pacific/Wake" , 0x03BBFA }, - { "Pacific/Wallis" , 0x03BC4A }, - { "Pacific/Yap" , 0x03BC8E }, - { "Poland" , 0x03BCD3 }, - { "Portugal" , 0x03C0B4 }, - { "PRC" , 0x03C5B0 }, - { "PST8PDT" , 0x03C661 }, - { "ROC" , 0x03C9B2 }, - { "ROK" , 0x03CACA }, - { "Singapore" , 0x03CB6E }, - { "Turkey" , 0x03CC25 }, - { "UCT" , 0x03D012 }, - { "Universal" , 0x03D056 }, - { "US/Alaska" , 0x03D09A }, - { "US/Aleutian" , 0x03D403 }, - { "US/Arizona" , 0x03D769 }, - { "US/Central" , 0x03D7F7 }, - { "US/East-Indiana" , 0x03E201 }, - { "US/Eastern" , 0x03DD02 }, - { "US/Hawaii" , 0x03E46B }, - { "US/Indiana-Starke" , 0x03E4DC }, - { "US/Michigan" , 0x03E84D }, - { "US/Mountain" , 0x03EB84 }, - { "US/Pacific" , 0x03EEFD }, - { "US/Pacific-New" , 0x03F302 }, - { "US/Samoa" , 0x03F707 }, - { "UTC" , 0x03F790 }, - { "W-SU" , 0x03FA87 }, - { "WET" , 0x03F7D4 }, - { "Zulu" , 0x03FCC1 }, + { "Africa/Ceuta" , 0x000ADA }, + { "Africa/Conakry" , 0x000DE1 }, + { "Africa/Dakar" , 0x000E4C }, + { "Africa/Dar_es_Salaam" , 0x000EB2 }, + { "Africa/Djibouti" , 0x000F1F }, + { "Africa/Douala" , 0x000F74 }, + { "Africa/El_Aaiun" , 0x000FC9 }, + { "Africa/Freetown" , 0x00102F }, + { "Africa/Gaborone" , 0x00113E }, + { "Africa/Harare" , 0x0011AB }, + { "Africa/Johannesburg" , 0x001200 }, + { "Africa/Juba" , 0x00126E }, + { "Africa/Kampala" , 0x001381 }, + { "Africa/Khartoum" , 0x001400 }, + { "Africa/Kigali" , 0x001513 }, + { "Africa/Kinshasa" , 0x001568 }, + { "Africa/Lagos" , 0x0015C3 }, + { "Africa/Libreville" , 0x001618 }, + { "Africa/Lome" , 0x00166D }, + { "Africa/Luanda" , 0x0016B1 }, + { "Africa/Lubumbashi" , 0x001706 }, + { "Africa/Lusaka" , 0x001761 }, + { "Africa/Malabo" , 0x0017B6 }, + { "Africa/Maputo" , 0x00181C }, + { "Africa/Maseru" , 0x001871 }, + { "Africa/Mbabane" , 0x0018D9 }, + { "Africa/Mogadishu" , 0x00192F }, + { "Africa/Monrovia" , 0x00198A }, + { "Africa/Nairobi" , 0x0019F0 }, + { "Africa/Ndjamena" , 0x001A6F }, + { "Africa/Niamey" , 0x001ADB }, + { "Africa/Nouakchott" , 0x001B4E }, + { "Africa/Ouagadougou" , 0x001BB9 }, + { "Africa/Porto-Novo" , 0x001C0E }, + { "Africa/Sao_Tome" , 0x001C74 }, + { "Africa/Timbuktu" , 0x001CC9 }, + { "Africa/Tripoli" , 0x001D34 }, + { "Africa/Tunis" , 0x001F2D }, + { "Africa/Windhoek" , 0x00203F }, + { "America/Adak" , 0x002286 }, + { "America/Anchorage" , 0x0025FC }, + { "America/Anguilla" , 0x002970 }, + { "America/Antigua" , 0x0029C5 }, + { "America/Araguaina" , 0x002A2B }, + { "America/Argentina/Buenos_Aires" , 0x002B90 }, + { "America/Argentina/Catamarca" , 0x002D3E }, + { "America/Argentina/ComodRivadavia" , 0x002EFF }, + { "America/Argentina/Cordoba" , 0x0030A5 }, + { "America/Argentina/Jujuy" , 0x00327A }, + { "America/Argentina/La_Rioja" , 0x00342E }, + { "America/Argentina/Mendoza" , 0x0035E6 }, + { "America/Argentina/Rio_Gallegos" , 0x0037A6 }, + { "America/Argentina/Salta" , 0x00395B }, + { "America/Argentina/San_Juan" , 0x003B07 }, + { "America/Argentina/San_Luis" , 0x003CBF }, + { "America/Argentina/Tucuman" , 0x003E85 }, + { "America/Argentina/Ushuaia" , 0x004041 }, + { "America/Aruba" , 0x0041FC }, + { "America/Asuncion" , 0x004262 }, + { "America/Atikokan" , 0x004547 }, + { "America/Atka" , 0x00461D }, + { "America/Bahia" , 0x004983 }, + { "America/Bahia_Banderas" , 0x004B16 }, + { "America/Barbados" , 0x004D8F }, + { "America/Belem" , 0x004E29 }, + { "America/Belize" , 0x004F24 }, + { "America/Blanc-Sablon" , 0x0050A0 }, + { "America/Boa_Vista" , 0x005154 }, + { "America/Bogota" , 0x00525D }, + { "America/Boise" , 0x0052C9 }, + { "America/Buenos_Aires" , 0x005660 }, + { "America/Cambridge_Bay" , 0x0057F9 }, + { "America/Campo_Grande" , 0x005B21 }, + { "America/Cancun" , 0x005E10 }, + { "America/Caracas" , 0x006052 }, + { "America/Catamarca" , 0x0060B9 }, + { "America/Cayenne" , 0x00625F }, + { "America/Cayman" , 0x0062C1 }, + { "America/Chicago" , 0x006316 }, + { "America/Chihuahua" , 0x00682D }, + { "America/Coral_Harbour" , 0x006A98 }, + { "America/Cordoba" , 0x006B2A }, + { "America/Costa_Rica" , 0x006CD0 }, + { "America/Creston" , 0x006D5A }, + { "America/Cuiaba" , 0x006DE6 }, + { "America/Curacao" , 0x0070C4 }, + { "America/Danmarkshavn" , 0x00712A }, + { "America/Dawson" , 0x00726E }, + { "America/Dawson_Creek" , 0x00758B }, + { "America/Denver" , 0x007765 }, + { "America/Detroit" , 0x007AEB }, + { "America/Dominica" , 0x007E4A }, + { "America/Edmonton" , 0x007E9F }, + { "America/Eirunepe" , 0x008257 }, + { "America/El_Salvador" , 0x00836A }, + { "America/Ensenada" , 0x0083DF }, + { "America/Fort_Wayne" , 0x008886 }, + { "America/Fortaleza" , 0x008748 }, + { "America/Glace_Bay" , 0x008AF0 }, + { "America/Godthab" , 0x008E67 }, + { "America/Goose_Bay" , 0x00912B }, + { "America/Grand_Turk" , 0x0095E8 }, + { "America/Grenada" , 0x009897 }, + { "America/Guadeloupe" , 0x0098EC }, + { "America/Guatemala" , 0x009941 }, + { "America/Guayaquil" , 0x0099CA }, + { "America/Guyana" , 0x009A27 }, + { "America/Halifax" , 0x009AA8 }, + { "America/Havana" , 0x009FBE }, + { "America/Hermosillo" , 0x00A331 }, + { "America/Indiana/Indianapolis" , 0x00A40F }, + { "America/Indiana/Knox" , 0x00A6A0 }, + { "America/Indiana/Marengo" , 0x00AA37 }, + { "America/Indiana/Petersburg" , 0x00ACDD }, + { "America/Indiana/Tell_City" , 0x00B22A }, + { "America/Indiana/Vevay" , 0x00B4C3 }, + { "America/Indiana/Vincennes" , 0x00B6FE }, + { "America/Indiana/Winamac" , 0x00B9B2 }, + { "America/Indianapolis" , 0x00AFC0 }, + { "America/Inuvik" , 0x00BC6B }, + { "America/Iqaluit" , 0x00BF62 }, + { "America/Jamaica" , 0x00C284 }, + { "America/Jujuy" , 0x00C349 }, + { "America/Juneau" , 0x00C4F3 }, + { "America/Kentucky/Louisville" , 0x00C871 }, + { "America/Kentucky/Monticello" , 0x00CC8F }, + { "America/Knox_IN" , 0x00D014 }, + { "America/Kralendijk" , 0x00D385 }, + { "America/La_Paz" , 0x00D3EB }, + { "America/Lima" , 0x00D452 }, + { "America/Los_Angeles" , 0x00D4FA }, + { "America/Louisville" , 0x00D90B }, + { "America/Lower_Princes" , 0x00DD00 }, + { "America/Maceio" , 0x00DD66 }, + { "America/Managua" , 0x00DEA0 }, + { "America/Manaus" , 0x00DF53 }, + { "America/Marigot" , 0x00E055 }, + { "America/Martinique" , 0x00E0AA }, + { "America/Matamoros" , 0x00E116 }, + { "America/Mazatlan" , 0x00E36F }, + { "America/Mendoza" , 0x00E5DC }, + { "America/Menominee" , 0x00E790 }, + { "America/Merida" , 0x00EB11 }, + { "America/Metlakatla" , 0x00ED4C }, + { "America/Mexico_City" , 0x00EE86 }, + { "America/Miquelon" , 0x00F101 }, + { "America/Moncton" , 0x00F373 }, + { "America/Monterrey" , 0x00F80A }, + { "America/Montevideo" , 0x00FA6D }, + { "America/Montreal" , 0x00FD7F }, + { "America/Montserrat" , 0x01026F }, + { "America/Nassau" , 0x0102C4 }, + { "America/New_York" , 0x010609 }, + { "America/Nipigon" , 0x010B14 }, + { "America/Nome" , 0x010E65 }, + { "America/Noronha" , 0x0111E3 }, + { "America/North_Dakota/Beulah" , 0x011313 }, + { "America/North_Dakota/Center" , 0x0116A7 }, + { "America/North_Dakota/New_Salem" , 0x011A3B }, + { "America/Ojinaga" , 0x011DE4 }, + { "America/Panama" , 0x012045 }, + { "America/Pangnirtung" , 0x01209A }, + { "America/Paramaribo" , 0x0123D0 }, + { "America/Phoenix" , 0x012462 }, + { "America/Port-au-Prince" , 0x012520 }, + { "America/Port_of_Spain" , 0x01283F }, + { "America/Porto_Acre" , 0x012740 }, + { "America/Porto_Velho" , 0x012894 }, + { "America/Puerto_Rico" , 0x01298A }, + { "America/Rainy_River" , 0x0129F5 }, + { "America/Rankin_Inlet" , 0x012D2D }, + { "America/Recife" , 0x013013 }, + { "America/Regina" , 0x01313D }, + { "America/Resolute" , 0x0132FB }, + { "America/Rio_Branco" , 0x0135EC }, + { "America/Rosario" , 0x0136EF }, + { "America/Santa_Isabel" , 0x013895 }, + { "America/Santarem" , 0x013C38 }, + { "America/Santiago" , 0x013D3D }, + { "America/Santo_Domingo" , 0x0140E6 }, + { "America/Sao_Paulo" , 0x0141AC }, + { "America/Scoresbysund" , 0x0144BB }, + { "America/Shiprock" , 0x0147A9 }, + { "America/Sitka" , 0x014B22 }, + { "America/St_Barthelemy" , 0x014EAA }, + { "America/St_Johns" , 0x014EFF }, + { "America/St_Kitts" , 0x015452 }, + { "America/St_Lucia" , 0x0154A7 }, + { "America/St_Thomas" , 0x0154FC }, + { "America/St_Vincent" , 0x015551 }, + { "America/Swift_Current" , 0x0155A6 }, + { "America/Tegucigalpa" , 0x0156C7 }, + { "America/Thule" , 0x015746 }, + { "America/Thunder_Bay" , 0x01598D }, + { "America/Tijuana" , 0x015CD6 }, + { "America/Toronto" , 0x01606F }, + { "America/Tortola" , 0x01658F }, + { "America/Vancouver" , 0x0165E4 }, + { "America/Virgin" , 0x016A21 }, + { "America/Whitehorse" , 0x016A76 }, + { "America/Winnipeg" , 0x016D93 }, + { "America/Yakutat" , 0x0171D3 }, + { "America/Yellowknife" , 0x01753E }, + { "Antarctica/Casey" , 0x01784E }, + { "Antarctica/Davis" , 0x0178EB }, + { "Antarctica/DumontDUrville" , 0x01798C }, + { "Antarctica/Macquarie" , 0x017A1E }, + { "Antarctica/Mawson" , 0x017C65 }, + { "Antarctica/McMurdo" , 0x017CE1 }, + { "Antarctica/Palmer" , 0x01808C }, + { "Antarctica/Rothera" , 0x0183A8 }, + { "Antarctica/South_Pole" , 0x01841E }, + { "Antarctica/Syowa" , 0x01879C }, + { "Antarctica/Vostok" , 0x01880A }, + { "Arctic/Longyearbyen" , 0x01887B }, + { "Asia/Aden" , 0x018BAD }, + { "Asia/Almaty" , 0x018C02 }, + { "Asia/Amman" , 0x018D81 }, + { "Asia/Anadyr" , 0x018F53 }, + { "Asia/Aqtau" , 0x019138 }, + { "Asia/Aqtobe" , 0x019337 }, + { "Asia/Ashgabat" , 0x0194EF }, + { "Asia/Ashkhabad" , 0x01960C }, + { "Asia/Baghdad" , 0x019729 }, + { "Asia/Bahrain" , 0x01989E }, + { "Asia/Baku" , 0x019904 }, + { "Asia/Bangkok" , 0x019BEC }, + { "Asia/Beirut" , 0x019C41 }, + { "Asia/Bishkek" , 0x019F4E }, + { "Asia/Brunei" , 0x01A0FA }, + { "Asia/Calcutta" , 0x01A15C }, + { "Asia/Choibalsan" , 0x01A1D5 }, + { "Asia/Chongqing" , 0x01A34E }, + { "Asia/Chungking" , 0x01A43D }, + { "Asia/Colombo" , 0x01A4EC }, + { "Asia/Dacca" , 0x01A588 }, + { "Asia/Damascus" , 0x01A62E }, + { "Asia/Dhaka" , 0x01A97E }, + { "Asia/Dili" , 0x01AA24 }, + { "Asia/Dubai" , 0x01AAAE }, + { "Asia/Dushanbe" , 0x01AB03 }, + { "Asia/Gaza" , 0x01AC06 }, + { "Asia/Harbin" , 0x01AF59 }, + { "Asia/Hebron" , 0x01B040 }, + { "Asia/Ho_Chi_Minh" , 0x01B39C }, + { "Asia/Hong_Kong" , 0x01B414 }, + { "Asia/Hovd" , 0x01B5D6 }, + { "Asia/Irkutsk" , 0x01B74E }, + { "Asia/Istanbul" , 0x01B934 }, + { "Asia/Jakarta" , 0x01BD21 }, + { "Asia/Jayapura" , 0x01BDCB }, + { "Asia/Jerusalem" , 0x01BE67 }, + { "Asia/Kabul" , 0x01C196 }, + { "Asia/Kamchatka" , 0x01C1E7 }, + { "Asia/Karachi" , 0x01C3C3 }, + { "Asia/Kashgar" , 0x01C478 }, + { "Asia/Kathmandu" , 0x01C549 }, + { "Asia/Katmandu" , 0x01C5AF }, + { "Asia/Khandyga" , 0x01C615 }, + { "Asia/Kolkata" , 0x01C83A }, + { "Asia/Krasnoyarsk" , 0x01C8B3 }, + { "Asia/Kuala_Lumpur" , 0x01CA9B }, + { "Asia/Kuching" , 0x01CB58 }, + { "Asia/Kuwait" , 0x01CC46 }, + { "Asia/Macao" , 0x01CC9B }, + { "Asia/Macau" , 0x01CDD6 }, + { "Asia/Magadan" , 0x01CF11 }, + { "Asia/Makassar" , 0x01D0F3 }, + { "Asia/Manila" , 0x01D1B8 }, + { "Asia/Muscat" , 0x01D23D }, + { "Asia/Nicosia" , 0x01D292 }, + { "Asia/Novokuznetsk" , 0x01D57A }, + { "Asia/Novosibirsk" , 0x01D77C }, + { "Asia/Omsk" , 0x01D967 }, + { "Asia/Oral" , 0x01DB4E }, + { "Asia/Phnom_Penh" , 0x01DD1E }, + { "Asia/Pontianak" , 0x01DD96 }, + { "Asia/Pyongyang" , 0x01DE58 }, + { "Asia/Qatar" , 0x01DEC5 }, + { "Asia/Qyzylorda" , 0x01DF2B }, + { "Asia/Rangoon" , 0x01E101 }, + { "Asia/Riyadh" , 0x01E179 }, + { "Asia/Saigon" , 0x01E1CE }, + { "Asia/Sakhalin" , 0x01E246 }, + { "Asia/Samarkand" , 0x01E43D }, + { "Asia/Seoul" , 0x01E573 }, + { "Asia/Shanghai" , 0x01E617 }, + { "Asia/Singapore" , 0x01E6F7 }, + { "Asia/Taipei" , 0x01E7AE }, + { "Asia/Tashkent" , 0x01E8C6 }, + { "Asia/Tbilisi" , 0x01E9F7 }, + { "Asia/Tehran" , 0x01EBB1 }, + { "Asia/Tel_Aviv" , 0x01EE1F }, + { "Asia/Thimbu" , 0x01F14E }, + { "Asia/Thimphu" , 0x01F1B4 }, + { "Asia/Tokyo" , 0x01F21A }, + { "Asia/Ujung_Pandang" , 0x01F2A3 }, + { "Asia/Ulaanbaatar" , 0x01F320 }, + { "Asia/Ulan_Bator" , 0x01F47B }, + { "Asia/Urumqi" , 0x01F5C8 }, + { "Asia/Ust-Nera" , 0x01F68F }, + { "Asia/Vientiane" , 0x01F894 }, + { "Asia/Vladivostok" , 0x01F90C }, + { "Asia/Yakutsk" , 0x01FAF8 }, + { "Asia/Yekaterinburg" , 0x01FCDD }, + { "Asia/Yerevan" , 0x01FEE8 }, + { "Atlantic/Azores" , 0x0200E8 }, + { "Atlantic/Bermuda" , 0x0205EB }, + { "Atlantic/Canary" , 0x0208CC }, + { "Atlantic/Cape_Verde" , 0x020BA2 }, + { "Atlantic/Faeroe" , 0x020C1B }, + { "Atlantic/Faroe" , 0x020EBF }, + { "Atlantic/Jan_Mayen" , 0x021163 }, + { "Atlantic/Madeira" , 0x021495 }, + { "Atlantic/Reykjavik" , 0x02199E }, + { "Atlantic/South_Georgia" , 0x021B57 }, + { "Atlantic/St_Helena" , 0x021D69 }, + { "Atlantic/Stanley" , 0x021B9B }, + { "Australia/ACT" , 0x021DBE }, + { "Australia/Adelaide" , 0x0220DB }, + { "Australia/Brisbane" , 0x022407 }, + { "Australia/Broken_Hill" , 0x0224CE }, + { "Australia/Canberra" , 0x02280C }, + { "Australia/Currie" , 0x022B29 }, + { "Australia/Darwin" , 0x022E5C }, + { "Australia/Eucla" , 0x022EE2 }, + { "Australia/Hobart" , 0x022FB7 }, + { "Australia/LHI" , 0x023315 }, + { "Australia/Lindeman" , 0x0235B0 }, + { "Australia/Lord_Howe" , 0x023691 }, + { "Australia/Melbourne" , 0x02393C }, + { "Australia/North" , 0x023C61 }, + { "Australia/NSW" , 0x023CD5 }, + { "Australia/Perth" , 0x023FF2 }, + { "Australia/Queensland" , 0x0240CA }, + { "Australia/South" , 0x024176 }, + { "Australia/Sydney" , 0x024493 }, + { "Australia/Tasmania" , 0x0247D0 }, + { "Australia/Victoria" , 0x024B15 }, + { "Australia/West" , 0x024E32 }, + { "Australia/Yancowinna" , 0x024EE8 }, + { "Brazil/Acre" , 0x02520A }, + { "Brazil/DeNoronha" , 0x025309 }, + { "Brazil/East" , 0x025429 }, + { "Brazil/West" , 0x025706 }, + { "Canada/Atlantic" , 0x0257FE }, + { "Canada/Central" , 0x025CE6 }, + { "Canada/East-Saskatchewan" , 0x0265F0 }, + { "Canada/Eastern" , 0x026100 }, + { "Canada/Mountain" , 0x026779 }, + { "Canada/Newfoundland" , 0x026AEF }, + { "Canada/Pacific" , 0x02701A }, + { "Canada/Saskatchewan" , 0x027433 }, + { "Canada/Yukon" , 0x0275BC }, + { "CET" , 0x0278BF }, + { "Chile/Continental" , 0x027BC8 }, + { "Chile/EasterIsland" , 0x027F63 }, + { "CST6CDT" , 0x0282A5 }, + { "Cuba" , 0x0285F6 }, + { "EET" , 0x028969 }, + { "Egypt" , 0x028C1C }, + { "Eire" , 0x028EDF }, + { "EST" , 0x0293F0 }, + { "EST5EDT" , 0x029434 }, + { "Etc/GMT" , 0x029785 }, + { "Etc/GMT+0" , 0x029851 }, + { "Etc/GMT+1" , 0x0298DB }, + { "Etc/GMT+10" , 0x029968 }, + { "Etc/GMT+11" , 0x0299F6 }, + { "Etc/GMT+12" , 0x029A84 }, + { "Etc/GMT+2" , 0x029B9F }, + { "Etc/GMT+3" , 0x029C2B }, + { "Etc/GMT+4" , 0x029CB7 }, + { "Etc/GMT+5" , 0x029D43 }, + { "Etc/GMT+6" , 0x029DCF }, + { "Etc/GMT+7" , 0x029E5B }, + { "Etc/GMT+8" , 0x029EE7 }, + { "Etc/GMT+9" , 0x029F73 }, + { "Etc/GMT-0" , 0x02980D }, + { "Etc/GMT-1" , 0x029895 }, + { "Etc/GMT-10" , 0x029921 }, + { "Etc/GMT-11" , 0x0299AF }, + { "Etc/GMT-12" , 0x029A3D }, + { "Etc/GMT-13" , 0x029ACB }, + { "Etc/GMT-14" , 0x029B12 }, + { "Etc/GMT-2" , 0x029B59 }, + { "Etc/GMT-3" , 0x029BE5 }, + { "Etc/GMT-4" , 0x029C71 }, + { "Etc/GMT-5" , 0x029CFD }, + { "Etc/GMT-6" , 0x029D89 }, + { "Etc/GMT-7" , 0x029E15 }, + { "Etc/GMT-8" , 0x029EA1 }, + { "Etc/GMT-9" , 0x029F2D }, + { "Etc/GMT0" , 0x0297C9 }, + { "Etc/Greenwich" , 0x029FB9 }, + { "Etc/UCT" , 0x029FFD }, + { "Etc/Universal" , 0x02A041 }, + { "Etc/UTC" , 0x02A085 }, + { "Etc/Zulu" , 0x02A0C9 }, + { "Europe/Amsterdam" , 0x02A10D }, + { "Europe/Andorra" , 0x02A54B }, + { "Europe/Athens" , 0x02A7C7 }, + { "Europe/Belfast" , 0x02AB0A }, + { "Europe/Belgrade" , 0x02B041 }, + { "Europe/Berlin" , 0x02B30A }, + { "Europe/Bratislava" , 0x02B66E }, + { "Europe/Brussels" , 0x02B9A0 }, + { "Europe/Bucharest" , 0x02BDD7 }, + { "Europe/Budapest" , 0x02C101 }, + { "Europe/Busingen" , 0x02C474 }, + { "Europe/Chisinau" , 0x02C72B }, + { "Europe/Copenhagen" , 0x02CAB9 }, + { "Europe/Dublin" , 0x02CDC3 }, + { "Europe/Gibraltar" , 0x02D2D4 }, + { "Europe/Guernsey" , 0x02D72B }, + { "Europe/Helsinki" , 0x02DC62 }, + { "Europe/Isle_of_Man" , 0x02DF18 }, + { "Europe/Istanbul" , 0x02E44F }, + { "Europe/Jersey" , 0x02E83C }, + { "Europe/Kaliningrad" , 0x02ED73 }, + { "Europe/Kiev" , 0x02EFD9 }, + { "Europe/Lisbon" , 0x02F2F0 }, + { "Europe/Ljubljana" , 0x02F7F4 }, + { "Europe/London" , 0x02FABD }, + { "Europe/Luxembourg" , 0x02FFF4 }, + { "Europe/Madrid" , 0x03044A }, + { "Europe/Malta" , 0x030810 }, + { "Europe/Mariehamn" , 0x030BC9 }, + { "Europe/Minsk" , 0x030E7F }, + { "Europe/Monaco" , 0x03108D }, + { "Europe/Moscow" , 0x0314C8 }, + { "Europe/Nicosia" , 0x031719 }, + { "Europe/Oslo" , 0x031A01 }, + { "Europe/Paris" , 0x031D33 }, + { "Europe/Podgorica" , 0x032179 }, + { "Europe/Prague" , 0x032442 }, + { "Europe/Riga" , 0x032774 }, + { "Europe/Rome" , 0x032AB9 }, + { "Europe/Samara" , 0x032E7C }, + { "Europe/San_Marino" , 0x0330AF }, + { "Europe/Sarajevo" , 0x033472 }, + { "Europe/Simferopol" , 0x03373B }, + { "Europe/Skopje" , 0x033A66 }, + { "Europe/Sofia" , 0x033D2F }, + { "Europe/Stockholm" , 0x034037 }, + { "Europe/Tallinn" , 0x0342E6 }, + { "Europe/Tirane" , 0x034620 }, + { "Europe/Tiraspol" , 0x034926 }, + { "Europe/Uzhgorod" , 0x034CB4 }, + { "Europe/Vaduz" , 0x034FCB }, + { "Europe/Vatican" , 0x03527A }, + { "Europe/Vienna" , 0x03563D }, + { "Europe/Vilnius" , 0x03596A }, + { "Europe/Volgograd" , 0x035CA9 }, + { "Europe/Warsaw" , 0x035EA9 }, + { "Europe/Zagreb" , 0x03628A }, + { "Europe/Zaporozhye" , 0x036553 }, + { "Europe/Zurich" , 0x036894 }, + { "Factory" , 0x036B43 }, + { "GB" , 0x036BB4 }, + { "GB-Eire" , 0x0370EB }, + { "GMT" , 0x037622 }, + { "GMT+0" , 0x0376EE }, + { "GMT-0" , 0x0376AA }, + { "GMT0" , 0x037666 }, + { "Greenwich" , 0x037732 }, + { "Hongkong" , 0x037776 }, + { "HST" , 0x037938 }, + { "Iceland" , 0x03797C }, + { "Indian/Antananarivo" , 0x037B35 }, + { "Indian/Chagos" , 0x037BA9 }, + { "Indian/Christmas" , 0x037C0B }, + { "Indian/Cocos" , 0x037C4F }, + { "Indian/Comoro" , 0x037C93 }, + { "Indian/Kerguelen" , 0x037CE8 }, + { "Indian/Mahe" , 0x037D3D }, + { "Indian/Maldives" , 0x037D92 }, + { "Indian/Mauritius" , 0x037DE7 }, + { "Indian/Mayotte" , 0x037E5D }, + { "Indian/Reunion" , 0x037EB2 }, + { "Iran" , 0x037F07 }, + { "Israel" , 0x038175 }, + { "Jamaica" , 0x0384A4 }, + { "Japan" , 0x038569 }, + { "Kwajalein" , 0x0385F2 }, + { "Libya" , 0x038655 }, + { "MET" , 0x03884E }, + { "Mexico/BajaNorte" , 0x038B57 }, + { "Mexico/BajaSur" , 0x038EC0 }, + { "Mexico/General" , 0x039105 }, + { "MST" , 0x039363 }, + { "MST7MDT" , 0x0393A7 }, + { "Navajo" , 0x0396F8 }, + { "NZ" , 0x039A71 }, + { "NZ-CHAT" , 0x039DEF }, + { "Pacific/Apia" , 0x03A0D7 }, + { "Pacific/Auckland" , 0x03A273 }, + { "Pacific/Chatham" , 0x03A5FF }, + { "Pacific/Chuuk" , 0x03A8F6 }, + { "Pacific/Easter" , 0x03A94F }, + { "Pacific/Efate" , 0x03ACAD }, + { "Pacific/Enderbury" , 0x03AD73 }, + { "Pacific/Fakaofo" , 0x03ADE1 }, + { "Pacific/Fiji" , 0x03AE32 }, + { "Pacific/Funafuti" , 0x03AFC5 }, + { "Pacific/Galapagos" , 0x03B009 }, + { "Pacific/Gambier" , 0x03B081 }, + { "Pacific/Guadalcanal" , 0x03B0E6 }, + { "Pacific/Guam" , 0x03B13B }, + { "Pacific/Honolulu" , 0x03B191 }, + { "Pacific/Johnston" , 0x03B208 }, + { "Pacific/Kiritimati" , 0x03B287 }, + { "Pacific/Kosrae" , 0x03B2F2 }, + { "Pacific/Kwajalein" , 0x03B34F }, + { "Pacific/Majuro" , 0x03B3BB }, + { "Pacific/Marquesas" , 0x03B41A }, + { "Pacific/Midway" , 0x03B481 }, + { "Pacific/Nauru" , 0x03B50B }, + { "Pacific/Niue" , 0x03B583 }, + { "Pacific/Norfolk" , 0x03B5E1 }, + { "Pacific/Noumea" , 0x03B636 }, + { "Pacific/Pago_Pago" , 0x03B6C6 }, + { "Pacific/Palau" , 0x03B74F }, + { "Pacific/Pitcairn" , 0x03B793 }, + { "Pacific/Pohnpei" , 0x03B7E8 }, + { "Pacific/Ponape" , 0x03B83D }, + { "Pacific/Port_Moresby" , 0x03B882 }, + { "Pacific/Rarotonga" , 0x03B8C6 }, + { "Pacific/Saipan" , 0x03B9A2 }, + { "Pacific/Samoa" , 0x03BA05 }, + { "Pacific/Tahiti" , 0x03BA8E }, + { "Pacific/Tarawa" , 0x03BAF3 }, + { "Pacific/Tongatapu" , 0x03BB47 }, + { "Pacific/Truk" , 0x03BBD3 }, + { "Pacific/Wake" , 0x03BC18 }, + { "Pacific/Wallis" , 0x03BC68 }, + { "Pacific/Yap" , 0x03BCAC }, + { "Poland" , 0x03BCF1 }, + { "Portugal" , 0x03C0D2 }, + { "PRC" , 0x03C5CE }, + { "PST8PDT" , 0x03C67F }, + { "ROC" , 0x03C9D0 }, + { "ROK" , 0x03CAE8 }, + { "Singapore" , 0x03CB8C }, + { "Turkey" , 0x03CC43 }, + { "UCT" , 0x03D030 }, + { "Universal" , 0x03D074 }, + { "US/Alaska" , 0x03D0B8 }, + { "US/Aleutian" , 0x03D421 }, + { "US/Arizona" , 0x03D787 }, + { "US/Central" , 0x03D815 }, + { "US/East-Indiana" , 0x03E21F }, + { "US/Eastern" , 0x03DD20 }, + { "US/Hawaii" , 0x03E489 }, + { "US/Indiana-Starke" , 0x03E4FA }, + { "US/Michigan" , 0x03E86B }, + { "US/Mountain" , 0x03EBA2 }, + { "US/Pacific" , 0x03EF1B }, + { "US/Pacific-New" , 0x03F320 }, + { "US/Samoa" , 0x03F725 }, + { "UTC" , 0x03F7AE }, + { "W-SU" , 0x03FAA5 }, + { "WET" , 0x03F7F2 }, + { "Zulu" , 0x03FCDF }, }; /* This is a generated file, do not modify */ -const unsigned char timelib_timezone_db_data_builtin[261381] = { +const unsigned char timelib_timezone_db_data_builtin[261411] = { /* Africa/Abidjan */ @@ -758,7 +758,7 @@ const unsigned char timelib_timezone_db_data_builtin[261381] = { /* Africa/Casablanca */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4D, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x96, 0x51, 0xF9, 0x9C, +0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x96, 0x51, 0xF9, 0x9C, 0xC6, 0xFF, 0x14, 0x80, 0xC7, 0x58, 0xAC, 0x70, 0xC7, 0xD9, 0xED, 0x80, 0xD2, 0xA1, 0x32, 0xF0, 0xDB, 0x35, 0xA4, 0x00, 0xDB, 0xEE, 0x27, 0xF0, 0xFB, 0x25, 0x72, 0x40, 0xFB, 0xC2, 0xEF, 0x70, 0x08, 0x6B, 0x84, 0x80, 0x08, 0xC6, 0x6D, 0xF0, 0x0B, 0xE8, 0x0C, 0x00, 0x0C, 0x61, 0x47, 0xF0, @@ -767,32 +767,34 @@ const unsigned char timelib_timezone_db_data_builtin[261381] = { 0x4A, 0x23, 0x1A, 0x00, 0x4A, 0x8D, 0xD5, 0x70, 0x4B, 0xDC, 0xC0, 0x80, 0x4C, 0x5D, 0xE5, 0x70, 0x4D, 0x97, 0xB8, 0x80, 0x4E, 0x34, 0x8C, 0xF0, 0x4F, 0x9C, 0xA0, 0xA0, 0x50, 0x08, 0xBB, 0xA0, 0x50, 0x31, 0x9A, 0x20, 0x50, 0x67, 0xA7, 0xA0, 0x51, 0x7C, 0x82, 0xA0, 0x51, 0xD8, 0xCB, 0xA0, -0x52, 0x05, 0x9E, 0xA0, 0x52, 0x47, 0x89, 0xA0, 0x53, 0x5C, 0x64, 0xA0, 0x53, 0xAF, 0x73, 0x20, -0x53, 0xD7, 0x00, 0x20, 0x54, 0x27, 0x6B, 0xA0, 0x55, 0x3C, 0x46, 0xA0, 0x55, 0x82, 0x26, 0x20, -0x55, 0xA9, 0xB3, 0x20, 0x56, 0x07, 0x4D, 0xA0, 0x57, 0x1C, 0x28, 0xA0, 0x57, 0x56, 0x2A, 0xA0, -0x57, 0x7D, 0xB7, 0xA0, 0x57, 0xE7, 0x2F, 0xA0, 0x59, 0x05, 0x45, 0x20, 0x59, 0x28, 0xDD, 0xA0, -0x59, 0x50, 0x6A, 0xA0, 0x59, 0xC7, 0x11, 0xA0, 0x5A, 0xE5, 0x27, 0x20, 0x5A, 0xFB, 0x90, 0xA0, -0x5B, 0x23, 0x1D, 0xA0, 0x5B, 0xB0, 0x2E, 0x20, 0x5C, 0xC5, 0x09, 0x20, 0x5C, 0xCF, 0x95, 0x20, -0x5C, 0xF7, 0x22, 0x20, 0x5D, 0x90, 0x10, 0x20, 0x5E, 0xC9, 0xD5, 0x20, 0x5F, 0x6F, 0xF2, 0x20, -0x60, 0x9C, 0x88, 0x20, 0x61, 0x4F, 0xD4, 0x20, 0x62, 0x70, 0x8C, 0xA0, 0x63, 0x2F, 0xB6, 0x20, -0x64, 0x4D, 0xCB, 0xA0, 0x65, 0x0F, 0x98, 0x20, 0x66, 0x2D, 0xAD, 0xA0, 0x66, 0xF8, 0xB4, 0xA0, -0x68, 0x0D, 0x8F, 0xA0, 0x68, 0xD8, 0x96, 0xA0, 0x69, 0xED, 0x71, 0xA0, 0x6A, 0xB8, 0x78, 0xA0, -0x6B, 0xCD, 0x53, 0xA0, 0x6C, 0x98, 0x5A, 0xA0, 0x6D, 0xB6, 0x70, 0x20, 0x6E, 0x78, 0x3C, 0xA0, -0x6F, 0x96, 0x52, 0x20, 0x70, 0x61, 0x59, 0x20, 0x71, 0x76, 0x34, 0x20, 0x72, 0x41, 0x3B, 0x20, -0x73, 0x56, 0x16, 0x20, 0x74, 0x21, 0x1D, 0x20, 0x75, 0x35, 0xF8, 0x20, 0x76, 0x00, 0xFF, 0x20, -0x77, 0x15, 0xDA, 0x20, 0x77, 0xE0, 0xE1, 0x20, 0x78, 0xFE, 0xF6, 0xA0, 0x79, 0xC0, 0xC3, 0x20, -0x7A, 0xDE, 0xD8, 0xA0, 0x7B, 0xA9, 0xDF, 0xA0, 0x7C, 0xBE, 0xBA, 0xA0, 0x7D, 0x89, 0xC1, 0xA0, -0x7E, 0x9E, 0x9C, 0xA0, 0x7F, 0x69, 0xA3, 0xA0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x52, 0x05, 0x9E, 0xA0, 0x52, 0x6C, 0x73, 0xA0, 0x53, 0x37, 0x7A, 0xA0, 0x53, 0xAF, 0x73, 0x20, +0x53, 0xD7, 0x00, 0x20, 0x54, 0x4C, 0x55, 0xA0, 0x55, 0x17, 0x5C, 0xA0, 0x55, 0x82, 0x26, 0x20, +0x55, 0xA9, 0xB3, 0x20, 0x56, 0x2C, 0x37, 0xA0, 0x56, 0xF7, 0x3E, 0xA0, 0x57, 0x56, 0x2A, 0xA0, +0x57, 0x7D, 0xB7, 0xA0, 0x58, 0x15, 0x54, 0x20, 0x58, 0xD7, 0x20, 0xA0, 0x59, 0x28, 0xDD, 0xA0, +0x59, 0x50, 0x6A, 0xA0, 0x59, 0xF5, 0x36, 0x20, 0x5A, 0xB7, 0x02, 0xA0, 0x5A, 0xFB, 0x90, 0xA0, +0x5B, 0x23, 0x1D, 0xA0, 0x5B, 0xD5, 0x18, 0x20, 0x5C, 0xA0, 0x1F, 0x20, 0x5C, 0xCF, 0x95, 0x20, +0x5C, 0xF7, 0x22, 0x20, 0x5D, 0xB4, 0xFA, 0x20, 0x5E, 0x80, 0x01, 0x20, 0x5E, 0xA2, 0x48, 0x20, +0x5E, 0xC9, 0xD5, 0x20, 0x5F, 0x94, 0xDC, 0x20, 0x60, 0x5F, 0xE3, 0x20, 0x60, 0x74, 0xFB, 0x20, +0x60, 0x9C, 0x88, 0x20, 0x61, 0x7D, 0xF8, 0xA0, 0x62, 0x3F, 0xC5, 0x20, 0x62, 0x48, 0xFF, 0xA0, +0x62, 0x70, 0x8C, 0xA0, 0x63, 0x5D, 0xDA, 0xA0, 0x64, 0x43, 0x3F, 0xA0, 0x65, 0x3D, 0xBC, 0xA0, +0x66, 0x15, 0xF2, 0xA0, 0x67, 0x1D, 0x9E, 0xA0, 0x67, 0xE9, 0xF7, 0x20, 0x68, 0xFD, 0x80, 0xA0, +0x69, 0xC8, 0x87, 0xA0, 0x6A, 0xDD, 0x62, 0xA0, 0x6B, 0xA8, 0x69, 0xA0, 0x6C, 0xC6, 0x7F, 0x20, +0x6D, 0x88, 0x4B, 0xA0, 0x6E, 0xA6, 0x61, 0x20, 0x6F, 0x68, 0x2D, 0xA0, 0x70, 0x86, 0x43, 0x20, +0x71, 0x51, 0x4A, 0x20, 0x72, 0x66, 0x25, 0x20, 0x73, 0x31, 0x2C, 0x20, 0x74, 0x46, 0x07, 0x20, +0x75, 0x11, 0x0E, 0x20, 0x76, 0x2F, 0x23, 0xA0, 0x76, 0xF0, 0xF0, 0x20, 0x78, 0x0F, 0x05, 0xA0, +0x78, 0xD0, 0xD2, 0x20, 0x79, 0xEE, 0xE7, 0xA0, 0x7A, 0xB0, 0xB4, 0x20, 0x7B, 0xCE, 0xC9, 0xA0, +0x7C, 0x99, 0xD0, 0xA0, 0x7D, 0xA8, 0x14, 0x20, 0x7E, 0x79, 0xB2, 0xA0, 0x7F, 0x7C, 0x18, 0xA0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x03, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xF8, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x0E, -0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x0D, 0x4C, -0x4D, 0x54, 0x00, 0x57, 0x45, 0x53, 0x54, 0x00, 0x57, 0x45, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBC, 0xAC, 0xC8, 0x01, 0x07, 0x16, 0x42, -0x00, 0x00, 0x00, 0x00, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xF8, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x01, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x0D, 0x4C, 0x4D, 0x54, +0x00, 0x57, 0x45, 0x53, 0x54, 0x00, 0x57, 0x45, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBC, 0xAC, 0xC8, 0x01, 0x07, 0x16, 0x42, 0x00, 0x00, +0x00, 0x00, /* Africa/Ceuta */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x45, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -18400,4 +18402,4 @@ const unsigned char timelib_timezone_db_data_builtin[261381] = { 0x00, 0x00, 0x55, 0x54, 0x43, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, }; -const timelib_tzdb timezonedb_builtin = { "2013.6", 579, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; +const timelib_tzdb timezonedb_builtin = { "2013.7", 579, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; From dfe4b15b8e8932ce3c49b670ca2e59e70ebc0055 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 24 Oct 2013 10:36:44 +0200 Subject: [PATCH 331/400] ldap_escape() notes --- UPGRADING | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/UPGRADING b/UPGRADING index b19c3dd5410e5..d2133338a3486 100755 --- a/UPGRADING +++ b/UPGRADING @@ -79,6 +79,9 @@ PHP X.Y UPGRADE NOTES - Openssl: Added string openssl_x509_fingerprint($x509, $type, $binary). +- LDAP: + Added ldap_escape($value, $ignore = "", $flags = 0). + ======================================== 6. New Classes and Interfaces ======================================== @@ -113,6 +116,9 @@ PHP X.Y UPGRADE NOTES 9. New Global Constants ======================================== +- LDAP: + LDAP_ESCAPE_FILTER int(1) + LDAP_ESCAPE_DN int(2) ======================================== 10. Changes to INI File Handling From 08f6a76b925cbd74a594ea4fd55e1e2de8ed0a44 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Thu, 24 Oct 2013 05:12:37 -0700 Subject: [PATCH 332/400] moved to do_alloca() usage where appropriate --- Zend/zend_virtual_cwd.c | 58 ++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c index f94227f99d9a7..48aff01bd4ae9 100644 --- a/Zend/zend_virtual_cwd.c +++ b/Zend/zend_virtual_cwd.c @@ -225,6 +225,7 @@ CWD_API int php_sys_readlink(const char *link, char *target, size_t target_len){ HINSTANCE kernel32; HANDLE hFile; DWORD dwRet; + ALLOCA_FLAG(use_heap) typedef BOOL (WINAPI *gfpnh_func)(HANDLE, LPTSTR, DWORD, DWORD); gfpnh_func pGetFinalPathNameByHandle; @@ -345,9 +346,9 @@ CWD_API int php_sys_stat_ex(const char *path, struct stat *buf, int lstat) /* {{ return -1; } - pbuffer = (REPARSE_DATA_BUFFER *)emalloc(MAXIMUM_REPARSE_DATA_BUFFER_SIZE); + pbuffer = (REPARSE_DATA_BUFFER *)do_alloca(MAXIMUM_REPARSE_DATA_BUFFER_SIZE, use_heap); if(!DeviceIoControl(hLink, FSCTL_GET_REPARSE_POINT, NULL, 0, pbuffer, MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &retlength, NULL)) { - efree(pbuffer); + free_alloca(pbuffer, use_heap_large); CloseHandle(hLink); return -1; } @@ -364,7 +365,7 @@ CWD_API int php_sys_stat_ex(const char *path, struct stat *buf, int lstat) /* {{ buf->st_mode |=; } #endif - efree(pbuffer); + free_alloca(pbuffer); } else { buf->st_mode = (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? (S_IFDIR|S_IEXEC|(S_IEXEC>>3)|(S_IEXEC>>6)) : S_IFREG; buf->st_mode |= (data.dwFileAttributes & FILE_ATTRIBUTE_READONLY) ? (S_IREAD|(S_IREAD>>3)|(S_IREAD>>6)) : (S_IREAD|(S_IREAD>>3)|(S_IREAD>>6)|S_IWRITE|(S_IWRITE>>3)|(S_IWRITE>>6)); @@ -774,11 +775,13 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i #ifdef TSRM_WIN32 WIN32_FIND_DATA data; HANDLE hFind; + ALLOCA_FLAG(use_heap_large) #else struct stat st; #endif realpath_cache_bucket *bucket; char *tmp; + ALLOCA_FLAG(use_heap) while (1) { if (len <= start) { @@ -878,7 +881,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i FindClose(hFind); } - tmp = emalloc(len+1); + tmp = do_alloca(len+1, use_heap); memcpy(tmp, path, len+1); if(save && @@ -905,12 +908,12 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i return -1; } - pbuffer = (REPARSE_DATA_BUFFER *)emalloc(MAXIMUM_REPARSE_DATA_BUFFER_SIZE); + pbuffer = (REPARSE_DATA_BUFFER *)do_alloca(MAXIMUM_REPARSE_DATA_BUFFER_SIZE, use_heap_large); if (pbuffer == NULL) { return -1; } if(!DeviceIoControl(hLink, FSCTL_GET_REPARSE_POINT, NULL, 0, pbuffer, MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &retlength, NULL)) { - efree(pbuffer); + free_alloca(pbuffer, use_heap_large); CloseHandle(hLink); return -1; } @@ -926,7 +929,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i printname_len + 1, printname, MAX_PATH, NULL, NULL )) { - efree(pbuffer); + free_alloca(pbuffer, use_heap_large); return -1; }; printname_len = pbuffer->MountPointReparseBuffer.PrintNameLength / sizeof(WCHAR); @@ -938,7 +941,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i substitutename_len + 1, substitutename, MAX_PATH, NULL, NULL )) { - efree(pbuffer); + free_alloca(pbuffer, use_heap_large); return -1; }; substitutename[substitutename_len] = 0; @@ -952,7 +955,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i printname_len + 1, printname, MAX_PATH, NULL, NULL )) { - efree(pbuffer); + free_alloca(pbuffer, use_heap_large); return -1; }; printname[pbuffer->MountPointReparseBuffer.PrintNameLength / sizeof(WCHAR)] = 0; @@ -963,7 +966,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i substitutename_len + 1, substitutename, MAX_PATH, NULL, NULL )) { - efree(pbuffer); + free_alloca(pbuffer, use_heap_large); return -1; }; substitutename[substitutename_len] = 0; @@ -973,7 +976,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i memcpy(substitutename, path, len + 1); substitutename_len = len; } else { - efree(pbuffer); + free_alloca(pbuffer, use_heap_large); return -1; } @@ -1017,21 +1020,21 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i fprintf(stderr, "sub: %s ", substitutename); fprintf(stderr, "resolved: %s ", path); #endif - efree(pbuffer); + free_alloca(pbuffer, use_heap_large); if(isabsolute == 1) { if (!((j == 3) && (path[1] == ':') && (path[2] == '\\'))) { /* use_realpath is 0 in the call below coz path is absolute*/ j = tsrm_realpath_r(path, 0, j, ll, t, 0, is_dir, &directory TSRMLS_CC); if(j < 0) { - efree(tmp); + free_alloca(tmp, use_heap); return -1; } } } else { if(i + j >= MAXPATHLEN - 1) { - efree(tmp); + free_alloca(tmp, use_heap); return -1; } @@ -1040,7 +1043,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i path[i-1] = DEFAULT_SLASH; j = tsrm_realpath_r(path, start, i + j, ll, t, use_realpath, is_dir, &directory TSRMLS_CC); if(j < 0) { - efree(tmp); + free_alloca(tmp, use_heap); return -1; } } @@ -1061,7 +1064,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i #elif defined(NETWARE) save = 0; - tmp = emalloc(len+1); + tmp = do_alloca(len+1, use_heap); memcpy(tmp, path, len+1); #else if (save && php_sys_lstat(path, &st) < 0) { @@ -1073,25 +1076,25 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i save = 0; } - tmp = emalloc(len+1); + tmp = do_alloca(len+1, use_heap); memcpy(tmp, path, len+1); if (save && S_ISLNK(st.st_mode)) { if (++(*ll) > LINK_MAX || (j = php_sys_readlink(tmp, path, MAXPATHLEN)) < 0) { /* too many links or broken symlinks */ - efree(tmp); + free_alloca(tmp, use_heap); return -1; } path[j] = 0; if (IS_ABSOLUTE_PATH(path, j)) { j = tsrm_realpath_r(path, 1, j, ll, t, use_realpath, is_dir, &directory TSRMLS_CC); if (j < 0) { - efree(tmp); + free_alloca(tmp, use_heap); return -1; } } else { if (i + j >= MAXPATHLEN-1) { - efree(tmp); + free_alloca(tmp, use_heap); return -1; /* buffer overflow */ } memmove(path+i, path, j+1); @@ -1099,7 +1102,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i path[i-1] = DEFAULT_SLASH; j = tsrm_realpath_r(path, start, i + j, ll, t, use_realpath, is_dir, &directory TSRMLS_CC); if (j < 0) { - efree(tmp); + free_alloca(tmp, use_heap); return -1; } } @@ -1114,7 +1117,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i } if (is_dir && !directory) { /* not a directory */ - efree(tmp); + free_alloca(tmp, use_heap); return -1; } } @@ -1130,7 +1133,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i } #ifdef TSRM_WIN32 if (j < 0 || j + len - i >= MAXPATHLEN-1) { - efree(tmp); + free_alloca(tmp, use_heap); return -1; } if (save) { @@ -1145,7 +1148,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i } #else if (j < 0 || j + len - i >= MAXPATHLEN-1) { - efree(tmp); + free_alloca(tmp, use_heap); return -1; } memcpy(path+j, tmp+i, len-i+1); @@ -1158,7 +1161,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i realpath_cache_add(tmp, len, path, j, directory, *t TSRMLS_CC); } - efree(tmp); + free_alloca(tmp, use_heap); return j; } } @@ -1385,6 +1388,7 @@ CWD_API int virtual_chdir_file(const char *path, int (*p_chdir)(const char *path int length = strlen(path); char *temp; int retval; + ALLOCA_FLAG(use_heap) if (length == 0) { return 1; /* Can't cd to empty string */ @@ -1401,14 +1405,14 @@ CWD_API int virtual_chdir_file(const char *path, int (*p_chdir)(const char *path if (length == COPY_WHEN_ABSOLUTE(path) && IS_ABSOLUTE_PATH(path, length+1)) { /* Also use trailing slash if this is absolute */ length++; } - temp = (char *) emalloc(length+1); + temp = (char *) do_alloca(length+1, use_heap); memcpy(temp, path, length); temp[length] = 0; #if VIRTUAL_CWD_DEBUG fprintf (stderr, "Changing directory to %s\n", temp); #endif retval = p_chdir(temp TSRMLS_CC); - efree(temp); + free_alloca(temp, use_heap); return retval; } /* }}} */ From 25dc4af3920d40c4dbec203485c15922a29e08c3 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Thu, 24 Oct 2013 08:48:09 -0700 Subject: [PATCH 333/400] enabled windows to use stack in both ts/nts mode, some more fixes --- Zend/zend.h | 2 +- Zend/zend_virtual_cwd.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Zend/zend.h b/Zend/zend.h index acbb6acaf76ce..5ac884455d4d0 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -193,7 +193,7 @@ char *alloca (); #endif #define restrict __restrict__ -#if (HAVE_ALLOCA || (defined (__GNUC__) && __GNUC__ >= 2)) && !(defined(ZTS) && defined(ZEND_WIN32)) && !(defined(ZTS) && defined(NETWARE)) && !(defined(ZTS) && defined(HPUX)) && !defined(DARWIN) +#if (HAVE_ALLOCA || (defined (__GNUC__) && __GNUC__ >= 2)) && !(defined(ZTS) && defined(NETWARE)) && !(defined(ZTS) && defined(HPUX)) && !defined(DARWIN) # define ZEND_ALLOCA_MAX_SIZE (32 * 1024) # define ALLOCA_FLAG(name) \ zend_bool name; diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c index 48aff01bd4ae9..75bf3d252280d 100644 --- a/Zend/zend_virtual_cwd.c +++ b/Zend/zend_virtual_cwd.c @@ -225,7 +225,6 @@ CWD_API int php_sys_readlink(const char *link, char *target, size_t target_len){ HINSTANCE kernel32; HANDLE hFile; DWORD dwRet; - ALLOCA_FLAG(use_heap) typedef BOOL (WINAPI *gfpnh_func)(HANDLE, LPTSTR, DWORD, DWORD); gfpnh_func pGetFinalPathNameByHandle; @@ -289,6 +288,7 @@ CWD_API int php_sys_stat_ex(const char *path, struct stat *buf, int lstat) /* {{ WIN32_FILE_ATTRIBUTE_DATA data; __int64 t; const size_t path_len = strlen(path); + ALLOCA_FLAG(use_heap_large); if (!GetFileAttributesEx(path, GetFileExInfoStandard, &data)) { return stat(path, buf); @@ -346,7 +346,7 @@ CWD_API int php_sys_stat_ex(const char *path, struct stat *buf, int lstat) /* {{ return -1; } - pbuffer = (REPARSE_DATA_BUFFER *)do_alloca(MAXIMUM_REPARSE_DATA_BUFFER_SIZE, use_heap); + pbuffer = (REPARSE_DATA_BUFFER *)do_alloca(MAXIMUM_REPARSE_DATA_BUFFER_SIZE, use_heap_large); if(!DeviceIoControl(hLink, FSCTL_GET_REPARSE_POINT, NULL, 0, pbuffer, MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &retlength, NULL)) { free_alloca(pbuffer, use_heap_large); CloseHandle(hLink); @@ -365,7 +365,7 @@ CWD_API int php_sys_stat_ex(const char *path, struct stat *buf, int lstat) /* {{ buf->st_mode |=; } #endif - free_alloca(pbuffer); + free_alloca(pbuffer, use_heap_large); } else { buf->st_mode = (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? (S_IFDIR|S_IEXEC|(S_IEXEC>>3)|(S_IEXEC>>6)) : S_IFREG; buf->st_mode |= (data.dwFileAttributes & FILE_ATTRIBUTE_READONLY) ? (S_IREAD|(S_IREAD>>3)|(S_IREAD>>6)) : (S_IREAD|(S_IREAD>>3)|(S_IREAD>>6)|S_IWRITE|(S_IWRITE>>3)|(S_IWRITE>>6)); From e53afaafcd9db9b3115df73024612fdbbc13ad50 Mon Sep 17 00:00:00 2001 From: Sascha Date: Fri, 25 Oct 2013 21:04:45 +0200 Subject: [PATCH 334/400] - test commit1 --- NEWS | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS b/NEWS index 57c2938bbf967..d8cd59c9eaef7 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,7 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 201?, PHP 5.6.0 + - Core: . Improved IS_VAR operands fetching. (Laruence, Dmitry) . Implemented internal operator overloading From bf087d85afc7351f4d9312977824eb002fbbf5d8 Mon Sep 17 00:00:00 2001 From: Sascha Date: Fri, 25 Oct 2013 21:26:58 +0200 Subject: [PATCH 335/400] - test commit 2 --- NEWS | 1 - 1 file changed, 1 deletion(-) diff --git a/NEWS b/NEWS index d8cd59c9eaef7..57c2938bbf967 100644 --- a/NEWS +++ b/NEWS @@ -2,7 +2,6 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 201?, PHP 5.6.0 - - Core: . Improved IS_VAR operands fetching. (Laruence, Dmitry) . Implemented internal operator overloading From 8cef677dc36015b1ebd37187ea3ec19bfed50b3a Mon Sep 17 00:00:00 2001 From: Sascha Schumann Date: Fri, 25 Oct 2013 21:34:28 +0200 Subject: [PATCH 336/400] - test3 --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 57c2938bbf967..d84b1edfc2a35 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,6 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| -?? ??? 201?, PHP 5.6.0 +?? ??? 201?, PHP 5.6.0 - Core: . Improved IS_VAR operands fetching. (Laruence, Dmitry) From e50eb1ce3408d15cd26fd88203c68f52e59f6b0b Mon Sep 17 00:00:00 2001 From: Yasuo Ohgaki Date: Sat, 26 Oct 2013 10:31:21 +0900 Subject: [PATCH 337/400] Fixed bug #65950 Field name truncation if the field name is bigger than 32 characters --- NEWS | 4 ++++ ext/odbc/php_odbc_includes.h | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 9439136ef6e16..26a9aa9ff42c5 100644 --- a/NEWS +++ b/NEWS @@ -16,6 +16,10 @@ PHP NEWS - FTP: . Fixed bug #65667 (ftp_nb_continue produces segfault). (Philip Hofstetter) +- ODBC + . Fixed bug #65950 (Field name truncation if the field name is bigger than + 32 characters). (patch submitted by: michael dot y at zend dot com, Yasuo) + - Sockets: . Fixed bug #65808 (the socket_connect() won't work with IPv6 address). (Mike) diff --git a/ext/odbc/php_odbc_includes.h b/ext/odbc/php_odbc_includes.h index ca237c0537bf7..c00583b16a215 100644 --- a/ext/odbc/php_odbc_includes.h +++ b/ext/odbc/php_odbc_includes.h @@ -232,7 +232,7 @@ typedef struct odbc_connection { } odbc_connection; typedef struct odbc_result_value { - char name[32]; + char name[256]; char *value; SQLLEN vallen; SQLLEN coltype; From 66fe7fabadd0b908828c865273d1fe3db2b7159b Mon Sep 17 00:00:00 2001 From: Yasuo Ohgaki Date: Sat, 26 Oct 2013 10:42:55 +0900 Subject: [PATCH 338/400] Update NEWS --- NEWS | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/NEWS b/NEWS index b51b8b23eb3cf..4020a446acdb1 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,11 @@ PHP NEWS . Fixed bug #65911 (scope resolution operator - strange behavior with $this). (Bob Weinand) +- ODBC + . Fixed bug #65950 (Field name truncation if the field name is bigger than + 32 characters). (patch submitted by: michael dot y at zend dot com, Yasuo) + + 17 Oct 2013, PHP 5.5.5 - Core: From e18e7a598305ac0472dcaae0226bc72ab22039ba Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Sun, 27 Oct 2013 16:52:43 +0800 Subject: [PATCH 339/400] remove "PHP 6" staff --- ext/phar/dirstream.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ext/phar/dirstream.c b/ext/phar/dirstream.c index 277d058ea6ce8..a48cde2f9762a 100644 --- a/ext/phar/dirstream.c +++ b/ext/phar/dirstream.c @@ -168,11 +168,7 @@ static int phar_compare_dir_name(const void *a, const void *b TSRMLS_DC) /* {{{ f = *((Bucket **) a); s = *((Bucket **) b); -#if (PHP_MAJOR_VERSION < 6) result = zend_binary_strcmp(f->arKey, f->nKeyLength, s->arKey, s->nKeyLength); -#else - result = zend_binary_strcmp(f->key.arKey.s, f->nKeyLength, s->key.arKey.s, s->nKeyLength); -#endif if (result < 0) { return -1; From 9765763413526d641b98c0a1e40d57b5ba1cceb3 Mon Sep 17 00:00:00 2001 From: Antony Dovgal Date: Sun, 27 Oct 2013 22:54:47 +0400 Subject: [PATCH 340/400] increase backlog to the highest value everywhere It makes no sense to use -1 for *BSD (which is the highest value there) and still use 128 for Linux. Lets raise it right to up the limit and let the people lower it if they think that 3.5Mb is too much for a process. IMO this is better than silently dropping connections. --- sapi/fpm/fpm/fpm_sockets.h | 2 +- sapi/fpm/php-fpm.conf.in | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sapi/fpm/fpm/fpm_sockets.h b/sapi/fpm/fpm/fpm_sockets.h index cce5712b8cfbf..121c016a7b89b 100644 --- a/sapi/fpm/fpm/fpm_sockets.h +++ b/sapi/fpm/fpm/fpm_sockets.h @@ -19,7 +19,7 @@ #if (__FreeBSD__) || (__OpenBSD__) #define FPM_BACKLOG_DEFAULT -1 #else -#define FPM_BACKLOG_DEFAULT 128 +#define FPM_BACKLOG_DEFAULT 65535 #endif enum fpm_address_domain fpm_sockets_domain_from_address(char *addr); diff --git a/sapi/fpm/php-fpm.conf.in b/sapi/fpm/php-fpm.conf.in index af4f2fa325a3f..9002a2933bb26 100644 --- a/sapi/fpm/php-fpm.conf.in +++ b/sapi/fpm/php-fpm.conf.in @@ -159,8 +159,8 @@ group = @php_fpm_group@ listen = 127.0.0.1:9000 ; Set listen(2) backlog. -; Default Value: 128 (-1 on FreeBSD and OpenBSD) -;listen.backlog = 128 +; Default Value: 65535 (-1 on FreeBSD and OpenBSD) +;listen.backlog = 65535 ; Set permissions for unix socket, if one is used. In Linux, read/write ; permissions must be set in order to allow connections from a web server. Many From 8da5734cf57f895bb8d27599fd139f343bc6bec2 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sun, 27 Oct 2013 15:21:21 -0700 Subject: [PATCH 341/400] test commit --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index d84b1edfc2a35..0c45a234697c4 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,6 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| -?? ??? 201?, PHP 5.6.0 +?? ??? 20??, PHP 5.6.0 - Core: . Improved IS_VAR operands fetching. (Laruence, Dmitry) From f8f643b4f71482be0e587c176ce4ffb2d6d2d92b Mon Sep 17 00:00:00 2001 From: Hannes Magnusson Date: Sun, 27 Oct 2013 16:40:37 -0700 Subject: [PATCH 342/400] Link to more readmes --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 51973854db86f..09e70e6a39f99 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ See https://wiki.php.net/rfc and https://wiki.php.net/rfc/voting for more information on the process. Bug fixes **do not** require an RFC, but require a bugtracker ticket. Always -open a ticket at http://bugs.php.net and reference the bug id using #NNNNNN. +open a ticket at https://bugs.php.net and reference the bug id using #NNNNNN. Fix #55371: get_magic_quotes_gpc() throws deprecation warning @@ -28,3 +28,12 @@ open a ticket at http://bugs.php.net and reference the bug id using #NNNNNN. We do not merge pull requests directly on github. All PRs will be pulled and pushed through http://git.php.net. + + +Guidelines for contributors +=========================== +- [CODING_STANDARDS](/CODING_STANDARDS) +- [README.GIT-RULES](/README.GIT-RULES) +- [README.MAILINGLIST_RULES](/README.MAILINGLIST_RULES) +- [README.RELEASE_PROCESS](/README.RELEASE_PROCESS) + From 8962f3ff0c76c5710f5e14d6f342f44498ff882b Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Fri, 25 Oct 2013 09:42:54 +0200 Subject: [PATCH 343/400] fix limitation of upload size == (U)INT_MAX in CGI --- sapi/cgi/cgi_main.c | 5 ++++- sapi/fpm/fpm/fpm_main.c | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c index 221b0021756dc..43816d4d13a9b 100644 --- a/sapi/cgi/cgi_main.c +++ b/sapi/cgi/cgi_main.c @@ -524,8 +524,11 @@ static int sapi_fcgi_read_post(char *buffer, uint count_bytes TSRMLS_DC) uint read_bytes = 0; int tmp_read_bytes; fcgi_request *request = (fcgi_request*) SG(server_context); + size_t remaining = SG(request_info).content_length - SG(read_post_bytes); - count_bytes = MIN(count_bytes, (uint) SG(request_info).content_length - SG(read_post_bytes)); + if (remaining < count_bytes) { + count_bytes = remaining; + } while (read_bytes < count_bytes) { tmp_read_bytes = fcgi_read(request, buffer + read_bytes, count_bytes - read_bytes); if (tmp_read_bytes <= 0) { diff --git a/sapi/fpm/fpm/fpm_main.c b/sapi/fpm/fpm/fpm_main.c index 4b20e632dd361..91abfea959f3a 100644 --- a/sapi/fpm/fpm/fpm_main.c +++ b/sapi/fpm/fpm/fpm_main.c @@ -498,8 +498,11 @@ static int sapi_cgi_read_post(char *buffer, uint count_bytes TSRMLS_DC) { uint read_bytes = 0; int tmp_read_bytes; + size_t remaining = SG(request_info).content_length - SG(read_post_bytes); - count_bytes = MIN(count_bytes, (uint) SG(request_info).content_length - SG(read_post_bytes)); + if (remaining < count_bytes) { + count_bytes = remaining; + } while (read_bytes < count_bytes) { fcgi_request *request = (fcgi_request*) SG(server_context); if (request_body_fd == -1) { From 91b8a6752e2d987ff7b1ee10c343dcba13c94914 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 28 Oct 2013 13:17:55 +0400 Subject: [PATCH 344/400] Improved performance of func_get_args() by eliminating useless copying --- NEWS | 2 ++ Zend/zend_builtin_functions.c | 15 ++++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index b51b8b23eb3cf..57066f9796942 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,8 @@ PHP NEWS ?? ??? 2013, PHP 5.5.6 - Core: + . Improved performance of func_get_args by eliminating useless copying. + (Dmitry) . Fixed bug #65939 (Space before ";" breaks php.ini parsing). (brainstorm at nopcode dot org) . Fixed bug #65911 (scope resolution operator - strange behavior with $this). diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 1ad64e74eaf47..6cbe0bc6872a5 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -461,12 +461,17 @@ ZEND_FUNCTION(func_get_args) array_init_size(return_value, arg_count); for (i=0; ivalue.ht, &element, sizeof(zval *), NULL); } } From 5c0890ba8a442c4e88abaa1eacf2db100cb9d4d8 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 28 Oct 2013 13:31:44 +0400 Subject: [PATCH 345/400] Improved performance of array_merge() by eliminating useless copying --- NEWS | 4 ++-- ext/standard/array.c | 37 ++++++++++++++++++++++++------------- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/NEWS b/NEWS index 57066f9796942..0ab8a40588478 100644 --- a/NEWS +++ b/NEWS @@ -3,8 +3,8 @@ PHP NEWS ?? ??? 2013, PHP 5.5.6 - Core: - . Improved performance of func_get_args by eliminating useless copying. - (Dmitry) + . Improved performance of array_merge() and func_get_args() by eliminating + useless copying. (Dmitry) . Fixed bug #65939 (Space before ";" breaks php.ini parsing). (brainstorm at nopcode dot org) . Fixed bug #65911 (scope resolution operator - strange behavior with $this). diff --git a/ext/standard/array.c b/ext/standard/array.c index 51972033ee711..360a691d38d76 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -2222,13 +2222,14 @@ PHPAPI int php_array_merge(HashTable *dest, HashTable *src, int recursive TSRMLS case HASH_KEY_IS_STRING: if (recursive && zend_hash_find(dest, string_key, string_key_len, (void **)&dest_entry) == SUCCESS) { HashTable *thash = Z_TYPE_PP(dest_entry) == IS_ARRAY ? Z_ARRVAL_PP(dest_entry) : NULL; + zval *src_zval; + zval *tmp = NULL; if ((thash && thash->nApplyCount > 1) || (*src_entry == *dest_entry && Z_ISREF_PP(dest_entry) && (Z_REFCOUNT_PP(dest_entry) % 2))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "recursion detected"); return 0; } SEPARATE_ZVAL(dest_entry); - SEPARATE_ZVAL(src_entry); if (Z_TYPE_PP(dest_entry) == IS_NULL) { convert_to_array_ex(dest_entry); @@ -2236,23 +2237,34 @@ PHPAPI int php_array_merge(HashTable *dest, HashTable *src, int recursive TSRMLS } else { convert_to_array_ex(dest_entry); } - if (Z_TYPE_PP(src_entry) == IS_NULL) { - convert_to_array_ex(src_entry); - add_next_index_null(*src_entry); + if (Z_TYPE_PP(src_entry) == IS_OBJECT) { + ALLOC_ZVAL(src_zval); + INIT_PZVAL_COPY(src_zval, *src_entry); + zval_copy_ctor(src_zval); + convert_to_array(src_zval); + tmp = src_zval; } else { - convert_to_array_ex(src_entry); + src_zval = *src_entry; } - if (thash) { - thash->nApplyCount++; - } - if (!php_array_merge(Z_ARRVAL_PP(dest_entry), Z_ARRVAL_PP(src_entry), recursive TSRMLS_CC)) { + if (Z_TYPE_P(src_zval) == IS_ARRAY) { + if (thash) { + thash->nApplyCount++; + } + if (!php_array_merge(Z_ARRVAL_PP(dest_entry), Z_ARRVAL_P(src_zval), recursive TSRMLS_CC)) { + if (thash) { + thash->nApplyCount--; + } + return 0; + } if (thash) { thash->nApplyCount--; } - return 0; + } else { + Z_ADDREF_PP(src_entry); + zend_hash_next_index_insert(Z_ARRVAL_PP(dest_entry), &src_zval, sizeof(zval *), NULL); } - if (thash) { - thash->nApplyCount--; + if (tmp) { + zval_ptr_dtor(&tmp); } } else { Z_ADDREF_PP(src_entry); @@ -2356,7 +2368,6 @@ static void php_array_merge_or_replace_wrapper(INTERNAL_FUNCTION_PARAMETERS, int array_init_size(return_value, init_size); for (i = 0; i < argc; i++) { - SEPARATE_ZVAL(args[i]); if (!replace) { php_array_merge(Z_ARRVAL_P(return_value), Z_ARRVAL_PP(args[i]), recursive TSRMLS_CC); } else if (recursive && i > 0) { /* First array will be copied directly instead */ From eb22041ffe70d5ff206d62c6cb12fc38c23475ce Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 28 Oct 2013 14:19:40 +0400 Subject: [PATCH 346/400] Increased limit for opcache.max_accelerated_files to 1,000,000. (Chris) --- NEWS | 3 +++ ext/opcache/README | 4 ++-- ext/opcache/zend_accelerator_module.c | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 81b2811617310..9fe5fc463895f 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,9 @@ PHP NEWS . Fixed bug #65911 (scope resolution operator - strange behavior with $this). (Bob Weinand) +-OPcache + . Increased limit for opcache.max_accelerated_files to 1,000,000. (Chris) + - ODBC . Fixed bug #65950 (Field name truncation if the field name is bigger than 32 characters). (patch submitted by: michael dot y at zend dot com, Yasuo) diff --git a/ext/opcache/README b/ext/opcache/README index 46521587fa719..2e30d92c001e1 100644 --- a/ext/opcache/README +++ b/ext/opcache/README @@ -80,8 +80,8 @@ opcache.max_accelerated_files (default "2000") The maximum number of keys (scripts) in the OPcache hash table. The number is actually the first one in the following set of prime numbers that is bigger than the one supplied: { 223, 463, 983, 1979, 3907, - 7963, 16229, 32531, 65407, 130987 }. Only numbers between 200 and 100000 - are allowed. + 7963, 16229, 32531, 65407, 130987, 262237, 524521, 1048793 }. Only numbers + between 200 and 1000000 are allowed. opcache.max_wasted_percentage (default "5") The maximum percentage of "wasted" memory until a restart is scheduled. diff --git a/ext/opcache/zend_accelerator_module.c b/ext/opcache/zend_accelerator_module.c index dedb7215c1df3..0914fb68dd936 100644 --- a/ext/opcache/zend_accelerator_module.c +++ b/ext/opcache/zend_accelerator_module.c @@ -34,7 +34,7 @@ #define STRING_NOT_NULL(s) (NULL == (s)?"":s) #define MIN_ACCEL_FILES 200 -#define MAX_ACCEL_FILES 100000 +#define MAX_ACCEL_FILES 1000000 #define TOKENTOSTR(X) #X static void (*orig_file_exists)(INTERNAL_FUNCTION_PARAMETERS) = NULL; From 2d14cc2a4986a3a2afd94c79283ab1dc8a3fe157 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 28 Oct 2013 14:44:07 +0400 Subject: [PATCH 347/400] Use zval* instead of zval** --- Zend/zend_vm_def.h | 28 ++-- Zend/zend_vm_execute.h | 336 +++++++++++++++++++---------------------- 2 files changed, 169 insertions(+), 195 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 201ae49e05a68..c2c3ae52195fb 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -4453,22 +4453,22 @@ ZEND_VM_HELPER_EX(zend_isset_isempty_dim_prop_obj_handler, VAR|UNUSED|CV, CONST| { USE_OPLINE zend_free_op free_op1, free_op2; - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_IS); + container = GET_OP1_OBJ_ZVAL_PTR(BP_VAR_IS); offset = GET_OP2_ZVAL_PTR(BP_VAR_R); - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -4487,9 +4487,7 @@ ZEND_VM_C_LABEL(num_index_prop): if (OP2_TYPE == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, ZEND_VM_C_GOTO(num_index_prop)); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, ZEND_VM_C_GOTO(num_index_prop)); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -4524,20 +4522,20 @@ ZEND_VM_C_LABEL(num_index_prop): } } FREE_OP2(); - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (IS_OP2_TMP_FREE()) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((OP2_TYPE == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((OP2_TYPE == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -4548,7 +4546,7 @@ ZEND_VM_C_LABEL(num_index_prop): } else { FREE_OP2(); } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -4566,11 +4564,11 @@ ZEND_VM_C_LABEL(num_index_prop): } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 74a8c12d400e4..b21f6bf895101 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -16074,22 +16074,22 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CONST( { USE_OPLINE zend_free_op free_op1; - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); + container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); offset = opline->op2.zv; - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -16108,9 +16108,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CONST( if (IS_CONST == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -16145,20 +16143,20 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CONST( } } - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (0) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -16169,7 +16167,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CONST( } else { } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -16187,11 +16185,11 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CONST( } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } @@ -18168,22 +18166,22 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_TMP(in { USE_OPLINE zend_free_op free_op1, free_op2; - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); + container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -18202,9 +18200,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_TMP(in if (IS_TMP_VAR == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -18239,20 +18235,20 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_TMP(in } } zval_dtor(free_op2.var); - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (1) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -18263,7 +18259,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_TMP(in } else { zval_dtor(free_op2.var); } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -18281,11 +18277,11 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_TMP(in } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } @@ -20644,22 +20640,22 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(in { USE_OPLINE zend_free_op free_op1, free_op2; - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); + container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -20678,9 +20674,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(in if (IS_VAR == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -20715,20 +20709,20 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(in } } if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (0) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -20739,7 +20733,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(in } else { if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -20757,11 +20751,11 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(in } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } @@ -23936,22 +23930,22 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CV(int { USE_OPLINE zend_free_op free_op1; - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); + container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -23970,9 +23964,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CV(int if (IS_CV == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -24007,20 +23999,20 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CV(int } } - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (0) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -24031,7 +24023,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CV(int } else { } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -24049,11 +24041,11 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CV(int } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } @@ -25440,22 +25432,22 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CON { USE_OPLINE - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(TSRMLS_C); offset = opline->op2.zv; - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -25474,9 +25466,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CON if (IS_CONST == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -25511,20 +25501,20 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CON } } - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (0) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -25535,7 +25525,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CON } else { } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -25553,11 +25543,11 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CON } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } @@ -26756,22 +26746,22 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_TMP { USE_OPLINE zend_free_op free_op2; - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(TSRMLS_C); offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -26790,9 +26780,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_TMP if (IS_TMP_VAR == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -26827,20 +26815,20 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_TMP } } zval_dtor(free_op2.var); - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (1) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -26851,7 +26839,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_TMP } else { zval_dtor(free_op2.var); } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -26869,11 +26857,11 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_TMP } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } @@ -28072,22 +28060,22 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_VAR { USE_OPLINE zend_free_op free_op2; - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(TSRMLS_C); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -28106,9 +28094,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_VAR if (IS_VAR == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -28143,20 +28129,20 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_VAR } } if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (0) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -28167,7 +28153,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_VAR } else { if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -28185,11 +28171,11 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_VAR } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } @@ -29808,22 +29794,22 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CV( { USE_OPLINE - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C); + container = _get_obj_zval_ptr_unused(TSRMLS_C); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -29842,9 +29828,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CV( if (IS_CV == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -29879,20 +29863,20 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CV( } } - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (0) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -29903,7 +29887,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CV( } else { } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -29921,11 +29905,11 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CV( } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } @@ -33302,22 +33286,22 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CONST(i { USE_OPLINE - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = _get_zval_ptr_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC); + container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC); offset = opline->op2.zv; - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -33336,9 +33320,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CONST(i if (IS_CONST == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -33373,20 +33355,20 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CONST(i } } - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (0) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -33397,7 +33379,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CONST(i } else { } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -33415,11 +33397,11 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CONST(i } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } @@ -35258,22 +35240,22 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_TMP(int { USE_OPLINE zend_free_op free_op2; - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = _get_zval_ptr_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC); + container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC); offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -35292,9 +35274,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_TMP(int if (IS_TMP_VAR == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -35329,20 +35309,20 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_TMP(int } } zval_dtor(free_op2.var); - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (1) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -35353,7 +35333,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_TMP(int } else { zval_dtor(free_op2.var); } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -35371,11 +35351,11 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_TMP(int } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } @@ -37595,22 +37575,22 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_VAR(int { USE_OPLINE zend_free_op free_op2; - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = _get_zval_ptr_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC); + container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC); offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -37629,9 +37609,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_VAR(int if (IS_VAR == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -37666,20 +37644,20 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_VAR(int } } if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (0) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -37690,7 +37668,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_VAR(int } else { if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -37708,11 +37686,11 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_VAR(int } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } @@ -40600,22 +40578,22 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CV(int { USE_OPLINE - zval **container; + zval *container; zval **value = NULL; int result = 0; ulong hval; zval *offset; SAVE_OPLINE(); - container = _get_zval_ptr_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC); + container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC); offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC); - if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) { + if (Z_TYPE_P(container) == IS_ARRAY && !prop_dim) { HashTable *ht; int isset = 0; - ht = Z_ARRVAL_PP(container); + ht = Z_ARRVAL_P(container); switch (Z_TYPE_P(offset)) { case IS_DOUBLE: @@ -40634,9 +40612,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CV(int if (IS_CV == IS_CONST) { hval = Z_HASH_P(offset); } else { - if (!prop_dim) { - ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); - } + ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop); if (IS_INTERNED(Z_STRVAL_P(offset))) { hval = INTERNED_HASH(Z_STRVAL_P(offset)); } else { @@ -40671,20 +40647,20 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CV(int } } - } else if (Z_TYPE_PP(container) == IS_OBJECT) { + } else if (Z_TYPE_P(container) == IS_OBJECT) { if (0) { MAKE_REAL_ZVAL_PTR(offset); } if (prop_dim) { - if (Z_OBJ_HT_P(*container)->has_property) { - result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_property) { + result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check property of non-object"); result = 0; } } else { - if (Z_OBJ_HT_P(*container)->has_dimension) { - result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); + if (Z_OBJ_HT_P(container)->has_dimension) { + result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC); } else { zend_error(E_NOTICE, "Trying to check element of non-array"); result = 0; @@ -40695,7 +40671,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CV(int } else { } - } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */ + } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; if (Z_TYPE_P(offset) != IS_LONG) { @@ -40713,11 +40689,11 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CV(int } if (Z_TYPE_P(offset) == IS_LONG) { if (opline->extended_value & ZEND_ISSET) { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container)) { result = 1; } } else /* if (opline->extended_value & ZEND_ISEMPTY) */ { - if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') { + if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_P(container) && Z_STRVAL_P(container)[offset->value.lval] != '0') { result = 1; } } From ab6481993eb302cd70599cec35d4ac486ca3d1f8 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Mon, 28 Oct 2013 15:12:30 +0100 Subject: [PATCH 348/400] - Updated to version 2013.8 (2013h) --- ext/date/lib/timezonedb.h | 1256 ++++++++++++++++++------------------- 1 file changed, 628 insertions(+), 628 deletions(-) diff --git a/ext/date/lib/timezonedb.h b/ext/date/lib/timezonedb.h index 99280062b22a7..91884a935f567 100644 --- a/ext/date/lib/timezonedb.h +++ b/ext/date/lib/timezonedb.h @@ -21,566 +21,566 @@ const timelib_tzdb_index_entry timezonedb_idx_builtin[579] = { { "Africa/Djibouti" , 0x000F1F }, { "Africa/Douala" , 0x000F74 }, { "Africa/El_Aaiun" , 0x000FC9 }, - { "Africa/Freetown" , 0x00102F }, - { "Africa/Gaborone" , 0x00113E }, - { "Africa/Harare" , 0x0011AB }, - { "Africa/Johannesburg" , 0x001200 }, - { "Africa/Juba" , 0x00126E }, - { "Africa/Kampala" , 0x001381 }, - { "Africa/Khartoum" , 0x001400 }, - { "Africa/Kigali" , 0x001513 }, - { "Africa/Kinshasa" , 0x001568 }, - { "Africa/Lagos" , 0x0015C3 }, - { "Africa/Libreville" , 0x001618 }, - { "Africa/Lome" , 0x00166D }, - { "Africa/Luanda" , 0x0016B1 }, - { "Africa/Lubumbashi" , 0x001706 }, - { "Africa/Lusaka" , 0x001761 }, - { "Africa/Malabo" , 0x0017B6 }, - { "Africa/Maputo" , 0x00181C }, - { "Africa/Maseru" , 0x001871 }, - { "Africa/Mbabane" , 0x0018D9 }, - { "Africa/Mogadishu" , 0x00192F }, - { "Africa/Monrovia" , 0x00198A }, - { "Africa/Nairobi" , 0x0019F0 }, - { "Africa/Ndjamena" , 0x001A6F }, - { "Africa/Niamey" , 0x001ADB }, - { "Africa/Nouakchott" , 0x001B4E }, - { "Africa/Ouagadougou" , 0x001BB9 }, - { "Africa/Porto-Novo" , 0x001C0E }, - { "Africa/Sao_Tome" , 0x001C74 }, - { "Africa/Timbuktu" , 0x001CC9 }, - { "Africa/Tripoli" , 0x001D34 }, - { "Africa/Tunis" , 0x001F2D }, - { "Africa/Windhoek" , 0x00203F }, - { "America/Adak" , 0x002286 }, - { "America/Anchorage" , 0x0025FC }, - { "America/Anguilla" , 0x002970 }, - { "America/Antigua" , 0x0029C5 }, - { "America/Araguaina" , 0x002A2B }, - { "America/Argentina/Buenos_Aires" , 0x002B90 }, - { "America/Argentina/Catamarca" , 0x002D3E }, - { "America/Argentina/ComodRivadavia" , 0x002EFF }, - { "America/Argentina/Cordoba" , 0x0030A5 }, - { "America/Argentina/Jujuy" , 0x00327A }, - { "America/Argentina/La_Rioja" , 0x00342E }, - { "America/Argentina/Mendoza" , 0x0035E6 }, - { "America/Argentina/Rio_Gallegos" , 0x0037A6 }, - { "America/Argentina/Salta" , 0x00395B }, - { "America/Argentina/San_Juan" , 0x003B07 }, - { "America/Argentina/San_Luis" , 0x003CBF }, - { "America/Argentina/Tucuman" , 0x003E85 }, - { "America/Argentina/Ushuaia" , 0x004041 }, - { "America/Aruba" , 0x0041FC }, - { "America/Asuncion" , 0x004262 }, - { "America/Atikokan" , 0x004547 }, - { "America/Atka" , 0x00461D }, - { "America/Bahia" , 0x004983 }, - { "America/Bahia_Banderas" , 0x004B16 }, - { "America/Barbados" , 0x004D8F }, - { "America/Belem" , 0x004E29 }, - { "America/Belize" , 0x004F24 }, - { "America/Blanc-Sablon" , 0x0050A0 }, - { "America/Boa_Vista" , 0x005154 }, - { "America/Bogota" , 0x00525D }, - { "America/Boise" , 0x0052C9 }, - { "America/Buenos_Aires" , 0x005660 }, - { "America/Cambridge_Bay" , 0x0057F9 }, - { "America/Campo_Grande" , 0x005B21 }, - { "America/Cancun" , 0x005E10 }, - { "America/Caracas" , 0x006052 }, - { "America/Catamarca" , 0x0060B9 }, - { "America/Cayenne" , 0x00625F }, - { "America/Cayman" , 0x0062C1 }, - { "America/Chicago" , 0x006316 }, - { "America/Chihuahua" , 0x00682D }, - { "America/Coral_Harbour" , 0x006A98 }, - { "America/Cordoba" , 0x006B2A }, - { "America/Costa_Rica" , 0x006CD0 }, - { "America/Creston" , 0x006D5A }, - { "America/Cuiaba" , 0x006DE6 }, - { "America/Curacao" , 0x0070C4 }, - { "America/Danmarkshavn" , 0x00712A }, - { "America/Dawson" , 0x00726E }, - { "America/Dawson_Creek" , 0x00758B }, - { "America/Denver" , 0x007765 }, - { "America/Detroit" , 0x007AEB }, - { "America/Dominica" , 0x007E4A }, - { "America/Edmonton" , 0x007E9F }, - { "America/Eirunepe" , 0x008257 }, - { "America/El_Salvador" , 0x00836A }, - { "America/Ensenada" , 0x0083DF }, - { "America/Fort_Wayne" , 0x008886 }, - { "America/Fortaleza" , 0x008748 }, - { "America/Glace_Bay" , 0x008AF0 }, - { "America/Godthab" , 0x008E67 }, - { "America/Goose_Bay" , 0x00912B }, - { "America/Grand_Turk" , 0x0095E8 }, - { "America/Grenada" , 0x009897 }, - { "America/Guadeloupe" , 0x0098EC }, - { "America/Guatemala" , 0x009941 }, - { "America/Guayaquil" , 0x0099CA }, - { "America/Guyana" , 0x009A27 }, - { "America/Halifax" , 0x009AA8 }, - { "America/Havana" , 0x009FBE }, - { "America/Hermosillo" , 0x00A331 }, - { "America/Indiana/Indianapolis" , 0x00A40F }, - { "America/Indiana/Knox" , 0x00A6A0 }, - { "America/Indiana/Marengo" , 0x00AA37 }, - { "America/Indiana/Petersburg" , 0x00ACDD }, - { "America/Indiana/Tell_City" , 0x00B22A }, - { "America/Indiana/Vevay" , 0x00B4C3 }, - { "America/Indiana/Vincennes" , 0x00B6FE }, - { "America/Indiana/Winamac" , 0x00B9B2 }, - { "America/Indianapolis" , 0x00AFC0 }, - { "America/Inuvik" , 0x00BC6B }, - { "America/Iqaluit" , 0x00BF62 }, - { "America/Jamaica" , 0x00C284 }, - { "America/Jujuy" , 0x00C349 }, - { "America/Juneau" , 0x00C4F3 }, - { "America/Kentucky/Louisville" , 0x00C871 }, - { "America/Kentucky/Monticello" , 0x00CC8F }, - { "America/Knox_IN" , 0x00D014 }, - { "America/Kralendijk" , 0x00D385 }, - { "America/La_Paz" , 0x00D3EB }, - { "America/Lima" , 0x00D452 }, - { "America/Los_Angeles" , 0x00D4FA }, - { "America/Louisville" , 0x00D90B }, - { "America/Lower_Princes" , 0x00DD00 }, - { "America/Maceio" , 0x00DD66 }, - { "America/Managua" , 0x00DEA0 }, - { "America/Manaus" , 0x00DF53 }, - { "America/Marigot" , 0x00E055 }, - { "America/Martinique" , 0x00E0AA }, - { "America/Matamoros" , 0x00E116 }, - { "America/Mazatlan" , 0x00E36F }, - { "America/Mendoza" , 0x00E5DC }, - { "America/Menominee" , 0x00E790 }, - { "America/Merida" , 0x00EB11 }, - { "America/Metlakatla" , 0x00ED4C }, - { "America/Mexico_City" , 0x00EE86 }, - { "America/Miquelon" , 0x00F101 }, - { "America/Moncton" , 0x00F373 }, - { "America/Monterrey" , 0x00F80A }, - { "America/Montevideo" , 0x00FA6D }, - { "America/Montreal" , 0x00FD7F }, - { "America/Montserrat" , 0x01026F }, - { "America/Nassau" , 0x0102C4 }, - { "America/New_York" , 0x010609 }, - { "America/Nipigon" , 0x010B14 }, - { "America/Nome" , 0x010E65 }, - { "America/Noronha" , 0x0111E3 }, - { "America/North_Dakota/Beulah" , 0x011313 }, - { "America/North_Dakota/Center" , 0x0116A7 }, - { "America/North_Dakota/New_Salem" , 0x011A3B }, - { "America/Ojinaga" , 0x011DE4 }, - { "America/Panama" , 0x012045 }, - { "America/Pangnirtung" , 0x01209A }, - { "America/Paramaribo" , 0x0123D0 }, - { "America/Phoenix" , 0x012462 }, - { "America/Port-au-Prince" , 0x012520 }, - { "America/Port_of_Spain" , 0x01283F }, - { "America/Porto_Acre" , 0x012740 }, - { "America/Porto_Velho" , 0x012894 }, - { "America/Puerto_Rico" , 0x01298A }, - { "America/Rainy_River" , 0x0129F5 }, - { "America/Rankin_Inlet" , 0x012D2D }, - { "America/Recife" , 0x013013 }, - { "America/Regina" , 0x01313D }, - { "America/Resolute" , 0x0132FB }, - { "America/Rio_Branco" , 0x0135EC }, - { "America/Rosario" , 0x0136EF }, - { "America/Santa_Isabel" , 0x013895 }, - { "America/Santarem" , 0x013C38 }, - { "America/Santiago" , 0x013D3D }, - { "America/Santo_Domingo" , 0x0140E6 }, - { "America/Sao_Paulo" , 0x0141AC }, - { "America/Scoresbysund" , 0x0144BB }, - { "America/Shiprock" , 0x0147A9 }, - { "America/Sitka" , 0x014B22 }, - { "America/St_Barthelemy" , 0x014EAA }, - { "America/St_Johns" , 0x014EFF }, - { "America/St_Kitts" , 0x015452 }, - { "America/St_Lucia" , 0x0154A7 }, - { "America/St_Thomas" , 0x0154FC }, - { "America/St_Vincent" , 0x015551 }, - { "America/Swift_Current" , 0x0155A6 }, - { "America/Tegucigalpa" , 0x0156C7 }, - { "America/Thule" , 0x015746 }, - { "America/Thunder_Bay" , 0x01598D }, - { "America/Tijuana" , 0x015CD6 }, - { "America/Toronto" , 0x01606F }, - { "America/Tortola" , 0x01658F }, - { "America/Vancouver" , 0x0165E4 }, - { "America/Virgin" , 0x016A21 }, - { "America/Whitehorse" , 0x016A76 }, - { "America/Winnipeg" , 0x016D93 }, - { "America/Yakutat" , 0x0171D3 }, - { "America/Yellowknife" , 0x01753E }, - { "Antarctica/Casey" , 0x01784E }, - { "Antarctica/Davis" , 0x0178EB }, - { "Antarctica/DumontDUrville" , 0x01798C }, - { "Antarctica/Macquarie" , 0x017A1E }, - { "Antarctica/Mawson" , 0x017C65 }, - { "Antarctica/McMurdo" , 0x017CE1 }, - { "Antarctica/Palmer" , 0x01808C }, - { "Antarctica/Rothera" , 0x0183A8 }, - { "Antarctica/South_Pole" , 0x01841E }, - { "Antarctica/Syowa" , 0x01879C }, - { "Antarctica/Vostok" , 0x01880A }, - { "Arctic/Longyearbyen" , 0x01887B }, - { "Asia/Aden" , 0x018BAD }, - { "Asia/Almaty" , 0x018C02 }, - { "Asia/Amman" , 0x018D81 }, - { "Asia/Anadyr" , 0x018F53 }, - { "Asia/Aqtau" , 0x019138 }, - { "Asia/Aqtobe" , 0x019337 }, - { "Asia/Ashgabat" , 0x0194EF }, - { "Asia/Ashkhabad" , 0x01960C }, - { "Asia/Baghdad" , 0x019729 }, - { "Asia/Bahrain" , 0x01989E }, - { "Asia/Baku" , 0x019904 }, - { "Asia/Bangkok" , 0x019BEC }, - { "Asia/Beirut" , 0x019C41 }, - { "Asia/Bishkek" , 0x019F4E }, - { "Asia/Brunei" , 0x01A0FA }, - { "Asia/Calcutta" , 0x01A15C }, - { "Asia/Choibalsan" , 0x01A1D5 }, - { "Asia/Chongqing" , 0x01A34E }, - { "Asia/Chungking" , 0x01A43D }, - { "Asia/Colombo" , 0x01A4EC }, - { "Asia/Dacca" , 0x01A588 }, - { "Asia/Damascus" , 0x01A62E }, - { "Asia/Dhaka" , 0x01A97E }, - { "Asia/Dili" , 0x01AA24 }, - { "Asia/Dubai" , 0x01AAAE }, - { "Asia/Dushanbe" , 0x01AB03 }, - { "Asia/Gaza" , 0x01AC06 }, - { "Asia/Harbin" , 0x01AF59 }, - { "Asia/Hebron" , 0x01B040 }, - { "Asia/Ho_Chi_Minh" , 0x01B39C }, - { "Asia/Hong_Kong" , 0x01B414 }, - { "Asia/Hovd" , 0x01B5D6 }, - { "Asia/Irkutsk" , 0x01B74E }, - { "Asia/Istanbul" , 0x01B934 }, - { "Asia/Jakarta" , 0x01BD21 }, - { "Asia/Jayapura" , 0x01BDCB }, - { "Asia/Jerusalem" , 0x01BE67 }, - { "Asia/Kabul" , 0x01C196 }, - { "Asia/Kamchatka" , 0x01C1E7 }, - { "Asia/Karachi" , 0x01C3C3 }, - { "Asia/Kashgar" , 0x01C478 }, - { "Asia/Kathmandu" , 0x01C549 }, - { "Asia/Katmandu" , 0x01C5AF }, - { "Asia/Khandyga" , 0x01C615 }, - { "Asia/Kolkata" , 0x01C83A }, - { "Asia/Krasnoyarsk" , 0x01C8B3 }, - { "Asia/Kuala_Lumpur" , 0x01CA9B }, - { "Asia/Kuching" , 0x01CB58 }, - { "Asia/Kuwait" , 0x01CC46 }, - { "Asia/Macao" , 0x01CC9B }, - { "Asia/Macau" , 0x01CDD6 }, - { "Asia/Magadan" , 0x01CF11 }, - { "Asia/Makassar" , 0x01D0F3 }, - { "Asia/Manila" , 0x01D1B8 }, - { "Asia/Muscat" , 0x01D23D }, - { "Asia/Nicosia" , 0x01D292 }, - { "Asia/Novokuznetsk" , 0x01D57A }, - { "Asia/Novosibirsk" , 0x01D77C }, - { "Asia/Omsk" , 0x01D967 }, - { "Asia/Oral" , 0x01DB4E }, - { "Asia/Phnom_Penh" , 0x01DD1E }, - { "Asia/Pontianak" , 0x01DD96 }, - { "Asia/Pyongyang" , 0x01DE58 }, - { "Asia/Qatar" , 0x01DEC5 }, - { "Asia/Qyzylorda" , 0x01DF2B }, - { "Asia/Rangoon" , 0x01E101 }, - { "Asia/Riyadh" , 0x01E179 }, - { "Asia/Saigon" , 0x01E1CE }, - { "Asia/Sakhalin" , 0x01E246 }, - { "Asia/Samarkand" , 0x01E43D }, - { "Asia/Seoul" , 0x01E573 }, - { "Asia/Shanghai" , 0x01E617 }, - { "Asia/Singapore" , 0x01E6F7 }, - { "Asia/Taipei" , 0x01E7AE }, - { "Asia/Tashkent" , 0x01E8C6 }, - { "Asia/Tbilisi" , 0x01E9F7 }, - { "Asia/Tehran" , 0x01EBB1 }, - { "Asia/Tel_Aviv" , 0x01EE1F }, - { "Asia/Thimbu" , 0x01F14E }, - { "Asia/Thimphu" , 0x01F1B4 }, - { "Asia/Tokyo" , 0x01F21A }, - { "Asia/Ujung_Pandang" , 0x01F2A3 }, - { "Asia/Ulaanbaatar" , 0x01F320 }, - { "Asia/Ulan_Bator" , 0x01F47B }, - { "Asia/Urumqi" , 0x01F5C8 }, - { "Asia/Ust-Nera" , 0x01F68F }, - { "Asia/Vientiane" , 0x01F894 }, - { "Asia/Vladivostok" , 0x01F90C }, - { "Asia/Yakutsk" , 0x01FAF8 }, - { "Asia/Yekaterinburg" , 0x01FCDD }, - { "Asia/Yerevan" , 0x01FEE8 }, - { "Atlantic/Azores" , 0x0200E8 }, - { "Atlantic/Bermuda" , 0x0205EB }, - { "Atlantic/Canary" , 0x0208CC }, - { "Atlantic/Cape_Verde" , 0x020BA2 }, - { "Atlantic/Faeroe" , 0x020C1B }, - { "Atlantic/Faroe" , 0x020EBF }, - { "Atlantic/Jan_Mayen" , 0x021163 }, - { "Atlantic/Madeira" , 0x021495 }, - { "Atlantic/Reykjavik" , 0x02199E }, - { "Atlantic/South_Georgia" , 0x021B57 }, - { "Atlantic/St_Helena" , 0x021D69 }, - { "Atlantic/Stanley" , 0x021B9B }, - { "Australia/ACT" , 0x021DBE }, - { "Australia/Adelaide" , 0x0220DB }, - { "Australia/Brisbane" , 0x022407 }, - { "Australia/Broken_Hill" , 0x0224CE }, - { "Australia/Canberra" , 0x02280C }, - { "Australia/Currie" , 0x022B29 }, - { "Australia/Darwin" , 0x022E5C }, - { "Australia/Eucla" , 0x022EE2 }, - { "Australia/Hobart" , 0x022FB7 }, - { "Australia/LHI" , 0x023315 }, - { "Australia/Lindeman" , 0x0235B0 }, - { "Australia/Lord_Howe" , 0x023691 }, - { "Australia/Melbourne" , 0x02393C }, - { "Australia/North" , 0x023C61 }, - { "Australia/NSW" , 0x023CD5 }, - { "Australia/Perth" , 0x023FF2 }, - { "Australia/Queensland" , 0x0240CA }, - { "Australia/South" , 0x024176 }, - { "Australia/Sydney" , 0x024493 }, - { "Australia/Tasmania" , 0x0247D0 }, - { "Australia/Victoria" , 0x024B15 }, - { "Australia/West" , 0x024E32 }, - { "Australia/Yancowinna" , 0x024EE8 }, - { "Brazil/Acre" , 0x02520A }, - { "Brazil/DeNoronha" , 0x025309 }, - { "Brazil/East" , 0x025429 }, - { "Brazil/West" , 0x025706 }, - { "Canada/Atlantic" , 0x0257FE }, - { "Canada/Central" , 0x025CE6 }, - { "Canada/East-Saskatchewan" , 0x0265F0 }, - { "Canada/Eastern" , 0x026100 }, - { "Canada/Mountain" , 0x026779 }, - { "Canada/Newfoundland" , 0x026AEF }, - { "Canada/Pacific" , 0x02701A }, - { "Canada/Saskatchewan" , 0x027433 }, - { "Canada/Yukon" , 0x0275BC }, - { "CET" , 0x0278BF }, - { "Chile/Continental" , 0x027BC8 }, - { "Chile/EasterIsland" , 0x027F63 }, - { "CST6CDT" , 0x0282A5 }, - { "Cuba" , 0x0285F6 }, - { "EET" , 0x028969 }, - { "Egypt" , 0x028C1C }, - { "Eire" , 0x028EDF }, - { "EST" , 0x0293F0 }, - { "EST5EDT" , 0x029434 }, - { "Etc/GMT" , 0x029785 }, - { "Etc/GMT+0" , 0x029851 }, - { "Etc/GMT+1" , 0x0298DB }, - { "Etc/GMT+10" , 0x029968 }, - { "Etc/GMT+11" , 0x0299F6 }, - { "Etc/GMT+12" , 0x029A84 }, - { "Etc/GMT+2" , 0x029B9F }, - { "Etc/GMT+3" , 0x029C2B }, - { "Etc/GMT+4" , 0x029CB7 }, - { "Etc/GMT+5" , 0x029D43 }, - { "Etc/GMT+6" , 0x029DCF }, - { "Etc/GMT+7" , 0x029E5B }, - { "Etc/GMT+8" , 0x029EE7 }, - { "Etc/GMT+9" , 0x029F73 }, - { "Etc/GMT-0" , 0x02980D }, - { "Etc/GMT-1" , 0x029895 }, - { "Etc/GMT-10" , 0x029921 }, - { "Etc/GMT-11" , 0x0299AF }, - { "Etc/GMT-12" , 0x029A3D }, - { "Etc/GMT-13" , 0x029ACB }, - { "Etc/GMT-14" , 0x029B12 }, - { "Etc/GMT-2" , 0x029B59 }, - { "Etc/GMT-3" , 0x029BE5 }, - { "Etc/GMT-4" , 0x029C71 }, - { "Etc/GMT-5" , 0x029CFD }, - { "Etc/GMT-6" , 0x029D89 }, - { "Etc/GMT-7" , 0x029E15 }, - { "Etc/GMT-8" , 0x029EA1 }, - { "Etc/GMT-9" , 0x029F2D }, - { "Etc/GMT0" , 0x0297C9 }, - { "Etc/Greenwich" , 0x029FB9 }, - { "Etc/UCT" , 0x029FFD }, - { "Etc/Universal" , 0x02A041 }, - { "Etc/UTC" , 0x02A085 }, - { "Etc/Zulu" , 0x02A0C9 }, - { "Europe/Amsterdam" , 0x02A10D }, - { "Europe/Andorra" , 0x02A54B }, - { "Europe/Athens" , 0x02A7C7 }, - { "Europe/Belfast" , 0x02AB0A }, - { "Europe/Belgrade" , 0x02B041 }, - { "Europe/Berlin" , 0x02B30A }, - { "Europe/Bratislava" , 0x02B66E }, - { "Europe/Brussels" , 0x02B9A0 }, - { "Europe/Bucharest" , 0x02BDD7 }, - { "Europe/Budapest" , 0x02C101 }, - { "Europe/Busingen" , 0x02C474 }, - { "Europe/Chisinau" , 0x02C72B }, - { "Europe/Copenhagen" , 0x02CAB9 }, - { "Europe/Dublin" , 0x02CDC3 }, - { "Europe/Gibraltar" , 0x02D2D4 }, - { "Europe/Guernsey" , 0x02D72B }, - { "Europe/Helsinki" , 0x02DC62 }, - { "Europe/Isle_of_Man" , 0x02DF18 }, - { "Europe/Istanbul" , 0x02E44F }, - { "Europe/Jersey" , 0x02E83C }, - { "Europe/Kaliningrad" , 0x02ED73 }, - { "Europe/Kiev" , 0x02EFD9 }, - { "Europe/Lisbon" , 0x02F2F0 }, - { "Europe/Ljubljana" , 0x02F7F4 }, - { "Europe/London" , 0x02FABD }, - { "Europe/Luxembourg" , 0x02FFF4 }, - { "Europe/Madrid" , 0x03044A }, - { "Europe/Malta" , 0x030810 }, - { "Europe/Mariehamn" , 0x030BC9 }, - { "Europe/Minsk" , 0x030E7F }, - { "Europe/Monaco" , 0x03108D }, - { "Europe/Moscow" , 0x0314C8 }, - { "Europe/Nicosia" , 0x031719 }, - { "Europe/Oslo" , 0x031A01 }, - { "Europe/Paris" , 0x031D33 }, - { "Europe/Podgorica" , 0x032179 }, - { "Europe/Prague" , 0x032442 }, - { "Europe/Riga" , 0x032774 }, - { "Europe/Rome" , 0x032AB9 }, - { "Europe/Samara" , 0x032E7C }, - { "Europe/San_Marino" , 0x0330AF }, - { "Europe/Sarajevo" , 0x033472 }, - { "Europe/Simferopol" , 0x03373B }, - { "Europe/Skopje" , 0x033A66 }, - { "Europe/Sofia" , 0x033D2F }, - { "Europe/Stockholm" , 0x034037 }, - { "Europe/Tallinn" , 0x0342E6 }, - { "Europe/Tirane" , 0x034620 }, - { "Europe/Tiraspol" , 0x034926 }, - { "Europe/Uzhgorod" , 0x034CB4 }, - { "Europe/Vaduz" , 0x034FCB }, - { "Europe/Vatican" , 0x03527A }, - { "Europe/Vienna" , 0x03563D }, - { "Europe/Vilnius" , 0x03596A }, - { "Europe/Volgograd" , 0x035CA9 }, - { "Europe/Warsaw" , 0x035EA9 }, - { "Europe/Zagreb" , 0x03628A }, - { "Europe/Zaporozhye" , 0x036553 }, - { "Europe/Zurich" , 0x036894 }, - { "Factory" , 0x036B43 }, - { "GB" , 0x036BB4 }, - { "GB-Eire" , 0x0370EB }, - { "GMT" , 0x037622 }, - { "GMT+0" , 0x0376EE }, - { "GMT-0" , 0x0376AA }, - { "GMT0" , 0x037666 }, - { "Greenwich" , 0x037732 }, - { "Hongkong" , 0x037776 }, - { "HST" , 0x037938 }, - { "Iceland" , 0x03797C }, - { "Indian/Antananarivo" , 0x037B35 }, - { "Indian/Chagos" , 0x037BA9 }, - { "Indian/Christmas" , 0x037C0B }, - { "Indian/Cocos" , 0x037C4F }, - { "Indian/Comoro" , 0x037C93 }, - { "Indian/Kerguelen" , 0x037CE8 }, - { "Indian/Mahe" , 0x037D3D }, - { "Indian/Maldives" , 0x037D92 }, - { "Indian/Mauritius" , 0x037DE7 }, - { "Indian/Mayotte" , 0x037E5D }, - { "Indian/Reunion" , 0x037EB2 }, - { "Iran" , 0x037F07 }, - { "Israel" , 0x038175 }, - { "Jamaica" , 0x0384A4 }, - { "Japan" , 0x038569 }, - { "Kwajalein" , 0x0385F2 }, - { "Libya" , 0x038655 }, - { "MET" , 0x03884E }, - { "Mexico/BajaNorte" , 0x038B57 }, - { "Mexico/BajaSur" , 0x038EC0 }, - { "Mexico/General" , 0x039105 }, - { "MST" , 0x039363 }, - { "MST7MDT" , 0x0393A7 }, - { "Navajo" , 0x0396F8 }, - { "NZ" , 0x039A71 }, - { "NZ-CHAT" , 0x039DEF }, - { "Pacific/Apia" , 0x03A0D7 }, - { "Pacific/Auckland" , 0x03A273 }, - { "Pacific/Chatham" , 0x03A5FF }, - { "Pacific/Chuuk" , 0x03A8F6 }, - { "Pacific/Easter" , 0x03A94F }, - { "Pacific/Efate" , 0x03ACAD }, - { "Pacific/Enderbury" , 0x03AD73 }, - { "Pacific/Fakaofo" , 0x03ADE1 }, - { "Pacific/Fiji" , 0x03AE32 }, - { "Pacific/Funafuti" , 0x03AFC5 }, - { "Pacific/Galapagos" , 0x03B009 }, - { "Pacific/Gambier" , 0x03B081 }, - { "Pacific/Guadalcanal" , 0x03B0E6 }, - { "Pacific/Guam" , 0x03B13B }, - { "Pacific/Honolulu" , 0x03B191 }, - { "Pacific/Johnston" , 0x03B208 }, - { "Pacific/Kiritimati" , 0x03B287 }, - { "Pacific/Kosrae" , 0x03B2F2 }, - { "Pacific/Kwajalein" , 0x03B34F }, - { "Pacific/Majuro" , 0x03B3BB }, - { "Pacific/Marquesas" , 0x03B41A }, - { "Pacific/Midway" , 0x03B481 }, - { "Pacific/Nauru" , 0x03B50B }, - { "Pacific/Niue" , 0x03B583 }, - { "Pacific/Norfolk" , 0x03B5E1 }, - { "Pacific/Noumea" , 0x03B636 }, - { "Pacific/Pago_Pago" , 0x03B6C6 }, - { "Pacific/Palau" , 0x03B74F }, - { "Pacific/Pitcairn" , 0x03B793 }, - { "Pacific/Pohnpei" , 0x03B7E8 }, - { "Pacific/Ponape" , 0x03B83D }, - { "Pacific/Port_Moresby" , 0x03B882 }, - { "Pacific/Rarotonga" , 0x03B8C6 }, - { "Pacific/Saipan" , 0x03B9A2 }, - { "Pacific/Samoa" , 0x03BA05 }, - { "Pacific/Tahiti" , 0x03BA8E }, - { "Pacific/Tarawa" , 0x03BAF3 }, - { "Pacific/Tongatapu" , 0x03BB47 }, - { "Pacific/Truk" , 0x03BBD3 }, - { "Pacific/Wake" , 0x03BC18 }, - { "Pacific/Wallis" , 0x03BC68 }, - { "Pacific/Yap" , 0x03BCAC }, - { "Poland" , 0x03BCF1 }, - { "Portugal" , 0x03C0D2 }, - { "PRC" , 0x03C5CE }, - { "PST8PDT" , 0x03C67F }, - { "ROC" , 0x03C9D0 }, - { "ROK" , 0x03CAE8 }, - { "Singapore" , 0x03CB8C }, - { "Turkey" , 0x03CC43 }, - { "UCT" , 0x03D030 }, - { "Universal" , 0x03D074 }, - { "US/Alaska" , 0x03D0B8 }, - { "US/Aleutian" , 0x03D421 }, - { "US/Arizona" , 0x03D787 }, - { "US/Central" , 0x03D815 }, - { "US/East-Indiana" , 0x03E21F }, - { "US/Eastern" , 0x03DD20 }, - { "US/Hawaii" , 0x03E489 }, - { "US/Indiana-Starke" , 0x03E4FA }, - { "US/Michigan" , 0x03E86B }, - { "US/Mountain" , 0x03EBA2 }, - { "US/Pacific" , 0x03EF1B }, - { "US/Pacific-New" , 0x03F320 }, - { "US/Samoa" , 0x03F725 }, - { "UTC" , 0x03F7AE }, - { "W-SU" , 0x03FAA5 }, - { "WET" , 0x03F7F2 }, - { "Zulu" , 0x03FCDF }, + { "Africa/Freetown" , 0x0011F4 }, + { "Africa/Gaborone" , 0x001303 }, + { "Africa/Harare" , 0x001370 }, + { "Africa/Johannesburg" , 0x0013C5 }, + { "Africa/Juba" , 0x001433 }, + { "Africa/Kampala" , 0x001546 }, + { "Africa/Khartoum" , 0x0015C5 }, + { "Africa/Kigali" , 0x0016D8 }, + { "Africa/Kinshasa" , 0x00172D }, + { "Africa/Lagos" , 0x001788 }, + { "Africa/Libreville" , 0x0017DD }, + { "Africa/Lome" , 0x001832 }, + { "Africa/Luanda" , 0x001876 }, + { "Africa/Lubumbashi" , 0x0018CB }, + { "Africa/Lusaka" , 0x001926 }, + { "Africa/Malabo" , 0x00197B }, + { "Africa/Maputo" , 0x0019E1 }, + { "Africa/Maseru" , 0x001A36 }, + { "Africa/Mbabane" , 0x001A9E }, + { "Africa/Mogadishu" , 0x001AF4 }, + { "Africa/Monrovia" , 0x001B4F }, + { "Africa/Nairobi" , 0x001BB5 }, + { "Africa/Ndjamena" , 0x001C34 }, + { "Africa/Niamey" , 0x001CA0 }, + { "Africa/Nouakchott" , 0x001D13 }, + { "Africa/Ouagadougou" , 0x001D7E }, + { "Africa/Porto-Novo" , 0x001DD3 }, + { "Africa/Sao_Tome" , 0x001E39 }, + { "Africa/Timbuktu" , 0x001E8E }, + { "Africa/Tripoli" , 0x001EF9 }, + { "Africa/Tunis" , 0x002002 }, + { "Africa/Windhoek" , 0x002114 }, + { "America/Adak" , 0x00235B }, + { "America/Anchorage" , 0x0026D1 }, + { "America/Anguilla" , 0x002A45 }, + { "America/Antigua" , 0x002A9A }, + { "America/Araguaina" , 0x002B00 }, + { "America/Argentina/Buenos_Aires" , 0x002C65 }, + { "America/Argentina/Catamarca" , 0x002E13 }, + { "America/Argentina/ComodRivadavia" , 0x002FD4 }, + { "America/Argentina/Cordoba" , 0x00317A }, + { "America/Argentina/Jujuy" , 0x00334F }, + { "America/Argentina/La_Rioja" , 0x003503 }, + { "America/Argentina/Mendoza" , 0x0036BB }, + { "America/Argentina/Rio_Gallegos" , 0x00387B }, + { "America/Argentina/Salta" , 0x003A30 }, + { "America/Argentina/San_Juan" , 0x003BDC }, + { "America/Argentina/San_Luis" , 0x003D94 }, + { "America/Argentina/Tucuman" , 0x003F5A }, + { "America/Argentina/Ushuaia" , 0x004116 }, + { "America/Aruba" , 0x0042D1 }, + { "America/Asuncion" , 0x004337 }, + { "America/Atikokan" , 0x00461C }, + { "America/Atka" , 0x0046F2 }, + { "America/Bahia" , 0x004A58 }, + { "America/Bahia_Banderas" , 0x004BEB }, + { "America/Barbados" , 0x004E64 }, + { "America/Belem" , 0x004EFE }, + { "America/Belize" , 0x004FF9 }, + { "America/Blanc-Sablon" , 0x005175 }, + { "America/Boa_Vista" , 0x005229 }, + { "America/Bogota" , 0x005332 }, + { "America/Boise" , 0x00539E }, + { "America/Buenos_Aires" , 0x005735 }, + { "America/Cambridge_Bay" , 0x0058CE }, + { "America/Campo_Grande" , 0x005BF6 }, + { "America/Cancun" , 0x005EE5 }, + { "America/Caracas" , 0x006127 }, + { "America/Catamarca" , 0x00618E }, + { "America/Cayenne" , 0x006334 }, + { "America/Cayman" , 0x006396 }, + { "America/Chicago" , 0x0063EB }, + { "America/Chihuahua" , 0x006902 }, + { "America/Coral_Harbour" , 0x006B6D }, + { "America/Cordoba" , 0x006BFF }, + { "America/Costa_Rica" , 0x006DA5 }, + { "America/Creston" , 0x006E2F }, + { "America/Cuiaba" , 0x006EBB }, + { "America/Curacao" , 0x007199 }, + { "America/Danmarkshavn" , 0x0071FF }, + { "America/Dawson" , 0x007343 }, + { "America/Dawson_Creek" , 0x007660 }, + { "America/Denver" , 0x00783A }, + { "America/Detroit" , 0x007BC0 }, + { "America/Dominica" , 0x007F1F }, + { "America/Edmonton" , 0x007F74 }, + { "America/Eirunepe" , 0x00832C }, + { "America/El_Salvador" , 0x008444 }, + { "America/Ensenada" , 0x0084B9 }, + { "America/Fort_Wayne" , 0x008960 }, + { "America/Fortaleza" , 0x008822 }, + { "America/Glace_Bay" , 0x008BCA }, + { "America/Godthab" , 0x008F41 }, + { "America/Goose_Bay" , 0x009205 }, + { "America/Grand_Turk" , 0x0096C2 }, + { "America/Grenada" , 0x009971 }, + { "America/Guadeloupe" , 0x0099C6 }, + { "America/Guatemala" , 0x009A1B }, + { "America/Guayaquil" , 0x009AA4 }, + { "America/Guyana" , 0x009B01 }, + { "America/Halifax" , 0x009B82 }, + { "America/Havana" , 0x00A098 }, + { "America/Hermosillo" , 0x00A40B }, + { "America/Indiana/Indianapolis" , 0x00A4E9 }, + { "America/Indiana/Knox" , 0x00A77A }, + { "America/Indiana/Marengo" , 0x00AB11 }, + { "America/Indiana/Petersburg" , 0x00ADB7 }, + { "America/Indiana/Tell_City" , 0x00B304 }, + { "America/Indiana/Vevay" , 0x00B59D }, + { "America/Indiana/Vincennes" , 0x00B7D8 }, + { "America/Indiana/Winamac" , 0x00BA8C }, + { "America/Indianapolis" , 0x00B09A }, + { "America/Inuvik" , 0x00BD45 }, + { "America/Iqaluit" , 0x00C03C }, + { "America/Jamaica" , 0x00C35E }, + { "America/Jujuy" , 0x00C423 }, + { "America/Juneau" , 0x00C5CD }, + { "America/Kentucky/Louisville" , 0x00C94B }, + { "America/Kentucky/Monticello" , 0x00CD69 }, + { "America/Knox_IN" , 0x00D0EE }, + { "America/Kralendijk" , 0x00D45F }, + { "America/La_Paz" , 0x00D4C5 }, + { "America/Lima" , 0x00D52C }, + { "America/Los_Angeles" , 0x00D5D4 }, + { "America/Louisville" , 0x00D9E5 }, + { "America/Lower_Princes" , 0x00DDDA }, + { "America/Maceio" , 0x00DE40 }, + { "America/Managua" , 0x00DF7A }, + { "America/Manaus" , 0x00E02D }, + { "America/Marigot" , 0x00E12F }, + { "America/Martinique" , 0x00E184 }, + { "America/Matamoros" , 0x00E1F0 }, + { "America/Mazatlan" , 0x00E449 }, + { "America/Mendoza" , 0x00E6B6 }, + { "America/Menominee" , 0x00E86A }, + { "America/Merida" , 0x00EBEB }, + { "America/Metlakatla" , 0x00EE26 }, + { "America/Mexico_City" , 0x00EF60 }, + { "America/Miquelon" , 0x00F1DB }, + { "America/Moncton" , 0x00F44D }, + { "America/Monterrey" , 0x00F8E4 }, + { "America/Montevideo" , 0x00FB47 }, + { "America/Montreal" , 0x00FE59 }, + { "America/Montserrat" , 0x010349 }, + { "America/Nassau" , 0x01039E }, + { "America/New_York" , 0x0106E3 }, + { "America/Nipigon" , 0x010BEE }, + { "America/Nome" , 0x010F3F }, + { "America/Noronha" , 0x0112BD }, + { "America/North_Dakota/Beulah" , 0x0113ED }, + { "America/North_Dakota/Center" , 0x011781 }, + { "America/North_Dakota/New_Salem" , 0x011B15 }, + { "America/Ojinaga" , 0x011EBE }, + { "America/Panama" , 0x01211F }, + { "America/Pangnirtung" , 0x012174 }, + { "America/Paramaribo" , 0x0124AA }, + { "America/Phoenix" , 0x01253C }, + { "America/Port-au-Prince" , 0x0125FA }, + { "America/Port_of_Spain" , 0x01291E }, + { "America/Porto_Acre" , 0x01281A }, + { "America/Porto_Velho" , 0x012973 }, + { "America/Puerto_Rico" , 0x012A69 }, + { "America/Rainy_River" , 0x012AD4 }, + { "America/Rankin_Inlet" , 0x012E0C }, + { "America/Recife" , 0x0130F2 }, + { "America/Regina" , 0x01321C }, + { "America/Resolute" , 0x0133DA }, + { "America/Rio_Branco" , 0x0136CB }, + { "America/Rosario" , 0x0137D3 }, + { "America/Santa_Isabel" , 0x013979 }, + { "America/Santarem" , 0x013D1C }, + { "America/Santiago" , 0x013E21 }, + { "America/Santo_Domingo" , 0x0141CA }, + { "America/Sao_Paulo" , 0x014290 }, + { "America/Scoresbysund" , 0x01459F }, + { "America/Shiprock" , 0x01488D }, + { "America/Sitka" , 0x014C06 }, + { "America/St_Barthelemy" , 0x014F8E }, + { "America/St_Johns" , 0x014FE3 }, + { "America/St_Kitts" , 0x015536 }, + { "America/St_Lucia" , 0x01558B }, + { "America/St_Thomas" , 0x0155E0 }, + { "America/St_Vincent" , 0x015635 }, + { "America/Swift_Current" , 0x01568A }, + { "America/Tegucigalpa" , 0x0157AB }, + { "America/Thule" , 0x01582A }, + { "America/Thunder_Bay" , 0x015A71 }, + { "America/Tijuana" , 0x015DBA }, + { "America/Toronto" , 0x016153 }, + { "America/Tortola" , 0x016673 }, + { "America/Vancouver" , 0x0166C8 }, + { "America/Virgin" , 0x016B05 }, + { "America/Whitehorse" , 0x016B5A }, + { "America/Winnipeg" , 0x016E77 }, + { "America/Yakutat" , 0x0172B7 }, + { "America/Yellowknife" , 0x017622 }, + { "Antarctica/Casey" , 0x017932 }, + { "Antarctica/Davis" , 0x0179CF }, + { "Antarctica/DumontDUrville" , 0x017A70 }, + { "Antarctica/Macquarie" , 0x017B02 }, + { "Antarctica/Mawson" , 0x017D49 }, + { "Antarctica/McMurdo" , 0x017DC5 }, + { "Antarctica/Palmer" , 0x018170 }, + { "Antarctica/Rothera" , 0x01848C }, + { "Antarctica/South_Pole" , 0x018502 }, + { "Antarctica/Syowa" , 0x018880 }, + { "Antarctica/Vostok" , 0x0188EE }, + { "Arctic/Longyearbyen" , 0x01895F }, + { "Asia/Aden" , 0x018C91 }, + { "Asia/Almaty" , 0x018CE6 }, + { "Asia/Amman" , 0x018E65 }, + { "Asia/Anadyr" , 0x019037 }, + { "Asia/Aqtau" , 0x01921C }, + { "Asia/Aqtobe" , 0x01941B }, + { "Asia/Ashgabat" , 0x0195D3 }, + { "Asia/Ashkhabad" , 0x0196F0 }, + { "Asia/Baghdad" , 0x01980D }, + { "Asia/Bahrain" , 0x019982 }, + { "Asia/Baku" , 0x0199E8 }, + { "Asia/Bangkok" , 0x019CD0 }, + { "Asia/Beirut" , 0x019D25 }, + { "Asia/Bishkek" , 0x01A032 }, + { "Asia/Brunei" , 0x01A1DE }, + { "Asia/Calcutta" , 0x01A240 }, + { "Asia/Choibalsan" , 0x01A2B9 }, + { "Asia/Chongqing" , 0x01A432 }, + { "Asia/Chungking" , 0x01A521 }, + { "Asia/Colombo" , 0x01A5D0 }, + { "Asia/Dacca" , 0x01A66C }, + { "Asia/Damascus" , 0x01A712 }, + { "Asia/Dhaka" , 0x01AA62 }, + { "Asia/Dili" , 0x01AB08 }, + { "Asia/Dubai" , 0x01AB92 }, + { "Asia/Dushanbe" , 0x01ABE7 }, + { "Asia/Gaza" , 0x01ACEA }, + { "Asia/Harbin" , 0x01B03D }, + { "Asia/Hebron" , 0x01B124 }, + { "Asia/Ho_Chi_Minh" , 0x01B480 }, + { "Asia/Hong_Kong" , 0x01B4F8 }, + { "Asia/Hovd" , 0x01B6BA }, + { "Asia/Irkutsk" , 0x01B832 }, + { "Asia/Istanbul" , 0x01BA18 }, + { "Asia/Jakarta" , 0x01BE05 }, + { "Asia/Jayapura" , 0x01BEAF }, + { "Asia/Jerusalem" , 0x01BF4B }, + { "Asia/Kabul" , 0x01C27A }, + { "Asia/Kamchatka" , 0x01C2CB }, + { "Asia/Karachi" , 0x01C4A7 }, + { "Asia/Kashgar" , 0x01C55C }, + { "Asia/Kathmandu" , 0x01C62D }, + { "Asia/Katmandu" , 0x01C693 }, + { "Asia/Khandyga" , 0x01C6F9 }, + { "Asia/Kolkata" , 0x01C91E }, + { "Asia/Krasnoyarsk" , 0x01C997 }, + { "Asia/Kuala_Lumpur" , 0x01CB7F }, + { "Asia/Kuching" , 0x01CC3C }, + { "Asia/Kuwait" , 0x01CD2A }, + { "Asia/Macao" , 0x01CD7F }, + { "Asia/Macau" , 0x01CEBA }, + { "Asia/Magadan" , 0x01CFF5 }, + { "Asia/Makassar" , 0x01D1D7 }, + { "Asia/Manila" , 0x01D29C }, + { "Asia/Muscat" , 0x01D321 }, + { "Asia/Nicosia" , 0x01D376 }, + { "Asia/Novokuznetsk" , 0x01D65E }, + { "Asia/Novosibirsk" , 0x01D860 }, + { "Asia/Omsk" , 0x01DA4B }, + { "Asia/Oral" , 0x01DC32 }, + { "Asia/Phnom_Penh" , 0x01DE02 }, + { "Asia/Pontianak" , 0x01DE7A }, + { "Asia/Pyongyang" , 0x01DF3C }, + { "Asia/Qatar" , 0x01DFA9 }, + { "Asia/Qyzylorda" , 0x01E00F }, + { "Asia/Rangoon" , 0x01E1E5 }, + { "Asia/Riyadh" , 0x01E25D }, + { "Asia/Saigon" , 0x01E2B2 }, + { "Asia/Sakhalin" , 0x01E32A }, + { "Asia/Samarkand" , 0x01E521 }, + { "Asia/Seoul" , 0x01E657 }, + { "Asia/Shanghai" , 0x01E6FB }, + { "Asia/Singapore" , 0x01E7DB }, + { "Asia/Taipei" , 0x01E892 }, + { "Asia/Tashkent" , 0x01E9AA }, + { "Asia/Tbilisi" , 0x01EADB }, + { "Asia/Tehran" , 0x01EC95 }, + { "Asia/Tel_Aviv" , 0x01EF03 }, + { "Asia/Thimbu" , 0x01F232 }, + { "Asia/Thimphu" , 0x01F298 }, + { "Asia/Tokyo" , 0x01F2FE }, + { "Asia/Ujung_Pandang" , 0x01F387 }, + { "Asia/Ulaanbaatar" , 0x01F404 }, + { "Asia/Ulan_Bator" , 0x01F55F }, + { "Asia/Urumqi" , 0x01F6AC }, + { "Asia/Ust-Nera" , 0x01F773 }, + { "Asia/Vientiane" , 0x01F978 }, + { "Asia/Vladivostok" , 0x01F9F0 }, + { "Asia/Yakutsk" , 0x01FBDC }, + { "Asia/Yekaterinburg" , 0x01FDC1 }, + { "Asia/Yerevan" , 0x01FFCC }, + { "Atlantic/Azores" , 0x0201CC }, + { "Atlantic/Bermuda" , 0x0206CF }, + { "Atlantic/Canary" , 0x0209B0 }, + { "Atlantic/Cape_Verde" , 0x020C86 }, + { "Atlantic/Faeroe" , 0x020CFF }, + { "Atlantic/Faroe" , 0x020FA3 }, + { "Atlantic/Jan_Mayen" , 0x021247 }, + { "Atlantic/Madeira" , 0x021579 }, + { "Atlantic/Reykjavik" , 0x021A82 }, + { "Atlantic/South_Georgia" , 0x021C3B }, + { "Atlantic/St_Helena" , 0x021E4D }, + { "Atlantic/Stanley" , 0x021C7F }, + { "Australia/ACT" , 0x021EA2 }, + { "Australia/Adelaide" , 0x0221BF }, + { "Australia/Brisbane" , 0x0224EB }, + { "Australia/Broken_Hill" , 0x0225B2 }, + { "Australia/Canberra" , 0x0228F0 }, + { "Australia/Currie" , 0x022C0D }, + { "Australia/Darwin" , 0x022F40 }, + { "Australia/Eucla" , 0x022FC6 }, + { "Australia/Hobart" , 0x02309B }, + { "Australia/LHI" , 0x0233F9 }, + { "Australia/Lindeman" , 0x023694 }, + { "Australia/Lord_Howe" , 0x023775 }, + { "Australia/Melbourne" , 0x023A20 }, + { "Australia/North" , 0x023D45 }, + { "Australia/NSW" , 0x023DB9 }, + { "Australia/Perth" , 0x0240D6 }, + { "Australia/Queensland" , 0x0241AE }, + { "Australia/South" , 0x02425A }, + { "Australia/Sydney" , 0x024577 }, + { "Australia/Tasmania" , 0x0248B4 }, + { "Australia/Victoria" , 0x024BF9 }, + { "Australia/West" , 0x024F16 }, + { "Australia/Yancowinna" , 0x024FCC }, + { "Brazil/Acre" , 0x0252EE }, + { "Brazil/DeNoronha" , 0x0253F2 }, + { "Brazil/East" , 0x025512 }, + { "Brazil/West" , 0x0257EF }, + { "Canada/Atlantic" , 0x0258E7 }, + { "Canada/Central" , 0x025DCF }, + { "Canada/East-Saskatchewan" , 0x0266D9 }, + { "Canada/Eastern" , 0x0261E9 }, + { "Canada/Mountain" , 0x026862 }, + { "Canada/Newfoundland" , 0x026BD8 }, + { "Canada/Pacific" , 0x027103 }, + { "Canada/Saskatchewan" , 0x02751C }, + { "Canada/Yukon" , 0x0276A5 }, + { "CET" , 0x0279A8 }, + { "Chile/Continental" , 0x027CB1 }, + { "Chile/EasterIsland" , 0x02804C }, + { "CST6CDT" , 0x02838E }, + { "Cuba" , 0x0286DF }, + { "EET" , 0x028A52 }, + { "Egypt" , 0x028D05 }, + { "Eire" , 0x028FC8 }, + { "EST" , 0x0294D9 }, + { "EST5EDT" , 0x02951D }, + { "Etc/GMT" , 0x02986E }, + { "Etc/GMT+0" , 0x02993A }, + { "Etc/GMT+1" , 0x0299C4 }, + { "Etc/GMT+10" , 0x029A51 }, + { "Etc/GMT+11" , 0x029ADF }, + { "Etc/GMT+12" , 0x029B6D }, + { "Etc/GMT+2" , 0x029C88 }, + { "Etc/GMT+3" , 0x029D14 }, + { "Etc/GMT+4" , 0x029DA0 }, + { "Etc/GMT+5" , 0x029E2C }, + { "Etc/GMT+6" , 0x029EB8 }, + { "Etc/GMT+7" , 0x029F44 }, + { "Etc/GMT+8" , 0x029FD0 }, + { "Etc/GMT+9" , 0x02A05C }, + { "Etc/GMT-0" , 0x0298F6 }, + { "Etc/GMT-1" , 0x02997E }, + { "Etc/GMT-10" , 0x029A0A }, + { "Etc/GMT-11" , 0x029A98 }, + { "Etc/GMT-12" , 0x029B26 }, + { "Etc/GMT-13" , 0x029BB4 }, + { "Etc/GMT-14" , 0x029BFB }, + { "Etc/GMT-2" , 0x029C42 }, + { "Etc/GMT-3" , 0x029CCE }, + { "Etc/GMT-4" , 0x029D5A }, + { "Etc/GMT-5" , 0x029DE6 }, + { "Etc/GMT-6" , 0x029E72 }, + { "Etc/GMT-7" , 0x029EFE }, + { "Etc/GMT-8" , 0x029F8A }, + { "Etc/GMT-9" , 0x02A016 }, + { "Etc/GMT0" , 0x0298B2 }, + { "Etc/Greenwich" , 0x02A0A2 }, + { "Etc/UCT" , 0x02A0E6 }, + { "Etc/Universal" , 0x02A12A }, + { "Etc/UTC" , 0x02A16E }, + { "Etc/Zulu" , 0x02A1B2 }, + { "Europe/Amsterdam" , 0x02A1F6 }, + { "Europe/Andorra" , 0x02A634 }, + { "Europe/Athens" , 0x02A8B0 }, + { "Europe/Belfast" , 0x02ABF3 }, + { "Europe/Belgrade" , 0x02B12A }, + { "Europe/Berlin" , 0x02B3F3 }, + { "Europe/Bratislava" , 0x02B757 }, + { "Europe/Brussels" , 0x02BA89 }, + { "Europe/Bucharest" , 0x02BEC0 }, + { "Europe/Budapest" , 0x02C1EA }, + { "Europe/Busingen" , 0x02C55D }, + { "Europe/Chisinau" , 0x02C814 }, + { "Europe/Copenhagen" , 0x02CBA2 }, + { "Europe/Dublin" , 0x02CEAC }, + { "Europe/Gibraltar" , 0x02D3BD }, + { "Europe/Guernsey" , 0x02D814 }, + { "Europe/Helsinki" , 0x02DD4B }, + { "Europe/Isle_of_Man" , 0x02E001 }, + { "Europe/Istanbul" , 0x02E538 }, + { "Europe/Jersey" , 0x02E925 }, + { "Europe/Kaliningrad" , 0x02EE5C }, + { "Europe/Kiev" , 0x02F0C2 }, + { "Europe/Lisbon" , 0x02F3D9 }, + { "Europe/Ljubljana" , 0x02F8DD }, + { "Europe/London" , 0x02FBA6 }, + { "Europe/Luxembourg" , 0x0300DD }, + { "Europe/Madrid" , 0x030533 }, + { "Europe/Malta" , 0x0308F9 }, + { "Europe/Mariehamn" , 0x030CB2 }, + { "Europe/Minsk" , 0x030F68 }, + { "Europe/Monaco" , 0x031176 }, + { "Europe/Moscow" , 0x0315B1 }, + { "Europe/Nicosia" , 0x031802 }, + { "Europe/Oslo" , 0x031AEA }, + { "Europe/Paris" , 0x031E1C }, + { "Europe/Podgorica" , 0x032262 }, + { "Europe/Prague" , 0x03252B }, + { "Europe/Riga" , 0x03285D }, + { "Europe/Rome" , 0x032BA2 }, + { "Europe/Samara" , 0x032F65 }, + { "Europe/San_Marino" , 0x033198 }, + { "Europe/Sarajevo" , 0x03355B }, + { "Europe/Simferopol" , 0x033824 }, + { "Europe/Skopje" , 0x033B4F }, + { "Europe/Sofia" , 0x033E18 }, + { "Europe/Stockholm" , 0x034120 }, + { "Europe/Tallinn" , 0x0343CF }, + { "Europe/Tirane" , 0x034709 }, + { "Europe/Tiraspol" , 0x034A0F }, + { "Europe/Uzhgorod" , 0x034D9D }, + { "Europe/Vaduz" , 0x0350B4 }, + { "Europe/Vatican" , 0x035363 }, + { "Europe/Vienna" , 0x035726 }, + { "Europe/Vilnius" , 0x035A53 }, + { "Europe/Volgograd" , 0x035D92 }, + { "Europe/Warsaw" , 0x035F92 }, + { "Europe/Zagreb" , 0x036373 }, + { "Europe/Zaporozhye" , 0x03663C }, + { "Europe/Zurich" , 0x03697D }, + { "Factory" , 0x036C2C }, + { "GB" , 0x036C9D }, + { "GB-Eire" , 0x0371D4 }, + { "GMT" , 0x03770B }, + { "GMT+0" , 0x0377D7 }, + { "GMT-0" , 0x037793 }, + { "GMT0" , 0x03774F }, + { "Greenwich" , 0x03781B }, + { "Hongkong" , 0x03785F }, + { "HST" , 0x037A21 }, + { "Iceland" , 0x037A65 }, + { "Indian/Antananarivo" , 0x037C1E }, + { "Indian/Chagos" , 0x037C92 }, + { "Indian/Christmas" , 0x037CF4 }, + { "Indian/Cocos" , 0x037D38 }, + { "Indian/Comoro" , 0x037D7C }, + { "Indian/Kerguelen" , 0x037DD1 }, + { "Indian/Mahe" , 0x037E26 }, + { "Indian/Maldives" , 0x037E7B }, + { "Indian/Mauritius" , 0x037ED0 }, + { "Indian/Mayotte" , 0x037F46 }, + { "Indian/Reunion" , 0x037F9B }, + { "Iran" , 0x037FF0 }, + { "Israel" , 0x03825E }, + { "Jamaica" , 0x03858D }, + { "Japan" , 0x038652 }, + { "Kwajalein" , 0x0386DB }, + { "Libya" , 0x03873E }, + { "MET" , 0x038847 }, + { "Mexico/BajaNorte" , 0x038B50 }, + { "Mexico/BajaSur" , 0x038EB9 }, + { "Mexico/General" , 0x0390FE }, + { "MST" , 0x03935C }, + { "MST7MDT" , 0x0393A0 }, + { "Navajo" , 0x0396F1 }, + { "NZ" , 0x039A6A }, + { "NZ-CHAT" , 0x039DE8 }, + { "Pacific/Apia" , 0x03A0D0 }, + { "Pacific/Auckland" , 0x03A26C }, + { "Pacific/Chatham" , 0x03A5F8 }, + { "Pacific/Chuuk" , 0x03A8EF }, + { "Pacific/Easter" , 0x03A948 }, + { "Pacific/Efate" , 0x03ACA6 }, + { "Pacific/Enderbury" , 0x03AD6C }, + { "Pacific/Fakaofo" , 0x03ADDA }, + { "Pacific/Fiji" , 0x03AE2B }, + { "Pacific/Funafuti" , 0x03AFBE }, + { "Pacific/Galapagos" , 0x03B002 }, + { "Pacific/Gambier" , 0x03B07A }, + { "Pacific/Guadalcanal" , 0x03B0DF }, + { "Pacific/Guam" , 0x03B134 }, + { "Pacific/Honolulu" , 0x03B18A }, + { "Pacific/Johnston" , 0x03B201 }, + { "Pacific/Kiritimati" , 0x03B280 }, + { "Pacific/Kosrae" , 0x03B2EB }, + { "Pacific/Kwajalein" , 0x03B348 }, + { "Pacific/Majuro" , 0x03B3B4 }, + { "Pacific/Marquesas" , 0x03B413 }, + { "Pacific/Midway" , 0x03B47A }, + { "Pacific/Nauru" , 0x03B504 }, + { "Pacific/Niue" , 0x03B57C }, + { "Pacific/Norfolk" , 0x03B5DA }, + { "Pacific/Noumea" , 0x03B62F }, + { "Pacific/Pago_Pago" , 0x03B6BF }, + { "Pacific/Palau" , 0x03B748 }, + { "Pacific/Pitcairn" , 0x03B78C }, + { "Pacific/Pohnpei" , 0x03B7E1 }, + { "Pacific/Ponape" , 0x03B836 }, + { "Pacific/Port_Moresby" , 0x03B87B }, + { "Pacific/Rarotonga" , 0x03B8BF }, + { "Pacific/Saipan" , 0x03B99B }, + { "Pacific/Samoa" , 0x03B9FE }, + { "Pacific/Tahiti" , 0x03BA87 }, + { "Pacific/Tarawa" , 0x03BAEC }, + { "Pacific/Tongatapu" , 0x03BB40 }, + { "Pacific/Truk" , 0x03BBCC }, + { "Pacific/Wake" , 0x03BC11 }, + { "Pacific/Wallis" , 0x03BC61 }, + { "Pacific/Yap" , 0x03BCA5 }, + { "Poland" , 0x03BCEA }, + { "Portugal" , 0x03C0CB }, + { "PRC" , 0x03C5C7 }, + { "PST8PDT" , 0x03C678 }, + { "ROC" , 0x03C9C9 }, + { "ROK" , 0x03CAE1 }, + { "Singapore" , 0x03CB85 }, + { "Turkey" , 0x03CC3C }, + { "UCT" , 0x03D029 }, + { "Universal" , 0x03D06D }, + { "US/Alaska" , 0x03D0B1 }, + { "US/Aleutian" , 0x03D41A }, + { "US/Arizona" , 0x03D780 }, + { "US/Central" , 0x03D80E }, + { "US/East-Indiana" , 0x03E218 }, + { "US/Eastern" , 0x03DD19 }, + { "US/Hawaii" , 0x03E482 }, + { "US/Indiana-Starke" , 0x03E4F3 }, + { "US/Michigan" , 0x03E864 }, + { "US/Mountain" , 0x03EB9B }, + { "US/Pacific" , 0x03EF14 }, + { "US/Pacific-New" , 0x03F319 }, + { "US/Samoa" , 0x03F71E }, + { "UTC" , 0x03F7A7 }, + { "W-SU" , 0x03FA9E }, + { "WET" , 0x03F7EB }, + { "Zulu" , 0x03FCD8 }, }; /* This is a generated file, do not modify */ -const unsigned char timelib_timezone_db_data_builtin[261411] = { +const unsigned char timelib_timezone_db_data_builtin[261404] = { /* Africa/Abidjan */ @@ -892,12 +892,40 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { /* Africa/El_Aaiun */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x45, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xBC, 0x48, 0xF0, 0xE0, -0x0B, 0xD1, 0xB0, 0x90, 0x01, 0x02, 0xFF, 0xFF, 0xF3, 0xA0, 0x00, 0x00, 0xFF, 0xFF, 0xF1, 0xF0, -0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x57, 0x41, 0x54, 0x00, -0x57, 0x45, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB2, 0xC1, 0xB8, 0x00, 0xFE, -0x84, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x5A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0xBC, 0x48, 0xF0, 0xE0, +0x0B, 0xD1, 0xB0, 0x90, 0x0B, 0xE8, 0x0C, 0x00, 0x0C, 0x61, 0x47, 0xF0, 0x0D, 0xC9, 0x3F, 0x80, +0x0E, 0x8E, 0xF2, 0x70, 0x0F, 0xD3, 0x51, 0x80, 0x10, 0x27, 0xA3, 0x70, 0x48, 0x41, 0xE6, 0x80, +0x48, 0xBB, 0x22, 0x70, 0x4A, 0x23, 0x1A, 0x00, 0x4A, 0x8D, 0xD5, 0x70, 0x4B, 0xDC, 0xC0, 0x80, +0x4C, 0x5D, 0xE5, 0x70, 0x4D, 0x97, 0xB8, 0x80, 0x4E, 0x34, 0x8C, 0xF0, 0x4F, 0x9C, 0xA0, 0xA0, +0x50, 0x08, 0xBB, 0xA0, 0x50, 0x31, 0x9A, 0x20, 0x50, 0x67, 0xA7, 0xA0, 0x51, 0x7C, 0x82, 0xA0, +0x51, 0xD8, 0xCB, 0xA0, 0x52, 0x05, 0x9E, 0xA0, 0x52, 0x6C, 0x73, 0xA0, 0x53, 0x37, 0x7A, 0xA0, +0x53, 0xAF, 0x73, 0x20, 0x53, 0xD7, 0x00, 0x20, 0x54, 0x4C, 0x55, 0xA0, 0x55, 0x17, 0x5C, 0xA0, +0x55, 0x82, 0x26, 0x20, 0x55, 0xA9, 0xB3, 0x20, 0x56, 0x2C, 0x37, 0xA0, 0x56, 0xF7, 0x3E, 0xA0, +0x57, 0x56, 0x2A, 0xA0, 0x57, 0x7D, 0xB7, 0xA0, 0x58, 0x15, 0x54, 0x20, 0x58, 0xD7, 0x20, 0xA0, +0x59, 0x28, 0xDD, 0xA0, 0x59, 0x50, 0x6A, 0xA0, 0x59, 0xF5, 0x36, 0x20, 0x5A, 0xB7, 0x02, 0xA0, +0x5A, 0xFB, 0x90, 0xA0, 0x5B, 0x23, 0x1D, 0xA0, 0x5B, 0xD5, 0x18, 0x20, 0x5C, 0xA0, 0x1F, 0x20, +0x5C, 0xCF, 0x95, 0x20, 0x5C, 0xF7, 0x22, 0x20, 0x5D, 0xB4, 0xFA, 0x20, 0x5E, 0x80, 0x01, 0x20, +0x5E, 0xA2, 0x48, 0x20, 0x5E, 0xC9, 0xD5, 0x20, 0x5F, 0x94, 0xDC, 0x20, 0x60, 0x5F, 0xE3, 0x20, +0x60, 0x74, 0xFB, 0x20, 0x60, 0x9C, 0x88, 0x20, 0x61, 0x7D, 0xF8, 0xA0, 0x62, 0x3F, 0xC5, 0x20, +0x62, 0x48, 0xFF, 0xA0, 0x62, 0x70, 0x8C, 0xA0, 0x63, 0x5D, 0xDA, 0xA0, 0x64, 0x43, 0x3F, 0xA0, +0x65, 0x3D, 0xBC, 0xA0, 0x66, 0x15, 0xF2, 0xA0, 0x67, 0x1D, 0x9E, 0xA0, 0x67, 0xE9, 0xF7, 0x20, +0x68, 0xFD, 0x80, 0xA0, 0x69, 0xC8, 0x87, 0xA0, 0x6A, 0xDD, 0x62, 0xA0, 0x6B, 0xA8, 0x69, 0xA0, +0x6C, 0xC6, 0x7F, 0x20, 0x6D, 0x88, 0x4B, 0xA0, 0x6E, 0xA6, 0x61, 0x20, 0x6F, 0x68, 0x2D, 0xA0, +0x70, 0x86, 0x43, 0x20, 0x71, 0x51, 0x4A, 0x20, 0x72, 0x66, 0x25, 0x20, 0x73, 0x31, 0x2C, 0x20, +0x74, 0x46, 0x07, 0x20, 0x75, 0x11, 0x0E, 0x20, 0x76, 0x2F, 0x23, 0xA0, 0x76, 0xF0, 0xF0, 0x20, +0x78, 0x0F, 0x05, 0xA0, 0x78, 0xD0, 0xD2, 0x20, 0x79, 0xEE, 0xE7, 0xA0, 0x7A, 0xB0, 0xB4, 0x20, +0x7B, 0xCE, 0xC9, 0xA0, 0x7C, 0x99, 0xD0, 0xA0, 0x7D, 0xA8, 0x14, 0x20, 0x7E, 0x79, 0xB2, 0xA0, +0x7F, 0x7C, 0x18, 0xA0, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0xFF, 0xFF, +0xF3, 0xA0, 0x00, 0x00, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x57, 0x41, 0x54, 0x00, 0x57, 0x45, +0x53, 0x54, 0x00, 0x57, 0x45, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xB2, 0xC1, 0xB8, 0x00, 0xFE, 0x84, 0x40, 0x00, 0x00, 0x00, 0x00, /* Africa/Freetown */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x53, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1183,7 +1211,7 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { /* Africa/Tripoli */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x4C, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0xA1, 0xF2, 0xC1, 0x24, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0xA1, 0xF2, 0xC1, 0x24, 0xDD, 0xBB, 0xB1, 0x10, 0xDE, 0x23, 0xAD, 0x60, 0xE1, 0x78, 0xD2, 0x10, 0xE1, 0xE7, 0x65, 0xE0, 0xE5, 0x2F, 0x3F, 0x70, 0xE5, 0xA9, 0xCC, 0xE0, 0xEB, 0x4E, 0xC6, 0xF0, 0x16, 0x92, 0x42, 0x60, 0x17, 0x08, 0xF7, 0x70, 0x17, 0xFA, 0x2B, 0xE0, 0x18, 0xEA, 0x2A, 0xF0, 0x19, 0xDB, 0x5F, 0x60, @@ -1191,24 +1219,9 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { 0x1E, 0x93, 0x0B, 0x70, 0x1F, 0x82, 0xEE, 0x60, 0x20, 0x70, 0x4A, 0x70, 0x21, 0x61, 0x7E, 0xE0, 0x22, 0x52, 0xCF, 0x70, 0x23, 0x44, 0x03, 0xE0, 0x24, 0x34, 0x02, 0xF0, 0x25, 0x25, 0x37, 0x60, 0x26, 0x40, 0xB7, 0xF0, 0x32, 0x4E, 0xF1, 0x60, 0x33, 0x44, 0x36, 0x70, 0x34, 0x35, 0x6A, 0xE0, -0x50, 0x9D, 0x99, 0x00, 0x51, 0x54, 0xD9, 0x80, 0x52, 0x69, 0xB4, 0x80, 0x53, 0x34, 0xBB, 0x80, -0x54, 0x52, 0xD1, 0x00, 0x55, 0x14, 0x9D, 0x80, 0x56, 0x32, 0xB3, 0x00, 0x56, 0xF4, 0x7F, 0x80, -0x58, 0x12, 0x95, 0x00, 0x58, 0xDD, 0x9C, 0x00, 0x59, 0xF2, 0x77, 0x00, 0x5A, 0xBD, 0x7E, 0x00, -0x5B, 0xD2, 0x59, 0x00, 0x5C, 0x9D, 0x60, 0x00, 0x5D, 0xB2, 0x3B, 0x00, 0x5E, 0x7D, 0x42, 0x00, -0x5F, 0x9B, 0x57, 0x80, 0x60, 0x5D, 0x24, 0x00, 0x61, 0x7B, 0x39, 0x80, 0x62, 0x3D, 0x06, 0x00, -0x63, 0x5B, 0x1B, 0x80, 0x64, 0x26, 0x22, 0x80, 0x65, 0x3A, 0xFD, 0x80, 0x66, 0x06, 0x04, 0x80, -0x67, 0x1A, 0xDF, 0x80, 0x67, 0xE5, 0xE6, 0x80, 0x69, 0x03, 0xFC, 0x00, 0x69, 0xC5, 0xC8, 0x80, -0x6A, 0xE3, 0xDE, 0x00, 0x6B, 0xA5, 0xAA, 0x80, 0x6C, 0xC3, 0xC0, 0x00, 0x6D, 0x8E, 0xC7, 0x00, -0x6E, 0xA3, 0xA2, 0x00, 0x6F, 0x6E, 0xA9, 0x00, 0x70, 0x83, 0x84, 0x00, 0x71, 0x4E, 0x8B, 0x00, -0x72, 0x63, 0x66, 0x00, 0x73, 0x2E, 0x6D, 0x00, 0x74, 0x4C, 0x82, 0x80, 0x75, 0x0E, 0x4F, 0x00, -0x76, 0x2C, 0x64, 0x80, 0x76, 0xEE, 0x31, 0x00, 0x78, 0x0C, 0x46, 0x80, 0x78, 0xD7, 0x4D, 0x80, -0x79, 0xEC, 0x28, 0x80, 0x7A, 0xB7, 0x2F, 0x80, 0x7B, 0xCC, 0x0A, 0x80, 0x7C, 0x97, 0x11, 0x80, -0x7D, 0xB5, 0x27, 0x00, 0x7E, 0x76, 0xF3, 0x80, 0x7F, 0x95, 0x09, 0x00, 0x02, 0x01, 0x02, 0x01, +0x50, 0x9D, 0x99, 0x00, 0x51, 0x54, 0xD9, 0x80, 0x52, 0x69, 0xB4, 0x80, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x01, 0x03, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0x0C, 0x5C, +0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x01, 0x03, 0x02, 0x01, 0x03, 0x00, 0x00, 0x0C, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0x87, @@ -2946,7 +2959,7 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { /* America/Eirunepe */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x96, 0xAA, 0x88, 0x80, +0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x96, 0xAA, 0x88, 0x80, 0xB8, 0x0F, 0x66, 0x00, 0xB8, 0xFD, 0x5C, 0xC0, 0xB9, 0xF1, 0x50, 0x50, 0xBA, 0xDE, 0x90, 0x40, 0xDA, 0x38, 0xCA, 0x50, 0xDA, 0xEC, 0x16, 0x50, 0xDC, 0x19, 0xFD, 0xD0, 0xDC, 0xB9, 0x75, 0x40, 0xDD, 0xFB, 0x31, 0x50, 0xDE, 0x9B, 0xFA, 0x40, 0xDF, 0xDD, 0xB6, 0x50, 0xE0, 0x54, 0x4F, 0x40, @@ -2954,14 +2967,14 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { 0xF8, 0x51, 0x48, 0x50, 0xF8, 0xC7, 0xE1, 0x40, 0xFA, 0x0A, 0xEE, 0xD0, 0xFA, 0xA9, 0x14, 0xC0, 0xFB, 0xEC, 0x22, 0x50, 0xFC, 0x8B, 0x99, 0xC0, 0x1D, 0xC9, 0xAA, 0x50, 0x1E, 0x78, 0xF3, 0xC0, 0x1F, 0xA0, 0x51, 0xD0, 0x20, 0x33, 0xEB, 0xC0, 0x21, 0x81, 0x85, 0x50, 0x22, 0x0B, 0xE4, 0xC0, -0x2C, 0xC0, 0xD1, 0x50, 0x2D, 0x66, 0xE0, 0x40, 0x48, 0x60, 0x7F, 0x50, 0x02, 0x01, 0x02, 0x01, +0x2C, 0xC0, 0xD1, 0x50, 0x2D, 0x66, 0xE0, 0x40, 0x48, 0x60, 0x7F, 0x50, 0x52, 0x7F, 0x04, 0xC0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0xFF, 0xFF, 0xBE, 0x80, -0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x09, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x43, 0x53, 0x54, 0x00, 0x41, 0x43, 0x54, -0x00, 0x41, 0x4D, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x28, -0x15, 0x00, 0xA8, 0x0C, 0xD5, 0x00, 0x00, 0x00, 0x0A, 0x57, 0x20, 0x41, 0x6D, 0x61, 0x7A, 0x6F, -0x6E, 0x61, 0x73, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, +0x02, 0xFF, 0xFF, 0xBE, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, +0xB0, 0x00, 0x09, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x43, 0x53, +0x54, 0x00, 0x41, 0x43, 0x54, 0x00, 0x41, 0x4D, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x7F, 0x28, 0x15, 0x00, 0xA8, 0x0C, 0xD5, 0x00, 0x00, 0x00, 0x0A, 0x57, 0x20, +0x41, 0x6D, 0x61, 0x7A, 0x6F, 0x6E, 0x61, 0x73, /* America/El_Salvador */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x53, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -5771,7 +5784,7 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { /* America/Porto_Acre */ 0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x96, 0xAA, 0x86, 0x90, +0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x96, 0xAA, 0x86, 0x90, 0xB8, 0x0F, 0x66, 0x00, 0xB8, 0xFD, 0x5C, 0xC0, 0xB9, 0xF1, 0x50, 0x50, 0xBA, 0xDE, 0x90, 0x40, 0xDA, 0x38, 0xCA, 0x50, 0xDA, 0xEC, 0x16, 0x50, 0xDC, 0x19, 0xFD, 0xD0, 0xDC, 0xB9, 0x75, 0x40, 0xDD, 0xFB, 0x31, 0x50, 0xDE, 0x9B, 0xFA, 0x40, 0xDF, 0xDD, 0xB6, 0x50, 0xE0, 0x54, 0x4F, 0x40, @@ -5779,12 +5792,13 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { 0xF8, 0x51, 0x48, 0x50, 0xF8, 0xC7, 0xE1, 0x40, 0xFA, 0x0A, 0xEE, 0xD0, 0xFA, 0xA9, 0x14, 0xC0, 0xFB, 0xEC, 0x22, 0x50, 0xFC, 0x8B, 0x99, 0xC0, 0x1D, 0xC9, 0xAA, 0x50, 0x1E, 0x78, 0xF3, 0xC0, 0x1F, 0xA0, 0x51, 0xD0, 0x20, 0x33, 0xEB, 0xC0, 0x21, 0x81, 0x85, 0x50, 0x22, 0x0B, 0xE4, 0xC0, -0x48, 0x60, 0x7F, 0x50, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x48, 0x60, 0x7F, 0x50, 0x52, 0x7F, 0x04, 0xC0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x03, 0xFF, 0xFF, 0xC0, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, -0xB9, 0xB0, 0x00, 0x09, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x43, -0x53, 0x54, 0x00, 0x41, 0x43, 0x54, 0x00, 0x41, 0x4D, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, +0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0xFF, 0xFF, 0xC0, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xC7, +0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x09, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0D, 0x4C, +0x4D, 0x54, 0x00, 0x41, 0x43, 0x53, 0x54, 0x00, 0x41, 0x43, 0x54, 0x00, 0x41, 0x4D, 0x54, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, +0x00, 0x00, 0x00, 0x00, /* America/Port_of_Spain */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x54, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -6028,7 +6042,7 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { /* America/Rio_Branco */ 0x50, 0x48, 0x50, 0x31, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x96, 0xAA, 0x86, 0x90, +0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x96, 0xAA, 0x86, 0x90, 0xB8, 0x0F, 0x66, 0x00, 0xB8, 0xFD, 0x5C, 0xC0, 0xB9, 0xF1, 0x50, 0x50, 0xBA, 0xDE, 0x90, 0x40, 0xDA, 0x38, 0xCA, 0x50, 0xDA, 0xEC, 0x16, 0x50, 0xDC, 0x19, 0xFD, 0xD0, 0xDC, 0xB9, 0x75, 0x40, 0xDD, 0xFB, 0x31, 0x50, 0xDE, 0x9B, 0xFA, 0x40, 0xDF, 0xDD, 0xB6, 0x50, 0xE0, 0x54, 0x4F, 0x40, @@ -6036,13 +6050,13 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { 0xF8, 0x51, 0x48, 0x50, 0xF8, 0xC7, 0xE1, 0x40, 0xFA, 0x0A, 0xEE, 0xD0, 0xFA, 0xA9, 0x14, 0xC0, 0xFB, 0xEC, 0x22, 0x50, 0xFC, 0x8B, 0x99, 0xC0, 0x1D, 0xC9, 0xAA, 0x50, 0x1E, 0x78, 0xF3, 0xC0, 0x1F, 0xA0, 0x51, 0xD0, 0x20, 0x33, 0xEB, 0xC0, 0x21, 0x81, 0x85, 0x50, 0x22, 0x0B, 0xE4, 0xC0, -0x48, 0x60, 0x7F, 0x50, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x48, 0x60, 0x7F, 0x50, 0x52, 0x7F, 0x04, 0xC0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x03, 0xFF, 0xFF, 0xC0, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, -0xB9, 0xB0, 0x00, 0x09, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x43, -0x53, 0x54, 0x00, 0x41, 0x43, 0x54, 0x00, 0x41, 0x4D, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x7A, 0x1F, 0x05, 0x00, 0xAB, 0x34, 0x20, 0x00, 0x00, 0x00, 0x04, 0x41, -0x63, 0x72, 0x65, +0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0xFF, 0xFF, 0xC0, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xC7, +0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x09, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0D, 0x4C, +0x4D, 0x54, 0x00, 0x41, 0x43, 0x53, 0x54, 0x00, 0x41, 0x43, 0x54, 0x00, 0x41, 0x4D, 0x54, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x1F, 0x05, 0x00, 0xAB, 0x34, 0x20, +0x00, 0x00, 0x00, 0x04, 0x41, 0x63, 0x72, 0x65, /* America/Rosario */ 0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -10996,7 +11010,7 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { /* Brazil/Acre */ 0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x96, 0xAA, 0x86, 0x90, +0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0x96, 0xAA, 0x86, 0x90, 0xB8, 0x0F, 0x66, 0x00, 0xB8, 0xFD, 0x5C, 0xC0, 0xB9, 0xF1, 0x50, 0x50, 0xBA, 0xDE, 0x90, 0x40, 0xDA, 0x38, 0xCA, 0x50, 0xDA, 0xEC, 0x16, 0x50, 0xDC, 0x19, 0xFD, 0xD0, 0xDC, 0xB9, 0x75, 0x40, 0xDD, 0xFB, 0x31, 0x50, 0xDE, 0x9B, 0xFA, 0x40, 0xDF, 0xDD, 0xB6, 0x50, 0xE0, 0x54, 0x4F, 0x40, @@ -11004,12 +11018,13 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { 0xF8, 0x51, 0x48, 0x50, 0xF8, 0xC7, 0xE1, 0x40, 0xFA, 0x0A, 0xEE, 0xD0, 0xFA, 0xA9, 0x14, 0xC0, 0xFB, 0xEC, 0x22, 0x50, 0xFC, 0x8B, 0x99, 0xC0, 0x1D, 0xC9, 0xAA, 0x50, 0x1E, 0x78, 0xF3, 0xC0, 0x1F, 0xA0, 0x51, 0xD0, 0x20, 0x33, 0xEB, 0xC0, 0x21, 0x81, 0x85, 0x50, 0x22, 0x0B, 0xE4, 0xC0, -0x48, 0x60, 0x7F, 0x50, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x48, 0x60, 0x7F, 0x50, 0x52, 0x7F, 0x04, 0xC0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x03, 0xFF, 0xFF, 0xC0, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, -0xB9, 0xB0, 0x00, 0x09, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x43, -0x53, 0x54, 0x00, 0x41, 0x43, 0x54, 0x00, 0x41, 0x4D, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, +0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0xFF, 0xFF, 0xC0, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xC7, +0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x09, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0D, 0x4C, +0x4D, 0x54, 0x00, 0x41, 0x43, 0x53, 0x54, 0x00, 0x41, 0x43, 0x54, 0x00, 0x41, 0x4D, 0x54, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, +0x00, 0x00, 0x00, 0x00, /* Brazil/DeNoronha */ 0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -16303,7 +16318,7 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { /* Libya */ 0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0xA1, 0xF2, 0xC1, 0x24, +0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0xA1, 0xF2, 0xC1, 0x24, 0xDD, 0xBB, 0xB1, 0x10, 0xDE, 0x23, 0xAD, 0x60, 0xE1, 0x78, 0xD2, 0x10, 0xE1, 0xE7, 0x65, 0xE0, 0xE5, 0x2F, 0x3F, 0x70, 0xE5, 0xA9, 0xCC, 0xE0, 0xEB, 0x4E, 0xC6, 0xF0, 0x16, 0x92, 0x42, 0x60, 0x17, 0x08, 0xF7, 0x70, 0x17, 0xFA, 0x2B, 0xE0, 0x18, 0xEA, 0x2A, 0xF0, 0x19, 0xDB, 0x5F, 0x60, @@ -16311,24 +16326,9 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { 0x1E, 0x93, 0x0B, 0x70, 0x1F, 0x82, 0xEE, 0x60, 0x20, 0x70, 0x4A, 0x70, 0x21, 0x61, 0x7E, 0xE0, 0x22, 0x52, 0xCF, 0x70, 0x23, 0x44, 0x03, 0xE0, 0x24, 0x34, 0x02, 0xF0, 0x25, 0x25, 0x37, 0x60, 0x26, 0x40, 0xB7, 0xF0, 0x32, 0x4E, 0xF1, 0x60, 0x33, 0x44, 0x36, 0x70, 0x34, 0x35, 0x6A, 0xE0, -0x50, 0x9D, 0x99, 0x00, 0x51, 0x54, 0xD9, 0x80, 0x52, 0x69, 0xB4, 0x80, 0x53, 0x34, 0xBB, 0x80, -0x54, 0x52, 0xD1, 0x00, 0x55, 0x14, 0x9D, 0x80, 0x56, 0x32, 0xB3, 0x00, 0x56, 0xF4, 0x7F, 0x80, -0x58, 0x12, 0x95, 0x00, 0x58, 0xDD, 0x9C, 0x00, 0x59, 0xF2, 0x77, 0x00, 0x5A, 0xBD, 0x7E, 0x00, -0x5B, 0xD2, 0x59, 0x00, 0x5C, 0x9D, 0x60, 0x00, 0x5D, 0xB2, 0x3B, 0x00, 0x5E, 0x7D, 0x42, 0x00, -0x5F, 0x9B, 0x57, 0x80, 0x60, 0x5D, 0x24, 0x00, 0x61, 0x7B, 0x39, 0x80, 0x62, 0x3D, 0x06, 0x00, -0x63, 0x5B, 0x1B, 0x80, 0x64, 0x26, 0x22, 0x80, 0x65, 0x3A, 0xFD, 0x80, 0x66, 0x06, 0x04, 0x80, -0x67, 0x1A, 0xDF, 0x80, 0x67, 0xE5, 0xE6, 0x80, 0x69, 0x03, 0xFC, 0x00, 0x69, 0xC5, 0xC8, 0x80, -0x6A, 0xE3, 0xDE, 0x00, 0x6B, 0xA5, 0xAA, 0x80, 0x6C, 0xC3, 0xC0, 0x00, 0x6D, 0x8E, 0xC7, 0x00, -0x6E, 0xA3, 0xA2, 0x00, 0x6F, 0x6E, 0xA9, 0x00, 0x70, 0x83, 0x84, 0x00, 0x71, 0x4E, 0x8B, 0x00, -0x72, 0x63, 0x66, 0x00, 0x73, 0x2E, 0x6D, 0x00, 0x74, 0x4C, 0x82, 0x80, 0x75, 0x0E, 0x4F, 0x00, -0x76, 0x2C, 0x64, 0x80, 0x76, 0xEE, 0x31, 0x00, 0x78, 0x0C, 0x46, 0x80, 0x78, 0xD7, 0x4D, 0x80, -0x79, 0xEC, 0x28, 0x80, 0x7A, 0xB7, 0x2F, 0x80, 0x7B, 0xCC, 0x0A, 0x80, 0x7C, 0x97, 0x11, 0x80, -0x7D, 0xB5, 0x27, 0x00, 0x7E, 0x76, 0xF3, 0x80, 0x7F, 0x95, 0x09, 0x00, 0x02, 0x01, 0x02, 0x01, +0x50, 0x9D, 0x99, 0x00, 0x51, 0x54, 0xD9, 0x80, 0x52, 0x69, 0xB4, 0x80, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x01, 0x03, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0x0C, 0x5C, +0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x01, 0x03, 0x02, 0x01, 0x03, 0x00, 0x00, 0x0C, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, @@ -18402,4 +18402,4 @@ const unsigned char timelib_timezone_db_data_builtin[261411] = { 0x00, 0x00, 0x55, 0x54, 0x43, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, }; -const timelib_tzdb timezonedb_builtin = { "2013.7", 579, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; +const timelib_tzdb timezonedb_builtin = { "2013.8", 579, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; From d86b5f01ac7089f46add60622260d6926c3977b8 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 28 Oct 2013 19:51:31 +0100 Subject: [PATCH 349/400] Avoid copy in func_get_arg() Complements dmitry's change to func_get_args() --- Zend/zend_builtin_functions.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 2d2a865c10f1d..55e5f34e83aab 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -435,9 +435,7 @@ ZEND_FUNCTION(func_get_arg) } arg = *(p-(arg_count-requested_offset)); - *return_value = *arg; - zval_copy_ctor(return_value); - INIT_PZVAL(return_value); + RETURN_ZVAL_FAST(arg); } /* }}} */ From e2c9f3983ac81478e73fa86b8d218795aa9ee201 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Tue, 29 Oct 2013 09:02:24 +0100 Subject: [PATCH 350/400] add bundled libzip LICENSE, as required by BSD License terms --- ext/zip/LICENSE_libzip | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 ext/zip/LICENSE_libzip diff --git a/ext/zip/LICENSE_libzip b/ext/zip/LICENSE_libzip new file mode 100644 index 0000000000000..9b2fda07b1054 --- /dev/null +++ b/ext/zip/LICENSE_libzip @@ -0,0 +1,27 @@ +Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner +The authors can be contacted at + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. +3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. From 4dc4302a30e225bcbf468b7ce01a4c5929f87a07 Mon Sep 17 00:00:00 2001 From: Yasuo Ohgaki Date: Tue, 29 Oct 2013 17:24:23 +0900 Subject: [PATCH 351/400] Fixed Bug 64760 var_export() does not use full precision for floating-point numbers --- .../general_functions/var_export-locale.phpt | 8 ++--- .../general_functions/var_export_basic3.phpt | 36 +++++++++---------- .../general_functions/var_export_basic5.phpt | 10 +++--- ext/standard/var.c | 2 +- tests/lang/bug24640.phpt | 16 ++++----- 5 files changed, 36 insertions(+), 36 deletions(-) diff --git a/ext/standard/tests/general_functions/var_export-locale.phpt b/ext/standard/tests/general_functions/var_export-locale.phpt index 37142cf34c75a..3cbebe9c723d9 100644 --- a/ext/standard/tests/general_functions/var_export-locale.phpt +++ b/ext/standard/tests/general_functions/var_export-locale.phpt @@ -784,15 +784,15 @@ string(20) "array ( Iteration 13 array ( 0 => 10.5, - 1 => 5.6, + 1 => 5.5999999999999996, ) array ( 0 => 10.5, - 1 => 5.6, + 1 => 5.5999999999999996, ) -string(34) "array ( +string(49) "array ( 0 => 10.5, - 1 => 5.6, + 1 => 5.5999999999999996, )" diff --git a/ext/standard/tests/general_functions/var_export_basic3.phpt b/ext/standard/tests/general_functions/var_export_basic3.phpt index 299721591071b..9e27d90425817 100644 --- a/ext/standard/tests/general_functions/var_export_basic3.phpt +++ b/ext/standard/tests/general_functions/var_export_basic3.phpt @@ -96,9 +96,9 @@ string(1) "0" -- Iteration: -0.1 -- --0.1 --0.1 -string(4) "-0.1" +-0.10000000000000001 +-0.10000000000000001 +string(20) "-0.10000000000000001" -- Iteration: 10.0000000000000000005 -- @@ -120,9 +120,9 @@ string(6) "100000" -- Iteration: 1e-5 -- -1.0E-5 -1.0E-5 -string(6) "1.0E-5" +1.0000000000000001E-5 +1.0000000000000001E-5 +string(21) "1.0000000000000001E-5" -- Iteration: 1e+5 -- @@ -144,9 +144,9 @@ string(6) "100000" -- Iteration: 1E-5 -- -1.0E-5 -1.0E-5 -string(6) "1.0E-5" +1.0000000000000001E-5 +1.0000000000000001E-5 +string(21) "1.0000000000000001E-5" -- Iteration: .5e+7 -- @@ -156,20 +156,20 @@ string(7) "5000000" -- Iteration: .6e-19 -- -6.0E-20 -6.0E-20 -string(7) "6.0E-20" +6.0000000000000006E-20 +6.0000000000000006E-20 +string(22) "6.0000000000000006E-20" -- Iteration: .05E+44 -- -5.0E+42 -5.0E+42 -string(7) "5.0E+42" +5.0000000000000001E+42 +5.0000000000000001E+42 +string(22) "5.0000000000000001E+42" -- Iteration: .0034E-30 -- -3.4E-33 -3.4E-33 -string(7) "3.4E-33" +3.4000000000000001E-33 +3.4000000000000001E-33 +string(22) "3.4000000000000001E-33" ===DONE=== diff --git a/ext/standard/tests/general_functions/var_export_basic5.phpt b/ext/standard/tests/general_functions/var_export_basic5.phpt index 96b3f54cc9e88..1512fa8377b01 100644 --- a/ext/standard/tests/general_functions/var_export_basic5.phpt +++ b/ext/standard/tests/general_functions/var_export_basic5.phpt @@ -233,15 +233,15 @@ string(20) "array ( --Iteration: array(10.5, 5.6) -- array ( 0 => 10.5, - 1 => 5.6, + 1 => 5.5999999999999996, ) array ( 0 => 10.5, - 1 => 5.6, + 1 => 5.5999999999999996, ) -string(34) "array ( +string(49) "array ( 0 => 10.5, - 1 => 5.6, + 1 => 5.5999999999999996, )" @@ -274,4 +274,4 @@ string(41) "array ( 1 => 'test', )" -===DONE=== \ No newline at end of file +===DONE=== diff --git a/ext/standard/var.c b/ext/standard/var.c index f71c4a4fdc3e8..2d0339a6a3d6f 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -436,7 +436,7 @@ PHPAPI void php_var_export_ex(zval **struc, int level, smart_str *buf TSRMLS_DC) smart_str_append_long(buf, Z_LVAL_PP(struc)); break; case IS_DOUBLE: - tmp_len = spprintf(&tmp_str, 0,"%.*H", (int) EG(precision), Z_DVAL_PP(struc)); + tmp_len = spprintf(&tmp_str, 0,"%.*H", PG(serialize_precision), Z_DVAL_PP(struc)); smart_str_appendl(buf, tmp_str, tmp_len); efree(tmp_str); break; diff --git a/tests/lang/bug24640.phpt b/tests/lang/bug24640.phpt index 919b38e29e44a..e41d0201b7795 100644 --- a/tests/lang/bug24640.phpt +++ b/tests/lang/bug24640.phpt @@ -36,22 +36,22 @@ test(1.7e-1000); ===DONE=== --EXPECTF-- -1.7E+300 +1.7000000000000001E+300 float(1.7E+300) 1.7E+300 1.7E+300 ------ -1.7E-300 +1.7000000000000001E-300 float(1.7E-300) 1.7E-300 1.7E-300 ------ -1.7E+79 +1.7000000000000002E+79 float(1.7E+79) 1.7E+79 1.7E+79 ------ -1.7E-79 +1.6999999999999999E-79 float(1.7E-79) 1.7E-79 1.7E-79 @@ -71,7 +71,7 @@ float(1.7E+81) 1.7E+81 1.7E+81 ------ -1.7E-81 +1.6999999999999999E-81 float(1.7E-81) 1.7E-81 1.7E-81 @@ -81,7 +81,7 @@ float(I%s) I%s I%s ------ -1.69998107421E-319 +1.6999810742105611E-319 float(1.69998107421E-319) 1.69998107421E-319 1.69998107421E-319 @@ -91,7 +91,7 @@ float(I%s) I%s I%s ------ -1.70007988734E-320 +1.7000798873397294E-320 float(1.70007988734E-320) 1.70007988734E-320 1.70007988734E-320 @@ -101,7 +101,7 @@ float(I%s) I%s I%s ------ -1.69958582169E-321 +1.6995858216938881E-321 float(1.69958582169E-321) 1.69958582169E-321 1.69958582169E-321 From 16a9fec8898677b96a0f22f0fdfac0dfc7126cf1 Mon Sep 17 00:00:00 2001 From: Yasuo Ohgaki Date: Tue, 29 Oct 2013 17:27:49 +0900 Subject: [PATCH 352/400] Update NEWS --- NEWS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NEWS b/NEWS index 26a9aa9ff42c5..55177746180a3 100644 --- a/NEWS +++ b/NEWS @@ -24,6 +24,10 @@ PHP NEWS . Fixed bug #65808 (the socket_connect() won't work with IPv6 address). (Mike) +- Standard: + . Fixed bug #64760 (var_export() does not use full precision for floating-point + numbers) (Yasuo) + - XMLReader: . Fixed bug #51936 (Crash with clone XMLReader). (Mike) . Fixed bug #64230 (XMLReader does not suppress errors). (Mike) From 4c45e95cfe064d76f0aedbee991ae1b217bb9990 Mon Sep 17 00:00:00 2001 From: Yasuo Ohgaki Date: Tue, 29 Oct 2013 17:29:53 +0900 Subject: [PATCH 353/400] Update NEWS --- NEWS | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 9fe5fc463895f..2c784b8fbbcec 100644 --- a/NEWS +++ b/NEWS @@ -10,13 +10,17 @@ PHP NEWS . Fixed bug #65911 (scope resolution operator - strange behavior with $this). (Bob Weinand) --OPcache +- OPcache . Increased limit for opcache.max_accelerated_files to 1,000,000. (Chris) - ODBC . Fixed bug #65950 (Field name truncation if the field name is bigger than 32 characters). (patch submitted by: michael dot y at zend dot com, Yasuo) +- Standard: + . Fixed bug #64760 (var_export() does not use full precision for floating-point + numbers) (Yasuo) + 17 Oct 2013, PHP 5.5.5 From 416f8fce5cebb7d5859c28aede2d1b3d793acec2 Mon Sep 17 00:00:00 2001 From: Yasuo Ohgaki Date: Tue, 29 Oct 2013 18:53:45 +0900 Subject: [PATCH 354/400] Implemented Change crypt() behavior w/o salt RFC --- NEWS | 2 ++ ext/standard/crypt.c | 2 ++ ext/standard/tests/strings/crypt.phpt | 2 ++ 3 files changed, 6 insertions(+) diff --git a/NEWS b/NEWS index 0c45a234697c4..ed8bcc93b154f 100644 --- a/NEWS +++ b/NEWS @@ -63,6 +63,8 @@ PHP NEWS - Standard: . Implemented FR #65634 (HTTP wrapper is very slow with protocol_version 1.1). (Adam) + . Implemented Change crypt() behavior w/o salt RFC. (Yasuo) + https://wiki.php.net/rfc/crypt_function_salt - XMLReader: . Fixed bug #55285 (XMLReader::getAttribute/No/Ns methods inconsistency). diff --git a/ext/standard/crypt.c b/ext/standard/crypt.c index 113a5bd0f516c..81c0bf3e0c536 100644 --- a/ext/standard/crypt.c +++ b/ext/standard/crypt.c @@ -272,6 +272,8 @@ PHP_FUNCTION(crypt) if (salt_in) { memcpy(salt, salt_in, MIN(PHP_MAX_SALT_LEN, salt_in_len)); + } else { + php_error_docref(NULL TSRMLS_C, E_NOTICE, "No salt parameter was specified. You must use a randomly generated salt and a strong hash function to produce a secure hash."); } /* The automatic salt generation covers standard DES, md5-crypt and Blowfish (simple) */ diff --git a/ext/standard/tests/strings/crypt.phpt b/ext/standard/tests/strings/crypt.phpt index ce178f684e08e..3dcff2eaf2656 100644 --- a/ext/standard/tests/strings/crypt.phpt +++ b/ext/standard/tests/strings/crypt.phpt @@ -34,6 +34,8 @@ STD EXT MD5 BLO + +Notice: crypt(): No salt parameter was specified. You must use a randomly generated salt and a strong hash function to produce a secure hash. in %s on line %d string(%d) "%s" Warning: crypt() expects at least 1 parameter, 0 given in %s on line %d From 5f1cbfacf9ed01bd97c315fc34f4ee87f0d119cc Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Tue, 29 Oct 2013 13:35:02 +0100 Subject: [PATCH 355/400] updated libs_versions.txt --- win32/build/libs_version.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/win32/build/libs_version.txt b/win32/build/libs_version.txt index 123a75d783090..44420ddec82da 100644 --- a/win32/build/libs_version.txt +++ b/win32/build/libs_version.txt @@ -1,12 +1,11 @@ bz2-1.0.6 cclient-2007f freetype-2.4.10 -icu-50.1.2 +icu-51.2 jpeglib-9 libcurl-7.30.0 libiconv-1.14 libmcrypt-2.5.8 -libmpir-2.5.1 libmpir-2.6.0 libpng-1.5.14 libpq-9.2.2 From 82eca388d201aa39984521694c92f1955d646838 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 29 Oct 2013 20:01:37 +0100 Subject: [PATCH 356/400] Fix ZTS build --- ext/standard/crypt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/crypt.c b/ext/standard/crypt.c index 81c0bf3e0c536..354c263afbd0c 100644 --- a/ext/standard/crypt.c +++ b/ext/standard/crypt.c @@ -273,7 +273,7 @@ PHP_FUNCTION(crypt) if (salt_in) { memcpy(salt, salt_in, MIN(PHP_MAX_SALT_LEN, salt_in_len)); } else { - php_error_docref(NULL TSRMLS_C, E_NOTICE, "No salt parameter was specified. You must use a randomly generated salt and a strong hash function to produce a secure hash."); + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "No salt parameter was specified. You must use a randomly generated salt and a strong hash function to produce a secure hash."); } /* The automatic salt generation covers standard DES, md5-crypt and Blowfish (simple) */ From 647e0be64b4cdcc5c94aa245d4d876d193709287 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 29 Oct 2013 20:07:34 +0100 Subject: [PATCH 357/400] Fix compile warning in GMP --- ext/gmp/gmp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index 8b5c131e76060..6b3dadf40576f 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -1363,7 +1363,7 @@ ZEND_FUNCTION(gmp_powm) zval *base_arg, *exp_arg, *mod_arg; mpz_ptr gmpnum_base, gmpnum_exp, gmpnum_mod, gmpnum_result; int use_ui = 0; - gmp_temp_t temp_base = {0}, temp_exp = {0}, temp_mod; + gmp_temp_t temp_base, temp_exp, temp_mod; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zzz", &base_arg, &exp_arg, &mod_arg) == FAILURE){ return; From 4218e89f8df4ca3897e3aad595e0c2c9cf4c3aca Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 29 Oct 2013 20:58:30 +0100 Subject: [PATCH 358/400] Fix bug #65997 by switching to Serializable for GMP Rather than using get_properties and __wakeup for serialization the code now uses Serializable::serialize() and Serializable::unserialize(). The get_properties handler is switched to a get_debug_info handler. Thus get_gc will now return only the normal properties and not do any modifications, thus fixing the leak. This also avoids a $num property from being publicly visible after the object was dumped or serialized, so that's an extra plus. --- ext/gmp/gmp.c | 107 ++++++++++++++++++++++++++++------- ext/gmp/tests/bug659967.phpt | 15 +++++ ext/gmp/tests/serialize.phpt | 22 ++++++- 3 files changed, 124 insertions(+), 20 deletions(-) create mode 100644 ext/gmp/tests/bug659967.phpt diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index 6b3dadf40576f..af9c73afa2b0a 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -24,7 +24,10 @@ #include "php_ini.h" #include "php_gmp.h" #include "ext/standard/info.h" +#include "ext/standard/php_var.h" +#include "ext/standard/php_smart_str_public.h" #include "zend_exceptions.h" +#include "zend_interfaces.h" #if HAVE_GMP @@ -564,12 +567,17 @@ static int gmp_cast_object(zval *readobj, zval *writeobj, int type TSRMLS_DC) /* } /* }}} */ -static HashTable *gmp_get_properties(zval *obj TSRMLS_DC) /* {{{ */ +static HashTable *gmp_get_debug_info(zval *obj, int *is_temp TSRMLS_DC) /* {{{ */ { - HashTable *ht = zend_std_get_properties(obj TSRMLS_CC); + HashTable *ht, *props = zend_std_get_properties(obj TSRMLS_CC); mpz_ptr gmpnum = GET_GMP_FROM_ZVAL(obj); zval *zv; + *is_temp = 1; + ALLOC_HASHTABLE(ht); + ZEND_INIT_SYMTABLE_EX(ht, zend_hash_num_elements(props) + 1, 0); + zend_hash_copy(ht, props, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *)); + MAKE_STD_ZVAL(zv); gmp_strval(zv, gmpnum, 10); zend_hash_update(ht, "num", sizeof("num"), &zv, sizeof(zval *), NULL); @@ -678,36 +686,96 @@ static int gmp_compare(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */ } /* }}} */ -PHP_METHOD(GMP, __wakeup) /* {{{ */ +PHP_METHOD(GMP, serialize) /* {{{ */ { - HashTable *props; - zval **num_zv; + mpz_ptr gmpnum = GET_GMP_FROM_ZVAL(getThis()); + smart_str buf = {0}; + php_serialize_data_t var_hash; + zval zv, *zv_ptr = &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 + PHP_VAR_SERIALIZE_INIT(var_hash); + + INIT_PZVAL(zv_ptr); + + gmp_strval(zv_ptr, gmpnum, 10); + php_var_serialize(&buf, &zv_ptr, &var_hash TSRMLS_CC); + zval_dtor(zv_ptr); + + Z_ARRVAL_P(zv_ptr) = zend_std_get_properties(getThis() TSRMLS_CC); + Z_TYPE_P(zv_ptr) = IS_ARRAY; + php_var_serialize(&buf, &zv_ptr, &var_hash TSRMLS_CC); + + PHP_VAR_SERIALIZE_DESTROY(var_hash); + + if (buf.c) { + RETURN_STRINGL(buf.c, buf.len, 0); + } +} +/* }}} */ + +PHP_METHOD(GMP, unserialize) /* {{{ */ +{ + mpz_ptr gmpnum = GET_GMP_FROM_ZVAL(getThis()); + char *str; + int str_len; + php_unserialize_data_t var_hash; + const unsigned char *p, *max; + zval zv, *zv_ptr = &zv; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &str_len) == FAILURE) { + return; + } + + PHP_VAR_UNSERIALIZE_INIT(var_hash); + + p = (unsigned char *) str; + max = (unsigned char *) str + str_len; + + INIT_ZVAL(zv); + if (!php_var_unserialize(&zv_ptr, &p, max, &var_hash TSRMLS_CC) + || Z_TYPE_P(zv_ptr) != IS_STRING + || convert_to_gmp(gmpnum, zv_ptr, 10 TSRMLS_CC) == FAILURE ) { - mpz_ptr gmpnumber = GET_GMP_FROM_ZVAL(getThis()); - if (convert_to_gmp(gmpnumber, *num_zv, 10 TSRMLS_CC) == SUCCESS) { - return; - } + zend_throw_exception(NULL, "Could not unserialize number", 0 TSRMLS_CC); + goto exit; } + zval_dtor(&zv); - zend_throw_exception( - NULL, "Invalid serialization data", 0 TSRMLS_CC - ); + INIT_ZVAL(zv); + if (!php_var_unserialize(&zv_ptr, &p, max, &var_hash TSRMLS_CC) + || Z_TYPE_P(zv_ptr) != IS_ARRAY + ) { + zend_throw_exception(NULL, "Could not unserialize properties", 0 TSRMLS_CC); + goto exit; + } + + if (zend_hash_num_elements(Z_ARRVAL_P(zv_ptr)) != 0) { + zend_hash_copy( + zend_std_get_properties(getThis() TSRMLS_CC), Z_ARRVAL_P(zv_ptr), + (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *) + ); + } + +exit: + zval_dtor(&zv); + PHP_VAR_UNSERIALIZE_DESTROY(var_hash); } /* }}} */ -ZEND_BEGIN_ARG_INFO_EX(arginfo_wakeup, 0, 0, 0) +ZEND_BEGIN_ARG_INFO_EX(arginfo_serialize, 0, 0, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_unserialize, 0, 0, 1) +ZEND_ARG_INFO(0, serialized) ZEND_END_ARG_INFO() const zend_function_entry gmp_methods[] = { - PHP_ME(GMP, __wakeup, arginfo_wakeup, ZEND_ACC_PUBLIC) + PHP_ME(GMP, serialize, arginfo_serialize, ZEND_ACC_PUBLIC) + PHP_ME(GMP, unserialize, arginfo_unserialize, ZEND_ACC_PUBLIC) PHP_FE_END }; @@ -724,13 +792,14 @@ static ZEND_GINIT_FUNCTION(gmp) ZEND_MINIT_FUNCTION(gmp) { zend_class_entry tmp_ce; - INIT_CLASS_ENTRY(tmp_ce, "GMP", gmp_methods); /* No methods on the class for now */ + INIT_CLASS_ENTRY(tmp_ce, "GMP", gmp_methods); gmp_ce = zend_register_internal_class(&tmp_ce TSRMLS_CC); + zend_class_implements(gmp_ce TSRMLS_CC, 1, zend_ce_serializable); 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.get_debug_info = gmp_get_debug_info; gmp_object_handlers.clone_obj = gmp_clone_obj; gmp_object_handlers.do_operation = gmp_do_operation; gmp_object_handlers.compare = gmp_compare; diff --git a/ext/gmp/tests/bug659967.phpt b/ext/gmp/tests/bug659967.phpt new file mode 100644 index 0000000000000..6ba220274c4f7 --- /dev/null +++ b/ext/gmp/tests/bug659967.phpt @@ -0,0 +1,15 @@ +--TEST-- +Bug #65997: Leak when using gc_collect_cycles with new GMP implementation +--SKIPIF-- + +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== diff --git a/ext/gmp/tests/serialize.phpt b/ext/gmp/tests/serialize.phpt index 26716b659c368..208e0e98001e7 100644 --- a/ext/gmp/tests/serialize.phpt +++ b/ext/gmp/tests/serialize.phpt @@ -9,14 +9,34 @@ var_dump($n = gmp_init(42)); var_dump($s = serialize($n)); var_dump(unserialize($s)); +$n = gmp_init(13); +$n->foo = "bar"; +var_dump(unserialize(serialize($n))); + +try { + unserialize('C:3:"GMP":0:{}'); +} catch (Exception $e) { var_dump($e->getMessage()); } + +try { + unserialize('C:3:"GMP":8:{s:2:"42"}'); +} catch (Exception $e) { var_dump($e->getMessage()); } + ?> --EXPECTF-- object(GMP)#%d (1) { ["num"]=> string(2) "42" } -string(33) "O:3:"GMP":1:{s:3:"num";s:2:"42";}" +string(30) "C:3:"GMP":15:{s:2:"42";a:0:{}}" object(GMP)#%d (1) { ["num"]=> string(2) "42" } +object(GMP)#%d (2) { + ["foo"]=> + string(3) "bar" + ["num"]=> + string(2) "13" +} +string(28) "Could not unserialize number" +string(32) "Could not unserialize properties" From 4ded6ee971d7de3b3f9f2fdf747f5dfcb82cc691 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Tue, 29 Oct 2013 18:11:02 -0700 Subject: [PATCH 359/400] 5.4.23-dev --- NEWS | 2 ++ configure.in | 2 +- main/php_version.h | 6 +++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 55177746180a3..e5b79ec7bfafb 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,7 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +?? ??? 2013, PHP 5.4.23 + ?? ??? 2013, PHP 5.4.22 - Core: diff --git a/configure.in b/configure.in index aa58df613b6c2..af2de7fce9407 100644 --- a/configure.in +++ b/configure.in @@ -119,7 +119,7 @@ int zend_sprintf(char *buffer, const char *format, ...); PHP_MAJOR_VERSION=5 PHP_MINOR_VERSION=4 -PHP_RELEASE_VERSION=22 +PHP_RELEASE_VERSION=23 PHP_EXTRA_VERSION="-dev" PHP_VERSION="$PHP_MAJOR_VERSION.$PHP_MINOR_VERSION.$PHP_RELEASE_VERSION$PHP_EXTRA_VERSION" PHP_VERSION_ID=`expr [$]PHP_MAJOR_VERSION \* 10000 + [$]PHP_MINOR_VERSION \* 100 + [$]PHP_RELEASE_VERSION` diff --git a/main/php_version.h b/main/php_version.h index 3058fef6132f0..523bda6743fff 100644 --- a/main/php_version.h +++ b/main/php_version.h @@ -2,7 +2,7 @@ /* edit configure.in to change version number */ #define PHP_MAJOR_VERSION 5 #define PHP_MINOR_VERSION 4 -#define PHP_RELEASE_VERSION 22 +#define PHP_RELEASE_VERSION 23 #define PHP_EXTRA_VERSION "-dev" -#define PHP_VERSION "5.4.22-dev" -#define PHP_VERSION_ID 50422 +#define PHP_VERSION "5.4.23-dev" +#define PHP_VERSION_ID 50423 From fc707a27ff1ede5494318e9d0eafd0ebb87d1d2e Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Wed, 30 Oct 2013 20:13:14 +0100 Subject: [PATCH 360/400] back to do_alloca(), reverted the wrong replacement --- main/main.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/main/main.c b/main/main.c index 2d018a74670fb..bd5e91b230323 100644 --- a/main/main.c +++ b/main/main.c @@ -2412,13 +2412,14 @@ PHPAPI int php_execute_script(zend_file_handle *primary_file TSRMLS_DC) volatile int old_cwd_fd = -1; #else char *old_cwd; + ALLOCA_FLAG(use_heap) #endif int retval = 0; EG(exit_status) = 0; #ifndef HAVE_BROKEN_GETCWD # define OLD_CWD_SIZE 4096 - old_cwd = emalloc(OLD_CWD_SIZE); + old_cwd = do_alloca(OLD_CWD_SIZE, use_heap); old_cwd[0] = '\0'; #endif @@ -2499,7 +2500,7 @@ PHPAPI int php_execute_script(zend_file_handle *primary_file TSRMLS_DC) if (old_cwd[0] != '\0') { php_ignore_value(VCWD_CHDIR(old_cwd)); } - efree(old_cwd); + do_alloca(old_cwd, use_heap); #endif return retval; } From abb962d54d8a4d22095975d94cda7ea5d2c56fa8 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Wed, 30 Oct 2013 20:46:08 +0100 Subject: [PATCH 361/400] compact the code to preserve the error info after state freeing --- Zend/zend_virtual_cwd.c | 284 ++++++---------------------------------- 1 file changed, 42 insertions(+), 242 deletions(-) diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c index 75bf3d252280d..f281606f9d5e4 100644 --- a/Zend/zend_virtual_cwd.c +++ b/Zend/zend_virtual_cwd.c @@ -127,7 +127,6 @@ static int php_check_dots(const char *element, int n) #define TOKENIZER_STRING "/" #endif - /* default macros */ #ifndef IS_DIRECTORY_UP @@ -157,6 +156,16 @@ static int php_check_dots(const char *element, int n) efree((s)->cwd); \ (s)->cwd = NULL; +#ifdef TSRM_WIN32 +# define CWD_STATE_FREE_ERR(state) do { \ + DWORD last_error = GetLastError(); \ + CWD_STATE_FREE(state); \ + SetLastError(last_error); \ + } while (0) +#else +# define CWD_STATE_FREE_ERR(state) CWD_STATE_FREE(state) +#endif + #ifdef TSRM_WIN32 #ifdef CTL_CODE @@ -432,7 +441,6 @@ static void cwd_globals_ctor(virtual_cwd_globals *cwd_g TSRMLS_DC) /* {{{ */ static void cwd_globals_dtor(virtual_cwd_globals *cwd_g TSRMLS_DC) /* {{{ */ { -/* CWD_STATE_FREE(&cwd_globals->cwd); */ realpath_cache_clean(TSRMLS_C); } /* }}} */ @@ -1488,9 +1496,6 @@ CWD_API FILE *virtual_fopen(const char *path, const char *mode TSRMLS_DC) /* {{{ { cwd_state new_state; FILE *f; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif if (path[0] == '\0') { /* Fail to open empty path */ return NULL; @@ -1498,25 +1503,14 @@ CWD_API FILE *virtual_fopen(const char *path, const char *mode TSRMLS_DC) /* {{{ CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, path, NULL, CWD_EXPAND TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return NULL; } f = fopen(new_state.cwd, mode); -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); + return f; } /* }}} */ @@ -1525,33 +1519,20 @@ CWD_API int virtual_access(const char *pathname, int mode TSRMLS_DC) /* {{{ */ { cwd_state new_state; int ret; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, pathname, NULL, CWD_REALPATH TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return -1; } #if defined(TSRM_WIN32) ret = tsrm_win32_access(new_state.cwd, mode TSRMLS_CC); - last_error = GetLastError(); #else ret = access(new_state.cwd, mode); #endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return ret; } @@ -1611,33 +1592,20 @@ CWD_API int virtual_utime(const char *filename, struct utimbuf *buf TSRMLS_DC) / { cwd_state new_state; int ret; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, filename, NULL, CWD_REALPATH TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return -1; } #ifdef TSRM_WIN32 ret = win32_utime(new_state.cwd, buf); - last_error = GetLastError(); #else ret = utime(new_state.cwd, buf); #endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return ret; } /* }}} */ @@ -1647,31 +1615,16 @@ CWD_API int virtual_chmod(const char *filename, mode_t mode TSRMLS_DC) /* {{{ */ { cwd_state new_state; int ret; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, filename, NULL, CWD_REALPATH TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return -1; } ret = chmod(new_state.cwd, mode); -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return ret; } /* }}} */ @@ -1681,19 +1634,10 @@ CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group, int li { cwd_state new_state; int ret; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, filename, NULL, CWD_REALPATH TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return -1; } @@ -1707,13 +1651,7 @@ CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group, int li ret = chown(new_state.cwd, owner, group); } -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return ret; } /* }}} */ @@ -1723,19 +1661,10 @@ CWD_API int virtual_open(const char *path TSRMLS_DC, int flags, ...) /* {{{ */ { cwd_state new_state; int f; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, path, NULL, CWD_FILEPATH TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return -1; } @@ -1751,13 +1680,7 @@ CWD_API int virtual_open(const char *path TSRMLS_DC, int flags, ...) /* {{{ */ } else { f = open(new_state.cwd, flags); } -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return f; } /* }}} */ @@ -1766,31 +1689,16 @@ CWD_API int virtual_creat(const char *path, mode_t mode TSRMLS_DC) /* {{{ */ { cwd_state new_state; int f; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, path, NULL, CWD_FILEPATH TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return -1; } f = creat(new_state.cwd, mode); -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return f; } /* }}} */ @@ -1800,33 +1708,18 @@ CWD_API int virtual_rename(const char *oldname, const char *newname TSRMLS_DC) / cwd_state old_state; cwd_state new_state; int retval; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&old_state, &CWDG(cwd)); if (virtual_file_ex(&old_state, oldname, NULL, CWD_EXPAND TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&old_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&old_state); return -1; } oldname = old_state.cwd; CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, newname, NULL, CWD_EXPAND TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&old_state); - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&old_state); + CWD_STATE_FREE_ERR(&new_state); return -1; } newname = new_state.cwd; @@ -1836,17 +1729,12 @@ CWD_API int virtual_rename(const char *oldname, const char *newname TSRMLS_DC) / #ifdef TSRM_WIN32 /* MoveFileEx returns 0 on failure, other way 'round for this function */ retval = (MoveFileEx(oldname, newname, MOVEFILE_REPLACE_EXISTING|MOVEFILE_COPY_ALLOWED) == 0) ? -1 : 0; - last_error = GetLastError(); #else retval = rename(oldname, newname); #endif - CWD_STATE_FREE(&old_state); - CWD_STATE_FREE(&new_state); - -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&old_state); + CWD_STATE_FREE_ERR(&new_state); return retval; } @@ -1856,31 +1744,16 @@ CWD_API int virtual_stat(const char *path, struct stat *buf TSRMLS_DC) /* {{{ */ { cwd_state new_state; int retval; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, path, NULL, CWD_REALPATH TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return -1; } retval = php_sys_stat(new_state.cwd, buf); -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return retval; } /* }}} */ @@ -1889,31 +1762,16 @@ CWD_API int virtual_lstat(const char *path, struct stat *buf TSRMLS_DC) /* {{{ * { cwd_state new_state; int retval; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, path, NULL, CWD_EXPAND TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return -1; } retval = php_sys_lstat(new_state.cwd, buf); -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return retval; } /* }}} */ @@ -1922,31 +1780,16 @@ CWD_API int virtual_unlink(const char *path TSRMLS_DC) /* {{{ */ { cwd_state new_state; int retval; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, path, NULL, CWD_EXPAND TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return -1; } retval = unlink(new_state.cwd); -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return retval; } /* }}} */ @@ -1955,32 +1798,19 @@ CWD_API int virtual_mkdir(const char *pathname, mode_t mode TSRMLS_DC) /* {{{ */ { cwd_state new_state; int retval; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, pathname, NULL, CWD_FILEPATH TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return -1; } #ifdef TSRM_WIN32 retval = mkdir(new_state.cwd); - last_error = GetLastError(); #else retval = mkdir(new_state.cwd, mode); #endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return retval; } /* }}} */ @@ -1989,31 +1819,16 @@ CWD_API int virtual_rmdir(const char *pathname TSRMLS_DC) /* {{{ */ { cwd_state new_state; int retval; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, pathname, NULL, CWD_EXPAND TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return -1; } retval = rmdir(new_state.cwd); -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return retval; } /* }}} */ @@ -2026,31 +1841,16 @@ CWD_API DIR *virtual_opendir(const char *pathname TSRMLS_DC) /* {{{ */ { cwd_state new_state; DIR *retval; -#ifdef TSRM_WIN32 - DWORD last_error; -#endif CWD_STATE_COPY(&new_state, &CWDG(cwd)); if (virtual_file_ex(&new_state, pathname, NULL, CWD_REALPATH TSRMLS_CC)) { -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return NULL; } retval = opendir(new_state.cwd); -#ifdef TSRM_WIN32 - last_error = GetLastError(); -#endif - CWD_STATE_FREE(&new_state); -#ifdef TSRM_WIN32 - SetLastError(last_error); -#endif + CWD_STATE_FREE_ERR(&new_state); return retval; } /* }}} */ From 832c82603f39dadf271222deddf7f4a183997c13 Mon Sep 17 00:00:00 2001 From: Yasuo Ohgaki Date: Thu, 31 Oct 2013 07:28:43 +0900 Subject: [PATCH 362/400] Add crypt() change in UPGRADING --- UPGRADING | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/UPGRADING b/UPGRADING index d2133338a3486..6e77f1d5b1ec0 100755 --- a/UPGRADING +++ b/UPGRADING @@ -68,6 +68,10 @@ PHP X.Y UPGRADE NOTES CURLOPT_SAFE_UPLOAD is now turned on by default and uploads with @file do not work unless it is explicitly set to false. +- String: + crypt() is now raise E_NOTICE error if salt parameter is omitted. + See: https://wiki.php.net/rfc/crypt_function_salt + - XMLReader: XMLReader::getAttributeNs and XMLReader::getAttributeNo now return NULL if the attribute could not be found, just like XMLReader::getAttribute. From 3b2ca392f1df71364b07b1c1e522aed5f8c00795 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 31 Oct 2013 11:33:39 +0400 Subject: [PATCH 363/400] Removed unnecessary GC checks --- Zend/zend_execute.c | 8 +- Zend/zend_execute.h | 14 + Zend/zend_vm_execute.h | 994 ++++++++++++++++++++--------------------- Zend/zend_vm_gen.php | 20 +- 4 files changed, 525 insertions(+), 511 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 9f78218d3de35..b5c35ca40f028 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -79,7 +79,6 @@ static zend_always_inline void zend_pzval_unlock_func(zval *z, zend_free_op *sho if (unref && Z_ISREF_P(z) && Z_REFCOUNT_P(z) == 1) { Z_UNSET_ISREF_P(z); } - GC_ZVAL_CHECK_POSSIBLE_ROOT(z); } } @@ -95,6 +94,7 @@ static zend_always_inline void zend_pzval_unlock_free_func(zval *z TSRMLS_DC) #undef zval_ptr_dtor #define zval_ptr_dtor(pzv) i_zval_ptr_dtor(*(pzv) ZEND_FILE_LINE_CC TSRMLS_CC) +#define zval_ptr_dtor_nogc(pzv) i_zval_ptr_dtor_nogc(*(pzv) ZEND_FILE_LINE_CC TSRMLS_CC) #define PZVAL_UNLOCK(z, f) zend_pzval_unlock_func(z, f, 1 TSRMLS_CC) #define PZVAL_UNLOCK_EX(z, f, u) zend_pzval_unlock_func(z, f, u TSRMLS_CC) @@ -125,18 +125,18 @@ static zend_always_inline void zend_pzval_unlock_free_func(zval *z TSRMLS_DC) if ((zend_uintptr_t)should_free.var & 1L) { \ zval_dtor((zval*)((zend_uintptr_t)should_free.var & ~1L)); \ } else { \ - zval_ptr_dtor(&should_free.var); \ + zval_ptr_dtor_nogc(&should_free.var); \ } \ } #define FREE_OP_IF_VAR(should_free) \ if (should_free.var != NULL && (((zend_uintptr_t)should_free.var & 1L) == 0)) { \ - zval_ptr_dtor(&should_free.var); \ + zval_ptr_dtor_nogc(&should_free.var); \ } #define FREE_OP_VAR_PTR(should_free) \ if (should_free.var) { \ - zval_ptr_dtor(&should_free.var); \ + zval_ptr_dtor_nogc(&should_free.var); \ } #define TMP_FREE(z) (zval*)(((zend_uintptr_t)(z)) | 1L) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index b68a82ef896e9..5c900e5ceced5 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -87,6 +87,20 @@ static zend_always_inline void i_zval_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC } } +static zend_always_inline void i_zval_ptr_dtor_nogc(zval *zval_ptr ZEND_FILE_LINE_DC TSRMLS_DC) +{ + if (!Z_DELREF_P(zval_ptr)) { + ZEND_ASSERT(zval_ptr != &EG(uninitialized_zval)); + GC_REMOVE_ZVAL_FROM_BUFFER(zval_ptr); + zval_dtor(zval_ptr); + efree_rel(zval_ptr); + } else { + if (Z_REFCOUNT_P(zval_ptr) == 1) { + Z_UNSET_ISREF_P(zval_ptr); + } + } +} + static zend_always_inline int i_zend_is_true(zval *op) { int result; diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 869bb199b2320..7ad7dcf463f51 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1754,7 +1754,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"); } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -1803,7 +1803,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); call->object = NULL; call->called_scope = NULL; call->is_ctor_call = 0; @@ -1822,7 +1822,7 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER(ZEND_OPCODE_H /* Delay closure destruction until its invocation */ call->fbc->common.prototype = (zend_function*)function_name; } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } call->is_ctor_call = 0; EX(call) = call; @@ -1893,7 +1893,7 @@ static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER(ZEND_OPCODE_H } call->is_ctor_call = 0; EX(call) = call; - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } else { @@ -4972,7 +4972,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -4987,7 +4987,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5002,7 +5002,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5017,7 +5017,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5032,7 +5032,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5047,7 +5047,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5062,7 +5062,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5077,7 +5077,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5092,7 +5092,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5109,7 +5109,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5125,7 +5125,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)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5141,7 +5141,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)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5157,7 +5157,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)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5173,7 +5173,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)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5188,7 +5188,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5203,7 +5203,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5218,7 +5218,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5233,7 +5233,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5411,12 +5411,12 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HA 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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (IS_CONST == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) { } @@ -5510,7 +5510,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_VAR_HANDLER(ZE } } if (IS_VAR != IS_CONST) { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else { if (UNEXPECTED(ce->constructor == NULL)) { @@ -5559,7 +5559,7 @@ static int ZEND_FASTCALL ZEND_CASE_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_A opline->op1.zv, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC) TSRMLS_CC); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -5634,7 +5634,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_VAR_HANDLER(ZEND_OPC /* do nothing */ break; } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL); } @@ -5952,7 +5952,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ generator->largest_used_integer_key = Z_LVAL_P(generator->key); } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { /* If no key was specified we use auto-increment keys */ generator->largest_used_integer_key++; @@ -10194,7 +10194,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10209,7 +10209,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10224,7 +10224,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10239,7 +10239,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10254,7 +10254,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10269,7 +10269,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10284,7 +10284,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10299,7 +10299,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10314,7 +10314,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10331,7 +10331,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10347,7 +10347,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10363,7 +10363,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10379,7 +10379,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10395,7 +10395,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10410,7 +10410,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10425,7 +10425,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10440,7 +10440,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10455,7 +10455,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10633,12 +10633,12 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HAND 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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (IS_TMP_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) { } @@ -10687,7 +10687,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 */ - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -10745,7 +10745,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE } } else { if (UNEXPECTED(EG(exception) != NULL)) { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); HANDLE_EXCEPTION(); } zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval); @@ -10767,7 +10767,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE call->is_ctor_call = 0; EX(call) = call; - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -10783,7 +10783,7 @@ static int ZEND_FASTCALL ZEND_CASE_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG _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_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -10858,7 +10858,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD /* do nothing */ break; } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL); } @@ -11176,7 +11176,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); } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { /* If no key was specified we use auto-increment keys */ generator->largest_used_integer_key++; @@ -12474,7 +12474,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -12487,7 +12487,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -12509,7 +12509,7 @@ static int ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS PZVAL_LOCK(&EG(uninitialized_zval)); AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -12534,7 +12534,7 @@ static int ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS AI_SET_PTR(&EX_T(opline->result.var), *var_ptr); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -12556,7 +12556,7 @@ static int ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS PZVAL_LOCK(&EG(uninitialized_zval)); AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -12581,7 +12581,7 @@ static int ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS AI_SET_PTR(&EX_T(opline->result.var), *var_ptr); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -12600,7 +12600,7 @@ static int ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG } if (IS_VAR == IS_VAR && UNEXPECTED(*var_ptr == &EG(error_zval))) { ZVAL_NULL(&EX_T(opline->result.var).tmp_var); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -12624,7 +12624,7 @@ static int ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG fast_increment_function(*var_ptr); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -12643,7 +12643,7 @@ static int ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG } if (IS_VAR == IS_VAR && UNEXPECTED(*var_ptr == &EG(error_zval))) { ZVAL_NULL(&EX_T(opline->result.var).tmp_var); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -12667,7 +12667,7 @@ static int ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG fast_decrement_function(*var_ptr); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -12686,7 +12686,7 @@ static int ZEND_FASTCALL ZEND_ECHO_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) } zend_print_variable(z); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -12713,7 +12713,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); } @@ -12743,7 +12743,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); } @@ -12773,7 +12773,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); } @@ -12807,7 +12807,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); } @@ -12838,7 +12838,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); } @@ -12879,7 +12879,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)) { - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR || @@ -12892,7 +12892,7 @@ 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); + zval_ptr_dtor_nogc(&free_op1.var); } else if ((IS_VAR == IS_CV || IS_VAR == IS_VAR) && retval_ptr == &EG(uninitialized_zval)) { zval *ret; @@ -12929,7 +12929,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) { - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } } else if (!0) { /* Not a temp var */ zval *ret; @@ -12979,7 +12979,7 @@ static int ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLE } } while (0); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); } @@ -13010,7 +13010,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); HANDLE_EXCEPTION(); } @@ -13034,7 +13034,7 @@ static int ZEND_FASTCALL zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_AR ALLOC_ZVAL(varptr); INIT_PZVAL_COPY(varptr, original_var); zval_copy_ctor(varptr); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { Z_UNSET_ISREF_P(varptr); } @@ -13085,7 +13085,7 @@ 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); + zval_ptr_dtor_nogc(&free_op1.var); zend_vm_stack_push(valptr TSRMLS_CC); } CHECK_EXCEPTION(); @@ -13124,7 +13124,7 @@ static int ZEND_FASTCALL ZEND_SEND_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG Z_ADDREF_P(varptr); zend_vm_stack_push(varptr TSRMLS_CC); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -13150,7 +13150,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))); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -13227,7 +13227,7 @@ static int ZEND_FASTCALL ZEND_CLONE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) AI_SET_PTR(&EX_T(opline->result.var), retval); } } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -13269,7 +13269,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) { - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } } else { ZVAL_COPY_VALUE(result, expr); @@ -13286,7 +13286,7 @@ static int ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) convert_to_object(result); break; } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -13375,7 +13375,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); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); if (UNEXPECTED(EG(exception) != NULL)) { HANDLE_EXCEPTION(); } else if (EXPECTED(new_op_array != NULL)) { @@ -13511,13 +13511,13 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG 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); + zval_ptr_dtor_nogc(&free_op1.var); } if (iter && EXPECTED(EG(exception) == NULL)) { array_ptr = zend_iterator_wrap(iter TSRMLS_CC); } else { if (IS_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) { - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&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); @@ -13536,7 +13536,7 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG if (UNEXPECTED(EG(exception) != NULL)) { zval_ptr_dtor(&array_ptr); if (IS_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) { - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } HANDLE_EXCEPTION(); } @@ -13545,7 +13545,7 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG if (UNEXPECTED(EG(exception) != NULL)) { zval_ptr_dtor(&array_ptr); if (IS_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) { - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } HANDLE_EXCEPTION(); } @@ -13577,7 +13577,7 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG } if (IS_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) { - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } if (is_empty) { ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num); @@ -13733,7 +13733,7 @@ static int ZEND_FASTCALL ZEND_EXIT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) } else { zend_print_variable(ptr); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } #endif zend_bailout(); @@ -13754,14 +13754,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); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&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); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -13789,14 +13789,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); } } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&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); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -13814,7 +13814,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); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -13842,7 +13842,7 @@ static int ZEND_FASTCALL ZEND_QM_ASSIGN_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLE } } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -13863,7 +13863,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -13877,7 +13877,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -13892,7 +13892,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -13907,7 +13907,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -13922,7 +13922,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -13937,7 +13937,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -13952,7 +13952,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -13967,7 +13967,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -13982,7 +13982,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -13997,7 +13997,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -14014,7 +14014,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -14030,7 +14030,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)); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -14046,7 +14046,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)); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -14062,7 +14062,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)); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -14078,7 +14078,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)); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -14093,7 +14093,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -14108,7 +14108,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -14123,7 +14123,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -14138,7 +14138,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -14249,7 +14249,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(int (*b FREE_OP(free_op_data1); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_obj has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -14304,7 +14304,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CONST(int (*binar AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); if (opline->extended_value == ZEND_ASSIGN_DIM) { ZEND_VM_INC_OPCODE(); @@ -14335,11 +14335,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CONST(int (*binar if (opline->extended_value == ZEND_ASSIGN_DIM) { FREE_OP(free_op_data1); FREE_OP_VAR_PTR(free_op_data2); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); } else { - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); @@ -14429,7 +14429,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CONST(incdec_t PZVAL_LOCK(&EG(uninitialized_zval)); *retval = &EG(uninitialized_zval); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -14489,7 +14489,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CONST(incdec_t } else { } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -14530,7 +14530,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CONST(incdec_ zend_error(E_WARNING, "Attempt to increment/decrement property of non-object"); ZVAL_NULL(retval); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -14591,7 +14591,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CONST(incdec_ } else { } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -14640,7 +14640,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); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -14650,7 +14650,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); /* @@ -14687,11 +14687,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) { - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } break; case ZEND_FETCH_LOCAL: - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); break; case ZEND_FETCH_STATIC: zval_update_constant(retval, (void*) 1 TSRMLS_CC); @@ -14780,13 +14780,13 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HA 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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { 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 (IS_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } } @@ -14811,7 +14811,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HA 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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* We are going to assign the result by reference */ if (UNEXPECTED(opline->extended_value != 0)) { @@ -14845,7 +14845,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_H 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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -14860,7 +14860,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_H 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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -14883,7 +14883,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OP EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } else { if (IS_CONST == IS_UNUSED) { zend_error_noreturn(E_ERROR, "Cannot use [] for reading"); @@ -14891,7 +14891,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OP 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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -14919,7 +14919,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_CONST_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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; if (UNEXPECTED(EX_T(opline->result.var).var.ptr_ptr == NULL)) { zend_error_noreturn(E_ERROR, "Cannot unset string offsets"); ZEND_VM_NEXT_OPCODE(); @@ -14976,7 +14976,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_CONST( } } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -15013,7 +15013,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HA 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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* We are going to assign the result by reference */ if (opline->extended_value & ZEND_FETCH_MAKE_REF) { @@ -15056,7 +15056,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_H 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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -15098,7 +15098,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_H } } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -15132,7 +15132,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } else { @@ -15171,7 +15171,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST_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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; PZVAL_UNLOCK(*EX_T(opline->result.var).var.ptr_ptr, &free_res); if (EX_T(opline->result.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) { @@ -15206,7 +15206,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAN } else { } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_obj has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -15286,7 +15286,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAN FREE_OP_VAR_PTR(free_op_data2); FREE_OP_IF_VAR(free_op_data1); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_dim has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -15340,7 +15340,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER } } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* zend_assign_to_variable() always takes care of op2, never free it! */ @@ -15422,7 +15422,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCO call->is_ctor_call = 0; EX(call) = call; - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -15693,7 +15693,7 @@ 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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else if (IS_VAR == IS_CV) { Z_ADDREF_P(expr_ptr); } @@ -15737,7 +15737,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST_HANDLER(ZEND_OPC 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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -15806,7 +15806,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); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); HANDLE_EXCEPTION(); } if (UNEXPECTED(ce == NULL)) { @@ -15830,7 +15830,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); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -15925,7 +15925,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAND } else { } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -15966,7 +15966,7 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAND } else { } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16036,7 +16036,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); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } if (opline->extended_value & ZEND_ISSET) { @@ -16188,7 +16188,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CONST( Z_LVAL(EX_T(opline->result.var).tmp_var) = !result; } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16270,7 +16270,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ generator->value = *value_ptr; } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } } else { zval *value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); @@ -16290,7 +16290,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ } generator->value = copy; - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { if (IS_VAR == IS_CV) { Z_ADDREF_P(value); @@ -16369,7 +16369,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16384,7 +16384,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16399,7 +16399,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16414,7 +16414,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16429,7 +16429,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16444,7 +16444,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16459,7 +16459,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16474,7 +16474,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16489,7 +16489,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16506,7 +16506,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16522,7 +16522,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)); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16538,7 +16538,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)); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16554,7 +16554,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)); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16570,7 +16570,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)); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16585,7 +16585,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16600,7 +16600,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16615,7 +16615,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16630,7 +16630,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); zval_dtor(free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -16741,7 +16741,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_TMP(int (*bin FREE_OP(free_op_data1); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_obj has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -16796,7 +16796,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_TMP(int (*binary_ AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval)); } zval_dtor(free_op2.var); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); if (opline->extended_value == ZEND_ASSIGN_DIM) { ZEND_VM_INC_OPCODE(); @@ -16828,11 +16828,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_TMP(int (*binary_ if (opline->extended_value == ZEND_ASSIGN_DIM) { FREE_OP(free_op_data1); FREE_OP_VAR_PTR(free_op_data2); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); } else { - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); @@ -16922,7 +16922,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_TMP(incdec_t i PZVAL_LOCK(&EG(uninitialized_zval)); *retval = &EG(uninitialized_zval); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -16982,7 +16982,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_TMP(incdec_t i } else { zval_dtor(free_op2.var); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -17023,7 +17023,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_TMP(incdec_t zend_error(E_WARNING, "Attempt to increment/decrement property of non-object"); zval_dtor(free_op2.var); ZVAL_NULL(retval); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -17084,7 +17084,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_TMP(incdec_t } else { zval_dtor(free_op2.var); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -17111,13 +17111,13 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAND 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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { 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 (IS_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } } @@ -17142,7 +17142,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAND 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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* We are going to assign the result by reference */ if (UNEXPECTED(opline->extended_value != 0)) { @@ -17176,7 +17176,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAN 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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -17191,7 +17191,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAN 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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -17214,7 +17214,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMP_HANDLER(ZEND_OPCO EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } zval_dtor(free_op2.var); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } else { if (IS_TMP_VAR == IS_UNUSED) { zend_error_noreturn(E_ERROR, "Cannot use [] for reading"); @@ -17222,7 +17222,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMP_HANDLER(ZEND_OPCO 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_ptr_dtor_nogc(&free_op1.var); } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -17250,7 +17250,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_ 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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; if (UNEXPECTED(EX_T(opline->result.var).var.ptr_ptr == NULL)) { zend_error_noreturn(E_ERROR, "Cannot unset string offsets"); ZEND_VM_NEXT_OPCODE(); @@ -17307,7 +17307,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_TMP(ZE } } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -17344,7 +17344,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAND 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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* We are going to assign the result by reference */ if (opline->extended_value & ZEND_FETCH_MAKE_REF) { @@ -17387,7 +17387,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAN 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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -17429,7 +17429,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAN } } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -17463,7 +17463,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_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)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } else { @@ -17502,7 +17502,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_ 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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; PZVAL_UNLOCK(*EX_T(opline->result.var).var.ptr_ptr, &free_res); if (EX_T(opline->result.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) { @@ -17537,7 +17537,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDL } else { zval_dtor(free_op2.var); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_obj has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -17618,7 +17618,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDL FREE_OP_VAR_PTR(free_op_data2); FREE_OP_IF_VAR(free_op_data1); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_dim has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -17672,7 +17672,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_A } } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* zend_assign_to_variable() always takes care of op2, never free it! */ @@ -17755,7 +17755,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE EX(call) = call; zval_dtor(free_op2.var); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -17930,7 +17930,7 @@ 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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else if (IS_VAR == IS_CV) { Z_ADDREF_P(expr_ptr); } @@ -17974,7 +17974,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMP_HANDLER(ZEND_OPCOD 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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -18084,7 +18084,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLE } else { zval_dtor(free_op2.var); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -18125,7 +18125,7 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLE } else { zval_dtor(free_op2.var); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -18262,7 +18262,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_TMP(in Z_LVAL(EX_T(opline->result.var).tmp_var) = !result; } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -18344,7 +18344,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR generator->value = *value_ptr; } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } } else { zval *value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); @@ -18364,7 +18364,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR } generator->value = copy; - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { if (IS_VAR == IS_CV) { Z_ADDREF_P(value); @@ -18443,8 +18443,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); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18458,8 +18458,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); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18473,8 +18473,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); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18488,8 +18488,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); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18503,8 +18503,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); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18518,8 +18518,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); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18533,8 +18533,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); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18548,8 +18548,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); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18563,8 +18563,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); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18580,8 +18580,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); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18596,8 +18596,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)); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18612,8 +18612,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)); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18628,8 +18628,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)); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18644,8 +18644,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)); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18659,8 +18659,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); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18674,8 +18674,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); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18689,8 +18689,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); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18704,8 +18704,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); - zval_ptr_dtor(&free_op1.var); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -18729,7 +18729,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"); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); FREE_OP(free_op_data1); if (RETURN_VALUE_USED(opline)) { @@ -18810,12 +18810,12 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_VAR(int (*bin if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } FREE_OP(free_op_data1); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_obj has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -18869,8 +18869,8 @@ 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)); } - zval_ptr_dtor(&free_op2.var); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + zval_ptr_dtor_nogc(&free_op2.var); + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); if (opline->extended_value == ZEND_ASSIGN_DIM) { ZEND_VM_INC_OPCODE(); @@ -18897,16 +18897,16 @@ 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); } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (opline->extended_value == ZEND_ASSIGN_DIM) { FREE_OP(free_op_data1); FREE_OP_VAR_PTR(free_op_data2); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); } else { - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); @@ -18991,12 +18991,12 @@ 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"); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (RETURN_VALUE_USED(opline)) { PZVAL_LOCK(&EG(uninitialized_zval)); *retval = &EG(uninitialized_zval); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -19054,9 +19054,9 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_VAR(incdec_t i if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -19095,9 +19095,9 @@ 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"); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); ZVAL_NULL(retval); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -19156,9 +19156,9 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_VAR(incdec_t if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -19207,7 +19207,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); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -19217,7 +19217,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); /* @@ -19254,11 +19254,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) { - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } break; case ZEND_FETCH_LOCAL: - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); break; case ZEND_FETCH_STATIC: zval_update_constant(retval, (void*) 1 TSRMLS_CC); @@ -19346,14 +19346,14 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAND 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); - zval_ptr_dtor(&free_op2.var); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { 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_nogc(&free_op2.var); if (IS_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } } @@ -19374,11 +19374,11 @@ 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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&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)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* We are going to assign the result by reference */ if (UNEXPECTED(opline->extended_value != 0)) { @@ -19408,11 +19408,11 @@ 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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&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)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -19426,8 +19426,8 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN SAVE_OPLINE(); 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); - zval_ptr_dtor(&free_op2.var); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -19449,16 +19449,16 @@ 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);}; + zval_ptr_dtor_nogc(&free_op2.var); + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } else { if (IS_VAR == IS_UNUSED) { zend_error_noreturn(E_ERROR, "Cannot use [] for reading"); } 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); + zval_ptr_dtor_nogc(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -19482,11 +19482,11 @@ 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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&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)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; if (UNEXPECTED(EX_T(opline->result.var).var.ptr_ptr == NULL)) { zend_error_noreturn(E_ERROR, "Cannot unset string offsets"); ZEND_VM_NEXT_OPCODE(); @@ -19522,7 +19522,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)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { zval *retval; @@ -19539,11 +19539,11 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_VAR(ZE if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -19575,12 +19575,12 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAND if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&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)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* We are going to assign the result by reference */ if (opline->extended_value & ZEND_FETCH_MAKE_REF) { @@ -19618,12 +19618,12 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&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)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -19644,7 +19644,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)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { zval *retval; @@ -19661,11 +19661,11 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -19694,12 +19694,12 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_VAR_HANDLER(ZEND_OPCO if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&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)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } else { @@ -19733,12 +19733,12 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_ if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&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)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; PZVAL_UNLOCK(*EX_T(opline->result.var).var.ptr_ptr, &free_res); if (EX_T(opline->result.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) { @@ -19771,9 +19771,9 @@ static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL if (0) { zval_ptr_dtor(&property_name); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_obj has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -19803,7 +19803,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL if (0) { zval_ptr_dtor(&property_name); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else { zend_free_op free_op2, free_op_data1, free_op_data2; @@ -19812,7 +19812,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&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); @@ -19854,7 +19854,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL FREE_OP_VAR_PTR(free_op_data2); FREE_OP_IF_VAR(free_op_data1); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_dim has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -19908,10 +19908,10 @@ static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_A } } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* zend_assign_to_variable() always takes care of op2, never free it! */ - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -19937,7 +19937,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL } zend_error(E_STRICT, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { - if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; + if (free_op2.var) {zval_ptr_dtor_nogc(&free_op2.var);}; HANDLE_EXCEPTION(); } return ZEND_ASSIGN_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -19964,8 +19964,8 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL AI_SET_PTR(&EX_T(opline->result.var), *variable_ptr_ptr); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; - if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; + if (free_op2.var) {zval_ptr_dtor_nogc(&free_op2.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -20023,7 +20023,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE } } else { if (UNEXPECTED(EG(exception) != NULL)) { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); HANDLE_EXCEPTION(); } zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval); @@ -20045,8 +20045,8 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE call->is_ctor_call = 0; EX(call) = call; - zval_ptr_dtor(&free_op2.var); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op2.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -20136,7 +20136,7 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND } } if (IS_VAR != IS_CONST) { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else { if (UNEXPECTED(ce->constructor == NULL)) { @@ -20185,7 +20185,7 @@ static int ZEND_FASTCALL ZEND_CASE_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG _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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -20221,7 +20221,7 @@ 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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else if (IS_VAR == IS_CV) { Z_ADDREF_P(expr_ptr); } @@ -20260,12 +20260,12 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD /* do nothing */ break; } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -20334,7 +20334,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); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); HANDLE_EXCEPTION(); } if (UNEXPECTED(ce == NULL)) { @@ -20358,7 +20358,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); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -20426,7 +20426,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE zend_error(E_WARNING, "Illegal offset type in unset"); break; } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); break; } case IS_OBJECT: @@ -20440,20 +20440,20 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } break; case IS_STRING: zend_error_noreturn(E_ERROR, "Cannot unset string offsets"); ZEND_VM_CONTINUE(); /* bailed out before */ default: - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); break; } } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -20486,15 +20486,15 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -20564,7 +20564,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); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } if (opline->extended_value & ZEND_ISSET) { @@ -20652,7 +20652,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(in result = 1; } } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else if (Z_TYPE_P(container) == IS_OBJECT) { if (0) { MAKE_REAL_ZVAL_PTR(offset); @@ -20675,7 +20675,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(in if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; @@ -20704,9 +20704,9 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(in } } } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL; @@ -20716,7 +20716,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(in Z_LVAL(EX_T(opline->result.var).tmp_var) = !result; } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -20798,7 +20798,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR generator->value = *value_ptr; } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } } else { zval *value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); @@ -20818,7 +20818,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR } generator->value = copy; - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { if (IS_VAR == IS_CV) { Z_ADDREF_P(value); @@ -20863,7 +20863,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); } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { /* If no key was specified we use auto-increment keys */ generator->largest_used_integer_key++; @@ -20994,7 +20994,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_UNUSED(int (* FREE_OP(free_op_data1); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_obj has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -21049,7 +21049,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_UNUSED(int (*bina AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); if (opline->extended_value == ZEND_ASSIGN_DIM) { ZEND_VM_INC_OPCODE(); @@ -21080,11 +21080,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_UNUSED(int (*bina if (opline->extended_value == ZEND_ASSIGN_DIM) { FREE_OP(free_op_data1); FREE_OP_VAR_PTR(free_op_data2); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); } else { - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); @@ -21179,7 +21179,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); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -21189,7 +21189,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC); /* @@ -21226,11 +21226,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) { - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } break; case ZEND_FETCH_LOCAL: - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); break; case ZEND_FETCH_STATIC: zval_update_constant(retval, (void*) 1 TSRMLS_CC); @@ -21324,7 +21324,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_H 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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* We are going to assign the result by reference */ if (UNEXPECTED(opline->extended_value != 0)) { @@ -21358,7 +21358,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_ 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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -21381,7 +21381,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED_HANDLER(ZEND_O EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } else { if (IS_UNUSED == IS_UNUSED) { zend_error_noreturn(E_ERROR, "Cannot use [] for reading"); @@ -21389,7 +21389,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED_HANDLER(ZEND_O 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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -21468,7 +21468,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HA FREE_OP_VAR_PTR(free_op_data2); FREE_OP_IF_VAR(free_op_data1); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_dim has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -21629,7 +21629,7 @@ 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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else if (IS_VAR == IS_CV) { Z_ADDREF_P(expr_ptr); } @@ -21673,7 +21673,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER(ZEND_OP 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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -21742,7 +21742,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); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); HANDLE_EXCEPTION(); } if (UNEXPECTED(ce == NULL)) { @@ -21766,7 +21766,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); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -21835,7 +21835,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); } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } if (opline->extended_value & ZEND_ISSET) { @@ -21943,7 +21943,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER generator->value = *value_ptr; } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } } else { zval *value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); @@ -21963,7 +21963,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER } generator->value = copy; - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { if (IS_VAR == IS_CV) { Z_ADDREF_P(value); @@ -22042,7 +22042,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22057,7 +22057,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22072,7 +22072,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22087,7 +22087,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22102,7 +22102,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22117,7 +22117,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22132,7 +22132,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22147,7 +22147,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22162,7 +22162,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22179,7 +22179,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22195,7 +22195,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)); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22211,7 +22211,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)); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22227,7 +22227,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)); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22243,7 +22243,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)); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22258,7 +22258,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22273,7 +22273,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22288,7 +22288,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22303,7 +22303,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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22414,7 +22414,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_CV(int (*bina FREE_OP(free_op_data1); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_obj has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -22469,7 +22469,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CV(int (*binary_o AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); if (opline->extended_value == ZEND_ASSIGN_DIM) { ZEND_VM_INC_OPCODE(); @@ -22500,11 +22500,11 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CV(int (*binary_o if (opline->extended_value == ZEND_ASSIGN_DIM) { FREE_OP(free_op_data1); FREE_OP_VAR_PTR(free_op_data2); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); } else { - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); } ZEND_VM_NEXT_OPCODE(); @@ -22594,7 +22594,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CV(incdec_t in PZVAL_LOCK(&EG(uninitialized_zval)); *retval = &EG(uninitialized_zval); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -22654,7 +22654,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CV(incdec_t in } else { } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -22695,7 +22695,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CV(incdec_t i zend_error(E_WARNING, "Attempt to increment/decrement property of non-object"); ZVAL_NULL(retval); - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -22756,7 +22756,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CV(incdec_t i } else { } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -22783,13 +22783,13 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDL 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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { 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 (IS_VAR == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) { - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } } @@ -22814,7 +22814,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDL 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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* We are going to assign the result by reference */ if (UNEXPECTED(opline->extended_value != 0)) { @@ -22848,7 +22848,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HAND 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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -22863,7 +22863,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HAND 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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -22886,7 +22886,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV_HANDLER(ZEND_OPCOD EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } else { if (IS_CV == IS_UNUSED) { zend_error_noreturn(E_ERROR, "Cannot use [] for reading"); @@ -22894,7 +22894,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV_HANDLER(ZEND_OPCOD 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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -22922,7 +22922,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_H 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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; if (UNEXPECTED(EX_T(opline->result.var).var.ptr_ptr == NULL)) { zend_error_noreturn(E_ERROR, "Cannot unset string offsets"); ZEND_VM_NEXT_OPCODE(); @@ -22979,7 +22979,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_CV(ZEN } } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -23016,7 +23016,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDL 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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* We are going to assign the result by reference */ if (opline->extended_value & ZEND_FETCH_MAKE_REF) { @@ -23059,7 +23059,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HAND 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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -23101,7 +23101,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HAND } } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -23135,7 +23135,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } else { @@ -23174,7 +23174,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_H 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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; PZVAL_UNLOCK(*EX_T(opline->result.var).var.ptr_ptr, &free_res); if (EX_T(opline->result.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) { @@ -23209,7 +23209,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLE } else { } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_obj has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -23289,7 +23289,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLE FREE_OP_VAR_PTR(free_op_data2); FREE_OP_IF_VAR(free_op_data1); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* assign_dim has two opcodes! */ CHECK_EXCEPTION(); ZEND_VM_INC_OPCODE(); @@ -23343,7 +23343,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_AR } } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; /* zend_assign_to_variable() always takes care of op2, never free it! */ @@ -23398,7 +23398,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLE AI_SET_PTR(&EX_T(opline->result.var), *variable_ptr_ptr); } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -23478,7 +23478,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_ call->is_ctor_call = 0; EX(call) = call; - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -23652,7 +23652,7 @@ 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); - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else if (IS_VAR == IS_CV) { Z_ADDREF_P(expr_ptr); } @@ -23696,7 +23696,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE 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);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -23806,7 +23806,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER } else { } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -23847,7 +23847,7 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER } else { } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -23984,7 +23984,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CV(int Z_LVAL(EX_T(opline->result.var).tmp_var) = !result; } - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -24066,7 +24066,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG generator->value = *value_ptr; } - if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}; } } else { zval *value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC); @@ -24086,7 +24086,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG } generator->value = copy; - zval_ptr_dtor(&free_op1.var); + zval_ptr_dtor_nogc(&free_op1.var); } else { if (IS_VAR == IS_CV) { Z_ADDREF_P(value); @@ -26973,7 +26973,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"); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); FREE_OP(free_op_data1); if (RETURN_VALUE_USED(opline)) { @@ -27054,7 +27054,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_VAR(int (* if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } FREE_OP(free_op_data1); } @@ -27112,7 +27112,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)); } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); if (opline->extended_value == ZEND_ASSIGN_DIM) { @@ -27140,7 +27140,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); } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (opline->extended_value == ZEND_ASSIGN_DIM) { FREE_OP(free_op_data1); @@ -27234,7 +27234,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"); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (RETURN_VALUE_USED(opline)) { PZVAL_LOCK(&EG(uninitialized_zval)); *retval = &EG(uninitialized_zval); @@ -27297,7 +27297,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_VAR(incdec_ if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } CHECK_EXCEPTION(); @@ -27338,7 +27338,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"); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); ZVAL_NULL(retval); CHECK_EXCEPTION(); @@ -27399,7 +27399,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_VAR(incdec if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } CHECK_EXCEPTION(); @@ -27433,7 +27433,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)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { zval *retval; @@ -27450,7 +27450,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_UNUSED_VAR if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } @@ -27485,7 +27485,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_H if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); @@ -27527,7 +27527,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_ if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); @@ -27553,7 +27553,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)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { zval *retval; @@ -27570,7 +27570,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_ if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } @@ -27602,7 +27602,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_VAR_HANDLER(ZEND_O if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); @@ -27641,7 +27641,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCO if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); @@ -27678,7 +27678,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HA if (0) { zval_ptr_dtor(&property_name); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } /* assign_obj has two opcodes! */ @@ -27726,7 +27726,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 */ - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -27784,7 +27784,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPC } } else { if (UNEXPECTED(EG(exception) != NULL)) { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); HANDLE_EXCEPTION(); } zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval); @@ -27806,7 +27806,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPC call->is_ctor_call = 0; EX(call) = call; - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -27889,7 +27889,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HAN zend_error(E_WARNING, "Illegal offset type in unset"); break; } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); break; } case IS_OBJECT: @@ -27903,18 +27903,18 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HAN if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } break; case IS_STRING: zend_error_noreturn(E_ERROR, "Cannot unset string offsets"); ZEND_VM_CONTINUE(); /* bailed out before */ default: - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); break; } } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } CHECK_EXCEPTION(); @@ -27948,13 +27948,13 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HAN if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } CHECK_EXCEPTION(); @@ -28028,7 +28028,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_VAR result = 1; } } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else if (Z_TYPE_P(container) == IS_OBJECT) { if (0) { MAKE_REAL_ZVAL_PTR(offset); @@ -28051,7 +28051,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_VAR if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; @@ -28080,9 +28080,9 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_VAR } } } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL; @@ -28236,7 +28236,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER generator->largest_used_integer_key = Z_LVAL_P(generator->key); } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { /* If no key was specified we use auto-increment keys */ generator->largest_used_integer_key++; @@ -35431,7 +35431,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35446,7 +35446,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35461,7 +35461,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35476,7 +35476,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35491,7 +35491,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35506,7 +35506,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35521,7 +35521,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35536,7 +35536,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35551,7 +35551,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35568,7 +35568,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35584,7 +35584,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)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35600,7 +35600,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)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35616,7 +35616,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)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35632,7 +35632,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)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35647,7 +35647,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35662,7 +35662,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35677,7 +35677,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35692,7 +35692,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -35716,7 +35716,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"); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); FREE_OP(free_op_data1); if (RETURN_VALUE_USED(opline)) { @@ -35797,7 +35797,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_VAR(int (*bina if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } FREE_OP(free_op_data1); } @@ -35855,7 +35855,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)); } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); if (opline->extended_value == ZEND_ASSIGN_DIM) { @@ -35883,7 +35883,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); } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (opline->extended_value == ZEND_ASSIGN_DIM) { FREE_OP(free_op_data1); @@ -35977,7 +35977,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"); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (RETURN_VALUE_USED(opline)) { PZVAL_LOCK(&EG(uninitialized_zval)); *retval = &EG(uninitialized_zval); @@ -36040,7 +36040,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_VAR(incdec_t in if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } CHECK_EXCEPTION(); @@ -36081,7 +36081,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"); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); ZVAL_NULL(retval); CHECK_EXCEPTION(); @@ -36142,7 +36142,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_VAR(incdec_t i if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } CHECK_EXCEPTION(); @@ -36332,12 +36332,12 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDL 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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (IS_CV == IS_VAR && !(opline->extended_value & ZEND_FETCH_ADD_LOCK)) { } @@ -36360,7 +36360,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } @@ -36393,7 +36393,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } @@ -36411,7 +36411,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -36434,7 +36434,7 @@ 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); + zval_ptr_dtor_nogc(&free_op2.var); } else { if (IS_VAR == IS_UNUSED) { @@ -36442,7 +36442,7 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_VAR_HANDLER(ZEND_OPCOD } 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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } CHECK_EXCEPTION(); @@ -36467,7 +36467,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); } @@ -36507,7 +36507,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)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { zval *retval; @@ -36524,7 +36524,7 @@ static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_CV_VAR(ZEN if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } @@ -36559,7 +36559,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDL if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); @@ -36601,7 +36601,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); @@ -36627,7 +36627,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)); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { zval *retval; @@ -36644,7 +36644,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } @@ -36676,7 +36676,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_VAR_HANDLER(ZEND_OPCOD if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); @@ -36715,7 +36715,7 @@ static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_H if (0) { zval_ptr_dtor(&property); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) { EXTRACT_ZVAL_PTR(&EX_T(opline->result.var)); @@ -36752,7 +36752,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE if (0) { zval_ptr_dtor(&property_name); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } /* assign_obj has two opcodes! */ @@ -36784,7 +36784,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE if (0) { zval_ptr_dtor(&property_name); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else { zend_free_op free_op2, free_op_data1, free_op_data2; @@ -36793,7 +36793,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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&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); @@ -36890,7 +36890,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! */ - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -36916,7 +36916,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE } zend_error(E_STRICT, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { - if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; + if (free_op2.var) {zval_ptr_dtor_nogc(&free_op2.var);}; HANDLE_EXCEPTION(); } return ZEND_ASSIGN_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -36943,7 +36943,7 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE AI_SET_PTR(&EX_T(opline->result.var), *variable_ptr_ptr); } - if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; + if (free_op2.var) {zval_ptr_dtor_nogc(&free_op2.var);}; CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -37001,7 +37001,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_ } } else { if (UNEXPECTED(EG(exception) != NULL)) { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); HANDLE_EXCEPTION(); } zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval); @@ -37023,7 +37023,7 @@ static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_ call->is_ctor_call = 0; EX(call) = call; - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); @@ -37039,7 +37039,7 @@ static int ZEND_FASTCALL ZEND_CASE_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); - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -37114,7 +37114,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_VAR_HANDLER(ZEND_OPCODE /* do nothing */ break; } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL); } @@ -37280,7 +37280,7 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER zend_error(E_WARNING, "Illegal offset type in unset"); break; } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); break; } case IS_OBJECT: @@ -37294,18 +37294,18 @@ static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } break; case IS_STRING: zend_error_noreturn(E_ERROR, "Cannot unset string offsets"); ZEND_VM_CONTINUE(); /* bailed out before */ default: - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); break; } } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } CHECK_EXCEPTION(); @@ -37339,13 +37339,13 @@ static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } CHECK_EXCEPTION(); @@ -37504,7 +37504,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_VAR(int result = 1; } } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else if (Z_TYPE_P(container) == IS_OBJECT) { if (0) { MAKE_REAL_ZVAL_PTR(offset); @@ -37527,7 +37527,7 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_VAR(int if (0) { zval_ptr_dtor(&offset); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } } else if (Z_TYPE_P(container) == IS_STRING && !prop_dim) { /* string offsets */ zval tmp; @@ -37556,9 +37556,9 @@ static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_VAR(int } } } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL; @@ -37712,7 +37712,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); } - zval_ptr_dtor(&free_op2.var); + zval_ptr_dtor_nogc(&free_op2.var); } else { /* If no key was specified we use auto-increment keys */ generator->largest_used_integer_key++; diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index a65349c4ed63d..a0546460d0e44 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -218,7 +218,7 @@ $op1_free_op = array( "ANY" => "FREE_OP(free_op1)", "TMP" => "zval_dtor(free_op1.var)", - "VAR" => "zval_ptr_dtor(&free_op1.var)", + "VAR" => "zval_ptr_dtor_nogc(&free_op1.var)", "CONST" => "", "UNUSED" => "", "CV" => "", @@ -227,7 +227,7 @@ $op2_free_op = array( "ANY" => "FREE_OP(free_op2)", "TMP" => "zval_dtor(free_op2.var)", - "VAR" => "zval_ptr_dtor(&free_op2.var)", + "VAR" => "zval_ptr_dtor_nogc(&free_op2.var)", "CONST" => "", "UNUSED" => "", "CV" => "", @@ -236,7 +236,7 @@ $op1_free_op_if_var = array( "ANY" => "FREE_OP_IF_VAR(free_op1)", "TMP" => "", - "VAR" => "zval_ptr_dtor(&free_op1.var)", + "VAR" => "zval_ptr_dtor_nogc(&free_op1.var)", "CONST" => "", "UNUSED" => "", "CV" => "", @@ -245,33 +245,33 @@ $op2_free_op_if_var = array( "ANY" => "FREE_OP_IF_VAR(free_op2)", "TMP" => "", - "VAR" => "zval_ptr_dtor(&free_op2.var)", + "VAR" => "zval_ptr_dtor_nogc(&free_op2.var)", "CONST" => "", "UNUSED" => "", "CV" => "", ); $op1_free_op_var_ptr = array( - "ANY" => "if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}", + "ANY" => "if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}", "TMP" => "", - "VAR" => "if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}", + "VAR" => "if (free_op1.var) {zval_ptr_dtor_nogc(&free_op1.var);}", "CONST" => "", "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)"; +$op1_free_op_var_ptr_fast["VAR"] = "zval_ptr_dtor_nogc(&free_op1.var)"; $op2_free_op_var_ptr = array( - "ANY" => "if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}", + "ANY" => "if (free_op2.var) {zval_ptr_dtor_nogc(&free_op2.var);}", "TMP" => "", - "VAR" => "if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}", + "VAR" => "if (free_op2.var) {zval_ptr_dtor_nogc(&free_op2.var);}", "CONST" => "", "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)"; +$op2_free_op_var_ptr_fast["VAR"] = "zval_ptr_dtor_nogc(&free_op2.var)"; $list = array(); // list of opcode handlers and helpers in original order $opcodes = array(); // opcode handlers by code From b4bed6fde09d1737fc118253d2cba03ff10fcaff Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Thu, 31 Oct 2013 03:06:35 -0700 Subject: [PATCH 364/400] Fix bug #66008 --- sapi/fpm/fpm/fpm_sockets.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sapi/fpm/fpm/fpm_sockets.c b/sapi/fpm/fpm/fpm_sockets.c index 145b2550c3bad..e056565ea4119 100644 --- a/sapi/fpm/fpm/fpm_sockets.c +++ b/sapi/fpm/fpm/fpm_sockets.c @@ -487,6 +487,7 @@ int fpm_socket_unix_test_connect(struct sockaddr_un *sock, size_t socklen) /* {{ } if (connect(fd, (struct sockaddr *)sock, socklen) == -1) { + close(fd); return -1; } From 812dfbc4315d38a4ee6669e8b7de50493a8bb3bd Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Thu, 31 Oct 2013 03:18:07 -0700 Subject: [PATCH 365/400] Fix bug #66008 --- sapi/fpm/fpm/fpm_sockets.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sapi/fpm/fpm/fpm_sockets.c b/sapi/fpm/fpm/fpm_sockets.c index 145b2550c3bad..e056565ea4119 100644 --- a/sapi/fpm/fpm/fpm_sockets.c +++ b/sapi/fpm/fpm/fpm_sockets.c @@ -487,6 +487,7 @@ int fpm_socket_unix_test_connect(struct sockaddr_un *sock, size_t socklen) /* {{ } if (connect(fd, (struct sockaddr *)sock, socklen) == -1) { + close(fd); return -1; } From 7cd5ae6fabd5763c1ea35150b0451e14bd1c9b00 Mon Sep 17 00:00:00 2001 From: Antony Dovgal Date: Thu, 31 Oct 2013 15:04:33 +0400 Subject: [PATCH 366/400] add news entry about FPM backlog change and move the other entry to its proper place --- NEWS | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 2c784b8fbbcec..0c8a15a5f9175 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,10 @@ PHP NEWS (brainstorm at nopcode dot org) . Fixed bug #65911 (scope resolution operator - strange behavior with $this). (Bob Weinand) + . Fixed bug #65936 (dangling context pointer causes crash). (Tony) + +- FPM: + . Changed default listen() backlog to 65535. (Tony) - OPcache . Increased limit for opcache.max_accelerated_files to 1,000,000. (Chris) @@ -30,7 +34,6 @@ PHP NEWS . Fixed bug #65322 (compile time errors won't trigger auto loading). (Nikita) . Fixed bug #65821 (By-ref foreach on property access of string offset segfaults). (Nikita) - . Fixed bug #65936 (dangling context pointer causes crash). (Tony) - CLI server: . Fixed bug #65633 (built-in server treat some http headers as From 4d430ecb02447f3a94571216b800dfef0e48b400 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Thu, 31 Oct 2013 17:39:17 +0100 Subject: [PATCH 367/400] simplify the state free macros --- Zend/zend_virtual_cwd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c index f281606f9d5e4..4478cd380932e 100644 --- a/Zend/zend_virtual_cwd.c +++ b/Zend/zend_virtual_cwd.c @@ -153,8 +153,7 @@ static int php_check_dots(const char *element, int n) memcpy((d)->cwd, (s)->cwd, (s)->cwd_length+1); #define CWD_STATE_FREE(s) \ - efree((s)->cwd); \ - (s)->cwd = NULL; + efree((s)->cwd); #ifdef TSRM_WIN32 # define CWD_STATE_FREE_ERR(state) do { \ @@ -514,6 +513,7 @@ CWD_API int virtual_cwd_deactivate(TSRMLS_D) /* {{{ */ { if (CWDG(cwd).cwd != NULL) { CWD_STATE_FREE(&CWDG(cwd)); + CWDG(cwd).cwd = NULL; } return 0; } From f1c2f8f9f17c063ac26aa5e3d0240bc6e0d07c39 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Thu, 31 Oct 2013 21:38:24 +0100 Subject: [PATCH 368/400] removed unnecessary call --- Zend/zend_virtual_cwd.c | 1 - 1 file changed, 1 deletion(-) diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c index 4478cd380932e..d9da5cf4c0c8e 100644 --- a/Zend/zend_virtual_cwd.c +++ b/Zend/zend_virtual_cwd.c @@ -434,7 +434,6 @@ static void cwd_globals_ctor(virtual_cwd_globals *cwd_g TSRMLS_DC) /* {{{ */ cwd_g->realpath_cache_size_limit = REALPATH_CACHE_SIZE; cwd_g->realpath_cache_ttl = REALPATH_CACHE_TTL; memset(cwd_g->realpath_cache, 0, sizeof(cwd_g->realpath_cache)); - virtual_cwd_activate(TSRMLS_C); } /* }}} */ From 39e7dcc3bbaa60a5e5cf15af1fed9a31bfb21b4f Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Thu, 31 Oct 2013 21:42:55 +0100 Subject: [PATCH 369/400] back to do_alloca() --- main/main.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/main/main.c b/main/main.c index bd5e91b230323..f2bf878426cb0 100644 --- a/main/main.c +++ b/main/main.c @@ -2500,7 +2500,7 @@ PHPAPI int php_execute_script(zend_file_handle *primary_file TSRMLS_DC) if (old_cwd[0] != '\0') { php_ignore_value(VCWD_CHDIR(old_cwd)); } - do_alloca(old_cwd, use_heap); + free_alloca(old_cwd, use_heap); #endif return retval; } @@ -2511,10 +2511,11 @@ PHPAPI int php_execute_script(zend_file_handle *primary_file TSRMLS_DC) PHPAPI int php_execute_simple_script(zend_file_handle *primary_file, zval **ret TSRMLS_DC) { char *old_cwd; + ALLOCA_FLAG(use_heap) EG(exit_status) = 0; #define OLD_CWD_SIZE 4096 - old_cwd = emalloc(OLD_CWD_SIZE); + old_cwd = do_alloca(OLD_CWD_SIZE, use_heap); old_cwd[0] = '\0'; zend_try { @@ -2537,7 +2538,7 @@ PHPAPI int php_execute_simple_script(zend_file_handle *primary_file, zval **ret php_ignore_value(VCWD_CHDIR(old_cwd)); } - efree(old_cwd); + free_alloca(old_cwd, use_heap); return EG(exit_status); } /* }}} */ From 55ee543e2f73c45c8fa2c51ebef9820a610f70b4 Mon Sep 17 00:00:00 2001 From: Martin Hujer Date: Thu, 31 Oct 2013 22:59:42 +0200 Subject: [PATCH 370/400] Typo fix: umknown -> unknown --- ext/mysqlnd/mysqlnd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mysqlnd/mysqlnd.c b/ext/mysqlnd/mysqlnd.c index b41e5424f590e..169577ff97997 100644 --- a/ext/mysqlnd/mysqlnd.c +++ b/ext/mysqlnd/mysqlnd.c @@ -557,7 +557,7 @@ mysqlnd_run_authentication( if (!auth_plugin) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "The server requested authentication method unknown to the client [%s]", requested_protocol); - SET_CLIENT_ERROR(*conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "The server requested authentication method umknown to the client"); + SET_CLIENT_ERROR(*conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "The server requested authentication method unknown to the client"); goto end; } DBG_INF("plugin found"); From d3fd163d2734a3b615eb76ca593b79590b3fd4ae Mon Sep 17 00:00:00 2001 From: Lior Kaplan Date: Thu, 31 Oct 2013 23:12:41 +0200 Subject: [PATCH 371/400] Typo fix: umknown -> unknown --- ext/mysqlnd/mysqlnd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/mysqlnd/mysqlnd.c b/ext/mysqlnd/mysqlnd.c index 843e52d389adc..6eb34e40922b6 100644 --- a/ext/mysqlnd/mysqlnd.c +++ b/ext/mysqlnd/mysqlnd.c @@ -527,7 +527,7 @@ mysqlnd_connect_run_authentication( if (!auth_plugin) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "The server requested authentication method unknown to the client [%s]", requested_protocol); - SET_CLIENT_ERROR(*conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "The server requested authentication method umknown to the client"); + SET_CLIENT_ERROR(*conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "The server requested authentication method unknown to the client"); break; } } @@ -2162,7 +2162,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, change_user)(MYSQLND_CONN_DATA * const conn, if (!auth_plugin) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "The server requested authentication method unknown to the client [%s]", requested_protocol); - SET_CLIENT_ERROR(*conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "The server requested authentication method umknown to the client"); + SET_CLIENT_ERROR(*conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "The server requested authentication method unknown to the client"); break; } } From 6aedfac7f765d2376b5c9febbb03962c98656f8e Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Fri, 1 Nov 2013 00:56:22 +0100 Subject: [PATCH 372/400] virtual_cwd_activate() should be called only in one place --- Zend/zend.c | 1 - 1 file changed, 1 deletion(-) diff --git a/Zend/zend.c b/Zend/zend.c index b98d264a3c050..b86eca477c74a 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -921,7 +921,6 @@ ZEND_API char *get_zend_version(void) /* {{{ */ void zend_activate(TSRMLS_D) /* {{{ */ { - virtual_cwd_activate(TSRMLS_C); gc_reset(TSRMLS_C); init_compiler(TSRMLS_C); init_executor(TSRMLS_C); From 9df78bf9fd18d82c6c5b4ce288d6d920a3a20676 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Fri, 1 Nov 2013 01:20:57 +0100 Subject: [PATCH 373/400] reverted the previous commit, both calls are needed in TS mode --- Zend/zend.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Zend/zend.c b/Zend/zend.c index b86eca477c74a..b98d264a3c050 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -921,6 +921,7 @@ ZEND_API char *get_zend_version(void) /* {{{ */ void zend_activate(TSRMLS_D) /* {{{ */ { + virtual_cwd_activate(TSRMLS_C); gc_reset(TSRMLS_C); init_compiler(TSRMLS_C); init_executor(TSRMLS_C); From 699f07ba446c931af9480aba29a601df25c9490d Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Sat, 2 Nov 2013 13:32:31 +0100 Subject: [PATCH 374/400] limit virtual_cwd_activate() duplicated call to ZTS only --- Zend/zend.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Zend/zend.c b/Zend/zend.c index b98d264a3c050..a5ed953cd0de0 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -921,7 +921,9 @@ ZEND_API char *get_zend_version(void) /* {{{ */ void zend_activate(TSRMLS_D) /* {{{ */ { +#ifdef ZTS virtual_cwd_activate(TSRMLS_C); +#endif gc_reset(TSRMLS_C); init_compiler(TSRMLS_C); init_executor(TSRMLS_C); From e5e25c43f476456f5b342d4cd289d0ce5f8bbac4 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Sat, 2 Nov 2013 10:46:37 -0700 Subject: [PATCH 375/400] Fix English here --- UPGRADING | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UPGRADING b/UPGRADING index 6e77f1d5b1ec0..ab05b3a8bff04 100755 --- a/UPGRADING +++ b/UPGRADING @@ -68,8 +68,8 @@ PHP X.Y UPGRADE NOTES CURLOPT_SAFE_UPLOAD is now turned on by default and uploads with @file do not work unless it is explicitly set to false. -- String: - crypt() is now raise E_NOTICE error if salt parameter is omitted. +- Crypt: + crypt() will now raise an E_NOTICE error if the salt parameter is omitted. See: https://wiki.php.net/rfc/crypt_function_salt - XMLReader: From 3d4ef50dd7e00826ae8ab9fa572908283029dbd8 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Mon, 4 Nov 2013 14:42:54 +0800 Subject: [PATCH 376/400] Fixed coredump due to abnormal implemention of phar --- ext/phar/util.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/phar/util.c b/ext/phar/util.c index 97b70a9d95fc3..f2271dffd4d4a 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -1187,7 +1187,8 @@ phar_entry_info * phar_open_jit(phar_archive_data *phar, phar_entry_info *entry, PHP_PHAR_API int phar_resolve_alias(char *alias, int alias_len, char **filename, int *filename_len TSRMLS_DC) /* {{{ */ { phar_archive_data **fd_ptr; - if (SUCCESS == zend_hash_find(&(PHAR_GLOBALS->phar_alias_map), alias, alias_len, (void**)&fd_ptr)) { + if (PHAR_GLOBALS->phar_alias_map.arBuckets + && SUCCESS == zend_hash_find(&(PHAR_GLOBALS->phar_alias_map), alias, alias_len, (void**)&fd_ptr)) { *filename = (*fd_ptr)->fname; *filename_len = (*fd_ptr)->fname_len; return SUCCESS; From 5dc37b351085a7b8cdc30ef2ebb349c8e5df4e2c Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Mon, 4 Nov 2013 13:23:36 +0100 Subject: [PATCH 377/400] Sync ext/zip with pecl/zip version 1.3.2 - update libzip to version 1.11.1. We don't use any private symbol anymore - new method ZipArchive::setPassword($password) - add --with-libzip option to build with system libzip --- ext/zip/CREDITS | 2 +- ext/zip/config.m4 | 167 ++-- ext/zip/config.w32 | 46 +- ext/zip/examples/addglob.php | 14 + ext/zip/examples/addpattern.php | 13 + ext/zip/lib/mkstemp.c | 151 ++++ ext/zip/lib/php_zip_config.w32.h | 57 ++ ext/zip/lib/zip.h | 211 ++--- ext/zip/lib/zip_add.c | 12 +- ext/zip/lib/zip_add_dir.c | 49 +- ext/zip/lib/zip_add_entry.c | 66 ++ ext/zip/lib/zip_close.c | 499 ++++++------ ext/zip/lib/zip_delete.c | 4 +- .../lib/{zip_entry_new.c => zip_dir_add.c} | 75 +- ext/zip/lib/zip_dirent.c | 763 ++++++++++++++---- ext/zip/lib/{zip_free.c => zip_discard.c} | 19 +- ext/zip/lib/{zip_entry_free.c => zip_entry.c} | 30 +- ext/zip/lib/zip_error.c | 9 +- ext/zip/lib/zip_error_clear.c | 5 +- ext/zip/lib/zip_error_get.c | 2 +- ext/zip/lib/zip_error_get_sys_type.c | 2 +- ext/zip/lib/zip_error_to_str.c | 2 +- ext/zip/lib/zip_extra_field.c | 386 +++++++++ ext/zip/lib/zip_extra_field_api.c | 364 +++++++++ ext/zip/lib/zip_fclose.c | 19 +- ext/zip/lib/zip_fdopen.c | 19 +- ext/zip/lib/zip_file_add.c | 55 ++ ext/zip/lib/zip_file_error_clear.c | 5 +- ext/zip/lib/zip_file_error_get.c | 2 +- ...et_file_extra.c => zip_file_get_comment.c} | 42 +- ext/zip/lib/zip_file_get_offset.c | 28 +- ...zip_set_file_extra.c => zip_file_rename.c} | 46 +- ext/zip/lib/zip_file_replace.c | 111 +++ ext/zip/lib/zip_file_set_comment.c | 105 +++ ext/zip/lib/zip_file_strerror.c | 2 +- ext/zip/lib/zip_filerange_crc.c | 8 +- ext/zip/lib/zip_fopen.c | 8 +- ext/zip/lib/zip_fopen_encrypted.c | 9 +- ext/zip/lib/zip_fopen_index.c | 8 +- ext/zip/lib/zip_fopen_index_encrypted.c | 107 +-- ext/zip/lib/zip_fread.c | 2 +- ext/zip/lib/zip_get_archive_comment.c | 41 +- ext/zip/lib/zip_get_archive_flag.c | 6 +- .../lib/zip_get_compression_implementation.c | 6 +- .../lib/zip_get_encryption_implementation.c | 4 +- ext/zip/lib/zip_get_file_comment.c | 25 +- ext/zip/lib/zip_get_name.c | 35 +- ext/zip/lib/zip_get_num_entries.c | 15 +- ext/zip/lib/zip_get_num_files.c | 6 +- ext/zip/lib/zip_memdup.c | 5 +- ext/zip/lib/zip_name_locate.c | 40 +- ext/zip/lib/zip_new.c | 13 +- ext/zip/lib/zip_open.c | 477 +++++++---- ext/zip/lib/zip_rename.c | 31 +- ext/zip/lib/zip_replace.c | 48 +- ext/zip/lib/zip_set_archive_comment.c | 42 +- ext/zip/lib/zip_set_archive_flag.c | 4 +- ext/zip/lib/zip_set_default_password.c | 2 +- ext/zip/lib/zip_set_file_comment.c | 37 +- ext/zip/lib/zip_set_file_compression.c | 90 +++ ext/zip/lib/zip_set_name.c | 74 +- ext/zip/lib/zip_source_buffer.c | 10 +- ext/zip/lib/zip_source_close.c | 2 +- ext/zip/lib/zip_source_crc.c | 29 +- ext/zip/lib/zip_source_deflate.c | 26 +- ext/zip/lib/zip_source_error.c | 23 +- ext/zip/lib/zip_source_file.c | 2 +- ext/zip/lib/zip_source_filep.c | 29 +- ext/zip/lib/zip_source_free.c | 2 +- ext/zip/lib/zip_source_function.c | 2 +- ext/zip/lib/zip_source_layered.c | 2 +- ext/zip/lib/zip_source_open.c | 6 +- ext/zip/lib/zip_source_pkware.c | 17 +- ext/zip/lib/zip_source_pop.c | 2 +- ext/zip/lib/zip_source_read.c | 2 +- ext/zip/lib/zip_source_stat.c | 2 +- ext/zip/lib/zip_source_window.c | 150 ++++ ext/zip/lib/zip_source_zip.c | 151 +--- ext/zip/lib/zip_source_zip_new.c | 172 ++++ ext/zip/lib/zip_stat.c | 8 +- ext/zip/lib/zip_stat_index.c | 30 +- ext/zip/lib/zip_stat_init.c | 2 +- ext/zip/lib/zip_strerror.c | 3 +- ext/zip/lib/zip_string.c | 196 +++++ ext/zip/lib/zip_unchange.c | 29 +- ext/zip/lib/zip_unchange_all.c | 5 +- ext/zip/lib/zip_unchange_archive.c | 12 +- ext/zip/lib/zip_unchange_data.c | 18 +- ext/zip/lib/zip_utf-8.c | 255 ++++++ ext/zip/lib/zip_win32.h | 31 - ext/zip/lib/zipconf.h | 176 ++-- ext/zip/lib/zipint.h | 423 +++++++--- ext/zip/php_zip.c | 185 +++-- ext/zip/php_zip.h | 15 +- ext/zip/tests/bug38943.inc | 16 + ext/zip/tests/bug38943_2.phpt | 38 + ext/zip/tests/doubleclose.phpt | 43 + ext/zip/tests/zip_entry_close.phpt | 24 + ext/zip/zip_stream.c | 20 +- 99 files changed, 4813 insertions(+), 1870 deletions(-) create mode 100644 ext/zip/examples/addglob.php create mode 100644 ext/zip/examples/addpattern.php create mode 100644 ext/zip/lib/mkstemp.c create mode 100644 ext/zip/lib/php_zip_config.w32.h create mode 100644 ext/zip/lib/zip_add_entry.c rename ext/zip/lib/{zip_entry_new.c => zip_dir_add.c} (61%) rename ext/zip/lib/{zip_free.c => zip_discard.c} (86%) rename ext/zip/lib/{zip_entry_free.c => zip_entry.c} (79%) create mode 100644 ext/zip/lib/zip_extra_field.c create mode 100644 ext/zip/lib/zip_extra_field_api.c create mode 100644 ext/zip/lib/zip_file_add.c rename ext/zip/lib/{zip_get_file_extra.c => zip_file_get_comment.c} (72%) rename ext/zip/lib/{zip_set_file_extra.c => zip_file_rename.c} (70%) create mode 100644 ext/zip/lib/zip_file_replace.c create mode 100644 ext/zip/lib/zip_file_set_comment.c create mode 100644 ext/zip/lib/zip_set_file_compression.c create mode 100644 ext/zip/lib/zip_source_window.c create mode 100644 ext/zip/lib/zip_source_zip_new.c create mode 100644 ext/zip/lib/zip_string.c create mode 100644 ext/zip/lib/zip_utf-8.c delete mode 100644 ext/zip/lib/zip_win32.h create mode 100644 ext/zip/tests/bug38943.inc create mode 100644 ext/zip/tests/bug38943_2.phpt create mode 100644 ext/zip/tests/doubleclose.phpt create mode 100644 ext/zip/tests/zip_entry_close.phpt diff --git a/ext/zip/CREDITS b/ext/zip/CREDITS index 6c7e42d417160..59b7ef097e531 100644 --- a/ext/zip/CREDITS +++ b/ext/zip/CREDITS @@ -1,2 +1,2 @@ Zip -Pierre-Alain Joye +Pierre-Alain Joye, Remi Collet diff --git a/ext/zip/config.m4 b/ext/zip/config.m4 index 805d92442e017..83e32feca76ee 100644 --- a/ext/zip/config.m4 +++ b/ext/zip/config.m4 @@ -11,10 +11,14 @@ if test -z "$PHP_ZLIB_DIR"; then fi PHP_ARG_WITH(pcre-dir, pcre install prefix, -[ --with-pcre-dir ZIP: pcre install prefix], no, no) +[ --with-pcre-dir ZIP: pcre install prefix], no, no) + +PHP_ARG_WITH(libzip, libzip, +[ --with-libzip[=DIR] ZIP: use libzip], no, no) if test "$PHP_ZIP" != "no"; then + dnl libzip, depends on zlib if test "$PHP_ZLIB_DIR" != "no" && test "$PHP_ZLIB_DIR" != "yes"; then if test -f "$PHP_ZLIB_DIR/include/zlib/zlib.h"; then PHP_ZLIB_DIR="$PHP_ZLIB_DIR" @@ -47,61 +51,124 @@ if test "$PHP_ZIP" != "no"; then PHP_ADD_INCLUDE($PHP_ZLIB_INCDIR) fi - dnl This is PECL build, check if bundled PCRE library is used - old_CPPFLAGS=$CPPFLAGS - CPPFLAGS=$INCLUDES - AC_EGREP_CPP(yes,[ -#include
-#if defined(HAVE_BUNDLED_PCRE) && !defined(COMPILE_DL_PCRE) -yes -#endif - ],[ - PHP_PCRE_REGEX=yes - ],[ - AC_EGREP_CPP(yes,[ -#include
-#if defined(HAVE_PCRE) && !defined(COMPILE_DL_PCRE) -yes -#endif - ],[ - PHP_PCRE_REGEX=pecl - ],[ - PHP_PCRE_REGEX=no + if test "$PHP_LIBZIP" != "no"; then + + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + + dnl system libzip, depends on libzip + AC_MSG_CHECKING(for libzip) + if test -r $PHP_LIBZIP/include/zip.h; then + LIBZIP_CFLAGS="-I$PHP_LIBZIP/include" + LIBZIP_LIBDIR="$PHP_LIBZIP/$PHP_LIBDIR" + AC_MSG_RESULT(from option: found in $PHP_LIBZIP) + + elif test -x "$PKG_CONFIG" && $PKG_CONFIG --exists libzip; then + LIBZIP_CFLAGS=`$PKG_CONFIG libzip --cflags` + LIBZIP_LIBDIR=`$PKG_CONFIG libzip --variable=libdir` + AC_MSG_RESULT(from pkgconfig: found in $LIBZIP_LIBDIR) + + else + for i in /usr/local /usr; do + if test -r $i/include/zip.h; then + LIBZIP_CFLAGS="-I$i/include" + LIBZIP_LIBDIR="$i/$PHP_LIBDIR" + AC_MSG_RESULT(in default path: found in $i) + break + fi + done + fi + + if test -z "$LIBZIP_LIBDIR"; then + AC_MSG_RESULT(not found) + AC_MSG_ERROR(Please reinstall the libzip distribution) + fi + + dnl Could not think of a simple way to check libzip for overwrite support + PHP_CHECK_LIBRARY(zip, zip_open, + [ + PHP_ADD_LIBRARY_WITH_PATH(zip, $LIBZIP_LIBDIR, ZIP_SHARED_LIBADD) + AC_DEFINE(HAVE_LIBZIP,1,[ ]) + ], [ + AC_MSG_ERROR(could not find usable libzip) + ], [ + -L$LIBZIP_LIBDIR ]) - ]) - CPPFLAGS=$old_CPPFLAGS - - PHP_ZIP_SOURCES="$PHP_ZIP_SOURCES lib/zip_add.c lib/zip_error.c lib/zip_fclose.c \ - lib/zip_fread.c lib/zip_open.c lib/zip_source_filep.c \ - lib/zip_strerror.c lib/zip_close.c lib/zip_error_get.c \ - lib/zip_file_error_get.c lib/zip_free.c lib/zip_rename.c \ - lib/zip_source_free.c lib/zip_unchange_all.c lib/zip_delete.c \ - lib/zip_error_get_sys_type.c lib/zip_file_get_offset.c \ - lib/zip_get_name.c lib/zip_replace.c lib/zip_source_function.c \ - lib/zip_unchange.c lib/zip_dirent.c lib/zip_error_strerror.c \ - lib/zip_filerange_crc.c lib/zip_file_strerror.c lib/zip_get_num_files.c \ - lib/zip_get_archive_flag.c lib/zip_set_archive_flag.c \ - lib/zip_set_name.c lib/zip_source_zip.c lib/zip_unchange_data.c \ - lib/zip_entry_free.c lib/zip_error_to_str.c lib/zip_fopen.c \ - lib/zip_name_locate.c lib/zip_source_buffer.c lib/zip_stat.c \ - lib/zip_entry_new.c lib/zip_err_str.c lib/zip_fopen_index.c \ - lib/zip_get_archive_comment.c lib/zip_get_file_comment.c \ - lib/zip_new.c lib/zip_source_file.c lib/zip_stat_index.c \ - lib/zip_set_archive_comment.c lib/zip_set_file_comment.c \ - lib/zip_unchange_archive.c lib/zip_memdup.c lib/zip_stat_init.c lib/zip_add_dir.c \ - lib/zip_error_clear.c lib/zip_file_error_clear.c \ - lib/zip_fdopen.c lib/zip_fopen_encrypted.c lib/zip_fopen_index_encrypted.c \ - lib/zip_get_compression_implementation.c lib/zip_get_encryption_implementation.c \ - lib/zip_get_file_extra.c lib/zip_get_num_entries.c lib/zip_set_default_password.c \ - lib/zip_set_file_extra.c lib/zip_source_close.c lib/zip_source_crc.c \ - lib/zip_source_deflate.c lib/zip_source_error.c lib/zip_source_layered.c \ - lib/zip_source_open.c lib/zip_source_pkware.c lib/zip_source_pop.c \ - lib/zip_source_read.c lib/zip_source_stat.c" + + AC_DEFINE(HAVE_ZIP,1,[ ]) + PHP_NEW_EXTENSION(zip, php_zip.c zip_stream.c, $ext_shared,, $LIBZIP_CFLAGS) + PHP_SUBST(ZIP_SHARED_LIBADD) + else + + + PHP_ZIP_SOURCES="$PHP_ZIP_SOURCES lib/zip_add.c lib/zip_add_dir.c lib/zip_add_entry.c\ + lib/zip_close.c lib/zip_delete.c lib/zip_dir_add.c lib/zip_dirent.c lib/zip_discard.c lib/zip_entry.c\ + lib/zip_err_str.c lib/zip_error.c lib/zip_error_clear.c lib/zip_error_get.c lib/zip_error_get_sys_type.c\ + lib/zip_error_strerror.c lib/zip_error_to_str.c lib/zip_extra_field.c lib/zip_extra_field_api.c\ + lib/zip_fclose.c lib/zip_fdopen.c lib/zip_file_add.c lib/zip_file_error_clear.c lib/zip_file_error_get.c\ + lib/zip_file_get_comment.c lib/zip_file_get_offset.c lib/zip_file_rename.c lib/zip_file_replace.c\ + lib/zip_file_set_comment.c lib/zip_file_strerror.c lib/zip_filerange_crc.c lib/zip_fopen.c\ + lib/zip_fopen_encrypted.c lib/zip_fopen_index.c lib/zip_fopen_index_encrypted.c lib/zip_fread.c\ + lib/zip_get_archive_comment.c lib/zip_get_archive_flag.c lib/zip_get_compression_implementation.c\ + lib/zip_get_encryption_implementation.c lib/zip_get_file_comment.c lib/zip_get_name.c lib/zip_get_num_entries.c \ + lib/zip_get_num_files.c lib/zip_memdup.c lib/zip_name_locate.c lib/zip_new.c lib/zip_open.c lib/zip_rename.c lib/zip_replace.c\ + lib/zip_set_archive_comment.c lib/zip_set_archive_flag.c lib/zip_set_default_password.c lib/zip_set_file_comment.c\ + lib/zip_set_file_compression.c lib/zip_set_name.c lib/zip_source_buffer.c lib/zip_source_close.c lib/zip_source_crc.c\ + lib/zip_source_deflate.c lib/zip_source_error.c lib/zip_source_file.c lib/zip_source_filep.c lib/zip_source_free.c\ + lib/zip_source_function.c lib/zip_source_layered.c lib/zip_source_open.c lib/zip_source_pkware.c lib/zip_source_pop.c\ + lib/zip_source_read.c lib/zip_source_stat.c lib/zip_source_window.c lib/zip_source_zip.c lib/zip_source_zip_new.c\ + lib/zip_stat.c lib/zip_stat_index.c lib/zip_stat_init.c lib/zip_strerror.c lib/zip_string.c lib/zip_unchange.c lib/zip_unchange_all.c\ + lib/zip_unchange_archive.c lib/zip_unchange_data.c lib/zip_utf-8.c lib/mkstemp.c" AC_DEFINE(HAVE_ZIP,1,[ ]) PHP_NEW_EXTENSION(zip, php_zip.c zip_stream.c $PHP_ZIP_SOURCES, $ext_shared) PHP_ADD_BUILD_DIR($ext_builddir/lib, 1) PHP_SUBST(ZIP_SHARED_LIBADD) +fi + + +AC_CHECK_TYPES([int8_t]) +AC_CHECK_TYPES([int16_t]) +AC_CHECK_TYPES([int32_t]) +AC_CHECK_TYPES([int64_t]) +AC_CHECK_TYPES([uint8_t]) +AC_CHECK_TYPES([uint16_t]) +AC_CHECK_TYPES([uint32_t]) +AC_CHECK_TYPES([uint64_t]) +AC_CHECK_TYPES([ssize_t]) + +AC_CHECK_SIZEOF([short]) +AC_CHECK_SIZEOF([int]) +AC_CHECK_SIZEOF([long]) +AC_CHECK_SIZEOF([long long]) +AC_CHECK_SIZEOF([off_t]) +AC_CHECK_SIZEOF([size_t]) + +AC_PATH_PROG([TOUCH], [touch]) +AC_PATH_PROG([UNZIP], [unzip]) + +AC_STRUCT_TIMEZONE + +case $host_os +in + *bsd*) MANFMT=mdoc;; + *) MANFMT=man;; +esac +AC_SUBST([MANFMT]) + +AH_BOTTOM([ +#ifndef HAVE_SSIZE_T +# if SIZEOF_SIZE_T == SIZEOF_INT +typedef int ssize_t; +# elif SIZEOF_SIZE_T == SIZEOF_LONG +typedef long ssize_t; +# elif SIZEOF_SIZE_T == SIZEOF_LONG_LONG +typedef long long ssize_t; +# else +#error no suitable type for ssize_t found +# endif +#endif +]) + dnl so we always include the known-good working hack. PHP_ADD_MAKEFILE_FRAGMENT diff --git a/ext/zip/config.w32 b/ext/zip/config.w32 index fa0a5180df5ce..5b9f09575a769 100644 --- a/ext/zip/config.w32 +++ b/ext/zip/config.w32 @@ -9,36 +9,28 @@ if (PHP_ZIP != "no") { (PHP_ZLIB_SHARED && CHECK_LIB("zlib.lib", "zip", PHP_ZIP)) || (PHP_ZLIB == "yes" && (!PHP_ZLIB_SHARED))) ) { EXTENSION('zip', 'php_zip.c zip_stream.c'); - ADD_SOURCES(configure_module_dirname + "/lib", "zip_add.c zip_error.c zip_fclose.c \ - zip_fread.c zip_open.c zip_source_filep.c \ - zip_strerror.c zip_close.c zip_error_get.c \ - zip_file_error_get.c zip_free.c zip_rename.c \ - zip_source_free.c zip_unchange_all.c zip_delete.c \ - zip_error_get_sys_type.c zip_file_get_offset.c \ - zip_get_name.c zip_replace.c zip_source_function.c \ - zip_unchange.c zip_dirent.c zip_error_strerror.c \ - zip_filerange_crc.c zip_file_strerror.c zip_get_num_files.c \ - zip_get_archive_flag.c zip_set_archive_flag.c \ - zip_set_name.c zip_source_zip.c zip_unchange_data.c \ - zip_entry_free.c zip_error_to_str.c zip_fopen.c \ - zip_name_locate.c zip_source_buffer.c zip_stat.c \ - zip_entry_new.c zip_err_str.c zip_fopen_index.c \ - zip_new.c zip_source_file.c zip_stat_index.c \ - zip_get_archive_comment.c zip_get_file_comment.c \ - zip_set_archive_comment.c zip_set_file_comment.c \ - zip_unchange_archive.c zip_memdup.c zip_stat_init.c \ - zip_add_dir.c zip_file_error_clear.c zip_error_clear.c \ - zip_fdopen.c zip_fopen_encrypted.c zip_fopen_index_encrypted.c \ - zip_get_compression_implementation.c zip_get_encryption_implementation.c \ - zip_get_file_extra.c zip_get_num_entries.c zip_set_default_password.c \ - zip_set_file_extra.c zip_source_close.c zip_source_crc.c \ - zip_source_deflate.c zip_source_error.c zip_source_layered.c \ - zip_source_open.c zip_source_pkware.c zip_source_pop.c \ - zip_source_read.c zip_source_stat.c", "zip"); + ADD_SOURCES(configure_module_dirname + "/lib", "zip_add.c zip_add_dir.c zip_add_entry.c\ + zip_close.c zip_delete.c zip_dir_add.c zip_dirent.c zip_discard.c zip_entry.c\ + zip_err_str.c zip_error.c zip_error_clear.c zip_error_get.c zip_error_get_sys_type.c\ + zip_error_strerror.c zip_error_to_str.c zip_extra_field.c zip_extra_field_api.c\ + zip_fclose.c zip_fdopen.c zip_file_add.c zip_file_error_clear.c zip_file_error_get.c\ + zip_file_get_comment.c zip_file_get_offset.c zip_file_rename.c zip_file_replace.c\ + zip_file_set_comment.c zip_file_strerror.c zip_filerange_crc.c zip_fopen.c\ + zip_fopen_encrypted.c zip_fopen_index.c zip_fopen_index_encrypted.c zip_fread.c\ + zip_get_archive_comment.c zip_get_archive_flag.c zip_get_compression_implementation.c\ + zip_get_encryption_implementation.c zip_get_file_comment.c zip_get_name.c zip_get_num_entries.c \ + zip_get_num_files.c zip_memdup.c zip_name_locate.c zip_new.c zip_open.c zip_rename.c zip_replace.c\ + zip_set_archive_comment.c zip_set_archive_flag.c zip_set_default_password.c zip_set_file_comment.c\ + zip_set_file_compression.c zip_set_name.c zip_source_buffer.c zip_source_close.c zip_source_crc.c\ + zip_source_deflate.c zip_source_error.c zip_source_file.c zip_source_filep.c zip_source_free.c\ + zip_source_function.c zip_source_layered.c zip_source_open.c zip_source_pkware.c zip_source_pop.c\ + zip_source_read.c zip_source_stat.c zip_source_window.c zip_source_zip.c zip_source_zip_new.c\ + zip_stat.c zip_stat_index.c zip_stat_init.c zip_strerror.c zip_string.c zip_unchange.c zip_unchange_all.c\ + zip_unchange_archive.c zip_unchange_data.c zip_utf-8.c mkstemp.c", "zip"); AC_DEFINE('HAVE_ZIP', 1); + ADD_FLAG("CFLAGS_ZIP", "/D _WIN32"); } else { WARNING("zip not enabled; libraries and headers not found"); } } - diff --git a/ext/zip/examples/addglob.php b/ext/zip/examples/addglob.php new file mode 100644 index 0000000000000..790312b4d586a --- /dev/null +++ b/ext/zip/examples/addglob.php @@ -0,0 +1,14 @@ +open('a.zip', ZIPARCHIVE::CREATE); + +/* or 'remove_all_path' => 0*/ +$options = array( + 'remove_path' => '/home/francis/myimages', + 'add_path' => 'images/', +); +$found = $z->addGlob("/home/pierre/cvs/gd/libgd/tests/*.png", 0, $options); +var_dump($found); +$z->close(); + diff --git a/ext/zip/examples/addpattern.php b/ext/zip/examples/addpattern.php new file mode 100644 index 0000000000000..a1a9b122914e5 --- /dev/null +++ b/ext/zip/examples/addpattern.php @@ -0,0 +1,13 @@ +open('a.zip', ZIPARCHIVE::CREATE); + +/* or 'remove_all_path' => 0*/ +$options = array('remove_path' => '/home/pierre/cvs/gd/libgd/tests', +'add_path' => 'images/', +); + +$found = $z->addPattern("/(\.png)$/i", "/home/pierre/cvs/gd/libgd/tests", $options); +var_dump($found); +$z->close(); + diff --git a/ext/zip/lib/mkstemp.c b/ext/zip/lib/mkstemp.c new file mode 100644 index 0000000000000..843d5e3613143 --- /dev/null +++ b/ext/zip/lib/mkstemp.c @@ -0,0 +1,151 @@ +/* Adapted from NetBSB libc by Dieter Baron */ + +/* NetBSD: gettemp.c,v 1.13 2003/12/05 00:57:36 uebayasi Exp */ + +/* + * Copyright (c) 1987, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include +#include +#include +#include +#ifdef _WIN32 +#include +#endif +#include +#include + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + + + +int +_zip_mkstemp(char *path) +{ +#ifdef _WIN32 + int ret; + ret = _creat(_mktemp(path), _S_IREAD|_S_IWRITE); + if (ret == -1) { + return 0; + } else { + return ret; + } +#else + int fd; + char *start, *trv; + struct stat sbuf; + pid_t pid; + + /* To guarantee multiple calls generate unique names even if + the file is not created. 676 different possibilities with 7 + or more X's, 26 with 6 or less. */ + static char xtra[2] = "aa"; + int xcnt = 0; + + pid = getpid(); + + /* Move to end of path and count trailing X's. */ + for (trv = path; *trv; ++trv) + if (*trv == 'X') + xcnt++; + else + xcnt = 0; + + /* Use at least one from xtra. Use 2 if more than 6 X's. */ + if (*(trv - 1) == 'X') + *--trv = xtra[0]; + if (xcnt > 6 && *(trv - 1) == 'X') + *--trv = xtra[1]; + + /* Set remaining X's to pid digits with 0's to the left. */ + while (*--trv == 'X') { + *trv = (pid % 10) + '0'; + pid /= 10; + } + + /* update xtra for next call. */ + if (xtra[0] != 'z') + xtra[0]++; + else { + xtra[0] = 'a'; + if (xtra[1] != 'z') + xtra[1]++; + else + xtra[1] = 'a'; + } + + /* + * check the target directory; if you have six X's and it + * doesn't exist this runs for a *very* long time. + */ + for (start = trv + 1;; --trv) { + if (trv <= path) + break; + if (*trv == '/') { + *trv = '\0'; + if (stat(path, &sbuf)) + return (0); + if (!S_ISDIR(sbuf.st_mode)) { + errno = ENOTDIR; + return (0); + } + *trv = '/'; + break; + } + } + + for (;;) { + if ((fd=open(path, O_CREAT|O_EXCL|O_RDWR|O_BINARY, 0600)) >= 0) + return (fd); + if (errno != EEXIST) + return (0); + + /* tricky little algorithm for backward compatibility */ + for (trv = start;;) { + if (!*trv) + return (0); + if (*trv == 'z') + *trv++ = 'a'; + else { + if (isdigit((unsigned char)*trv)) + *trv = 'a'; + else + ++*trv; + break; + } + } + } + /*NOTREACHED*/ +#endif +} diff --git a/ext/zip/lib/php_zip_config.w32.h b/ext/zip/lib/php_zip_config.w32.h new file mode 100644 index 0000000000000..8956839c62c32 --- /dev/null +++ b/ext/zip/lib/php_zip_config.w32.h @@ -0,0 +1,57 @@ +#ifndef HAD_CONFIG_H +#define HAD_CONFIG_H +#define HAVE__CLOSE +#define HAVE__DUP +#define HAVE__FDOPEN +#define HAVE__FILENO +#define HAVE__OPEN +#define HAVE__SNPRINTF +/* #undef HAVE__STRCMPI */ +#define HAVE__STRDUP +#define HAVE__STRICMP +/* #undef HAVE_FSEEKO */ +/* #undef HAVE_FTELLO */ +/* #undef HAVE_MKSTEMP */ +#define HAVE_MOVEFILEEXA +/* #undef HAVE_SNPRINTF */ +/* #undef HAVE_STRCASECMP */ +/* #undef HAVE_STRINGS_H */ +/* #undef HAVE_STRUCT_TM_TM_ZONE */ +/* #undef HAVE_UNISTD_H */ +#define PACKAGE "libzip" +#define VERSION "0.10.b" + +/* #undef HAVE_SSIZE_T */ + +#ifndef HAVE_SSIZE_T + +#ifndef SIZE_T_LIBZIP +#define SIZE_T_LIBZIP 4 +#endif +#ifndef INT_LIBZIP +#define INT_LIBZIP 4 +#endif +#ifndef LONG_LIBZIP +#define LONG_LIBZIP 4 +#endif +#ifndef LONG_LONG_LIBZIP +#define LONG_LONG_LIBZIP 8 +#endif +#ifndef SIZEOF_OFF_T +#define SIZEOF_OFF_T 4 +#endif + +# if SIZE_T_LIBZIP == INT_LIBZIP +# ifndef ssize_t +typedef int ssize_t; +# endif +# elif SIZE_T_LIBZIP == LONG_LIBZIP +typedef long ssize_t; +# elif SIZE_T_LIBZIP == LONG_LONG_LIBZIP +typedef long long ssize_t; +# else +#error no suitable type for ssize_t found +# endif +#endif + +#endif /* HAD_CONFIG_H */ diff --git a/ext/zip/lib/zip.h b/ext/zip/lib/zip.h index f11c9aba7f99c..1fb1dbf5e0f5b 100644 --- a/ext/zip/lib/zip.h +++ b/ext/zip/lib/zip.h @@ -3,7 +3,7 @@ /* zip.h -- exported declarations. - Copyright (C) 1999-2011 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -38,18 +38,30 @@ #include "main/php.h" #ifdef PHP_WIN32 -# include "zip_win32.h" -# ifdef PHP_ZIP_EXPORTS -# define ZIP_EXTERN(rt) __declspec(dllexport)rt _stdcall -# else -# define ZIP_EXTERN(rt) rt -# endif +#ifdef PHP_ZIP_EXPORTS +# define ZIP_EXTERN __declspec(dllexport) _stdcall +# else +# define ZIP_EXTERN +# endif #elif defined(__GNUC__) && __GNUC__ >= 4 -# define ZIP_EXTERN(rt) __attribute__ ((visibility("default"))) rt +# define ZIP_EXTERN __attribute__ ((visibility("default"))) #else -# define ZIP_EXTERN(rt) rt +# define ZIP_EXTERN #endif + +#ifndef ZIP_EXTERN +#ifdef _WIN32 +#define ZIP_EXTERN __declspec(dllimport) +#elif defined(__GNUC__) && __GNUC__ >= 4 +#define ZIP_EXTERN __attribute__ ((visibility ("default"))) +#else +#define ZIP_EXTERN +#endif +#endif + + + BEGIN_EXTERN_C() #include "zipconf.h" @@ -63,27 +75,40 @@ BEGIN_EXTERN_C() #define ZIP_CREATE 1 #define ZIP_EXCL 2 #define ZIP_CHECKCONS 4 -#define ZIP_OVERWRITE 8 - +#define ZIP_TRUNCATE 8 /* flags for zip_name_locate, zip_fopen, zip_stat, ... */ -#define ZIP_FL_NOCASE 1 /* ignore case on name lookup */ -#define ZIP_FL_NODIR 2 /* ignore directory component */ -#define ZIP_FL_COMPRESSED 4 /* read compressed data */ -#define ZIP_FL_UNCHANGED 8 /* use original data, ignoring changes */ -#define ZIP_FL_RECOMPRESS 16 /* force recompression of data */ -#define ZIP_FL_ENCRYPTED 32 /* read encrypted data - (implies ZIP_FL_COMPRESSED) */ +#define ZIP_FL_NOCASE 1u /* ignore case on name lookup */ +#define ZIP_FL_NODIR 2u /* ignore directory component */ +#define ZIP_FL_COMPRESSED 4u /* read compressed data */ +#define ZIP_FL_UNCHANGED 8u /* use original data, ignoring changes */ +#define ZIP_FL_RECOMPRESS 16u /* force recompression of data */ +#define ZIP_FL_ENCRYPTED 32u /* read encrypted data (implies ZIP_FL_COMPRESSED) */ +#define ZIP_FL_ENC_GUESS 0u /* guess string encoding (is default) */ +#define ZIP_FL_ENC_RAW 64u /* get unmodified string */ +#define ZIP_FL_ENC_STRICT 128u /* follow specification strictly */ +#define ZIP_FL_LOCAL 256u /* in local header */ +#define ZIP_FL_CENTRAL 512u /* in central directory */ +/* 1024u reserved for internal use */ +#define ZIP_FL_ENC_UTF_8 2048u /* string is UTF-8 encoded */ +#define ZIP_FL_ENC_CP437 4096u /* string is CP437 encoded */ +#define ZIP_FL_OVERWRITE 8192u /* zip_file_add: if file with name exists, overwrite (replace) it */ /* archive global flags flags */ -#define ZIP_AFL_TORRENT 1 /* torrent zipped */ -#define ZIP_AFL_RDONLY 2 /* read only -- cannot be cleared */ +#define ZIP_AFL_TORRENT 1u /* torrent zipped */ +#define ZIP_AFL_RDONLY 2u /* read only -- cannot be cleared */ + +/* create a new extra field */ + +#define ZIP_EXTRA_FIELD_ALL ZIP_UINT16_MAX +#define ZIP_EXTRA_FIELD_NEW ZIP_UINT16_MAX /* flags for compression and encryption sources */ +#define ZIP_CODEC_DECODE 0 /* decompress/decrypt (encode flag not set) */ #define ZIP_CODEC_ENCODE 1 /* compress/encrypt */ @@ -178,15 +203,15 @@ enum zip_source_cmd { #define ZIP_SOURCE_ERR_LOWER -2 -#define ZIP_STAT_NAME 0x0001 -#define ZIP_STAT_INDEX 0x0002 -#define ZIP_STAT_SIZE 0x0004 -#define ZIP_STAT_COMP_SIZE 0x0008 -#define ZIP_STAT_MTIME 0x0010 -#define ZIP_STAT_CRC 0x0020 -#define ZIP_STAT_COMP_METHOD 0x0040 -#define ZIP_STAT_ENCRYPTION_METHOD 0x0080 -#define ZIP_STAT_FLAGS 0x0100 +#define ZIP_STAT_NAME 0x0001u +#define ZIP_STAT_INDEX 0x0002u +#define ZIP_STAT_SIZE 0x0004u +#define ZIP_STAT_COMP_SIZE 0x0008u +#define ZIP_STAT_MTIME 0x0010u +#define ZIP_STAT_CRC 0x0020u +#define ZIP_STAT_COMP_METHOD 0x0040u +#define ZIP_STAT_ENCRYPTION_METHOD 0x0080u +#define ZIP_STAT_FLAGS 0x0100u struct zip_stat { zip_uint64_t valid; /* which fields have valid values */ @@ -205,72 +230,78 @@ struct zip; struct zip_file; struct zip_source; +typedef zip_uint32_t zip_flags_t; + typedef zip_int64_t (*zip_source_callback)(void *, void *, zip_uint64_t, enum zip_source_cmd); -ZIP_EXTERN(zip_int64_t) zip_add(struct zip *, const char *, struct zip_source *); -ZIP_EXTERN(zip_int64_t) zip_add_dir(struct zip *, const char *); -ZIP_EXTERN(int) zip_close(struct zip *); -ZIP_EXTERN(int) zip_delete(struct zip *, zip_uint64_t); -ZIP_EXTERN(void) zip_error_clear(struct zip *); -ZIP_EXTERN(void) zip_error_get(struct zip *, int *, int *); -ZIP_EXTERN(int) zip_error_get_sys_type(int); -ZIP_EXTERN(int) zip_error_to_str(char *, zip_uint64_t, int, int); -ZIP_EXTERN(int) zip_fclose(struct zip_file *); -ZIP_EXTERN(struct zip *)zip_fdopen(int, int, int *); -ZIP_EXTERN(void) zip_file_error_clear(struct zip_file *); -ZIP_EXTERN(void) zip_file_error_get(struct zip_file *, int *, int *); -ZIP_EXTERN(const char *)zip_file_strerror(struct zip_file *); -ZIP_EXTERN(struct) zip_file *zip_fopen(struct zip *, const char *, int); -ZIP_EXTERN(struct) zip_file *zip_fopen_encrypted(struct zip *, const char *, - int, const char *); -ZIP_EXTERN(struct zip_file *)zip_fopen_index(struct zip *, zip_uint64_t, int); -ZIP_EXTERN(struct zip_file *)zip_fopen_index_encrypted(struct zip *, - zip_uint64_t, int, - const char *); -ZIP_EXTERN(zip_int64_t) zip_fread(struct zip_file *, void *, zip_uint64_t); -ZIP_EXTERN(const char *)zip_get_archive_comment(struct zip *, int *, int); -ZIP_EXTERN(int) zip_get_archive_flag(struct zip *, int, int); -ZIP_EXTERN(const char *)zip_get_file_comment(struct zip *, zip_uint64_t, - int *, int); -ZIP_EXTERN(const char *)zip_get_file_extra(struct zip *, zip_uint64_t, - int *, int); -ZIP_EXTERN(const char *)zip_get_name(struct zip *, zip_uint64_t, int); -ZIP_EXTERN(zip_uint64_t) zip_get_num_entries(struct zip *, int); -ZIP_EXTERN(int) zip_get_num_files(struct zip *); /* deprecated, use zip_get_num_entries instead */ -ZIP_EXTERN(int) zip_name_locate(struct zip *, const char *, int); -ZIP_EXTERN(struct zip *)zip_open(const char *, int, int *); -ZIP_EXTERN(int) zip_rename(struct zip *, zip_uint64_t, const char *); -ZIP_EXTERN(int) zip_replace(struct zip *, zip_uint64_t, struct zip_source *); -ZIP_EXTERN(int) zip_set_archive_comment(struct zip *, const char *, int); -ZIP_EXTERN(int) zip_set_archive_flag(struct zip *, int, int); -ZIP_EXTERN(int) zip_set_default_password(struct zip *, const char *); -ZIP_EXTERN(int) zip_set_file_comment(struct zip *, zip_uint64_t, - const char *, int); -ZIP_EXTERN(int) zip_set_file_extra(struct zip *, zip_uint64_t, - const char *, int); -ZIP_EXTERN(struct) zip_source *zip_source_buffer(struct zip *, const void *, - zip_uint64_t, int); -ZIP_EXTERN(struct) zip_source *zip_source_file(struct zip *, const char *, - zip_uint64_t, zip_int64_t); -ZIP_EXTERN(struct) zip_source *zip_source_filep(struct zip *, FILE *, - zip_uint64_t, zip_int64_t); -ZIP_EXTERN(void) zip_source_free(struct zip_source *); -ZIP_EXTERN(struct zip_source *)zip_source_function(struct zip *, - zip_source_callback, void *); -ZIP_EXTERN(struct zip_source *)zip_source_zip(struct zip *, struct zip *, - zip_uint64_t, int, - zip_uint64_t, zip_int64_t); -ZIP_EXTERN(int) zip_stat(struct zip *, const char *, int, struct zip_stat *); -ZIP_EXTERN(int) zip_stat_index(struct zip *, zip_uint64_t, int, - struct zip_stat *); -ZIP_EXTERN(void) zip_stat_init(struct zip_stat *); -ZIP_EXTERN(const char *)zip_strerror(struct zip *); -ZIP_EXTERN(int) zip_unchange(struct zip *, zip_uint64_t); -ZIP_EXTERN(int) zip_unchange_all(struct zip *); -ZIP_EXTERN(int) zip_unchange_archive(struct zip *); +#ifndef ZIP_DISABLE_DEPRECATED +ZIP_EXTERN zip_int64_t zip_add(struct zip *, const char *, struct zip_source *); /* use zip_file_add */ +ZIP_EXTERN zip_int64_t zip_add_dir(struct zip *, const char *); /* use zip_dir_add */ +ZIP_EXTERN const char *zip_get_file_comment(struct zip *, zip_uint64_t, int *, int); /* use zip_file_get_comment */ +ZIP_EXTERN int zip_get_num_files(struct zip *); /* use zip_get_num_entries instead */ +ZIP_EXTERN int zip_rename(struct zip *, zip_uint64_t, const char *); /* use zip_file_rename */ +ZIP_EXTERN int zip_replace(struct zip *, zip_uint64_t, struct zip_source *); /* use zip_file_replace */ +ZIP_EXTERN int zip_set_file_comment(struct zip *, zip_uint64_t, const char *, int); /* use zip_file_set_comment */ +#endif + +ZIP_EXTERN int zip_archive_set_tempdir(struct zip *, const char *); +ZIP_EXTERN zip_int64_t zip_file_add(struct zip *, const char *, struct zip_source *, zip_flags_t); +ZIP_EXTERN zip_int64_t zip_dir_add(struct zip *, const char *, zip_flags_t); +ZIP_EXTERN int zip_close(struct zip *); +ZIP_EXTERN void zip_discard(struct zip *); +ZIP_EXTERN int zip_delete(struct zip *, zip_uint64_t); +ZIP_EXTERN int zip_file_extra_field_delete(struct zip *, zip_uint64_t, zip_uint16_t, zip_flags_t); +ZIP_EXTERN int zip_file_extra_field_delete_by_id(struct zip *, zip_uint64_t, zip_uint16_t, zip_uint16_t, zip_flags_t); +ZIP_EXTERN void zip_error_clear(struct zip *); +ZIP_EXTERN void zip_error_get(struct zip *, int *, int *); +ZIP_EXTERN int zip_error_get_sys_type(int); +ZIP_EXTERN int zip_error_to_str(char *, zip_uint64_t, int, int); +ZIP_EXTERN int zip_fclose(struct zip_file *); +ZIP_EXTERN struct zip *zip_fdopen(int, int, int *); +ZIP_EXTERN void zip_file_error_clear(struct zip_file *); +ZIP_EXTERN void zip_file_error_get(struct zip_file *, int *, int *); +ZIP_EXTERN const char *zip_file_strerror(struct zip_file *); +ZIP_EXTERN struct zip_file *zip_fopen(struct zip *, const char *, zip_flags_t); +ZIP_EXTERN struct zip_file *zip_fopen_encrypted(struct zip *, const char *, zip_flags_t, const char *); +ZIP_EXTERN struct zip_file *zip_fopen_index(struct zip *, zip_uint64_t, zip_flags_t); +ZIP_EXTERN struct zip_file *zip_fopen_index_encrypted(struct zip *, zip_uint64_t, zip_flags_t, const char *); +ZIP_EXTERN zip_int64_t zip_fread(struct zip_file *, void *, zip_uint64_t); +ZIP_EXTERN const char *zip_get_archive_comment(struct zip *, int *, zip_flags_t); +ZIP_EXTERN int zip_get_archive_flag(struct zip *, zip_flags_t, zip_flags_t); +ZIP_EXTERN const char *zip_file_get_comment(struct zip *, zip_uint64_t, zip_uint32_t *, zip_flags_t); +ZIP_EXTERN const zip_uint8_t *zip_file_extra_field_get(struct zip *, zip_uint64_t, zip_uint16_t, zip_uint16_t *, zip_uint16_t *, zip_flags_t); +ZIP_EXTERN const zip_uint8_t *zip_file_extra_field_get_by_id(struct zip *, zip_uint64_t, zip_uint16_t, zip_uint16_t, zip_uint16_t *, zip_flags_t); +ZIP_EXTERN zip_int16_t zip_file_extra_fields_count(struct zip *, zip_uint64_t, zip_flags_t); +ZIP_EXTERN zip_int16_t zip_file_extra_fields_count_by_id(struct zip *, zip_uint64_t, zip_uint16_t, zip_flags_t); +ZIP_EXTERN const char *zip_get_name(struct zip *, zip_uint64_t, zip_flags_t); +ZIP_EXTERN zip_int64_t zip_get_num_entries(struct zip *, zip_flags_t); +ZIP_EXTERN zip_int64_t zip_name_locate(struct zip *, const char *, zip_flags_t); +ZIP_EXTERN struct zip *zip_open(const char *, int, int *); +ZIP_EXTERN int zip_file_rename(struct zip *, zip_uint64_t, const char *, zip_flags_t); +ZIP_EXTERN int zip_file_replace(struct zip *, zip_uint64_t, struct zip_source *, zip_flags_t); +ZIP_EXTERN int zip_set_archive_comment(struct zip *, const char *, zip_uint16_t); +ZIP_EXTERN int zip_set_archive_flag(struct zip *, zip_flags_t, int); +ZIP_EXTERN int zip_set_default_password(struct zip *, const char *); +ZIP_EXTERN int zip_file_set_comment(struct zip *, zip_uint64_t, const char *, zip_uint16_t, zip_flags_t); +ZIP_EXTERN int zip_set_file_compression(struct zip *, zip_uint64_t, zip_int32_t, zip_uint32_t); +ZIP_EXTERN int zip_file_extra_field_set(struct zip *, zip_uint64_t, zip_uint16_t, zip_uint16_t, const zip_uint8_t *, zip_uint16_t, zip_flags_t); +ZIP_EXTERN struct zip_source *zip_source_buffer(struct zip *, const void *, zip_uint64_t, int); +ZIP_EXTERN struct zip_source *zip_source_file(struct zip *, const char *, zip_uint64_t, zip_int64_t); +ZIP_EXTERN struct zip_source *zip_source_filep(struct zip *, FILE *, zip_uint64_t, zip_int64_t); +ZIP_EXTERN void zip_source_free(struct zip_source *); +ZIP_EXTERN struct zip_source *zip_source_function(struct zip *, zip_source_callback, void *); +ZIP_EXTERN struct zip_source *zip_source_zip(struct zip *, struct zip *, zip_uint64_t, zip_flags_t, zip_uint64_t, zip_int64_t); +ZIP_EXTERN int zip_stat(struct zip *, const char *, zip_flags_t, struct zip_stat *); +ZIP_EXTERN int zip_stat_index(struct zip *, zip_uint64_t, zip_flags_t, struct zip_stat *); +ZIP_EXTERN void zip_stat_init(struct zip_stat *); +ZIP_EXTERN const char *zip_strerror(struct zip *); +ZIP_EXTERN int zip_unchange(struct zip *, zip_uint64_t); +ZIP_EXTERN int zip_unchange_all(struct zip *); +ZIP_EXTERN int zip_unchange_archive(struct zip *); + END_EXTERN_C(); #endif /* _HAD_ZIP_H */ diff --git a/ext/zip/lib/zip_add.c b/ext/zip/lib/zip_add.c index 6067abbac491f..4bce3fd4af274 100644 --- a/ext/zip/lib/zip_add.c +++ b/ext/zip/lib/zip_add.c @@ -1,6 +1,6 @@ /* zip_add.c -- add file via callback function - Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -33,6 +33,7 @@ +#define _ZIP_COMPILING_DEPRECATED #include "zipint.h" @@ -44,13 +45,8 @@ ZIP_UINT64_MAX, and each entry is larger than 2 bytes. */ -ZIP_EXTERN(zip_int64_t) +ZIP_EXTERN zip_int64_t zip_add(struct zip *za, const char *name, struct zip_source *source) { - if (name == NULL || source == NULL) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); - return -1; - } - - return _zip_replace(za, ZIP_UINT64_MAX, name, source); + return zip_file_add(za, name, source, 0); } diff --git a/ext/zip/lib/zip_add_dir.c b/ext/zip/lib/zip_add_dir.c index 0a9d7f4863011..22a28bd856253 100644 --- a/ext/zip/lib/zip_add_dir.c +++ b/ext/zip/lib/zip_add_dir.c @@ -1,6 +1,6 @@ /* zip_add_dir.c -- add directory - Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2013 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -33,56 +33,15 @@ -#include -#include - +#define _ZIP_COMPILING_DEPRECATED #include "zipint.h" /* NOTE: Signed due to -1 on error. See zip_add.c for more details. */ -ZIP_EXTERN(zip_int64_t) +ZIP_EXTERN zip_int64_t zip_add_dir(struct zip *za, const char *name) { - int len; - zip_int64_t ret; - char *s; - struct zip_source *source; - - if (ZIP_IS_RDONLY(za)) { - _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); - return -1; - } - - if (name == NULL) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); - return -1; - } - - s = NULL; - len = strlen(name); - - if (name[len-1] != '/') { - if ((s=(char *)malloc(len+2)) == NULL) { - _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); - return -1; - } - strcpy(s, name); - s[len] = '/'; - s[len+1] = '\0'; - } - - if ((source=zip_source_buffer(za, NULL, 0, 0)) == NULL) { - free(s); - return -1; - } - - ret = _zip_replace(za, -1, s ? s : name, source); - - free(s); - if (ret < 0) - zip_source_free(source); - - return ret; + return zip_dir_add(za, name, 0); } diff --git a/ext/zip/lib/zip_add_entry.c b/ext/zip/lib/zip_add_entry.c new file mode 100644 index 0000000000000..3a7e2ccbe920f --- /dev/null +++ b/ext/zip/lib/zip_add_entry.c @@ -0,0 +1,66 @@ +/* + zip_add_entry.c -- create and init struct zip_entry + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + + +#include + +#include "zipint.h" + + + +/* NOTE: Signed due to -1 on error. See zip_add.c for more details. */ + +zip_int64_t +_zip_add_entry(struct zip *za) +{ + zip_uint64_t idx; + + if (za->nentry+1 >= za->nentry_alloc) { + struct zip_entry *rentries; + zip_uint64_t nalloc = za->nentry_alloc + 16; + rentries = (struct zip_entry *)realloc(za->entry, sizeof(struct zip_entry) * nalloc); + if (!rentries) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + za->entry = rentries; + za->nentry_alloc = nalloc; + } + + idx = za->nentry++; + + _zip_entry_init(za->entry+idx); + + return (zip_int64_t)idx; +} diff --git a/ext/zip/lib/zip_close.c b/ext/zip/lib/zip_close.c index 576be3b3536fb..c9c7e58088644 100644 --- a/ext/zip/lib/zip_close.c +++ b/ext/zip/lib/zip_close.c @@ -38,6 +38,9 @@ #include #include #include +#ifdef HAVE_STRINGS_H +#include +#endif #include #ifdef HAVE_UNISTD_H #include @@ -49,110 +52,106 @@ #include #endif -static int add_data(struct zip *, struct zip_source *, struct zip_dirent *, - FILE *); -static int copy_data(FILE *, off_t, FILE *, struct zip_error *); + + +/* max deflate size increase: size + ceil(size/16k)*5+6 */ +#define MAX_DEFLATE_SIZE_32 4293656963u + +static int add_data(struct zip *, struct zip_source *, struct zip_dirent *, FILE *); +static int copy_data(FILE *, zip_uint64_t, FILE *, struct zip_error *); static int copy_source(struct zip *, struct zip_source *, FILE *); -static int write_cdir(struct zip *, struct zip_cdir *, FILE *); -static int _zip_cdir_set_comment(struct zip_cdir *, struct zip *); +static int write_cdir(struct zip *, const struct zip_filelist *, zip_uint64_t, FILE *); static char *_zip_create_temp_output(struct zip *, FILE **); static int _zip_torrentzip_cmp(const void *, const void *); -struct filelist { - int idx; - const char *name; -}; - - - -ZIP_EXTERN(int) +ZIP_EXTERN int zip_close(struct zip *za) { - int survivors; - int i, j, error; + zip_uint64_t i, j, survivors; + int error; char *temp; FILE *out; #ifndef PHP_WIN32 mode_t mask; #endif - struct zip_cdir *cd; - struct zip_dirent de; - struct filelist *filelist; + struct zip_filelist *filelist; int reopen_on_error; int new_torrentzip; + int changed; reopen_on_error = 0; if (za == NULL) return -1; - if (!_zip_changed(za, &survivors)) { - _zip_free(za); - return 0; - } + changed = _zip_changed(za, &survivors); /* don't create zip files with no entries */ if (survivors == 0) { - if (za->zn && za->zp) { + if (za->zn && ((za->open_flags & ZIP_TRUNCATE) || (changed && za->zp))) { if (remove(za->zn) != 0) { _zip_error_set(&za->error, ZIP_ER_REMOVE, errno); return -1; } } - _zip_free(za); + zip_discard(za); return 0; } - if ((filelist=(struct filelist *)malloc(sizeof(filelist[0])*survivors)) - == NULL) - return -1; - - if ((cd=_zip_cdir_new(survivors, &za->error)) == NULL) { - free(filelist); - return -1; + if (!changed) { + zip_discard(za); + return 0; } - for (i=0; ientry[i]); + if (survivors > za->nentry) { + _zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); + return -1; + } + + if ((filelist=(struct zip_filelist *)malloc(sizeof(filelist[0])*survivors)) == NULL) + return -1; /* archive comment is special for torrentzip */ if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) { - cd->comment = _zip_memdup(TORRENT_SIG "XXXXXXXX", - TORRENT_SIG_LEN + TORRENT_CRC_LEN, - &za->error); - if (cd->comment == NULL) { - _zip_cdir_free(cd); - free(filelist); - return -1; - } - cd->comment_len = TORRENT_SIG_LEN + TORRENT_CRC_LEN; - } - else if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, ZIP_FL_UNCHANGED) == 0) { - if (_zip_cdir_set_comment(cd, za) == -1) { - _zip_cdir_free(cd); + /* XXX: use internal function when zip_set_archive_comment clears TORRENT flag */ + if (zip_set_archive_comment(za, TORRENT_SIG "XXXXXXXX", TORRENT_SIG_LEN + TORRENT_CRC_LEN) < 0) { free(filelist); return -1; } } - - if ((temp=_zip_create_temp_output(za, &out)) == NULL) { - _zip_cdir_free(cd); - free(filelist); - return -1; - } + /* XXX: if no longer torrentzip and archive comment not changed by user, delete it */ /* create list of files with index into original archive */ for (i=j=0; inentry; i++) { - if (za->entry[i].state == ZIP_ST_DELETED) + if (za->entry[i].deleted) continue; + if (j >= survivors) { + free(filelist); + _zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); + return -1; + } + filelist[j].idx = i; filelist[j].name = zip_get_name(za, i, 0); j++; } + if (j < survivors) { + free(filelist); + _zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); + return -1; + } + + + if ((temp=_zip_create_temp_output(za, &out)) == NULL) { + free(filelist); + return -1; + } + + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) qsort(filelist, survivors, sizeof(filelist[0]), _zip_torrentzip_cmp); @@ -162,106 +161,49 @@ zip_close(struct zip *za) ZIP_FL_UNCHANGED) == 0); error = 0; for (j=0; jentry+i; - _zip_dirent_init(&de); + new_data = (ZIP_ENTRY_DATA_CHANGED(entry) || new_torrentzip || ZIP_ENTRY_CHANGED(entry, ZIP_DIRENT_COMP_METHOD)); /* create new local directory entry */ - if (ZIP_ENTRY_DATA_CHANGED(za->entry+i) || new_torrentzip) { - - if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) - _zip_dirent_torrent_normalize(&de); - - /* use it as central directory entry */ - memcpy(cd->entry+j, &de, sizeof(cd->entry[j])); - - /* set/update file name */ - if (za->entry[i].ch_filename == NULL) { - if (za->entry[i].state == ZIP_ST_ADDED) { - de.filename = strdup("-"); - de.filename_len = 1; - cd->entry[j].filename = "-"; - cd->entry[j].filename_len = 1; - } - else { - de.filename = strdup(za->cdir->entry[i].filename); - de.filename_len = strlen(de.filename); - cd->entry[j].filename = za->cdir->entry[i].filename; - cd->entry[j].filename_len = de.filename_len; - } + if (entry->changes == NULL) { + if ((entry->changes=_zip_dirent_clone(entry->orig)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + error = 1; + break; } } - else { - /* copy existing directory entries */ - if ((NULL == za->zp) || (fseeko(za->zp, za->cdir->entry[i].offset, SEEK_SET) != 0)) { - _zip_error_set(&za->error, ZIP_ER_SEEK, errno); - error = 1; - break; - } - if (_zip_dirent_read(&de, za->zp, NULL, NULL, 1, - &za->error) != 0) { - error = 1; - break; - } - memcpy(cd->entry+j, za->cdir->entry+i, sizeof(cd->entry[j])); - if (de.bitflags & ZIP_GPBF_DATA_DESCRIPTOR) { - de.crc = za->cdir->entry[i].crc; - de.comp_size = za->cdir->entry[i].comp_size; - de.uncomp_size = za->cdir->entry[i].uncomp_size; - de.bitflags &= ~ZIP_GPBF_DATA_DESCRIPTOR; - cd->entry[j].bitflags &= ~ZIP_GPBF_DATA_DESCRIPTOR; - } - } + de = entry->changes; - if (za->entry[i].ch_filename) { - free(de.filename); - if ((de.filename=strdup(za->entry[i].ch_filename)) == NULL) { - error = 1; - break; - } - de.filename_len = strlen(de.filename); - cd->entry[j].filename = za->entry[i].ch_filename; - cd->entry[j].filename_len = de.filename_len; + if (_zip_read_local_ef(za, i) < 0) { + error = 1; + break; } - if (za->entry[i].ch_extra_len != -1) { - free(de.extrafield); - if ((de.extrafield=malloc(za->entry[i].ch_extra_len)) == NULL) { - error = 1; - break; - } - memcpy(de.extrafield, za->entry[i].ch_extra, za->entry[i].ch_extra_len); - de.extrafield_len = za->entry[i].ch_extra_len; - /* as the rest of cd entries, its malloc/free is done by za */ - /* TODO unsure if this should also be set in the CD -- - * not done for now - cd->entry[j].extrafield = za->entry[i].ch_extra; - cd->entry[j].extrafield_len = za->entry[i].ch_extra_len; - */ - } + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) + _zip_dirent_torrent_normalize(entry->changes); - if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0) == 0 - && za->entry[i].ch_comment_len != -1) { - /* as the rest of cd entries, its malloc/free is done by za */ - cd->entry[j].comment = za->entry[i].ch_comment; - cd->entry[j].comment_len = za->entry[i].ch_comment_len; - } - cd->entry[j].offset = ftello(out); + de->offset = (zip_uint64_t)ftello(out); /* XXX: check for errors */ - if (ZIP_ENTRY_DATA_CHANGED(za->entry+i) || new_torrentzip) { + if (new_data) { struct zip_source *zs; zs = NULL; - if (!ZIP_ENTRY_DATA_CHANGED(za->entry+i)) { - if ((zs=zip_source_zip(za, za, i, ZIP_FL_RECOMPRESS, 0, -1)) - == NULL) { + if (!ZIP_ENTRY_DATA_CHANGED(entry)) { + if ((zs=_zip_source_zip_new(za, za, i, ZIP_FL_UNCHANGED, 0, 0, NULL)) == NULL) { error = 1; break; } } - if (add_data(za, zs ? zs : za->entry[i].source, &de, out) < 0) { + /* add_data writes dirent */ + if (add_data(za, zs ? zs : entry->source, de, out) < 0) { error = 1; if (zs) zip_source_free(zs); @@ -269,51 +211,49 @@ zip_close(struct zip *za) } if (zs) zip_source_free(zs); - - cd->entry[j].last_mod = de.last_mod; - cd->entry[j].comp_method = de.comp_method; - cd->entry[j].comp_size = de.comp_size; - cd->entry[j].uncomp_size = de.uncomp_size; - cd->entry[j].crc = de.crc; } else { - if (_zip_dirent_write(&de, out, 1, &za->error) < 0) { + zip_uint64_t offset; + + /* when copying data, all sizes are known -> no data descriptor needed */ + de->bitflags &= ~ZIP_GPBF_DATA_DESCRIPTOR; + if (_zip_dirent_write(de, out, ZIP_FL_LOCAL, &za->error) < 0) { error = 1; break; } - /* we just read the local dirent, file is at correct position */ - if (copy_data(za->zp, cd->entry[j].comp_size, out, - &za->error) < 0) { + if ((offset=_zip_file_get_offset(za, i, &za->error)) == 0) { + error = 1; + break; + } + if ((fseek(za->zp, (off_t)offset, SEEK_SET) < 0)) { + _zip_error_set(&za->error, ZIP_ER_SEEK, errno); + error = 1; + break; + } + if (copy_data(za->zp, de->comp_size, out, &za->error) < 0) { error = 1; break; } } - - _zip_dirent_finalize(&de); } - free(filelist); - if (!error) { - if (write_cdir(za, cd, out) < 0) + if (write_cdir(za, filelist, survivors, out) < 0) error = 1; } - /* pointers in cd entries are owned by za */ - cd->nentry = 0; - _zip_cdir_free(cd); + free(filelist); if (error) { - _zip_dirent_finalize(&de); fclose(out); - remove(temp); + (void)remove(temp); free(temp); return -1; } if (fclose(out) != 0) { _zip_error_set(&za->error, ZIP_ER_CLOSE, errno); - remove(temp); + (void)remove(temp); free(temp); return -1; } @@ -325,7 +265,7 @@ zip_close(struct zip *za) } if (_zip_rename(temp, za->zn) != 0) { _zip_error_set(&za->error, ZIP_ER_RENAME, errno); - remove(temp); + (void)remove(temp); free(temp); if (reopen_on_error) { /* ignore errors, since we're already in an error case */ @@ -339,56 +279,112 @@ zip_close(struct zip *za) chmod(za->zn, 0666&~mask); #endif - _zip_free(za); - free(temp); - + zip_discard(za); + free(temp); + return 0; } static int -add_data(struct zip *za, struct zip_source *src, struct zip_dirent *de, - FILE *ft) +add_data(struct zip *za, struct zip_source *src, struct zip_dirent *de, FILE *ft) { off_t offstart, offdata, offend; struct zip_stat st; struct zip_source *s2; - zip_compression_implementation comp_impl; int ret; + int is_zip64; + zip_flags_t flags; if (zip_source_stat(src, &st) < 0) { _zip_error_set_from_source(&za->error, src); return -1; } + if ((st.valid & ZIP_STAT_COMP_METHOD) == 0) { + st.valid |= ZIP_STAT_COMP_METHOD; + st.comp_method = ZIP_CM_STORE; + } + + if (ZIP_CM_IS_DEFAULT(de->comp_method) && st.comp_method != ZIP_CM_STORE) + de->comp_method = st.comp_method; + else if (de->comp_method == ZIP_CM_STORE && (st.valid & ZIP_STAT_SIZE)) { + st.valid |= ZIP_STAT_COMP_SIZE; + st.comp_size = st.size; + } + else { + /* we'll recompress */ + st.valid &= ~ZIP_STAT_COMP_SIZE; + } + + + flags = ZIP_EF_LOCAL; + + if ((st.valid & ZIP_STAT_SIZE) == 0) + flags |= ZIP_FL_FORCE_ZIP64; + else { + de->uncomp_size = st.size; + + if ((st.valid & ZIP_STAT_COMP_SIZE) == 0) { + if (( ((de->comp_method == ZIP_CM_DEFLATE || ZIP_CM_IS_DEFAULT(de->comp_method)) && st.size > MAX_DEFLATE_SIZE_32) + || (de->comp_method != ZIP_CM_STORE && de->comp_method != ZIP_CM_DEFLATE && !ZIP_CM_IS_DEFAULT(de->comp_method)))) + flags |= ZIP_FL_FORCE_ZIP64; + } + else + de->comp_size = st.comp_size; + } + + offstart = ftello(ft); - if (_zip_dirent_write(de, ft, 1, &za->error) < 0) + /* as long as we don't support non-seekable output, clear data descriptor bit */ + de->bitflags &= ~ZIP_GPBF_DATA_DESCRIPTOR; + if ((is_zip64=_zip_dirent_write(de, ft, flags, &za->error)) < 0) return -1; - if ((s2=zip_source_crc(za, src, 0)) == NULL) { - zip_source_pop(s2); - return -1; - } - - /* XXX: deflate 0-byte files for torrentzip? */ - if (((st.valid & ZIP_STAT_COMP_METHOD) == 0 - || st.comp_method == ZIP_CM_STORE) - && ((st.valid & ZIP_STAT_SIZE) == 0 || st.size != 0)) { - comp_impl = NULL; - if ((comp_impl=zip_get_compression_implementation(ZIP_CM_DEFLATE)) - == NULL) { - _zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0); - zip_source_pop(s2); - return -1; + + if (st.comp_method == ZIP_CM_STORE || (ZIP_CM_IS_DEFAULT(de->comp_method) && st.comp_method != de->comp_method)) { + struct zip_source *s_store, *s_crc; + zip_compression_implementation comp_impl; + + if (st.comp_method != ZIP_CM_STORE) { + if ((comp_impl=_zip_get_compression_implementation(st.comp_method)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0); + return -1; + } + if ((s_store=comp_impl(za, src, st.comp_method, ZIP_CODEC_DECODE)) == NULL) { + /* error set by comp_impl */ + return -1; + } } - if ((s2=comp_impl(za, s2, ZIP_CM_DEFLATE, ZIP_CODEC_ENCODE)) - == NULL) { - /* XXX: set error? */ - zip_source_pop(s2); + else + s_store = src; + + if ((s_crc=zip_source_crc(za, s_store, 0)) == NULL) { + if (s_store != src) + zip_source_pop(s_store); return -1; } + + /* XXX: deflate 0-byte files for torrentzip? */ + if (de->comp_method != ZIP_CM_STORE && ((st.valid & ZIP_STAT_SIZE) == 0 || st.size != 0)) { + if ((comp_impl=_zip_get_compression_implementation(de->comp_method)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0); + zip_source_pop(s_crc); + if (s_store != src) + zip_source_pop(s_store); + return -1; + } + if ((s2=comp_impl(za, s_crc, de->comp_method, ZIP_CODEC_ENCODE)) == NULL) { + zip_source_pop(s_crc); + if (s_store != src) + zip_source_pop(s_store); + return -1; + } + } + else + s2 = s_crc; } else s2 = src; @@ -418,18 +414,33 @@ add_data(struct zip *za, struct zip_source *src, struct zip_dirent *de, return -1; } - de->last_mod = st.mtime; + if ((st.valid & (ZIP_STAT_COMP_METHOD|ZIP_STAT_CRC|ZIP_STAT_SIZE)) != (ZIP_STAT_COMP_METHOD|ZIP_STAT_CRC|ZIP_STAT_SIZE)) { + _zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); + return -1; + } + + if (st.valid & ZIP_STAT_MTIME) + de->last_mod = st.mtime; + else + time(&de->last_mod); de->comp_method = st.comp_method; de->crc = st.crc; de->uncomp_size = st.size; - de->comp_size = offend - offdata; + de->comp_size = (zip_uint64_t)(offend - offdata); if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) _zip_dirent_torrent_normalize(de); - if (_zip_dirent_write(de, ft, 1, &za->error) < 0) + if ((ret=_zip_dirent_write(de, ft, flags, &za->error)) < 0) return -1; - + + if (is_zip64 != ret) { + /* Zip64 mismatch between preliminary file header written before data and final file header written afterwards */ + _zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); + return -1; + } + + if (fseeko(ft, offend, SEEK_SET) < 0) { _zip_error_set(&za->error, ZIP_ER_SEEK, errno); return -1; @@ -441,24 +452,26 @@ add_data(struct zip *za, struct zip_source *src, struct zip_dirent *de, static int -copy_data(FILE *fs, off_t len, FILE *ft, struct zip_error *error) +copy_data(FILE *fs, zip_uint64_t len, FILE *ft, struct zip_error *error) { char buf[BUFSIZE]; - int n, nn; + size_t n, nn; if (len == 0) return 0; while (len > 0) { nn = len > sizeof(buf) ? sizeof(buf) : len; - if ((n=fread(buf, 1, nn, fs)) < 0) { - _zip_error_set(error, ZIP_ER_READ, errno); - return -1; - } - else if (n == 0) { - _zip_error_set(error, ZIP_ER_EOF, 0); - return -1; - } + if ((n=fread(buf, 1, nn, fs)) == 0) { + if (ferror(fs)) { + _zip_error_set(error, ZIP_ER_READ, errno); + return -1; + } + else { + _zip_error_set(error, ZIP_ER_EOF, 0); + return -1; + } + } if (fwrite(buf, 1, n, ft) != (size_t)n) { _zip_error_set(error, ZIP_ER_WRITE, errno); @@ -487,7 +500,7 @@ copy_source(struct zip *za, struct zip_source *src, FILE *ft) ret = 0; while ((n=zip_source_read(src, buf, sizeof(buf))) > 0) { - if (fwrite(buf, 1, n, ft) != (size_t)n) { + if (fwrite(buf, 1, (size_t)n, ft) != (size_t)n) { _zip_error_set(&za->error, ZIP_ER_WRITE, errno); ret = -1; break; @@ -508,29 +521,32 @@ copy_source(struct zip *za, struct zip_source *src, FILE *ft) static int -write_cdir(struct zip *za, struct zip_cdir *cd, FILE *out) +write_cdir(struct zip *za, const struct zip_filelist *filelist, zip_uint64_t survivors, FILE *out) { - off_t offset; + off_t cd_start, end; + zip_int64_t size; uLong crc; char buf[TORRENT_CRC_LEN+1]; - if (_zip_cdir_write(cd, out, &za->error) < 0) + cd_start = ftello(out); + + if ((size=_zip_cdir_write(za, filelist, survivors, out)) < 0) return -1; + end = ftello(out); + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0) == 0) return 0; /* fix up torrentzip comment */ - offset = ftello(out); - - if (_zip_filerange_crc(out, cd->offset, cd->size, &crc, &za->error) < 0) + if (_zip_filerange_crc(out, cd_start, size, &crc, &za->error) < 0) return -1; snprintf(buf, sizeof(buf), "%08lX", (long)crc); - if (fseeko(out, offset-TORRENT_CRC_LEN, SEEK_SET) < 0) { + if (fseeko(out, end-TORRENT_CRC_LEN, SEEK_SET) < 0) { _zip_error_set(&za->error, ZIP_ER_SEEK, errno); return -1; } @@ -545,47 +561,22 @@ write_cdir(struct zip *za, struct zip_cdir *cd, FILE *out) -static int -_zip_cdir_set_comment(struct zip_cdir *dest, struct zip *src) -{ - if (src->ch_comment_len != -1) { - dest->comment = _zip_memdup(src->ch_comment, - src->ch_comment_len, &src->error); - if (dest->comment == NULL) - return -1; - dest->comment_len = src->ch_comment_len; - } else { - if (src->cdir && src->cdir->comment) { - dest->comment = _zip_memdup(src->cdir->comment, - src->cdir->comment_len, &src->error); - if (dest->comment == NULL) - return -1; - dest->comment_len = src->cdir->comment_len; - } - } - - return 0; -} - - - int -_zip_changed(struct zip *za, int *survivorsp) +_zip_changed(const struct zip *za, zip_uint64_t *survivorsp) { - int changed, i, survivors; + int changed; + zip_uint64_t i, survivors; - changed = survivors = 0; + changed = 0; + survivors = 0; - if (za->ch_comment_len != -1 - || za->ch_flags != za->flags) + if (za->comment_changed || za->ch_flags != za->flags) changed = 1; for (i=0; inentry; i++) { - if ((za->entry[i].state != ZIP_ST_UNCHANGED) - || (za->entry[i].ch_extra_len != -1) - || (za->entry[i].ch_comment_len != -1)) + if (za->entry[i].deleted || za->entry[i].source || (za->entry[i].changes && za->entry[i].changes->changed != 0)) changed = 1; - if (za->entry[i].state != ZIP_ST_DELETED) + if (!za->entry[i].deleted) survivors++; } @@ -603,14 +594,21 @@ _zip_create_temp_output(struct zip *za, FILE **outp) char *temp; int tfd; FILE *tfp; - int len = strlen(za->zn) + 8; - - if ((temp=(char *)malloc(len)) == NULL) { - _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); - return NULL; + + if (za->tempdir) { + if ((temp=(char *)malloc(strlen(za->tempdir)+13)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + sprintf(temp, "%s/.zip.XXXXXX", za->tempdir); + } + else { + if ((temp=(char *)malloc(strlen(za->zn)+8)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + sprintf(temp, "%s.XXXXXX", za->zn); } - - snprintf(temp, len, "%s.XXXXXX", za->zn); if ((tfd=mkstemp(temp)) == -1) { _zip_error_set(&za->error, ZIP_ER_TMPOPEN, errno); @@ -621,7 +619,7 @@ _zip_create_temp_output(struct zip *za, FILE **outp) if ((tfp=fdopen(tfd, "r+b")) == NULL) { _zip_error_set(&za->error, ZIP_ER_TMPOPEN, errno); close(tfd); - remove(temp); + (void)remove(temp); free(temp); return NULL; } @@ -630,7 +628,7 @@ _zip_create_temp_output(struct zip *za, FILE **outp) According to Pierre Joye, Windows in some environments per default creates text files, so force binary mode. */ - _setmode(_fileno(tfp), _O_BINARY ); + _setmode(_fileno(tfp), _O_BINARY ); #endif *outp = tfp; @@ -642,6 +640,13 @@ _zip_create_temp_output(struct zip *za, FILE **outp) static int _zip_torrentzip_cmp(const void *a, const void *b) { - return strcasecmp(((const struct filelist *)a)->name, - ((const struct filelist *)b)->name); + const char *aname = ((const struct zip_filelist *)a)->name; + const char *bname = ((const struct zip_filelist *)b)->name; + + if (aname == NULL) + return (bname != NULL) * -1; + else if (bname == NULL) + return 1; + + return strcasecmp(aname, bname); } diff --git a/ext/zip/lib/zip_delete.c b/ext/zip/lib/zip_delete.c index 131d444124c4b..cb769367cc6f6 100644 --- a/ext/zip/lib/zip_delete.c +++ b/ext/zip/lib/zip_delete.c @@ -37,7 +37,7 @@ -ZIP_EXTERN(int) +ZIP_EXTERN int zip_delete(struct zip *za, zip_uint64_t idx) { if (idx >= za->nentry) { @@ -55,7 +55,7 @@ zip_delete(struct zip *za, zip_uint64_t idx) if (_zip_unchange(za, idx, 1) != 0) return -1; - za->entry[idx].state = ZIP_ST_DELETED; + za->entry[idx].deleted = 1; return 0; } diff --git a/ext/zip/lib/zip_entry_new.c b/ext/zip/lib/zip_dir_add.c similarity index 61% rename from ext/zip/lib/zip_entry_new.c rename to ext/zip/lib/zip_dir_add.c index ad5d59975a927..0a74bd608764e 100644 --- a/ext/zip/lib/zip_entry_new.c +++ b/ext/zip/lib/zip_dir_add.c @@ -1,6 +1,6 @@ /* - zip_entry_new.c -- create and init struct zip_entry - Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner + zip_dir_add.c -- add directory + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -34,48 +34,55 @@ #include +#include #include "zipint.h" -struct zip_entry * -_zip_entry_new(struct zip *za) +/* NOTE: Signed due to -1 on error. See zip_add.c for more details. */ + +ZIP_EXTERN zip_int64_t +zip_dir_add(struct zip *za, const char *name, zip_flags_t flags) { - struct zip_entry *ze; - if (!za) { - ze = (struct zip_entry *)malloc(sizeof(struct zip_entry)); - if (!ze) { - return NULL; - } + size_t len; + zip_int64_t ret; + char *s; + struct zip_source *source; + + if (ZIP_IS_RDONLY(za)) { + _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; } - else { - if (za->nentry+1 >= za->nentry_alloc) { - struct zip_entry *rentries; - za->nentry_alloc += 16; - rentries = (struct zip_entry *)realloc(za->entry, - sizeof(struct zip_entry) - * za->nentry_alloc); - if (!rentries) { - _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); - return NULL; - } - za->entry = rentries; - } - ze = za->entry+za->nentry; + + if (name == NULL) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; } - ze->state = ZIP_ST_UNCHANGED; + s = NULL; + len = strlen(name); - ze->ch_filename = NULL; - ze->ch_extra = NULL; - ze->ch_extra_len = -1; - ze->ch_comment = NULL; - ze->ch_comment_len = -1; - ze->source = NULL; + if (name[len-1] != '/') { + if ((s=(char *)malloc(len+2)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + strcpy(s, name); + s[len] = '/'; + s[len+1] = '\0'; + } + + if ((source=zip_source_buffer(za, NULL, 0, 0)) == NULL) { + free(s); + return -1; + } + + ret = _zip_file_replace(za, ZIP_UINT64_MAX, s ? s : name, source, flags); - if (za) - za->nentry++; + free(s); + if (ret < 0) + zip_source_free(source); - return ze; + return ret; } diff --git a/ext/zip/lib/zip_dirent.c b/ext/zip/lib/zip_dirent.c index b9dac5c989e32..f4f2deb6fc5b9 100644 --- a/ext/zip/lib/zip_dirent.c +++ b/ext/zip/lib/zip_dirent.c @@ -1,6 +1,6 @@ /* zip_dirent.c -- read directory entry (local or central), clean dirent - Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2013 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -42,48 +42,54 @@ #include "zipint.h" -static time_t _zip_d2u_time(int, int); -static char *_zip_readfpstr(FILE *, unsigned int, int, struct zip_error *); -static char *_zip_readstr(unsigned char **, int, int, struct zip_error *); -static void _zip_write2(unsigned short, FILE *); -static void _zip_write4(unsigned int, FILE *); +static time_t _zip_d2u_time(zip_uint16_t, zip_uint16_t); +static struct zip_string *_zip_read_string(const unsigned char **, FILE *, zip_uint16_t, int, struct zip_error *); +static struct zip_string *_zip_dirent_process_ef_utf_8(const struct zip_dirent *, zip_uint16_t, struct zip_string *); +static struct zip_extra_field *_zip_ef_utf8(zip_uint16_t, struct zip_string *, struct zip_error *); void _zip_cdir_free(struct zip_cdir *cd) { - int i; + zip_uint64_t i; if (!cd) return; for (i=0; inentry; i++) - _zip_dirent_finalize(cd->entry+i); - free(cd->comment); + _zip_entry_finalize(cd->entry+i); free(cd->entry); + _zip_string_free(cd->comment); free(cd); } int -_zip_cdir_grow(struct zip_cdir *cd, int nentry, struct zip_error *error) +_zip_cdir_grow(struct zip_cdir *cd, zip_uint64_t nentry, struct zip_error *error) { - struct zip_dirent *entry; + struct zip_entry *entry; + zip_uint64_t i; - if (nentry < cd->nentry) { + if (nentry < cd->nentry_alloc) { _zip_error_set(error, ZIP_ER_INTERNAL, 0); return -1; } - if ((entry=((struct zip_dirent *) + if (nentry == cd->nentry_alloc) + return 0; + + if ((entry=((struct zip_entry *) realloc(cd->entry, sizeof(*(cd->entry))*nentry))) == NULL) { _zip_error_set(error, ZIP_ER_MEMORY, 0); return -1; } + + for (i=cd->nentry_alloc; inentry = nentry; + cd->nentry_alloc = nentry; cd->entry = entry; return 0; @@ -92,64 +98,132 @@ _zip_cdir_grow(struct zip_cdir *cd, int nentry, struct zip_error *error) struct zip_cdir * -_zip_cdir_new(int nentry, struct zip_error *error) +_zip_cdir_new(zip_uint64_t nentry, struct zip_error *error) { struct zip_cdir *cd; + zip_uint64_t i; if ((cd=(struct zip_cdir *)malloc(sizeof(*cd))) == NULL) { _zip_error_set(error, ZIP_ER_MEMORY, 0); return NULL; } - if ((cd->entry=(struct zip_dirent *)malloc(sizeof(*(cd->entry))*nentry)) - == NULL) { + if (nentry == 0) + cd->entry = NULL; + else if ((cd->entry=(struct zip_entry *)malloc(sizeof(*(cd->entry))*nentry)) == NULL) { _zip_error_set(error, ZIP_ER_MEMORY, 0); free(cd); return NULL; } - /* entries must be initialized by caller */ + for (i=0; ientry+i); - cd->nentry = nentry; + cd->nentry = cd->nentry_alloc = nentry; cd->size = cd->offset = 0; cd->comment = NULL; - cd->comment_len = 0; return cd; } -int -_zip_cdir_write(struct zip_cdir *cd, FILE *fp, struct zip_error *error) +zip_int64_t +_zip_cdir_write(struct zip *za, const struct zip_filelist *filelist, zip_uint64_t survivors, FILE *fp) { - int i; + off_t off; + zip_uint64_t offset, size; + struct zip_string *comment; + zip_uint64_t i; + int is_zip64; + int ret; + + if ((off=ftello(fp)) < 0) { + _zip_error_set(&za->error, ZIP_ER_READ, errno); + return -1; + } + offset = (zip_uint64_t)off; - cd->offset = ftello(fp); + is_zip64 = 0; - for (i=0; inentry; i++) { - if (_zip_dirent_write(cd->entry+i, fp, 0, error) != 0) + for (i=0; ientry+filelist[i].idx; + + if ((ret=_zip_dirent_write(entry->changes ? entry->changes : entry->orig, fp, ZIP_FL_CENTRAL, &za->error)) < 0) return -1; + if (ret) + is_zip64 = 1; + } + + if ((off=ftello(fp)) < 0) { + _zip_error_set(&za->error, ZIP_ER_READ, errno); + return -1; + } + size = (zip_uint64_t)off - offset; + + if (offset > ZIP_UINT32_MAX || survivors > ZIP_UINT16_MAX) + is_zip64 = 1; + + if (is_zip64) { + fwrite(EOCD64_MAGIC, 1, 4, fp); + _zip_write8(EOCD64LEN-12, fp); + _zip_write2(45, fp); + _zip_write2(45, fp); + _zip_write4(0, fp); + _zip_write4(0, fp); + _zip_write8(survivors, fp); + _zip_write8(survivors, fp); + _zip_write8(size, fp); + _zip_write8(offset, fp); + + fwrite(EOCD64LOC_MAGIC, 1, 4, fp); + _zip_write4(0, fp); + _zip_write8(offset+size, fp); + _zip_write4(1, fp); + } - cd->size = ftello(fp) - cd->offset; - /* clearerr(fp); */ fwrite(EOCD_MAGIC, 1, 4, fp); _zip_write4(0, fp); - _zip_write2((unsigned short)cd->nentry, fp); - _zip_write2((unsigned short)cd->nentry, fp); - _zip_write4(cd->size, fp); - _zip_write4(cd->offset, fp); - _zip_write2(cd->comment_len, fp); - fwrite(cd->comment, 1, cd->comment_len, fp); + _zip_write2(survivors >= ZIP_UINT16_MAX ? ZIP_UINT16_MAX : (zip_uint16_t)survivors, fp); + _zip_write2(survivors >= ZIP_UINT16_MAX ? ZIP_UINT16_MAX : (zip_uint16_t)survivors, fp); + _zip_write4(size >= ZIP_UINT32_MAX ? ZIP_UINT32_MAX : (zip_uint32_t)size, fp); + _zip_write4(offset >= ZIP_UINT32_MAX ? ZIP_UINT32_MAX : (zip_uint32_t)offset, fp); + + comment = za->comment_changed ? za->comment_changes : za->comment_orig; + + _zip_write2(comment ? comment->length : 0, fp); + if (comment) + fwrite(comment->raw, 1, comment->length, fp); if (ferror(fp)) { - _zip_error_set(error, ZIP_ER_WRITE, errno); + _zip_error_set(&za->error, ZIP_ER_WRITE, errno); return -1; } - return 0; + return (zip_int64_t)size; +} + + + +struct zip_dirent * +_zip_dirent_clone(const struct zip_dirent *sde) +{ + struct zip_dirent *tde; + + if ((tde=(struct zip_dirent *)malloc(sizeof(*tde))) == NULL) + return NULL; + + if (sde) + memcpy(tde, sde, sizeof(*sde)); + else + _zip_dirent_init(tde); + + tde->changed = 0; + tde->cloned = 1; + + return tde; } @@ -157,18 +231,24 @@ _zip_cdir_write(struct zip_cdir *cd, FILE *fp, struct zip_error *error) void _zip_dirent_finalize(struct zip_dirent *zde) { - if (zde->filename_len > 0) { - free(zde->filename); - } - zde->filename = NULL; - if (zde->extrafield_len > 0) { - free(zde->extrafield); - } - zde->extrafield = NULL; - if (zde->comment_len > 0) { - free(zde->comment); - } - zde->comment = NULL; + if (!zde->cloned || zde->changed & ZIP_DIRENT_FILENAME) + _zip_string_free(zde->filename); + if (!zde->cloned || zde->changed & ZIP_DIRENT_EXTRA_FIELD) + _zip_ef_free(zde->extra_fields); + if (!zde->cloned || zde->changed & ZIP_DIRENT_COMMENT) + _zip_string_free(zde->comment); +} + + + +void +_zip_dirent_free(struct zip_dirent *zde) +{ + if (zde == NULL) + return; + + _zip_dirent_finalize(zde); + free(zde); } @@ -176,20 +256,21 @@ _zip_dirent_finalize(struct zip_dirent *zde) void _zip_dirent_init(struct zip_dirent *de) { - de->version_madeby = 0; + de->changed = 0; + de->local_extra_fields_read = 0; + de->cloned = 0; + + de->version_madeby = 20; de->version_needed = 20; /* 2.0 */ de->bitflags = 0; - de->comp_method = 0; + de->comp_method = ZIP_CM_DEFAULT; de->last_mod = 0; de->crc = 0; de->comp_size = 0; de->uncomp_size = 0; de->filename = NULL; - de->filename_len = 0; - de->extrafield = NULL; - de->extrafield_len = 0; + de->extra_fields = NULL; de->comment = NULL; - de->comment_len = 0; de->disk_number = 0; de->int_attrib = 0; de->ext_attrib = 0; @@ -198,6 +279,32 @@ _zip_dirent_init(struct zip_dirent *de) +int +_zip_dirent_needs_zip64(const struct zip_dirent *de, zip_flags_t flags) +{ + if (de->uncomp_size >= ZIP_UINT32_MAX || de->comp_size >= ZIP_UINT32_MAX + || ((flags & ZIP_FL_CENTRAL) && de->offset >= ZIP_UINT32_MAX)) + return 1; + + return 0; +} + + + +struct zip_dirent * +_zip_dirent_new(void) +{ + struct zip_dirent *de; + + if ((de=(struct zip_dirent *)malloc(sizeof(*de))) == NULL) + return NULL; + + _zip_dirent_init(de); + return de; +} + + + /* _zip_dirent_read(zde, fp, bufp, left, localp, error): Fills the zip directory entry zde. @@ -218,13 +325,14 @@ _zip_dirent_init(struct zip_dirent *de) int _zip_dirent_read(struct zip_dirent *zde, FILE *fp, - unsigned char **bufp, zip_uint32_t *leftp, int local, + const unsigned char **bufp, zip_uint64_t *leftp, int local, struct zip_error *error) { unsigned char buf[CDENTRYSIZE]; - unsigned char *cur; - unsigned short dostime, dosdate; + const unsigned char *cur; + zip_uint16_t dostime, dosdate; zip_uint32_t size; + zip_uint16_t filename_len, comment_len, ef_len; if (local) size = LENTRYSIZE; @@ -255,9 +363,10 @@ _zip_dirent_read(struct zip_dirent *zde, FILE *fp, } cur += 4; - + /* convert buffercontents to zip_dirent */ - + + _zip_dirent_init(zde); if (!local) zde->version_madeby = _zip_read2(&cur); else @@ -275,17 +384,17 @@ _zip_dirent_read(struct zip_dirent *zde, FILE *fp, zde->comp_size = _zip_read4(&cur); zde->uncomp_size = _zip_read4(&cur); - zde->filename_len = _zip_read2(&cur); - zde->extrafield_len = _zip_read2(&cur); + filename_len = _zip_read2(&cur); + ef_len = _zip_read2(&cur); if (local) { - zde->comment_len = 0; + comment_len = 0; zde->disk_number = 0; zde->int_attrib = 0; zde->ext_attrib = 0; zde->offset = 0; } else { - zde->comment_len = _zip_read2(&cur); + comment_len = _zip_read2(&cur); zde->disk_number = _zip_read2(&cur); zde->int_attrib = _zip_read2(&cur); zde->ext_attrib = _zip_read4(&cur); @@ -293,56 +402,102 @@ _zip_dirent_read(struct zip_dirent *zde, FILE *fp, } zde->filename = NULL; - zde->extrafield = NULL; + zde->extra_fields = NULL; zde->comment = NULL; - size += zde->filename_len+zde->extrafield_len+zde->comment_len; + size += filename_len+ef_len+comment_len; if (leftp && (*leftp < size)) { - _zip_error_set(error, ZIP_ER_NOZIP, 0); + _zip_error_set(error, ZIP_ER_INCONS, 0); return -1; } - if (bufp) { - if (zde->filename_len) { - zde->filename = _zip_readstr(&cur, zde->filename_len, 1, error); - if (!zde->filename) - return -1; - } + if (filename_len) { + zde->filename = _zip_read_string(bufp ? &cur : NULL, fp, filename_len, 1, error); + if (!zde->filename) + return -1; - if (zde->extrafield_len) { - zde->extrafield = _zip_readstr(&cur, zde->extrafield_len, 0, - error); - if (!zde->extrafield) + if (zde->bitflags & ZIP_GPBF_ENCODING_UTF_8) { + if (_zip_guess_encoding(zde->filename, ZIP_ENCODING_UTF8_KNOWN) == ZIP_ENCODING_ERROR) { + _zip_error_set(error, ZIP_ER_INCONS, 0); return -1; + } } + } - if (zde->comment_len) { - zde->comment = _zip_readstr(&cur, zde->comment_len, 0, error); - if (!zde->comment) - return -1; + if (ef_len) { + zip_uint8_t *ef = _zip_read_data(bufp ? &cur : NULL, fp, ef_len, 0, error); + + if (ef == NULL) + return -1; + if ((zde->extra_fields=_zip_ef_parse(ef, ef_len, local ? ZIP_EF_LOCAL : ZIP_EF_CENTRAL, error)) == NULL) { + free(ef); + return -1; } + free(ef); + if (local) + zde->local_extra_fields_read = 1; } - else { - if (zde->filename_len) { - zde->filename = _zip_readfpstr(fp, zde->filename_len, 1, error); - if (!zde->filename) - return -1; - } - if (zde->extrafield_len) { - zde->extrafield = _zip_readfpstr(fp, zde->extrafield_len, 0, - error); - if (!zde->extrafield) + if (comment_len) { + zde->comment = _zip_read_string(bufp ? &cur : NULL, fp, comment_len, 0, error); + if (!zde->comment) + return -1; + + if (zde->bitflags & ZIP_GPBF_ENCODING_UTF_8) { + if (_zip_guess_encoding(zde->comment, ZIP_ENCODING_UTF8_KNOWN) == ZIP_ENCODING_ERROR) { + _zip_error_set(error, ZIP_ER_INCONS, 0); return -1; + } } + } - if (zde->comment_len) { - zde->comment = _zip_readfpstr(fp, zde->comment_len, 0, error); - if (!zde->comment) - return -1; + zde->filename = _zip_dirent_process_ef_utf_8(zde, ZIP_EF_UTF_8_NAME, zde->filename); + zde->comment = _zip_dirent_process_ef_utf_8(zde, ZIP_EF_UTF_8_COMMENT, zde->comment); + + /* Zip64 */ + + if (zde->uncomp_size == ZIP_UINT32_MAX || zde->comp_size == ZIP_UINT32_MAX || zde->offset == ZIP_UINT32_MAX) { + zip_uint16_t got_len, needed_len; + const zip_uint8_t *ef = _zip_ef_get_by_id(zde->extra_fields, &got_len, ZIP_EF_ZIP64, 0, local ? ZIP_EF_LOCAL : ZIP_EF_CENTRAL, error); + /* XXX: if got_len == 0 && !ZIP64_EOCD: no error, 0xffffffff is valid value */ + if (ef == NULL) + return -1; + + + if (local) + needed_len = 16; + else + needed_len = ((zde->uncomp_size == ZIP_UINT32_MAX) + (zde->comp_size == ZIP_UINT32_MAX) + (zde->offset == ZIP_UINT32_MAX)) * 8 + + (zde->disk_number == ZIP_UINT16_MAX) * 4; + + if (got_len != needed_len) { + _zip_error_set(error, ZIP_ER_INCONS, 0); + return -1; } + + if (zde->uncomp_size == ZIP_UINT32_MAX) + zde->uncomp_size = _zip_read8(&ef); + else if (local) + ef += 8; + if (zde->comp_size == ZIP_UINT32_MAX) + zde->comp_size = _zip_read8(&ef); + if (!local) { + if (zde->offset == ZIP_UINT32_MAX) + zde->offset = _zip_read8(&ef); + if (zde->disk_number == ZIP_UINT16_MAX) + zde->disk_number = _zip_read4(&ef); + } + } + + if (!local) { + if (zde->offset > ZIP_OFF_MAX) { + _zip_error_set(error, ZIP_ER_SEEK, EFBIG); + return -1; + } } + + zde->extra_fields = _zip_ef_remove_internal(zde->extra_fields); if (bufp) *bufp = cur; @@ -354,6 +509,65 @@ _zip_dirent_read(struct zip_dirent *zde, FILE *fp, +static struct zip_string * +_zip_dirent_process_ef_utf_8(const struct zip_dirent *de, zip_uint16_t id, struct zip_string *str) +{ + zip_uint16_t ef_len; + zip_uint32_t ef_crc; + + const zip_uint8_t *ef = _zip_ef_get_by_id(de->extra_fields, &ef_len, id, 0, ZIP_EF_BOTH, NULL); + + if (ef == NULL || ef_len < 5 || ef[0] != 1) + return str; + + ef++; + ef_crc = _zip_read4(&ef); + + if (_zip_string_crc32(str) == ef_crc) { + struct zip_string *ef_str = _zip_string_new(ef, ef_len-5, ZIP_ENCODING_UTF8_KNOWN, NULL); + + if (ef_str != NULL) { + _zip_string_free(str); + str = ef_str; + } + } + + return str; +} + + + +zip_int32_t +_zip_dirent_size(FILE *f, zip_uint16_t flags, struct zip_error *error) +{ + zip_int32_t size; + int local = (flags & ZIP_EF_LOCAL); + int i; + unsigned char b[6]; + const unsigned char *p; + + size = local ? LENTRYSIZE : CDENTRYSIZE; + + if (fseek(f, local ? 26 : 28, SEEK_CUR) < 0) { + _zip_error_set(error, ZIP_ER_SEEK, errno); + return -1; + } + + if (fread(b, (local ? 4 : 6), 1, f) != 1) { + _zip_error_set(error, ZIP_ER_READ, errno); + return -1; + } + + p = b; + for (i=0; i<(local ? 2 : 3); i++) { + size += _zip_read2(&p); + } + + return size; +} + + + /* _zip_dirent_torrent_normalize(de); Set values suitable for torrentzip. */ @@ -399,84 +613,157 @@ _zip_dirent_torrent_normalize(struct zip_dirent *de) de->disk_number = 0; de->int_attrib = 0; de->ext_attrib = 0; - de->offset = 0; - free(de->extrafield); - de->extrafield = NULL; - de->extrafield_len = 0; - free(de->comment); + _zip_ef_free(de->extra_fields); + de->extra_fields = NULL; + _zip_string_free(de->comment); de->comment = NULL; - de->comment_len = 0; } -/* _zip_dirent_write(zde, fp, localp, error): +/* _zip_dirent_write(zde, fp, flags, error): Writes zip directory entry zde to file fp. - If localp != 0, it writes a local header instead of a central - directory entry. + If flags & ZIP_EF_LOCAL, it writes a local header instead of a central + directory entry. If flags & ZIP_EF_FORCE_ZIP64, a ZIP64 extra field is written, even if not needed. - Returns 0 if successful. On error, error is filled in and -1 is + Returns 0 if successful, 1 if successful and wrote ZIP64 extra field. On error, error is filled in and -1 is returned. */ int -_zip_dirent_write(struct zip_dirent *zde, FILE *fp, int localp, - struct zip_error *error) +_zip_dirent_write(struct zip_dirent *de, FILE *fp, zip_flags_t flags, struct zip_error *error) { unsigned short dostime, dosdate; + enum zip_encoding_type com_enc, name_enc; + struct zip_extra_field *ef; + zip_uint8_t ef_zip64[24], *ef_zip64_p; + int is_zip64; + int is_really_zip64; + + ef = NULL; - fwrite(localp ? LOCAL_MAGIC : CENTRAL_MAGIC, 1, 4, fp); + is_zip64 = 0; - if (!localp) - _zip_write2(zde->version_madeby, fp); - _zip_write2(zde->version_needed, fp); - _zip_write2(zde->bitflags, fp); - _zip_write2(zde->comp_method, fp); + fwrite((flags & ZIP_FL_LOCAL) ? LOCAL_MAGIC : CENTRAL_MAGIC, 1, 4, fp); - _zip_u2d_time(zde->last_mod, &dostime, &dosdate); + name_enc = _zip_guess_encoding(de->filename, ZIP_ENCODING_UNKNOWN); + com_enc = _zip_guess_encoding(de->comment, ZIP_ENCODING_UNKNOWN); + + if ((name_enc == ZIP_ENCODING_UTF8_KNOWN && com_enc == ZIP_ENCODING_ASCII) || + (name_enc == ZIP_ENCODING_ASCII && com_enc == ZIP_ENCODING_UTF8_KNOWN) || + (name_enc == ZIP_ENCODING_UTF8_KNOWN && com_enc == ZIP_ENCODING_UTF8_KNOWN)) + de->bitflags |= ZIP_GPBF_ENCODING_UTF_8; + else { + de->bitflags &= ~ZIP_GPBF_ENCODING_UTF_8; + if (name_enc == ZIP_ENCODING_UTF8_KNOWN) { + ef = _zip_ef_utf8(ZIP_EF_UTF_8_NAME, de->filename, error); + if (ef == NULL) + return -1; + } + if ((flags & ZIP_FL_LOCAL) == 0 && com_enc == ZIP_ENCODING_UTF8_KNOWN){ + struct zip_extra_field *ef2 = _zip_ef_utf8(ZIP_EF_UTF_8_COMMENT, de->comment, error); + if (ef2 == NULL) { + _zip_ef_free(ef); + return -1; + } + ef2->next = ef; + ef = ef2; + } + } + + ef_zip64_p = ef_zip64; + if (flags & ZIP_FL_LOCAL) { + if ((flags & ZIP_FL_FORCE_ZIP64) || de->comp_size > ZIP_UINT32_MAX || de->uncomp_size > ZIP_UINT32_MAX) { + _zip_poke8(de->comp_size, &ef_zip64_p); + _zip_poke8(de->uncomp_size, &ef_zip64_p); + } + } + else { + if ((flags & ZIP_FL_FORCE_ZIP64) || de->comp_size > ZIP_UINT32_MAX || de->uncomp_size > ZIP_UINT32_MAX || de->offset > ZIP_UINT32_MAX) { + if (de->comp_size >= ZIP_UINT32_MAX) + _zip_poke8(de->comp_size, &ef_zip64_p); + if (de->uncomp_size >= ZIP_UINT32_MAX) + _zip_poke8(de->uncomp_size, &ef_zip64_p); + if (de->offset >= ZIP_UINT32_MAX) + _zip_poke8(de->offset, &ef_zip64_p); + } + } + + if (ef_zip64_p != ef_zip64) { + struct zip_extra_field *ef64 = _zip_ef_new(ZIP_EF_ZIP64, (zip_uint16_t)(ef_zip64_p-ef_zip64), ef_zip64, ZIP_EF_BOTH); + ef64->next = ef; + ef = ef64; + is_zip64 = 1; + } + + if ((flags & (ZIP_FL_LOCAL|ZIP_FL_FORCE_ZIP64)) == (ZIP_FL_LOCAL|ZIP_FL_FORCE_ZIP64)) + is_really_zip64 = _zip_dirent_needs_zip64(de, flags); + else + is_really_zip64 = is_zip64; + + if ((flags & ZIP_FL_LOCAL) == 0) + _zip_write2(is_really_zip64 ? 45 : de->version_madeby, fp); + _zip_write2(is_really_zip64 ? 45 : de->version_needed, fp); + _zip_write2(de->bitflags&0xfff9, fp); /* clear compression method specific flags */ + _zip_write2((zip_uint16_t)de->comp_method, fp); /* XXX: can it be ZIP_CM_DEFAULT? */ + + _zip_u2d_time(de->last_mod, &dostime, &dosdate); _zip_write2(dostime, fp); _zip_write2(dosdate, fp); + + _zip_write4(de->crc, fp); + if (de->comp_size < ZIP_UINT32_MAX) + _zip_write4((zip_uint32_t)de->comp_size, fp); + else + _zip_write4(ZIP_UINT32_MAX, fp); + if (de->uncomp_size < ZIP_UINT32_MAX) + _zip_write4((zip_uint32_t)de->uncomp_size, fp); + else + _zip_write4(ZIP_UINT32_MAX, fp); + + _zip_write2(_zip_string_length(de->filename), fp); + _zip_write2(_zip_ef_size(de->extra_fields, flags) + _zip_ef_size(ef, ZIP_EF_BOTH), fp); - _zip_write4(zde->crc, fp); - _zip_write4(zde->comp_size, fp); - _zip_write4(zde->uncomp_size, fp); - - _zip_write2(zde->filename_len, fp); - _zip_write2(zde->extrafield_len, fp); - - if (!localp) { - _zip_write2(zde->comment_len, fp); - _zip_write2(zde->disk_number, fp); - _zip_write2(zde->int_attrib, fp); - _zip_write4(zde->ext_attrib, fp); - _zip_write4(zde->offset, fp); + if ((flags & ZIP_FL_LOCAL) == 0) { + _zip_write2(_zip_string_length(de->comment), fp); + _zip_write2((zip_uint16_t)de->disk_number, fp); + _zip_write2(de->int_attrib, fp); + _zip_write4(de->ext_attrib, fp); + if (de->offset < ZIP_UINT32_MAX) + _zip_write4((zip_uint32_t)de->offset, fp); + else + _zip_write4(ZIP_UINT32_MAX, fp); } - if (zde->filename_len) - fwrite(zde->filename, 1, zde->filename_len, fp); + if (de->filename) + _zip_string_write(de->filename, fp); - if (zde->extrafield_len) - fwrite(zde->extrafield, 1, zde->extrafield_len, fp); + if (ef) + _zip_ef_write(ef, ZIP_EF_BOTH, fp); + if (de->extra_fields) + _zip_ef_write(de->extra_fields, flags, fp); - if (!localp) { - if (zde->comment_len) - fwrite(zde->comment, 1, zde->comment_len, fp); + if ((flags & ZIP_FL_LOCAL) == 0) { + if (de->comment) + _zip_string_write(de->comment, fp); } + _zip_ef_free(ef); + if (ferror(fp)) { _zip_error_set(error, ZIP_ER_WRITE, errno); return -1; } - return 0; + return is_zip64; } static time_t -_zip_d2u_time(int dtime, int ddate) +_zip_d2u_time(zip_uint16_t dtime, zip_uint16_t ddate) { struct tm tm; @@ -498,12 +785,72 @@ _zip_d2u_time(int dtime, int ddate) -unsigned short -_zip_read2(unsigned char **a) +static struct zip_extra_field * +_zip_ef_utf8(zip_uint16_t id, struct zip_string *str, struct zip_error *error) { - unsigned short ret; + const zip_uint8_t *raw; + zip_uint8_t *data, *p; + zip_uint32_t len; + struct zip_extra_field *ef; + + raw = _zip_string_get(str, &len, ZIP_FL_ENC_RAW, NULL); + + if (len+5 > ZIP_UINT16_MAX) { + /* XXX: error */ + } + + if ((data=(zip_uint8_t *)malloc(len+5)) == NULL) { + _zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + p = data; + *(p++) = 1; + _zip_poke4(_zip_string_crc32(str), &p); + memcpy(p, raw, len); + p += len; + + ef = _zip_ef_new(id, (zip_uint16_t)(p-data), data, ZIP_EF_BOTH); + free(data); + return ef; +} + + + +struct zip_dirent * +_zip_get_dirent(struct zip *za, zip_uint64_t idx, zip_flags_t flags, struct zip_error *error) +{ + if (error == NULL) + error = &za->error; + + if (idx >= za->nentry) { + _zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((flags & ZIP_FL_UNCHANGED) || za->entry[idx].changes == NULL) { + if (za->entry[idx].orig == NULL) { + _zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + if (za->entry[idx].deleted && (flags & ZIP_FL_UNCHANGED) == 0) { + _zip_error_set(error, ZIP_ER_DELETED, 0); + return NULL; + } + return za->entry[idx].orig; + } + else + return za->entry[idx].changes; +} + + - ret = (*a)[0]+((*a)[1]<<8); +zip_uint16_t +_zip_read2(const zip_uint8_t **a) +{ + zip_uint16_t ret; + + ret = (zip_uint16_t)((*a)[0]+((*a)[1]<<8)); *a += 2; return ret; @@ -511,12 +858,12 @@ _zip_read2(unsigned char **a) -unsigned int -_zip_read4(unsigned char **a) +zip_uint32_t +_zip_read4(const zip_uint8_t **a) { - unsigned int ret; + zip_uint32_t ret; - ret = ((((((*a)[3]<<8)+(*a)[2])<<8)+(*a)[1])<<8)+(*a)[0]; + ret = ((((((zip_uint32_t)(*a)[3]<<8)+(*a)[2])<<8)+(*a)[1])<<8)+(*a)[0]; *a += 4; return ret; @@ -524,65 +871,108 @@ _zip_read4(unsigned char **a) -static char * -_zip_readfpstr(FILE *fp, unsigned int len, int nulp, struct zip_error *error) +zip_uint64_t +_zip_read8(const zip_uint8_t **a) { - char *r, *o; + zip_uint64_t x, y; + + x = ((((((zip_uint64_t)(*a)[3]<<8)+(*a)[2])<<8)+(*a)[1])<<8)+(*a)[0]; + *a += 4; + y = ((((((zip_uint64_t)(*a)[3]<<8)+(*a)[2])<<8)+(*a)[1])<<8)+(*a)[0]; + *a += 4; + + return x+(y<<32); +} - r = (char *)malloc(nulp ? len+1 : len); + + +zip_uint8_t * +_zip_read_data(const zip_uint8_t **buf, FILE *fp, size_t len, int nulp, struct zip_error *error) +{ + zip_uint8_t *r; + + if (len == 0 && nulp == 0) + return NULL; + + r = (zip_uint8_t *)malloc(nulp ? len+1 : len); if (!r) { _zip_error_set(error, ZIP_ER_MEMORY, 0); return NULL; } - if (fread(r, 1, len, fp)>8)&0xff; + *((*p)++) = (i>>16)&0xff; + *((*p)++) = (i>>24)&0xff; +} + + + +void +_zip_poke8(zip_uint64_t i, zip_uint8_t **p) +{ + *((*p)++) = i&0xff; + *((*p)++) = (i>>8)&0xff; + *((*p)++) = (i>>16)&0xff; + *((*p)++) = (i>>24)&0xff; + *((*p)++) = (i>>32)&0xff; + *((*p)++) = (i>>40)&0xff; + *((*p)++) = (i>>48)&0xff; + *((*p)++) = (i>>56)&0xff; } -static void -_zip_write2(unsigned short i, FILE *fp) +void +_zip_write2(zip_uint16_t i, FILE *fp) { putc(i&0xff, fp); putc((i>>8)&0xff, fp); @@ -592,13 +982,30 @@ _zip_write2(unsigned short i, FILE *fp) -static void -_zip_write4(unsigned int i, FILE *fp) +void +_zip_write4(zip_uint32_t i, FILE *fp) +{ + putc(i&0xff, fp); + putc((i>>8)&0xff, fp); + putc((i>>16)&0xff, fp); + putc((i>>24)&0xff, fp); + + return; +} + + + +void +_zip_write8(zip_uint64_t i, FILE *fp) { putc(i&0xff, fp); putc((i>>8)&0xff, fp); putc((i>>16)&0xff, fp); putc((i>>24)&0xff, fp); + putc((i>>32)&0xff, fp); + putc((i>>40)&0xff, fp); + putc((i>>48)&0xff, fp); + putc((i>>56)&0xff, fp); return; } @@ -606,15 +1013,13 @@ _zip_write4(unsigned int i, FILE *fp) void -_zip_u2d_time(time_t time, unsigned short *dtime, unsigned short *ddate) +_zip_u2d_time(time_t time, zip_uint16_t *dtime, zip_uint16_t *ddate) { struct tm *tm; tm = localtime(&time); - *ddate = ((tm->tm_year+1900-1980)<<9) + ((tm->tm_mon+1)<<5) - + tm->tm_mday; - *dtime = ((tm->tm_hour)<<11) + ((tm->tm_min)<<5) - + ((tm->tm_sec)>>1); + *ddate = (zip_uint16_t)(((tm->tm_year+1900-1980)<<9) + ((tm->tm_mon+1)<<5) + tm->tm_mday); + *dtime = (zip_uint16_t)(((tm->tm_hour)<<11) + ((tm->tm_min)<<5) + ((tm->tm_sec)>>1)); return; } diff --git a/ext/zip/lib/zip_free.c b/ext/zip/lib/zip_discard.c similarity index 86% rename from ext/zip/lib/zip_free.c rename to ext/zip/lib/zip_discard.c index 9932c14fec9a2..37ba8c2ea64de 100644 --- a/ext/zip/lib/zip_free.c +++ b/ext/zip/lib/zip_discard.c @@ -1,6 +1,6 @@ /* - zip_free.c -- free struct zip - Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner + zip_discard.c -- discard and free struct zip + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -39,14 +39,14 @@ -/* _zip_free: +/* zip_discard: frees the space allocated to a zipfile struct, and closes the corresponding file. */ void -_zip_free(struct zip *za) +zip_discard(struct zip *za) { - int i; + zip_uint64_t i; if (za == NULL) return; @@ -58,13 +58,12 @@ _zip_free(struct zip *za) fclose(za->zp); free(za->default_password); - _zip_cdir_free(za->cdir); - free(za->ch_comment); + _zip_string_free(za->comment_orig); + _zip_string_free(za->comment_changes); if (za->entry) { - for (i=0; inentry; i++) { - _zip_entry_free(za->entry+i); - } + for (i=0; inentry; i++) + _zip_entry_finalize(za->entry+i); free(za->entry); } diff --git a/ext/zip/lib/zip_entry_free.c b/ext/zip/lib/zip_entry.c similarity index 79% rename from ext/zip/lib/zip_entry_free.c rename to ext/zip/lib/zip_entry.c index e8a77707f0bfa..58663e8d0c88e 100644 --- a/ext/zip/lib/zip_entry_free.c +++ b/ext/zip/lib/zip_entry.c @@ -1,6 +1,6 @@ /* - zip_entry_free.c -- free struct zip_entry - Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner + zip_entry.c -- struct zip_entry helper functions + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -33,23 +33,23 @@ -#include - #include "zipint.h" +void +_zip_entry_finalize(struct zip_entry *e) +{ + _zip_unchange_data(e); + _zip_dirent_free(e->orig); + _zip_dirent_free(e->changes); +} + void -_zip_entry_free(struct zip_entry *ze) +_zip_entry_init(struct zip_entry *e) { - free(ze->ch_filename); - ze->ch_filename = NULL; - free(ze->ch_extra); - ze->ch_extra = NULL; - ze->ch_extra_len = -1; - free(ze->ch_comment); - ze->ch_comment = NULL; - ze->ch_comment_len = -1; - - _zip_unchange_data(ze); + e->orig = NULL; + e->changes = NULL; + e->source = NULL; + e->deleted = 0; } diff --git a/ext/zip/lib/zip_error.c b/ext/zip/lib/zip_error.c index b8d907abf4d9a..4b1f27921a256 100644 --- a/ext/zip/lib/zip_error.c +++ b/ext/zip/lib/zip_error.c @@ -1,6 +1,6 @@ /* zip_error.c -- struct zip_error helper functions - Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2013 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -42,6 +42,9 @@ void _zip_error_clear(struct zip_error *err) { + if (err == NULL) + return; + err->zip_err = ZIP_ER_OK; err->sys_err = 0; } @@ -49,7 +52,7 @@ _zip_error_clear(struct zip_error *err) void -_zip_error_copy(struct zip_error *dst, struct zip_error *src) +_zip_error_copy(struct zip_error *dst, const struct zip_error *src) { dst->zip_err = src->zip_err; dst->sys_err = src->sys_err; @@ -67,7 +70,7 @@ _zip_error_fini(struct zip_error *err) void -_zip_error_get(struct zip_error *err, int *zep, int *sep) +_zip_error_get(const struct zip_error *err, int *zep, int *sep) { if (zep) *zep = err->zip_err; diff --git a/ext/zip/lib/zip_error_clear.c b/ext/zip/lib/zip_error_clear.c index 34e7dea48ebba..b4ff10391290a 100644 --- a/ext/zip/lib/zip_error_clear.c +++ b/ext/zip/lib/zip_error_clear.c @@ -37,8 +37,11 @@ -ZIP_EXTERN(void) +ZIP_EXTERN void zip_error_clear(struct zip *za) { + if (za == NULL) + return; + _zip_error_clear(&za->error); } diff --git a/ext/zip/lib/zip_error_get.c b/ext/zip/lib/zip_error_get.c index c15705e32fccd..6d1c958c17766 100644 --- a/ext/zip/lib/zip_error_get.c +++ b/ext/zip/lib/zip_error_get.c @@ -37,7 +37,7 @@ -ZIP_EXTERN(void) +ZIP_EXTERN void zip_error_get(struct zip *za, int *zep, int *sep) { _zip_error_get(&za->error, zep, sep); diff --git a/ext/zip/lib/zip_error_get_sys_type.c b/ext/zip/lib/zip_error_get_sys_type.c index 47aa93e69b927..6c6f38074040e 100644 --- a/ext/zip/lib/zip_error_get_sys_type.c +++ b/ext/zip/lib/zip_error_get_sys_type.c @@ -37,7 +37,7 @@ -ZIP_EXTERN(int) +ZIP_EXTERN int zip_error_get_sys_type(int ze) { if (ze < 0 || ze >= _zip_nerr_str) diff --git a/ext/zip/lib/zip_error_to_str.c b/ext/zip/lib/zip_error_to_str.c index bafe74335a049..11a0cd2bb0e6d 100644 --- a/ext/zip/lib/zip_error_to_str.c +++ b/ext/zip/lib/zip_error_to_str.c @@ -42,7 +42,7 @@ -ZIP_EXTERN(int) +ZIP_EXTERN int zip_error_to_str(char *buf, zip_uint64_t len, int ze, int se) { const char *zs, *ss; diff --git a/ext/zip/lib/zip_extra_field.c b/ext/zip/lib/zip_extra_field.c new file mode 100644 index 0000000000000..41fd2b1d901af --- /dev/null +++ b/ext/zip/lib/zip_extra_field.c @@ -0,0 +1,386 @@ +/* + zip_extra_field.c -- manipulate extra fields + Copyright (C) 2012-2013 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + + +#include "zipint.h" + +#include +#include +#include + + + +struct zip_extra_field * +_zip_ef_clone(const struct zip_extra_field *ef, struct zip_error *error) +{ + struct zip_extra_field *head, *prev, *def; + + head = prev = NULL; + + while (ef) { + if ((def=_zip_ef_new(ef->id, ef->size, ef->data, ef->flags)) == NULL) { + _zip_error_set(error, ZIP_ER_MEMORY, 0); + _zip_ef_free(head); + return NULL; + } + + if (head == NULL) + head = def; + if (prev) + prev->next = def; + prev = def; + + ef = ef->next; + } + + return head; +} + + +struct zip_extra_field * +_zip_ef_delete_by_id(struct zip_extra_field *ef, zip_uint16_t id, zip_uint16_t id_idx, zip_flags_t flags) +{ + struct zip_extra_field *head, *prev; + int i; + + i = 0; + head = ef; + prev = NULL; + for (; ef; ef=(prev ? prev->next : head)) { + if ((ef->flags & flags & ZIP_EF_BOTH) && ef->id == id) { + if (id_idx == ZIP_EXTRA_FIELD_ALL || i == id_idx) { + ef->flags &= ~(flags & ZIP_EF_BOTH); + if ((ef->flags & ZIP_EF_BOTH) == 0) { + if (prev) + prev->next = ef->next; + else + head = ef->next; + ef->next = NULL; + _zip_ef_free(ef); + + if (id_idx == ZIP_EXTRA_FIELD_ALL) + continue; + } + } + + i++; + if (i > id_idx) + break; + } + prev = ef; + } + + return head; +} + + + + +void +_zip_ef_free(struct zip_extra_field *ef) +{ + struct zip_extra_field *ef2; + + while (ef) { + ef2 = ef->next; + free(ef->data); + free(ef); + ef = ef2; + } +} + + + +const zip_uint8_t * +_zip_ef_get_by_id(const struct zip_extra_field *ef, zip_uint16_t *lenp, zip_uint16_t id, zip_uint16_t id_idx, zip_flags_t flags, struct zip_error *error) +{ + static const zip_uint8_t empty[1] = { '\0' }; + + int i; + + i = 0; + for (; ef; ef=ef->next) { + if (ef->id == id && (ef->flags & flags & ZIP_EF_BOTH)) { + if (i < id_idx) { + i++; + continue; + } + + if (lenp) + *lenp = ef->size; + if (ef->size > 0) + return ef->data; + else + return empty; + } + } + + _zip_error_set(error, ZIP_ER_NOENT, 0); + return NULL; +} + + + +struct zip_extra_field * +_zip_ef_merge(struct zip_extra_field *to, struct zip_extra_field *from) +{ + struct zip_extra_field *ef2, *tt, *tail; + int duplicate; + + if (to == NULL) + return from; + + for (tail=to; tail->next; tail=tail->next) + ; + + for (; from; from=ef2) { + ef2 = from->next; + + duplicate = 0; + for (tt=to; tt; tt=tt->next) { + if (tt->id == from->id && tt->size == from->size && memcmp(tt->data, from->data, tt->size) == 0) { + tt->flags |= (from->flags & ZIP_EF_BOTH); + duplicate = 1; + break; + } + } + + from->next = NULL; + if (duplicate) + _zip_ef_free(from); + else + tail = tail->next = from; + } + + return to; +} + + + +struct zip_extra_field * +_zip_ef_new(zip_uint16_t id, zip_uint16_t size, const zip_uint8_t *data, zip_flags_t flags) +{ + struct zip_extra_field *ef; + + if ((ef=(struct zip_extra_field *)malloc(sizeof(*ef))) == NULL) + return NULL; + + ef->next = NULL; + ef->flags = flags; + ef->id = id; + ef->size = size; + if (size > 0) { + if ((ef->data=(zip_uint8_t *)_zip_memdup(data, size, NULL)) == NULL) { + free(ef); + return NULL; + } + } + else + ef->data = NULL; + + return ef; +} + + + +struct zip_extra_field * +_zip_ef_parse(const zip_uint8_t *data, zip_uint16_t len, zip_flags_t flags, struct zip_error *error) +{ + struct zip_extra_field *ef, *ef2, *ef_head; + const zip_uint8_t *p; + zip_uint16_t fid, flen; + + ef_head = NULL; + for (p=data; p data+len) { + _zip_error_set(error, ZIP_ER_INCONS, 0); + _zip_ef_free(ef_head); + return NULL; + } + + fid = _zip_read2(&p); + flen = _zip_read2(&p); + + if (p+flen > data+len) { + _zip_error_set(error, ZIP_ER_INCONS, 0); + _zip_ef_free(ef_head); + return NULL; + } + + if ((ef2=_zip_ef_new(fid, flen, p, flags)) == NULL) { + _zip_error_set(error, ZIP_ER_MEMORY, 0); + _zip_ef_free(ef_head); + return NULL; + } + + if (ef_head) { + ef->next = ef2; + ef = ef2; + } + else + ef_head = ef = ef2; + } + + return ef_head; +} + + + +struct zip_extra_field * +_zip_ef_remove_internal(struct zip_extra_field *ef) +{ + struct zip_extra_field *ef_head; + struct zip_extra_field *prev, *next; + + ef_head = ef; + prev = NULL; + + while (ef) { + if (ZIP_EF_IS_INTERNAL(ef->id)) { + next = ef->next; + if (ef_head == ef) + ef_head = next; + ef->next = NULL; + _zip_ef_free(ef); + if (prev) + prev->next = next; + ef = next; + } + else { + prev = ef; + ef = ef->next; + } + } + + return ef_head; +} + + +zip_uint16_t +_zip_ef_size(const struct zip_extra_field *ef, zip_flags_t flags) +{ + zip_uint16_t size; + + size = 0; + for (; ef; ef=ef->next) { + if (ef->flags & flags & ZIP_EF_BOTH) + size += 4+ef->size; + } + + return size; +} + + + +void +_zip_ef_write(const struct zip_extra_field *ef, zip_flags_t flags, FILE *f) +{ + for (; ef; ef=ef->next) { + if (ef->flags & flags & ZIP_EF_BOTH) { + _zip_write2(ef->id, f); + _zip_write2(ef->size, f); + if (ef->size > 0) + fwrite(ef->data, ef->size, 1, f); + } + } +} + + + +int +_zip_read_local_ef(struct zip *za, zip_uint64_t idx) +{ + struct zip_entry *e; + unsigned char b[4]; + const unsigned char *p; + zip_uint16_t fname_len, ef_len; + + if (idx >= za->nentry) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + e = za->entry+idx; + + if (e->orig == NULL || e->orig->local_extra_fields_read) + return 0; + + + if (fseeko(za->zp, (off_t)(e->orig->offset + 26), SEEK_SET) < 0) { + _zip_error_set(&za->error, ZIP_ER_SEEK, errno); + return -1; + } + + if (fread(b, sizeof(b), 1, za->zp) != 1) { + _zip_error_set(&za->error, ZIP_ER_READ, errno); + return -1; + } + + p = b; + fname_len = _zip_read2(&p); + ef_len = _zip_read2(&p); + + if (ef_len > 0) { + struct zip_extra_field *ef; + zip_uint8_t *ef_raw; + + if (fseek(za->zp, fname_len, SEEK_CUR) < 0) { + _zip_error_set(&za->error, ZIP_ER_SEEK, errno); + return -1; + } + + ef_raw = _zip_read_data(NULL, za->zp, ef_len, 0, &za->error); + + if (ef_raw == NULL) + return -1; + + if ((ef=_zip_ef_parse(ef_raw, ef_len, ZIP_EF_LOCAL, &za->error)) == NULL) { + free(ef_raw); + return -1; + } + free(ef_raw); + + ef = _zip_ef_remove_internal(ef); + e->orig->extra_fields = _zip_ef_merge(e->orig->extra_fields, ef); + } + + e->orig->local_extra_fields_read = 1; + + if (e->changes && e->changes->local_extra_fields_read == 0) { + e->changes->extra_fields = e->orig->extra_fields; + e->changes->local_extra_fields_read = 1; + } + + return 0; +} diff --git a/ext/zip/lib/zip_extra_field_api.c b/ext/zip/lib/zip_extra_field_api.c new file mode 100644 index 0000000000000..02ed4555e0c0d --- /dev/null +++ b/ext/zip/lib/zip_extra_field_api.c @@ -0,0 +1,364 @@ +/* + zip_extra_field_api.c -- public extra fields API functions + Copyright (C) 2012-2013 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + + +#include "zipint.h" + + + +ZIP_EXTERN int +zip_file_extra_field_delete(struct zip *za, zip_uint64_t idx, zip_uint16_t ef_idx, zip_flags_t flags) +{ + struct zip_dirent *de; + + if ((flags & ZIP_EF_BOTH) == 0) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (_zip_get_dirent(za, idx, 0, NULL) == NULL) + return -1; + + if (ZIP_IS_RDONLY(za)) { + _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + if (_zip_file_extra_field_prepare_for_change(za, idx) < 0) + return -1; + + de = za->entry[idx].changes; + + de->extra_fields = _zip_ef_delete_by_id(de->extra_fields, ZIP_EXTRA_FIELD_ALL, ef_idx, flags); + return 0; +} + + + +ZIP_EXTERN int +zip_file_extra_field_delete_by_id(struct zip *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_uint16_t ef_idx, zip_flags_t flags) +{ + struct zip_dirent *de; + + if ((flags & ZIP_EF_BOTH) == 0) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (_zip_get_dirent(za, idx, 0, NULL) == NULL) + return -1; + + if (ZIP_IS_RDONLY(za)) { + _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + if (_zip_file_extra_field_prepare_for_change(za, idx) < 0) + return -1; + + de = za->entry[idx].changes; + + de->extra_fields = _zip_ef_delete_by_id(de->extra_fields, ef_id, ef_idx, flags); + return 0; +} + + + +ZIP_EXTERN const zip_uint8_t * +zip_file_extra_field_get(struct zip *za, zip_uint64_t idx, zip_uint16_t ef_idx, zip_uint16_t *idp, zip_uint16_t *lenp, zip_flags_t flags) +{ + static const zip_uint8_t empty[1] = { '\0' }; + + struct zip_dirent *de; + struct zip_extra_field *ef; + int i; + + if ((flags & ZIP_EF_BOTH) == 0) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((de=_zip_get_dirent(za, idx, flags, &za->error)) == NULL) + return NULL; + + if (flags & ZIP_FL_LOCAL) + if (_zip_read_local_ef(za, idx) < 0) + return NULL; + + i = 0; + for (ef=de->extra_fields; ef; ef=ef->next) { + if (ef->flags & flags & ZIP_EF_BOTH) { + if (i < ef_idx) { + i++; + continue; + } + + if (idp) + *idp = ef->id; + if (lenp) + *lenp = ef->size; + if (ef->size > 0) + return ef->data; + else + return empty; + } + } + + _zip_error_set(&za->error, ZIP_ER_NOENT, 0); + return NULL; + +} + + + +ZIP_EXTERN const zip_uint8_t * +zip_file_extra_field_get_by_id(struct zip *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_uint16_t ef_idx, zip_uint16_t *lenp, zip_flags_t flags) +{ + struct zip_dirent *de; + + if ((flags & ZIP_EF_BOTH) == 0) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((de=_zip_get_dirent(za, idx, flags, &za->error)) == NULL) + return NULL; + + if (flags & ZIP_FL_LOCAL) + if (_zip_read_local_ef(za, idx) < 0) + return NULL; + + return _zip_ef_get_by_id(de->extra_fields, lenp, ef_id, ef_idx, flags, &za->error); +} + + + +ZIP_EXTERN zip_int16_t +zip_file_extra_fields_count(struct zip *za, zip_uint64_t idx, zip_flags_t flags) +{ + struct zip_dirent *de; + struct zip_extra_field *ef; + zip_uint16_t n; + + if ((flags & ZIP_EF_BOTH) == 0) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if ((de=_zip_get_dirent(za, idx, flags, &za->error)) == NULL) + return -1; + + if (flags & ZIP_FL_LOCAL) + if (_zip_read_local_ef(za, idx) < 0) + return -1; + + n = 0; + for (ef=de->extra_fields; ef; ef=ef->next) + if (ef->flags & flags & ZIP_EF_BOTH) + n++; + + return (zip_int16_t)n; +} + + + +ZIP_EXTERN zip_int16_t +zip_file_extra_fields_count_by_id(struct zip *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_flags_t flags) +{ + struct zip_dirent *de; + struct zip_extra_field *ef; + zip_uint16_t n; + + if ((flags & ZIP_EF_BOTH) == 0) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if ((de=_zip_get_dirent(za, idx, flags, &za->error)) == NULL) + return -1; + + if (flags & ZIP_FL_LOCAL) + if (_zip_read_local_ef(za, idx) < 0) + return -1; + + n = 0; + for (ef=de->extra_fields; ef; ef=ef->next) + if (ef->id == ef_id && (ef->flags & flags & ZIP_EF_BOTH)) + n++; + + return (zip_int16_t)n; +} + + + +ZIP_EXTERN int +zip_file_extra_field_set(struct zip *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_uint16_t ef_idx, const zip_uint8_t *data, zip_uint16_t len, zip_flags_t flags) +{ + struct zip_dirent *de; + zip_uint16_t ls, cs; + struct zip_extra_field *ef, *ef_prev, *ef_new; + int i, found, new_len; + + if ((flags & ZIP_EF_BOTH) == 0) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (_zip_get_dirent(za, idx, 0, NULL) == NULL) + return -1; + + if (ZIP_IS_RDONLY(za)) { + _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + if (ZIP_EF_IS_INTERNAL(ef_id)) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (_zip_file_extra_field_prepare_for_change(za, idx) < 0) + return -1; + + de = za->entry[idx].changes; + + ef = de->extra_fields; + ef_prev = NULL; + i = 0; + found = 0; + + for (; ef; ef=ef->next) { + if (ef->id == ef_id && (ef->flags & flags & ZIP_EF_BOTH)) { + if (i == ef_idx) { + found = 1; + break; + } + i++; + } + ef_prev = ef; + } + + if (i < ef_idx && ef_idx != ZIP_EXTRA_FIELD_NEW) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (flags & ZIP_EF_LOCAL) + ls = _zip_ef_size(de->extra_fields, ZIP_EF_LOCAL); + else + ls = 0; + if (flags & ZIP_EF_CENTRAL) + cs = _zip_ef_size(de->extra_fields, ZIP_EF_CENTRAL); + else + cs = 0; + + new_len = ls > cs ? ls : cs; + if (found) + new_len -= ef->size + 4; + new_len += len + 4; + + if (new_len > ZIP_UINT16_MAX) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if ((ef_new=_zip_ef_new(ef_id, len, data, flags)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + + if (found) { + if ((ef->flags & ZIP_EF_BOTH) == (flags & ZIP_EF_BOTH)) { + ef_new->next = ef->next; + ef->next = NULL; + _zip_ef_free(ef); + if (ef_prev) + ef_prev->next = ef_new; + else + de->extra_fields = ef_new; + } + else { + ef->flags &= ~(flags & ZIP_EF_BOTH); + ef_new->next = ef->next; + ef->next = ef_new; + } + } + else if (ef_prev) { + ef_new->next = ef_prev->next; + ef_prev->next = ef_new; + } + else + de->extra_fields = ef_new; + + return 0; +} + + + +int +_zip_file_extra_field_prepare_for_change(struct zip *za, zip_uint64_t idx) +{ + struct zip_entry *e; + + if (idx >= za->nentry) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + e = za->entry+idx; + + if (e->changes && (e->changes->changed & ZIP_DIRENT_EXTRA_FIELD)) + return 0; + + if (e->orig) { + if (_zip_read_local_ef(za, idx) < 0) + return -1; + } + + if (e->changes == NULL) { + if ((e->changes=_zip_dirent_clone(e->orig)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + } + + if (e->orig && e->orig->extra_fields) { + if ((e->changes->extra_fields=_zip_ef_clone(e->orig->extra_fields, &za->error)) == NULL) + return -1; + } + e->changes->changed |= ZIP_DIRENT_EXTRA_FIELD; + + return 0; +} + diff --git a/ext/zip/lib/zip_fclose.c b/ext/zip/lib/zip_fclose.c index eb55ddbcea455..093c30eada9f1 100644 --- a/ext/zip/lib/zip_fclose.c +++ b/ext/zip/lib/zip_fclose.c @@ -39,20 +39,23 @@ -ZIP_EXTERN(int) +ZIP_EXTERN int zip_fclose(struct zip_file *zf) { - int i, ret; + int ret; + unsigned int i; if (zf->src) zip_source_free(zf->src); - for (i=0; iza->nfile; i++) { - if (zf->za->file[i] == zf) { - zf->za->file[i] = zf->za->file[zf->za->nfile-1]; - zf->za->nfile--; - break; - } + if (zf->za) { + for (i=0; iza->nfile; i++) { + if (zf->za->file[i] == zf) { + zf->za->file[i] = zf->za->file[zf->za->nfile-1]; + zf->za->nfile--; + break; + } + } } ret = 0; diff --git a/ext/zip/lib/zip_fdopen.c b/ext/zip/lib/zip_fdopen.c index df70f27561ace..bda9aabac4915 100644 --- a/ext/zip/lib/zip_fdopen.c +++ b/ext/zip/lib/zip_fdopen.c @@ -37,11 +37,24 @@ -ZIP_EXTERN(struct zip *) -zip_fdopen(int fd_orig, int flags, int *zep) +ZIP_EXTERN struct zip * +zip_fdopen(int fd_orig, int _flags, int *zep) { int fd; FILE *fp; + unsigned int flags; + + if (_flags < 0) { + if (zep) + *zep = ZIP_ER_INVAL; + return NULL; + } + flags = (unsigned int)_flags; + + if (flags & ZIP_TRUNCATE) { + *zep = ZIP_ER_INVAL; + return NULL; + } /* We dup() here to avoid messing with the passed in fd. We could not restore it to the original state in case of error. */ @@ -58,5 +71,5 @@ zip_fdopen(int fd_orig, int flags, int *zep) } close(fd_orig); - return _zip_open(NULL, fp, flags, ZIP_AFL_RDONLY, zep); + return _zip_open(NULL, fp, flags, zep); } diff --git a/ext/zip/lib/zip_file_add.c b/ext/zip/lib/zip_file_add.c new file mode 100644 index 0000000000000..995cb91c1a287 --- /dev/null +++ b/ext/zip/lib/zip_file_add.c @@ -0,0 +1,55 @@ +/* + zip_file_add.c -- add file via callback function + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + + +#include "zipint.h" + + +/* + NOTE: Return type is signed so we can return -1 on error. + The index can not be larger than ZIP_INT64_MAX since the size + of the central directory cannot be larger than + ZIP_UINT64_MAX, and each entry is larger than 2 bytes. +*/ + +ZIP_EXTERN zip_int64_t +zip_file_add(struct zip *za, const char *name, struct zip_source *source, zip_flags_t flags) +{ + if (name == NULL || source == NULL) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + return _zip_file_replace(za, ZIP_UINT64_MAX, name, source, flags); +} diff --git a/ext/zip/lib/zip_file_error_clear.c b/ext/zip/lib/zip_file_error_clear.c index 6c9c2a02b3f0f..ce8b6cbd9403a 100644 --- a/ext/zip/lib/zip_file_error_clear.c +++ b/ext/zip/lib/zip_file_error_clear.c @@ -37,8 +37,11 @@ -ZIP_EXTERN(void) +ZIP_EXTERN void zip_file_error_clear(struct zip_file *zf) { + if (zf == NULL) + return; + _zip_error_clear(&zf->error); } diff --git a/ext/zip/lib/zip_file_error_get.c b/ext/zip/lib/zip_file_error_get.c index a53fa7e003324..f20e011fc747e 100644 --- a/ext/zip/lib/zip_file_error_get.c +++ b/ext/zip/lib/zip_file_error_get.c @@ -37,7 +37,7 @@ -ZIP_EXTERN(void) +ZIP_EXTERN void zip_file_error_get(struct zip_file *zf, int *zep, int *sep) { _zip_error_get(&zf->error, zep, sep); diff --git a/ext/zip/lib/zip_get_file_extra.c b/ext/zip/lib/zip_file_get_comment.c similarity index 72% rename from ext/zip/lib/zip_get_file_extra.c rename to ext/zip/lib/zip_file_get_comment.c index a27edd8ee9452..766731ea268ef 100644 --- a/ext/zip/lib/zip_get_file_extra.c +++ b/ext/zip/lib/zip_file_get_comment.c @@ -1,6 +1,6 @@ /* - zip_get_file_extra.c -- get file extra field - Copyright (C) 2006-2010 Dieter Baron and Thomas Klausner + zip_file_get_comment.c -- get file comment + Copyright (C) 2006-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -17,7 +17,7 @@ 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. - + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -31,28 +31,28 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - + #include "zipint.h" + +/* lenp is 32 bit because converted comment can be longer than ZIP_UINT16_MAX */ - -ZIP_EXTERN(const char *) -zip_get_file_extra(struct zip *za, zip_uint64_t idx, int *lenp, int flags) +ZIP_EXTERN const char * +zip_file_get_comment(struct zip *za, zip_uint64_t idx, zip_uint32_t *lenp, zip_flags_t flags) { - if (idx >= za->nentry) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + struct zip_dirent *de; + zip_uint32_t len; + const zip_uint8_t *str; + + if ((de=_zip_get_dirent(za, idx, flags, NULL)) == NULL) return NULL; - } - - if ((flags & ZIP_FL_UNCHANGED) - || (za->entry[idx].ch_extra_len == -1)) { - if (lenp != NULL) - *lenp = za->cdir->entry[idx].extrafield_len; - return za->cdir->entry[idx].extrafield; - } - - if (lenp != NULL) - *lenp = za->entry[idx].ch_extra_len; - return za->entry[idx].ch_extra; + + if ((str=_zip_string_get(de->comment, &len, flags, &za->error)) == NULL) + return NULL; + + if (lenp) + *lenp = len; + + return (const char *)str; } diff --git a/ext/zip/lib/zip_file_get_offset.c b/ext/zip/lib/zip_file_get_offset.c index b96fd5e480907..65a011fc077c3 100644 --- a/ext/zip/lib/zip_file_get_offset.c +++ b/ext/zip/lib/zip_file_get_offset.c @@ -50,25 +50,27 @@ On error, fills in za->error and returns 0. */ -unsigned int -_zip_file_get_offset(struct zip *za, int idx) +zip_uint64_t +_zip_file_get_offset(const struct zip *za, zip_uint64_t idx, struct zip_error *error) { - struct zip_dirent de; - unsigned int offset; + zip_uint64_t offset; + zip_int32_t size; - offset = za->cdir->entry[idx].offset; + offset = za->entry[idx].orig->offset; - if (fseeko(za->zp, offset, SEEK_SET) != 0) { - _zip_error_set(&za->error, ZIP_ER_SEEK, errno); + if (fseeko(za->zp, (off_t)offset, SEEK_SET) != 0) { + _zip_error_set(error, ZIP_ER_SEEK, errno); return 0; } - if (_zip_dirent_read(&de, za->zp, NULL, NULL, 1, &za->error) != 0) + /* XXX: cache? */ + if ((size=_zip_dirent_size(za->zp, ZIP_EF_LOCAL, error)) < 0) return 0; - offset += LENTRYSIZE + de.filename_len + de.extrafield_len; - - _zip_dirent_finalize(&de); - - return offset; + if (offset+(zip_uint32_t)size > ZIP_OFF_MAX) { + _zip_error_set(error, ZIP_ER_SEEK, EFBIG); + return 0; + } + + return offset + (zip_uint32_t)size; } diff --git a/ext/zip/lib/zip_set_file_extra.c b/ext/zip/lib/zip_file_rename.c similarity index 70% rename from ext/zip/lib/zip_set_file_extra.c rename to ext/zip/lib/zip_file_rename.c index db829e2e0a842..383a52adae714 100644 --- a/ext/zip/lib/zip_set_file_extra.c +++ b/ext/zip/lib/zip_file_rename.c @@ -1,6 +1,6 @@ /* - zip_set_file_extra.c -- set extra field for file in archive - Copyright (C) 2006-2010 Dieter Baron and Thomas Klausner + zip_file_rename.c -- rename file in zip archive + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -17,7 +17,7 @@ 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. - + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -31,23 +31,21 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + - -#include +#include #include "zipint.h" + - -ZIP_EXTERN(int) -zip_set_file_extra(struct zip *za, zip_uint64_t idx, - const char *extra, int len) +ZIP_EXTERN int +zip_file_rename(struct zip *za, zip_uint64_t idx, const char *name, zip_flags_t flags) { - char *tmpext; - - if (idx >= za->nentry - || len < 0 || len > MAXEXTLEN - || (len > 0 && extra == NULL)) { + const char *old_name; + int old_is_dir, new_is_dir; + + if (idx >= za->nentry || (name != NULL && strlen(name) > ZIP_UINT16_MAX)) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } @@ -57,16 +55,16 @@ zip_set_file_extra(struct zip *za, zip_uint64_t idx, return -1; } - if (len > 0) { - if ((tmpext=(char *)_zip_memdup(extra, len, &za->error)) == NULL) - return -1; - } - else - tmpext = NULL; + if ((old_name=zip_get_name(za, idx, 0)) == NULL) + return -1; + + new_is_dir = (name != NULL && name[strlen(name)-1] == '/'); + old_is_dir = (old_name[strlen(old_name)-1] == '/'); - free(za->entry[idx].ch_extra); - za->entry[idx].ch_extra = tmpext; - za->entry[idx].ch_extra_len = len; + if (new_is_dir != old_is_dir) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } - return 0; + return _zip_set_name(za, idx, name, flags); } diff --git a/ext/zip/lib/zip_file_replace.c b/ext/zip/lib/zip_file_replace.c new file mode 100644 index 0000000000000..7e7e942168478 --- /dev/null +++ b/ext/zip/lib/zip_file_replace.c @@ -0,0 +1,111 @@ +/* + zip_file_replace.c -- replace file via callback function + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + + +#include "zipint.h" + + + +ZIP_EXTERN int +zip_file_replace(struct zip *za, zip_uint64_t idx, struct zip_source *source, zip_flags_t flags) +{ + if (idx >= za->nentry || source == NULL) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (_zip_file_replace(za, idx, NULL, source, flags) == -1) + return -1; + + return 0; +} + + + + +/* NOTE: Signed due to -1 on error. See zip_add.c for more details. */ + +zip_int64_t +_zip_file_replace(struct zip *za, zip_uint64_t idx, const char *name, struct zip_source *source, zip_flags_t flags) +{ + zip_uint64_t za_nentry_prev; + + if (ZIP_IS_RDONLY(za)) { + _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + za_nentry_prev = za->nentry; + if (idx == ZIP_UINT64_MAX) { + zip_int64_t i = -1; + + if (flags & ZIP_FL_OVERWRITE) + i = _zip_name_locate(za, name, flags, NULL); + + if (i == -1) { + /* create and use new entry, used by zip_add */ + if ((i=_zip_add_entry(za)) < 0) + return -1; + } + idx = (zip_uint64_t)i; + } + + if (name && _zip_set_name(za, idx, name, flags) != 0) { + if (za->nentry != za_nentry_prev) { + _zip_entry_finalize(za->entry+idx); + za->nentry = za_nentry_prev; + } + return -1; + } + + /* does not change any name related data, so we can do it here; + * needed for a double add of the same file name */ + _zip_unchange_data(za->entry+idx); + + if (za->entry[idx].orig != NULL && (za->entry[idx].changes == NULL || (za->entry[idx].changes->changed & ZIP_DIRENT_COMP_METHOD) == 0)) { + if (za->entry[idx].changes == NULL) { + if ((za->entry[idx].changes=_zip_dirent_clone(za->entry[idx].orig)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + } + + za->entry[idx].changes->comp_method = ZIP_CM_REPLACED_DEFAULT; + za->entry[idx].changes->changed |= ZIP_DIRENT_COMP_METHOD; + } + + za->entry[idx].source = source; + + return (zip_int64_t)idx; +} diff --git a/ext/zip/lib/zip_file_set_comment.c b/ext/zip/lib/zip_file_set_comment.c new file mode 100644 index 0000000000000..722f3d43cc3d3 --- /dev/null +++ b/ext/zip/lib/zip_file_set_comment.c @@ -0,0 +1,105 @@ +/* + zip_file_set_comment.c -- set comment for file in archive + Copyright (C) 2006-2012 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + + +#include + +#include "zipint.h" + + + +ZIP_EXTERN int +zip_file_set_comment(struct zip *za, zip_uint64_t idx, + const char *comment, zip_uint16_t len, zip_flags_t flags) +{ + struct zip_entry *e; + struct zip_string *cstr; + int changed; + + if (_zip_get_dirent(za, idx, 0, NULL) == NULL) + return -1; + + if (ZIP_IS_RDONLY(za)) { + _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + if (len > 0 && comment == NULL) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (len > 0) { + if ((cstr=_zip_string_new((const zip_uint8_t *)comment, len, flags, &za->error)) == NULL) + return -1; + if ((flags & ZIP_FL_ENCODING_ALL) == ZIP_FL_ENC_GUESS && _zip_guess_encoding(cstr, ZIP_ENCODING_UNKNOWN) == ZIP_ENCODING_UTF8_GUESSED) + cstr->encoding = ZIP_ENCODING_UTF8_KNOWN; + } + else + cstr = NULL; + + e = za->entry+idx; + + if (e->changes) { + _zip_string_free(e->changes->comment); + e->changes->comment = NULL; + e->changes->changed &= ~ZIP_DIRENT_COMMENT; + } + + if (e->orig && e->orig->comment) + changed = !_zip_string_equal(e->orig->comment, cstr); + else + changed = (cstr != NULL); + + if (changed) { + if (e->changes == NULL) { + if ((e->changes=_zip_dirent_clone(e->orig)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + _zip_string_free(cstr); + return -1; + } + } + e->changes->comment = cstr; + e->changes->changed |= ZIP_DIRENT_COMMENT; + } + else { + _zip_string_free(cstr); + if (e->changes && e->changes->changed == 0) { + _zip_dirent_free(e->changes); + e->changes = NULL; + } + } + + return 0; +} diff --git a/ext/zip/lib/zip_file_strerror.c b/ext/zip/lib/zip_file_strerror.c index c2864f2ba1aaf..9ba70f14ff52b 100644 --- a/ext/zip/lib/zip_file_strerror.c +++ b/ext/zip/lib/zip_file_strerror.c @@ -37,7 +37,7 @@ -ZIP_EXTERN(const char *) +ZIP_EXTERN const char * zip_file_strerror(struct zip_file *zf) { return _zip_error_strerror(&zf->error); diff --git a/ext/zip/lib/zip_filerange_crc.c b/ext/zip/lib/zip_filerange_crc.c index 4d1ad566929f8..3b1c868407ef9 100644 --- a/ext/zip/lib/zip_filerange_crc.c +++ b/ext/zip/lib/zip_filerange_crc.c @@ -1,6 +1,6 @@ /* zip_filerange_crc.c -- compute CRC32 for a range of a file - Copyright (C) 2008 Dieter Baron and Thomas Klausner + Copyright (C) 2008-2013 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -56,13 +56,13 @@ _zip_filerange_crc(FILE *fp, off_t start, off_t len, uLong *crcp, } while (len > 0) { - n = len > BUFSIZE ? BUFSIZE : len; - if ((n=fread(buf, 1, n, fp)) <= 0) { + n = len > BUFSIZE ? BUFSIZE : (size_t)len; + if ((n=fread(buf, 1, n, fp)) == 0) { _zip_error_set(errp, ZIP_ER_READ, errno); return -1; } - *crcp = crc32(*crcp, buf, n); + *crcp = crc32(*crcp, buf, (uInt)n); len-= n; } diff --git a/ext/zip/lib/zip_fopen.c b/ext/zip/lib/zip_fopen.c index f62adbbf92692..331f79ea36149 100644 --- a/ext/zip/lib/zip_fopen.c +++ b/ext/zip/lib/zip_fopen.c @@ -37,13 +37,13 @@ -ZIP_EXTERN(struct zip_file *) -zip_fopen(struct zip *za, const char *fname, int flags) +ZIP_EXTERN struct zip_file * +zip_fopen(struct zip *za, const char *fname, zip_flags_t flags) { - int idx; + zip_int64_t idx; if ((idx=zip_name_locate(za, fname, flags)) < 0) return NULL; - return zip_fopen_index_encrypted(za, idx, flags, za->default_password); + return zip_fopen_index_encrypted(za, (zip_uint64_t)idx, flags, za->default_password); } diff --git a/ext/zip/lib/zip_fopen_encrypted.c b/ext/zip/lib/zip_fopen_encrypted.c index 8aba0625672bc..34230f00d7c0a 100644 --- a/ext/zip/lib/zip_fopen_encrypted.c +++ b/ext/zip/lib/zip_fopen_encrypted.c @@ -37,14 +37,13 @@ -ZIP_EXTERN(struct zip_file *) -zip_fopen_encrypted(struct zip *za, const char *fname, int flags, - const char *password) +ZIP_EXTERN struct zip_file * +zip_fopen_encrypted(struct zip *za, const char *fname, zip_flags_t flags, const char *password) { - int idx; + zip_int64_t idx; if ((idx=zip_name_locate(za, fname, flags)) < 0) return NULL; - return zip_fopen_index_encrypted(za, idx, flags, password); + return zip_fopen_index_encrypted(za, (zip_uint64_t)idx, flags, password); } diff --git a/ext/zip/lib/zip_fopen_index.c b/ext/zip/lib/zip_fopen_index.c index b60fd33e8f53e..30466ffa19a59 100644 --- a/ext/zip/lib/zip_fopen_index.c +++ b/ext/zip/lib/zip_fopen_index.c @@ -1,6 +1,6 @@ /* zip_fopen_index.c -- open file in zip archive for reading by index - Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2013 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -41,8 +41,8 @@ -ZIP_EXTERN(struct zip_file *) -zip_fopen_index(struct zip *za, zip_uint64_t fileno, int flags) +ZIP_EXTERN struct zip_file * +zip_fopen_index(struct zip *za, zip_uint64_t index, zip_flags_t flags) { - return zip_fopen_index_encrypted(za, fileno, flags, za->default_password); + return zip_fopen_index_encrypted(za, index, flags, za->default_password); } diff --git a/ext/zip/lib/zip_fopen_index_encrypted.c b/ext/zip/lib/zip_fopen_index_encrypted.c index 988a78fe03f9a..cc81ca7f53b67 100644 --- a/ext/zip/lib/zip_fopen_index_encrypted.c +++ b/ext/zip/lib/zip_fopen_index_encrypted.c @@ -1,6 +1,6 @@ /* zip_fopen_index_encrypted.c -- open file for reading by index w/ password - Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2013 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -43,103 +43,15 @@ static struct zip_file *_zip_file_new(struct zip *za); -ZIP_EXTERN(struct zip_file *) -zip_fopen_index_encrypted(struct zip *za, zip_uint64_t fileno, int flags, +ZIP_EXTERN struct zip_file * +zip_fopen_index_encrypted(struct zip *za, zip_uint64_t index, zip_flags_t flags, const char *password) { struct zip_file *zf; - zip_compression_implementation comp_impl; - zip_encryption_implementation enc_impl; - struct zip_source *src, *s2; - zip_uint64_t start; - struct zip_stat st; - - if (fileno >= za->nentry) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); - return NULL; - } + struct zip_source *src; - if ((flags & ZIP_FL_UNCHANGED) == 0 - && ZIP_ENTRY_DATA_CHANGED(za->entry+fileno)) { - _zip_error_set(&za->error, ZIP_ER_CHANGED, 0); + if ((src=_zip_source_zip_new(za, za, index, flags, 0, 0, password)) == NULL) return NULL; - } - - if (fileno >= za->cdir->nentry) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); - return NULL; - } - - if (flags & ZIP_FL_ENCRYPTED) - flags |= ZIP_FL_COMPRESSED; - - zip_stat_index(za, fileno, flags, &st); - - enc_impl = NULL; - if ((flags & ZIP_FL_ENCRYPTED) == 0) { - if (st.encryption_method != ZIP_EM_NONE) { - if (password == NULL) { - _zip_error_set(&za->error, ZIP_ER_NOPASSWD, 0); - return NULL; - } - if ((enc_impl=zip_get_encryption_implementation( - st.encryption_method)) == NULL) { - _zip_error_set(&za->error, ZIP_ER_ENCRNOTSUPP, 0); - return NULL; - } - } - } - - comp_impl = NULL; - if ((flags & ZIP_FL_COMPRESSED) == 0) { - if (st.comp_method != ZIP_CM_STORE) { - if ((comp_impl=zip_get_compression_implementation( - st.comp_method)) == NULL) { - _zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0); - return NULL; - } - } - } - - if ((start=_zip_file_get_offset(za, fileno)) == 0) - return NULL; - - if (st.comp_size == 0) { - if ((src=zip_source_buffer(za, NULL, 0, 0)) == NULL) - return NULL; - } - else { - if ((src=_zip_source_file_or_p(za, NULL, za->zp, start, st.comp_size, - 0, &st)) == NULL) - return NULL; - if (enc_impl) { - if ((s2=enc_impl(za, src, ZIP_EM_TRAD_PKWARE, 0, - password)) == NULL) { - zip_source_free(src); - /* XXX: set error (how?) */ - return NULL; - } - src = s2; - } - if (comp_impl) { - if ((s2=comp_impl(za, src, za->cdir->entry[fileno].comp_method, - 0)) == NULL) { - zip_source_free(src); - /* XXX: set error (how?) */ - return NULL; - } - src = s2; - } - if ((flags & ZIP_FL_COMPRESSED) == 0 - || st.comp_method == ZIP_CM_STORE ) { - if ((s2=zip_source_crc(za, src, 1)) == NULL) { - zip_source_free(src); - /* XXX: set error (how?) */ - return NULL; - } - src = s2; - } - } if (zip_source_open(src) < 0) { _zip_error_set_from_source(&za->error, src); @@ -147,7 +59,10 @@ zip_fopen_index_encrypted(struct zip *za, zip_uint64_t fileno, int flags, return NULL; } - zf = _zip_file_new(za); + if ((zf=_zip_file_new(za)) == NULL) { + zip_source_free(src); + return NULL; + } zf->src = src; @@ -160,14 +75,14 @@ static struct zip_file * _zip_file_new(struct zip *za) { struct zip_file *zf, **file; - int n; if ((zf=(struct zip_file *)malloc(sizeof(struct zip_file))) == NULL) { _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return NULL; } - if (za->nfile >= za->nfile_alloc-1) { + if (za->nfile+1 >= za->nfile_alloc) { + unsigned int n; n = za->nfile_alloc + 10; file = (struct zip_file **)realloc(za->file, n*sizeof(struct zip_file *)); diff --git a/ext/zip/lib/zip_fread.c b/ext/zip/lib/zip_fread.c index a6c0851b0aaac..8235c6dfacf80 100644 --- a/ext/zip/lib/zip_fread.c +++ b/ext/zip/lib/zip_fread.c @@ -37,7 +37,7 @@ -ZIP_EXTERN(zip_int64_t) +ZIP_EXTERN zip_int64_t zip_fread(struct zip_file *zf, void *outbuf, zip_uint64_t toread) { zip_int64_t n; diff --git a/ext/zip/lib/zip_get_archive_comment.c b/ext/zip/lib/zip_get_archive_comment.c index fe97e6e8c18a1..202f761f4e852 100644 --- a/ext/zip/lib/zip_get_archive_comment.c +++ b/ext/zip/lib/zip_get_archive_comment.c @@ -1,6 +1,6 @@ /* zip_get_archive_comment.c -- get archive comment - Copyright (C) 2006-2007 Dieter Baron and Thomas Klausner + Copyright (C) 2006-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -33,28 +33,29 @@ +#include + #include "zipint.h" -ZIP_EXTERN(const char *) -zip_get_archive_comment(struct zip *za, int *lenp, int flags) +ZIP_EXTERN const char * +zip_get_archive_comment(struct zip *za, int *lenp, zip_flags_t flags) { - if ((flags & ZIP_FL_UNCHANGED) - || (za->ch_comment_len == -1)) { - if (za->cdir) { - if (lenp != NULL) - *lenp = za->cdir->comment_len; - return za->cdir->comment; - } - else { - if (lenp != NULL) - *lenp = -1; - return NULL; - } - } - - if (lenp != NULL) - *lenp = za->ch_comment_len; - return za->ch_comment; + struct zip_string *comment; + zip_uint32_t len; + const zip_uint8_t *str; + + if ((flags & ZIP_FL_UNCHANGED) || (za->comment_changes == NULL)) + comment = za->comment_orig; + else + comment = za->comment_changes; + + if ((str=_zip_string_get(comment, &len, flags, &za->error)) == NULL) + return NULL; + + if (lenp) + *lenp = (int)len; + + return (const char *)str; } diff --git a/ext/zip/lib/zip_get_archive_flag.c b/ext/zip/lib/zip_get_archive_flag.c index 2d46aa39ffbb4..c3be5c14fec38 100644 --- a/ext/zip/lib/zip_get_archive_flag.c +++ b/ext/zip/lib/zip_get_archive_flag.c @@ -37,10 +37,10 @@ -ZIP_EXTERN(int) -zip_get_archive_flag(struct zip *za, int flag, int flags) +ZIP_EXTERN int +zip_get_archive_flag(struct zip *za, unsigned int flag, zip_flags_t flags) { - int fl; + unsigned int fl; fl = (flags & ZIP_FL_UNCHANGED) ? za->flags : za->ch_flags; diff --git a/ext/zip/lib/zip_get_compression_implementation.c b/ext/zip/lib/zip_get_compression_implementation.c index 197cd49635d41..aa4a1605c0f36 100644 --- a/ext/zip/lib/zip_get_compression_implementation.c +++ b/ext/zip/lib/zip_get_compression_implementation.c @@ -37,10 +37,10 @@ -ZIP_EXTERN(zip_compression_implementation) -zip_get_compression_implementation(zip_uint16_t cm) +zip_compression_implementation +_zip_get_compression_implementation(zip_int32_t cm) { - if (cm == ZIP_CM_DEFLATE) + if (cm == ZIP_CM_DEFLATE || ZIP_CM_IS_DEFAULT(cm)) return zip_source_deflate; return NULL; } diff --git a/ext/zip/lib/zip_get_encryption_implementation.c b/ext/zip/lib/zip_get_encryption_implementation.c index 783d538d3f6ff..7dcb99210d498 100644 --- a/ext/zip/lib/zip_get_encryption_implementation.c +++ b/ext/zip/lib/zip_get_encryption_implementation.c @@ -37,8 +37,8 @@ -ZIP_EXTERN(zip_encryption_implementation) -zip_get_encryption_implementation(zip_uint16_t em) +zip_encryption_implementation +_zip_get_encryption_implementation(zip_uint16_t em) { if (em == ZIP_EM_TRAD_PKWARE) return zip_source_pkware; diff --git a/ext/zip/lib/zip_get_file_comment.c b/ext/zip/lib/zip_get_file_comment.c index 43c1520e1d438..3be459d4da6b0 100644 --- a/ext/zip/lib/zip_get_file_comment.c +++ b/ext/zip/lib/zip_get_file_comment.c @@ -1,6 +1,6 @@ /* zip_get_file_comment.c -- get file comment - Copyright (C) 2006-2007 Dieter Baron and Thomas Klausner + Copyright (C) 2006-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -33,26 +33,21 @@ +#define _ZIP_COMPILING_DEPRECATED #include "zipint.h" -ZIP_EXTERN(const char *) +ZIP_EXTERN const char * zip_get_file_comment(struct zip *za, zip_uint64_t idx, int *lenp, int flags) { - if (idx >= za->nentry) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); - return NULL; - } + zip_uint32_t len; + const char *s; - if ((flags & ZIP_FL_UNCHANGED) - || (za->entry[idx].ch_comment_len == -1)) { - if (lenp != NULL) - *lenp = za->cdir->entry[idx].comment_len; - return za->cdir->entry[idx].comment; + if ((s=zip_file_get_comment(za, idx, &len, (zip_flags_t)flags)) != NULL) { + if (lenp) + *lenp = (int)len; } - - if (lenp != NULL) - *lenp = za->entry[idx].ch_comment_len; - return za->entry[idx].ch_comment; + + return s; } diff --git a/ext/zip/lib/zip_get_name.c b/ext/zip/lib/zip_get_name.c index 945e24e1501d5..f67c7caf4305f 100644 --- a/ext/zip/lib/zip_get_name.c +++ b/ext/zip/lib/zip_get_name.c @@ -1,6 +1,6 @@ /* zip_get_name.c -- get filename for a file in zip file - Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -33,12 +33,14 @@ +#include + #include "zipint.h" -ZIP_EXTERN(const char *) -zip_get_name(struct zip *za, zip_uint64_t idx, int flags) +ZIP_EXTERN const char * +zip_get_name(struct zip *za, zip_uint64_t idx, zip_flags_t flags) { return _zip_get_name(za, idx, flags, &za->error); } @@ -46,27 +48,16 @@ zip_get_name(struct zip *za, zip_uint64_t idx, int flags) const char * -_zip_get_name(struct zip *za, zip_uint64_t idx, int flags, - struct zip_error *error) +_zip_get_name(struct zip *za, zip_uint64_t idx, zip_flags_t flags, struct zip_error *error) { - if (idx >= za->nentry) { - _zip_error_set(error, ZIP_ER_INVAL, 0); - return NULL; - } + struct zip_dirent *de; + const zip_uint8_t *str; - if ((flags & ZIP_FL_UNCHANGED) == 0) { - if (za->entry[idx].state == ZIP_ST_DELETED) { - _zip_error_set(error, ZIP_ER_DELETED, 0); - return NULL; - } - if (za->entry[idx].ch_filename) - return za->entry[idx].ch_filename; - } + if ((de=_zip_get_dirent(za, idx, flags, error)) == NULL) + return NULL; - if (za->cdir == NULL || idx >= za->cdir->nentry) { - _zip_error_set(error, ZIP_ER_INVAL, 0); + if ((str=_zip_string_get(de->filename, NULL, flags, error)) == NULL) return NULL; - } - - return za->cdir->entry[idx].filename; + + return (const char *)str; } diff --git a/ext/zip/lib/zip_get_num_entries.c b/ext/zip/lib/zip_get_num_entries.c index dd392e909592e..26484baff22a6 100644 --- a/ext/zip/lib/zip_get_num_entries.c +++ b/ext/zip/lib/zip_get_num_entries.c @@ -37,16 +37,19 @@ -ZIP_EXTERN(zip_uint64_t) -zip_get_num_entries(struct zip *za, int flags) +ZIP_EXTERN zip_int64_t +zip_get_num_entries(struct zip *za, zip_flags_t flags) { + zip_uint64_t n; + if (za == NULL) return -1; if (flags & ZIP_FL_UNCHANGED) { - if (za->cdir == NULL) - return 0; - return za->cdir->nentry; + n = za->nentry; + while (n>0 && za->entry[n-1].orig == NULL) + --n; + return (zip_int64_t)n; } - return za->nentry; + return (zip_int64_t)za->nentry; } diff --git a/ext/zip/lib/zip_get_num_files.c b/ext/zip/lib/zip_get_num_files.c index a442f293ec350..29b06dc8193ff 100644 --- a/ext/zip/lib/zip_get_num_files.c +++ b/ext/zip/lib/zip_get_num_files.c @@ -33,15 +33,17 @@ +#define _ZIP_COMPILING_DEPRECATED #include "zipint.h" -ZIP_EXTERN(int) +ZIP_EXTERN int zip_get_num_files(struct zip *za) { if (za == NULL) return -1; - return za->nentry; + /* XXX: check for overflow */ + return (int)za->nentry; } diff --git a/ext/zip/lib/zip_memdup.c b/ext/zip/lib/zip_memdup.c index 641125ed2d1b2..06af2dabd36c7 100644 --- a/ext/zip/lib/zip_memdup.c +++ b/ext/zip/lib/zip_memdup.c @@ -1,6 +1,6 @@ /* zip_memdup.c -- internal zip function, "strdup" with len - Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -43,6 +43,9 @@ _zip_memdup(const void *mem, size_t len, struct zip_error *error) { void *ret; + if (len == 0) + return NULL; + ret = malloc(len); if (!ret) { _zip_error_set(error, ZIP_ER_MEMORY, 0); diff --git a/ext/zip/lib/zip_name_locate.c b/ext/zip/lib/zip_name_locate.c index 8cdd2c4d7ea0b..3cac110543672 100644 --- a/ext/zip/lib/zip_name_locate.c +++ b/ext/zip/lib/zip_name_locate.c @@ -34,26 +34,28 @@ #include +#ifdef HAVE_STRINGS_H +#include +#endif #include "zipint.h" -ZIP_EXTERN(int) -zip_name_locate(struct zip *za, const char *fname, int flags) +ZIP_EXTERN zip_int64_t +zip_name_locate(struct zip *za, const char *fname, zip_flags_t flags) { return _zip_name_locate(za, fname, flags, &za->error); } -int -_zip_name_locate(struct zip *za, const char *fname, int flags, - struct zip_error *error) +zip_int64_t +_zip_name_locate(struct zip *za, const char *fname, zip_flags_t flags, struct zip_error *error) { int (*cmp)(const char *, const char *); const char *fn, *p; - int i, n; + zip_uint64_t i; if (za == NULL) return -1; @@ -63,21 +65,12 @@ _zip_name_locate(struct zip *za, const char *fname, int flags, return -1; } - if ((flags & ZIP_FL_UNCHANGED) && za->cdir == NULL) { - _zip_error_set(error, ZIP_ER_NOENT, 0); - return -1; - } - - cmp = (flags & ZIP_FL_NOCASE) ? strcmpi : strcmp; + cmp = (flags & ZIP_FL_NOCASE) ? strcasecmp : strcmp; - n = (flags & ZIP_FL_UNCHANGED) ? za->cdir->nentry : za->nentry; - for (i=0; icdir->entry[i].filename; - else - fn = _zip_get_name(za, i, flags, error); + for (i=0; inentry; i++) { + fn = _zip_get_name(za, i, flags, error); - /* newly added (partially filled) entry */ + /* newly added (partially filled) entry or error */ if (fn == NULL) continue; @@ -87,11 +80,12 @@ _zip_name_locate(struct zip *za, const char *fname, int flags, fn = p+1; } - if (cmp(fname, fn) == 0) - return i; + if (cmp(fname, fn) == 0) { + _zip_error_clear(error); + return (zip_int64_t)i; + } } -/* Look for an entry should not raise an error */ -/* _zip_error_set(error, ZIP_ER_NOENT, 0);*/ + _zip_error_set(error, ZIP_ER_NOENT, 0); return -1; } diff --git a/ext/zip/lib/zip_new.c b/ext/zip/lib/zip_new.c index 7ce1237cdbabd..f77634a389f36 100644 --- a/ext/zip/lib/zip_new.c +++ b/ext/zip/lib/zip_new.c @@ -1,6 +1,6 @@ /* zip_new.c -- create and init struct zip - Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -56,16 +56,17 @@ _zip_new(struct zip_error *error) za->zn = NULL; za->zp = NULL; + za->open_flags = 0; _zip_error_init(&za->error); - za->cdir = NULL; - za->ch_comment = NULL; - za->ch_comment_len = -1; + za->flags = za->ch_flags = 0; + za->default_password = NULL; + za->comment_orig = za->comment_changes = NULL; + za->comment_changed = 0; za->nentry = za->nentry_alloc = 0; za->entry = NULL; za->nfile = za->nfile_alloc = 0; za->file = NULL; - za->flags = za->ch_flags = 0; - za->default_password = NULL; + za->tempdir = NULL; return za; } diff --git a/ext/zip/lib/zip_open.c b/ext/zip/lib/zip_open.c index 5ce1c1070ae03..e6a30d5ae7066 100644 --- a/ext/zip/lib/zip_open.c +++ b/ext/zip/lib/zip_open.c @@ -1,6 +1,6 @@ /* zip_open.c -- open zip archive by name - Copyright (C) 1999-2011 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -42,38 +42,53 @@ #include "zipint.h" -static void set_error(int *, struct zip_error *, int); -static struct zip *_zip_allocate_new(const char *, int *); -static int _zip_checkcons(FILE *, struct zip_cdir *, struct zip_error *); -static void _zip_check_torrentzip(struct zip *); -static struct zip_cdir *_zip_find_central_dir(FILE *, int, int *, off_t); -static int _zip_file_exists(const char *, int, int *); -static int _zip_headercomp(struct zip_dirent *, int, - struct zip_dirent *, int); -static unsigned char *_zip_memmem(const unsigned char *, int, - const unsigned char *, int); -static struct zip_cdir *_zip_readcdir(FILE *, off_t, unsigned char *, unsigned char *, - int, int, struct zip_error *); +static void set_error(int *, const struct zip_error *, int); +static struct zip *_zip_allocate_new(const char *, unsigned int, int *); +static zip_int64_t _zip_checkcons(FILE *, struct zip_cdir *, struct zip_error *); +static void _zip_check_torrentzip(struct zip *, const struct zip_cdir *); +static struct zip_cdir *_zip_find_central_dir(FILE *, unsigned int, int *, off_t); +static int _zip_file_exists(const char *, unsigned int, int *); +static int _zip_headercomp(const struct zip_dirent *, const struct zip_dirent *); +static unsigned char *_zip_memmem(const unsigned char *, size_t, + const unsigned char *, size_t); +static struct zip_cdir *_zip_readcdir(FILE *, off_t, unsigned char *, const unsigned char *, + size_t, unsigned int, struct zip_error *); +static struct zip_cdir *_zip_read_eocd(const unsigned char *, const unsigned char *, off_t, + size_t, unsigned int, struct zip_error *); +static struct zip_cdir *_zip_read_eocd64(FILE *, const unsigned char *, const unsigned char *, + off_t, size_t, unsigned int, struct zip_error *); -ZIP_EXTERN(struct zip *) -zip_open(const char *fn, int flags, int *zep) +ZIP_EXTERN struct zip * +zip_open(const char *fn, int _flags, int *zep) { FILE *fp; - - if (flags & ZIP_OVERWRITE) { - return _zip_allocate_new(fn, zep); + unsigned int flags; + + if (_flags < 0) { + if (zep) + *zep = ZIP_ER_INVAL; + return NULL; } - + flags = (unsigned int)_flags; + switch (_zip_file_exists(fn, flags, zep)) { case -1: - if (!(flags & ZIP_OVERWRITE)) { - return NULL; - } + return NULL; case 0: - return _zip_allocate_new(fn, zep); + return _zip_allocate_new(fn, flags, zep); default: + if (flags & ZIP_TRUNCATE) { + FILE *f; + + if ((f = fopen(fn, "rb")) == NULL) { + set_error(zep, NULL, ZIP_ER_OPEN); + return NULL; + } + fclose(f); + return _zip_allocate_new(fn, flags, zep); + } break; } @@ -82,17 +97,36 @@ zip_open(const char *fn, int flags, int *zep) return NULL; } - return _zip_open(fn, fp, flags, 0, zep); + return _zip_open(fn, fp, flags, zep); } + +ZIP_EXTERN int +zip_archive_set_tempdir(struct zip *za, const char *tempdir) +{ + char *new_tempdir; + + if (tempdir) { + if ((new_tempdir = strdup(tempdir)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, errno); + return -1; + } + } + else + new_tempdir = NULL; + + free(za->tempdir); + za->tempdir = new_tempdir; + + return 0; +} struct zip * -_zip_open(const char *fn, FILE *fp, int flags, int aflags, int *zep) +_zip_open(const char *fn, FILE *fp, unsigned int flags, int *zep) { struct zip *za; struct zip_cdir *cdir; - int i; off_t len; if (fseeko(fp, 0, SEEK_END) < 0) { @@ -103,7 +137,7 @@ _zip_open(const char *fn, FILE *fp, int flags, int aflags, int *zep) /* treat empty files as empty archives */ if (len == 0) { - if ((za=_zip_allocate_new(fn, zep)) == NULL) + if ((za=_zip_allocate_new(fn, flags, zep)) == NULL) fclose(fp); else za->zp = fp; @@ -116,34 +150,32 @@ _zip_open(const char *fn, FILE *fp, int flags, int aflags, int *zep) return NULL; } - if ((za=_zip_allocate_new(fn, zep)) == NULL) { + if ((za=_zip_allocate_new(fn, flags, zep)) == NULL) { _zip_cdir_free(cdir); fclose(fp); return NULL; } - za->cdir = cdir; + za->entry = cdir->entry; + za->nentry = cdir->nentry; + za->nentry_alloc = cdir->nentry_alloc; + za->comment_orig = cdir->comment; + za->zp = fp; - if ((za->entry=(struct zip_entry *)malloc(sizeof(*(za->entry)) - * cdir->nentry)) == NULL) { - set_error(zep, NULL, ZIP_ER_MEMORY); - _zip_free(za); - return NULL; - } - for (i=0; inentry; i++) - _zip_entry_new(za); + _zip_check_torrentzip(za, cdir); - _zip_check_torrentzip(za); za->ch_flags = za->flags; + free(cdir); + return za; } static void -set_error(int *zep, struct zip_error *err, int ze) +set_error(int *zep, const struct zip_error *err, int ze) { int se; @@ -166,16 +198,17 @@ set_error(int *zep, struct zip_error *err, int ze) entries, or NULL if unsuccessful. */ static struct zip_cdir * -_zip_readcdir(FILE *fp, off_t buf_offset, unsigned char *buf, unsigned char *eocd, int buflen, - int flags, struct zip_error *error) +_zip_readcdir(FILE *fp, off_t buf_offset, unsigned char *buf, const unsigned char *eocd, size_t buflen, + unsigned int flags, struct zip_error *error) { struct zip_cdir *cd; - unsigned char *cdp, **bufp; - int i, comlen, nentry; - zip_uint32_t left; + const unsigned char *cdp; + const unsigned char **bufp; + zip_int64_t tail_len, comment_len; + zip_uint64_t i, left; - comlen = buf + buflen - eocd - EOCDLEN; - if (comlen < 0) { + tail_len = buf + buflen - eocd - EOCDLEN; + if (tail_len < 0) { /* not enough bytes left for comment */ _zip_error_set(error, ZIP_ER_NOZIP, 0); return NULL; @@ -192,46 +225,32 @@ _zip_readcdir(FILE *fp, off_t buf_offset, unsigned char *buf, unsigned char *eoc return NULL; } - cdp = eocd + 8; - /* number of cdir-entries on this disk */ - i = _zip_read2(&cdp); - /* number of cdir-entries */ - nentry = _zip_read2(&cdp); + if (eocd-EOCD64LOCLEN >= buf && memcmp(eocd-EOCD64LOCLEN, EOCD64LOC_MAGIC, 4) == 0) + cd = _zip_read_eocd64(fp, eocd-EOCD64LOCLEN, buf, buf_offset, buflen, flags, error); + else + cd = _zip_read_eocd(eocd, buf, buf_offset, buflen, flags, error); - if ((cd=_zip_cdir_new(nentry, error)) == NULL) + if (cd == NULL) return NULL; - cd->size = _zip_read4(&cdp); - cd->offset = _zip_read4(&cdp); - cd->comment = NULL; - cd->comment_len = _zip_read2(&cdp); + cdp = eocd + 20; + comment_len = _zip_read2(&cdp); - if (((zip_uint64_t)cd->offset)+cd->size > buf_offset + (eocd-buf)) { + if ((zip_uint64_t)cd->offset+(zip_uint64_t)cd->size > (zip_uint64_t)buf_offset + (zip_uint64_t)(eocd-buf)) { /* cdir spans past EOCD record */ _zip_error_set(error, ZIP_ER_INCONS, 0); - cd->nentry = 0; _zip_cdir_free(cd); return NULL; } - if ((comlen < cd->comment_len) || (cd->nentry != i)) { - _zip_error_set(error, ZIP_ER_NOZIP, 0); - cd->nentry = 0; - _zip_cdir_free(cd); - return NULL; - } - if ((flags & ZIP_CHECKCONS) && comlen != cd->comment_len) { + if (tail_len < comment_len || ((flags & ZIP_CHECKCONS) && tail_len != comment_len)) { _zip_error_set(error, ZIP_ER_INCONS, 0); - cd->nentry = 0; _zip_cdir_free(cd); return NULL; } - if (cd->comment_len) { - if ((cd->comment=(char *)_zip_memdup(eocd+EOCDLEN, - cd->comment_len, error)) - == NULL) { - cd->nentry = 0; + if (comment_len) { + if ((cd->comment=_zip_string_new(eocd+EOCDLEN, (zip_uint16_t)comment_len, ZIP_FL_ENC_GUESS, error)) == NULL) { _zip_cdir_free(cd); return NULL; } @@ -249,40 +268,32 @@ _zip_readcdir(FILE *fp, off_t buf_offset, unsigned char *buf, unsigned char *eoc fseeko(fp, cd->offset, SEEK_SET); /* possible consistency check: cd->offset = len-(cd->size+cd->comment_len+EOCDLEN) ? */ - if (ferror(fp) || ((unsigned long)ftello(fp) != cd->offset)) { + if (ferror(fp) || (ftello(fp) != cd->offset)) { /* seek error or offset of cdir wrong */ if (ferror(fp)) _zip_error_set(error, ZIP_ER_SEEK, errno); else _zip_error_set(error, ZIP_ER_NOZIP, 0); - cd->nentry = 0; _zip_cdir_free(cd); return NULL; } } - left = cd->size; + left = (zip_uint64_t)cd->size; i=0; while (inentry && left > 0) { - if ((_zip_dirent_read(cd->entry+i, fp, bufp, &left, 0, error)) < 0) { - cd->nentry = i; + if ((cd->entry[i].orig=_zip_dirent_new()) == NULL + || (_zip_dirent_read(cd->entry[i].orig, fp, bufp, &left, 0, error)) < 0) { _zip_cdir_free(cd); return NULL; } i++; - - if (i == cd->nentry && left > 0) { - /* Infozip extension for more than 64k entries: - nentries wraps around, size indicates correct EOCD */ - if (_zip_cdir_grow(cd, cd->nentry+ZIP_UINT16_MAX, error) < 0) { - cd->nentry = i; - _zip_cdir_free(cd); - return NULL; - } - } } - - cd->nentry = i; + if (i != cd->nentry || ((flags & ZIP_CHECKCONS) && left != 0)) { + _zip_error_set(error, ZIP_ER_INCONS, 0); + _zip_cdir_free(cd); + return NULL; + } return cd; } @@ -295,84 +306,88 @@ _zip_readcdir(FILE *fp, off_t buf_offset, unsigned char *buf, unsigned char *eoc file and header offsets. Returns -1 if not plausible, else the difference between the lowest and the highest fileposition reached */ -static int +static zip_int64_t _zip_checkcons(FILE *fp, struct zip_cdir *cd, struct zip_error *error) { - int i; - unsigned int min, max, j; + zip_uint64_t i; + zip_uint64_t min, max, j; struct zip_dirent temp; if (cd->nentry) { - max = cd->entry[0].offset; - min = cd->entry[0].offset; + max = cd->entry[0].orig->offset; + min = cd->entry[0].orig->offset; } else min = max = 0; for (i=0; inentry; i++) { - if (cd->entry[i].offset < min) - min = cd->entry[i].offset; - if (min > cd->offset) { + if (cd->entry[i].orig->offset < min) + min = cd->entry[i].orig->offset; + if (min > (zip_uint64_t)cd->offset) { _zip_error_set(error, ZIP_ER_NOZIP, 0); return -1; } - j = cd->entry[i].offset + cd->entry[i].comp_size - + cd->entry[i].filename_len + LENTRYSIZE; + j = cd->entry[i].orig->offset + cd->entry[i].orig->comp_size + + _zip_string_length(cd->entry[i].orig->filename) + LENTRYSIZE; if (j > max) max = j; - if (max > cd->offset) { + if (max > (zip_uint64_t)cd->offset) { _zip_error_set(error, ZIP_ER_NOZIP, 0); return -1; } - if (fseeko(fp, cd->entry[i].offset, SEEK_SET) != 0) { - _zip_error_set(error, ZIP_ER_SEEK, 0); + if (fseeko(fp, (off_t)cd->entry[i].orig->offset, SEEK_SET) != 0) { + _zip_error_set(error, ZIP_ER_SEEK, errno); return -1; } if (_zip_dirent_read(&temp, fp, NULL, NULL, 1, error) == -1) return -1; - if (_zip_headercomp(cd->entry+i, 0, &temp, 1) != 0) { + if (_zip_headercomp(cd->entry[i].orig, &temp) != 0) { _zip_error_set(error, ZIP_ER_INCONS, 0); _zip_dirent_finalize(&temp); return -1; } + + cd->entry[i].orig->extra_fields = _zip_ef_merge(cd->entry[i].orig->extra_fields, temp.extra_fields); + cd->entry[i].orig->local_extra_fields_read = 1; + temp.extra_fields = NULL; + _zip_dirent_finalize(&temp); } - return max - min; + return (max-min) < ZIP_INT64_MAX ? (zip_int64_t)(max-min) : ZIP_INT64_MAX; } /* _zip_check_torrentzip: - check whether ZA has a valid TORRENTZIP comment, i.e. is torrentzipped */ + check wether ZA has a valid TORRENTZIP comment, i.e. is torrentzipped */ static void -_zip_check_torrentzip(struct zip *za) +_zip_check_torrentzip(struct zip *za, const struct zip_cdir *cdir) { uLong crc_got, crc_should; char buf[8+1]; char *end; - if (za->zp == NULL || za->cdir == NULL) + if (za->zp == NULL || cdir == NULL) return; - if (za->cdir->comment_len != TORRENT_SIG_LEN+8 - || strncmp(za->cdir->comment, TORRENT_SIG, TORRENT_SIG_LEN) != 0) + if (_zip_string_length(cdir->comment) != TORRENT_SIG_LEN+8 + || strncmp((const char *)cdir->comment->raw, TORRENT_SIG, TORRENT_SIG_LEN) != 0) return; - memcpy(buf, za->cdir->comment+TORRENT_SIG_LEN, 8); + memcpy(buf, cdir->comment->raw+TORRENT_SIG_LEN, 8); buf[8] = '\0'; errno = 0; crc_should = strtoul(buf, &end, 16); if ((crc_should == UINT_MAX && errno != 0) || (end && *end)) return; - if (_zip_filerange_crc(za->zp, za->cdir->offset, za->cdir->size, - &crc_got, NULL) < 0) + if (_zip_filerange_crc(za->zp, cdir->offset, cdir->size, &crc_got, NULL) < 0) return; if (crc_got == crc_should) @@ -383,68 +398,32 @@ _zip_check_torrentzip(struct zip *za) /* _zip_headercomp: - compares two headers h1 and h2; if they are local headers, set - local1p or local2p respectively to 1, else 0. Return 0 if they - are identical, -1 if not. */ + compares a central directory entry and a local file header + Return 0 if they are consistent, -1 if not. */ static int -_zip_headercomp(struct zip_dirent *h1, int local1p, struct zip_dirent *h2, - int local2p) +_zip_headercomp(const struct zip_dirent *central, const struct zip_dirent *local) { - if ((h1->version_needed != h2->version_needed) + if ((central->version_needed != local->version_needed) #if 0 /* some zip-files have different values in local and global headers for the bitflags */ - || (h1->bitflags != h2->bitflags) + || (central->bitflags != local->bitflags) #endif - || (h1->comp_method != h2->comp_method) - || (h1->last_mod != h2->last_mod) - || (h1->filename_len != h2->filename_len) - || !h1->filename || !h2->filename - || strcmp(h1->filename, h2->filename)) + || (central->comp_method != local->comp_method) + || (central->last_mod != local->last_mod) + || !_zip_string_equal(central->filename, local->filename)) return -1; - /* check that CRC and sizes are zero if data descriptor is used */ - if ((h1->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) && local1p - && (h1->crc != 0 - || h1->comp_size != 0 - || h1->uncomp_size != 0)) - return -1; - if ((h2->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) && local2p - && (h2->crc != 0 - || h2->comp_size != 0 - || h2->uncomp_size != 0)) - return -1; - - /* check that CRC and sizes are equal if no data descriptor is used */ - if (((h1->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) == 0 || local1p == 0) - && ((h2->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) == 0 || local2p == 0)) { - if ((h1->crc != h2->crc) - || (h1->comp_size != h2->comp_size) - || (h1->uncomp_size != h2->uncomp_size)) + + if ((central->crc != local->crc) || (central->comp_size != local->comp_size) + || (central->uncomp_size != local->uncomp_size)) { + /* InfoZip stores valid values in local header even when data descriptor is used. + This is in violation of the appnote. */ + if (((local->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) == 0 + || local->crc != 0 || local->comp_size != 0 || local->uncomp_size != 0)) return -1; } - - if ((local1p == local2p) - && ((h1->extrafield_len != h2->extrafield_len) - || (h1->extrafield_len && h2->extrafield - && memcmp(h1->extrafield, h2->extrafield, - h1->extrafield_len)))) - return -1; - - /* if either is local, nothing more to check */ - if (local1p || local2p) - return 0; - - if ((h1->version_madeby != h2->version_madeby) - || (h1->disk_number != h2->disk_number) - || (h1->int_attrib != h2->int_attrib) - || (h1->ext_attrib != h2->ext_attrib) - || (h1->offset != h2->offset) - || (h1->comment_len != h2->comment_len) - || (h1->comment_len && h2->comment - && memcmp(h1->comment, h2->comment, h1->comment_len))) - return -1; return 0; } @@ -452,7 +431,7 @@ _zip_headercomp(struct zip_dirent *h1, int local1p, struct zip_dirent *h2, static struct zip * -_zip_allocate_new(const char *fn, int *zep) +_zip_allocate_new(const char *fn, unsigned int flags, int *zep) { struct zip *za; struct zip_error error; @@ -467,18 +446,19 @@ _zip_allocate_new(const char *fn, int *zep) else { za->zn = strdup(fn); if (!za->zn) { - _zip_free(za); + zip_discard(za); set_error(zep, NULL, ZIP_ER_MEMORY); return NULL; } } + za->open_flags = flags; return za; } static int -_zip_file_exists(const char *fn, int flags, int *zep) +_zip_file_exists(const char *fn, unsigned int flags, int *zep) { struct stat st; @@ -488,7 +468,7 @@ _zip_file_exists(const char *fn, int flags, int *zep) } if (stat(fn, &st) != 0) { - if (flags & ZIP_CREATE || flags & ZIP_OVERWRITE) + if (flags & ZIP_CREATE) return 0; else { set_error(zep, NULL, ZIP_ER_OPEN); @@ -508,12 +488,14 @@ _zip_file_exists(const char *fn, int flags, int *zep) static struct zip_cdir * -_zip_find_central_dir(FILE *fp, int flags, int *zep, off_t len) +_zip_find_central_dir(FILE *fp, unsigned int flags, int *zep, off_t len) { struct zip_cdir *cdir, *cdirnew; unsigned char *buf, *match; off_t buf_offset; - int a, best, buflen, i; + size_t buflen; + zip_int64_t a, i; + zip_int64_t best; struct zip_error zerr; i = fseeko(fp, -(len < CDBUFSIZE ? len : CDBUFSIZE), SEEK_END); @@ -541,10 +523,10 @@ _zip_find_central_dir(FILE *fp, int flags, int *zep, off_t len) best = -1; cdir = NULL; - match = buf; + match = buf+ (buflen < CDBUFSIZE ? 0 : EOCD64LOCLEN); _zip_error_set(&zerr, ZIP_ER_NOZIP, 0); - while ((match=_zip_memmem(match, buflen-(match-buf)-18, + while ((match=_zip_memmem(match, buflen-(size_t)(match-buf)-(EOCDLEN-4), (const unsigned char *)EOCD_MAGIC, 4))!=NULL) { /* found match -- check, if good */ /* to avoid finding the same match all over again */ @@ -589,8 +571,7 @@ _zip_find_central_dir(FILE *fp, int flags, int *zep, off_t len) static unsigned char * -_zip_memmem(const unsigned char *big, int biglen, const unsigned char *little, - int littlelen) +_zip_memmem(const unsigned char *big, size_t biglen, const unsigned char *little, size_t littlelen) { const unsigned char *p; @@ -598,11 +579,159 @@ _zip_memmem(const unsigned char *big, int biglen, const unsigned char *little, return NULL; p = big-1; while ((p=(const unsigned char *) - memchr(p+1, little[0], (size_t)(big-(p+1)+biglen-littlelen+1))) - != NULL) { + memchr(p+1, little[0], (size_t)(big-(p+1))+(size_t)(biglen-littlelen)+1)) != NULL) { if (memcmp(p+1, little+1, littlelen-1)==0) return (unsigned char *)p; } return NULL; } + + + +static struct zip_cdir * +_zip_read_eocd(const unsigned char *eocd, const unsigned char *buf, off_t buf_offset, size_t buflen, + unsigned int flags, struct zip_error *error) +{ + struct zip_cdir *cd; + const unsigned char *cdp; + zip_uint64_t i, nentry, size, offset; + + if (eocd+EOCDLEN > buf+buflen) { + _zip_error_set(error, ZIP_ER_INCONS, 0); + return NULL; + } + + cdp = eocd + 8; + + /* number of cdir-entries on this disk */ + i = _zip_read2(&cdp); + /* number of cdir-entries */ + nentry = _zip_read2(&cdp); + + if (nentry != i) { + _zip_error_set(error, ZIP_ER_NOZIP, 0); + return NULL; + } + + size = _zip_read4(&cdp); + offset = _zip_read4(&cdp); + + if (size > ZIP_OFF_MAX || offset > ZIP_OFF_MAX || offset+size > ZIP_OFF_MAX) { + _zip_error_set(error, ZIP_ER_SEEK, EFBIG); + return NULL; + } + + if (offset+size > (zip_uint64_t)(buf_offset + (eocd-buf))) { + /* cdir spans past EOCD record */ + _zip_error_set(error, ZIP_ER_INCONS, 0); + return NULL; + } + + if ((flags & ZIP_CHECKCONS) && offset+size != (zip_uint64_t)(buf_offset + (eocd-buf))) { + _zip_error_set(error, ZIP_ER_INCONS, 0); + return NULL; + } + + if ((cd=_zip_cdir_new(nentry, error)) == NULL) + return NULL; + + cd->size = (off_t)size; + cd->offset = (off_t)offset; + + return cd; +} + + + +static struct zip_cdir * +_zip_read_eocd64(FILE *f, const zip_uint8_t *eocd64loc, const zip_uint8_t *buf, + off_t buf_offset, size_t buflen, unsigned int flags, struct zip_error *error) +{ + struct zip_cdir *cd; + zip_uint64_t offset; + const zip_uint8_t *cdp; + zip_uint8_t eocd[EOCD64LEN]; + zip_uint64_t eocd_offset; + zip_uint64_t size, nentry, i; + + cdp = eocd64loc+8; + eocd_offset = _zip_read8(&cdp); + + if (eocd_offset > ZIP_OFF_MAX || eocd_offset + EOCD64LEN > ZIP_OFF_MAX) { + _zip_error_set(error, ZIP_ER_SEEK, EFBIG); + return NULL; + } + + if (eocd64loc < buf || (off_t)eocd_offset+EOCD64LEN > (buf_offset+(eocd64loc-buf))) { + _zip_error_set(error, ZIP_ER_INCONS, 0); + return NULL; + } + + if ((off_t)eocd_offset >= buf_offset && (off_t)eocd_offset+EOCD64LEN <= buf_offset+(ssize_t)buflen) + cdp = buf+((off_t)eocd_offset-buf_offset); + else { + if (fseeko(f, (off_t)eocd_offset, SEEK_SET) != 0) { + _zip_error_set(error, ZIP_ER_SEEK, errno); + return NULL; + } + + clearerr(f); + if (fread(eocd, 1, EOCD64LEN, f) < EOCD64LEN) { + _zip_error_set(error, ZIP_ER_READ, errno); + return NULL; + } + + if (ferror(f)) { + _zip_error_set(error, ZIP_ER_READ, errno); + return NULL; + } + + cdp = eocd; + } + + if (memcmp(cdp, EOCD64_MAGIC, 4) != 0) { + _zip_error_set(error, ZIP_ER_INCONS, 0); + return NULL; + } + cdp += 4; + + size = _zip_read8(&cdp); + + if ((flags & ZIP_CHECKCONS) && size+eocd_offset+12 != (zip_uint64_t)(buf_offset+(eocd64loc-buf))) { + _zip_error_set(error, ZIP_ER_INCONS, 0); + return NULL; + } + + cdp += 4; /* skip version made by/needed */ + cdp += 8; /* skip num disks */ + + nentry = _zip_read8(&cdp); + i = _zip_read8(&cdp); + + if (nentry != i) { + _zip_error_set(error, ZIP_ER_MULTIDISK, 0); + return NULL; + } + + size = _zip_read8(&cdp); + offset = _zip_read8(&cdp); + + if (size > ZIP_OFF_MAX || offset > ZIP_OFF_MAX || offset+size > ZIP_OFF_MAX) { + _zip_error_set(error, ZIP_ER_SEEK, EFBIG); + return NULL; + } + if ((flags & ZIP_CHECKCONS) && offset+size != eocd_offset) { + _zip_error_set(error, ZIP_ER_INCONS, 0); + return NULL; + } + + if ((cd=_zip_cdir_new(nentry, error)) == NULL) + return NULL; + + + cd->size = (off_t)size; + cd->offset = (off_t)offset; + + return cd; +} diff --git a/ext/zip/lib/zip_rename.c b/ext/zip/lib/zip_rename.c index 6b5a0359172da..8841caeca9a9e 100644 --- a/ext/zip/lib/zip_rename.c +++ b/ext/zip/lib/zip_rename.c @@ -1,6 +1,6 @@ /* zip_rename.c -- rename file in zip archive - Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -35,36 +35,13 @@ #include +#define _ZIP_COMPILING_DEPRECATED #include "zipint.h" -ZIP_EXTERN(int) +ZIP_EXTERN int zip_rename(struct zip *za, zip_uint64_t idx, const char *name) { - const char *old_name; - int old_is_dir, new_is_dir; - - if (idx >= za->nentry || name[0] == '\0') { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); - return -1; - } - - if (ZIP_IS_RDONLY(za)) { - _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); - return -1; - } - - if ((old_name=zip_get_name(za, idx, 0)) == NULL) - return -1; - - new_is_dir = (name[strlen(name)-1] == '/'); - old_is_dir = (old_name[strlen(old_name)-1] == '/'); - - if (new_is_dir != old_is_dir) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); - return -1; - } - - return _zip_set_name(za, idx, name); + return zip_file_rename(za, idx, name, 0); } diff --git a/ext/zip/lib/zip_replace.c b/ext/zip/lib/zip_replace.c index 6dc3dd5ab508f..de717afec7dd1 100644 --- a/ext/zip/lib/zip_replace.c +++ b/ext/zip/lib/zip_replace.c @@ -1,6 +1,6 @@ /* zip_replace.c -- replace file via callback function - Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -33,53 +33,13 @@ +#define _ZIP_COMPILING_DEPRECATED #include "zipint.h" -ZIP_EXTERN(int) +ZIP_EXTERN int zip_replace(struct zip *za, zip_uint64_t idx, struct zip_source *source) { - if (idx >= za->nentry || source == NULL) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); - return -1; - } - - if (_zip_replace(za, idx, NULL, source) == -1) - return -1; - - return 0; -} - - - - -/* NOTE: Signed due to -1 on error. See zip_add.c for more details. */ - -zip_int64_t -_zip_replace(struct zip *za, zip_uint64_t idx, const char *name, - struct zip_source *source) -{ - if (ZIP_IS_RDONLY(za)) { - _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); - return -1; - } - - if (idx == ZIP_UINT64_MAX) { - if (_zip_entry_new(za) == NULL) - return -1; - - idx = za->nentry - 1; - } - - _zip_unchange_data(za->entry+idx); - - if (name && _zip_set_name(za, idx, name) != 0) - return -1; - - za->entry[idx].state = ((za->cdir == NULL || idx >= za->cdir->nentry) - ? ZIP_ST_ADDED : ZIP_ST_REPLACED); - za->entry[idx].source = source; - - return idx; + return zip_file_replace(za, idx, source, 0); } diff --git a/ext/zip/lib/zip_set_archive_comment.c b/ext/zip/lib/zip_set_archive_comment.c index 3cd069c7577c9..df1caee06b116 100644 --- a/ext/zip/lib/zip_set_archive_comment.c +++ b/ext/zip/lib/zip_set_archive_comment.c @@ -1,6 +1,6 @@ /* zip_set_archive_comment.c -- set archive comment - Copyright (C) 2006-2009 Dieter Baron and Thomas Klausner + Copyright (C) 2006-2013 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -39,32 +39,46 @@ -ZIP_EXTERN(int) -zip_set_archive_comment(struct zip *za, const char *comment, int len) +ZIP_EXTERN int +zip_set_archive_comment(struct zip *za, const char *comment, zip_uint16_t len) { - char *tmpcom; + struct zip_string *cstr; - if (len < 0 || len > MAXCOMLEN - || (len > 0 && comment == NULL)) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + if (ZIP_IS_RDONLY(za)) { + _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); return -1; } - if (ZIP_IS_RDONLY(za)) { - _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + if (len > 0 && comment == NULL) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } if (len > 0) { - if ((tmpcom=(char *)_zip_memdup(comment, len, &za->error)) == NULL) + if ((cstr=_zip_string_new((const zip_uint8_t *)comment, len, ZIP_FL_ENC_GUESS, &za->error)) == NULL) return -1; + + if (_zip_guess_encoding(cstr, ZIP_ENCODING_UNKNOWN) == ZIP_ENCODING_CP437) { + _zip_string_free(cstr); + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } } else - tmpcom = NULL; + cstr = NULL; + + _zip_string_free(za->comment_changes); + za->comment_changes = NULL; - free(za->ch_comment); - za->ch_comment = tmpcom; - za->ch_comment_len = len; + if (((za->comment_orig && _zip_string_equal(za->comment_orig, cstr)) + || (za->comment_orig == NULL && cstr == NULL))) { + _zip_string_free(cstr); + za->comment_changed = 0; + } + else { + za->comment_changes = cstr; + za->comment_changed = 1; + } return 0; } diff --git a/ext/zip/lib/zip_set_archive_flag.c b/ext/zip/lib/zip_set_archive_flag.c index 07bcfbe304d85..b6cdab120ddb2 100644 --- a/ext/zip/lib/zip_set_archive_flag.c +++ b/ext/zip/lib/zip_set_archive_flag.c @@ -37,8 +37,8 @@ -ZIP_EXTERN(int) -zip_set_archive_flag(struct zip *za, int flag, int value) +ZIP_EXTERN int +zip_set_archive_flag(struct zip *za, unsigned int flag, int value) { unsigned int new_flags; diff --git a/ext/zip/lib/zip_set_default_password.c b/ext/zip/lib/zip_set_default_password.c index c274d1100bb3a..b9aa80acffc25 100644 --- a/ext/zip/lib/zip_set_default_password.c +++ b/ext/zip/lib/zip_set_default_password.c @@ -40,7 +40,7 @@ -ZIP_EXTERN(int) +ZIP_EXTERN int zip_set_default_password(struct zip *za, const char *passwd) { if (za == NULL) diff --git a/ext/zip/lib/zip_set_file_comment.c b/ext/zip/lib/zip_set_file_comment.c index 5e63dc2730ad4..7acd0eb36de29 100644 --- a/ext/zip/lib/zip_set_file_comment.c +++ b/ext/zip/lib/zip_set_file_comment.c @@ -1,6 +1,6 @@ /* zip_set_file_comment.c -- set comment for file in archive - Copyright (C) 2006-2009 Dieter Baron and Thomas Klausner + Copyright (C) 2006-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -35,38 +35,17 @@ #include +#define _ZIP_COMPILING_DEPRECATED #include "zipint.h" -ZIP_EXTERN(int) -zip_set_file_comment(struct zip *za, zip_uint64_t idx, - const char *comment, int len) +ZIP_EXTERN int +zip_set_file_comment(struct zip *za, zip_uint64_t idx, const char *comment, int len) { - char *tmpcom; - - if (idx >= za->nentry - || len < 0 || len > MAXCOMLEN - || (len > 0 && comment == NULL)) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); - return -1; - } - - if (ZIP_IS_RDONLY(za)) { - _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); - return -1; + if (len < 0 || len > ZIP_UINT16_MAX) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; } - - if (len > 0) { - if ((tmpcom=(char *)_zip_memdup(comment, len, &za->error)) == NULL) - return -1; - } - else - tmpcom = NULL; - - free(za->entry[idx].ch_comment); - za->entry[idx].ch_comment = tmpcom; - za->entry[idx].ch_comment_len = len; - - return 0; + return zip_file_set_comment(za, idx, comment, (zip_uint16_t)len, 0); } diff --git a/ext/zip/lib/zip_set_file_compression.c b/ext/zip/lib/zip_set_file_compression.c new file mode 100644 index 0000000000000..ea8517d70e602 --- /dev/null +++ b/ext/zip/lib/zip_set_file_compression.c @@ -0,0 +1,90 @@ +/* + zip_set_file_compression.c -- set compression for file in archive + Copyright (C) 2012 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + + +#include "zipint.h" + + + +ZIP_EXTERN int +zip_set_file_compression(struct zip *za, zip_uint64_t idx, + zip_int32_t method, zip_uint32_t flags) +{ + struct zip_entry *e; + zip_int32_t old_method; + + if (idx >= za->nentry) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (ZIP_IS_RDONLY(za)) { + _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + if (method != ZIP_CM_DEFAULT && method != ZIP_CM_STORE && method != ZIP_CM_DEFLATE) { + _zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0); + return -1; + } + + e = za->entry+idx; + + old_method = (e->orig == NULL ? ZIP_CM_DEFAULT : e->orig->comp_method); + + /* XXX: revisit this when flags are supported, since they may require a recompression */ + + if (method == old_method) { + if (e->changes) { + e->changes->changed &= ~ZIP_DIRENT_COMP_METHOD; + if (e->changes->changed == 0) { + _zip_dirent_free(e->changes); + e->changes = NULL; + } + } + } + else { + if (e->changes == NULL) { + if ((e->changes=_zip_dirent_clone(e->orig)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + } + + e->changes->comp_method = method; + e->changes->changed |= ZIP_DIRENT_COMP_METHOD; + } + + return 0; +} diff --git a/ext/zip/lib/zip_set_name.c b/ext/zip/lib/zip_set_name.c index 2a90601bfec35..60c9e7d5bf59a 100644 --- a/ext/zip/lib/zip_set_name.c +++ b/ext/zip/lib/zip_set_name.c @@ -1,6 +1,6 @@ /* zip_set_name.c -- rename helper function - Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -41,35 +41,77 @@ int -_zip_set_name(struct zip *za, zip_uint64_t idx, const char *name) +_zip_set_name(struct zip *za, zip_uint64_t idx, const char *name, zip_flags_t flags) { - char *s; + struct zip_entry *e; + struct zip_string *str; + int changed; zip_int64_t i; - - if (idx >= za->nentry || name == NULL) { + + if (idx >= za->nentry) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } - if ((i=_zip_name_locate(za, name, 0, NULL)) != -1 && i != idx) { + if (ZIP_IS_RDONLY(za)) { + _zip_error_set(&za->error, ZIP_ER_RDONLY, 0); + return -1; + } + + if (name && strlen(name) > 0) { + /* XXX: check for string too long */ + if ((str=_zip_string_new((const zip_uint8_t *)name, (zip_uint16_t)strlen(name), flags, &za->error)) == NULL) + return -1; + if ((flags & ZIP_FL_ENCODING_ALL) == ZIP_FL_ENC_GUESS && _zip_guess_encoding(str, ZIP_ENCODING_UNKNOWN) == ZIP_ENCODING_UTF8_GUESSED) + str->encoding = ZIP_ENCODING_UTF8_KNOWN; + } + else + str = NULL; + + /* XXX: encoding flags needed for CP437? */ + if ((i=_zip_name_locate(za, name, 0, NULL)) >= 0 && (zip_uint64_t)i != idx) { + _zip_string_free(str); _zip_error_set(&za->error, ZIP_ER_EXISTS, 0); return -1; } /* no effective name change */ - if (i == idx) + if (i>=0 && (zip_uint64_t)i == idx) { + _zip_string_free(str); return 0; - - if ((s=strdup(name)) == NULL) { - _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); - return -1; } - - if (za->entry[idx].state == ZIP_ST_UNCHANGED) - za->entry[idx].state = ZIP_ST_RENAMED; - free(za->entry[idx].ch_filename); - za->entry[idx].ch_filename = s; + e = za->entry+idx; + + if (e->changes) { + _zip_string_free(e->changes->filename); + e->changes->filename = NULL; + e->changes->changed &= ~ZIP_DIRENT_FILENAME; + } + + if (e->orig) + changed = !_zip_string_equal(e->orig->filename, str); + else + changed = 1; + + if (changed) { + if (e->changes == NULL) { + if ((e->changes=_zip_dirent_clone(e->orig)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + _zip_string_free(str); + return -1; + } + } + e->changes->filename = str; + e->changes->changed |= ZIP_DIRENT_FILENAME; + } + else { + _zip_string_free(str); + if (e->changes && e->changes->changed == 0) { + _zip_dirent_free(e->changes); + e->changes = NULL; + } + } return 0; } diff --git a/ext/zip/lib/zip_source_buffer.c b/ext/zip/lib/zip_source_buffer.c index 8c9154ce3c5ba..8a13e7602d195 100644 --- a/ext/zip/lib/zip_source_buffer.c +++ b/ext/zip/lib/zip_source_buffer.c @@ -48,7 +48,7 @@ static zip_int64_t read_data(void *, void *, zip_uint64_t, enum zip_source_cmd); -ZIP_EXTERN(struct zip_source *) +ZIP_EXTERN struct zip_source * zip_source_buffer(struct zip *za, const void *data, zip_uint64_t len, int freep) { struct read_data *f; @@ -98,9 +98,7 @@ read_data(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd) return 0; case ZIP_SOURCE_READ: - /* XXX: return error if (len > ZIP_INT64_MAX) */ - - n = z->end - z->buf; + n = (zip_uint64_t)(z->end - z->buf); if (n > len) n = len; @@ -109,7 +107,7 @@ read_data(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd) z->buf += n; } - return n; + return (zip_int64_t)n; case ZIP_SOURCE_CLOSE: return 0; @@ -125,7 +123,7 @@ read_data(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd) zip_stat_init(st); st->mtime = z->mtime; - st->size = z->end - z->data; + st->size = (zip_uint64_t)(z->end - z->data); st->comp_size = st->size; st->comp_method = ZIP_CM_STORE; st->encryption_method = ZIP_EM_NONE; diff --git a/ext/zip/lib/zip_source_close.c b/ext/zip/lib/zip_source_close.c index a3bf7e5e1d9bd..7b89d5fc15f68 100644 --- a/ext/zip/lib/zip_source_close.c +++ b/ext/zip/lib/zip_source_close.c @@ -37,7 +37,7 @@ -ZIP_EXTERN(void) +void zip_source_close(struct zip_source *src) { if (!src->is_open) diff --git a/ext/zip/lib/zip_source_crc.c b/ext/zip/lib/zip_source_crc.c index 7fd78f56970cf..99bc965228898 100644 --- a/ext/zip/lib/zip_source_crc.c +++ b/ext/zip/lib/zip_source_crc.c @@ -38,7 +38,7 @@ #include "zipint.h" -struct crc { +struct crc_context { int eof; int validate; int e[2]; @@ -51,23 +51,27 @@ static zip_int64_t crc_read(struct zip_source *, void *, void * -ZIP_EXTERN(struct zip_source *) +struct zip_source * zip_source_crc(struct zip *za, struct zip_source *src, int validate) { - struct crc *ctx; + struct crc_context *ctx; if (src == NULL) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return NULL; } - if ((ctx=(struct crc *)malloc(sizeof(*ctx))) == NULL) { + if ((ctx=(struct crc_context *)malloc(sizeof(*ctx))) == NULL) { _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return NULL; } + ctx->eof = 0; ctx->validate = validate; - + ctx->e[0] = ctx->e[1] = 0; + ctx->size = 0; + ctx->crc = 0; + return zip_source_layered(za, src, crc_read, ctx); } @@ -77,15 +81,15 @@ static zip_int64_t crc_read(struct zip_source *src, void *_ctx, void *data, zip_uint64_t len, enum zip_source_cmd cmd) { - struct crc *ctx; + struct crc_context *ctx; zip_int64_t n; - ctx = (struct crc *)_ctx; + ctx = (struct crc_context *)_ctx; switch (cmd) { case ZIP_SOURCE_OPEN: ctx->eof = 0; - ctx->crc = crc32(0, NULL, 0); + ctx->crc = (zip_uint32_t)crc32(0, NULL, 0); ctx->size = 0; return 0; @@ -120,8 +124,8 @@ crc_read(struct zip_source *src, void *_ctx, void *data, } } else { - ctx->size += n; - ctx->crc = crc32(ctx->crc, data, n); + ctx->size += (zip_uint64_t)n; + ctx->crc = (zip_uint32_t)crc32(ctx->crc, (const Bytef *)data, (uInt)n); /* XXX: check for overflow, use multiple crc calls if needed */ } return n; @@ -139,7 +143,10 @@ crc_read(struct zip_source *src, void *_ctx, void *data, After all, this only works for uncompressed data. */ st->size = ctx->size; st->crc = ctx->crc; - st->valid |= ZIP_STAT_SIZE|ZIP_STAT_CRC; + st->comp_size = ctx->size; + st->comp_method = ZIP_CM_STORE; + st->encryption_method = ZIP_EM_NONE; + st->valid |= ZIP_STAT_SIZE|ZIP_STAT_CRC|ZIP_STAT_COMP_SIZE|ZIP_STAT_COMP_METHOD|ZIP_STAT_ENCRYPTION_METHOD;; } } return 0; diff --git a/ext/zip/lib/zip_source_deflate.c b/ext/zip/lib/zip_source_deflate.c index 5d9c5e67bb605..879953144ce56 100644 --- a/ext/zip/lib/zip_source_deflate.c +++ b/ext/zip/lib/zip_source_deflate.c @@ -60,14 +60,14 @@ static void deflate_free(struct deflate *); -ZIP_EXTERN(struct zip_source *) +struct zip_source * zip_source_deflate(struct zip *za, struct zip_source *src, - zip_uint16_t cm, int flags) + zip_int32_t cm, int flags) { struct deflate *ctx; struct zip_source *s2; - if (src == NULL || cm != ZIP_CM_DEFLATE) { + if (src == NULL || (cm != ZIP_CM_DEFLATE && !ZIP_CM_IS_DEFAULT(cm))) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return NULL; } @@ -113,7 +113,7 @@ compress_read(struct zip_source *src, struct deflate *ctx, return 0; ctx->zstr.next_out = (Bytef *)data; - ctx->zstr.avail_out = len; + ctx->zstr.avail_out = (uInt)len; /* XXX: check for overflow */ end = 0; while (!end) { @@ -136,8 +136,7 @@ compress_read(struct zip_source *src, struct deflate *ctx, break; } - if ((n=zip_source_read(src, ctx->buffer, - sizeof(ctx->buffer))) < 0) { + if ((n=zip_source_read(src, ctx->buffer, sizeof(ctx->buffer))) < 0) { zip_source_error(src, ctx->e, ctx->e+1); end = 1; break; @@ -149,7 +148,7 @@ compress_read(struct zip_source *src, struct deflate *ctx, } else { ctx->zstr.next_in = (Bytef *)ctx->buffer; - ctx->zstr.avail_in = n; + ctx->zstr.avail_in = (uInt)n; } continue; } @@ -167,7 +166,7 @@ compress_read(struct zip_source *src, struct deflate *ctx, } if (ctx->zstr.avail_out < len) - return len - ctx->zstr.avail_out; + return (zip_int64_t)(len - ctx->zstr.avail_out); return (ctx->e[0] == 0) ? 0 : -1; } @@ -188,7 +187,7 @@ decompress_read(struct zip_source *src, struct deflate *ctx, return 0; ctx->zstr.next_out = (Bytef *)data; - ctx->zstr.avail_out = len; + ctx->zstr.avail_out = (uInt)len; /* XXX: check for overflow */ end = 0; while (!end && ctx->zstr.avail_out) { @@ -210,8 +209,7 @@ decompress_read(struct zip_source *src, struct deflate *ctx, break; } - if ((n=zip_source_read(src, ctx->buffer, - sizeof(ctx->buffer))) < 0) { + if ((n=zip_source_read(src, ctx->buffer, sizeof(ctx->buffer))) < 0) { zip_source_error(src, ctx->e, ctx->e+1); end = 1; break; @@ -220,7 +218,7 @@ decompress_read(struct zip_source *src, struct deflate *ctx, ctx->eof = 1; else { ctx->zstr.next_in = (Bytef *)ctx->buffer; - ctx->zstr.avail_in = n; + ctx->zstr.avail_in = (uInt)n; } continue; } @@ -237,7 +235,7 @@ decompress_read(struct zip_source *src, struct deflate *ctx, } if (ctx->zstr.avail_out < len) - return len - ctx->zstr.avail_out; + return (zip_int64_t)(len - ctx->zstr.avail_out); return (ctx->e[0] == 0) ? 0 : -1; } @@ -334,7 +332,7 @@ deflate_decompress(struct zip_source *src, void *ud, void *data, ctx->zstr.zfree = Z_NULL; ctx->zstr.opaque = NULL; ctx->zstr.next_in = (Bytef *)ctx->buffer; - ctx->zstr.avail_in = n; + ctx->zstr.avail_in = (uInt)n /* XXX: check for overflow */; /* negative value to tell zlib that there is no header */ if ((ret=inflateInit2(&ctx->zstr, -MAX_WBITS)) != Z_OK) { diff --git a/ext/zip/lib/zip_source_error.c b/ext/zip/lib/zip_source_error.c index 70ec8bc5d452f..a1efd551ea3dd 100644 --- a/ext/zip/lib/zip_source_error.c +++ b/ext/zip/lib/zip_source_error.c @@ -1,6 +1,6 @@ /* zip_source_error.c -- get last error from zip_source - Copyright (C) 2009 Dieter Baron and Thomas Klausner + Copyright (C) 2009-2013 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -37,24 +37,21 @@ -ZIP_EXTERN(void) +void zip_source_error(struct zip_source *src, int *ze, int *se) { - int e[2] = { 0, 0 }; + int e[2]; if (src->src == NULL) { + if (src->cb.f(src->ud, e, sizeof(e), ZIP_SOURCE_ERROR) < 0) { + e[0] = ZIP_ER_INTERNAL; + e[1] = 0; + } } else { switch (src->error_source) { case ZIP_LES_NONE: - if (src->src == NULL) { - if (src->cb.f(src->ud, e, sizeof(e), ZIP_SOURCE_ERROR) < 0) { - e[0] = ZIP_ER_INTERNAL; - e[1] = 0; - } - } - else - e[0] = e[1] = 0; + e[0] = e[1] = 0; break; case ZIP_LES_INVAL: @@ -67,8 +64,7 @@ zip_source_error(struct zip_source *src, int *ze, int *se) return; case ZIP_LES_UPPER: - if (src->cb.l(src->src, src->ud, e, sizeof(e), - ZIP_SOURCE_ERROR) < 0) { + if (src->cb.l(src->src, src->ud, e, sizeof(e), ZIP_SOURCE_ERROR) < 0) { e[0] = ZIP_ER_INTERNAL; e[1] = 0; } @@ -77,6 +73,7 @@ zip_source_error(struct zip_source *src, int *ze, int *se) default: e[0] = ZIP_ER_INTERNAL; e[1] = 0; + break; } } diff --git a/ext/zip/lib/zip_source_file.c b/ext/zip/lib/zip_source_file.c index 681cc2f3ea643..79c8ee5aca22b 100644 --- a/ext/zip/lib/zip_source_file.c +++ b/ext/zip/lib/zip_source_file.c @@ -40,7 +40,7 @@ -ZIP_EXTERN(struct zip_source *) +ZIP_EXTERN struct zip_source * zip_source_file(struct zip *za, const char *fname, zip_uint64_t start, zip_int64_t len) { diff --git a/ext/zip/lib/zip_source_filep.c b/ext/zip/lib/zip_source_filep.c index 4d896a4c01bfc..0bd2d6846e5a3 100644 --- a/ext/zip/lib/zip_source_filep.c +++ b/ext/zip/lib/zip_source_filep.c @@ -58,14 +58,14 @@ static zip_int64_t read_file(void *state, void *data, zip_uint64_t len, -ZIP_EXTERN(struct zip_source *) +ZIP_EXTERN struct zip_source * zip_source_filep(struct zip *za, FILE *file, zip_uint64_t start, zip_int64_t len) { if (za == NULL) return NULL; - if (file == NULL || start < 0 || len < -1) { + if (file == NULL || len < -1) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return NULL; } @@ -125,7 +125,7 @@ read_file(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd) { struct read_file *z; char *buf; - int i, n; + size_t i, n; z = (struct read_file *)state; buf = (char *)data; @@ -140,7 +140,7 @@ read_file(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd) } } - if (z->closep) { + if (z->closep && z->off > 0) { if (fseeko(z->f, (off_t)z->off, SEEK_SET) < 0) { z->e[0] = ZIP_ER_SEEK; z->e[1] = errno; @@ -153,30 +153,31 @@ read_file(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd) case ZIP_SOURCE_READ: /* XXX: return INVAL if len > size_t max */ if (z->remain != -1) - n = len > z->remain ? z->remain : len; + n = len > (zip_uint64_t)z->remain ? (zip_uint64_t)z->remain : len; else n = len; if (!z->closep) { /* we might share this file with others, so let's be safe */ - if (fseeko(z->f, (off_t)(z->off + z->len-z->remain), - SEEK_SET) < 0) { + if (fseeko(z->f, (off_t)(z->off + (zip_uint64_t)(z->len-z->remain)), SEEK_SET) < 0) { z->e[0] = ZIP_ER_SEEK; z->e[1] = errno; return -1; } } - if ((i=fread(buf, 1, n, z->f)) < 0) { - z->e[0] = ZIP_ER_READ; - z->e[1] = errno; - return -1; + if ((i=fread(buf, 1, n, z->f)) == 0) { + if (ferror(z->f)) { + z->e[0] = ZIP_ER_READ; + z->e[1] = errno; + return -1; + } } if (z->remain != -1) z->remain -= i; - return i; + return (zip_int64_t)i; case ZIP_SOURCE_CLOSE: if (z->fname) { @@ -214,11 +215,11 @@ read_file(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd) st->mtime = fst.st_mtime; st->valid |= ZIP_STAT_MTIME; if (z->len != -1) { - st->size = z->len; + st->size = (zip_uint64_t)z->len; st->valid |= ZIP_STAT_SIZE; } else if ((fst.st_mode&S_IFMT) == S_IFREG) { - st->size = fst.st_size; + st->size = (zip_uint64_t)fst.st_size; st->valid |= ZIP_STAT_SIZE; } } diff --git a/ext/zip/lib/zip_source_free.c b/ext/zip/lib/zip_source_free.c index f71c71ed6c577..b1e78404965c2 100644 --- a/ext/zip/lib/zip_source_free.c +++ b/ext/zip/lib/zip_source_free.c @@ -39,7 +39,7 @@ -ZIP_EXTERN(void) +ZIP_EXTERN void zip_source_free(struct zip_source *src) { if (src == NULL) diff --git a/ext/zip/lib/zip_source_function.c b/ext/zip/lib/zip_source_function.c index 984b107f7baa6..cb92e339b4bb2 100644 --- a/ext/zip/lib/zip_source_function.c +++ b/ext/zip/lib/zip_source_function.c @@ -39,7 +39,7 @@ -ZIP_EXTERN(struct zip_source *) +ZIP_EXTERN struct zip_source * zip_source_function(struct zip *za, zip_source_callback zcb, void *ud) { struct zip_source *zs; diff --git a/ext/zip/lib/zip_source_layered.c b/ext/zip/lib/zip_source_layered.c index 86ed420407071..ad2870333cdee 100644 --- a/ext/zip/lib/zip_source_layered.c +++ b/ext/zip/lib/zip_source_layered.c @@ -39,7 +39,7 @@ -ZIP_EXTERN(struct zip_source *) +struct zip_source * zip_source_layered(struct zip *za, struct zip_source *src, zip_source_layered_callback cb, void *ud) { diff --git a/ext/zip/lib/zip_source_open.c b/ext/zip/lib/zip_source_open.c index 2c768f7f3a4e5..a5010393e7b9c 100644 --- a/ext/zip/lib/zip_source_open.c +++ b/ext/zip/lib/zip_source_open.c @@ -1,6 +1,6 @@ /* zip_source_open.c -- open zip_source (prepare for reading) - Copyright (C) 2009 Dieter Baron and Thomas Klausner + Copyright (C) 2009-2013 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -37,7 +37,7 @@ -ZIP_EXTERN(int) +int zip_source_open(struct zip_source *src) { zip_int64_t ret; @@ -60,7 +60,7 @@ zip_source_open(struct zip_source *src) ret = src->cb.l(src->src, src->ud, NULL, 0, ZIP_SOURCE_OPEN); if (ret < 0) { - (void)zip_source_close(src->src); + zip_source_close(src->src); if (ret == ZIP_SOURCE_ERR_LOWER) src->error_source = ZIP_LES_LOWER; diff --git a/ext/zip/lib/zip_source_pkware.c b/ext/zip/lib/zip_source_pkware.c index 83b5cc5ad5b22..ec53dfeef0468 100644 --- a/ext/zip/lib/zip_source_pkware.c +++ b/ext/zip/lib/zip_source_pkware.c @@ -49,10 +49,6 @@ struct trad_pkware { #define KEY1 591751049 #define KEY2 878082192 -static const uLongf *crc = NULL; - -#define CRC32(c, b) (crc[((c) ^ (b)) & 0xff] ^ ((c) >> 8)) - static void decrypt(struct trad_pkware *, zip_uint8_t *, @@ -64,7 +60,7 @@ static void pkware_free(struct trad_pkware *); -ZIP_EXTERN(struct zip_source *) +struct zip_source * zip_source_pkware(struct zip *za, struct zip_source *src, zip_uint16_t em, int flags, const char *password) { @@ -80,9 +76,6 @@ zip_source_pkware(struct zip *za, struct zip_source *src, return NULL; } - if (crc == NULL) - crc = get_crc_table(); - if ((ctx=(struct trad_pkware *)malloc(sizeof(*ctx))) == NULL) { _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); return NULL; @@ -118,7 +111,7 @@ decrypt(struct trad_pkware *ctx, zip_uint8_t *out, const zip_uint8_t *in, if (!update_only) { /* decrypt next byte */ - tmp = ctx->key[2] | 2; + tmp = (zip_uint16_t)(ctx->key[2] | 2); tmp = (tmp * (tmp ^ 1)) >> 8; b ^= tmp; } @@ -128,10 +121,10 @@ decrypt(struct trad_pkware *ctx, zip_uint8_t *out, const zip_uint8_t *in, out[i] = b; /* update keys */ - ctx->key[0] = CRC32(ctx->key[0], b); + ctx->key[0] = (zip_uint32_t)crc32(ctx->key[0] ^ 0xffffffffUL, &b, 1) ^ 0xffffffffUL; ctx->key[1] = (ctx->key[1] + (ctx->key[0] & 0xff)) * 134775813 + 1; b = ctx->key[1] >> 24; - ctx->key[2] = CRC32(ctx->key[2], b); + ctx->key[2] = (zip_uint32_t)crc32(ctx->key[2] ^ 0xffffffffUL, &b, 1) ^ 0xffffffffUL; } } @@ -196,7 +189,7 @@ pkware_decrypt(struct zip_source *src, void *ud, void *data, if ((n=zip_source_read(src, data, len)) < 0) return ZIP_SOURCE_ERR_LOWER; - decrypt(ud, (zip_uint8_t *)data, (zip_uint8_t *)data, (zip_uint64_t)n, + decrypt((struct trad_pkware *)ud, (zip_uint8_t *)data, (zip_uint8_t *)data, (zip_uint64_t)n, 0); return n; diff --git a/ext/zip/lib/zip_source_pop.c b/ext/zip/lib/zip_source_pop.c index 406093869b962..cd9cb529b5cc7 100644 --- a/ext/zip/lib/zip_source_pop.c +++ b/ext/zip/lib/zip_source_pop.c @@ -39,7 +39,7 @@ -ZIP_EXTERN(struct zip_source *) +struct zip_source * zip_source_pop(struct zip_source *src) { struct zip_source *lower; diff --git a/ext/zip/lib/zip_source_read.c b/ext/zip/lib/zip_source_read.c index 7246f9ccb5367..81b90ba42de35 100644 --- a/ext/zip/lib/zip_source_read.c +++ b/ext/zip/lib/zip_source_read.c @@ -37,7 +37,7 @@ -ZIP_EXTERN(zip_int64_t) +zip_int64_t zip_source_read(struct zip_source *src, void *data, zip_uint64_t len) { zip_int64_t ret; diff --git a/ext/zip/lib/zip_source_stat.c b/ext/zip/lib/zip_source_stat.c index 662779eb6cfba..85ae6a2fd6a26 100644 --- a/ext/zip/lib/zip_source_stat.c +++ b/ext/zip/lib/zip_source_stat.c @@ -37,7 +37,7 @@ -ZIP_EXTERN(int) +int zip_source_stat(struct zip_source *src, struct zip_stat *st) { zip_int64_t ret; diff --git a/ext/zip/lib/zip_source_window.c b/ext/zip/lib/zip_source_window.c new file mode 100644 index 0000000000000..fd202099b5aa8 --- /dev/null +++ b/ext/zip/lib/zip_source_window.c @@ -0,0 +1,150 @@ +/* + zip_source_window.c -- return part of lower source + Copyright (C) 2012-2013 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + + +#include +#include + +#include "zipint.h" + +struct window { + zip_uint64_t skip; + zip_uint64_t len; + zip_uint64_t left; + int e[2]; +}; + +static zip_int64_t window_read(struct zip_source *, void *, void *, + zip_uint64_t, enum zip_source_cmd); + + + +struct zip_source * +zip_source_window(struct zip *za, struct zip_source *src, zip_uint64_t start, zip_uint64_t len) +{ + struct window *ctx; + + if (src == NULL) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((ctx=(struct window *)malloc(sizeof(*ctx))) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + + ctx->skip = start; + ctx->len = len; + ctx->left = len; + + return zip_source_layered(za, src, window_read, ctx); +} + + + +static zip_int64_t +window_read(struct zip_source *src, void *_ctx, void *data, + zip_uint64_t len, enum zip_source_cmd cmd) +{ + struct window *ctx; + zip_int64_t ret; + zip_uint64_t n, i; + char b[8192]; + + ctx = (struct window *)_ctx; + + switch (cmd) { + case ZIP_SOURCE_OPEN: + for (n=0; nskip; n+=(zip_uint64_t)ret) { + i = (ctx->skip-n > sizeof(b) ? sizeof(b) : ctx->skip-n); + if ((ret=zip_source_read(src, b, i)) < 0) + return ZIP_SOURCE_ERR_LOWER; + if (ret==0) { + ctx->e[0] = ZIP_ER_EOF; + ctx->e[1] = 0; + return -1; + } + } + return 0; + + case ZIP_SOURCE_READ: + if (len > ctx->left) + len = ctx->left; + + if (len == 0) + return 0; + + if ((ret=zip_source_read(src, data, len)) < 0) + return ZIP_SOURCE_ERR_LOWER; + + ctx->left -= (zip_uint64_t)ret; + + if (ret == 0) { + if (ctx->left > 0) { + ctx->e[0] = ZIP_ER_EOF; + ctx->e[1] = 0; + return -1; + } + } + return ret; + + case ZIP_SOURCE_CLOSE: + return 0; + + case ZIP_SOURCE_STAT: + { + struct zip_stat *st; + + st = (struct zip_stat *)data; + + st->size = ctx->len; + st->valid |= ZIP_STAT_SIZE; + st->valid &= ~(ZIP_STAT_CRC|ZIP_STAT_COMP_SIZE); + } + return 0; + + case ZIP_SOURCE_ERROR: + memcpy(data, ctx->e, sizeof(ctx->e)); + return 0; + + case ZIP_SOURCE_FREE: + free(ctx); + return 0; + + default: + return -1; + } + +} diff --git a/ext/zip/lib/zip_source_zip.c b/ext/zip/lib/zip_source_zip.c index 228803c717f6a..e4fc2229f782c 100644 --- a/ext/zip/lib/zip_source_zip.c +++ b/ext/zip/lib/zip_source_zip.c @@ -38,153 +38,24 @@ #include "zipint.h" -struct read_zip { - struct zip_file *zf; - struct zip_stat st; - zip_uint64_t off; - zip_int64_t len; -}; - -static zip_int64_t read_zip(void *st, void *data, zip_uint64_t len, - enum zip_source_cmd cmd); - -ZIP_EXTERN(struct zip_source *) +ZIP_EXTERN struct zip_source * zip_source_zip(struct zip *za, struct zip *srcza, zip_uint64_t srcidx, - int flags, zip_uint64_t start, zip_int64_t len) + zip_flags_t flags, zip_uint64_t start, zip_int64_t len) { - struct zip_error error; - struct zip_source *zs; - struct read_zip *p; - - /* XXX: ZIP_FL_RECOMPRESS */ - - if (za == NULL) - return NULL; - - if (srcza == NULL || len < -1 || srcidx < 0 || srcidx >= srcza->nentry) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); - return NULL; + if (len < -1) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; } - - if ((flags & ZIP_FL_UNCHANGED) == 0 - && ZIP_ENTRY_DATA_CHANGED(srcza->entry+srcidx)) { - _zip_error_set(&za->error, ZIP_ER_CHANGED, 0); - return NULL; - } - - if (len == 0) - len = -1; - - if (start == 0 && len == -1 && (flags & ZIP_FL_RECOMPRESS) == 0) + + if (len == -1) + len = 0; + + if (start == 0 && len == 0) flags |= ZIP_FL_COMPRESSED; else flags &= ~ZIP_FL_COMPRESSED; - if ((p=(struct read_zip *)malloc(sizeof(*p))) == NULL) { - _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); - return NULL; - } - - _zip_error_copy(&error, &srcza->error); - - if (zip_stat_index(srcza, srcidx, flags, &p->st) < 0 - || (p->zf=zip_fopen_index(srcza, srcidx, flags)) == NULL) { - free(p); - _zip_error_copy(&za->error, &srcza->error); - _zip_error_copy(&srcza->error, &error); - - return NULL; - } - p->off = start; - p->len = len; - - if ((flags & ZIP_FL_COMPRESSED) == 0) { - p->st.size = p->st.comp_size = len; - p->st.comp_method = ZIP_CM_STORE; - p->st.crc = 0; - } - - if ((zs=zip_source_function(za, read_zip, p)) == NULL) { - free(p); - return NULL; - } - - return zs; -} - - - -static zip_int64_t -read_zip(void *state, void *data, zip_uint64_t len, enum zip_source_cmd cmd) -{ - struct read_zip *z; - char b[8192], *buf; - int i; - zip_uint64_t n; - - z = (struct read_zip *)state; - buf = (char *)data; - - switch (cmd) { - case ZIP_SOURCE_OPEN: - for (n=0; noff; n+= i) { - i = (z->off-n > sizeof(b) ? sizeof(b) : z->off-n); - if ((i=zip_fread(z->zf, b, i)) < 0) { - zip_fclose(z->zf); - z->zf = NULL; - return -1; - } - } - return 0; - - case ZIP_SOURCE_READ: - if (z->len != -1) - n = len > z->len ? z->len : len; - else - n = len; - - - if ((i=zip_fread(z->zf, buf, n)) < 0) - return -1; - - if (z->len != -1) - z->len -= i; - - return i; - - case ZIP_SOURCE_CLOSE: - return 0; - - case ZIP_SOURCE_STAT: - if (len < sizeof(z->st)) - return -1; - len = sizeof(z->st); - - memcpy(data, &z->st, len); - return len; - - case ZIP_SOURCE_ERROR: - { - int *e; - - if (len < sizeof(int)*2) - return -1; - - e = (int *)data; - zip_file_error_get(z->zf, e, e+1); - } - return sizeof(int)*2; - - case ZIP_SOURCE_FREE: - zip_fclose(z->zf); - free(z); - return 0; - - default: - ; - } - - return -1; + return _zip_source_zip_new(za, srcza, srcidx, flags, start, (zip_uint64_t)len, NULL); } diff --git a/ext/zip/lib/zip_source_zip_new.c b/ext/zip/lib/zip_source_zip_new.c new file mode 100644 index 0000000000000..8e48f6f3faa0c --- /dev/null +++ b/ext/zip/lib/zip_source_zip_new.c @@ -0,0 +1,172 @@ +/* + zip_source_zip_new.c -- prepare data structures for zip_fopen/zip_source_zip + Copyright (C) 2012 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + + +#include + +#include "zipint.h" + + + +struct zip_source * +_zip_source_zip_new(struct zip *za, struct zip *srcza, zip_uint64_t srcidx, zip_flags_t flags, + zip_uint64_t start, zip_uint64_t len, const char *password) +{ + zip_compression_implementation comp_impl; + zip_encryption_implementation enc_impl; + struct zip_source *src, *s2; + zip_uint64_t offset; + struct zip_stat st; + + if (za == NULL) + return NULL; + + if (srcza == NULL || srcidx >= srcza->nentry) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((flags & ZIP_FL_UNCHANGED) == 0 + && (ZIP_ENTRY_DATA_CHANGED(srcza->entry+srcidx) || srcza->entry[srcidx].deleted)) { + _zip_error_set(&za->error, ZIP_ER_CHANGED, 0); + return NULL; + } + + if (zip_stat_index(srcza, srcidx, flags|ZIP_FL_UNCHANGED, &st) < 0) { + _zip_error_set(&za->error, ZIP_ER_INTERNAL, 0); + return NULL; + } + + if (flags & ZIP_FL_ENCRYPTED) + flags |= ZIP_FL_COMPRESSED; + + if ((start > 0 || len > 0) && (flags & ZIP_FL_COMPRESSED)) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + /* overflow or past end of file */ + if ((start > 0 || len > 0) && (start+len < start || start+len > st.size)) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + enc_impl = NULL; + if (((flags & ZIP_FL_ENCRYPTED) == 0) && (st.encryption_method != ZIP_EM_NONE)) { + if (password == NULL) { + _zip_error_set(&za->error, ZIP_ER_NOPASSWD, 0); + return NULL; + } + if ((enc_impl=_zip_get_encryption_implementation(st.encryption_method)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_ENCRNOTSUPP, 0); + return NULL; + } + } + + comp_impl = NULL; + if ((flags & ZIP_FL_COMPRESSED) == 0) { + if (st.comp_method != ZIP_CM_STORE) { + if ((comp_impl=_zip_get_compression_implementation(st.comp_method)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0); + return NULL; + } + } + } + + if ((offset=_zip_file_get_offset(srcza, srcidx, &za->error)) == 0) + return NULL; + + if (st.comp_size == 0) { + if ((src=zip_source_buffer(za, NULL, 0, 0)) == NULL) + return NULL; + } + else { + if (start+len > 0 && enc_impl == NULL && comp_impl == NULL) { + struct zip_stat st2; + + st2.size = len ? len : st.size-start; + st2.comp_size = st2.size; + st2.comp_method = ZIP_CM_STORE; + st2.mtime = st.mtime; + st2.valid = ZIP_STAT_SIZE|ZIP_STAT_COMP_SIZE|ZIP_STAT_COMP_METHOD|ZIP_STAT_MTIME; + + /* XXX: check for overflow of st2.size */ + if ((src=_zip_source_file_or_p(za, NULL, srcza->zp, offset+start, (zip_int64_t)st2.size, 0, &st2)) == NULL) + return NULL; + } + else { + /* XXX: check for overflow of st.comp_size */ + if ((src=_zip_source_file_or_p(za, NULL, srcza->zp, offset, (zip_int64_t)st.comp_size, 0, &st)) == NULL) + return NULL; + } + + if (enc_impl) { + if ((s2=enc_impl(za, src, st.encryption_method, 0, password)) == NULL) { + zip_source_free(src); + /* XXX: set error (how?) */ + return NULL; + } + src = s2; + } + if (comp_impl) { + if ((s2=comp_impl(za, src, st.comp_method, 0)) == NULL) { + zip_source_free(src); + /* XXX: set error (how?) */ + return NULL; + } + src = s2; + } + if (((flags & ZIP_FL_COMPRESSED) == 0 || st.comp_method == ZIP_CM_STORE) + && (len == 0 || len == st.comp_size)) { + /* when reading the whole file, check for crc errors */ + if ((s2=zip_source_crc(za, src, 1)) == NULL) { + zip_source_free(src); + /* XXX: set error (how?) */ + return NULL; + } + src = s2; + } + + if (start+len > 0 && (comp_impl || enc_impl)) { + if ((s2=zip_source_window(za, src, start, len ? len : st.size-start)) == NULL) { + zip_source_free(src); + /* XXX: set error (how?) (why?) */ + return NULL; + } + src = s2; + } + } + + return src; +} diff --git a/ext/zip/lib/zip_stat.c b/ext/zip/lib/zip_stat.c index c8a25e1d84ac3..8254627d929f4 100644 --- a/ext/zip/lib/zip_stat.c +++ b/ext/zip/lib/zip_stat.c @@ -37,13 +37,13 @@ -ZIP_EXTERN(int) -zip_stat(struct zip *za, const char *fname, int flags, struct zip_stat *st) +ZIP_EXTERN int +zip_stat(struct zip *za, const char *fname, zip_flags_t flags, struct zip_stat *st) { - int idx; + zip_int64_t idx; if ((idx=zip_name_locate(za, fname, flags)) < 0) return -1; - return zip_stat_index(za, idx, flags, st); + return zip_stat_index(za, (zip_uint64_t)idx, flags, st); } diff --git a/ext/zip/lib/zip_stat_index.c b/ext/zip/lib/zip_stat_index.c index 8faa8cc394972..f4ce72aaa82d8 100644 --- a/ext/zip/lib/zip_stat_index.c +++ b/ext/zip/lib/zip_stat_index.c @@ -37,16 +37,15 @@ -ZIP_EXTERN(int) -zip_stat_index(struct zip *za, zip_uint64_t index, int flags, +ZIP_EXTERN int +zip_stat_index(struct zip *za, zip_uint64_t index, zip_flags_t flags, struct zip_stat *st) { const char *name; - - if (index >= za->nentry) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + struct zip_dirent *de; + + if ((de=_zip_get_dirent(za, index, flags, NULL)) == NULL) return -1; - } if ((name=zip_get_name(za, index, flags)) == NULL) return -1; @@ -60,20 +59,15 @@ zip_stat_index(struct zip *za, zip_uint64_t index, int flags, } } else { - if (za->cdir == NULL || index >= za->cdir->nentry) { - _zip_error_set(&za->error, ZIP_ER_INVAL, 0); - return -1; - } - zip_stat_init(st); - st->crc = za->cdir->entry[index].crc; - st->size = za->cdir->entry[index].uncomp_size; - st->mtime = za->cdir->entry[index].last_mod; - st->comp_size = za->cdir->entry[index].comp_size; - st->comp_method = za->cdir->entry[index].comp_method; - if (za->cdir->entry[index].bitflags & ZIP_GPBF_ENCRYPTED) { - if (za->cdir->entry[index].bitflags & ZIP_GPBF_STRONG_ENCRYPTION) { + st->crc = de->crc; + st->size = de->uncomp_size; + st->mtime = de->last_mod; + st->comp_size = de->comp_size; + st->comp_method = (zip_uint16_t)de->comp_method; + if (de->bitflags & ZIP_GPBF_ENCRYPTED) { + if (de->bitflags & ZIP_GPBF_STRONG_ENCRYPTION) { /* XXX */ st->encryption_method = ZIP_EM_UNKNOWN; } diff --git a/ext/zip/lib/zip_stat_init.c b/ext/zip/lib/zip_stat_init.c index 74e1ffd0b0dce..d17613bf5e7e8 100644 --- a/ext/zip/lib/zip_stat_init.c +++ b/ext/zip/lib/zip_stat_init.c @@ -37,7 +37,7 @@ -ZIP_EXTERN(void) +ZIP_EXTERN void zip_stat_init(struct zip_stat *st) { st->valid = 0; diff --git a/ext/zip/lib/zip_strerror.c b/ext/zip/lib/zip_strerror.c index ad23bafed6c62..9ebee144f908a 100644 --- a/ext/zip/lib/zip_strerror.c +++ b/ext/zip/lib/zip_strerror.c @@ -36,7 +36,8 @@ #include "zipint.h" -ZIP_EXTERN(const char *) + +ZIP_EXTERN const char * zip_strerror(struct zip *za) { return _zip_error_strerror(&za->error); diff --git a/ext/zip/lib/zip_string.c b/ext/zip/lib/zip_string.c new file mode 100644 index 0000000000000..a2d5eb5d3fdae --- /dev/null +++ b/ext/zip/lib/zip_string.c @@ -0,0 +1,196 @@ +/* + zip_string.c -- string handling (with encoding) + Copyright (C) 2012 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + + +#include +#include + +#include "zipint.h" + + + +zip_uint32_t +_zip_string_crc32(const struct zip_string *s) +{ + zip_uint32_t crc; + + crc = (zip_uint32_t)crc32(0L, Z_NULL, 0); + + if (s != NULL) + crc = (zip_uint32_t)crc32(crc, s->raw, s->length); + + return crc; +} + + + +int +_zip_string_equal(const struct zip_string *a, const struct zip_string *b) +{ + if (a == NULL || b == NULL) + return a == b; + + if (a->length != b->length) + return 0; + + /* XXX: encoding */ + + return (memcmp(a->raw, b->raw, a->length) == 0); +} + + + +void +_zip_string_free(struct zip_string *s) +{ + if (s == NULL) + return; + + free(s->raw); + free(s->converted); + free(s); +} + + + +const zip_uint8_t * +_zip_string_get(struct zip_string *string, zip_uint32_t *lenp, zip_flags_t flags, struct zip_error *error) +{ + static const zip_uint8_t empty[1] = ""; + + if (string == NULL) { + if (lenp) + *lenp = 0; + return empty; + } + + if ((flags & ZIP_FL_ENC_RAW) == 0) { + /* start guessing */ + if (string->encoding == ZIP_ENCODING_UNKNOWN) + _zip_guess_encoding(string, ZIP_ENCODING_UNKNOWN); + + if (((flags & ZIP_FL_ENC_STRICT) + && string->encoding != ZIP_ENCODING_ASCII && string->encoding != ZIP_ENCODING_UTF8_KNOWN) + || (string->encoding == ZIP_ENCODING_CP437)) { + if (string->converted == NULL) { + if ((string->converted=_zip_cp437_to_utf8(string->raw, string->length, + &string->converted_length, error)) == NULL) + return NULL; + } + if (lenp) + *lenp = string->converted_length; + return string->converted; + } + } + + if (lenp) + *lenp = string->length; + return string->raw; +} + + + +zip_uint16_t +_zip_string_length(const struct zip_string *s) +{ + if (s == NULL) + return 0; + + return s->length; +} + + + +struct zip_string * +_zip_string_new(const zip_uint8_t *raw, zip_uint16_t length, zip_flags_t flags, struct zip_error *error) +{ + struct zip_string *s; + enum zip_encoding_type expected_encoding; + + if (length == 0) + return NULL; + + switch (flags & ZIP_FL_ENCODING_ALL) { + case ZIP_FL_ENC_GUESS: + expected_encoding = ZIP_ENCODING_UNKNOWN; + break; + case ZIP_FL_ENC_UTF_8: + expected_encoding = ZIP_ENCODING_UTF8_KNOWN; + break; + case ZIP_FL_ENC_CP437: + expected_encoding = ZIP_ENCODING_CP437; + break; + default: + _zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((s=(struct zip_string *)malloc(sizeof(*s))) == NULL) { + _zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + if ((s->raw=(zip_uint8_t *)malloc(length+1)) == NULL) { + free(s); + return NULL; + } + + memcpy(s->raw, raw, length); + s->raw[length] = '\0'; + s->length = length; + s->encoding = ZIP_ENCODING_UNKNOWN; + s->converted = NULL; + s->converted_length = 0; + + if (expected_encoding != ZIP_ENCODING_UNKNOWN) { + if (_zip_guess_encoding(s, expected_encoding) == ZIP_ENCODING_ERROR) { + _zip_string_free(s); + _zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + } + + return s; +} + + + +void +_zip_string_write(const struct zip_string *s, FILE *f) +{ + if (s == NULL) + return; + + fwrite(s->raw, s->length, 1, f); +} diff --git a/ext/zip/lib/zip_unchange.c b/ext/zip/lib/zip_unchange.c index 550e8b99031f2..5f0e753b78634 100644 --- a/ext/zip/lib/zip_unchange.c +++ b/ext/zip/lib/zip_unchange.c @@ -39,7 +39,7 @@ -ZIP_EXTERN(int) +ZIP_EXTERN int zip_unchange(struct zip *za, zip_uint64_t idx) { return _zip_unchange(za, idx, 0); @@ -50,34 +50,23 @@ zip_unchange(struct zip *za, zip_uint64_t idx) int _zip_unchange(struct zip *za, zip_uint64_t idx, int allow_duplicates) { - int i; + zip_int64_t i; if (idx >= za->nentry) { _zip_error_set(&za->error, ZIP_ER_INVAL, 0); return -1; } - if (za->entry[idx].ch_filename) { - if (!allow_duplicates) { - i = _zip_name_locate(za, - _zip_get_name(za, idx, ZIP_FL_UNCHANGED, NULL), - 0, NULL); - if (i != -1 && i != idx) { - _zip_error_set(&za->error, ZIP_ER_EXISTS, 0); - return -1; - } + if (!allow_duplicates && za->entry[idx].changes && (za->entry[idx].changes->changed & ZIP_DIRENT_FILENAME)) { + i = _zip_name_locate(za, _zip_get_name(za, idx, ZIP_FL_UNCHANGED, NULL), 0, NULL); + if (i >= 0 && (zip_uint64_t)i != idx) { + _zip_error_set(&za->error, ZIP_ER_EXISTS, 0); + return -1; } - - free(za->entry[idx].ch_filename); - za->entry[idx].ch_filename = NULL; } - free(za->entry[idx].ch_extra); - za->entry[idx].ch_extra = NULL; - za->entry[idx].ch_extra_len = -1; - free(za->entry[idx].ch_comment); - za->entry[idx].ch_comment = NULL; - za->entry[idx].ch_comment_len = -1; + _zip_dirent_free(za->entry[idx].changes); + za->entry[idx].changes = NULL; _zip_unchange_data(za->entry+idx); diff --git a/ext/zip/lib/zip_unchange_all.c b/ext/zip/lib/zip_unchange_all.c index 01282f89dbbaf..bbc2825eb6265 100644 --- a/ext/zip/lib/zip_unchange_all.c +++ b/ext/zip/lib/zip_unchange_all.c @@ -39,10 +39,11 @@ -ZIP_EXTERN(int) +ZIP_EXTERN int zip_unchange_all(struct zip *za) { - int ret, i; + int ret; + zip_uint64_t i; ret = 0; for (i=0; inentry; i++) diff --git a/ext/zip/lib/zip_unchange_archive.c b/ext/zip/lib/zip_unchange_archive.c index ca2b67854435a..e24ee21727002 100644 --- a/ext/zip/lib/zip_unchange_archive.c +++ b/ext/zip/lib/zip_unchange_archive.c @@ -39,13 +39,15 @@ -ZIP_EXTERN(int) +ZIP_EXTERN int zip_unchange_archive(struct zip *za) { - free(za->ch_comment); - za->ch_comment = NULL; - za->ch_comment_len = -1; - + if (za->comment_changed) { + _zip_string_free(za->comment_changes); + za->comment_changes = NULL; + za->comment_changed = 0; + } + za->ch_flags = za->flags; return 0; diff --git a/ext/zip/lib/zip_unchange_data.c b/ext/zip/lib/zip_unchange_data.c index 7dd93b768a87a..fa25feb03885f 100644 --- a/ext/zip/lib/zip_unchange_data.c +++ b/ext/zip/lib/zip_unchange_data.c @@ -1,8 +1,6 @@ /* - $NiH: zip_unchange_data.c,v 1.14 2004/11/30 23:02:47 wiz Exp $ - zip_unchange_data.c -- undo helper function - Copyright (C) 1999, 2004 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -35,8 +33,6 @@ -#include - #include "zipint.h" void @@ -46,7 +42,15 @@ _zip_unchange_data(struct zip_entry *ze) zip_source_free(ze->source); ze->source = NULL; } - - ze->state = ze->ch_filename ? ZIP_ST_RENAMED : ZIP_ST_UNCHANGED; + + if (ze->changes != NULL && (ze->changes->changed & ZIP_DIRENT_COMP_METHOD) && ze->changes->comp_method == ZIP_CM_REPLACED_DEFAULT) { + ze->changes->changed &= ~ZIP_DIRENT_COMP_METHOD; + if (ze->changes->changed == 0) { + _zip_dirent_free(ze->changes); + ze->changes = NULL; + } + } + + ze->deleted = 0; } diff --git a/ext/zip/lib/zip_utf-8.c b/ext/zip/lib/zip_utf-8.c new file mode 100644 index 0000000000000..c36fad13f5f45 --- /dev/null +++ b/ext/zip/lib/zip_utf-8.c @@ -0,0 +1,255 @@ +/* + zip_utf-8.c -- UTF-8 support functions for libzip + Copyright (C) 2011-2012 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + + +#include "zipint.h" + +#include + + + +static const zip_uint16_t _cp437_to_unicode[256] = { + /* 0x00 - 0x0F */ + 0x2007, 0x263A, 0x263B, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022, + 0x25D8, 0x25CB, 0x25D9, 0x2642, 0x2640, 0x266A, 0x266B, 0x263C, + + /* 0x10 - 0x1F */ + 0x25BA, 0x25C4, 0x2195, 0x203C, 0x00B6, 0x00A7, 0x25AC, 0x21A8, + 0x2191, 0x2193, 0x2192, 0x2190, 0x221F, 0x2194, 0x25B2, 0x25BC, + + /* 0x20 - 0x2F */ + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + + /* 0x30 - 0x3F */ + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + + /* 0x40 - 0x4F */ + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + + /* 0x50 - 0x5F */ + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + + /* 0x60 - 0x6F */ + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + + /* 0x70 - 0x7F */ + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x2302, + + /* 0x80 - 0x8F */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + + /* 0x90 - 0x9F */ + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, + 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + + /* 0xA0 - 0xAF */ + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, + 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + + /* 0xB0 - 0xBF */ + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + + /* 0xC0 - 0xCF */ + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + + /* 0xD0 - 0xDF */ + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + + /* 0xE0 - 0xEF */ + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, + 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + + /* 0xF0 - 0xFF */ + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#define UTF_8_LEN_2_MASK 0xe0 +#define UTF_8_LEN_2_MATCH 0xc0 +#define UTF_8_LEN_3_MASK 0xf0 +#define UTF_8_LEN_3_MATCH 0xe0 +#define UTF_8_LEN_4_MASK 0xf8 +#define UTF_8_LEN_4_MATCH 0xf0 +#define UTF_8_CONTINUE_MASK 0xc0 +#define UTF_8_CONTINUE_MATCH 0x80 + + + +enum zip_encoding_type +_zip_guess_encoding(struct zip_string *str, enum zip_encoding_type expected_encoding) +{ + enum zip_encoding_type enc; + const zip_uint8_t *name; + zip_uint32_t i, j, ulen; + + if (str == NULL) + return ZIP_ENCODING_ASCII; + + name = str->raw; + + if (str->encoding != ZIP_ENCODING_UNKNOWN) + enc = str->encoding; + else { + enc = ZIP_ENCODING_ASCII; + for (i=0; ilength; i++) { + if ((name[i] > 31 && name[i] < 128) || name[i] == '\r' || name[i] == '\n' || name[i] == '\t') + continue; + + enc = ZIP_ENCODING_UTF8_GUESSED; + if ((name[i] & UTF_8_LEN_2_MASK) == UTF_8_LEN_2_MATCH) + ulen = 1; + else if ((name[i] & UTF_8_LEN_3_MASK) == UTF_8_LEN_3_MATCH) + ulen = 2; + else if ((name[i] & UTF_8_LEN_4_MASK) == UTF_8_LEN_4_MATCH) + ulen = 3; + else { + enc = ZIP_ENCODING_CP437; + break; + } + + if (i + ulen >= str->length) { + enc = ZIP_ENCODING_CP437; + break; + } + + for (j=1; j<=ulen; j++) { + if ((name[i+j] & UTF_8_CONTINUE_MASK) != UTF_8_CONTINUE_MATCH) { + enc = ZIP_ENCODING_CP437; + goto done; + } + } + i += ulen; + } + } + +done: + str->encoding = enc; + + if (expected_encoding != ZIP_ENCODING_UNKNOWN) { + if (expected_encoding == ZIP_ENCODING_UTF8_KNOWN && enc == ZIP_ENCODING_UTF8_GUESSED) + str->encoding = enc = ZIP_ENCODING_UTF8_KNOWN; + + if (expected_encoding != enc && enc != ZIP_ENCODING_ASCII) + return ZIP_ENCODING_ERROR; + } + + return enc; +} + + + +static zip_uint32_t +_zip_unicode_to_utf8_len(zip_uint32_t codepoint) +{ + if (codepoint < 0x0080) + return 1; + if (codepoint < 0x0800) + return 2; + if (codepoint < 0x10000) + return 3; + return 4; +} + + + +static zip_uint32_t +_zip_unicode_to_utf8(zip_uint32_t codepoint, zip_uint8_t *buf) +{ + if (codepoint < 0x0080) { + buf[0] = codepoint & 0xff; + return 1; + } + if (codepoint < 0x0800) { + buf[0] = UTF_8_LEN_2_MATCH | ((codepoint >> 6) & 0x1f); + buf[1] = UTF_8_CONTINUE_MATCH | (codepoint & 0x3f); + return 2; + } + if (codepoint < 0x10000) { + buf[0] = UTF_8_LEN_3_MATCH | ((codepoint >> 12) & 0x0f); + buf[1] = UTF_8_CONTINUE_MATCH | ((codepoint >> 6) & 0x3f); + buf[2] = UTF_8_CONTINUE_MATCH | (codepoint & 0x3f); + return 3; + } + buf[0] = UTF_8_LEN_4_MATCH | ((codepoint >> 18) & 0x07); + buf[1] = UTF_8_CONTINUE_MATCH | ((codepoint >> 12) & 0x3f); + buf[2] = UTF_8_CONTINUE_MATCH | ((codepoint >> 6) & 0x3f); + buf[3] = UTF_8_CONTINUE_MATCH | (codepoint & 0x3f); + return 4; +} + + + +zip_uint8_t * +_zip_cp437_to_utf8(const zip_uint8_t * const _cp437buf, zip_uint32_t len, + zip_uint32_t *utf8_lenp, struct zip_error *error) +{ + zip_uint8_t *cp437buf = (zip_uint8_t *)_cp437buf; + zip_uint8_t *utf8buf; + zip_uint32_t buflen, i, offset; + + if (len == 0) { + if (utf8_lenp) + *utf8_lenp = 0; + return NULL; + } + + buflen = 1; + for (i=0; i -#include -#include -#include -#include - -#ifndef strcasecmp -# define strcmpi _strcmpi -#endif - -#ifndef ssize_t -# define ssize_t SSIZE_T -#endif - -#ifndef mode_t -# define mode_t int -#endif - -#ifndef snprintf -# define snprintf _snprintf -#endif - -#ifndef mkstemp -# define mkstemp(t) _creat(_mktemp(t), _S_IREAD|_S_IWRITE) -#endif -/* -#ifndef fseeko -# define fseeko fseek -#endif -*/ diff --git a/ext/zip/lib/zipconf.h b/ext/zip/lib/zipconf.h index 646c0bde53f0e..1cb5c0467aeb8 100644 --- a/ext/zip/lib/zipconf.h +++ b/ext/zip/lib/zipconf.h @@ -1,47 +1,129 @@ -#ifndef _HAD_ZIPCONF_H -#define _HAD_ZIPCONF_H - -/* - zipconf.h -- platform specific include file - - This file was generated automatically by ./make_zipconf.sh - based on ../config.h. - */ - -#define LIBZIP_VERSION "0.10.1" -#define LIBZIP_VERSION_MAJOR 0 -#define LIBZIP_VERSION_MINOR 10 -#define LIBZIP_VERSION_MICRO 0 - -#include - -typedef int8_t zip_int8_t; -#define ZIP_INT8_MIN INT8_MIN -#define ZIP_INT8_MAX INT8_MAX - -typedef uint8_t zip_uint8_t; -#define ZIP_UINT8_MAX UINT8_MAX - -typedef int16_t zip_int16_t; -#define ZIP_INT16_MIN INT16_MIN -#define ZIP_INT16_MAX INT16_MAX - -typedef uint16_t zip_uint16_t; -#define ZIP_UINT16_MAX UINT16_MAX - -typedef int32_t zip_int32_t; -#define ZIP_INT32_MIN INT32_MIN -#define ZIP_INT32_MAX INT32_MAX - -typedef uint32_t zip_uint32_t; -#define ZIP_UINT32_MAX UINT32_MAX - -typedef int64_t zip_int64_t; -#define ZIP_INT64_MIN INT64_MIN -#define ZIP_INT64_MAX INT64_MAX - -typedef uint64_t zip_uint64_t; -#define ZIP_UINT64_MAX UINT64_MAX - - -#endif /* zipconf.h */ +#ifndef _HAD_ZIPCONF_H +#define _HAD_ZIPCONF_H + +/* + zipconf.h -- platform specific include file + + This file was generated automatically by CMake + based on ../cmake-zipconf.h.in. + */ +#define LIBZIP_VERSION "0.11.1" +/* #undef HAVE_INTTYPES_H_LIBZIP */ + +#if defined(_WIN32) +# if _MSC_VER > 1500 +# define HAVE_STDINT_H_LIBZIP +# else +# include "win32/php_stdint.h" +# endif +#else +# include +#endif +#define HAVE_SYS_TYPES_H_LIBZIP +#define HAVE___INT8_LIBZIP +#define HAVE_INT8_T_LIBZIP +#define HAVE_UINT8_T_LIBZIP +#define HAVE___INT16_LIBZIP +#define HAVE_INT16_T_LIBZIP +#define HAVE_UINT16_T_LIBZIP +#define HAVE___INT32_LIBZIP +#define HAVE_INT32_T_LIBZIP +#define HAVE_UINT32_T_LIBZIP +#define HAVE___INT64_LIBZIP +#define HAVE_INT64_T_LIBZIP +#define HAVE_UINT64_T_LIBZIP +#define SHORT_LIBZIP 2 +#define INT_LIBZIP 4 +#define LONG_LIBZIP 4 +#define LONG_LONG_LIBZIP 8 + +#if defined(HAVE_STDINT_H_LIBZIP) +#include +#elif defined(HAVE_INTTYPES_H_LIBZIP) +#include +#elif defined(HAVE_SYS_TYPES_H_LIBZIP) +#include +#endif + +#if defined(HAVE_INT8_T_LIBZIP) +typedef int8_t zip_int8_t; +#elif defined(HAVE___INT8_LIBZIP) +typedef __int8 zip_int8_t; +#else +typedef signed char zip_int8_t; +#endif +#if defined(HAVE_UINT8_T_LIBZIP) +typedef uint8_t zip_uint8_t; +#elif defined(HAVE___INT8_LIBZIP) +typedef unsigned __int8 zip_uint8_t; +#else +typedef unsigned char zip_uint8_t; +#endif +#if defined(HAVE_INT16_T_LIBZIP) +typedef int16_t zip_int16_t; +#elif defined(HAVE___INT16_LIBZIP) +typedef __int16 zip_int16_t; +#elif defined(SHORT_LIBZIP) && SHORT_LIBZIP == 2 +typedef signed short zip_int16_t; +#endif +#if defined(HAVE_UINT16_T_LIBZIP) +typedef uint16_t zip_uint16_t; +#elif defined(HAVE___INT16_LIBZIP) +typedef unsigned __int16 zip_uint16_t; +#elif defined(SHORT_LIBZIP) && SHORT_LIBZIP == 2 +typedef unsigned short zip_uint16_t; +#endif +#if defined(HAVE_INT32_T_LIBZIP) +typedef int32_t zip_int32_t; +#elif defined(HAVE___INT32_LIBZIP) +typedef __int32 zip_int32_t; +#elif defined(INT_LIBZIP) && INT_LIBZIP == 4 +typedef signed int zip_int32_t; +#elif defined(LONG_LIBZIP) && LONG_LIBZIP == 4 +typedef signed long zip_int32_t; +#endif +#if defined(HAVE_UINT32_T_LIBZIP) +typedef uint32_t zip_uint32_t; +#elif defined(HAVE___INT32_LIBZIP) +typedef unsigned __int32 zip_uint32_t; +#elif defined(INT_LIBZIP) && INT_LIBZIP == 4 +typedef unsigned int zip_uint32_t; +#elif defined(LONG_LIBZIP) && LONG_LIBZIP == 4 +typedef unsigned long zip_uint32_t; +#endif +#if defined(HAVE_INT64_T_LIBZIP) +typedef int64_t zip_int64_t; +#elif defined(HAVE___INT64_LIBZIP) +typedef __int64 zip_int64_t; +#elif defined(LONG_LIBZIP) && LONG_LIBZIP == 8 +typedef signed long zip_int64_t; +#elif defined(LONG_LONG_LIBZIP) && LONG_LONG_LIBZIP == 8 +typedef signed long long zip_int64_t; +#endif +#if defined(HAVE_UINT64_T_LIBZIP) +typedef uint64_t zip_uint64_t; +#elif defined(HAVE___INT64_LIBZIP) +typedef unsigned __int64 zip_uint64_t; +#elif defined(LONG_LIBZIP) && LONG_LONG_LIBZIP == 8 +typedef unsigned long zip_uint64_t; +#elif defined(LONG_LONG_LIBZIP) && LONG_LONG_LIBZIP == 8 +typedef unsigned long long zip_uint64_t; +#endif + +#define ZIP_INT8_MIN -0x80 +#define ZIP_INT8_MAX 0x7f +#define ZIP_UINT8_MAX 0xff + +#define ZIP_INT16_MIN -0x8000 +#define ZIP_INT16_MAX 0x7fff +#define ZIP_UINT16_MAX 0xffff + +#define ZIP_INT32_MIN -0x80000000L +#define ZIP_INT32_MAX 0x7fffffffL +#define ZIP_UINT32_MAX 0xffffffffLU + +#define ZIP_INT64_MIN -0x8000000000000000LL +#define ZIP_INT64_MAX 0x7fffffffffffffffLL +#define ZIP_UINT64_MAX 0xffffffffffffffffULL + +#endif /* zipconf.h */ diff --git a/ext/zip/lib/zipint.h b/ext/zip/lib/zipint.h index ea21dddcd4257..e8765c5b6619f 100644 --- a/ext/zip/lib/zipint.h +++ b/ext/zip/lib/zipint.h @@ -3,7 +3,7 @@ /* zipint.h -- internal declarations. - Copyright (C) 1999-2011 Dieter Baron and Thomas Klausner + Copyright (C) 1999-2013 Dieter Baron and Thomas Klausner This file is part of libzip, a library to manipulate ZIP archives. The authors can be contacted at @@ -20,7 +20,7 @@ 3. The names of the authors may not be used to endorse or promote products derived from this software without specific prior written permission. - + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -34,69 +34,123 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include +/* to have *_MAX definitions for all types when compiling with g++ */ +#define __STDC_LIMIT_MACROS -#include "zip.h" +#include -#ifndef HAVE_FSEEKO -#define fseeko(s, o, w) (fseek((s), (long int)(o), (w))) +#ifdef PHP_WIN32 +/* for dup(), close(), etc. */ +#include +#include "config.w32.h" #endif -#ifndef HAVE_FTELLO -#define ftello(s) ((long)ftell((s))) +#ifndef _ZIP_COMPILING_DEPRECATED +#define ZIP_DISABLE_DEPRECATED #endif -#ifndef PHP_WIN32 -#ifndef HAVE_MKSTEMP -int _zip_mkstemp(char *); -#define mkstemp _zip_mkstemp -#endif +#include "zip.h" +#ifdef PHP_WIN32 +# include "php_zip_config.w32.h" +#else +# include "config.h" #endif -#ifdef PHP_WIN32 +#if defined(HAVE_MOVEFILEEXA) && defined(_WIN32) #include -#include #define _zip_rename(s, t) \ - (!MoveFileExA((s), (t), \ - MOVEFILE_COPY_ALLOWED|MOVEFILE_REPLACE_EXISTING)) + (!MoveFileExA((s), (t), MOVEFILE_COPY_ALLOWED|MOVEFILE_REPLACE_EXISTING)) +#else +#define _zip_rename rename +#endif -/* for dup(), close(), etc. */ -#include +#ifdef _WIN32 +#undef strcasecmp +# define strcasecmp _strcmpi +#endif -#if !defined(HAVE_OPEN) +#if defined(HAVE__CLOSE) +#define close _close +#endif +#if defined(HAVE__DUP) +#define dup _dup +#endif +/* crashes reported when using fdopen instead of _fdopen on Windows/Visual Studio 10/Win64 */ +#if defined(HAVE__FDOPEN) +#define fdopen _fdopen +#endif +#if defined(HAVE__FILENO) +#define fileno _fileno +#endif +/* Windows' open() doesn't understand Unix permissions */ #if defined(HAVE__OPEN) #define open(a, b, c) _open((a), (b)) #endif +#if defined(HAVE__SNPRINTF) +#define snprintf _snprintf +#endif +#if defined(HAVE__STRDUP) && !defined(strdup) +#define strdup _strdup #endif -#else -#define _zip_rename rename +#ifndef HAVE_FSEEKO +#define fseeko(s, o, w) (fseek((s), (long int)(o), (w))) #endif -#ifndef strcasecmp -# define strcmpi strcasecmp +#ifndef HAVE_FTELLO +#define ftello(s) ((long)ftell((s))) #endif +#ifndef HAVE_MKSTEMP +int _zip_mkstemp(char *); +#define mkstemp _zip_mkstemp +#endif - +#if !defined(HAVE_STRCASECMP) +#if defined(HAVE__STRICMP) +#define strcasecmp _stricmp +#endif +#endif + +#if SIZEOF_OFF_T == 8 +#define ZIP_OFF_MAX ZIP_INT64_MAX +#elif SIZEOF_OFF_T == 4 +#define ZIP_OFF_MAX ZIP_INT32_MAX +#elif SIZEOF_OFF_T == 2 +#define ZIP_OFF_MAX ZIP_INT16_MAX +#else +#error unsupported size of off_t +#endif #define CENTRAL_MAGIC "PK\1\2" #define LOCAL_MAGIC "PK\3\4" #define EOCD_MAGIC "PK\5\6" #define DATADES_MAGIC "PK\7\8" +#define EOCD64LOC_MAGIC "PK\6\7" +#define EOCD64_MAGIC "PK\6\6" #define TORRENT_SIG "TORRENTZIPPED-" #define TORRENT_SIG_LEN 14 #define TORRENT_CRC_LEN 8 #define TORRENT_MEM_LEVEL 8 #define CDENTRYSIZE 46u #define LENTRYSIZE 30 -#undef MAXCOMLEN /* defined as 19 on BSD for max command name */ #define MAXCOMLEN 65536 #define MAXEXTLEN 65536 #define EOCDLEN 22 -#define CDBUFSIZE (MAXCOMLEN+EOCDLEN) +#define EOCD64LOCLEN 20 +#define EOCD64LEN 56 +#define CDBUFSIZE (MAXCOMLEN+EOCDLEN+EOCD64LOCLEN) #define BUFSIZE 8192 +#define ZIP_CM_REPLACED_DEFAULT (-2) + +#define ZIP_CM_IS_DEFAULT(x) ((x) == ZIP_CM_DEFAULT || (x) == ZIP_CM_REPLACED_DEFAULT) + +#define ZIP_EF_UTF_8_COMMENT 0x6375 +#define ZIP_EF_UTF_8_NAME 0x7075 +#define ZIP_EF_ZIP64 0x0001 + +#define ZIP_EF_IS_INTERNAL(id) ((id) == ZIP_EF_UTF_8_COMMENT || (id) == ZIP_EF_UTF_8_NAME || (id) == ZIP_EF_ZIP64) /* This section contains API that won't materialize like this. It's @@ -104,20 +158,22 @@ int _zip_mkstemp(char *); typedef struct zip_source *(*zip_compression_implementation)(struct zip *, struct zip_source *, - zip_uint16_t, int); + zip_int32_t, int); typedef struct zip_source *(*zip_encryption_implementation)(struct zip *, struct zip_source *, zip_uint16_t, int, const char *); -ZIP_EXTERN(zip_compression_implementation) zip_get_compression_implementation( - zip_uint16_t); -ZIP_EXTERN(zip_encryption_implementation) zip_get_encryption_implementation( - zip_uint16_t); +zip_compression_implementation _zip_get_compression_implementation(zip_int32_t); +zip_encryption_implementation _zip_get_encryption_implementation(zip_uint16_t); +/* This API is not final yet, but we need it internally, so it's private for now. */ + +const zip_uint8_t *zip_get_extra_field_by_id(struct zip *, int, int, zip_uint16_t, int, zip_uint16_t *); + /* This section contains API that is of limited use until support for user-supplied compression/encryption implementation is finished. Thus we will keep it private for now. */ @@ -126,40 +182,37 @@ typedef zip_int64_t (*zip_source_layered_callback)(struct zip_source *, void *, void *, zip_uint64_t, enum zip_source_cmd); -ZIP_EXTERN(void) zip_source_close(struct zip_source *); -ZIP_EXTERN(struct zip_source *)zip_source_crc(struct zip *, struct zip_source *, - int); -ZIP_EXTERN(struct zip_source *)zip_source_deflate(struct zip *, - struct zip_source *, - zip_uint16_t, int); -ZIP_EXTERN(void) zip_source_error(struct zip_source *, int *, int *); -ZIP_EXTERN(struct zip_source *)zip_source_layered(struct zip *, - struct zip_source *, - zip_source_layered_callback, - void *); -ZIP_EXTERN(int) zip_source_open(struct zip_source *); -ZIP_EXTERN(struct zip_source *)zip_source_pkware(struct zip *, - struct zip_source *, - zip_uint16_t, int, - const char *); -ZIP_EXTERN(zip_int64_t) zip_source_read(struct zip_source *, void *, - zip_uint64_t); -ZIP_EXTERN(int) zip_source_stat(struct zip_source *, struct zip_stat *); +void zip_source_close(struct zip_source *); +struct zip_source *zip_source_crc(struct zip *, struct zip_source *, + int); +struct zip_source *zip_source_deflate(struct zip *, + struct zip_source *, + zip_int32_t, int); +void zip_source_error(struct zip_source *, int *, int *); +struct zip_source *zip_source_layered(struct zip *, + struct zip_source *, + zip_source_layered_callback, + void *); +int zip_source_open(struct zip_source *); +struct zip_source *zip_source_pkware(struct zip *, + struct zip_source *, + zip_uint16_t, int, + const char *); +zip_int64_t zip_source_read(struct zip_source *, void *, + zip_uint64_t); +int zip_source_stat(struct zip_source *, struct zip_stat *); +struct zip_source *zip_source_window(struct zip *, struct zip_source *, + zip_uint64_t, zip_uint64_t); /* This function will probably remain private. It is not needed to implement compression/encryption routines. (We should probably rename it to _zip_source_pop.) */ -ZIP_EXTERN(struct zip_source *)zip_source_pop(struct zip_source *); +struct zip_source *zip_source_pop(struct zip_source *); -/* state of change of a file in zip archive */ - -enum zip_state { ZIP_ST_UNCHANGED, ZIP_ST_DELETED, ZIP_ST_REPLACED, - ZIP_ST_ADDED, ZIP_ST_RENAMED }; - /* error source for layered sources */ enum zip_les { ZIP_LES_NONE, ZIP_LES_UPPER, ZIP_LES_LOWER, ZIP_LES_INVAL }; @@ -169,6 +222,28 @@ enum zip_les { ZIP_LES_NONE, ZIP_LES_UPPER, ZIP_LES_LOWER, ZIP_LES_INVAL }; #define ZIP_GPBF_ENCRYPTED 0x0001 /* is encrypted */ #define ZIP_GPBF_DATA_DESCRIPTOR 0x0008 /* crc/size after file data */ #define ZIP_GPBF_STRONG_ENCRYPTION 0x0040 /* uses strong encryption */ +#define ZIP_GPBF_ENCODING_UTF_8 0x0800 /* file name encoding is UTF-8 */ + + +/* extra fields */ +#define ZIP_EF_LOCAL ZIP_FL_LOCAL /* include in local header */ +#define ZIP_EF_CENTRAL ZIP_FL_CENTRAL /* include in central directory */ +#define ZIP_EF_BOTH (ZIP_EF_LOCAL|ZIP_EF_CENTRAL) /* include in both */ + +#define ZIP_FL_FORCE_ZIP64 1024 /* force zip64 extra field (_zip_dirent_write) */ + +#define ZIP_FL_ENCODING_ALL (ZIP_FL_ENC_GUESS|ZIP_FL_ENC_CP437|ZIP_FL_ENC_UTF_8) + + +/* encoding type */ +enum zip_encoding_type { + ZIP_ENCODING_UNKNOWN, /* not yet analyzed */ + ZIP_ENCODING_ASCII, /* plain ASCII */ + ZIP_ENCODING_UTF8_KNOWN, /* is UTF-8 */ + ZIP_ENCODING_UTF8_GUESSED, /* possibly UTF-8 */ + ZIP_ENCODING_CP437, /* Code Page 437 */ + ZIP_ENCODING_ERROR /* should be UTF-8 but isn't */ +}; /* error information */ @@ -181,25 +256,29 @@ struct zip_error { /* zip archive, part of API */ struct zip { - char *zn; /* file name */ - FILE *zp; /* file */ - struct zip_error error; /* error information */ + char *zn; /* file name */ + FILE *zp; /* file */ + unsigned int open_flags; /* flags passed to zip_open */ + struct zip_error error; /* error information */ - unsigned int flags; /* archive global flags */ - unsigned int ch_flags; /* changed archive global flags */ - - char *default_password; /* password used when no other supplied */ - - struct zip_cdir *cdir; /* central directory */ - char *ch_comment; /* changed archive comment */ - int ch_comment_len; /* length of changed zip archive - * comment, -1 if unchanged */ - zip_uint64_t nentry; /* number of entries */ - zip_uint64_t nentry_alloc; /* number of entries allocated */ - struct zip_entry *entry; /* entries */ - int nfile; /* number of opened files within archive */ - int nfile_alloc; /* number of files allocated */ - struct zip_file **file; /* opened files within archive */ + unsigned int flags; /* archive global flags */ + unsigned int ch_flags; /* changed archive global flags */ + + char *default_password; /* password used when no other supplied */ + + struct zip_string *comment_orig; /* archive comment */ + struct zip_string *comment_changes; /* changed archive comment */ + int comment_changed; /* whether archive comment was changed */ + + zip_uint64_t nentry; /* number of entries */ + zip_uint64_t nentry_alloc; /* number of entries allocated */ + struct zip_entry *entry; /* entries */ + + unsigned int nfile; /* number of opened files within archive */ + unsigned int nfile_alloc; /* number of files allocated */ + struct zip_file **file; /* opened files within archive */ + + char *tempdir; /* custom temp dir (needed e.g. for OS X sandboxing) */ }; /* file in zip archive, part of API */ @@ -213,37 +292,52 @@ struct zip_file { /* zip archive directory entry (central or local) */ +#define ZIP_DIRENT_COMP_METHOD 0x0001u +#define ZIP_DIRENT_FILENAME 0x0002u +#define ZIP_DIRENT_COMMENT 0x0004u +#define ZIP_DIRENT_EXTRA_FIELD 0x0008u +#define ZIP_DIRENT_ALL 0xffffu + struct zip_dirent { - unsigned short version_madeby; /* (c) version of creator */ - unsigned short version_needed; /* (cl) version needed to extract */ - unsigned short bitflags; /* (cl) general purpose bit flag */ - unsigned short comp_method; /* (cl) compression method used */ - time_t last_mod; /* (cl) time of last modification */ - unsigned int crc; /* (cl) CRC-32 of uncompressed data */ - unsigned int comp_size; /* (cl) size of commpressed data */ - unsigned int uncomp_size; /* (cl) size of uncommpressed data */ - char *filename; /* (cl) file name (NUL-terminated) */ - unsigned short filename_len; /* (cl) length of filename (w/o NUL) */ - char *extrafield; /* (cl) extra field */ - unsigned short extrafield_len; /* (cl) length of extra field */ - char *comment; /* (c) file comment */ - unsigned short comment_len; /* (c) length of file comment */ - unsigned short disk_number; /* (c) disk number start */ - unsigned short int_attrib; /* (c) internal file attributes */ - unsigned int ext_attrib; /* (c) external file attributes */ - unsigned int offset; /* (c) offset of local header */ + zip_uint32_t changed; + int local_extra_fields_read; /* whether we already read in local header extra fields */ + int cloned; /* wether this instance is cloned, and thus shares non-changed strings */ + + zip_uint16_t version_madeby; /* (c) version of creator */ + zip_uint16_t version_needed; /* (cl) version needed to extract */ + zip_uint16_t bitflags; /* (cl) general purpose bit flag */ + zip_int32_t comp_method; /* (cl) compression method used (uint16 and ZIP_CM_DEFAULT (-1)) */ + time_t last_mod; /* (cl) time of last modification */ + zip_uint32_t crc; /* (cl) CRC-32 of uncompressed data */ + zip_uint64_t comp_size; /* (cl) size of compressed data */ + zip_uint64_t uncomp_size; /* (cl) size of uncompressed data */ + struct zip_string *filename; /* (cl) file name (NUL-terminated) */ + struct zip_extra_field *extra_fields; /* (cl) extra fields, parsed */ + struct zip_string *comment; /* (c) file comment */ + zip_uint32_t disk_number; /* (c) disk number start */ + zip_uint16_t int_attrib; /* (c) internal file attributes */ + zip_uint32_t ext_attrib; /* (c) external file attributes */ + zip_uint64_t offset; /* (c) offset of local header */ }; /* zip archive central directory */ struct zip_cdir { - struct zip_dirent *entry; /* directory entries */ - int nentry; /* number of entries */ + struct zip_entry *entry; /* directory entries */ + zip_uint64_t nentry; /* number of entries */ + zip_uint64_t nentry_alloc; /* number of entries allocated */ - unsigned int size; /* size of central direcotry */ - unsigned int offset; /* offset of central directory in file */ - char *comment; /* zip archive comment */ - unsigned short comment_len; /* length of zip archive comment */ + off_t size; /* size of central directory */ + off_t offset; /* offset of central directory in file */ + struct zip_string *comment; /* zip archive comment */ +}; + +struct zip_extra_field { + struct zip_extra_field *next; + zip_flags_t flags; /* in local/central header */ + zip_uint16_t id; /* header id */ + zip_uint16_t size; /* data size */ + zip_uint8_t *data; }; @@ -262,13 +356,31 @@ struct zip_source { /* entry in zip archive directory */ struct zip_entry { - enum zip_state state; + struct zip_dirent *orig; + struct zip_dirent *changes; struct zip_source *source; - char *ch_filename; - char *ch_extra; - int ch_extra_len; - char *ch_comment; - int ch_comment_len; + int deleted; +}; + + + +/* file or archive comment, or filename */ + +struct zip_string { + zip_uint8_t *raw; /* raw string */ + zip_uint16_t length; /* length of raw string */ + enum zip_encoding_type encoding; /* autorecognized encoding */ + zip_uint8_t *converted; /* autoconverted string */ + zip_uint32_t converted_length; /* length of converted */ +}; + + + +/* which files to write, and in which order (name is for torrentzip sorting) */ + +struct zip_filelist { + zip_uint64_t idx; + const char *name; }; @@ -279,66 +391,111 @@ extern const int _zip_err_type[]; -#define ZIP_ENTRY_DATA_CHANGED(x) \ - ((x)->state == ZIP_ST_REPLACED \ - || (x)->state == ZIP_ST_ADDED) +#define ZIP_ENTRY_CHANGED(e, f) ((e)->changes && ((e)->changes->changed & (f))) + +#define ZIP_ENTRY_DATA_CHANGED(x) ((x)->source != NULL) #define ZIP_IS_RDONLY(za) ((za)->ch_flags & ZIP_AFL_RDONLY) +zip_int64_t _zip_add_entry(struct zip *); + int _zip_cdir_compute_crc(struct zip *, uLong *); void _zip_cdir_free(struct zip_cdir *); -int _zip_cdir_grow(struct zip_cdir *, int, struct zip_error *); -struct zip_cdir *_zip_cdir_new(int, struct zip_error *); -int _zip_cdir_write(struct zip_cdir *, FILE *, struct zip_error *); +int _zip_cdir_grow(struct zip_cdir *, zip_uint64_t, struct zip_error *); +struct zip_cdir *_zip_cdir_new(zip_uint64_t, struct zip_error *); +zip_int64_t _zip_cdir_write(struct zip *, const struct zip_filelist *, zip_uint64_t, FILE *); +struct zip_dirent *_zip_dirent_clone(const struct zip_dirent *); +void _zip_dirent_free(struct zip_dirent *); void _zip_dirent_finalize(struct zip_dirent *); void _zip_dirent_init(struct zip_dirent *); -int _zip_dirent_read(struct zip_dirent *, FILE *, unsigned char **, - zip_uint32_t *, int, struct zip_error *); +int _zip_dirent_needs_zip64(const struct zip_dirent *, zip_flags_t); +struct zip_dirent *_zip_dirent_new(void); +int _zip_dirent_read(struct zip_dirent *, FILE *, const unsigned char **, + zip_uint64_t *, int, struct zip_error *); +zip_int32_t _zip_dirent_size(FILE *, zip_uint16_t, struct zip_error *); void _zip_dirent_torrent_normalize(struct zip_dirent *); -int _zip_dirent_write(struct zip_dirent *, FILE *, int, struct zip_error *); - -void _zip_entry_free(struct zip_entry *); -void _zip_entry_init(struct zip *, int); -struct zip_entry *_zip_entry_new(struct zip *); +int _zip_dirent_write(struct zip_dirent *, FILE *, zip_flags_t, struct zip_error *); + +struct zip_extra_field *_zip_ef_clone(const struct zip_extra_field *, struct zip_error *); +struct zip_extra_field *_zip_ef_delete_by_id(struct zip_extra_field *, zip_uint16_t, zip_uint16_t, zip_flags_t); +void _zip_ef_free(struct zip_extra_field *); +const zip_uint8_t *_zip_ef_get_by_id(const struct zip_extra_field *, zip_uint16_t *, zip_uint16_t, zip_uint16_t, zip_flags_t, struct zip_error *); +struct zip_extra_field *_zip_ef_merge(struct zip_extra_field *, struct zip_extra_field *); +struct zip_extra_field *_zip_ef_new(zip_uint16_t, zip_uint16_t, const zip_uint8_t *, zip_flags_t); +struct zip_extra_field *_zip_ef_parse(const zip_uint8_t *, zip_uint16_t, zip_flags_t, struct zip_error *); +struct zip_extra_field *_zip_ef_remove_internal(struct zip_extra_field *); +zip_uint16_t _zip_ef_size(const struct zip_extra_field *, zip_flags_t); +void _zip_ef_write(const struct zip_extra_field *, zip_flags_t, FILE *); + +void _zip_entry_finalize(struct zip_entry *); +void _zip_entry_init(struct zip_entry *); void _zip_error_clear(struct zip_error *); -void _zip_error_copy(struct zip_error *, struct zip_error *); +void _zip_error_copy(struct zip_error *, const struct zip_error *); void _zip_error_fini(struct zip_error *); -void _zip_error_get(struct zip_error *, int *, int *); +void _zip_error_get(const struct zip_error *, int *, int *); void _zip_error_init(struct zip_error *); void _zip_error_set(struct zip_error *, int, int); void _zip_error_set_from_source(struct zip_error *, struct zip_source *); const char *_zip_error_strerror(struct zip_error *); +const zip_uint8_t *_zip_extract_extra_field_by_id(struct zip_error *, zip_uint16_t, int, const zip_uint8_t *, zip_uint16_t, zip_uint16_t *); + +int _zip_file_extra_field_prepare_for_change(struct zip *, zip_uint64_t); int _zip_file_fillbuf(void *, size_t, struct zip_file *); -unsigned int _zip_file_get_offset(struct zip *, int); +zip_uint64_t _zip_file_get_offset(const struct zip *, zip_uint64_t, struct zip_error *); int _zip_filerange_crc(FILE *, off_t, off_t, uLong *, struct zip_error *); -struct zip *_zip_open(const char *, FILE *, int, int, int *); +struct zip_dirent *_zip_get_dirent(struct zip *, zip_uint64_t, zip_flags_t, struct zip_error *); + +enum zip_encoding_type _zip_guess_encoding(struct zip_string *, enum zip_encoding_type); +zip_uint8_t *_zip_cp437_to_utf8(const zip_uint8_t * const, zip_uint32_t, + zip_uint32_t *, struct zip_error *error); + +struct zip *_zip_open(const char *, FILE *, unsigned int, int *); + +int _zip_read_local_ef(struct zip *, zip_uint64_t); struct zip_source *_zip_source_file_or_p(struct zip *, const char *, FILE *, zip_uint64_t, zip_int64_t, int, const struct zip_stat *); struct zip_source *_zip_source_new(struct zip *); - -int _zip_changed(struct zip *, int *); -void _zip_free(struct zip *); -const char *_zip_get_name(struct zip *, zip_uint64_t, int, struct zip_error *); +struct zip_source *_zip_source_zip_new(struct zip *, struct zip *, zip_uint64_t, zip_flags_t, + zip_uint64_t, zip_uint64_t, const char *); + +int _zip_string_equal(const struct zip_string *, const struct zip_string *); +void _zip_string_free(struct zip_string *); +zip_uint32_t _zip_string_crc32(const struct zip_string *); +const zip_uint8_t *_zip_string_get(struct zip_string *, zip_uint32_t *, zip_flags_t, struct zip_error *); +zip_uint16_t _zip_string_length(const struct zip_string *); +struct zip_string *_zip_string_new(const zip_uint8_t *, zip_uint16_t, zip_flags_t, struct zip_error *); +void _zip_string_write(const struct zip_string *, FILE *); + +int _zip_changed(const struct zip *, zip_uint64_t *); +const char *_zip_get_name(struct zip *, zip_uint64_t, zip_flags_t, struct zip_error *); int _zip_local_header_read(struct zip *, int); void *_zip_memdup(const void *, size_t, struct zip_error *); -int _zip_name_locate(struct zip *, const char *, int, struct zip_error *); +zip_int64_t _zip_name_locate(struct zip *, const char *, zip_flags_t, struct zip_error *); struct zip *_zip_new(struct zip_error *); -unsigned short _zip_read2(unsigned char **); -unsigned int _zip_read4(unsigned char **); -zip_int64_t _zip_replace(struct zip *, zip_uint64_t, const char *, - struct zip_source *); -int _zip_set_name(struct zip *, zip_uint64_t, const char *); -void _zip_u2d_time(time_t, unsigned short *, unsigned short *); +zip_uint16_t _zip_read2(const zip_uint8_t **); +zip_uint32_t _zip_read4(const zip_uint8_t **); +zip_uint64_t _zip_read8(const zip_uint8_t **); +zip_uint8_t *_zip_read_data(const zip_uint8_t **, FILE *, size_t, int, struct zip_error *); +zip_int64_t _zip_file_replace(struct zip *, zip_uint64_t, const char *, struct zip_source *, zip_flags_t); +int _zip_set_name(struct zip *, zip_uint64_t, const char *, zip_flags_t); +void _zip_u2d_time(time_t, zip_uint16_t *, zip_uint16_t *); int _zip_unchange(struct zip *, zip_uint64_t, int); void _zip_unchange_data(struct zip_entry *); +void _zip_poke4(zip_uint32_t, zip_uint8_t **); +void _zip_poke8(zip_uint64_t, zip_uint8_t **); +void _zip_write2(zip_uint16_t, FILE *); +void _zip_write4(zip_uint32_t, FILE *); +void _zip_write8(zip_uint64_t, FILE *); + + #endif /* zipint.h */ diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index 0b8f3fcad3304..82f99b02f5484 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -30,8 +30,6 @@ #include "ext/pcre/php_pcre.h" #include "ext/standard/php_filestat.h" #include "php_zip.h" -#include "lib/zip.h" -#include "lib/zipint.h" /* zip_open is a macro for renaming libzip zipopen, so we need to use PHP_NAMED_FUNCTION */ static PHP_NAMED_FUNCTION(zif_zip_open); @@ -53,6 +51,24 @@ static PHP_NAMED_FUNCTION(zif_zip_entry_close); #endif #endif +#if PHP_VERSION_ID < 50400 +#define ARG_PATH "s" +#define KEY_ARG_DC +#define KEY_ARG_CC +#else +#define ARG_PATH "p" +#define KEY_ARG_DC , const zend_literal *key +#define KEY_ARG_CC , key +#endif + +#if PHP_VERSION_ID < 50500 +#define TYPE_ARG_DC +#define TYPE_ARG_CC +#else +#define TYPE_ARG_DC , int type +#define TYPE_ARG_CC , type +#endif + /* {{{ Resource le */ static int le_zip_dir; #define le_zip_dir_name "Zip Directory" @@ -299,7 +315,6 @@ static int php_zip_add_file(struct zip *za, const char *filename, size_t filenam char *entry_name, size_t entry_name_len, long offset_start, long offset_len TSRMLS_DC) /* {{{ */ { struct zip_source *zs; - int cur_idx; char resolved_path[MAXPATHLEN]; zval exists_flag; @@ -321,25 +336,11 @@ static int php_zip_add_file(struct zip *za, const char *filename, size_t filenam if (!zs) { return -1; } - - cur_idx = zip_name_locate(za, (const char *)entry_name, 0); - /* TODO: fix _zip_replace */ - if (cur_idx<0) { - /* reset the error */ - if (za->error.str) { - _zip_error_fini(&za->error); - } - _zip_error_init(&za->error); - } else { - if (zip_delete(za, cur_idx) == -1) { - zip_source_free(zs); - return -1; - } - } - - if (zip_add(za, entry_name, zs) == -1) { + if (zip_file_add(za, entry_name, zs, ZIP_FL_OVERWRITE) < 0) { + zip_source_free(zs); return -1; } else { + zip_error_clear(za); return 1; } } @@ -780,7 +781,11 @@ static const zend_function_entry zip_functions[] = { PHP_FE(zip_entry_name, arginfo_zip_entry_name) PHP_FE(zip_entry_compressedsize, arginfo_zip_entry_compressedsize) PHP_FE(zip_entry_compressionmethod, arginfo_zip_entry_compressionmethod) +#ifdef PHP_FE_END PHP_FE_END +#else + {NULL,NULL,NULL} +#endif }; /* }}} */ @@ -869,7 +874,7 @@ static int php_zip_property_reader(ze_zip_object *obj, zip_prop_handler *hnd, zv } /* }}} */ -static zval **php_zip_get_property_ptr_ptr(zval *object, zval *member, int type, const zend_literal *key TSRMLS_DC) /* {{{ */ +static zval **php_zip_get_property_ptr_ptr(zval *object, zval *member TYPE_ARG_DC KEY_ARG_DC TSRMLS_DC) /* {{{ */ { ze_zip_object *obj; zval tmp_member; @@ -884,24 +889,27 @@ static zval **php_zip_get_property_ptr_ptr(zval *object, zval *member, int type, zval_copy_ctor(&tmp_member); convert_to_string(&tmp_member); member = &tmp_member; +#if PHP_VERSION_ID >= 50400 key = NULL; +#endif } ret = FAILURE; obj = (ze_zip_object *)zend_objects_get_address(object TSRMLS_CC); if (obj->prop_handler != NULL) { +#if PHP_VERSION_ID >= 50400 if (key) { ret = zend_hash_quick_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, key->hash_value, (void **) &hnd); - } else { + } else +#endif ret = zend_hash_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &hnd); - } } if (ret == FAILURE) { std_hnd = zend_get_std_object_handlers(); - retval = std_hnd->get_property_ptr_ptr(object, member, type, key TSRMLS_CC); + retval = std_hnd->get_property_ptr_ptr(object, member TYPE_ARG_CC KEY_ARG_CC TSRMLS_CC); } if (member == &tmp_member) { @@ -911,7 +919,7 @@ static zval **php_zip_get_property_ptr_ptr(zval *object, zval *member, int type, } /* }}} */ -static zval* php_zip_read_property(zval *object, zval *member, int type, const zend_literal *key TSRMLS_DC) /* {{{ */ +static zval* php_zip_read_property(zval *object, zval *member, int type KEY_ARG_DC TSRMLS_DC) /* {{{ */ { ze_zip_object *obj; zval tmp_member; @@ -925,18 +933,21 @@ static zval* php_zip_read_property(zval *object, zval *member, int type, const z zval_copy_ctor(&tmp_member); convert_to_string(&tmp_member); member = &tmp_member; +#if PHP_VERSION_ID >= 50400 key = NULL; +#endif } ret = FAILURE; obj = (ze_zip_object *)zend_objects_get_address(object TSRMLS_CC); if (obj->prop_handler != NULL) { +#if PHP_VERSION_ID >= 50400 if (key) { ret = zend_hash_quick_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, key->hash_value, (void **) &hnd); - } else { + } else +#endif ret = zend_hash_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &hnd); - } } if (ret == SUCCESS) { @@ -949,7 +960,7 @@ static zval* php_zip_read_property(zval *object, zval *member, int type, const z } } else { std_hnd = zend_get_std_object_handlers(); - retval = std_hnd->read_property(object, member, type, key TSRMLS_CC); + retval = std_hnd->read_property(object, member, type KEY_ARG_CC TSRMLS_CC); } if (member == &tmp_member) { @@ -959,7 +970,7 @@ static zval* php_zip_read_property(zval *object, zval *member, int type, const z } /* }}} */ -static int php_zip_has_property(zval *object, zval *member, int type, const zend_literal *key TSRMLS_DC) /* {{{ */ +static int php_zip_has_property(zval *object, zval *member, int type KEY_ARG_DC TSRMLS_DC) /* {{{ */ { ze_zip_object *obj; zval tmp_member; @@ -972,18 +983,21 @@ static int php_zip_has_property(zval *object, zval *member, int type, const zend zval_copy_ctor(&tmp_member); convert_to_string(&tmp_member); member = &tmp_member; +#if PHP_VERSION_ID >= 50400 key = NULL; +#endif } ret = FAILURE; obj = (ze_zip_object *)zend_objects_get_address(object TSRMLS_CC); if (obj->prop_handler != NULL) { +#if PHP_VERSION_ID >= 50400 if (key) { ret = zend_hash_quick_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, key->hash_value, (void **) &hnd); - } else { + } else +#endif ret = zend_hash_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &hnd); - } } if (ret == SUCCESS) { @@ -1005,7 +1019,7 @@ static int php_zip_has_property(zval *object, zval *member, int type, const zend zval_ptr_dtor(&tmp); } else { std_hnd = zend_get_std_object_handlers(); - retval = std_hnd->has_property(object, member, type, key TSRMLS_CC); + retval = std_hnd->has_property(object, member, type KEY_ARG_CC TSRMLS_CC); } if (member == &tmp_member) { @@ -1059,7 +1073,8 @@ static void php_zip_object_free_storage(void *object TSRMLS_DC) /* {{{ */ } if (intern->za) { if (zip_close(intern->za) != 0) { - _zip_free(intern->za); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot destroy the zip context"); + return; } intern->za = NULL; } @@ -1096,6 +1111,9 @@ static void php_zip_object_free_storage(void *object TSRMLS_DC) /* {{{ */ static zend_object_value php_zip_object_new(zend_class_entry *class_type TSRMLS_DC) /* {{{ */ { +#if PHP_VERSION_ID < 50400 + zval *tmp; +#endif ze_zip_object *intern; zend_object_value retval; @@ -1116,8 +1134,13 @@ static zend_object_value php_zip_object_new(zend_class_entry *class_type TSRMLS_ intern->zo.ce = class_type; #endif - object_properties_init(&intern->zo, class_type); +#if PHP_VERSION_ID < 50400 + zend_hash_copy(intern->zo.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, + (void *) &tmp, sizeof(zval *)); +#else + object_properties_init(&intern->zo, class_type); +#endif retval.handle = zend_objects_store_put(intern, NULL, (zend_objects_free_object_storage_t) php_zip_object_free_storage, @@ -1140,7 +1163,7 @@ static void php_zip_free_dir(zend_rsrc_list_entry *rsrc TSRMLS_DC) if (zip_int) { if (zip_int->za) { if (zip_close(zip_int->za) != 0) { - _zip_free(zip_int->za); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot destroy the zip context"); } zip_int->za = NULL; } @@ -1159,13 +1182,7 @@ static void php_zip_free_entry(zend_rsrc_list_entry *rsrc TSRMLS_DC) if (zr_rsrc) { if (zr_rsrc->zf) { - if (zr_rsrc->zf->za) { - zip_fclose(zr_rsrc->zf); - } else { - if (zr_rsrc->zf->src) - zip_source_free(zr_rsrc->zf->src); - free(zr_rsrc->zf); - } + zip_fclose(zr_rsrc->zf); zr_rsrc->zf = NULL; } efree(zr_rsrc); @@ -1195,7 +1212,7 @@ zend_module_entry zip_module_entry = { NULL, NULL, PHP_MINFO(zip), - PHP_ZIP_VERSION_STRING, + PHP_ZIP_VERSION, STANDARD_MODULE_PROPERTIES }; /* }}} */ @@ -1215,7 +1232,7 @@ static PHP_NAMED_FUNCTION(zif_zip_open) zip_rsrc *rsrc_int; int err = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p", &filename, &filename_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH, &filename, &filename_len) == FAILURE) { return; } @@ -1498,7 +1515,7 @@ static ZIPARCHIVE_METHOD(open) zval *this = getThis(); ze_zip_object *ze_obj = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|l", &filename, &filename_len, &flags) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH "|l", &filename, &filename_len, &flags) == FAILURE) { return; } @@ -1523,7 +1540,8 @@ static ZIPARCHIVE_METHOD(open) if (ze_obj->za) { /* we already have an opened zip, free it */ if (zip_close(ze_obj->za) != 0) { - _zip_free(ze_obj->za); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty string as source"); + RETURN_FALSE; } ze_obj->za = NULL; } @@ -1543,6 +1561,38 @@ static ZIPARCHIVE_METHOD(open) } /* }}} */ +/* {{{ proto resource ZipArchive::setPassword(string password) +Set the password for the active archive */ +static ZIPARCHIVE_METHOD(setPassword) +{ + struct zip *intern; + zval *this = getThis(); + char *password; + int password_len; + + if (!this) { + RETURN_FALSE; + } + + ZIP_FROM_OBJECT(intern, this); + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &password, &password_len) == FAILURE) { + return; + } + + if (password_len < 1) { + RETURN_FALSE; + } else { + int res = zip_set_default_password(intern, (const char *)password); + if (res == 0) { + RETURN_TRUE; + } else { + RETURN_FALSE; + } + } +} +/* }}} */ + /* {{{ proto bool ZipArchive::close() close the zip archive */ static ZIPARCHIVE_METHOD(close) @@ -1552,7 +1602,7 @@ static ZIPARCHIVE_METHOD(close) ze_zip_object *ze_obj; if (!this) { - RETURN_FALSE; + RETURN_FALSE; } ZIP_FROM_OBJECT(intern, this); @@ -1560,7 +1610,7 @@ static ZIPARCHIVE_METHOD(close) ze_obj = (ze_zip_object*) zend_object_store_get_object(this TSRMLS_CC); if (zip_close(intern)) { - RETURN_FALSE; + zip_discard(intern); } efree(ze_obj->filename); @@ -1637,6 +1687,7 @@ static ZIPARCHIVE_METHOD(addEmptyDir) if (zip_add_dir(intern, (const char *)s) == -1) { RETVAL_FALSE; } + zip_error_clear(intern); RETVAL_TRUE; } @@ -1654,7 +1705,7 @@ static void php_zip_add_from_pattern(INTERNAL_FUNCTION_PARAMETERS, int type) /* char *path = NULL; char *remove_path = NULL; char *add_path = NULL; - int pattern_len, add_path_len = 0, remove_path_len = 0, path_len = 0; + int pattern_len, add_path_len, remove_path_len = 0, path_len = 0; long remove_all_path = 0; long flags = 0; zval *options = NULL; @@ -1667,12 +1718,12 @@ static void php_zip_add_from_pattern(INTERNAL_FUNCTION_PARAMETERS, int type) /* ZIP_FROM_OBJECT(intern, this); /* 1 == glob, 2==pcre */ if (type == 1) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|la", + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH "|la", &pattern, &pattern_len, &flags, &options) == FAILURE) { return; } } else { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|sa", + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH "|sa", &pattern, &pattern_len, &path, &path_len, &options) == FAILURE) { return; } @@ -1703,13 +1754,12 @@ static void php_zip_add_from_pattern(INTERNAL_FUNCTION_PARAMETERS, int type) /* zval **zval_file = NULL; for (i = 0; i < found; i++) { - char *file, *file_stripped, *entry_name; + char *file_stripped, *entry_name; size_t entry_name_len, file_stripped_len; char entry_name_buf[MAXPATHLEN]; char *basename = NULL; if (zend_hash_index_find(Z_ARRVAL_P(return_value), i, (void **) &zval_file) == SUCCESS) { - file = Z_STRVAL_PP(zval_file); if (remove_all_path) { php_basename(Z_STRVAL_PP(zval_file), Z_STRLEN_PP(zval_file), NULL, 0, &basename, (size_t *)&file_stripped_len TSRMLS_CC); @@ -1786,7 +1836,7 @@ static ZIPARCHIVE_METHOD(addFile) ZIP_FROM_OBJECT(intern, this); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|sll", + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH "|sll", &filename, &filename_len, &entry_name, &entry_name_len, &offset_start, &offset_len) == FAILURE) { return; } @@ -1856,16 +1906,18 @@ static ZIPARCHIVE_METHOD(addFromString) /* TODO: fix _zip_replace */ if (cur_idx >= 0) { if (zip_delete(intern, cur_idx) == -1) { - goto fail; + zip_source_free(zs); + RETURN_FALSE; } } - if (zip_add(intern, name, zs) != -1) { + if (zip_add(intern, name, zs) == -1) { + zip_source_free(zs); + RETURN_FALSE; + } else { + zip_error_clear(intern); RETURN_TRUE; } -fail: - zip_source_free(zs); - RETURN_FALSE; } /* }}} */ @@ -1886,7 +1938,7 @@ static ZIPARCHIVE_METHOD(statName) ZIP_FROM_OBJECT(intern, this); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|l", + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH "|l", &name, &name_len, &flags) == FAILURE) { return; } @@ -1942,7 +1994,7 @@ static ZIPARCHIVE_METHOD(locateName) ZIP_FROM_OBJECT(intern, this); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|l", + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH "|l", &name, &name_len, &flags) == FAILURE) { return; } @@ -2522,7 +2574,7 @@ static void php_zip_get_from(INTERNAL_FUNCTION_PARAMETERS, int type) /* {{{ */ ZIP_FROM_OBJECT(intern, this); if (type == 1) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|ll", &filename, &filename_len, &len, &flags) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH "|ll", &filename, &filename_len, &len, &flags) == FAILURE) { return; } PHP_ZIP_STAT_PATH(intern, filename, filename_len, flags, sb); @@ -2598,7 +2650,7 @@ static ZIPARCHIVE_METHOD(getStream) ZIP_FROM_OBJECT(intern, this); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p", &filename, &filename_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, ARG_PATH, &filename, &filename_len) == FAILURE) { return; } @@ -2621,6 +2673,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_ziparchive_open, 0, 0, 1) ZEND_ARG_INFO(0, flags) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_ziparchive_setpassword, 0, 0, 1) + ZEND_ARG_INFO(0, password) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO(arginfo_ziparchive__void, 0) ZEND_END_ARG_INFO() @@ -2733,6 +2789,7 @@ ZEND_END_ARG_INFO() /* {{{ ze_zip_object_class_functions */ static const zend_function_entry zip_class_functions[] = { ZIPARCHIVE_ME(open, arginfo_ziparchive_open, ZEND_ACC_PUBLIC) + ZIPARCHIVE_ME(setPassword, arginfo_ziparchive_setpassword, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(close, arginfo_ziparchive__void, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(getStatusString, arginfo_ziparchive__void, ZEND_ACC_PUBLIC) ZIPARCHIVE_ME(addEmptyDir, arginfo_ziparchive_addemptydir, ZEND_ACC_PUBLIC) @@ -2875,7 +2932,7 @@ static PHP_MINFO_FUNCTION(zip) php_info_print_table_row(2, "Zip", "enabled"); php_info_print_table_row(2, "Extension Version","$Id$"); - php_info_print_table_row(2, "Zip version", PHP_ZIP_VERSION_STRING); + php_info_print_table_row(2, "Zip version", PHP_ZIP_VERSION); php_info_print_table_row(2, "Libzip version", LIBZIP_VERSION); php_info_print_table_end(); diff --git a/ext/zip/php_zip.h b/ext/zip/php_zip.h index dace407d14f31..c8da941b7a82d 100644 --- a/ext/zip/php_zip.h +++ b/ext/zip/php_zip.h @@ -28,9 +28,17 @@ extern zend_module_entry zip_module_entry; #include "TSRM.h" #endif +#if defined(HAVE_LIBZIP) +#include +#else #include "lib/zip.h" +#endif -#define PHP_ZIP_VERSION_STRING "1.11.0" +#ifndef ZIP_OVERWRITE +#define ZIP_OVERWRITE ZIP_TRUNCATE +#endif + +#define PHP_ZIP_VERSION "1.12.3" #if ((PHP_MAJOR_VERSION >= 5 && PHP_MINOR_VERSION >= 2) || PHP_MAJOR_VERSION >= 6) # define PHP_ZIP_USE_OO 1 @@ -67,8 +75,9 @@ typedef struct _ze_zip_read_rsrc { } zip_read_rsrc; #ifdef PHP_ZIP_USE_OO -#define ZIPARCHIVE_ME(name, arg_info, flags) ZEND_FENTRY(name, c_ziparchive_ ##name, arg_info, flags) -#define ZIPARCHIVE_METHOD(name) ZEND_NAMED_FUNCTION(c_ziparchive_##name) +#define ZIPARCHIVE_ME(name, arg_info, flags) {#name, c_ziparchive_ ##name, arg_info,(zend_uint) (sizeof(arg_info)/sizeof(struct _zend_arg_info)-1), flags }, +#define ZIPARCHIVE_METHOD(name) ZEND_NAMED_FUNCTION(c_ziparchive_ ##name) + /* Extends zend object */ typedef struct _ze_zip_object { diff --git a/ext/zip/tests/bug38943.inc b/ext/zip/tests/bug38943.inc new file mode 100644 index 0000000000000..a6f45e8294eff --- /dev/null +++ b/ext/zip/tests/bug38943.inc @@ -0,0 +1,16 @@ +testarray[] = 1; + var_dump($this->testarray); + } +} + +$z = new myZip; +$z->testp = "foobar"; +var_dump($z); + diff --git a/ext/zip/tests/bug38943_2.phpt b/ext/zip/tests/bug38943_2.phpt new file mode 100644 index 0000000000000..bdbad94517cc9 --- /dev/null +++ b/ext/zip/tests/bug38943_2.phpt @@ -0,0 +1,38 @@ +--TEST-- +#38943, properties in extended class cannot be set (5.3) +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +array(1) { + [0]=> + int(1) +} +object(myZip)#1 (%d) { + ["test":"myZip":private]=> + int(0) + ["testp"]=> + string(6) "foobar" + ["testarray":"myZip":private]=> + array(1) { + [0]=> + int(1) + } + ["status"]=> + int(0) + ["statusSys"]=> + int(0) + ["numFiles"]=> + int(0) + ["filename"]=> + string(0) "" + ["comment"]=> + string(0) "" +} diff --git a/ext/zip/tests/doubleclose.phpt b/ext/zip/tests/doubleclose.phpt new file mode 100644 index 0000000000000..abc62c8434789 --- /dev/null +++ b/ext/zip/tests/doubleclose.phpt @@ -0,0 +1,43 @@ +--TEST-- +close() called twice +--SKIPIF-- + +--FILE-- +open(dirname(__FILE__) . '/test.zip')) { + die('Failure'); +} +if ($zip->status == ZIPARCHIVE::ER_OK) { + var_dump($zip->close()); + var_dump($zip->close()); +} else { + die("Failure"); +} + +?> +Done +--EXPECTF-- +Procedural +NULL + +Warning: zip_close(): %i is not a valid Zip Directory resource in %s +bool(false) +Object +bool(true) + +Warning: ZipArchive::close(): Invalid or uninitialized Zip object in %s +bool(false) +Done diff --git a/ext/zip/tests/zip_entry_close.phpt b/ext/zip/tests/zip_entry_close.phpt new file mode 100644 index 0000000000000..82b7819054f49 --- /dev/null +++ b/ext/zip/tests/zip_entry_close.phpt @@ -0,0 +1,24 @@ +--TEST-- +zip_entry_close() function: simple and double call +--SKIPIF-- + +--FILE-- + +Done +--EXPECTF-- +entry_open: bool(true) +entry_close: bool(true) +entry_close: +Warning: zip_entry_close(): %d is not a valid Zip Entry resource in %s +bool(false) +Done diff --git a/ext/zip/zip_stream.c b/ext/zip/zip_stream.c index 79b54cbbb0cdc..02fbc70f85e60 100644 --- a/ext/zip/zip_stream.c +++ b/ext/zip/zip_stream.c @@ -1,3 +1,21 @@ +/* + +----------------------------------------------------------------------+ + | 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: Piere-Alain Joye | + +----------------------------------------------------------------------+ +*/ + /* $Id$ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -6,8 +24,6 @@ #if HAVE_ZIP #ifdef ZEND_ENGINE_2 -#include "lib/zip.h" - #include "php_streams.h" #include "ext/standard/file.h" #include "ext/standard/php_string.h" From 5b8ae0143f5b6cd735e0c201d85556654a89db9e Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Mon, 4 Nov 2013 13:32:45 +0100 Subject: [PATCH 378/400] NEWS + UPGRADING --- NEWS | 6 ++++++ UPGRADING | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/NEWS b/NEWS index ed8bcc93b154f..0a4b78c9c6186 100644 --- a/NEWS +++ b/NEWS @@ -70,4 +70,10 @@ PHP NEWS . Fixed bug #55285 (XMLReader::getAttribute/No/Ns methods inconsistency). (Mike) +- Zip: + . update libzip to version 1.11.1. + PHP don't use any ilibzip private symbol anymore. (Pierre, Remi) + . new method ZipArchive::setPassword($password). (Pierre) + . add --with-libzip option to build with system libzip. (Remi) + <<< NOTE: Insert NEWS from last stable release here prior to actual release! >>> diff --git a/UPGRADING b/UPGRADING index ab05b3a8bff04..022918cb14594 100755 --- a/UPGRADING +++ b/UPGRADING @@ -86,6 +86,9 @@ PHP X.Y UPGRADE NOTES - LDAP: Added ldap_escape($value, $ignore = "", $flags = 0). +- Zip: + Added ZipArchive::setPassword($password) + ======================================== 6. New Classes and Interfaces ======================================== @@ -141,3 +144,6 @@ PHP X.Y UPGRADE NOTES - HTTP stream wrapper: HTTP 1.1 requests now include a Connection: close header unless explicitly overridden by setting a Connection header via the header context option. + +- Zip: + New --with-libzip option allow to use system libzip. Version > 0.11 required. From e3d9e18e7b24ba2d5c9e420510e804330c94f955 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Tue, 5 Nov 2013 11:04:55 +0800 Subject: [PATCH 379/400] Fixed Bug #66034 (Segmentation Fault when constructor of PDO statement throws an exception) I know zend_call_function will initilize retval_ptr_ptr, but still set it to NULL explict is more readable --- NEWS | 6 +++++- ext/pdo/pdo_dbh.c | 4 ++-- ext/pdo_sqlite/tests/bug66033.phpt | 33 ++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 ext/pdo_sqlite/tests/bug66033.phpt diff --git a/NEWS b/NEWS index e5b79ec7bfafb..c3e70d94a3f51 100644 --- a/NEWS +++ b/NEWS @@ -18,10 +18,14 @@ PHP NEWS - FTP: . Fixed bug #65667 (ftp_nb_continue produces segfault). (Philip Hofstetter) -- ODBC +- ODBC: . Fixed bug #65950 (Field name truncation if the field name is bigger than 32 characters). (patch submitted by: michael dot y at zend dot com, Yasuo) +- PDO: + . Fixed bug #66033 (Segmentation Fault when constructor of PDO statement + throws an exception). (Laruence) + - Sockets: . Fixed bug #65808 (the socket_connect() won't work with IPv6 address). (Mike) diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c index d5860b1a1eb02..ac8d29a95cad1 100644 --- a/ext/pdo/pdo_dbh.c +++ b/ext/pdo/pdo_dbh.c @@ -460,7 +460,7 @@ static void pdo_stmt_construct(pdo_stmt_t *stmt, zval *object, zend_class_entry if (dbstmt_ce->constructor) { zend_fcall_info fci; zend_fcall_info_cache fcc; - zval *retval; + zval *retval = NULL; fci.size = sizeof(zend_fcall_info); fci.function_table = &dbstmt_ce->function_table; @@ -495,7 +495,7 @@ static void pdo_stmt_construct(pdo_stmt_t *stmt, zval *object, zend_class_entry zval_dtor(object); ZVAL_NULL(object); object = NULL; /* marks failure */ - } else { + } else if (retval) { zval_ptr_dtor(&retval); } diff --git a/ext/pdo_sqlite/tests/bug66033.phpt b/ext/pdo_sqlite/tests/bug66033.phpt new file mode 100644 index 0000000000000..28da3b54bfff1 --- /dev/null +++ b/ext/pdo_sqlite/tests/bug66033.phpt @@ -0,0 +1,33 @@ +--TEST-- +Bug #66033 (Segmentation Fault when constructor of PDO statement throws an exception) +--SKIPIF-- + +--FILE-- +dbh = $dbh; + throw new Exception("Blah"); + } +} + +$pdo = new PDO('sqlite::memory:', null, null); +$pdo->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('DBStatement', + array($pdo))); +$pdo->exec("CREATE TABLE IF NOT EXISTS messages ( + id INTEGER PRIMARY KEY, + title TEXT, + message TEXT, + time INTEGER)"); + +try { + $pdoStatement = $pdo->query("select * from messages"); +} catch (Exception $e) { + var_dump($e->getMessage()); +} +?> +--EXPECTF-- +string(4) "Blah" From 906d3ae0edb1c371f4ad73585ef25337f8e0ef97 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Tue, 5 Nov 2013 11:08:55 +0800 Subject: [PATCH 380/400] Update NEWS --- NEWS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NEWS b/NEWS index 0c8a15a5f9175..26990debce239 100644 --- a/NEWS +++ b/NEWS @@ -21,6 +21,10 @@ PHP NEWS . Fixed bug #65950 (Field name truncation if the field name is bigger than 32 characters). (patch submitted by: michael dot y at zend dot com, Yasuo) +- PDO: + . Fixed bug #66033 (Segmentation Fault when constructor of PDO statement + throws an exception). (Laruence) + - Standard: . Fixed bug #64760 (var_export() does not use full precision for floating-point numbers) (Yasuo) From 63dba7ec9d7ce1ec5e2d48742c71ce66db973b93 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Tue, 5 Nov 2013 18:47:12 +0800 Subject: [PATCH 381/400] Remove outdate codes, make it clearer, although just a bit.. --- ext/phar/phar.c | 94 +----------- ext/phar/phar_internal.h | 59 -------- ext/phar/phar_object.c | 78 +--------- ext/phar/stream.c | 12 -- ext/phar/util.c | 299 +-------------------------------------- ext/phar/zip.c | 10 -- 6 files changed, 6 insertions(+), 546 deletions(-) diff --git a/ext/phar/phar.c b/ext/phar/phar.c index ec8e5fbde7521..13b3d6428e324 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -27,9 +27,7 @@ static void destroy_phar_data(void *pDest); ZEND_DECLARE_MODULE_GLOBALS(phar) -#if PHP_VERSION_ID >= 50300 char *(*phar_save_resolve_path)(const char *filename, int filename_len TSRMLS_DC); -#endif /** * set's phar->is_writeable based on the current INI value @@ -3321,31 +3319,18 @@ static size_t phar_zend_stream_reader(void *handle, char *buf, size_t len TSRMLS } /* }}} */ -#if PHP_VERSION_ID >= 50300 static size_t phar_zend_stream_fsizer(void *handle TSRMLS_DC) /* {{{ */ { return ((phar_archive_data*)handle)->halt_offset + 32; } /* }}} */ -#else /* PHP_VERSION_ID */ - -static long phar_stream_fteller_for_zend(void *handle TSRMLS_DC) /* {{{ */ -{ - return (long)php_stream_tell(phar_get_pharfp((phar_archive_data*)handle TSRMLS_CC)); -} -/* }}} */ -#endif - zend_op_array *(*phar_orig_compile_file)(zend_file_handle *file_handle, int type TSRMLS_DC); -#if PHP_VERSION_ID >= 50300 #define phar_orig_zend_open zend_stream_open_function + static char *phar_resolve_path(const char *filename, int filename_len TSRMLS_DC) { return phar_find_in_include_path((char *) filename, filename_len, NULL TSRMLS_CC); } -#else -int (*phar_orig_zend_open)(const char *filename, zend_file_handle *handle TSRMLS_DC); -#endif static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC) /* {{{ */ { @@ -3378,7 +3363,6 @@ static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type } } else if (phar->flags & PHAR_FILE_COMPRESSION_MASK) { /* compressed phar */ -#if PHP_VERSION_ID >= 50300 file_handle->type = ZEND_HANDLE_STREAM; /* we do our own reading directly from the phar, don't change the next line */ file_handle->handle.stream.handle = phar; @@ -3390,18 +3374,6 @@ static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type php_stream_rewind(PHAR_GLOBALS->cached_fp[phar->phar_pos].fp) : php_stream_rewind(phar->fp); memset(&file_handle->handle.stream.mmap, 0, sizeof(file_handle->handle.stream.mmap)); -#else /* PHP_VERSION_ID */ - file_handle->type = ZEND_HANDLE_STREAM; - /* we do our own reading directly from the phar, don't change the next line */ - file_handle->handle.stream.handle = phar; - file_handle->handle.stream.reader = phar_zend_stream_reader; - file_handle->handle.stream.closer = NULL; /* don't close - let phar handle this one */ - file_handle->handle.stream.fteller = phar_stream_fteller_for_zend; - file_handle->handle.stream.interactive = 0; - phar->is_persistent ? - php_stream_rewind(PHAR_GLOBALS->cached_fp[phar->phar_pos].fp) : - php_stream_rewind(phar->fp); -#endif } } } @@ -3426,60 +3398,6 @@ static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type } /* }}} */ -#if PHP_VERSION_ID < 50300 -int phar_zend_open(const char *filename, zend_file_handle *handle TSRMLS_DC) /* {{{ */ -{ - char *arch, *entry; - int arch_len, entry_len; - - /* this code is obsoleted in php 5.3 */ - entry = (char *) filename; - if (!IS_ABSOLUTE_PATH(entry, strlen(entry)) && !strstr(entry, "://")) { - phar_archive_data **pphar = NULL; - char *fname; - int fname_len; - - fname = (char*)zend_get_executed_filename(TSRMLS_C); - fname_len = strlen(fname); - - if (fname_len > 7 && !strncasecmp(fname, "phar://", 7)) { - if (SUCCESS == phar_split_fname(fname, fname_len, &arch, &arch_len, &entry, &entry_len, 1, 0 TSRMLS_CC)) { - zend_hash_find(&(PHAR_GLOBALS->phar_fname_map), arch, arch_len, (void **) &pphar); - if (!pphar && PHAR_G(manifest_cached)) { - zend_hash_find(&cached_phars, arch, arch_len, (void **) &pphar); - } - efree(arch); - efree(entry); - } - } - - /* retrieving an include within the current directory, so use this if possible */ - if (!(entry = phar_find_in_include_path((char *) filename, strlen(filename), NULL TSRMLS_CC))) { - /* this file is not in the phar, use the original path */ - goto skip_phar; - } - - if (SUCCESS == phar_orig_zend_open(entry, handle TSRMLS_CC)) { - if (!handle->opened_path) { - handle->opened_path = entry; - } - if (entry != filename) { - handle->free_filename = 1; - } - return SUCCESS; - } - - if (entry != filename) { - efree(entry); - } - - return FAILURE; - } -skip_phar: - return phar_orig_zend_open(filename, handle TSRMLS_CC); -} -/* }}} */ -#endif typedef zend_op_array* (zend_compile_t)(zend_file_handle*, int TSRMLS_DC); typedef zend_compile_t* (compile_hook)(zend_compile_t *ptr); @@ -3556,13 +3474,8 @@ PHP_MINIT_FUNCTION(phar) /* {{{ */ phar_orig_compile_file = zend_compile_file; zend_compile_file = phar_compile_file; -#if PHP_VERSION_ID >= 50300 phar_save_resolve_path = zend_resolve_path; zend_resolve_path = phar_resolve_path; -#else - phar_orig_zend_open = zend_stream_open_function; - zend_stream_open_function = phar_zend_open; -#endif phar_object_init(TSRMLS_C); @@ -3583,11 +3496,6 @@ PHP_MSHUTDOWN_FUNCTION(phar) /* {{{ */ zend_compile_file = phar_orig_compile_file; } -#if PHP_VERSION_ID < 50300 - if (zend_stream_open_function == phar_zend_open) { - zend_stream_open_function = phar_orig_zend_open; - } -#endif if (PHAR_G(manifest_cached)) { zend_hash_destroy(&(cached_phars)); zend_hash_destroy(&(cached_alias)); diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h index daa85f1b70f8b..fcfb6471844a0 100644 --- a/ext/phar/phar_internal.h +++ b/ext/phar/phar_internal.h @@ -516,76 +516,17 @@ union _phar_entry_object { #endif #ifndef PHAR_MAIN -# if PHP_VERSION_ID >= 50300 extern char *(*phar_save_resolve_path)(const char *filename, int filename_len TSRMLS_DC); -# endif #endif -#if PHP_VERSION_ID < 50209 -static inline size_t phar_stream_copy_to_stream(php_stream *src, php_stream *dest, size_t maxlen, size_t *len STREAMS_DC TSRMLS_DC) -{ - size_t ret = php_stream_copy_to_stream(src, dest, maxlen); - if (len) { - *len = ret; - } - if (ret) { - return SUCCESS; - } - return FAILURE; -} -#else # define phar_stream_copy_to_stream(src, dest, maxlen, len) _php_stream_copy_to_stream_ex((src), (dest), (maxlen), (len) STREAMS_CC TSRMLS_CC) -#endif - -#if PHP_VERSION_ID >= 60000 -typedef zstr phar_zstr; -#define PHAR_STR(a, b) \ - spprintf(&b, 0, "%s", a.s); -#define PHAR_ZSTR(a, b) \ - b = ZSTR(a); -#define PHAR_STR_FREE(a) \ - efree(a); -static inline int phar_make_unicode(zstr *c_var, char *arKey, uint nKeyLength TSRMLS_DC) -{ - int c_var_len; - UConverter *conv = ZEND_U_CONVERTER(UG(runtime_encoding_conv)); - - c_var->u = NULL; - if (zend_string_to_unicode(conv, &c_var->u, &c_var_len, arKey, nKeyLength TSRMLS_CC) == FAILURE) { - - if (c_var->u) { - efree(c_var->u); - } - return 0; - - } - return c_var_len; -} -static inline int phar_find_key(HashTable *_SERVER, char *key, int len, void **stuff TSRMLS_DC) -{ - if (SUCCESS == zend_hash_find(_SERVER, key, len, stuff)) { - return 1; - } else { - int s = len; - zstr var; - s = phar_make_unicode(&var, key, len TSRMLS_CC); - if (SUCCESS == zend_u_hash_find(_SERVER, IS_UNICODE, var, s, stuff)) { - efree(var.u); - return 1; - } - efree(var.u); - return 0; - } -} -#else typedef char *phar_zstr; #define PHAR_STR(a, b) \ b = a; #define PHAR_ZSTR(a, b) \ b = a; #define PHAR_STR_FREE(a) -#endif BEGIN_EXTERN_C() diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index dcb67fe9fa6e4..7d2922fbaa15c 100644 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -685,11 +685,7 @@ PHP_METHOD(Phar, webPhar) ZVAL_STRINGL(params, entry, entry_len, 1); zp[0] = ¶ms; -#if PHP_VERSION_ID < 50300 - if (FAILURE == zend_fcall_info_init(rewrite, &fci, &fcc TSRMLS_CC)) { -#else if (FAILURE == zend_fcall_info_init(rewrite, 0, &fci, &fcc, NULL, NULL TSRMLS_CC)) { -#endif zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "phar error: invalid rewrite callback"); if (free_pathinfo) { @@ -701,11 +697,7 @@ PHP_METHOD(Phar, webPhar) fci.param_count = 1; fci.params = zp; -#if PHP_VERSION_ID < 50300 - ++(params->refcount); -#else Z_ADDREF_P(params); -#endif fci.retval_ptr_ptr = &retval_ptr; if (FAILURE == zend_call_function(&fci, &fcc TSRMLS_CC)) { @@ -729,11 +721,6 @@ PHP_METHOD(Phar, webPhar) } switch (Z_TYPE_P(retval_ptr)) { -#if PHP_VERSION_ID >= 60000 - case IS_UNICODE: - zval_unicode_to_string(retval_ptr TSRMLS_CC); - /* break intentionally omitted */ -#endif case IS_STRING: efree(entry); @@ -1155,11 +1142,7 @@ PHP_METHOD(Phar, __construct) #else char *fname, *alias = NULL, *error, *arch = NULL, *entry = NULL, *save_fname; int fname_len, alias_len = 0, arch_len, entry_len, is_data; -#if PHP_VERSION_ID < 50300 - long flags = 0; -#else long flags = SPL_FILE_DIR_SKIPDOTS|SPL_FILE_DIR_UNIXPATHS; -#endif long format = 0; phar_archive_object *phar_obj; phar_archive_data *phar_data; @@ -1459,11 +1442,6 @@ static int phar_build(zend_object_iterator *iter, void *puser TSRMLS_DC) /* {{{ } switch (Z_TYPE_PP(value)) { -#if PHP_VERSION_ID >= 60000 - case IS_UNICODE: - zval_unicode_to_string(*(value) TSRMLS_CC); - /* break intentionally omitted */ -#endif case IS_STRING: break; case IS_RESOURCE: @@ -1514,13 +1492,7 @@ static int phar_build(zend_object_iterator *iter, void *puser TSRMLS_DC) /* {{{ switch (intern->type) { case SPL_FS_DIR: -#if PHP_VERSION_ID >= 60000 - test = spl_filesystem_object_get_path(intern, NULL, NULL TSRMLS_CC).s; -#elif PHP_VERSION_ID >= 50300 test = spl_filesystem_object_get_path(intern, NULL TSRMLS_CC); -#else - test = intern->path; -#endif fname_len = spprintf(&fname, 0, "%s%c%s", test, DEFAULT_SLASH, intern->u.dir.entry.d_name); php_stat(fname, fname_len, FS_IS_DIR, &dummy TSRMLS_CC); @@ -1545,25 +1517,7 @@ static int phar_build(zend_object_iterator *iter, void *puser TSRMLS_DC) /* {{{ goto phar_spl_fileinfo; case SPL_FS_INFO: case SPL_FS_FILE: -#if PHP_VERSION_ID >= 60000 - if (intern->file_name_type == IS_UNICODE) { - zval zv; - - INIT_ZVAL(zv); - Z_UNIVAL(zv) = intern->file_name; - Z_UNILEN(zv) = intern->file_name_len; - Z_TYPE(zv) = IS_UNICODE; - - zval_copy_ctor(&zv); - zval_unicode_to_string(&zv TSRMLS_CC); - fname = expand_filepath(Z_STRVAL(zv), NULL TSRMLS_CC); - ezfree(Z_UNIVAL(zv)); - } else { - fname = expand_filepath(intern->file_name.s, NULL TSRMLS_CC); - } -#else fname = expand_filepath(intern->file_name, NULL TSRMLS_CC); -#endif if (!fname) { zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Could not resolve file path"); return ZEND_HASH_APPLY_STOP; @@ -1816,11 +1770,7 @@ PHP_METHOD(Phar, buildFromDirectory) INIT_PZVAL(&arg); ZVAL_STRINGL(&arg, dir, dir_len, 0); INIT_PZVAL(&arg2); -#if PHP_VERSION_ID < 50300 - ZVAL_LONG(&arg2, 0); -#else ZVAL_LONG(&arg2, SPL_FILE_DIR_SKIPDOTS|SPL_FILE_DIR_UNIXPATHS); -#endif zend_call_method_with_2_params(&iter, spl_ce_RecursiveDirectoryIterator, &spl_ce_RecursiveDirectoryIterator->constructor, "__construct", NULL, &arg, &arg2); @@ -2313,11 +2263,7 @@ static zval *phar_convert_to_other(phar_archive_data *source, int convert, char ALLOC_ZVAL(phar->metadata); *phar->metadata = *t; zval_copy_ctor(phar->metadata); -#if PHP_VERSION_ID < 50300 - phar->metadata->refcount = 1; -#else Z_SET_REFCOUNT_P(phar->metadata, 1); -#endif phar->metadata_len = 0; } @@ -2365,11 +2311,7 @@ static zval *phar_convert_to_other(phar_archive_data *source, int convert, char ALLOC_ZVAL(newentry.metadata); *newentry.metadata = *t; zval_copy_ctor(newentry.metadata); -#if PHP_VERSION_ID < 50300 - newentry.metadata->refcount = 1; -#else Z_SET_REFCOUNT_P(newentry.metadata, 1); -#endif newentry.metadata_str.c = NULL; newentry.metadata_str.len = 0; @@ -3552,11 +3494,7 @@ PHP_METHOD(Phar, copy) ALLOC_ZVAL(newentry.metadata); *newentry.metadata = *t; zval_copy_ctor(newentry.metadata); -#if PHP_VERSION_ID < 50300 - newentry.metadata->refcount = 1; -#else Z_SET_REFCOUNT_P(newentry.metadata, 1); -#endif newentry.metadata_str.c = NULL; newentry.metadata_str.len = 0; @@ -4371,11 +4309,6 @@ PHP_METHOD(Phar, extractTo) switch (Z_TYPE_P(zval_files)) { case IS_NULL: goto all_files; -#if PHP_VERSION_ID >= 60000 - case IS_UNICODE: - zval_unicode_to_string(zval_files TSRMLS_CC); - /* break intentionally omitted */ -#endif case IS_STRING: filename = Z_STRVAL_P(zval_files); filename_len = Z_STRLEN_P(zval_files); @@ -4389,11 +4322,6 @@ PHP_METHOD(Phar, extractTo) zval **zval_file; if (zend_hash_index_find(Z_ARRVAL_P(zval_files), i, (void **) &zval_file) == SUCCESS) { switch (Z_TYPE_PP(zval_file)) { -#if PHP_VERSION_ID >= 60000 - case IS_UNICODE: - zval_unicode_to_string(*(zval_file) TSRMLS_CC); - /* break intentionally omitted */ -#endif case IS_STRING: break; default: @@ -5414,11 +5342,7 @@ zend_function_entry phar_exception_methods[] = { #define REGISTER_PHAR_CLASS_CONST_LONG(class_name, const_name, value) \ zend_declare_class_constant_long(class_name, const_name, sizeof(const_name)-1, (long)value TSRMLS_CC); -#if PHP_VERSION_ID < 50200 -# define phar_exception_get_default() zend_exception_get_default() -#else -# define phar_exception_get_default() zend_exception_get_default(TSRMLS_C) -#endif +#define phar_exception_get_default() zend_exception_get_default(TSRMLS_C) void phar_object_init(TSRMLS_D) /* {{{ */ { diff --git a/ext/phar/stream.c b/ext/phar/stream.c index 401d81e109bcb..f4197a5b11672 100644 --- a/ext/phar/stream.c +++ b/ext/phar/stream.c @@ -942,11 +942,7 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, char *url_from, char entry->filename_len = new_key_len; PHAR_ZSTR(new_str_key, new_key); -#if PHP_VERSION_ID < 50300 - zend_hash_update_current_key_ex(&phar->manifest, key_type, new_key, new_key_len, 0, NULL); -#else zend_hash_update_current_key_ex(&phar->manifest, key_type, new_key, new_key_len, 0, HASH_UPDATE_KEY_ANYWAY, NULL); -#endif } PHAR_STR_FREE(str_key); } @@ -968,11 +964,7 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, char *url_from, char new_str_key[new_key_len] = 0; PHAR_ZSTR(new_str_key, new_key); -#if PHP_VERSION_ID < 50300 - zend_hash_update_current_key_ex(&phar->virtual_dirs, key_type, new_key, new_key_len, 0, NULL); -#else zend_hash_update_current_key_ex(&phar->virtual_dirs, key_type, new_key, new_key_len, 0, HASH_UPDATE_KEY_ANYWAY, NULL); -#endif efree(new_str_key); } PHAR_STR_FREE(str_key); @@ -996,11 +988,7 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, char *url_from, char new_str_key[new_key_len] = 0; PHAR_ZSTR(new_str_key, new_key); -#if PHP_VERSION_ID < 50300 - zend_hash_update_current_key_ex(&phar->mounted_dirs, key_type, new_key, new_key_len, 0, NULL); -#else zend_hash_update_current_key_ex(&phar->mounted_dirs, key_type, new_key, new_key_len, 0, HASH_UPDATE_KEY_ANYWAY, NULL); -#endif efree(new_str_key); } PHAR_STR_FREE(str_key); diff --git a/ext/phar/util.c b/ext/phar/util.c index f2271dffd4d4a..31d12e3da7b52 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -41,10 +41,6 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, off_t end, char *key, int key_len, char **signature, int *signature_len TSRMLS_DC); #endif -#if !defined(PHP_VERSION_ID) || PHP_VERSION_ID < 50300 -extern php_stream_wrapper php_stream_phar_wrapper; -#endif - /* for links to relative location, prepend cwd of the entry */ static char *phar_get_link_location(phar_entry_info *entry TSRMLS_DC) /* {{{ */ { @@ -256,7 +252,6 @@ int phar_mount_entry(phar_archive_data *phar, char *filename, int filename_len, char *phar_find_in_include_path(char *filename, int filename_len, phar_archive_data **pphar TSRMLS_DC) /* {{{ */ { -#if PHP_VERSION_ID >= 50300 char *path, *fname, *arch, *entry, *ret, *test; int arch_len, entry_len, fname_len, ret_len; phar_archive_data *phar; @@ -344,223 +339,6 @@ char *phar_find_in_include_path(char *filename, int filename_len, phar_archive_d } return ret; -#else /* PHP 5.2 */ - char resolved_path[MAXPATHLEN]; - char trypath[MAXPATHLEN]; - char *ptr, *end, *path = PG(include_path); - php_stream_wrapper *wrapper; - const char *p; - int n = 0; - char *fname, *arch, *entry, *ret, *test; - int arch_len, entry_len; - phar_archive_data *phar = NULL; - - if (!filename) { - return NULL; - } - - if (!zend_is_executing(TSRMLS_C) || !PHAR_G(cwd)) { - goto doit; - } - - fname = (char*)zend_get_executed_filename(TSRMLS_C); - - if (SUCCESS != phar_split_fname(fname, strlen(fname), &arch, &arch_len, &entry, &entry_len, 1, 0 TSRMLS_CC)) { - goto doit; - } - - efree(entry); - - if (*filename == '.') { - int try_len; - - if (FAILURE == phar_get_archive(&phar, arch, arch_len, NULL, 0, NULL TSRMLS_CC)) { - efree(arch); - goto doit; - } - - try_len = filename_len; - test = phar_fix_filepath(estrndup(filename, filename_len), &try_len, 1 TSRMLS_CC); - - if (*test == '/') { - if (zend_hash_exists(&(phar->manifest), test + 1, try_len - 1)) { - spprintf(&ret, 0, "phar://%s%s", arch, test); - efree(arch); - efree(test); - return ret; - } - } else { - if (zend_hash_exists(&(phar->manifest), test, try_len)) { - spprintf(&ret, 0, "phar://%s/%s", arch, test); - efree(arch); - efree(test); - return ret; - } - } - - efree(test); - } - - efree(arch); -doit: - if (*filename == '.' || IS_ABSOLUTE_PATH(filename, filename_len) || !path || !*path) { - if (tsrm_realpath(filename, resolved_path TSRMLS_CC)) { - return estrdup(resolved_path); - } else { - return NULL; - } - } - - /* test for stream wrappers and return */ - for (p = filename; p - filename < filename_len && (isalnum((int)*p) || *p == '+' || *p == '-' || *p == '.'); ++p, ++n); - - if (n < filename_len - 3 && (*p == ':') && (!strncmp("//", p+1, 2) || ( filename_len > 4 && !memcmp("data", filename, 4)))) { - /* found stream wrapper, this is an absolute path until stream wrappers implement realpath */ - return estrndup(filename, filename_len); - } - - ptr = (char *) path; - while (ptr && *ptr) { - int len, is_stream_wrapper = 0, maybe_stream = 1; - - end = strchr(ptr, DEFAULT_DIR_SEPARATOR); -#ifndef PHP_WIN32 - /* search for stream wrapper */ - if (end - ptr <= 1) { - maybe_stream = 0; - goto not_stream; - } - - for (p = ptr, n = 0; p < end && (isalnum((int)*p) || *p == '+' || *p == '-' || *p == '.'); ++p, ++n); - - if (n == end - ptr && *p && !strncmp("//", p+1, 2)) { - is_stream_wrapper = 1; - /* seek to real end of include_path portion */ - end = strchr(end + 1, DEFAULT_DIR_SEPARATOR); - } else { - maybe_stream = 0; - } -not_stream: -#endif - if (end) { - if ((end-ptr) + 1 + filename_len + 1 >= MAXPATHLEN) { - ptr = end + 1; - continue; - } - - memcpy(trypath, ptr, end-ptr); - len = end-ptr; - trypath[end-ptr] = '/'; - memcpy(trypath+(end-ptr)+1, filename, filename_len+1); - ptr = end+1; - } else { - len = strlen(ptr); - - if (len + 1 + filename_len + 1 >= MAXPATHLEN) { - break; - } - - memcpy(trypath, ptr, len); - trypath[len] = '/'; - memcpy(trypath+len+1, filename, filename_len+1); - ptr = NULL; - } - - if (!is_stream_wrapper && maybe_stream) { - /* search for stream wrapper */ - for (p = trypath, n = 0; isalnum((int)*p) || *p == '+' || *p == '-' || *p == '.'; ++p, ++n); - } - - if (is_stream_wrapper || (n < len - 3 && (*p == ':') && (n > 1) && (!strncmp("//", p+1, 2) || !memcmp("data", trypath, 4)))) { - char *actual; - - wrapper = php_stream_locate_url_wrapper(trypath, &actual, STREAM_OPEN_FOR_INCLUDE TSRMLS_CC); - if (wrapper == &php_plain_files_wrapper) { - strlcpy(trypath, actual, sizeof(trypath)); - } else if (!wrapper) { - /* if wrapper is NULL, there was a mal-formed include_path stream wrapper, so skip this ptr */ - continue; - } else { - if (wrapper->wops->url_stat) { - php_stream_statbuf ssb; - - if (SUCCESS == wrapper->wops->url_stat(wrapper, trypath, 0, &ssb, NULL TSRMLS_CC)) { - if (wrapper == &php_stream_phar_wrapper) { - char *arch, *entry; - int arch_len, entry_len, ret_len; - - ret_len = strlen(trypath); - /* found phar:// */ - - if (SUCCESS != phar_split_fname(trypath, ret_len, &arch, &arch_len, &entry, &entry_len, 1, 0 TSRMLS_CC)) { - return estrndup(trypath, ret_len); - } - - zend_hash_find(&(PHAR_GLOBALS->phar_fname_map), arch, arch_len, (void **) &pphar); - - if (!pphar && PHAR_G(manifest_cached)) { - zend_hash_find(&cached_phars, arch, arch_len, (void **) &pphar); - } - - efree(arch); - efree(entry); - - return estrndup(trypath, ret_len); - } - return estrdup(trypath); - } - } - continue; - } - } - - if (tsrm_realpath(trypath, resolved_path TSRMLS_CC)) { - return estrdup(resolved_path); - } - } /* end provided path */ - - /* check in calling scripts' current working directory as a fall back case */ - if (zend_is_executing(TSRMLS_C)) { - char *exec_fname = (char*)zend_get_executed_filename(TSRMLS_C); - int exec_fname_length = strlen(exec_fname); - const char *p; - int n = 0; - - while ((--exec_fname_length >= 0) && !IS_SLASH(exec_fname[exec_fname_length])); - if (exec_fname && exec_fname[0] != '[' && - exec_fname_length > 0 && - exec_fname_length + 1 + filename_len + 1 < MAXPATHLEN) { - memcpy(trypath, exec_fname, exec_fname_length + 1); - memcpy(trypath+exec_fname_length + 1, filename, filename_len+1); - - /* search for stream wrapper */ - for (p = trypath; isalnum((int)*p) || *p == '+' || *p == '-' || *p == '.'; ++p, ++n); - - if (n < exec_fname_length - 3 && (*p == ':') && (n > 1) && (!strncmp("//", p+1, 2) || !memcmp("data", trypath, 4))) { - char *actual; - - wrapper = php_stream_locate_url_wrapper(trypath, &actual, STREAM_OPEN_FOR_INCLUDE TSRMLS_CC); - - if (wrapper == &php_plain_files_wrapper) { - /* this should never technically happen, but we'll leave it here for completeness */ - strlcpy(trypath, actual, sizeof(trypath)); - } else if (!wrapper) { - /* if wrapper is NULL, there was a malformed include_path stream wrapper - this also should be impossible */ - return NULL; - } else { - return estrdup(trypath); - } - } - - if (tsrm_realpath(trypath, resolved_path TSRMLS_CC)) { - return estrdup(resolved_path); - } - } - } - - return NULL; -#endif /* PHP 5.2 */ } /* }}} */ @@ -850,11 +628,6 @@ int phar_open_archive_fp(phar_archive_data *phar TSRMLS_DC) /* {{{ */ if (phar_get_pharfp(phar TSRMLS_CC)) { return SUCCESS; } -#if PHP_API_VERSION < 20100412 - if (PG(safe_mode) && (!php_checkuid(phar->fname, NULL, CHECKUID_ALLOW_ONLY_FILE))) { - return FAILURE; - } -#endif if (php_check_open_basedir(phar->fname TSRMLS_CC)) { return FAILURE; @@ -1031,47 +804,12 @@ int phar_open_entry_fp(phar_entry_info *entry, char **error, int follow_links TS } /* }}} */ -#if defined(PHP_VERSION_ID) && PHP_VERSION_ID < 50202 -typedef struct { - char *data; - size_t fpos; - size_t fsize; - size_t smax; - int mode; - php_stream **owner_ptr; -} php_stream_memory_data; -#endif - int phar_create_writeable_entry(phar_archive_data *phar, phar_entry_info *entry, char **error TSRMLS_DC) /* {{{ */ { if (entry->fp_type == PHAR_MOD) { /* already newly created, truncate */ -#if PHP_VERSION_ID >= 50202 php_stream_truncate_set_size(entry->fp, 0); -#else - if (php_stream_is(entry->fp, PHP_STREAM_IS_TEMP)) { - if (php_stream_is(*(php_stream**)entry->fp->abstract, PHP_STREAM_IS_MEMORY)) { - php_stream *inner = *(php_stream**)entry->fp->abstract; - php_stream_memory_data *memfp = (php_stream_memory_data*)inner->abstract; - memfp->fpos = 0; - memfp->fsize = 0; - } else if (php_stream_is(*(php_stream**)entry->fp->abstract, PHP_STREAM_IS_STDIO)) { - php_stream_truncate_set_size(*(php_stream**)entry->fp->abstract, 0); - } else { - if (error) { - spprintf(error, 0, "phar error: file \"%s\" cannot be opened for writing, no truncate support", phar->fname); - } - return FAILURE; - } - } else if (php_stream_is(entry->fp, PHP_STREAM_IS_STDIO)) { - php_stream_truncate_set_size(entry->fp, 0); - } else { - if (error) { - spprintf(error, 0, "phar error: file \"%s\" cannot be opened for writing, no truncate support", phar->fname); - } - return FAILURE; - } -#endif + entry->old_flags = entry->flags; entry->is_modified = 1; phar->is_modified = 1; @@ -1689,11 +1427,7 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, off_t end, Z_TYPE_P(zdata) = IS_STRING; Z_STRLEN_P(zdata) = end; -#if PHP_MAJOR_VERSION > 5 - if (end != (off_t) php_stream_copy_to_mem(fp, (void **) &(Z_STRVAL_P(zdata)), (size_t) end, 0)) { -#else if (end != (off_t) php_stream_copy_to_mem(fp, &(Z_STRVAL_P(zdata)), (size_t) end, 0)) { -#endif zval_dtor(zdata); zval_dtor(zsig); zval_dtor(zkey); @@ -1705,11 +1439,7 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, off_t end, return FAILURE; } -#if PHP_VERSION_ID < 50300 - if (FAILURE == zend_fcall_info_init(openssl, &fci, &fcc TSRMLS_CC)) { -#else if (FAILURE == zend_fcall_info_init(openssl, 0, &fci, &fcc, NULL, NULL TSRMLS_CC)) { -#endif zval_dtor(zdata); zval_dtor(zsig); zval_dtor(zkey); @@ -1723,13 +1453,6 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, off_t end, fci.param_count = 3; fci.params = zp; -#if PHP_VERSION_ID < 50300 - ++(zdata->refcount); - if (!is_sign) { - ++(zsig->refcount); - } - ++(zkey->refcount); -#else Z_ADDREF_P(zdata); if (is_sign) { Z_SET_ISREF_P(zsig); @@ -1737,7 +1460,7 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, off_t end, Z_ADDREF_P(zsig); } Z_ADDREF_P(zkey); -#endif + fci.retval_ptr_ptr = &retval_ptr; if (FAILURE == zend_call_function(&fci, &fcc TSRMLS_CC)) { @@ -1754,21 +1477,15 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, off_t end, zval_dtor(openssl); efree(openssl); -#if PHP_VERSION_ID < 50300 - --(zdata->refcount); - if (!is_sign) { - --(zsig->refcount); - } - --(zkey->refcount); -#else Z_DELREF_P(zdata); + if (is_sign) { Z_UNSET_ISREF_P(zsig); } else { Z_DELREF_P(zsig); } Z_DELREF_P(zkey); -#endif + zval_dtor(zdata); efree(zdata); zval_dtor(zkey); @@ -2294,11 +2011,7 @@ static int phar_update_cached_entry(void *data, void *argument) /* {{{ */ ALLOC_ZVAL(entry->metadata); *entry->metadata = *t; zval_copy_ctor(entry->metadata); -#if PHP_VERSION_ID < 50300 - entry->metadata->refcount = 1; -#else Z_SET_REFCOUNT_P(entry->metadata, 1); -#endif entry->metadata_str.c = NULL; entry->metadata_str.len = 0; } @@ -2342,11 +2055,7 @@ static void phar_copy_cached_phar(phar_archive_data **pphar TSRMLS_DC) /* {{{ */ ALLOC_ZVAL(phar->metadata); *phar->metadata = *t; zval_copy_ctor(phar->metadata); -#if PHP_VERSION_ID < 50300 - phar->metadata->refcount = 1; -#else Z_SET_REFCOUNT_P(phar->metadata, 1); -#endif } } diff --git a/ext/phar/zip.c b/ext/phar/zip.c index 6ba745e9cbf74..e3b64859b89cc 100644 --- a/ext/phar/zip.c +++ b/ext/phar/zip.c @@ -578,10 +578,6 @@ int phar_parse_zipfile(php_stream *fp, char *fname, int fname_len, char *alias, /* construct actual offset to file start - local extra_len can be different from central extra_len */ entry.offset = entry.offset_abs = sizeof(local) + entry.header_offset + PHAR_GET_16(local.filename_len) + PHAR_GET_16(local.extra_len); -#if PHP_VERSION_ID < 50207 - /* work around Bug #46147 */ - fp->writepos = fp->readpos = 0; -#endif php_stream_seek(fp, entry.offset, SEEK_SET); /* these next lines should be for php < 5.2.6 after 5.3 filters are fixed */ fp->writepos = 0; @@ -605,9 +601,6 @@ int phar_parse_zipfile(php_stream *fp, char *fname, int fname_len, char *alias, if (!(entry.uncompressed_filesize = php_stream_copy_to_mem(fp, &actual_alias, entry.uncompressed_filesize, 0)) || !actual_alias) { pefree(entry.filename, entry.is_persistent); -#if PHP_VERSION_ID < 50207 - PHAR_ZIP_FAIL("unable to read in alias, truncated (PHP 5.2.7 and newer has a potential fix for this problem)"); -#endif PHAR_ZIP_FAIL("unable to read in alias, truncated"); } @@ -626,9 +619,6 @@ int phar_parse_zipfile(php_stream *fp, char *fname, int fname_len, char *alias, if (!(entry.uncompressed_filesize = php_stream_copy_to_mem(fp, &actual_alias, entry.uncompressed_filesize, 0)) || !actual_alias) { pefree(entry.filename, entry.is_persistent); -#if PHP_VERSION_ID < 50207 - PHAR_ZIP_FAIL("unable to read in alias, truncated (PHP 5.2.7 and newer has a potential fix for this problem)"); -#endif PHAR_ZIP_FAIL("unable to read in alias, truncated"); } From c4cfdfa911f74f73942d38c6ffb74a19feb2bfdb Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Tue, 5 Nov 2013 19:54:50 +0100 Subject: [PATCH 382/400] updated NEWS --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index 0a4b78c9c6186..fdfaef53cb58f 100644 --- a/NEWS +++ b/NEWS @@ -16,6 +16,8 @@ PHP NEWS variable. (Mike) . Implemented dedicated syntax for variadic functions (RFC: https://wiki.php.net/rfc/variadics). (Nikita) + . Fixed bug #50333 Improving multi-threaded scalability by using + emalloc/efree/estrdup (Anatol, Dmitry) - cURL: . Implemented FR #65646 (re-enable CURLOPT_FOLLOWLOCATION with open_basedir From 3720fd77b5d042faed54f67115e1371ddd067763 Mon Sep 17 00:00:00 2001 From: George Wang Date: Tue, 5 Nov 2013 15:38:08 -0500 Subject: [PATCH 383/400] Fixed typo in Makefile.frag --- sapi/litespeed/Makefile.frag | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapi/litespeed/Makefile.frag b/sapi/litespeed/Makefile.frag index b70e5e8702933..767c2e5eb1719 100644 --- a/sapi/litespeed/Makefile.frag +++ b/sapi/litespeed/Makefile.frag @@ -4,6 +4,6 @@ $(SAPI_LITESPEED_PATH): $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_LITESPEED_OB $(BUILD_LITESPEED) install-litespeed: $(SAPI_LITESPEED_PATH) - @echo "Installing PHP LitSpeed binary: $(INSTALL_ROOT)$(bindir)/" + @echo "Installing PHP LiteSpeed binary: $(INSTALL_ROOT)$(bindir)/" @$(INSTALL) -m 0755 $(SAPI_LITESPEED_PATH) $(INSTALL_ROOT)$(bindir)/lsphp From 01bc13212e87d6ec2a0579641e0039e21dea74ea Mon Sep 17 00:00:00 2001 From: George Wang Date: Tue, 5 Nov 2013 16:14:49 -0500 Subject: [PATCH 384/400] Update LiteSpeed SAPI code to V6.4 --- sapi/litespeed/lsapi_main.c | 1371 +++++++++++-------- sapi/litespeed/lsapidef.h | 33 +- sapi/litespeed/lsapilib.c | 2486 ++++++++++++++++++++++++++--------- sapi/litespeed/lsapilib.h | 100 +- 4 files changed, 2764 insertions(+), 1226 deletions(-) diff --git a/sapi/litespeed/lsapi_main.c b/sapi/litespeed/lsapi_main.c index 19364c66e06f2..33ebb988a66b1 100644 --- a/sapi/litespeed/lsapi_main.c +++ b/sapi/litespeed/lsapi_main.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2013 The PHP Group | + | 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 | @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id$ */ +/* $Id: lsapi_main.c,v 1.57 2013/08/23 14:50:25 gwang Exp $ */ #include "php.h" #include "SAPI.h" @@ -75,7 +75,9 @@ static int lsapi_mode = 1; static char *php_self = ""; static char *script_filename = ""; static int source_highlight = 0; - +static int ignore_php_ini = 0; +static char * argv0 = NULL; +static int engine = 1; #ifdef ZTS zend_compiler_globals *compiler_globals; zend_executor_globals *executor_globals; @@ -90,40 +92,65 @@ zend_module_entry litespeed_module_entry; */ static int php_lsapi_startup(sapi_module_struct *sapi_module) { - if (php_module_startup(sapi_module, NULL, 0)==FAILURE) { - return FAILURE; - } - return SUCCESS; + if (php_module_startup(sapi_module, NULL, 0)==FAILURE) { + return FAILURE; + } + argv0 = sapi_module->executable_location; + return SUCCESS; } /* }}} */ +/* {{{ sapi_lsapi_ini_defaults */ + +/* overwriteable ini defaults must be set in sapi_cli_ini_defaults() */ +#define INI_DEFAULT(name,value)\ + ZVAL_STRING(tmp, value, 0);\ + zend_hash_update(configuration_hash, name, sizeof(name), tmp, sizeof(zval), (void**)&entry);\ + Z_STRVAL_P(entry) = zend_strndup(Z_STRVAL_P(entry), Z_STRLEN_P(entry)) + +static void sapi_lsapi_ini_defaults(HashTable *configuration_hash) +{ + zval *tmp, *entry; + +#if PHP_MAJOR_VERSION > 4 +/* + MAKE_STD_ZVAL(tmp); + + INI_DEFAULT("register_long_arrays", "0"); + + FREE_ZVAL(tmp); +*/ +#endif + +} +/* }}} */ /* {{{ sapi_lsapi_ub_write */ static int sapi_lsapi_ub_write(const char *str, uint str_length TSRMLS_DC) { - int ret; - int remain; - if ( lsapi_mode ) { - ret = LSAPI_Write( str, str_length ); - if ( ret < str_length ) { - php_handle_aborted_connection(); - return str_length - ret; - } - } else { - remain = str_length; - while( remain > 0 ) { - ret = write( 1, str, remain ); - if ( ret <= 0 ) { - php_handle_aborted_connection(); - return str_length - remain; - } - str += ret; - remain -= ret; - } - } - return str_length; + int ret; + int remain; + if ( lsapi_mode ) { + ret = LSAPI_Write( str, str_length ); + if ( ret < str_length ) { + php_handle_aborted_connection(); + return str_length - ret; + } + } else { + remain = str_length; + while( remain > 0 ) { + ret = write( 1, str, remain ); + if ( ret <= 0 ) { + php_handle_aborted_connection(); + return str_length - remain; + } + str += ret; + remain -= ret; + } + } + return str_length; } /* }}} */ @@ -132,11 +159,11 @@ static int sapi_lsapi_ub_write(const char *str, uint str_length TSRMLS_DC) */ static void sapi_lsapi_flush( void * server_context ) { - if ( lsapi_mode ) { - if ( LSAPI_Flush() == -1) { - php_handle_aborted_connection(); - } - } + if ( lsapi_mode ) { + if ( LSAPI_Flush() == -1) { + php_handle_aborted_connection(); + } + } } /* }}} */ @@ -145,8 +172,12 @@ static void sapi_lsapi_flush( void * server_context ) */ static int sapi_lsapi_deactivate(TSRMLS_D) { - LSAPI_Finish(); - return SUCCESS; + if ( SG(request_info).path_translated ) + { + efree( SG(request_info).path_translated ); + } + + return SUCCESS; } /* }}} */ @@ -157,46 +188,99 @@ static int sapi_lsapi_deactivate(TSRMLS_D) */ static char *sapi_lsapi_getenv( char * name, size_t name_len TSRMLS_DC ) { - if ( lsapi_mode ) { - return LSAPI_GetEnv( name ); - } else { - return getenv( name ); - } + if ( lsapi_mode ) { + return LSAPI_GetEnv( name ); + } else { + return getenv( name ); + } } /* }}} */ +/* +static int add_variable( const char * pKey, int keyLen, const char * pValue, int valLen, + void * arg ) +{ + php_register_variable_safe((char *)pKey, (char *)pValue, valLen, (zval *)arg TSRMLS_CC); + return 1; +} +*/ static int add_variable( const char * pKey, int keyLen, const char * pValue, int valLen, - void * arg ) + void * arg ) { - php_register_variable_safe((char *)pKey, (char *)pValue, valLen, (zval *)arg TSRMLS_CC); - return 1; + zval * gpc_element, **gpc_element_p; + HashTable * symtable1 = Z_ARRVAL_P((zval * )arg); + register char * pKey1 = (char *)pKey; + + MAKE_STD_ZVAL(gpc_element); + Z_STRLEN_P( gpc_element ) = valLen; + Z_STRVAL_P( gpc_element ) = estrndup(pValue, valLen); + Z_TYPE_P( gpc_element ) = IS_STRING; +#if PHP_MAJOR_VERSION > 4 + zend_symtable_update( symtable1, pKey1, keyLen + 1, &gpc_element, sizeof( zval *), (void **) &gpc_element_p ); +#else + zend_hash_update( symtable1, pKey1, keyLen + 1, &gpc_element, sizeof( zval *), (void **) &gpc_element_p ); +#endif + return 1; } +#if ((PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 4) || PHP_MAJOR_VERSION < 5) +static int add_variable_magic_quote( const char * pKey, int keyLen, const char * pValue, int valLen, + void * arg ) +{ + zval * gpc_element, **gpc_element_p; + HashTable * symtable1 = Z_ARRVAL_P((zval * )arg); + register char * pKey1 = (char *)pKey; + + MAKE_STD_ZVAL(gpc_element); + Z_STRLEN_P( gpc_element ) = valLen; + Z_STRVAL_P( gpc_element ) = php_addslashes((char *)pValue, valLen, &Z_STRLEN_P( gpc_element ), 0 ); + Z_TYPE_P( gpc_element ) = IS_STRING; +#if PHP_MAJOR_VERSION > 4 + zend_symtable_update( symtable1, pKey1, keyLen + 1, &gpc_element, sizeof( zval *), (void **) &gpc_element_p ); +#else + zend_hash_update( symtable1, pKey1, keyLen + 1, &gpc_element, sizeof( zval *), (void **) &gpc_element_p ); +#endif + return 1; +} + +#endif /* {{{ sapi_lsapi_register_variables */ static void sapi_lsapi_register_variables(zval *track_vars_array TSRMLS_DC) { + char * php_self = ""; + if ( lsapi_mode ) { + if ( (SG(request_info).request_uri ) ) + php_self = (SG(request_info).request_uri ); - if ( lsapi_mode ) { - LSAPI_ForeachHeader( add_variable, track_vars_array ); - LSAPI_ForeachEnv( add_variable, track_vars_array ); - php_import_environment_variables(track_vars_array TSRMLS_CC); - - php_register_variable("PHP_SELF", (SG(request_info).request_uri ? SG(request_info).request_uri:""), track_vars_array TSRMLS_CC); - } else { - php_import_environment_variables(track_vars_array TSRMLS_CC); +#if ((PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 4) || PHP_MAJOR_VERSION < 5) + if (!PG(magic_quotes_gpc)) { +#endif + LSAPI_ForeachHeader( add_variable, track_vars_array ); + LSAPI_ForeachEnv( add_variable, track_vars_array ); + add_variable("PHP_SELF", 8, php_self, strlen( php_self ), track_vars_array ); +#if ((PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 4) || PHP_MAJOR_VERSION < 5) + } else { + LSAPI_ForeachHeader( add_variable_magic_quote, track_vars_array ); + LSAPI_ForeachEnv( add_variable_magic_quote, track_vars_array ); + add_variable_magic_quote("PHP_SELF", 8, php_self, strlen( php_self ), track_vars_array ); + } +#endif + php_import_environment_variables(track_vars_array TSRMLS_CC); + } else { + php_import_environment_variables(track_vars_array TSRMLS_CC); - php_register_variable("PHP_SELF", php_self, track_vars_array TSRMLS_CC); - php_register_variable("SCRIPT_NAME", php_self, track_vars_array TSRMLS_CC); - php_register_variable("SCRIPT_FILENAME", script_filename, track_vars_array TSRMLS_CC); - php_register_variable("PATH_TRANSLATED", script_filename, track_vars_array TSRMLS_CC); - php_register_variable("DOCUMENT_ROOT", "", track_vars_array TSRMLS_CC); + php_register_variable("PHP_SELF", php_self, track_vars_array TSRMLS_CC); + php_register_variable("SCRIPT_NAME", php_self, track_vars_array TSRMLS_CC); + php_register_variable("SCRIPT_FILENAME", script_filename, track_vars_array TSRMLS_CC); + php_register_variable("PATH_TRANSLATED", script_filename, track_vars_array TSRMLS_CC); + php_register_variable("DOCUMENT_ROOT", "", track_vars_array TSRMLS_CC); - } + } } /* }}} */ @@ -205,11 +289,11 @@ static void sapi_lsapi_register_variables(zval *track_vars_array TSRMLS_DC) */ static int sapi_lsapi_read_post(char *buffer, uint count_bytes TSRMLS_DC) { - if ( lsapi_mode ) { - return LSAPI_ReadReqBody( buffer, count_bytes ); - } else { - return 0; - } + if ( lsapi_mode ) { + return LSAPI_ReadReqBody( buffer, (unsigned long long)count_bytes ); + } else { + return 0; + } } /* }}} */ @@ -220,11 +304,11 @@ static int sapi_lsapi_read_post(char *buffer, uint count_bytes TSRMLS_DC) */ static char *sapi_lsapi_read_cookies(TSRMLS_D) { - if ( lsapi_mode ) { - return LSAPI_GetHeader( H_COOKIE ); - } else { - return NULL; - } + if ( lsapi_mode ) { + return LSAPI_GetHeader( H_COOKIE ); + } else { + return NULL; + } } /* }}} */ @@ -233,33 +317,33 @@ static char *sapi_lsapi_read_cookies(TSRMLS_D) */ static int sapi_lsapi_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC) { - sapi_header_struct *h; - zend_llist_position pos; - if ( lsapi_mode ) { - LSAPI_SetRespStatus( SG(sapi_headers).http_response_code ); - - h = zend_llist_get_first_ex(&sapi_headers->headers, &pos); - while (h) { - if ( h->header_len > 0 ) { - LSAPI_AppendRespHeader(h->header, h->header_len); - } - h = zend_llist_get_next_ex(&sapi_headers->headers, &pos); - } - if (SG(sapi_headers).send_default_content_type) { - char *hd; - int len; - char headerBuf[SAPI_LSAPI_MAX_HEADER_LENGTH]; - - hd = sapi_get_default_content_type(TSRMLS_C); - len = snprintf( headerBuf, SAPI_LSAPI_MAX_HEADER_LENGTH - 1, - "Content-type: %s", hd ); - efree(hd); - - LSAPI_AppendRespHeader( headerBuf, len ); - } - } - LSAPI_FinalizeRespHeaders(); - return SAPI_HEADER_SENT_SUCCESSFULLY; + sapi_header_struct *h; + zend_llist_position pos; + if ( lsapi_mode ) { + LSAPI_SetRespStatus( SG(sapi_headers).http_response_code ); + + h = zend_llist_get_first_ex(&sapi_headers->headers, &pos); + while (h) { + if ( h->header_len > 0 ) { + LSAPI_AppendRespHeader(h->header, h->header_len); + } + h = zend_llist_get_next_ex(&sapi_headers->headers, &pos); + } + if (SG(sapi_headers).send_default_content_type) { + char *hd; + int len; + char headerBuf[SAPI_LSAPI_MAX_HEADER_LENGTH]; + + hd = sapi_get_default_content_type(TSRMLS_C); + len = snprintf( headerBuf, SAPI_LSAPI_MAX_HEADER_LENGTH - 1, + "Content-type: %s", hd ); + efree(hd); + + LSAPI_AppendRespHeader( headerBuf, len ); + } + } + LSAPI_FinalizeRespHeaders(); + return SAPI_HEADER_SENT_SUCCESSFULLY; } @@ -270,8 +354,15 @@ static int sapi_lsapi_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC) */ static void sapi_lsapi_log_message(char *message TSRMLS_DC) { - int len = strlen( message ); - LSAPI_Write_Stderr( message, len); + char buf[8192]; + int len = strlen( message ); + if ( *(message + len - 1 ) != '\n' ) + { + snprintf( buf, 8191, "%s\n", message ); + message = buf; + ++len; + } + LSAPI_Write_Stderr( message, len); } /* }}} */ @@ -280,158 +371,251 @@ static void sapi_lsapi_log_message(char *message TSRMLS_DC) */ static sapi_module_struct lsapi_sapi_module = { - "litespeed", - "LiteSpeed", + "litespeed", + "LiteSpeed V6.4", - php_lsapi_startup, /* startup */ - php_module_shutdown_wrapper, /* shutdown */ + php_lsapi_startup, /* startup */ + php_module_shutdown_wrapper, /* shutdown */ - NULL, /* activate */ - sapi_lsapi_deactivate, /* deactivate */ + NULL, /* activate */ + sapi_lsapi_deactivate, /* deactivate */ - sapi_lsapi_ub_write, /* unbuffered write */ - sapi_lsapi_flush, /* flush */ - NULL, /* get uid */ - sapi_lsapi_getenv, /* getenv */ + sapi_lsapi_ub_write, /* unbuffered write */ + sapi_lsapi_flush, /* flush */ + NULL, /* get uid */ + sapi_lsapi_getenv, /* getenv */ - php_error, /* error handler */ + php_error, /* error handler */ - NULL, /* header handler */ - sapi_lsapi_send_headers, /* send headers handler */ - NULL, /* send header handler */ + NULL, /* header handler */ + sapi_lsapi_send_headers, /* send headers handler */ + NULL, /* send header handler */ - sapi_lsapi_read_post, /* read POST data */ - sapi_lsapi_read_cookies, /* read Cookies */ + sapi_lsapi_read_post, /* read POST data */ + sapi_lsapi_read_cookies, /* read Cookies */ - sapi_lsapi_register_variables, /* register server variables */ - sapi_lsapi_log_message, /* Log message */ + sapi_lsapi_register_variables, /* register server variables */ + sapi_lsapi_log_message, /* Log message */ - NULL, /* php.ini path override */ - NULL, /* block interruptions */ - NULL, /* unblock interruptions */ - NULL, /* default post reader */ - NULL, /* treat data */ - NULL, /* executable location */ + NULL, /* php.ini path override */ + NULL, /* block interruptions */ + NULL, /* unblock interruptions */ + NULL, /* default post reader */ + NULL, /* treat data */ + NULL, /* executable location */ - 0, /* php.ini ignore */ + 0, /* php.ini ignore */ - STANDARD_SAPI_MODULE_PROPERTIES + STANDARD_SAPI_MODULE_PROPERTIES }; /* }}} */ static int init_request_info( TSRMLS_D ) { - char * pContentType = LSAPI_GetHeader( H_CONTENT_TYPE ); - char * pAuth; - - SG(request_info).content_type = pContentType ? pContentType : ""; - SG(request_info).request_method = LSAPI_GetRequestMethod(); - SG(request_info).query_string = LSAPI_GetQueryString(); - SG(request_info).request_uri = LSAPI_GetScriptName(); - SG(request_info).content_length = LSAPI_GetReqBodyLen(); - SG(request_info).path_translated = LSAPI_GetScriptFileName(); + char * pContentType = LSAPI_GetHeader( H_CONTENT_TYPE ); + char * pAuth; + + SG(request_info).content_type = pContentType ? pContentType : ""; + SG(request_info).request_method = LSAPI_GetRequestMethod(); + SG(request_info).query_string = LSAPI_GetQueryString(); + SG(request_info).request_uri = LSAPI_GetScriptName(); + SG(request_info).content_length = LSAPI_GetReqBodyLen(); + SG(request_info).path_translated = estrdup( LSAPI_GetScriptFileName()); + + /* It is not reset by zend engine, set it to 0. */ + SG(sapi_headers).http_response_code = 0; + + pAuth = LSAPI_GetHeader( H_AUTHORIZATION ); + php_handle_auth_data(pAuth TSRMLS_CC); +} - /* It is not reset by zend engine, set it to 0. */ - SG(sapi_headers).http_response_code = 0; - - pAuth = LSAPI_GetHeader( H_AUTHORIZATION ); - php_handle_auth_data(pAuth TSRMLS_CC); +static char s_cur_chdir[4096] = ""; + +static int lsapi_chdir_primary_script( zend_file_handle * file_handle ) +{ +#if PHP_MAJOR_VERSION > 4 + char * p; + char ch; + + SG(options) |= SAPI_OPTION_NO_CHDIR; + getcwd( s_cur_chdir, sizeof( s_cur_chdir ) ); + + p = strrchr( file_handle->filename, '/' ); + if ( *p ) + { + *p = 0; + if ( strcmp( file_handle->filename, s_cur_chdir ) != 0 ) { + chdir( file_handle->filename ); + } + *p++ = '/'; + ch = *p; + *p = 0; + if ( !CWDG(cwd).cwd || + ( strcmp( file_handle->filename, CWDG(cwd).cwd ) != 0 ) ) { + CWDG(cwd).cwd_length = p - file_handle->filename; + CWDG(cwd).cwd = (char *) realloc(CWDG(cwd).cwd, CWDG(cwd).cwd_length+1); + memmove( CWDG(cwd).cwd, file_handle->filename, CWDG(cwd).cwd_length+1 ); + } + *p = ch; + } + /* virtual_file_ex(&CWDG(cwd), file_handle->filename, NULL, CWD_REALPATH); */ +#else + VCWD_CHDIR_FILE( file_handle->filename ); +#endif + return 0; } -static int lsapi_module_main(int show_source TSRMLS_DC) +static int lsapi_fopen_primary_script( zend_file_handle * file_handle ) +{ + FILE * fp; + char * p; + fp = fopen( SG(request_info).path_translated, "rb" ); + if ( !fp ) + { + return -1; + } + file_handle->type = ZEND_HANDLE_FP; + file_handle->handle.fp = fp; + file_handle->filename = SG(request_info).path_translated; + file_handle->free_filename = 0; + file_handle->opened_path = NULL; + + lsapi_chdir_primary_script( file_handle ); + + return 0; +} + +static int lsapi_execute_script( zend_file_handle * file_handle TSRMLS_DC) { - zend_file_handle file_handle = {0}; + char *p; + int len; + file_handle->type = ZEND_HANDLE_FILENAME; + file_handle->handle.fd = 0; + file_handle->filename = SG(request_info).path_translated; + file_handle->free_filename = 0; + file_handle->opened_path = NULL; + + p = argv0; + *p++ = ':'; + len = strlen( SG(request_info).path_translated ); + if ( len > 45 ) + len = len - 45; + else + len = 0; + memccpy( p, SG(request_info).path_translated + len, 0, 46 ); + + php_execute_script(file_handle TSRMLS_CC); + return 0; - if (php_request_startup(TSRMLS_C) == FAILURE ) { - return -1; - } - if (show_source) { - zend_syntax_highlighter_ini syntax_highlighter_ini; +} - php_get_highlight_struct(&syntax_highlighter_ini); - highlight_file(SG(request_info).path_translated, &syntax_highlighter_ini TSRMLS_CC); - } else { - file_handle.type = ZEND_HANDLE_FILENAME; - file_handle.handle.fd = 0; - file_handle.filename = SG(request_info).path_translated; - file_handle.free_filename = 0; - file_handle.opened_path = NULL; - php_execute_script(&file_handle TSRMLS_CC); - } - zend_try { - php_request_shutdown(NULL); - } zend_end_try(); - return 0; +static int lsapi_module_main(int show_source TSRMLS_DC) +{ + zend_file_handle file_handle = {0}; + + if (php_request_startup(TSRMLS_C) == FAILURE ) { + return -1; + } + if (show_source) { + zend_syntax_highlighter_ini syntax_highlighter_ini; + + php_get_highlight_struct(&syntax_highlighter_ini); + highlight_file(SG(request_info).path_translated, &syntax_highlighter_ini TSRMLS_CC); + } else { + lsapi_execute_script( &file_handle TSRMLS_CC); + } + zend_try { + php_request_shutdown(NULL); + memset( argv0, 0, 46 ); + } zend_end_try(); + return 0; } static int alter_ini( const char * pKey, int keyLen, const char * pValue, int valLen, - void * arg ) + void * arg ) { - int type = ZEND_INI_PERDIR; - if ( '\001' == *pKey ) { - ++pKey; - if ( *pKey == 4 ) { - type = ZEND_INI_SYSTEM; - } - ++pKey; - --keyLen; - zend_alter_ini_entry((char *)pKey, keyLen, - (char *)pValue, valLen, - type, PHP_INI_STAGE_ACTIVATE); - } - return 1; + int type = ZEND_INI_PERDIR; + if ( '\001' == *pKey ) { + ++pKey; + if ( *pKey == 4 ) { + type = ZEND_INI_SYSTEM; + } + ++pKey; + --keyLen; + if (( keyLen == 7 )&&( strncasecmp( pKey, "engine", 6 )== 0 )) + { + if ( *pValue == '0' ) + engine = 0; + } + else + zend_alter_ini_entry((char *)pKey, keyLen, + (char *)pValue, valLen, + type, PHP_INI_STAGE_ACTIVATE); + } + return 1; } static void override_ini() { - LSAPI_ForeachSpecialEnv( alter_ini, NULL ); + LSAPI_ForeachSpecialEnv( alter_ini, NULL ); } + static int processReq( TSRMLS_D ) { - int ret = 0; - zend_first_try { - /* avoid server_context==NULL checks */ - SG(server_context) = (void *) 1; - - init_request_info( TSRMLS_C ); - - override_ini(); - - if ( lsapi_module_main( source_highlight TSRMLS_CC ) == -1 ) { - ret = -1; - } - } zend_end_try(); - return ret; + int ret = 0; + zend_first_try { + + /* avoid server_context==NULL checks */ + SG(server_context) = (void *) 1; + + engine = 1; + override_ini(); + + if ( engine ) { + init_request_info( TSRMLS_C ); + + if ( lsapi_module_main( source_highlight TSRMLS_CC ) == -1 ) { + ret = -1; + } + } else { + LSAPI_AppendRespHeader( "status: 403", 11 ); + LSAPI_AppendRespHeader( "content-type: text/html", 23 ); + LSAPI_Write( "Forbidden: PHP engine is disable.\n", 34 ); + } + } zend_end_try(); + return ret; } static void cli_usage( TSRMLS_D ) { - static const char * usage = - "Usage: php\n" - " php -[b|c|h|i|q|s|v|?] [] [args...]\n" - " Run in LSAPI mode, only '-b', '-s' and '-c' are effective\n" - " Run in Command Line Interpreter mode when parameters are specified\n" - "\n" - " -b | Bind Path for external LSAPI Server mode\n" - " -c | Look for php.ini file in this directory\n" - " -h This help\n" - " -i PHP information\n" - " -q Quiet-mode. Suppress HTTP Header output.\n" - " -s Display colour syntax highlighted source.\n" - " -v Version number\n" - " -? This help\n" - "\n" - " args... Arguments passed to script.\n"; - php_output_startup(); - php_output_activate(TSRMLS_C); - php_printf( "%s", usage ); + static const char * usage = + "Usage: php\n" + " php -[b|c|n|h|i|q|s|v|?] [] [args...]\n" + " Run in LSAPI mode, only '-b', '-s' and '-c' are effective\n" + " Run in Command Line Interpreter mode when parameters are specified\n" + "\n" + " -b | Bind Path for external LSAPI Server mode\n" + " -c | Look for php.ini file in this directory\n" + " -n No php.ini file will be used\n" + " -h This help\n" + " -i PHP information\n" + " -l Syntax check\n" + " -q Quiet-mode. Suppress HTTP Header output.\n" + " -s Display colour syntax highlighted source.\n" + " -v Version number\n" + " -? This help\n" + "\n" + " args... Arguments passed to script.\n"; + php_output_startup(); + php_output_activate(TSRMLS_C); + php_printf( usage ); #ifdef PHP_OUTPUT_NEWAPI php_output_end_all(TSRMLS_C); #else @@ -440,349 +624,419 @@ static void cli_usage( TSRMLS_D ) } static int parse_opt( int argc, char * argv[], int *climode, - char **php_ini_path, char ** php_bind ) -{ - char ** p = &argv[1]; - char ** argend= &argv[argc]; - int c; - while (( p < argend )&&(**p == '-' )) { - c = *((*p)+1); - ++p; - switch( c ) { - case 'b': - if ( p >= argend ) { - fprintf( stderr, "TCP or socket address must be specified following '-b' option.\n"); - return -1; - } - *php_bind = *p++; - break; - - case 'c': - if ( p >= argend ) { - fprintf( stderr, " or must be specified following '-c' option.\n"); - - return -1; - } - *php_ini_path = *p++; - break; - case 's': - source_highlight = 1; - break; - case 'h': - case 'i': - case 'q': - case 'v': - case '?': - default: - *climode = 1; - break; - } - } - if ( p - argv < argc ) { - *climode = 1; - } - return 0; + char **php_ini_path, char ** php_bind ) +{ + char ** p = &argv[1]; + char ** argend= &argv[argc]; + int c; + while (( p < argend )&&(**p == '-' )) { + c = *((*p)+1); + ++p; + switch( c ) { + case 'b': + if ( p >= argend ) { + fprintf( stderr, "TCP or socket address must be specified following '-b' option.\n"); + return -1; + } + *php_bind = strdup(*p++); + break; + + case 'c': + if ( p >= argend ) { + fprintf( stderr, " or must be specified following '-c' option.\n"); + + return -1; + } + *php_ini_path = strdup( *p++ ); + break; + case 's': + source_highlight = 1; + break; + case 'n': + ignore_php_ini = 1; + break; + case '?': + if ( *((*(p-1))+2) == 's' ) + exit( 99 ); + case 'h': + case 'i': + case 'l': + case 'q': + case 'v': + default: + *climode = 1; + break; + } + } + if ( p - argv < argc ) { + *climode = 1; + } + return 0; } static int cli_main( int argc, char * argv[] ) { - static const char * ini_defaults[] = { - "report_zend_debug", "0", - "display_errors", "1", - "register_argc_argv", "1", - "html_errors", "0", - "implicit_flush", "1", - "output_buffering", "0", - "max_execution_time", "0", - "max_input_time", "-1", - NULL - }; - - const char ** ini; - char ** p = &argv[1]; - char ** argend= &argv[argc]; - int ret = 0; - int c; - lsapi_mode = 0; /* enter CLI mode */ + static const char * ini_defaults[] = { + "report_zend_debug", "0", + "display_errors", "1", + "register_argc_argv", "1", + "html_errors", "0", + "implicit_flush", "1", + "output_buffering", "0", + "max_execution_time", "0", + "max_input_time", "-1", + NULL + }; + + const char ** ini; + char ** p = &argv[1]; + char ** argend= &argv[argc]; + int ret = -1; + int c; + lsapi_mode = 0; /* enter CLI mode */ #ifdef PHP_WIN32 - _fmode = _O_BINARY; /*sets default for file streams to binary */ - setmode(_fileno(stdin), O_BINARY); /* make the stdio mode be binary */ - setmode(_fileno(stdout), O_BINARY); /* make the stdio mode be binary */ - setmode(_fileno(stderr), O_BINARY); /* make the stdio mode be binary */ + _fmode = _O_BINARY; /*sets default for file streams to binary */ + setmode(_fileno(stdin), O_BINARY); /* make the stdio mode be binary */ + setmode(_fileno(stdout), O_BINARY); /* make the stdio mode be binary */ + setmode(_fileno(stderr), O_BINARY); /* make the stdio mode be binary */ #endif - zend_first_try { - SG(server_context) = (void *) 1; - - zend_uv.html_errors = 0; /* tell the engine we're in non-html mode */ - CG(in_compilation) = 0; /* not initialized but needed for several options */ - EG(uninitialized_zval_ptr) = NULL; - - for( ini = ini_defaults; *ini; ini+=2 ) { - zend_alter_ini_entry( (char *)*ini, strlen( *ini )+1, - (char *)*(ini+1), strlen( *(ini+1) ), - PHP_INI_SYSTEM, PHP_INI_STAGE_ACTIVATE); - } - - while (( p < argend )&&(**p == '-' )) { - c = *((*p)+1); - ++p; - switch( c ) { - case 'q': - break; - case 'i': - if (php_request_startup(TSRMLS_C) != FAILURE) { - php_print_info(0xFFFFFFFF TSRMLS_CC); + zend_first_try { + SG(server_context) = (void *) 1; + + zend_uv.html_errors = 0; /* tell the engine we're in non-html mode */ + CG(in_compilation) = 0; /* not initialized but needed for several options */ + EG(uninitialized_zval_ptr) = NULL; + + for( ini = ini_defaults; *ini; ini+=2 ) { + zend_alter_ini_entry( (char *)*ini, strlen( *ini )+1, + (char *)*(ini+1), strlen( *(ini+1) ), + PHP_INI_SYSTEM, PHP_INI_STAGE_ACTIVATE); + } + + while (( p < argend )&&(**p == '-' )) { + c = *((*p)+1); + ++p; + switch( c ) { + case 'q': + break; + case 'i': + if (php_request_startup(TSRMLS_C) != FAILURE) { + php_print_info(0xFFFFFFFF TSRMLS_CC); #ifdef PHP_OUTPUT_NEWAPI php_output_end_all(TSRMLS_C); #else php_end_ob_buffers(1 TSRMLS_CC); #endif - php_request_shutdown( NULL ); - } - ret = 1; - break; - case 'v': - if (php_request_startup(TSRMLS_C) != FAILURE) { + php_request_shutdown( NULL ); + ret = 0; + } + break; + case 'v': + if (php_request_startup(TSRMLS_C) != FAILURE) { #if ZEND_DEBUG - php_printf("PHP %s (%s) (built: %s %s) (DEBUG)\nCopyright (c) 1997-2013 The PHP Group\n%s", PHP_VERSION, sapi_module.name, __DATE__, __TIME__, get_zend_version()); + php_printf("PHP %s (%s) (built: %s %s) (DEBUG)\nCopyright (c) 1997-2004 The PHP Group\n%s", PHP_VERSION, sapi_module.name, __DATE__, __TIME__, get_zend_version()); #else - php_printf("PHP %s (%s) (built: %s %s)\nCopyright (c) 1997-2013 The PHP Group\n%s", PHP_VERSION, sapi_module.name, __DATE__, __TIME__, get_zend_version()); + php_printf("PHP %s (%s) (built: %s %s)\nCopyright (c) 1997-2004 The PHP Group\n%s", PHP_VERSION, sapi_module.name, __DATE__, __TIME__, get_zend_version()); #endif #ifdef PHP_OUTPUT_NEWAPI php_output_end_all(TSRMLS_C); #else php_end_ob_buffers(1 TSRMLS_CC); #endif - php_request_shutdown( NULL ); - } - ret = 1; - break; - case 'c': - ++p; - /* fall through */ - case 's': - break; - - case 'h': - case '?': - default: - cli_usage(TSRMLS_C); - ret = 1; - break; - - } - } - if ( !ret ) { - if ( *p ) { - zend_file_handle file_handle = {0}; - - file_handle.type = ZEND_HANDLE_FP; - file_handle.handle.fp = VCWD_FOPEN(*p, "rb"); - - if ( file_handle.handle.fp ) { - script_filename = *p; - php_self = *p; - - SG(request_info).path_translated = *p; - SG(request_info).argc = argc - (p - argv); - SG(request_info).argv = p; - - if (php_request_startup(TSRMLS_C) == FAILURE ) { - fclose( file_handle.handle.fp ); - ret = 2; - } else { - if (source_highlight) { - zend_syntax_highlighter_ini syntax_highlighter_ini; - - php_get_highlight_struct(&syntax_highlighter_ini); - highlight_file(SG(request_info).path_translated, &syntax_highlighter_ini TSRMLS_CC); - } else { - file_handle.filename = *p; - file_handle.free_filename = 0; - file_handle.opened_path = NULL; - - php_execute_script(&file_handle TSRMLS_CC); - } - - php_request_shutdown( NULL ); - } - } else { - php_printf("Could not open input file: %s.\n", *p); - } - } else { - cli_usage(TSRMLS_C); - } - } - - }zend_end_try(); - - php_module_shutdown(TSRMLS_C); + php_request_shutdown( NULL ); + ret = 0; + } + break; + case 'c': + ++p; + /* fall through */ + case 's': + break; + case 'l': + source_highlight = 2; + break; + case 'h': + case '?': + default: + cli_usage(TSRMLS_C); + ret = 0; + break; + + } + } + if ( ret == -1 ) { + if ( *p ) { + zend_file_handle file_handle = {0}; + + file_handle.type = ZEND_HANDLE_FP; + file_handle.handle.fp = VCWD_FOPEN(*p, "rb"); + + if ( file_handle.handle.fp ) { + script_filename = *p; + php_self = *p; + + SG(request_info).path_translated = estrdup(*p); + SG(request_info).argc = argc - (p - argv); + SG(request_info).argv = p; + + if (php_request_startup(TSRMLS_C) == FAILURE ) { + fclose( file_handle.handle.fp ); + ret = 2; + } else { + if (source_highlight == 1) { + zend_syntax_highlighter_ini syntax_highlighter_ini; + + php_get_highlight_struct(&syntax_highlighter_ini); + highlight_file(SG(request_info).path_translated, &syntax_highlighter_ini TSRMLS_CC); + } else if (source_highlight == 2) { + file_handle.filename = *p; + file_handle.free_filename = 0; + file_handle.opened_path = NULL; + ret = php_lint_script(&file_handle TSRMLS_CC); + if (ret==SUCCESS) { + zend_printf("No syntax errors detected in %s\n", file_handle.filename); + } else { + zend_printf("Errors parsing %s\n", file_handle.filename); + } + + } else { + file_handle.filename = *p; + file_handle.free_filename = 0; + file_handle.opened_path = NULL; + + php_execute_script(&file_handle TSRMLS_CC); + ret = EG(exit_status); + } + + php_request_shutdown( NULL ); + } + } else { + php_printf("Could not open input file: %s.\n", *p); + } + } else { + cli_usage(TSRMLS_C); + } + } + + }zend_end_try(); + + php_module_shutdown(TSRMLS_C); #ifdef ZTS - tsrm_shutdown(); + tsrm_shutdown(); #endif - return ret; + return ret; } static int s_stop; void litespeed_cleanup(int signal) { - s_stop = signal; + s_stop = signal; } void start_children( int children ) { - struct sigaction act, old_term, old_quit, old_int, old_usr1; - int running = 0; - int status; - pid_t pid; - - /* Create a process group */ - setsid(); - - /* Set up handler to kill children upon exit */ - act.sa_flags = 0; - act.sa_handler = litespeed_cleanup; - if( sigaction( SIGTERM, &act, &old_term ) || - sigaction( SIGINT, &act, &old_int ) || - sigaction( SIGUSR1, &act, &old_usr1 ) || - sigaction( SIGQUIT, &act, &old_quit )) { - perror( "Can't set signals" ); - exit( 1 ); - } - s_stop = 0; - while( 1 ) { - while((!s_stop )&&( running < children )) { - pid = fork(); - switch( pid ) { - case 0: /* children process */ - - /* don't catch our signals */ - sigaction( SIGTERM, &old_term, 0 ); - sigaction( SIGQUIT, &old_quit, 0 ); - sigaction( SIGINT, &old_int, 0 ); - sigaction( SIGUSR1, &old_usr1, 0 ); - return ; - case -1: - perror( "php (pre-forking)" ); - exit( 1 ); - break; - default: /* parent process */ - running++; - break; - } - } - if ( s_stop ) { - break; - } - pid = wait( &status ); - running--; - } - kill( -getpgrp(), SIGUSR1 ); - exit( 0 ); + struct sigaction act, old_term, old_quit, old_int, old_usr1; + int running = 0; + int status; + pid_t pid; + + /* Create a process group */ + setsid(); + + /* Set up handler to kill children upon exit */ + act.sa_flags = 0; + act.sa_handler = litespeed_cleanup; + if( sigaction( SIGTERM, &act, &old_term ) || + sigaction( SIGINT, &act, &old_int ) || + sigaction( SIGUSR1, &act, &old_usr1 ) || + sigaction( SIGQUIT, &act, &old_quit )) { + perror( "Can't set signals" ); + exit( 1 ); + } + s_stop = 0; + while( 1 ) { + while((!s_stop )&&( running < children )) { + pid = fork(); + switch( pid ) { + case 0: /* children process */ + + /* don't catch our signals */ + sigaction( SIGTERM, &old_term, 0 ); + sigaction( SIGQUIT, &old_quit, 0 ); + sigaction( SIGINT, &old_int, 0 ); + sigaction( SIGUSR1, &old_usr1, 0 ); + return ; + case -1: + perror( "php (pre-forking)" ); + exit( 1 ); + break; + default: /* parent process */ + running++; + break; + } + } + if ( s_stop ) { + break; + } + pid = wait( &status ); + running--; + } + kill( -getpgrp(), SIGUSR1 ); + exit( 0 ); } - +void setArgv0( int argc, char * argv[] ) +{ + char * p; + int i; + argv0 = argv[0] + strlen( argv[0] ); + p = argv0; + while(( p > argv[0] )&&( p[-1] != '/')) + --p; + if ( p > argv[0] ) + { + memmove( argv[0], p, argv0 - p ); + memset( argv[0] + ( argv0 - p ), 0, p - argv[0] ); + argv0 = argv[0] + (argv0 - p); + } + for( i = 1; i < argc; ++i ) + { + memset( argv[i], 0, strlen( argv[i] ) ); + } +} #include int main( int argc, char * argv[] ) { - int ret; - int bindFd; - - char * php_ini_path = NULL; - char * php_bind = NULL; - char * p; - int n; - int climode = 0; - + int ret; + int bindFd; + + char * php_ini_path = NULL; + char * php_bind = NULL; + int n; + int climode = 0; + struct timeval tv_req_begin; + struct timeval tv_req_end; + int slow_script_msec = 0; + char time_buf[40]; + #ifdef HAVE_SIGNAL_H #if defined(SIGPIPE) && defined(SIG_IGN) - signal(SIGPIPE, SIG_IGN); + signal(SIGPIPE, SIG_IGN); #endif #endif #ifdef ZTS - tsrm_startup(1, 1, 0, NULL); + tsrm_startup(1, 1, 0, NULL); #endif - if (argc > 1 ) { - if ( parse_opt( argc, argv, &climode, - &php_ini_path, &php_bind ) == -1 ) { - return 1; - } - } - if ( climode ) { - lsapi_sapi_module.phpinfo_as_text = 1; - } - sapi_startup(&lsapi_sapi_module); + if (argc > 1 ) { + if ( parse_opt( argc, argv, &climode, + &php_ini_path, &php_bind ) == -1 ) { + return 1; + } + } + if ( climode ) { + lsapi_sapi_module.phpinfo_as_text = 1; + } else { + setArgv0(argc, argv ); + } + + sapi_startup(&lsapi_sapi_module); #ifdef ZTS - compiler_globals = ts_resource(compiler_globals_id); - executor_globals = ts_resource(executor_globals_id); - core_globals = ts_resource(core_globals_id); - sapi_globals = ts_resource(sapi_globals_id); - tsrm_ls = ts_resource(0); + compiler_globals = ts_resource(compiler_globals_id); + executor_globals = ts_resource(executor_globals_id); + core_globals = ts_resource(core_globals_id); + sapi_globals = ts_resource(sapi_globals_id); + tsrm_ls = ts_resource(0); - SG(request_info).path_translated = NULL; + SG(request_info).path_translated = NULL; #endif - lsapi_sapi_module.executable_location = argv[0]; + lsapi_sapi_module.executable_location = argv[0]; + + if ( ignore_php_ini ) + lsapi_sapi_module.php_ini_ignore = 1; + + if ( php_ini_path ) { + lsapi_sapi_module.php_ini_path_override = php_ini_path; + } - if ( php_ini_path ) { - lsapi_sapi_module.php_ini_path_override = php_ini_path; - } - if (php_module_startup(&lsapi_sapi_module, &litespeed_module_entry, 1) == FAILURE) { + lsapi_sapi_module.ini_defaults = sapi_lsapi_ini_defaults; + + if (php_module_startup(&lsapi_sapi_module, &litespeed_module_entry, 1) == FAILURE) { #ifdef ZTS - tsrm_shutdown(); + tsrm_shutdown(); #endif - return FAILURE; - } - - if ( climode ) { - return cli_main(argc, argv); - } - - - if ( php_bind ) { - bindFd = LSAPI_CreateListenSock( php_bind, 10 ); - if ( bindFd == -1 ) { - fprintf( stderr, - "Failed to bind socket [%s]: %s\n", php_bind, strerror( errno ) ); - exit( 2 ); - } - if ( bindFd != 0 ) { - dup2( bindFd, 0 ); - close( bindFd ); - } - } - - LSAPI_Init(); + return FAILURE; + } + + if ( climode ) { + return cli_main(argc, argv); + } + + if ( php_bind ) { + bindFd = LSAPI_CreateListenSock( php_bind, 10 ); + if ( bindFd == -1 ) { + fprintf( stderr, + "Failed to bind socket [%s]: %s\n", php_bind, strerror( errno ) ); + exit( 2 ); + } + if ( bindFd != 0 ) { + dup2( bindFd, 0 ); + close( bindFd ); + } + } + + LSAPI_Init(); - LSAPI_Init_Env_Parameters( NULL ); - - if ( php_bind ) { - LSAPI_No_Check_ppid(); - } - - while( LSAPI_Prefork_Accept_r( &g_req ) >= 0 ) { - ret = processReq(TSRMLS_C); - LSAPI_Finish(); - if ( ret ) { - break; - } - } - php_module_shutdown(TSRMLS_C); + LSAPI_Init_Env_Parameters( NULL ); + + slow_script_msec = LSAPI_Get_Slow_Req_Msecs(); + + if ( php_bind ) { + LSAPI_No_Check_ppid(); + free( php_bind ); + php_bind = NULL; + } + + while( LSAPI_Prefork_Accept_r( &g_req ) >= 0 ) { + if ( slow_script_msec ) { + gettimeofday( &tv_req_begin, NULL ); + } + ret = processReq(TSRMLS_C); + if ( slow_script_msec ) { + gettimeofday( &tv_req_end, NULL ); + n = ((long) tv_req_end.tv_sec - tv_req_begin.tv_sec ) * 1000 + + (tv_req_end.tv_usec - tv_req_begin.tv_usec) / 1000; + if ( n > slow_script_msec ) + { + strftime( time_buf, 30, "%d/%b/%Y:%H:%M:%S", localtime( &tv_req_end.tv_sec ) ); + fprintf( stderr, "[%s] Slow PHP script: %d ms\n URL: %s %s\n Query String: %s\n Script: %s\n", + time_buf, n, LSAPI_GetRequestMethod(), + LSAPI_GetScriptName(), LSAPI_GetQueryString(), + LSAPI_GetScriptFileName() ); + + } + } + LSAPI_Finish(); + if ( ret ) { + break; + } + } + php_module_shutdown(TSRMLS_C); #ifdef ZTS - tsrm_shutdown(); + tsrm_shutdown(); #endif - return ret; + return ret; } @@ -795,49 +1049,51 @@ ZEND_END_ARG_INFO() PHP_FUNCTION(litespeed_request_headers); PHP_FUNCTION(litespeed_response_headers); +PHP_FUNCTION(apache_get_modules); PHP_MINFO_FUNCTION(litespeed); zend_function_entry litespeed_functions[] = { - PHP_FE(litespeed_request_headers, arginfo_litespeed__void) - PHP_FE(litespeed_response_headers, arginfo_litespeed__void) - PHP_FALIAS(getallheaders, litespeed_request_headers, arginfo_litespeed__void) - PHP_FALIAS(apache_request_headers, litespeed_request_headers, arginfo_litespeed__void) - PHP_FALIAS(apache_response_headers, litespeed_response_headers, arginfo_litespeed__void) - {NULL, NULL, NULL} + PHP_FE(litespeed_request_headers, arginfo_litespeed__void) + PHP_FE(litespeed_response_headers, arginfo_litespeed__void) + PHP_FE(apache_get_modules, arginfo_litespeed__void) + PHP_FALIAS(getallheaders, litespeed_request_headers, arginfo_litespeed__void) + PHP_FALIAS(apache_request_headers, litespeed_request_headers, arginfo_litespeed__void) + PHP_FALIAS(apache_response_headers, litespeed_response_headers, arginfo_litespeed__void) + {NULL, NULL, NULL} }; static PHP_MINIT_FUNCTION(litespeed) { - /* REGISTER_INI_ENTRIES(); */ - return SUCCESS; + /* REGISTER_INI_ENTRIES(); */ + return SUCCESS; } static PHP_MSHUTDOWN_FUNCTION(litespeed) { - /* UNREGISTER_INI_ENTRIES(); */ - return SUCCESS; + /* UNREGISTER_INI_ENTRIES(); */ + return SUCCESS; } zend_module_entry litespeed_module_entry = { - STANDARD_MODULE_HEADER, - "litespeed", - litespeed_functions, - PHP_MINIT(litespeed), - PHP_MSHUTDOWN(litespeed), - NULL, - NULL, - NULL, - NO_VERSION_YET, - STANDARD_MODULE_PROPERTIES + STANDARD_MODULE_HEADER, + "litespeed", + litespeed_functions, + PHP_MINIT(litespeed), + PHP_MSHUTDOWN(litespeed), + NULL, + NULL, + NULL, + NO_VERSION_YET, + STANDARD_MODULE_PROPERTIES }; static int add_associate_array( const char * pKey, int keyLen, const char * pValue, int valLen, - void * arg ) + void * arg ) { - add_assoc_string_ex( (zval *)arg, (char *)pKey, keyLen+1, (char *)pValue, 1 ); - return 1; + add_assoc_string_ex( (zval *)arg, (char *)pKey, keyLen+1, (char *)pValue, 1 ); + return 1; } @@ -845,13 +1101,13 @@ static int add_associate_array( const char * pKey, int keyLen, const char * pVal Fetch all HTTP request headers */ PHP_FUNCTION(litespeed_request_headers) { - /* TODO: */ - if (ZEND_NUM_ARGS() > 0) { - WRONG_PARAM_COUNT; - } - array_init(return_value); + /* TODO: */ + if (ZEND_NUM_ARGS() > 0) { + WRONG_PARAM_COUNT; + } + array_init(return_value); - LSAPI_ForeachOrgHeader( add_associate_array, return_value ); + LSAPI_ForeachOrgHeader( add_associate_array, return_value ); } /* }}} */ @@ -862,45 +1118,62 @@ PHP_FUNCTION(litespeed_request_headers) Fetch all HTTP response headers */ PHP_FUNCTION(litespeed_response_headers) { - sapi_header_struct *h; - zend_llist_position pos; - char * p; - int len; - char headerBuf[SAPI_LSAPI_MAX_HEADER_LENGTH]; - - if (ZEND_NUM_ARGS() > 0) { - WRONG_PARAM_COUNT; - } - - if (!&SG(sapi_headers).headers) { - RETURN_FALSE; - } - array_init(return_value); - - h = zend_llist_get_first_ex(&SG(sapi_headers).headers, &pos); - while (h) { - if ( h->header_len > 0 ) { - p = strchr( h->header, ':' ); - len = p - h->header; - if (( p )&&( len > 0 )) { - memmove( headerBuf, h->header, len ); - while( len > 0 && (isspace( headerBuf[len-1])) ) { - --len; - } - headerBuf[len] = 0; - if ( len ) { - while( isspace(*++p)); - add_assoc_string_ex(return_value, headerBuf, len+1, p, 1 ); - } - } - } - h = zend_llist_get_next_ex(&SG(sapi_headers).headers, &pos); - } + sapi_header_struct *h; + zend_llist_position pos; + char * p; + int len; + char headerBuf[SAPI_LSAPI_MAX_HEADER_LENGTH]; + + if (ZEND_NUM_ARGS() > 0) { + WRONG_PARAM_COUNT; + } + + if (!&SG(sapi_headers).headers) { + RETURN_FALSE; + } + array_init(return_value); + + h = zend_llist_get_first_ex(&SG(sapi_headers).headers, &pos); + while (h) { + if ( h->header_len > 0 ) { + p = strchr( h->header, ':' ); + len = p - h->header; + if (( p )&&( len > 0 )) { + memmove( headerBuf, h->header, len ); + while( len > 0 && (isspace( headerBuf[len-1])) ) { + --len; + } + headerBuf[len] = 0; + if ( len ) { + while( isspace(*++p)); + add_assoc_string_ex(return_value, headerBuf, len+1, p, 1 ); + } + } + } + h = zend_llist_get_next_ex(&SG(sapi_headers).headers, &pos); + } } /* }}} */ +/* {{{ proto array apache_get_modules(void) + Fetch all loaded module names */ +PHP_FUNCTION(apache_get_modules) +{ + /* TODO: */ + if (ZEND_NUM_ARGS() > 0) { + WRONG_PARAM_COUNT; + } + array_init(return_value); + add_next_index_string(return_value, "mod_rewrite", 1); + add_next_index_string(return_value, "mod_mime", 1); + add_next_index_string(return_value, "mod_headers", 1); + add_next_index_string(return_value, "mod_expires", 1); +} +/* }}} */ + + /* * Local variables: * tab-width: 4 diff --git a/sapi/litespeed/lsapidef.h b/sapi/litespeed/lsapidef.h index c8940a930e947..5d5b4c1687a6c 100644 --- a/sapi/litespeed/lsapidef.h +++ b/sapi/litespeed/lsapidef.h @@ -1,25 +1,5 @@ - -/* - +----------------------------------------------------------------------+ - | 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 at 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: George Wang | - +----------------------------------------------------------------------+ -*/ - - /* -Copyright (c) 2007, Lite Speed Technologies Inc. +Copyright (c) 2005, Lite Speed Technologies Inc. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -50,6 +30,13 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/*************************************************************************** + $Id: lsapidef.h,v 1.17 2012/12/01 19:23:31 gwang Exp $ + ------------------- + begin : Thu Feb 10 2005 + author : George Wang + email : gwang@litespeedtech.com + ***************************************************************************/ #ifndef _LSAPIDEF_H_ #define _LSAPIDEF_H_ @@ -113,12 +100,14 @@ enum #define LSAPI_RESP_END 5 #define LSAPI_STDERR_STREAM 6 #define LSAPI_REQ_RECEIVED 7 +#define LSAPI_CONN_CLOSE 8 +#define LSAPI_INTERNAL_ERROR 9 #define LSAPI_MAX_HEADER_LEN 65535 #define LSAPI_MAX_DATA_PACKET_LEN 16384 -#define LSAPI_RESP_HTTP_HEADER_MAX 4096 +#define LSAPI_RESP_HTTP_HEADER_MAX 32768 #define LSAPI_PACKET_HEADER_LEN 8 diff --git a/sapi/litespeed/lsapilib.c b/sapi/litespeed/lsapilib.c index 3a13000e11f28..4a9affc60f213 100644 --- a/sapi/litespeed/lsapilib.c +++ b/sapi/litespeed/lsapilib.c @@ -1,25 +1,5 @@ /* - +----------------------------------------------------------------------+ - | 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 at 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: George Wang | - +----------------------------------------------------------------------+ -*/ - -/* $Id$ */ - -/* -Copyright (c) 2007, Lite Speed Technologies Inc. +Copyright (c) 2013, Lite Speed Technologies Inc. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -50,17 +30,21 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include +/*************************************************************************** + lsapilib.c - description + ------------------- + begin : Mon Feb 21 2005 + copyright : (C) 2005 by George Wang + email : gwang@litespeedtech.com + ***************************************************************************/ + #include +#include #include #include -#include -#include -#include -#include -#include +#include #include #include #include @@ -71,8 +55,48 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include +#include #include #include +#include +#include +#include +#include +#include + +#include "lsapilib.h" + +#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) +#include +#endif + +#if defined(__FreeBSD__ ) || defined(__NetBSD__) || defined(__OpenBSD__) \ + || defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) +#include +#endif + +#include +#ifndef uint32 +#define uint32 uint32_t +#endif + +struct lsapi_MD5Context { + uint32 buf[4]; + uint32 bits[2]; + unsigned char in[64]; +}; + +void lsapi_MD5Init(struct lsapi_MD5Context *context); +void lsapi_MD5Update(struct lsapi_MD5Context *context, unsigned char const *buf, + unsigned len); +void lsapi_MD5Final(unsigned char digest[16], struct lsapi_MD5Context *context); + +/* + * This is needed to make RSAREF happy on some MS-DOS compilers. + */ +typedef struct lsapi_MD5Context lsapi_MD5_CTX; + #define LSAPI_ST_REQ_HEADER 1 #define LSAPI_ST_REQ_BODY 2 @@ -83,11 +107,20 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define LSAPI_INIT_RESP_HEADER_LEN 4096 + static int g_inited = 0; static int g_running = 1; static int s_ppid; +static int s_slow_req_msecs = 0; +static int s_keepListener = 0; +static int s_dump_debug_info = 0; +static int s_pid_dump_debug_info = 0; + LSAPI_Request g_req = { -1, -1 }; +static char s_pSecret[24]; + + void Flush_RespBuf_r( LSAPI_Request * pReq ); static const char *CGI_HEADERS[H_TRANSFER_ENCODING+1] = @@ -111,13 +144,13 @@ static const char *CGI_HEADERS[H_TRANSFER_ENCODING+1] = "HTTP_TRANSFER_ENCODING" }; -static int CGI_HEADER_LEN[H_TRANSFER_ENCODING+1] = { - 11, 19, 20, 20, 18, 15, 12, 14, 11, 12, 9, 11, 12, 15, 18, - 22, 13, 18, 13, 24, 15, 10, 20, 8, 22 -}; +static int CGI_HEADER_LEN[H_TRANSFER_ENCODING+1] = +{ 11, 19, 20, 20, 18, 15, 12, 14, 11, 12, 9, 11, 12, 15, 18, + 22, 13, 18, 13, 24, 15, 10, 20, 8, 22 }; -static const char *HTTP_HEADERS[H_TRANSFER_ENCODING+1] = { +static const char *HTTP_HEADERS[H_TRANSFER_ENCODING+1] = +{ "Accept", "Accept-Charset", "Accept-Encoding", "Accept-Language", "Authorization", @@ -137,8 +170,8 @@ static const char *HTTP_HEADERS[H_TRANSFER_ENCODING+1] = { "Transfer-Encoding" }; -static int HTTP_HEADER_LEN[H_TRANSFER_ENCODING+1] = { - 6, 14, 15, 15, 13, 10, 12, 14, 6, 7, 4, 6, 7, 10, /* user-agent */ +static int HTTP_HEADER_LEN[H_TRANSFER_ENCODING+1] = +{ 6, 14, 15, 15, 13, 10, 12, 14, 6, 7, 4, 6, 7, 10, //user-agent 13,17, 8, 13, 8, 19, 10, 5, 15, 3, 17 }; @@ -160,7 +193,8 @@ static void lsapi_signal(int signo, sighandler_t handler) sigaction(signo, NULL, &sa); - if (sa.sa_handler == SIG_DFL) { + if (sa.sa_handler == SIG_DFL) + { sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = handler; @@ -169,6 +203,34 @@ static void lsapi_signal(int signo, sighandler_t handler) } +static int s_enable_core_dump = 0; +static void lsapi_enable_core_dump() +{ +#if defined(__FreeBSD__ ) || defined(__NetBSD__) || defined(__OpenBSD__) \ + || defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) + int mib[2]; + size_t len; + + len = 2; + if ( sysctlnametomib("kern.sugid_coredump", mib, &len) == 0 ) + { + len = sizeof(s_enable_core_dump); + if (sysctl(mib, 2, NULL, 0, &s_enable_core_dump, len) == -1) + perror( "sysctl: Failed to set 'kern.sugid_coredump', " + "core dump may not be available!"); + } + + +#endif + +#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) + if (prctl(PR_SET_DUMPABLE, s_enable_core_dump,0,0,0) == -1) + perror( "prctl: Failed to set dumpable, " + "core dump may not be available!"); +#endif +} + + static inline void lsapi_buildPacketHeader( struct lsapi_packet_header * pHeader, char type, int len ) { @@ -199,75 +261,115 @@ static int lsapi_set_nblock( int fd, int nonblock ) return 0; } - static int lsapi_close( int fd ) { int ret; - while( 1 ) { + while( 1 ) + { ret = close( fd ); - if (( ret == -1 )&&( errno == EINTR )&&(g_running)) { + if (( ret == -1 )&&( errno == EINTR )&&(g_running)) continue; - } return ret; } } -static inline int lsapi_read( int fd, void * pBuf, int len ) +static inline ssize_t lsapi_read( int fd, void * pBuf, size_t len ) { - int ret; - while( 1 ) { + ssize_t ret; + while( 1 ) + { ret = read( fd, (char *)pBuf, len ); - if (( ret == -1 )&&( errno == EINTR )&&(g_running)) { + if (( ret == -1 )&&( errno == EINTR )&&(g_running)) continue; - } return ret; } } +/* +static int lsapi_write( int fd, const void * pBuf, int len ) +{ + int ret; + const char * pCur; + const char * pEnd; + if ( len == 0 ) + return 0; + pCur = (const char *)pBuf; + pEnd = pCur + len; + while( g_running && (pCur < pEnd) ) + { + ret = write( fd, pCur, pEnd - pCur ); + if ( ret >= 0) + pCur += ret; + else if (( ret == -1 )&&( errno != EINTR )) + return ret; + } + return pCur - (const char *)pBuf; +} +*/ static int lsapi_writev( int fd, struct iovec ** pVec, int count, int totalLen ) { int ret; int left = totalLen; int n = count; - while(( left > 0 )&&g_running ) { + while(( left > 0 )&&g_running ) + { ret = writev( fd, *pVec, n ); - if ( ret > 0 ) { + if ( ret > 0 ) + { left -= ret; - if (( left <= 0)||( !g_running )) { + if (( left <= 0)||( !g_running )) return totalLen - left; - } - while( ret > 0 ) { - if ( (*pVec)->iov_len <= ret ) { + while( ret > 0 ) + { + if ( (*pVec)->iov_len <= (unsigned int )ret ) + { ret -= (*pVec)->iov_len; ++(*pVec); - } else { + } + else + { (*pVec)->iov_base = (char *)(*pVec)->iov_base + ret; (*pVec)->iov_len -= ret; break; } } - } else if ( ret == -1 ) { - if ( errno == EAGAIN ) { - if ( totalLen - left > 0 ) { + } + else if ( ret == -1 ) + { + if ( errno == EAGAIN ) + { + if ( totalLen - left > 0 ) return totalLen - left; - } else { + else return -1; - } - } else { - if ( errno != EINTR ) { - return ret; - } } + else if ( errno != EINTR ) + return ret; } } return totalLen - left; } +/* +static int getTotalLen( struct iovec * pVec, int count ) +{ + struct iovec * pEnd = pVec + count; + int total = 0; + while( pVec < pEnd ) + { + total += pVec->iov_len; + ++pVec; + } + return total; +} +*/ + static inline int allocateBuf( LSAPI_Request * pReq, int size ) { char * pBuf = (char *)realloc( pReq->m_pReqBuf, size ); - if ( pBuf ) { + if ( pBuf ) + { pReq->m_pReqBuf = pBuf; pReq->m_reqBufSize = size; pReq->m_pHeader = (struct lsapi_req_header *)pReq->m_pReqBuf; @@ -281,9 +383,8 @@ static int allocateIovec( LSAPI_Request * pReq, int n ) { struct iovec * p = (struct iovec *)realloc( pReq->m_pIovec, sizeof(struct iovec) * n ); - if ( !p ) { + if ( !p ) return -1; - } pReq->m_pIovecToWrite = p + ( pReq->m_pIovecToWrite - pReq->m_pIovec ); pReq->m_pIovecCur = p + ( pReq->m_pIovecCur - pReq->m_pIovec ); pReq->m_pIovec = p; @@ -294,9 +395,8 @@ static int allocateIovec( LSAPI_Request * pReq, int n ) static int allocateRespHeaderBuf( LSAPI_Request * pReq, int size ) { char * p = (char *)realloc( pReq->m_pRespHeaderBuf, size ); - if ( !p ) { + if ( !p ) return -1; - } pReq->m_pRespHeaderBufPos = p + ( pReq->m_pRespHeaderBufPos - pReq->m_pRespHeaderBuf ); pReq->m_pRespHeaderBuf = p; pReq->m_pRespHeaderBufEnd = p + size; @@ -308,10 +408,10 @@ static inline int verifyHeader( struct lsapi_packet_header * pHeader, char pktTy { if (( LSAPI_VERSION_B0 != pHeader->m_versionB0 )|| ( LSAPI_VERSION_B1 != pHeader->m_versionB1 )|| - ( pktType != pHeader->m_type )) { + ( pktType != pHeader->m_type )) return -1; - } - if ( LSAPI_ENDIAN != (pHeader->m_flag & LSAPI_ENDIAN_BIT )) { + if ( LSAPI_ENDIAN != (pHeader->m_flag & LSAPI_ENDIAN_BIT )) + { register char b; b = pHeader->m_packetLen.m_bytes[0]; pHeader->m_packetLen.m_bytes[0] = pHeader->m_packetLen.m_bytes[3]; @@ -327,21 +427,20 @@ static int allocateEnvList( struct LSAPI_key_value_pair ** pEnvList, int *curSize, int newSize ) { struct LSAPI_key_value_pair * pBuf; - if ( *curSize >= newSize ) { + if ( *curSize >= newSize ) return 0; - } - if ( newSize > 8192 ) { + if ( newSize > 8192 ) return -1; - } pBuf = (struct LSAPI_key_value_pair *)realloc( *pEnvList, newSize * sizeof(struct LSAPI_key_value_pair) ); - if ( pBuf ) { + if ( pBuf ) + { *pEnvList = pBuf; *curSize = newSize; return 0; - } else { - return -1; } + else + return -1; } @@ -350,36 +449,32 @@ static inline int isPipe( int fd ) char achPeer[128]; socklen_t len = 128; if (( getpeername( fd, (struct sockaddr *)achPeer, &len ) != 0 )&& - ( errno == ENOTCONN )) { + ( errno == ENOTCONN )) return 0; - } else { + else return 1; - } } static int parseEnv( struct LSAPI_key_value_pair * pEnvList, int count, char **pBegin, char * pEnd ) { struct LSAPI_key_value_pair * pEnvEnd; - int keyLen = 0, valLen = 0; - if ( count > 8192 ) { + int keyLen = 0, valLen = 0; + if ( count > 8192 ) return -1; - } pEnvEnd = pEnvList + count; - while( pEnvList != pEnvEnd ) { - if ( pEnd - *pBegin < 4 ) { + while( pEnvList != pEnvEnd ) + { + if ( pEnd - *pBegin < 4 ) return -1; - } keyLen = *((unsigned char *)((*pBegin)++)); keyLen = (keyLen << 8) + *((unsigned char *)((*pBegin)++)); valLen = *((unsigned char *)((*pBegin)++)); valLen = (valLen << 8) + *((unsigned char *)((*pBegin)++)); - if ( *pBegin + keyLen + valLen > pEnd ) { + if ( *pBegin + keyLen + valLen > pEnd ) return -1; - } - if (( !keyLen )||( !valLen )) { + if (( !keyLen )||( !valLen )) return -1; - } pEnvList->pKey = *pBegin; *pBegin += keyLen; @@ -390,9 +485,8 @@ static int parseEnv( struct LSAPI_key_value_pair * pEnvList, int count, pEnvList->valLen = valLen - 1; ++pEnvList; } - if ( memcmp( *pBegin, "\0\0\0\0", 4 ) != 0 ) { + if ( memcmp( *pBegin, "\0\0\0\0", 4 ) != 0 ) return -1; - } *pBegin += 4; return 0; } @@ -427,8 +521,10 @@ static inline void fixEndian( LSAPI_Request * pReq ) static void fixHeaderIndexEndian( LSAPI_Request * pReq ) { int i; - for( i = 0; i < H_TRANSFER_ENCODING; ++i ) { - if ( pReq->m_pHeaderIndex->m_headerOff[i] ) { + for( i = 0; i < H_TRANSFER_ENCODING; ++i ) + { + if ( pReq->m_pHeaderIndex->m_headerOff[i] ) + { register char b; char * p = (char *)(&pReq->m_pHeaderIndex->m_headerLen[i]); b = p[0]; @@ -437,20 +533,434 @@ static void fixHeaderIndexEndian( LSAPI_Request * pReq ) swapIntEndian( &pReq->m_pHeaderIndex->m_headerOff[i] ); } } - if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 ) { + if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 ) + { struct lsapi_header_offset * pCur, *pEnd; pCur = pReq->m_pUnknownHeader; pEnd = pCur + pReq->m_pHeader->m_cntUnknownHeaders; - while( pCur < pEnd ) { + while( pCur < pEnd ) + { swapIntEndian( &pCur->nameOff ); swapIntEndian( &pCur->nameLen ); swapIntEndian( &pCur->valueOff ); swapIntEndian( &pCur->valueLen ); ++pCur; } - } + } +} + +static uid_t s_uid = 0; +static uid_t s_defaultUid; //web server need set this +static gid_t s_defaultGid; + +#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) + +#define LSAPI_LVE_DISABLED 0 +#define LSAPI_LVE_ENABLED 1 +#define LSAPI_CAGEFS_ENABLED 2 +#define LSAPI_CAGEFS_NO_SUEXEC 3 +struct liblve; +static int s_enable_lve = LSAPI_LVE_DISABLED; +static struct liblve * s_lve = NULL; + +static void *s_liblve; +static int (*fp_lve_is_available)(void) = NULL; +static int (*fp_lve_instance_init)(struct liblve *) = NULL; +static int (*fp_lve_destroy)(struct liblve *) = NULL; +static int (*fp_lve_enter)(struct liblve *, uint32_t, int32_t, int32_t, uint32_t *) = NULL; +static int (*fp_lve_leave)(struct liblve *, uint32_t *) = NULL; +static int (*fp_lve_jail)( struct passwd *, char *) = NULL; +static int lsapi_load_lve_lib() +{ + s_liblve = dlopen("liblve.so.0", RTLD_LAZY); + if (s_liblve) + { + fp_lve_is_available = dlsym(s_liblve, "lve_is_available"); + if (dlerror() == NULL) + { + if ( !(*fp_lve_is_available)() ) + { + int uid = getuid(); + if ( uid ) + { + setreuid( s_uid, uid ); + if ( !(*fp_lve_is_available)() ) + s_enable_lve = 0; + setreuid( uid, s_uid ); + } + } + } + } + else + { + s_enable_lve = LSAPI_LVE_DISABLED; + } + return (s_liblve)? 0 : -1; } +static int init_lve_ex() +{ + int rc; + if ( !s_liblve ) + return -1; + fp_lve_instance_init = dlsym(s_liblve, "lve_instance_init"); + fp_lve_destroy = dlsym(s_liblve, "lve_destroy"); + fp_lve_enter = dlsym(s_liblve, "lve_enter"); + fp_lve_leave = dlsym(s_liblve, "lve_leave"); + if ( s_enable_lve >= LSAPI_CAGEFS_ENABLED ) + fp_lve_jail = dlsym(s_liblve, "jail" ); + + if ( s_lve == NULL ) + { + rc = (*fp_lve_instance_init)(NULL); + s_lve = malloc(rc); + } + rc = (*fp_lve_instance_init)(s_lve); + if (rc != 0) + { + perror( "LSAPI: Unable to initialize LVE" ); + free( s_lve ); + s_lve = NULL; + return -1; + } + return 0; + +} + +#endif + + + +static int readSecret( const char * pSecretFile ) +{ + struct stat st; + int fd = open( pSecretFile, O_RDONLY , 0600 ); + if ( fd == -1 ) + { + fprintf( stderr, "LSAPI: failed to open secret file: %s!\n", pSecretFile ); + return -1; + } + if ( fstat( fd, &st ) == -1 ) + { + fprintf( stderr, "LSAPI: failed to check state of file: %s!\n", pSecretFile ); + close( fd ); + return -1; + } +/* + if ( st.st_uid != s_uid ) + { + fprintf( stderr, "LSAPI: file owner check failure: %s!\n", pSecretFile ); + close( fd ); + return -1; + } +*/ + if ( st.st_mode & 0077 ) + { + fprintf( stderr, "LSAPI: file permission check failure: %s\n", pSecretFile ); + close( fd ); + return -1; + } + if ( read( fd, s_pSecret, 16 ) < 16 ) + { + fprintf( stderr, "LSAPI: failed to read secret from secret file: %s\n", pSecretFile ); + close( fd ); + return -1; + } + close( fd ); + return 0; +} + +int LSAPI_is_suEXEC_Daemon() +{ + if (( !s_uid )&&( s_pSecret[0] )) + return 1; + else + return 0; +} + +static int LSAPI_perror_r( LSAPI_Request * pReq, const char * pErr1, const char *pErr2 ) +{ + char achError[1024]; + int n = snprintf(achError, 1024, "%s:%s: %s\n", pErr1, (pErr2)?pErr2:"", strerror( errno ) ); + if ( pReq ) + LSAPI_Write_Stderr_r( pReq, achError, n ); + else + write( STDERR_FILENO, achError, n ); + return 0; +} + +static int lsapi_lve_error( LSAPI_Request * pReq ) +{ + static const char * headers[] = + { + "Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0", + "Pragma: no-cache", + "Retry-After: 60", + "Content-Type: text/html", + NULL + }; + static const char achBody[] = + "\n" + "\n508 Resource Limit Is Reached\n" + "\n" "

Resource Limit Is Reached

\n" + "The website is temporarily unable to service your request as it exceeded resource limit.\n" + "Please try again later.\n" + "
\n" + "\n"; + + LSAPI_ErrResponse_r( pReq, 508, headers, achBody, sizeof( achBody ) - 1 ); + return 0; +} + +static int lsapi_enterLVE( LSAPI_Request * pReq, uid_t uid ) +{ +#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) + if ( s_lve && uid ) //root user should not do that + { + uint32_t cookie; + int ret = -1; + ret = (*fp_lve_enter)(s_lve, uid, -1, -1, &cookie); + if ( ret < 0 ) + { + fprintf( stderr, "Pid (%d): enter LVE (%d) : ressult: %d !\n", getpid(), uid, ret ); + LSAPI_perror_r(pReq, "LSAPI: lve_enter() failure, reached resource limit.", NULL ); + lsapi_lve_error( pReq ); + return -1; + } + } +#endif + + return 0; +} + +static int lsapi_jailLVE( LSAPI_Request * pReq, uid_t uid, struct passwd * pw ) +{ + int ret = 0; +#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) + char error_msg[1024] = ""; + ret = (*fp_lve_jail)( pw, error_msg ); + if ( ret < 0 ) + { + fprintf( stderr, "LSAPI (%d): LVE jail(%d) ressult: %d, error: %s !\n", + getpid(), uid, ret, error_msg ); + LSAPI_perror_r( pReq, "LSAPI: jail() failure.", NULL ); + return -1; + } +#endif + return ret; +} + + +#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) +static int lsapi_initLVE() +{ + const char * pEnv; + if ( (pEnv = getenv( "LSAPI_LVE_ENABLE" ))!= NULL ) + { + s_enable_lve = atol( pEnv ); + pEnv = NULL; + } + else if ( (pEnv = getenv( "LVE_ENABLE" ))!= NULL ) + { + s_enable_lve = atol( pEnv ); + pEnv = NULL; + } + if ( s_enable_lve && !s_uid ) + { + lsapi_load_lve_lib(); + if ( s_enable_lve ) + { + return init_lve_ex(); + } + + } + return 0; +} +#endif + + +static int setUID_LVE(LSAPI_Request * pReq, uid_t uid, gid_t gid, const char * pChroot) +{ + int rv; + struct passwd * pw; + pw = getpwuid( uid ); +#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) + if ( s_lve ) + { + if( lsapi_enterLVE( pReq, uid ) == -1 ) + return -1; + if ( pw && fp_lve_jail) + { + rv = lsapi_jailLVE( pReq, uid, pw ); + if ( rv == -1 ) + return -1; + if (( rv == 1 )&&(s_enable_lve == LSAPI_CAGEFS_NO_SUEXEC )) //this mode only use cageFS, does not use suEXEC + { + uid = s_defaultUid; + gid = s_defaultGid; + pw = getpwuid( uid ); + } + } + } +#endif + //if ( !uid || !gid ) //do not allow root + //{ + // return -1; + //} + +#if defined(__FreeBSD__ ) || defined(__NetBSD__) || defined(__OpenBSD__) \ + || defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) + if ( s_enable_core_dump ) + lsapi_enable_core_dump(); +#endif + + rv = setgid(gid); + if (rv == -1) + { + LSAPI_perror_r(pReq, "LSAPI: setgid()", NULL); + return -1; + } + if ( pw && (pw->pw_gid == gid )) + { + rv = initgroups( pw->pw_name, gid ); + if (rv == -1) + { + LSAPI_perror_r(pReq, "LSAPI: initgroups()", NULL); + return -1; + } + } + else + { + rv = setgroups(1, &gid); + if (rv == -1) + { + LSAPI_perror_r(pReq, "LSAPI: setgroups()", NULL); + } + } + if ( pChroot ) + { + rv = chroot( pChroot ); + if ( rv == -1 ) + { + LSAPI_perror_r(pReq, "LSAPI: chroot()", NULL); + return -1; + } + } + rv = setuid(uid); + if (rv == -1) + { + LSAPI_perror_r(pReq, "LSAPI: setuid()", NULL); + return -1; + } +#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) + if ( s_enable_core_dump ) + lsapi_enable_core_dump(); +#endif + return 0; +} + +static int lsapi_suexec_auth( LSAPI_Request *pReq, + char * pAuth, int len, char * pUgid, int ugidLen ) +{ + lsapi_MD5_CTX md5ctx; + unsigned char achMD5[16]; + if ( len < 32 ) + return -1; + memmove( achMD5, pAuth + 16, 16 ); + memmove( pAuth + 16, s_pSecret, 16 ); + lsapi_MD5Init( &md5ctx ); + lsapi_MD5Update( &md5ctx, (unsigned char *)pAuth, 32 ); + lsapi_MD5Update( &md5ctx, (unsigned char *)pUgid, 8 ); + lsapi_MD5Final( (unsigned char *)pAuth + 16, &md5ctx); + if ( memcmp( achMD5, pAuth + 16, 16 ) == 0 ) + return 0; + return 1; +} + + +static int lsapi_changeUGid( LSAPI_Request * pReq ) +{ + int uid = s_defaultUid; + int gid = s_defaultGid; + const char * pChroot = NULL; + struct LSAPI_key_value_pair * pEnv; + struct LSAPI_key_value_pair * pAuth; + int i; + if ( s_uid ) + return 0; + //with special ID 0x00 + //authenticate the suEXEC request; + //first one should be MD5( nonce + lscgid secret ) + //remember to clear the secret after verification + //it should be set at the end of special env + i = pReq->m_pHeader->m_cntSpecialEnv - 1; + if ( i >= 0 ) + { + pEnv = pReq->m_pSpecialEnvList + i; + if (( *pEnv->pKey == '\000' )&& + ( strcmp( pEnv->pKey+1, "SUEXEC_AUTH" ) == 0 )) + { + --pReq->m_pHeader->m_cntSpecialEnv; + pAuth = pEnv--; + if (( *pEnv->pKey == '\000' )&& + ( strcmp( pEnv->pKey+1, "SUEXEC_UGID" ) == 0 )) + { + --pReq->m_pHeader->m_cntSpecialEnv; + uid = *(uint32_t *)pEnv->pValue; + gid = *(((uint32_t *)pEnv->pValue) + 1 ); + //fprintf( stderr, "LSAPI: SUEXEC_UGID set UID: %d, GID: %d\n", uid, gid ); + } + else + { + fprintf( stderr, "LSAPI: missing SUEXEC_UGID env, use default user!\n" ); + pEnv = NULL; + } + if ( pEnv&& lsapi_suexec_auth( pReq, pAuth->pValue, pAuth->valLen, pEnv->pValue, pEnv->valLen ) == 0 ) + { + //read UID, GID from specialEnv + + } + else + { + //authentication error + fprintf( stderr, "LSAPI: SUEXEC_AUTH authentication failed, use default user!\n" ); + uid = 0; + } + } + else + { + //fprintf( stderr, "LSAPI: no SUEXEC_AUTH env, use default user!\n" ); + } + } + + + if ( !uid ) + { + uid = s_defaultUid; + gid = s_defaultGid; + } + + //change uid + if ( setUID_LVE( pReq, uid, gid, pChroot ) == -1 ) + { + return -1; + } + + s_uid = uid; + + return 0; + +} + +static int parseContentLenFromHeader(LSAPI_Request * pReq) +{ + const char * pContentLen = LSAPI_GetHeader_r( pReq, H_CONTENT_LENGTH ); + if ( pContentLen ) + pReq->m_reqBodyLen = strtoll( pContentLen, NULL, 10 ); + return 0; +} + + static int parseRequest( LSAPI_Request * pReq, int totalLen ) { int shouldFixEndian; @@ -458,29 +968,28 @@ static int parseRequest( LSAPI_Request * pReq, int totalLen ) char * pEnd = pReq->m_pReqBuf + totalLen; shouldFixEndian = ( LSAPI_ENDIAN != ( pReq->m_pHeader->m_pktHeader.m_flag & LSAPI_ENDIAN_BIT ) ); - if ( shouldFixEndian ) { + if ( shouldFixEndian ) + { fixEndian( pReq ); } if ( (pReq->m_specialEnvListSize < pReq->m_pHeader->m_cntSpecialEnv )&& allocateEnvList( &pReq->m_pSpecialEnvList, - &pReq->m_specialEnvListSize, - pReq->m_pHeader->m_cntSpecialEnv ) == -1 ) { + &pReq->m_specialEnvListSize, + pReq->m_pHeader->m_cntSpecialEnv ) == -1 ) return -1; - } if ( (pReq->m_envListSize < pReq->m_pHeader->m_cntEnv )&& allocateEnvList( &pReq->m_pEnvList, &pReq->m_envListSize, - pReq->m_pHeader->m_cntEnv ) == -1 ) { + pReq->m_pHeader->m_cntEnv ) == -1 ) return -1; - } + if ( parseEnv( pReq->m_pSpecialEnvList, - pReq->m_pHeader->m_cntSpecialEnv, - &pBegin, pEnd ) == -1 ) { + pReq->m_pHeader->m_cntSpecialEnv, + &pBegin, pEnd ) == -1 ) return -1; - } if ( parseEnv( pReq->m_pEnvList, pReq->m_pHeader->m_cntEnv, - &pBegin, pEnd ) == -1 ) { + &pBegin, pEnd ) == -1 ) return -1; - } + pReq->m_pScriptFile = pReq->m_pReqBuf + pReq->m_pHeader->m_scriptFileOff; pReq->m_pScriptName = pReq->m_pReqBuf + pReq->m_pHeader->m_scriptNameOff; pReq->m_pQueryString = pReq->m_pReqBuf + pReq->m_pHeader->m_queryStringOff; @@ -496,85 +1005,183 @@ static int parseRequest( LSAPI_Request * pReq, int totalLen ) pReq->m_pHttpHeader = pBegin; pBegin += pReq->m_pHeader->m_httpHeaderLen; - if ( pBegin != pEnd ) { + if ( pBegin != pEnd ) + { + fprintf( stderr, "%d: request header does match total size, total: %d, real: %ld\n", getpid(), totalLen, + pBegin - pReq->m_pReqBuf ); return -1; } - - if ( shouldFixEndian ) { + if ( shouldFixEndian ) + { fixHeaderIndexEndian( pReq ); } - + pReq->m_reqBodyLen = pReq->m_pHeader->m_reqBodyLen; + if ( pReq->m_reqBodyLen == -2 ) + { + parseContentLenFromHeader(pReq); + } + return 0; } -static struct lsapi_packet_header ack = {'L', 'S', +//OPTIMIZATION +static char s_accept_notify = 0; +static char s_schedule_notify = 0; +static char s_notify_scheduled = 0; +static char s_notified_pid = 0; + +static struct lsapi_packet_header s_ack = {'L', 'S', LSAPI_REQ_RECEIVED, LSAPI_ENDIAN, {LSAPI_PACKET_HEADER_LEN} }; -static inline int notify_req_received( LSAPI_Request * pReq ) + + +static inline int write_req_received_notification( int fd ) { - if ( write( pReq->m_fd, &ack, LSAPI_PACKET_HEADER_LEN ) - < LSAPI_PACKET_HEADER_LEN ) { + if ( write( fd, &s_ack, LSAPI_PACKET_HEADER_LEN ) + < LSAPI_PACKET_HEADER_LEN ) return -1; + return 0; +} + +static void lsapi_sigalarm( int sig ) +{ + if ( s_notify_scheduled ) + { + s_notify_scheduled = 0; + if ( g_req.m_fd != -1 ) + write_req_received_notification( g_req.m_fd ); + } +} + +static inline int lsapi_schedule_notify() +{ + if ( !s_notify_scheduled ) + { + alarm( 2 ); + s_notify_scheduled = 1; } return 0; } +static inline int notify_req_received( int fd ) +{ + if ( s_schedule_notify ) + return lsapi_schedule_notify(); + return write_req_received_notification( fd ); + +} + + +static inline int lsapi_notify_pid( int fd ) +{ + char achBuf[16]; + lsapi_buildPacketHeader( (struct lsapi_packet_header *)achBuf, LSAPI_STDERR_STREAM, + 8 + LSAPI_PACKET_HEADER_LEN ); + memmove( &achBuf[8], "\0PID", 4 ); + *((int *)&achBuf[12]) = getpid(); + + if ( write( fd, achBuf, 16 ) < 16 ) + return -1; + return 0; +} + +static char s_conn_key_packet[16]; +static inline int init_conn_key( int fd ) +{ + struct lsapi_packet_header * pHeader = (struct lsapi_packet_header *)s_conn_key_packet; + struct timeval tv; + int i; + gettimeofday( &tv, NULL ); + srand( (tv.tv_sec % 0x1000 + tv.tv_usec) ^ rand() ); + for( i = 8; i < 16; ++i ) + { + s_conn_key_packet[i]=(int) (256.0*rand()/(RAND_MAX+1.0)); + } + lsapi_buildPacketHeader( pHeader, LSAPI_REQ_RECEIVED, + 8 + LSAPI_PACKET_HEADER_LEN ); + if ( write( fd, s_conn_key_packet, LSAPI_PACKET_HEADER_LEN+8 ) + < LSAPI_PACKET_HEADER_LEN+8 ) + return -1; + return 0; + + +} static int readReq( LSAPI_Request * pReq ) { int len; int packetLen; - if ( !pReq ) { + if ( !pReq ) return -1; - } - if ( pReq->m_reqBufSize < 8192 ) { - if ( allocateBuf( pReq, 8192 ) == -1 ) { + if ( pReq->m_reqBufSize < 8192 ) + { + if ( allocateBuf( pReq, 8192 ) == -1 ) return -1; - } } - while ( pReq->m_bufRead < LSAPI_PACKET_HEADER_LEN ) { + while ( pReq->m_bufRead < LSAPI_PACKET_HEADER_LEN ) + { len = lsapi_read( pReq->m_fd, pReq->m_pReqBuf, pReq->m_reqBufSize ); - if ( len <= 0 ) { + if ( len <= 0 ) return -1; - } pReq->m_bufRead += len; } pReq->m_reqState = LSAPI_ST_REQ_HEADER; packetLen = verifyHeader( &pReq->m_pHeader->m_pktHeader, LSAPI_BEGIN_REQUEST ); - if ( packetLen < 0 ) { + if ( packetLen < 0 ) + { + fprintf( stderr, "%d: packetLen < 0\n", getpid() ); return -1; } - if ( packetLen > LSAPI_MAX_HEADER_LEN ) { + if ( packetLen > LSAPI_MAX_HEADER_LEN ) + { + fprintf( stderr, "%d: packetLen > %d\n", getpid(), LSAPI_MAX_HEADER_LEN ); return -1; } - if ( packetLen + 1024 > pReq->m_reqBufSize ) { - if ( allocateBuf( pReq, packetLen + 1024 ) == -1 ) { + if ( packetLen + 1024 > pReq->m_reqBufSize ) + { + if ( allocateBuf( pReq, packetLen + 1024 ) == -1 ) return -1; - } } - while( packetLen > pReq->m_bufRead ) { + while( packetLen > pReq->m_bufRead ) + { len = lsapi_read( pReq->m_fd, pReq->m_pReqBuf + pReq->m_bufRead, packetLen - pReq->m_bufRead ); - if ( len <= 0 ) { + if ( len <= 0 ) return -1; - } pReq->m_bufRead += len; } - if ( parseRequest( pReq, packetLen ) < 0 ) { + if ( parseRequest( pReq, packetLen ) < 0 ) + { + fprintf( stderr, "%d: parseRequest error\n", getpid() ); return -1; } - pReq->m_bufProcessed = packetLen; + pReq->m_reqState = LSAPI_ST_REQ_BODY | LSAPI_ST_RESP_HEADER; - return notify_req_received( pReq ); + if ( !s_uid ) + if ( lsapi_changeUGid( pReq ) ) + return -1; + pReq->m_bufProcessed = packetLen; + + //OPTIMIZATION + if ( !s_accept_notify && !s_notified_pid ) + return notify_req_received( pReq->m_fd ); + else + { + s_notified_pid = 0; + return 0; + } } int LSAPI_Init(void) { - if ( !g_inited ) { + if ( !g_inited ) + { + s_uid = geteuid(); + s_pSecret[0] = 0; lsapi_signal(SIGPIPE, lsapi_sigpipe); lsapi_signal(SIGUSR1, lsapi_siguser1); @@ -583,11 +1190,9 @@ int LSAPI_Init(void) #endif /* let STDOUT function as STDERR, just in case writing to STDOUT directly */ - dup2( 2, 1 ); - - if ( LSAPI_InitRequest( &g_req, LSAPI_SOCK_FILENO ) == -1 ) { + dup2( 2, 1 ); + if ( LSAPI_InitRequest( &g_req, LSAPI_SOCK_FILENO ) == -1 ) return -1; - } g_inited = 1; s_ppid = getppid(); } @@ -606,28 +1211,27 @@ int LSAPI_IsRunning(void) int LSAPI_InitRequest( LSAPI_Request * pReq, int fd ) { - if ( !pReq ) { + if ( !pReq ) return -1; - } memset( pReq, 0, sizeof( LSAPI_Request ) ); - if ( allocateIovec( pReq, 16 ) == -1 ) { + if ( allocateIovec( pReq, 16 ) == -1 ) return -1; - } pReq->m_pRespBuf = pReq->m_pRespBufPos = (char *)malloc( LSAPI_RESP_BUF_SIZE ); - if ( !pReq->m_pRespBuf ) { + if ( !pReq->m_pRespBuf ) return -1; - } pReq->m_pRespBufEnd = pReq->m_pRespBuf + LSAPI_RESP_BUF_SIZE; pReq->m_pIovecCur = pReq->m_pIovecToWrite = pReq->m_pIovec + 1; pReq->m_respPktHeaderEnd = &pReq->m_respPktHeader[5]; - if ( allocateRespHeaderBuf( pReq, LSAPI_INIT_RESP_HEADER_LEN ) == -1 ) { + if ( allocateRespHeaderBuf( pReq, LSAPI_INIT_RESP_HEADER_LEN ) == -1 ) return -1; - } - if ( isPipe( fd ) ) { + if ( isPipe( fd ) ) + { pReq->m_fdListen = -1; pReq->m_fd = fd; - } else { + } + else + { pReq->m_fdListen = fd; pReq->m_fd = -1; lsapi_set_nblock( fd, 1 ); @@ -653,38 +1257,48 @@ int LSAPI_Accept_r( LSAPI_Request * pReq ) socklen_t len; int nodelay = 1; - if ( !pReq ) { + if ( !pReq ) return -1; - } - if ( LSAPI_Finish_r( pReq ) == -1 ) { + if ( LSAPI_Finish_r( pReq ) == -1 ) return -1; - } - while( g_running ) { - if ( pReq->m_fd == -1 ) { - if ( pReq->m_fdListen != -1) { + lsapi_set_nblock( pReq->m_fdListen , 0 ); + while( g_running ) + { + if ( pReq->m_fd == -1 ) + { + if ( pReq->m_fdListen != -1) + { len = sizeof( achPeer ); pReq->m_fd = accept( pReq->m_fdListen, (struct sockaddr *)&achPeer, &len ); - if ( pReq->m_fd == -1 ) { - if (( errno == EINTR )||( errno == EAGAIN)) { + if ( pReq->m_fd == -1 ) + { + if (( errno == EINTR )||( errno == EAGAIN)) continue; - } else { + else return -1; - } - } else { + } + else + { lsapi_set_nblock( pReq->m_fd , 0 ); - if (((struct sockaddr *)&achPeer)->sa_family == AF_INET ) { + if (((struct sockaddr *)&achPeer)->sa_family == AF_INET ) + { setsockopt(pReq->m_fd, IPPROTO_TCP, TCP_NODELAY, - (char *)&nodelay, sizeof(nodelay)); + (char *)&nodelay, sizeof(nodelay)); } + //init_conn_key( pReq->m_fd ); + //OPTIMIZATION + if ( s_accept_notify ) + if ( notify_req_received( pReq->m_fd ) == -1 ) + return -1; } - } else { - return -1; } + else + return -1; } - if ( !readReq( pReq ) ) { + if ( !readReq( pReq ) ) break; - } + //abort(); lsapi_close( pReq->m_fd ); pReq->m_fd = -1; LSAPI_Reset_r( pReq ); @@ -698,15 +1312,18 @@ static struct lsapi_packet_header finish = {'L', 'S', int LSAPI_Finish_r( LSAPI_Request * pReq ) { /* finish req body */ - if ( !pReq ) { + if ( !pReq ) return -1; - } - if (pReq->m_reqState) { - if ( pReq->m_fd != -1 ) { - if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) { + if (pReq->m_reqState) + { + if ( pReq->m_fd != -1 ) + { + if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) + { LSAPI_FinalizeRespHeaders_r( pReq ); } - if ( pReq->m_pRespBufPos != pReq->m_pRespBuf ) { + if ( pReq->m_pRespBufPos != pReq->m_pRespBuf ) + { Flush_RespBuf_r( pReq ); } @@ -735,18 +1352,14 @@ void LSAPI_Reset_r( LSAPI_Request * pReq ) int LSAPI_Release_r( LSAPI_Request * pReq ) { - if ( pReq->m_pReqBuf ) { + if ( pReq->m_pReqBuf ) free( pReq->m_pReqBuf ); - } - if ( pReq->m_pSpecialEnvList ) { + if ( pReq->m_pSpecialEnvList ) free( pReq->m_pSpecialEnvList ); - } - if ( pReq->m_pEnvList ) { + if ( pReq->m_pEnvList ) free( pReq->m_pEnvList ); - } - if ( pReq->m_pRespHeaderBuf ) { + if ( pReq->m_pRespHeaderBuf ) free( pReq->m_pRespHeaderBuf ); - } return 0; } @@ -754,55 +1367,48 @@ int LSAPI_Release_r( LSAPI_Request * pReq ) char * LSAPI_GetHeader_r( LSAPI_Request * pReq, int headerIndex ) { int off; - if ( !pReq || ((unsigned int)headerIndex > H_TRANSFER_ENCODING) ) { + if ( !pReq || ((unsigned int)headerIndex > H_TRANSFER_ENCODING) ) return NULL; - } off = pReq->m_pHeaderIndex->m_headerOff[ headerIndex ]; - if ( !off ) { + if ( !off ) return NULL; - } - if ( *(pReq->m_pHttpHeader + off + - pReq->m_pHeaderIndex->m_headerLen[ headerIndex ]) ) { - *( pReq->m_pHttpHeader + off + - pReq->m_pHeaderIndex->m_headerLen[ headerIndex ]) = 0; - } + if ( *(pReq->m_pHttpHeader + off + + pReq->m_pHeaderIndex->m_headerLen[ headerIndex ]) ) + *( pReq->m_pHttpHeader + off + + pReq->m_pHeaderIndex->m_headerLen[ headerIndex ]) = 0; return pReq->m_pHttpHeader + off; } static int readBodyToReqBuf( LSAPI_Request * pReq ) { - int bodyLeft; - int len = pReq->m_bufRead - pReq->m_bufProcessed; - if ( len > 0 ) { + off_t bodyLeft; + ssize_t len = pReq->m_bufRead - pReq->m_bufProcessed; + if ( len > 0 ) return len; - } pReq->m_bufRead = pReq->m_bufProcessed = pReq->m_pHeader->m_pktHeader.m_packetLen.m_iLen; - bodyLeft = pReq->m_pHeader->m_reqBodyLen - pReq->m_reqBodyRead; + bodyLeft = pReq->m_reqBodyLen - pReq->m_reqBodyRead; len = pReq->m_reqBufSize - pReq->m_bufRead; - if ( len < 0 ) { + if ( len < 0 ) return -1; - } - if ( len > bodyLeft ) { + if ( len > bodyLeft ) len = bodyLeft; - } + len = lsapi_read( pReq->m_fd, pReq->m_pReqBuf + pReq->m_bufRead, len ); - if ( len > 0 ) { + if ( len > 0 ) pReq->m_bufRead += len; - } return len; } int LSAPI_ReqBodyGetChar_r( LSAPI_Request * pReq ) { - if (!pReq || (pReq->m_fd ==-1) ) { + if (!pReq || (pReq->m_fd ==-1) ) return EOF; - } - if ( pReq->m_bufProcessed >= pReq->m_bufRead ) { - if ( readBodyToReqBuf( pReq ) <= 0 ) { + if ( pReq->m_bufProcessed >= pReq->m_bufRead ) + { + if ( readBodyToReqBuf( pReq ) <= 0 ) return EOF; - } } ++pReq->m_reqBodyRead; return (unsigned char)*(pReq->m_pReqBuf + pReq->m_bufProcessed++); @@ -810,42 +1416,43 @@ int LSAPI_ReqBodyGetChar_r( LSAPI_Request * pReq ) -int LSAPI_ReqBodyGetLine_r( LSAPI_Request * pReq, char * pBuf, int bufLen, int *getLF ) +int LSAPI_ReqBodyGetLine_r( LSAPI_Request * pReq, char * pBuf, size_t bufLen, int *getLF ) { - int len; - int left; + ssize_t len; + ssize_t left; char * pBufEnd = pBuf + bufLen - 1; char * pBufCur = pBuf; char * pCur; char * p; - if (!pReq || (pReq->m_fd ==-1) ||( !pBuf )||(bufLen < 0 )|| !getLF ) { + if (!pReq || (pReq->m_fd ==-1) ||( !pBuf )||(bufLen < 0 )|| !getLF ) return -1; - } *getLF = 0; - while( (left = pBufEnd - pBufCur ) > 0 ) { + while( (left = pBufEnd - pBufCur ) > 0 ) + { len = pReq->m_bufRead - pReq->m_bufProcessed; - if ( len <= 0 ) { - if ( (len = readBodyToReqBuf( pReq )) <= 0 ) { + if ( len <= 0 ) + { + if ( (len = readBodyToReqBuf( pReq )) <= 0 ) + { *getLF = 1; break; } } - if ( len > left ) { + if ( len > left ) len = left; - } pCur = pReq->m_pReqBuf + pReq->m_bufProcessed; p = memchr( pCur, '\n', len ); - if ( p ) { + if ( p ) len = p - pCur + 1; - } memmove( pBufCur, pCur, len ); pBufCur += len; pReq->m_bufProcessed += len; pReq->m_reqBodyRead += len; - if ( p ) { + if ( p ) + { *getLF = 1; break; } @@ -856,48 +1463,47 @@ int LSAPI_ReqBodyGetLine_r( LSAPI_Request * pReq, char * pBuf, int bufLen, int * } -int LSAPI_ReadReqBody_r( LSAPI_Request * pReq, char * pBuf, int bufLen ) +ssize_t LSAPI_ReadReqBody_r( LSAPI_Request * pReq, char * pBuf, size_t bufLen ) { - int len; - int total; + ssize_t len; + off_t total; /* char *pOldBuf = pBuf; */ - if (!pReq || (pReq->m_fd ==-1) || ( !pBuf )||(bufLen < 0 )) { + if (!pReq || (pReq->m_fd ==-1) || ( !pBuf )||(bufLen < 0 )) return -1; - } - total = pReq->m_pHeader->m_reqBodyLen - pReq->m_reqBodyRead; + + total = pReq->m_reqBodyLen - pReq->m_reqBodyRead; - if ( total <= 0 ) { + if ( total <= 0 ) return 0; - } - if ( total < bufLen ) { + if ( total < bufLen ) bufLen = total; - } total = 0; len = pReq->m_bufRead - pReq->m_bufProcessed; - if ( len > 0 ) { - if ( len > bufLen ) { + if ( len > 0 ) + { + if ( len > bufLen ) len = bufLen; - } memmove( pBuf, pReq->m_pReqBuf + pReq->m_bufProcessed, len ); pReq->m_bufProcessed += len; total += len; pBuf += len; bufLen -= len; } - while( bufLen > 0 ) { + while( bufLen > 0 ) + { len = lsapi_read( pReq->m_fd, pBuf, bufLen ); - if ( len > 0 ) { + if ( len > 0 ) + { total += len; pBuf += len; bufLen -= len; - } else { - if ( len <= 0 ) { - if ( !total) { - return -1; - } - break; - } + } + else if ( len <= 0 ) + { + if ( !total) + return -1; + break; } } pReq->m_reqBodyRead += total; @@ -906,37 +1512,52 @@ int LSAPI_ReadReqBody_r( LSAPI_Request * pReq, char * pBuf, int bufLen ) } -int LSAPI_Write_r( LSAPI_Request * pReq, const char * pBuf, int len ) +ssize_t LSAPI_Write_r( LSAPI_Request * pReq, const char * pBuf, size_t len ) { struct lsapi_packet_header * pHeader; const char * pEnd; const char * p; - int bufLen; - int toWrite; - int packetLen; + ssize_t bufLen; + ssize_t toWrite; + ssize_t packetLen; + int skip = 0; - if ( !pReq || !pBuf || (pReq->m_fd == -1) ) { + if ( !pReq || !pBuf || (pReq->m_fd == -1) ) return -1; + if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) + { + LSAPI_FinalizeRespHeaders_r( pReq ); +/* + if ( *pBuf == '\r' ) + { + ++skip; + } + if ( *pBuf == '\n' ) + { + ++skip; + } +*/ } - if ( len < pReq->m_pRespBufEnd - pReq->m_pRespBufPos ) { - memmove( pReq->m_pRespBufPos, pBuf, len ); - pReq->m_pRespBufPos += len; + pReq->m_reqState |= LSAPI_ST_RESP_BODY; + + if ( (len - skip) < pReq->m_pRespBufEnd - pReq->m_pRespBufPos ) + { + memmove( pReq->m_pRespBufPos, pBuf + skip, len - skip ); + pReq->m_pRespBufPos += len - skip; return len; } - if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) { - LSAPI_FinalizeRespHeaders_r( pReq ); - } - pReq->m_reqState |= LSAPI_ST_RESP_BODY; pHeader = pReq->m_respPktHeader; - p = pBuf; + p = pBuf + skip; pEnd = pBuf + len; bufLen = pReq->m_pRespBufPos - pReq->m_pRespBuf; - while( ( toWrite = pEnd - p ) > 0 ) { + while( ( toWrite = pEnd - p ) > 0 ) + { packetLen = toWrite + bufLen; - if ( LSAPI_MAX_DATA_PACKET_LEN < packetLen) { + if ( LSAPI_MAX_DATA_PACKET_LEN < packetLen) + { packetLen = LSAPI_MAX_DATA_PACKET_LEN; toWrite = packetLen - bufLen; } @@ -949,7 +1570,8 @@ int LSAPI_Write_r( LSAPI_Request * pReq, const char * pBuf, int len ) pReq->m_pIovecCur->iov_len = LSAPI_PACKET_HEADER_LEN; ++pReq->m_pIovecCur; ++pHeader; - if ( bufLen > 0 ) { + if ( bufLen > 0 ) + { pReq->m_pIovecCur->iov_base = (void *)pReq->m_pRespBuf; pReq->m_pIovecCur->iov_len = bufLen; pReq->m_pRespBufPos = pReq->m_pRespBuf; @@ -962,21 +1584,108 @@ int LSAPI_Write_r( LSAPI_Request * pReq, const char * pBuf, int len ) ++pReq->m_pIovecCur; p += toWrite; - if ( pHeader >= pReq->m_respPktHeaderEnd - 1) { - if ( LSAPI_Flush_r( pReq ) == -1 ) { + if ( pHeader >= pReq->m_respPktHeaderEnd - 1) + { + if ( LSAPI_Flush_r( pReq ) == -1 ) return -1; - } pHeader = pReq->m_respPktHeader; } } - if ( pHeader != pReq->m_respPktHeader ) { - if ( LSAPI_Flush_r( pReq ) == -1 ) { + if ( pHeader != pReq->m_respPktHeader ) + if ( LSAPI_Flush_r( pReq ) == -1 ) return -1; - } - } return p - pBuf; } +#if defined(__FreeBSD__ ) || defined(__NetBSD__) || defined(__OpenBSD__) +ssize_t gsendfile( int fdOut, int fdIn, off_t* off, size_t size ) +{ + ssize_t ret; + off_t written; + ret = sendfile( fdIn, fdOut, *off, size, NULL, &written, 0 ); + if ( written > 0 ) + { + ret = written; + *off += ret; + } + return ret; +} +#endif + +#if defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) +ssize_t gsendfile( int fdOut, int fdIn, off_t* off, size_t size ) +{ + ssize_t ret; + off_t len = size; + ret = sendfile( fdIn, fdOut, *off, &len, NULL, 0 ); + if (( ret == 0 )&&( len > 0 )) + { + ret = len; + *off += len; + } + return ret; +} +#endif + +#if defined(sun) || defined(__sun) +#include +ssize_t gsendfile( int fdOut, int fdIn, off_t *off, size_t size ) +{ + int n = 0 ; + sendfilevec_t vec[1]; + + vec[n].sfv_fd = fdIn; + vec[n].sfv_flag = 0; + vec[n].sfv_off = *off; + vec[n].sfv_len = size; + ++n; + + size_t written; + ssize_t ret = sendfilev( fdOut, vec, n, &written ); + if (( !ret )||( errno == EAGAIN )) + ret = written; + if ( ret > 0 ) + *off += ret; + return ret; +} +#endif + +#if defined(linux) || defined(__linux) || defined(__linux__) || \ + defined(__gnu_linux__) +#include +#define gsendfile sendfile +#endif +#if defined(HPUX) +ssize_t gsendfile( int fdOut, int fdIn, off_t * off, size_t size ) +{ + return sendfile( fdOut, fdIn, off, size, NULL, 0 ); +} +#endif + +ssize_t LSAPI_sendfile_r( LSAPI_Request * pReq, int fdIn, off_t* off, size_t size ) +{ + struct lsapi_packet_header * pHeader = pReq->m_respPktHeader; + if ( !pReq || (pReq->m_fd == -1) || fdIn == -1 ) + return -1; + if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) + { + LSAPI_FinalizeRespHeaders_r( pReq ); + } + pReq->m_reqState |= LSAPI_ST_RESP_BODY; + + LSAPI_Flush_r(pReq); + + lsapi_buildPacketHeader( pHeader, LSAPI_RESP_STREAM, + size + LSAPI_PACKET_HEADER_LEN ); + + + if (write(pReq->m_fd, (const char *) pHeader, LSAPI_PACKET_HEADER_LEN ) != LSAPI_PACKET_HEADER_LEN) + return -1; + + return gsendfile( pReq->m_fd, fdIn, off, size ); +} + + void Flush_RespBuf_r( LSAPI_Request * pReq ) { struct lsapi_packet_header * pHeader = pReq->m_respPktHeader; @@ -990,7 +1699,8 @@ void Flush_RespBuf_r( LSAPI_Request * pReq ) pReq->m_pIovecCur->iov_len = LSAPI_PACKET_HEADER_LEN; ++pReq->m_pIovecCur; ++pHeader; - if ( bufLen > 0 ) { + if ( bufLen > 0 ) + { pReq->m_pIovecCur->iov_base = (void *)pReq->m_pRespBuf; pReq->m_pIovecCur->iov_len = bufLen; pReq->m_pRespBufPos = pReq->m_pRespBuf; @@ -1006,32 +1716,35 @@ int LSAPI_Flush_r( LSAPI_Request * pReq ) { int ret = 0; int n; - if ( !pReq ) { + if ( !pReq ) return -1; - } n = pReq->m_pIovecCur - pReq->m_pIovecToWrite; - if (( 0 == n )&&( pReq->m_pRespBufPos == pReq->m_pRespBuf )) { + if (( 0 == n )&&( pReq->m_pRespBufPos == pReq->m_pRespBuf )) return 0; - } - if ( pReq->m_fd == -1 ) { + if ( pReq->m_fd == -1 ) + { pReq->m_pRespBufPos = pReq->m_pRespBuf; pReq->m_totalLen = 0; pReq->m_pIovecCur = pReq->m_pIovecToWrite = pReq->m_pIovec; return -1; } - if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) { + if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) + { LSAPI_FinalizeRespHeaders_r( pReq ); } - if ( pReq->m_pRespBufPos != pReq->m_pRespBuf ) { + if ( pReq->m_pRespBufPos != pReq->m_pRespBuf ) + { Flush_RespBuf_r( pReq ); } n = pReq->m_pIovecCur - pReq->m_pIovecToWrite; - if ( n > 0 ) { + if ( n > 0 ) + { ret = lsapi_writev( pReq->m_fd, &pReq->m_pIovecToWrite, n, pReq->m_totalLen ); - if ( ret < pReq->m_totalLen ) { + if ( ret < pReq->m_totalLen ) + { lsapi_close( pReq->m_fd ); pReq->m_fd = -1; ret = -1; @@ -1043,32 +1756,33 @@ int LSAPI_Flush_r( LSAPI_Request * pReq ) } -int LSAPI_Write_Stderr_r( LSAPI_Request * pReq, const char * pBuf, int len ) +ssize_t LSAPI_Write_Stderr_r( LSAPI_Request * pReq, const char * pBuf, size_t len ) { struct lsapi_packet_header header; const char * pEnd; const char * p; - int packetLen; - int totalLen; + ssize_t packetLen; + ssize_t totalLen; int ret; struct iovec iov[2]; struct iovec *pIov; - if ( !pReq ) { + if ( !pReq ) return -1; - } - if (( pReq->m_fd == -1 )||(pReq->m_fd == pReq->m_fdListen )) { + if (( pReq->m_fd == -1 )||(pReq->m_fd == pReq->m_fdListen )) return write( 2, pBuf, len ); - } - if ( pReq->m_pRespBufPos != pReq->m_pRespBuf ) { + if ( pReq->m_pRespBufPos != pReq->m_pRespBuf ) + { LSAPI_Flush_r( pReq ); } p = pBuf; pEnd = pBuf + len; - while( ( packetLen = pEnd - p ) > 0 ) { - if ( LSAPI_MAX_DATA_PACKET_LEN < packetLen) { + while( ( packetLen = pEnd - p ) > 0 ) + { + if ( LSAPI_MAX_DATA_PACKET_LEN < packetLen) + { packetLen = LSAPI_MAX_DATA_PACKET_LEN; } @@ -1085,7 +1799,8 @@ int LSAPI_Write_Stderr_r( LSAPI_Request * pReq, const char * pBuf, int len ) pIov = iov; ret = lsapi_writev( pReq->m_fd, &pIov, 2, totalLen ); - if ( ret < totalLen ) { + if ( ret < totalLen ) + { lsapi_close( pReq->m_fd ); pReq->m_fd = -1; ret = -1; @@ -1097,14 +1812,16 @@ int LSAPI_Write_Stderr_r( LSAPI_Request * pReq, const char * pBuf, int len ) static char * GetHeaderVar( LSAPI_Request * pReq, const char * name ) { int i; - for( i = 0; i < H_TRANSFER_ENCODING; ++i ) { - if ( pReq->m_pHeaderIndex->m_headerOff[i] ) { - if ( strcmp( name, CGI_HEADERS[i] ) == 0 ) { + for( i = 0; i < H_TRANSFER_ENCODING; ++i ) + { + if ( pReq->m_pHeaderIndex->m_headerOff[i] ) + { + if ( strcmp( name, CGI_HEADERS[i] ) == 0 ) return pReq->m_pHttpHeader + pReq->m_pHeaderIndex->m_headerOff[i]; - } } } - if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 ) { + if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 ) + { const char *p; char *pKey; char *pKeyEnd; @@ -1112,22 +1829,22 @@ static char * GetHeaderVar( LSAPI_Request * pReq, const char * name ) struct lsapi_header_offset * pCur, *pEnd; pCur = pReq->m_pUnknownHeader; pEnd = pCur + pReq->m_pHeader->m_cntUnknownHeaders; - while( pCur < pEnd ) { + while( pCur < pEnd ) + { pKey = pReq->m_pHttpHeader + pCur->nameOff; keyLen = pCur->nameLen; pKeyEnd = pKey + keyLen; p = &name[5]; - while(( pKey < pKeyEnd )&&( *p )) { + while(( pKey < pKeyEnd )&&( *p )) + { char ch = toupper( *pKey ); - if ((ch != *p )||(( *p == '_' )&&( ch != '-'))) { + if ((ch != *p )||(( *p == '_' )&&( ch != '-'))) break; - } ++p; ++pKey; } - if (( pKey == pKeyEnd )&& (!*p )) { + if (( pKey == pKeyEnd )&& (!*p )) return pReq->m_pHttpHeader + pCur->valueOff; - } ++pCur; } } @@ -1139,21 +1856,35 @@ char * LSAPI_GetEnv_r( LSAPI_Request * pReq, const char * name ) { struct LSAPI_key_value_pair * pBegin = pReq->m_pEnvList; struct LSAPI_key_value_pair * pEnd = pBegin + pReq->m_pHeader->m_cntEnv; - if ( !pReq || !name ) { + if ( !pReq || !name ) return NULL; - } - if ( strncmp( name, "HTTP_", 5 ) == 0 ) { + if ( strncmp( name, "HTTP_", 5 ) == 0 ) + { return GetHeaderVar( pReq, name ); } - while( pBegin < pEnd ) { - if ( strcmp( name, pBegin->pKey ) == 0 ) { + while( pBegin < pEnd ) + { + if ( strcmp( name, pBegin->pKey ) == 0 ) return pBegin->pValue; - } ++pBegin; } return NULL; } +struct _headerInfo +{ + const char * _name; + int _nameLen; + const char * _value; + int _valueLen; +}; + +int compareValueLocation(const void * v1, const void *v2 ) +{ + return ((const struct _headerInfo *)v1)->_value - + ((const struct _headerInfo *)v2)->_value; +} + int LSAPI_ForeachOrgHeader_r( LSAPI_Request * pReq, LSAPI_CB_EnvHandler fn, void * arg ) { @@ -1162,43 +1893,66 @@ int LSAPI_ForeachOrgHeader_r( LSAPI_Request * pReq, char * pValue; int ret; int count = 0; - if ( !pReq || !fn ) { + struct _headerInfo headers[512]; + if ( !pReq || !fn ) return -1; - } - for( i = 0; i < H_TRANSFER_ENCODING; ++i ) { - if ( pReq->m_pHeaderIndex->m_headerOff[i] ) { + + for( i = 0; i < H_TRANSFER_ENCODING; ++i ) + { + if ( pReq->m_pHeaderIndex->m_headerOff[i] ) + { len = pReq->m_pHeaderIndex->m_headerLen[i]; pValue = pReq->m_pHttpHeader + pReq->m_pHeaderIndex->m_headerOff[i]; *(pValue + len ) = 0; - ret = (*fn)( HTTP_HEADERS[i], HTTP_HEADER_LEN[i], - pValue, len, arg ); + headers[count]._name = HTTP_HEADERS[i]; + headers[count]._nameLen = HTTP_HEADER_LEN[i]; + headers[count]._value = pValue; + headers[count]._valueLen = len; ++count; - if ( ret <= 0 ) { - return ret; - } + + //ret = (*fn)( HTTP_HEADERS[i], HTTP_HEADER_LEN[i], + // pValue, len, arg ); + //if ( ret <= 0 ) + // return ret; } } - if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 ) { + if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 ) + { char *pKey; int keyLen; struct lsapi_header_offset * pCur, *pEnd; pCur = pReq->m_pUnknownHeader; pEnd = pCur + pReq->m_pHeader->m_cntUnknownHeaders; - while( pCur < pEnd ) { + while( pCur < pEnd ) + { pKey = pReq->m_pHttpHeader + pCur->nameOff; keyLen = pCur->nameLen; pValue = pReq->m_pHttpHeader + pCur->valueOff; *(pValue + pCur->valueLen ) = 0; - ret = (*fn)( pKey, keyLen, - pValue, pCur->valueLen, arg ); - if ( ret <= 0 ) { - return ret; - } + headers[count]._name = pKey; + headers[count]._nameLen = keyLen; + headers[count]._value = pValue; + headers[count]._valueLen = pCur->valueLen; + ++count; + if ( count == 512 ) + break; + //ret = (*fn)( pKey, keyLen, + // pValue, pCur->valueLen, arg ); + //if ( ret <= 0 ) + // return ret; ++pCur; } } - return count + pReq->m_pHeader->m_cntUnknownHeaders; + qsort( headers, count, sizeof( struct _headerInfo ), compareValueLocation ); + for( i = 0; i < count; ++i ) + { + ret = (*fn)( headers[i]._name, headers[i]._nameLen, + headers[i]._value, headers[i]._valueLen, arg ); + if ( ret <= 0 ) + return ret; + } + return count; } @@ -1211,23 +1965,24 @@ int LSAPI_ForeachHeader_r( LSAPI_Request * pReq, char * pValue; int ret; int count = 0; - if ( !pReq || !fn ) { + if ( !pReq || !fn ) return -1; - } - for( i = 0; i < H_TRANSFER_ENCODING; ++i ) { - if ( pReq->m_pHeaderIndex->m_headerOff[i] ) { + for( i = 0; i < H_TRANSFER_ENCODING; ++i ) + { + if ( pReq->m_pHeaderIndex->m_headerOff[i] ) + { len = pReq->m_pHeaderIndex->m_headerLen[i]; pValue = pReq->m_pHttpHeader + pReq->m_pHeaderIndex->m_headerOff[i]; *(pValue + len ) = 0; ret = (*fn)( CGI_HEADERS[i], CGI_HEADER_LEN[i], pValue, len, arg ); ++count; - if ( ret <= 0 ) { + if ( ret <= 0 ) return ret; - } } } - if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 ) { + if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 ) + { char achHeaderName[256]; char *p; char *pKey; @@ -1236,23 +1991,23 @@ int LSAPI_ForeachHeader_r( LSAPI_Request * pReq, struct lsapi_header_offset * pCur, *pEnd; pCur = pReq->m_pUnknownHeader; pEnd = pCur + pReq->m_pHeader->m_cntUnknownHeaders; - while( pCur < pEnd ) { + while( pCur < pEnd ) + { pKey = pReq->m_pHttpHeader + pCur->nameOff; keyLen = pCur->nameLen; + if ( keyLen > 250 ) + keyLen = 250; pKeyEnd = pKey + keyLen; memcpy( achHeaderName, "HTTP_", 5 ); p = &achHeaderName[5]; - if ( keyLen > 250 ) { - keyLen = 250; - } - while( pKey < pKeyEnd ) { + while( pKey < pKeyEnd ) + { char ch = *pKey++; - if ( ch == '-' ) { + if ( ch == '-' ) *p++ = '_'; - } else { + else *p++ = toupper( ch ); - } } *p = 0; keyLen += 5; @@ -1261,9 +2016,8 @@ int LSAPI_ForeachHeader_r( LSAPI_Request * pReq, *(pValue + pCur->valueLen ) = 0; ret = (*fn)( achHeaderName, keyLen, pValue, pCur->valueLen, arg ); - if ( ret <= 0 ) { + if ( ret <= 0 ) return ret; - } ++pCur; } } @@ -1276,15 +2030,14 @@ static int EnvForeach( struct LSAPI_key_value_pair * pEnv, { struct LSAPI_key_value_pair * pEnd = pEnv + n; int ret; - if ( !pEnv || !fn ) { + if ( !pEnv || !fn ) return -1; - } - while( pEnv < pEnd ) { + while( pEnv < pEnd ) + { ret = (*fn)( pEnv->pKey, pEnv->keyLen, pEnv->pValue, pEnv->valLen, arg ); - if ( ret <= 0 ) { + if ( ret <= 0 ) return ret; - } ++pEnv; } return n; @@ -1295,10 +2048,10 @@ static int EnvForeach( struct LSAPI_key_value_pair * pEnv, int LSAPI_ForeachEnv_r( LSAPI_Request * pReq, LSAPI_CB_EnvHandler fn, void * arg ) { - if ( !pReq || !fn ) { + if ( !pReq || !fn ) return -1; - } - if ( pReq->m_pHeader->m_cntEnv > 0 ) { + if ( pReq->m_pHeader->m_cntEnv > 0 ) + { return EnvForeach( pReq->m_pEnvList, pReq->m_pHeader->m_cntEnv, fn, arg ); } @@ -1310,10 +2063,10 @@ int LSAPI_ForeachEnv_r( LSAPI_Request * pReq, int LSAPI_ForeachSpecialEnv_r( LSAPI_Request * pReq, LSAPI_CB_EnvHandler fn, void * arg ) { - if ( !pReq || !fn ) { + if ( !pReq || !fn ) return -1; - } - if ( pReq->m_pHeader->m_cntSpecialEnv > 0 ) { + if ( pReq->m_pHeader->m_cntSpecialEnv > 0 ) + { return EnvForeach( pReq->m_pSpecialEnvList, pReq->m_pHeader->m_cntSpecialEnv, fn, arg ); @@ -1326,14 +2079,13 @@ int LSAPI_ForeachSpecialEnv_r( LSAPI_Request * pReq, int LSAPI_FinalizeRespHeaders_r( LSAPI_Request * pReq ) { - if ( !pReq || !pReq->m_pIovec ) { + if ( !pReq || !pReq->m_pIovec ) return -1; - } - if ( !( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) ) { + if ( !( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) ) return 0; - } pReq->m_reqState &= ~LSAPI_ST_RESP_HEADER; - if ( pReq->m_pRespHeaderBufPos > pReq->m_pRespHeaderBuf ) { + if ( pReq->m_pRespHeaderBufPos > pReq->m_pRespHeaderBuf ) + { pReq->m_pIovecCur->iov_base = (void *)pReq->m_pRespHeaderBuf; pReq->m_pIovecCur->iov_len = pReq->m_pRespHeaderBufPos - pReq->m_pRespHeaderBuf; pReq->m_totalLen += pReq->m_pIovecCur->iov_len; @@ -1352,25 +2104,87 @@ int LSAPI_FinalizeRespHeaders_r( LSAPI_Request * pReq ) } - - -int LSAPI_AppendRespHeader_r( LSAPI_Request * pReq, char * pBuf, int len ) +int LSAPI_AppendRespHeader2_r( LSAPI_Request * pReq, const char * pHeaderName, + const char * pHeaderValue ) { - if ( !pReq || !pBuf || len <= 0 || len > LSAPI_RESP_HTTP_HEADER_MAX ) { + int nameLen, valLen, len; + if ( !pReq || !pHeaderName || !pHeaderValue ) + return -1; + if ( pReq->m_reqState & LSAPI_ST_RESP_BODY ) + return -1; + if ( pReq->m_respHeader.m_respInfo.m_cntHeaders >= LSAPI_MAX_RESP_HEADERS ) + return -1; + nameLen = strlen( pHeaderName ); + valLen = strlen( pHeaderValue ); + if ( nameLen == 0 ) return -1; + while( nameLen > 0 ) + { + char ch = *(pHeaderName + nameLen - 1 ); + if (( ch == '\n' )||( ch == '\r' )) + --nameLen; + else + break; + } + if ( nameLen <= 0 ) + return 0; + while( valLen > 0 ) + { + char ch = *(pHeaderValue + valLen - 1 ); + if (( ch == '\n' )||( ch == '\r' )) + --valLen; + else + break; } - if ( pReq->m_reqState & LSAPI_ST_RESP_BODY ) { + len = nameLen + valLen + 1; + if ( len > LSAPI_RESP_HTTP_HEADER_MAX ) return -1; + + if ( pReq->m_pRespHeaderBufPos + len + 1 > pReq->m_pRespHeaderBufEnd ) + { + int newlen = pReq->m_pRespHeaderBufPos + len + 4096 - pReq->m_pRespHeaderBuf; + newlen -= newlen % 4096; + if ( allocateRespHeaderBuf( pReq, newlen ) == -1 ) + return -1; } - if ( pReq->m_respHeader.m_respInfo.m_cntHeaders >= LSAPI_MAX_RESP_HEADERS ) { + memmove( pReq->m_pRespHeaderBufPos, pHeaderName, nameLen ); + pReq->m_pRespHeaderBufPos += nameLen; + *pReq->m_pRespHeaderBufPos++ = ':'; + memmove( pReq->m_pRespHeaderBufPos, pHeaderValue, valLen ); + pReq->m_pRespHeaderBufPos += valLen; + *pReq->m_pRespHeaderBufPos++ = 0; + ++len; /* add one byte padding for \0 */ + pReq->m_respHeaderLen[pReq->m_respHeader.m_respInfo.m_cntHeaders] = len; + ++pReq->m_respHeader.m_respInfo.m_cntHeaders; + return 0; +} + + + +int LSAPI_AppendRespHeader_r( LSAPI_Request * pReq, const char * pBuf, int len ) +{ + if ( !pReq || !pBuf || len <= 0 || len > LSAPI_RESP_HTTP_HEADER_MAX ) + return -1; + if ( pReq->m_reqState & LSAPI_ST_RESP_BODY ) return -1; + if ( pReq->m_respHeader.m_respInfo.m_cntHeaders >= LSAPI_MAX_RESP_HEADERS ) + return -1; + while( len > 0 ) + { + char ch = *(pBuf + len - 1 ); + if (( ch == '\n' )||( ch == '\r' )) + --len; + else + break; } - if ( pReq->m_pRespHeaderBufPos + len + 1 > pReq->m_pRespHeaderBufEnd ) { + if ( len <= 0 ) + return 0; + if ( pReq->m_pRespHeaderBufPos + len + 1 > pReq->m_pRespHeaderBufEnd ) + { int newlen = pReq->m_pRespHeaderBufPos + len + 4096 - pReq->m_pRespHeaderBuf; newlen -= newlen % 4096; - if ( allocateRespHeaderBuf( pReq, newlen ) == -1 ) { + if ( allocateRespHeaderBuf( pReq, newlen ) == -1 ) return -1; - } } memmove( pReq->m_pRespHeaderBufPos, pBuf, len ); pReq->m_pRespHeaderBufPos += len; @@ -1389,7 +2203,8 @@ int LSAPI_CreateListenSock2( const struct sockaddr * pServerAddr, int backlog ) int flag = 1; int addr_len; - switch( pServerAddr->sa_family ) { + switch( pServerAddr->sa_family ) + { case AF_INET: addr_len = 16; break; @@ -1405,20 +2220,20 @@ int LSAPI_CreateListenSock2( const struct sockaddr * pServerAddr, int backlog ) } fd = socket( pServerAddr->sa_family, SOCK_STREAM, 0 ); - if ( fd == -1 ) { + if ( fd == -1 ) return -1; - } fcntl( fd, F_SETFD, FD_CLOEXEC ); if(setsockopt( fd, SOL_SOCKET, SO_REUSEADDR, - (char *)( &flag ), sizeof(flag)) == 0) { + (char *)( &flag ), sizeof(flag)) == 0) + { ret = bind( fd, pServerAddr, addr_len ); - if ( !ret ) { + if ( !ret ) + { ret = listen( fd, backlog ); - if ( !ret ) { + if ( !ret ) return fd; - } } } @@ -1438,17 +2253,16 @@ int LSAPI_ParseSockAddr( const char * pBind, struct sockaddr * pAddr ) int doAddrInfo = 0; int port; - if ( !pBind ) { + if ( !pBind ) return -1; - } - while( isspace( *pBind ) ) { + while( isspace( *pBind ) ) ++pBind; - } strncpy( achAddr, pBind, 256 ); - switch( *p ) { + switch( *p ) + { case '/': pAddr->sa_family = AF_UNIX; strncpy( ((struct sockaddr_un *)pAddr)->sun_path, p, @@ -1463,7 +2277,8 @@ int LSAPI_ParseSockAddr( const char * pBind, struct sockaddr * pAddr ) return -1; *pEnd++ = 0; - if ( *p == '*' ) { + if ( *p == '*' ) + { strcpy( achAddr, "::" ); p = achAddr; } @@ -1473,35 +2288,35 @@ int LSAPI_ParseSockAddr( const char * pBind, struct sockaddr * pAddr ) default: pAddr->sa_family = AF_INET; pEnd = strchr( p, ':' ); - if ( !pEnd ) { + if ( !pEnd ) return -1; - } *pEnd++ = 0; doAddrInfo = 0; - if ( *p == '*' ) { + if ( *p == '*' ) + { ((struct sockaddr_in *)pAddr)->sin_addr.s_addr = htonl(INADDR_ANY); - } else { - if (!strcasecmp( p, "localhost" ) ) { - ((struct sockaddr_in *)pAddr)->sin_addr.s_addr = htonl( INADDR_LOOPBACK ); - } else { - ((struct sockaddr_in *)pAddr)->sin_addr.s_addr = inet_addr( p ); - if ( ((struct sockaddr_in *)pAddr)->sin_addr.s_addr == INADDR_BROADCAST) { - doAddrInfo = 1; - } + } + else if (!strcasecmp( p, "localhost" ) ) + ((struct sockaddr_in *)pAddr)->sin_addr.s_addr = htonl( INADDR_LOOPBACK ); + else + { + ((struct sockaddr_in *)pAddr)->sin_addr.s_addr = inet_addr( p ); + if ( ((struct sockaddr_in *)pAddr)->sin_addr.s_addr == INADDR_BROADCAST) + { + doAddrInfo = 1; } } break; } - if ( *pEnd == ':' ) { + if ( *pEnd == ':' ) ++pEnd; - } port = atoi( pEnd ); - if (( port <= 0 )||( port > 65535 )) { + if (( port <= 0 )||( port > 65535 )) return -1; - } - if ( doAddrInfo ) { + if ( doAddrInfo ) + { memset(&hints, 0, sizeof(hints)); @@ -1509,7 +2324,8 @@ int LSAPI_ParseSockAddr( const char * pBind, struct sockaddr * pAddr ) hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; - if ( getaddrinfo(p, NULL, &hints, &res) ) { + if ( getaddrinfo(p, NULL, &hints, &res) ) + { return -1; } @@ -1517,11 +2333,10 @@ int LSAPI_ParseSockAddr( const char * pBind, struct sockaddr * pAddr ) freeaddrinfo(res); } - if ( pAddr->sa_family == AF_INET ) { + if ( pAddr->sa_family == AF_INET ) ((struct sockaddr_in *)pAddr)->sin_port = htons( port ); - } else { + else ((struct sockaddr_in6 *)pAddr)->sin6_port = htons( port ); - } return 0; } @@ -1532,7 +2347,8 @@ int LSAPI_CreateListenSock( const char * pBind, int backlog ) int ret; int fd = -1; ret = LSAPI_ParseSockAddr( pBind, (struct sockaddr *)serverAddr ); - if ( !ret ) { + if ( !ret ) + { fd = LSAPI_CreateListenSock2( (struct sockaddr *)serverAddr, backlog ); } return fd; @@ -1543,9 +2359,11 @@ static fn_select_t g_fnSelect = select; typedef struct _lsapi_child_status { int m_pid; + long m_tmStart; volatile short m_iKillSent; volatile short m_inProcess; + volatile int m_iReqCounter; volatile long m_tmWaitBegin; volatile long m_tmReqBegin; @@ -1575,43 +2393,42 @@ static lsapi_prefork_server * g_prefork_server = NULL; int LSAPI_Init_Prefork_Server( int max_children, fn_select_t fp, int avoidFork ) { - if ( g_prefork_server ) { + int pid; + if ( g_prefork_server ) return 0; - } - if ( max_children <= 1 ) { + if ( max_children <= 1 ) return -1; - } - if ( max_children >= 10000) { + if ( max_children >= 10000) max_children = 10000; - } g_prefork_server = (lsapi_prefork_server *)malloc( sizeof( lsapi_prefork_server ) ); - if ( !g_prefork_server ) { + if ( !g_prefork_server ) return -1; - } memset( g_prefork_server, 0, sizeof( lsapi_prefork_server ) ); - if ( fp != NULL ) { + if ( fp != NULL ) g_fnSelect = fp; - } s_ppid = getppid(); + pid = getpid(); + setpgid( pid, pid ); g_prefork_server->m_iAvoidFork = avoidFork; g_prefork_server->m_iMaxChildren = max_children; g_prefork_server->m_iExtraChildren = ( avoidFork ) ? 0 : (max_children / 3) ; g_prefork_server->m_iMaxIdleChildren = ( avoidFork ) ? (max_children + 1) : (max_children / 3); + if ( g_prefork_server->m_iMaxIdleChildren == 0 ) + g_prefork_server->m_iMaxIdleChildren = 1; g_prefork_server->m_iChildrenMaxIdleTime = 300; - g_prefork_server->m_iMaxReqProcessTime = 300; + g_prefork_server->m_iMaxReqProcessTime = 3600; return 0; } void LSAPI_Set_Server_fd( int fd ) { - if( g_prefork_server ) { + if( g_prefork_server ) g_prefork_server->m_fd = fd; - } } @@ -1624,11 +2441,17 @@ static int lsapi_accept( int fdListen ) len = sizeof( achPeer ); fd = accept( fdListen, (struct sockaddr *)&achPeer, &len ); - if ( fd != -1 ) { - if (((struct sockaddr *)&achPeer)->sa_family == AF_INET ) { + if ( fd != -1 ) + { + if (((struct sockaddr *)&achPeer)->sa_family == AF_INET ) + { setsockopt( fd, IPPROTO_TCP, TCP_NODELAY, (char *)&nodelay, sizeof(nodelay)); } + + //OPTIMIZATION + //if ( s_accept_notify ) + // notify_req_received( fd ); } return fd; @@ -1652,10 +2475,10 @@ static lsapi_child_status * find_child_status( int pid ) { lsapi_child_status * pStatus = g_prefork_server->m_pChildrenStatus; lsapi_child_status * pEnd = g_prefork_server->m_pChildrenStatus + g_prefork_server->m_iMaxChildren * 2; - while( pStatus < pEnd ) { - if ( pStatus->m_pid == pid ) { + while( pStatus < pEnd ) + { + if ( pStatus->m_pid == pid ) return pStatus; - } ++pStatus; } return NULL; @@ -1667,16 +2490,30 @@ static void lsapi_sigchild( int signal ) { int status, pid; lsapi_child_status * child_status; - while( 1 ) { + while( 1 ) + { pid = waitpid( -1, &status, WNOHANG|WUNTRACED ); - if ( pid <= 0 ) { + if ( pid <= 0 ) + { break; } + if ( WIFSIGNALED( status )) + { + int sig_num = WTERMSIG( status ); + int dump = WCOREDUMP( status ); + fprintf( stderr, "Child process with pid: %d was killed by signal: %d, core dump: %d\n", pid, sig_num, dump ); + } + if ( pid == s_pid_dump_debug_info ) + { + pid = 0; + continue; + } child_status = find_child_status( pid ); - if ( child_status ) { + if ( child_status ) + { child_status->m_pid = 0; + --g_prefork_server->m_iCurChildren; } - --g_prefork_server->m_iCurChildren; } } @@ -1690,76 +2527,108 @@ static int lsapi_init_children_status() size = (size + 4095 ) / 4096 * 4096; pBuf =( char*) mmap( NULL, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0 ); - if ( pBuf == MAP_FAILED ) { + if ( pBuf == MAP_FAILED ) + { perror( "Anonymous mmap() failed" ); return -1; } memset( pBuf, 0, size ); - g_prefork_server->m_pChildrenStatus = (lsapi_child_status *)pBuf; + g_prefork_server->m_pChildrenStatus = (lsapi_child_status *)pBuf; return 0; } +static void dump_debug_info( lsapi_child_status * pStatus, long tmCur ) +{ + char achCmd[1024]; + if ( s_pid_dump_debug_info ) + { + if ( kill( s_pid_dump_debug_info, 0 ) == 0 ) + return; + } + s_pid_dump_debug_info = fork(); + + fprintf( stderr, "[%s] Possible runaway process, PPID: %d, PID: %d, reqCount: %d, process time: %ld, checkpoint time: %ld, start time: %ld\n", + ctime(&tmCur), getpid(), pStatus->m_pid, pStatus->m_iReqCounter, + tmCur - pStatus->m_tmReqBegin, tmCur - pStatus->m_tmLastCheckPoint, tmCur - pStatus->m_tmStart ); + snprintf( achCmd, 1024, "gdb --batch -ex \"attach %d\" -ex \"set height 0\" -ex \"bt\" >&2;PATH=$PATH:/usr/sbin lsof -p %d >&2", pStatus->m_pid, pStatus->m_pid ); + if ( system( achCmd ) == -1 ) + perror( "system()" ); + exit( 0 ); +} + static void lsapi_check_child_status( long tmCur ) { int idle = 0; int tobekilled; int dying = 0; + int count = 0; lsapi_child_status * pStatus = g_prefork_server->m_pChildrenStatus; lsapi_child_status * pEnd = g_prefork_server->m_pChildrenStatus + g_prefork_server->m_iMaxChildren * 2; - while( pStatus < pEnd ) { - tobekilled = pStatus->m_iKillSent; - if ( pStatus->m_pid != 0 ) { - if ( !tobekilled ) { - if ( !pStatus->m_inProcess ) { - - if (( g_prefork_server->m_iCurChildren - dying > g_prefork_server->m_iMaxChildren)|| - ( idle >= g_prefork_server->m_iMaxIdleChildren )) { - - tobekilled = 1; - } else { - if (( s_max_idle_secs> 0)&&(tmCur - pStatus->m_tmWaitBegin > s_max_idle_secs + 5 )) { - tobekilled = 1; - } - } - if ( !tobekilled ) { - ++idle; - } - } else { - if ( tmCur - pStatus->m_tmReqBegin > - g_prefork_server->m_iMaxReqProcessTime ) { - tobekilled = 1; - } + while( pStatus < pEnd ) + { + tobekilled = 0; + if ( pStatus->m_pid != 0 ) + { + ++count; + if ( !pStatus->m_inProcess ) + { + + if (( g_prefork_server->m_iCurChildren - dying > g_prefork_server->m_iMaxChildren)|| + ( idle > g_prefork_server->m_iMaxIdleChildren )) + { + tobekilled = SIGUSR1; } - } else { - if ( pStatus->m_inProcess ) { - tobekilled = pStatus->m_iKillSent = 0; + else + { + if (( s_max_idle_secs> 0)&&(tmCur - pStatus->m_tmWaitBegin > s_max_idle_secs + 5 )) + { + tobekilled = SIGUSR1; + } } + if ( !tobekilled ) + ++idle; } - if ( tobekilled ) { - tobekilled = 0; - if ( pStatus->m_iKillSent > 5 ) { - tobekilled = SIGKILL; - } else { - if ( pStatus->m_iKillSent == 3 ) { + else + { + if ( tmCur - pStatus->m_tmReqBegin > + g_prefork_server->m_iMaxReqProcessTime ) + { + if (( ( pStatus->m_iKillSent % 5 ) == 0 )&&( s_dump_debug_info )) + dump_debug_info( pStatus, tmCur ); + if ( pStatus->m_iKillSent > 5 ) + { + tobekilled = SIGKILL; + fprintf( stderr, "Force killing runaway process PID: %d with SIGKILL\n", pStatus->m_pid ); + } + else + { tobekilled = SIGTERM; - } else { - if ( pStatus->m_iKillSent == 1 ) { - tobekilled = SIGUSR1; - } + fprintf( stderr, "Killing runaway process PID: %d with SIGTERM\n", pStatus->m_pid ); } } - if ( tobekilled ) { - kill( pStatus->m_pid, tobekilled ); + } + if ( tobekilled ) + { + if (( kill( pStatus->m_pid, tobekilled ) == -1 )&&( errno == ESRCH )) + { + pStatus->m_pid = 0; + --count; + } + else + { + ++pStatus->m_iKillSent; + ++dying; } - ++pStatus->m_iKillSent; - ++dying; } - - } else { - ++dying; } ++pStatus; } + if ( abs( g_prefork_server->m_iCurChildren - count ) > 1 ) + { + fprintf( stderr, "Children tracking is wrong: PID: %d, Cur Childen: %d, count: %d, idle: %d, dying: %d\n", getpid(), + g_prefork_server->m_iCurChildren, count, idle, dying ); + + } } static int lsapi_all_children_must_die() @@ -1770,14 +2639,14 @@ static int lsapi_all_children_must_die() g_prefork_server->m_iMaxIdleChildren = -1; maxWait = 15; - while( g_prefork_server->m_iCurChildren && (sec < maxWait) ) { + while( g_prefork_server->m_iCurChildren && (sec < maxWait) ) + { lsapi_check_child_status(time(NULL)); sleep( 1 ); sec++; } - if ( g_prefork_server->m_iCurChildren != 0 ) { + if ( g_prefork_server->m_iCurChildren != 0 ) kill( -getpgrp(), SIGKILL ); - } return 0; } @@ -1796,13 +2665,17 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer, LSAPI_Re fd_set readfds; struct timeval timeout; + sigset_t mask; + sigset_t orig_mask; + lsapi_init_children_status(); setsid(); act.sa_flags = 0; act.sa_handler = lsapi_sigchild; - if( sigaction( SIGCHLD, &act, &old_child ) ) { + if( sigaction( SIGCHLD, &act, &old_child ) ) + { perror( "Can't set signal handler for SIGCHILD" ); return -1; } @@ -1813,36 +2686,36 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer, LSAPI_Re if( sigaction( SIGTERM, &act, &old_term ) || sigaction( SIGINT, &act, &old_int ) || sigaction( SIGUSR1, &act, &old_usr1 ) || - sigaction( SIGQUIT, &act, &old_quit )) { + sigaction( SIGQUIT, &act, &old_quit )) + { perror( "Can't set signals" ); return -1; } s_stop = 0; - while( !s_stop ) { - if ( ret ) { - curTime = time( NULL ); - } else { - ++curTime; - } - if (curTime != lastTime ) { + while( !s_stop ) + { + curTime = time( NULL ); + if (curTime != lastTime ) + { lastTime = curTime; - if (s_ppid && (getppid() != s_ppid )) { + if (s_ppid && (getppid() != s_ppid )) break; - } lsapi_check_child_status(curTime ); - if (pServer->m_iServerMaxIdle) { - if ( pServer->m_iCurChildren <= 0 ) { + if (pServer->m_iServerMaxIdle) + { + if ( pServer->m_iCurChildren <= 0 ) + { ++wait_secs; - if ( wait_secs > pServer->m_iServerMaxIdle ) { + if ( wait_secs > pServer->m_iServerMaxIdle ) return -1; - } - } else { - wait_secs = 0; } + else + wait_secs = 0; } } - if ( pServer->m_iCurChildren >= (pServer->m_iMaxChildren + pServer->m_iExtraChildren ) ) { + if ( pServer->m_iCurChildren >= (pServer->m_iMaxChildren + pServer->m_iExtraChildren ) ) + { usleep( 100000 ); continue; } @@ -1850,66 +2723,100 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer, LSAPI_Re FD_ZERO( &readfds ); FD_SET( pServer->m_fd, &readfds ); timeout.tv_sec = 1; timeout.tv_usec = 0; - if ((ret = (*g_fnSelect)(pServer->m_fd+1, &readfds, NULL, NULL, &timeout)) == 1 ) { - if ( pServer->m_iCurChildren >= 0 ) { + if ((ret = (*g_fnSelect)(pServer->m_fd+1, &readfds, NULL, NULL, &timeout)) == 1 ) + { + /* + if ( pServer->m_iCurChildren >= 0 ) + { usleep( 10 ); FD_ZERO( &readfds ); FD_SET( pServer->m_fd, &readfds ); timeout.tv_sec = 0; timeout.tv_usec = 0; - if ( (*g_fnSelect)(pServer->m_fd+1, &readfds, NULL, NULL, &timeout) == 0 ) { - continue; - } - } - } else { - if ( ret == -1 ) { - if ( errno == EINTR ) { + if ( (*g_fnSelect)(pServer->m_fd+1, &readfds, NULL, NULL, &timeout) == 0 ) continue; - } - /* perror( "select()" ); */ - break; - } else { + }*/ + } + else if ( ret == -1 ) + { + if ( errno == EINTR ) continue; - } + /* perror( "select()" ); */ + break; + } + else + { + continue; } pReq->m_fd = lsapi_accept( pServer->m_fd ); - if ( pReq->m_fd != -1 ) { + if ( pReq->m_fd != -1 ) + { child_status = find_child_status( 0 ); + if ( child_status ) + memset( child_status, 0, sizeof( *child_status ) ); + + sigemptyset( &mask ); + sigaddset( &mask, SIGCHLD ); + + if ( sigprocmask(SIG_BLOCK, &mask, &orig_mask) < 0 ) + { + perror( "sigprocmask(SIG_BLOCK) to block SIGCHLD" ); + } + pid = fork(); - if ( !pid ) { + + if ( !pid ) + { + if (sigprocmask(SIG_SETMASK, &orig_mask, NULL) < 0) + perror( "sigprocmask( SIG_SETMASK ) to restore SIGMASK in child" ); g_prefork_server = NULL; s_ppid = getppid(); s_req_processed = 0; s_pChildStatus = child_status; - child_status->m_iKillSent = 0; lsapi_set_nblock( pReq->m_fd, 0 ); - + if ( pReq->m_fdListen != -1 ) + { + close( pReq->m_fdListen ); + pReq->m_fdListen = -1; + } /* don't catch our signals */ sigaction( SIGCHLD, &old_child, 0 ); sigaction( SIGTERM, &old_term, 0 ); sigaction( SIGQUIT, &old_quit, 0 ); sigaction( SIGINT, &old_int, 0 ); sigaction( SIGUSR1, &old_usr1, 0 ); + //init_conn_key( pReq->m_fd ); + lsapi_notify_pid( pReq->m_fd ); + s_notified_pid = 1; + //if ( s_accept_notify ) + // return notify_req_received( pReq->m_fd ); return 0; - } else { - if ( pid == -1 ) { - perror( "fork() failed, please increase process limit" ); - } else { - ++pServer->m_iCurChildren; - if ( child_status ) { - child_status->m_pid = pid; - child_status->m_iKillSent = 0; - child_status->m_tmWaitBegin = time(NULL); - } + } + else if ( pid == -1 ) + { + perror( "fork() failed, please increase process limit" ); + } + else + { + ++pServer->m_iCurChildren; + if ( child_status ) + { + child_status->m_pid = pid; + child_status->m_tmWaitBegin = curTime; + child_status->m_tmStart = curTime; } } close( pReq->m_fd ); pReq->m_fd = -1; - } else { - if (( errno == EINTR )||( errno == EAGAIN)) { + if (sigprocmask(SIG_SETMASK, &orig_mask, NULL) < 0) + perror( "sigprocmask( SIG_SETMASK ) to restore SIGMASK" ); + + } + else + { + if (( errno == EINTR )||( errno == EAGAIN)) continue; - } perror( "accept() failed" ); return -1; } @@ -1921,6 +2828,11 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer, LSAPI_Re } +void lsapi_error( const char * pMessage, int err_no ) +{ + fprintf( stderr, "%d: %s, errno: %d (%s)\n", getpid(), pMessage, err_no, strerror( err_no ) ); +} + int LSAPI_Prefork_Accept_r( LSAPI_Request * pReq ) { int fd; @@ -1932,88 +2844,105 @@ int LSAPI_Prefork_Accept_r( LSAPI_Request * pReq ) LSAPI_Finish_r( pReq ); - if ( g_prefork_server ) { - if ( g_prefork_server->m_fd != -1 ) { - if ( lsapi_prefork_server_accept( g_prefork_server, pReq ) == -1 ) { + if ( g_prefork_server ) + { + if ( g_prefork_server->m_fd != -1 ) + if ( lsapi_prefork_server_accept( g_prefork_server, pReq ) == -1 ) return -1; - } - } } - if ( s_req_processed >= s_max_reqs ) { + if ( s_req_processed >= s_max_reqs ) return -1; - } - if ( s_pChildStatus ) { + if ( s_pChildStatus ) + { s_pChildStatus->m_tmWaitBegin = time( NULL ); } + - while( g_running ) { - if ( pReq->m_fd != -1 ) { + while( g_running ) + { + if ( pReq->m_fd != -1 ) + { fd = pReq->m_fd; - } else { - if ( pReq->m_fdListen != -1 ) { - fd = pReq->m_fdListen; - } else { - return -1; - } + } + else if ( pReq->m_fdListen != -1 ) + fd = pReq->m_fdListen; + else + { + break; } wait_secs = 0; - while( 1 ) { - if ( !g_running ) { + while( 1 ) + { + if ( !g_running ) return -1; - } - if (( s_pChildStatus )&&( s_pChildStatus->m_iKillSent )) { + if (( s_pChildStatus )&&( s_pChildStatus->m_iKillSent )) return -1; - } FD_ZERO( &readfds ); FD_SET( fd, &readfds ); timeout.tv_sec = 1; timeout.tv_usec = 0; ret = (*g_fnSelect)(fd+1, &readfds, NULL, NULL, &timeout); - if ( ret == 0 ) { - if ( s_pChildStatus ) { + if ( ret == 0 ) + { + if ( s_pChildStatus ) + { s_pChildStatus->m_inProcess = 0; } ++wait_secs; - if (( s_max_idle_secs > 0 )&&(wait_secs >= s_max_idle_secs )) { + if (( s_max_idle_secs > 0 )&&(wait_secs >= s_max_idle_secs )) return -1; - } - if ( s_ppid &&( getppid() != s_ppid)) { + if ( s_ppid &&( getppid() != s_ppid)) return -1; - } - } else { - if ( ret == -1 ) { - if ( errno == EINTR ) { - continue; - } else { - return -1; - } - } else { - if ( ret >= 1 ) { - if (( s_pChildStatus )&&( s_pChildStatus->m_iKillSent )) { - return -1; + } + else if ( ret == -1 ) + { + if ( errno == EINTR ) + continue; + else + return -1; + } + else if ( ret >= 1 ) + { + if (( s_pChildStatus )&&( s_pChildStatus->m_iKillSent )) + return -1; + if ( fd == pReq->m_fdListen ) + { + pReq->m_fd = lsapi_accept( pReq->m_fdListen ); + if ( pReq->m_fd != -1 ) + { + fd = pReq->m_fd; + lsapi_set_nblock( fd, 0 ); + //init_conn_key( pReq->m_fd ); + if ( !s_keepListener ) + { + close( pReq->m_fdListen ); + pReq->m_fdListen = -1; } - if ( fd == pReq->m_fdListen ) { - pReq->m_fd = lsapi_accept( pReq->m_fdListen ); - if ( pReq->m_fd != -1 ) { - fd = pReq->m_fd; - lsapi_set_nblock( fd, 0 ); - } else { - if (( errno == EINTR )||( errno == EAGAIN)) { - continue; - } + if ( s_accept_notify ) + if ( notify_req_received( pReq->m_fd ) == -1 ) return -1; - } - } else { - break; - } + } + else + { + if (( errno == EINTR )||( errno == EAGAIN)) + continue; + lsapi_error( "lsapi_accept() error", errno ); + return -1; } } + else + break; } } - if ( !readReq( pReq ) ) { - if ( s_pChildStatus ) { + + if ( !readReq( pReq ) ) + { + if ( s_pChildStatus ) + { + s_pChildStatus->m_iKillSent = 0; s_pChildStatus->m_inProcess = 1; + ++s_pChildStatus->m_iReqCounter; s_pChildStatus->m_tmReqBegin = s_pChildStatus->m_tmLastCheckPoint = time(NULL); } ++s_req_processed; @@ -2028,49 +2957,50 @@ int LSAPI_Prefork_Accept_r( LSAPI_Request * pReq ) } void LSAPI_Set_Max_Reqs( int reqs ) -{ - s_max_reqs = reqs; -} +{ s_max_reqs = reqs; } void LSAPI_Set_Max_Idle( int secs ) -{ - s_max_idle_secs = secs; -} +{ s_max_idle_secs = secs; } void LSAPI_Set_Max_Children( int maxChildren ) { - if ( g_prefork_server ) { + if ( g_prefork_server ) g_prefork_server->m_iMaxChildren = maxChildren; - } } void LSAPI_Set_Extra_Children( int extraChildren ) { - if (( g_prefork_server )&&( extraChildren >= 0 )) { + if (( g_prefork_server )&&( extraChildren >= 0 )) g_prefork_server->m_iExtraChildren = extraChildren; - } } void LSAPI_Set_Max_Process_Time( int secs ) { - if (( g_prefork_server )&&( secs > 0 )) { + if (( g_prefork_server )&&( secs > 0 )) g_prefork_server->m_iMaxReqProcessTime = secs; - } } void LSAPI_Set_Max_Idle_Children( int maxIdleChld ) { - if (( g_prefork_server )&&( maxIdleChld > 0 )) { + if (( g_prefork_server )&&( maxIdleChld > 0 )) g_prefork_server->m_iMaxIdleChildren = maxIdleChld; - } } void LSAPI_Set_Server_Max_Idle_Secs( int serverMaxIdle ) { - if ( g_prefork_server ) { + if ( g_prefork_server ) g_prefork_server->m_iServerMaxIdle = serverMaxIdle; - } +} + +void LSAPI_Set_Slow_Req_Msecs( int msecs ) +{ + s_slow_req_msecs = msecs; +} + +int LSAPI_Get_Slow_Req_Msecs() +{ + return s_slow_req_msecs; } @@ -2092,101 +3022,419 @@ static void unset_lsapi_envs() #else env = environ; #endif - while( env != NULL && *env != NULL ) { - if ( !strncmp(*env, "LSAPI_", 6) || - !strncmp( *env, "PHP_LSAPI_", 10 ) ) { + while( env != NULL && *env != NULL ) + { + if (!strncmp(*env, "LSAPI_", 6) || !strncmp( *env, "PHP_LSAPI_", 10 ) + || (!strncmp( *env, "PHPRC=", 6 )&&(!s_uid))) + { char ** del = env; - do { + do *del = del[1]; - } while( *del++ ); - } else { - ++env; + while( *del++ ); } + else + ++env; } } -void LSAPI_Init_Env_Parameters( fn_select_t fp ) +static int lsapi_initSuEXEC() +{ + int i; + struct passwd * pw; + s_defaultUid = 0; + s_defaultGid = 0; + if ( s_uid == 0 ) + { + const char * p = getenv( "LSAPI_DEFAULT_UID" ); + if ( p ) + { + i = atoi( p ); + if ( i > 0 ) + s_defaultUid = i; + } + p = getenv( "LSAPI_DEFAULT_GID" ); + if ( p ) + { + i = atoi( p ); + if ( i > 0 ) + s_defaultGid = i; + } + p = getenv( "LSAPI_SECRET" ); + if (( !p )||( readSecret(p) == -1 )) + return -1; + if ( g_prefork_server ) + { + if ( g_prefork_server->m_iMaxChildren < 100 ) + g_prefork_server->m_iMaxChildren = 100; + } + } + if ( !s_defaultUid || !s_defaultGid ) + { + pw = getpwnam( "nobody" ); + if ( !s_defaultUid ) + s_defaultUid = pw->pw_uid; + if ( !s_defaultGid ) + s_defaultGid = pw->pw_gid; + } + return 0; +} + + +int LSAPI_Init_Env_Parameters( fn_select_t fp ) { const char *p; int n; int avoidFork = 0; p = getenv( "PHP_LSAPI_MAX_REQUESTS" ); - if ( !p ) { + if ( !p ) p = getenv( "LSAPI_MAX_REQS" ); - } - if ( p ) { + if ( p ) + { n = atoi( p ); - if ( n > 0 ) { + if ( n > 0 ) LSAPI_Set_Max_Reqs( n ); - } } p = getenv( "LSAPI_AVOID_FORK" ); - if ( p ) { + if ( p ) + { avoidFork = atoi( p ); } + p = getenv( "LSAPI_ACCEPT_NOTIFY" ); + if ( p ) + { + s_accept_notify = atoi( p ); + } + + p = getenv( "LSAPI_SLOW_REQ_MSECS" ); + if ( p ) + { + n = atoi( p ); + LSAPI_Set_Slow_Req_Msecs( n ); + } + #if defined( RLIMIT_CORE ) p = getenv( "LSAPI_ALLOW_CORE_DUMP" ); - if ( !p ) { + if ( !p ) + { struct rlimit limit = { 0, 0 }; setrlimit( RLIMIT_CORE, &limit ); } -#endif + else + s_enable_core_dump = 1; + +#endif p = getenv( "LSAPI_MAX_IDLE" ); - if ( p ) { + if ( p ) + { n = atoi( p ); LSAPI_Set_Max_Idle( n ); } - if ( LSAPI_Is_Listen() ) { + p = getenv( "LSAPI_KEEP_LISTEN" ); + if ( p ) + { + n = atoi( p ); + s_keepListener = n; + } + + + if ( LSAPI_Is_Listen() ) + { n = 0; p = getenv( "PHP_LSAPI_CHILDREN" ); - if ( !p ) { + if ( !p ) p = getenv( "LSAPI_CHILDREN" ); - } - if ( p ) { + if ( p ) n = atoi( p ); - } - if ( n > 1 ) { + if ( n > 1 ) + { LSAPI_Init_Prefork_Server( n, fp, avoidFork ); LSAPI_Set_Server_fd( g_req.m_fdListen ); } p = getenv( "LSAPI_EXTRA_CHILDREN" ); - if ( p ) { + if ( p ) LSAPI_Set_Extra_Children( atoi( p ) ); - } p = getenv( "LSAPI_MAX_IDLE_CHILDREN" ); - if ( p ) { + if ( p ) LSAPI_Set_Max_Idle_Children( atoi( p ) ); - } + p = getenv( "LSAPI_PGRP_MAX_IDLE" ); - if ( p ) { + if ( p ) + { LSAPI_Set_Server_Max_Idle_Secs( atoi( p ) ); } p = getenv( "LSAPI_MAX_PROCESS_TIME" ); - if ( p ) { + if ( p ) LSAPI_Set_Max_Process_Time( atoi( p ) ); - } - if ( getenv( "LSAPI_PPID_NO_CHECK" ) ) { + + if ( getenv( "LSAPI_PPID_NO_CHECK" ) ) + { LSAPI_No_Check_ppid(); } + + p = getenv( "LSAPI_DUMP_DEBUG_INFO" ); + if ( p ) + s_dump_debug_info = atoi( p ); + + if ( lsapi_initSuEXEC() == -1 ) + return -1; +#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) + lsapi_initLVE(); +#endif } unset_lsapi_envs(); + return 0; +} + + +int LSAPI_ErrResponse_r( LSAPI_Request * pReq, int code, const char ** pRespHeaders, + const char * pBody, int bodyLen ) +{ + LSAPI_SetRespStatus_r( pReq, code ); + if ( pRespHeaders ) + { + while( *pRespHeaders ) + { + LSAPI_AppendRespHeader_r( pReq, *pRespHeaders, strlen( *pRespHeaders ) ); + ++pRespHeaders; + } + } + if ( pBody &&( bodyLen > 0 )) + { + LSAPI_Write_r( pReq, pBody, bodyLen ); + } + LSAPI_Finish_r( pReq ); + return 0; +} + + +static void lsapi_MD5Transform(uint32 buf[4], uint32 const in[16]); + +/* + * Note: this code is harmless on little-endian machines. + */ +static void byteReverse(unsigned char *buf, unsigned longs) +{ + uint32 t; + do { + t = (uint32) ((unsigned) buf[3] << 8 | buf[2]) << 16 | + ((unsigned) buf[1] << 8 | buf[0]); + *(uint32 *) buf = t; + buf += 4; + } while (--longs); +} + +/* + * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious + * initialization constants. + */ +void lsapi_MD5Init(struct lsapi_MD5Context *ctx) +{ + ctx->buf[0] = 0x67452301; + ctx->buf[1] = 0xefcdab89; + ctx->buf[2] = 0x98badcfe; + ctx->buf[3] = 0x10325476; + + ctx->bits[0] = 0; + ctx->bits[1] = 0; } +/* + * Update context to reflect the concatenation of another buffer full + * of bytes. + */ +void lsapi_MD5Update(struct lsapi_MD5Context *ctx, unsigned char const *buf, unsigned len) +{ + register uint32 t; + + /* Update bitcount */ + + t = ctx->bits[0]; + if ((ctx->bits[0] = t + ((uint32) len << 3)) < t) + ctx->bits[1]++; /* Carry from low to high */ + ctx->bits[1] += len >> 29; + + t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ + + /* Handle any leading odd-sized chunks */ + + if (t) { + unsigned char *p = (unsigned char *) ctx->in + t; + + t = 64 - t; + if (len < t) { + memmove(p, buf, len); + return; + } + memmove(p, buf, t); + byteReverse(ctx->in, 16); + lsapi_MD5Transform(ctx->buf, (uint32 *) ctx->in); + buf += t; + len -= t; + } + /* Process data in 64-byte chunks */ + + while (len >= 64) { + memmove(ctx->in, buf, 64); + byteReverse(ctx->in, 16); + lsapi_MD5Transform(ctx->buf, (uint32 *) ctx->in); + buf += 64; + len -= 64; + } + + /* Handle any remaining bytes of data. */ + + memmove(ctx->in, buf, len); +} /* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - * vim600: sw=4 ts=4 fdm=marker - * vim<600: sw=4 ts=4 + * Final wrapup - pad to 64-byte boundary with the bit pattern + * 1 0* (64-bit count of bits processed, MSB-first) */ +void lsapi_MD5Final(unsigned char digest[16], struct lsapi_MD5Context *ctx) +{ + unsigned int count; + unsigned char *p; + /* Compute number of bytes mod 64 */ + count = (ctx->bits[0] >> 3) & 0x3F; + + /* Set the first char of padding to 0x80. This is safe since there is + always at least one byte free */ + p = ctx->in + count; + *p++ = 0x80; + + /* Bytes of padding needed to make 64 bytes */ + count = 64 - 1 - count; + + /* Pad out to 56 mod 64 */ + if (count < 8) { + /* Two lots of padding: Pad the first block to 64 bytes */ + memset(p, 0, count); + byteReverse(ctx->in, 16); + lsapi_MD5Transform(ctx->buf, (uint32 *) ctx->in); + + /* Now fill the next block with 56 bytes */ + memset(ctx->in, 0, 56); + } else { + /* Pad block to 56 bytes */ + memset(p, 0, count - 8); + } + byteReverse(ctx->in, 14); + + /* Append length in bits and transform */ + ((uint32 *) ctx->in)[14] = ctx->bits[0]; + ((uint32 *) ctx->in)[15] = ctx->bits[1]; + + lsapi_MD5Transform(ctx->buf, (uint32 *) ctx->in); + byteReverse((unsigned char *) ctx->buf, 4); + memmove(digest, ctx->buf, 16); + memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */ +} + +/* The four core functions - F1 is optimized somewhat */ + +/* #define F1(x, y, z) (x & y | ~x & z) */ +#define F1(x, y, z) (z ^ (x & (y ^ z))) +#define F2(x, y, z) F1(z, x, y) +#define F3(x, y, z) (x ^ y ^ z) +#define F4(x, y, z) (y ^ (x | ~z)) + +/* This is the central step in the MD5 algorithm. */ +#define MD5STEP(f, w, x, y, z, data, s) \ + ( w += f(x, y, z) + data, w = w<>(32-s), w += x ) + +/* + * The core of the MD5 algorithm, this alters an existing MD5 hash to + * reflect the addition of 16 longwords of new data. MD5Update blocks + * the data and converts bytes into longwords for this routine. + */ +static void lsapi_MD5Transform(uint32 buf[4], uint32 const in[16]) +{ + register uint32 a, b, c, d; + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); + MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); + MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); + MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); + MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); + MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); + MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); + MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); + MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); + MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); + MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); + MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); + MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); + MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); + MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); + MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); + + MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); + MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); + MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); + MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); + MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); + MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); + MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); + MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); + MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); + MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); + MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); + MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); + MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); + MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); + MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); + MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); + + MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); + MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); + MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); + MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); + MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); + MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); + MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); + MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); + MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); + MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); + MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); + MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); + MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); + MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); + MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); + MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); + + MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); + MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); + MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); + MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); + MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); + MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); + MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); + MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); + MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); + MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); + MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); + MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); + MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); + MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); + MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); + MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; +} diff --git a/sapi/litespeed/lsapilib.h b/sapi/litespeed/lsapilib.h index 538a170b44cd8..b0638fd436a09 100644 --- a/sapi/litespeed/lsapilib.h +++ b/sapi/litespeed/lsapilib.h @@ -1,24 +1,5 @@ - -/* - +----------------------------------------------------------------------+ - | 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 at 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: George Wang | - +----------------------------------------------------------------------+ -*/ - /* -Copyright (c) 2007, Lite Speed Technologies Inc. +Copyright (c) 2013, Lite Speed Technologies Inc. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -49,6 +30,13 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/*************************************************************************** + lsapilib.h - description + ------------------- + begin : Mon Feb 21 2005 + copyright : (C) 2005 by George Wang + email : gwang@litespeedtech.com + ***************************************************************************/ #ifndef _LSAPILIB_H_ @@ -118,7 +106,8 @@ typedef struct lsapi_request char * m_pRequestMethod; int m_totalLen; int m_reqState; - int m_reqBodyRead; + off_t m_reqBodyLen; + off_t m_reqBodyRead; int m_bufProcessed; int m_bufRead; @@ -126,6 +115,7 @@ typedef struct lsapi_request struct lsapi_resp_header m_respHeader; short m_respHeaderLen[LSAPI_MAX_RESP_HEADERS]; + void * m_pAppData; }LSAPI_Request; @@ -170,22 +160,30 @@ int LSAPI_ForeachSpecialEnv_r( LSAPI_Request * pReq, char * LSAPI_GetEnv_r( LSAPI_Request * pReq, const char * name ); -int LSAPI_ReadReqBody_r( LSAPI_Request * pReq, char * pBuf, int len ); +ssize_t LSAPI_ReadReqBody_r( LSAPI_Request * pReq, char * pBuf, size_t len ); int LSAPI_ReqBodyGetChar_r( LSAPI_Request * pReq ); -int LSAPI_ReqBodyGetLine_r( LSAPI_Request * pReq, char * pBuf, int bufLen, int *getLF ); +int LSAPI_ReqBodyGetLine_r( LSAPI_Request * pReq, char * pBuf, size_t bufLen, int *getLF ); int LSAPI_FinalizeRespHeaders_r( LSAPI_Request * pReq ); -int LSAPI_Write_r( LSAPI_Request * pReq, const char * pBuf, int len ); +ssize_t LSAPI_Write_r( LSAPI_Request * pReq, const char * pBuf, size_t len ); -int LSAPI_Write_Stderr_r( LSAPI_Request * pReq, const char * pBuf, int len ); +ssize_t LSAPI_sendfile_r( LSAPI_Request * pReq, int fdIn, off_t* off, size_t size ); + +ssize_t LSAPI_Write_Stderr_r( LSAPI_Request * pReq, const char * pBuf, size_t len ); int LSAPI_Flush_r( LSAPI_Request * pReq ); -int LSAPI_AppendRespHeader_r( LSAPI_Request * pHeader, char * pBuf, int len ); +int LSAPI_AppendRespHeader_r( LSAPI_Request * pReq, const char * pBuf, int len ); + +int LSAPI_AppendRespHeader2_r( LSAPI_Request * pReq, const char * pHeaderName, + const char * pHeaderValue ); + +int LSAPI_ErrResponse_r( LSAPI_Request * pReq, int code, const char ** pRespHeaders, + const char * pBody, int bodyLen ); static inline int LSAPI_SetRespStatus_r( LSAPI_Request * pReq, int code ) { @@ -195,6 +193,21 @@ static inline int LSAPI_SetRespStatus_r( LSAPI_Request * pReq, int code ) return 0; } +static inline int LSAPI_SetAppData_r( LSAPI_Request * pReq, void * data ) +{ + if ( !pReq ) + return -1; + pReq->m_pAppData = data; + return 0; +} + +static inline void * LSAPI_GetAppData_r( LSAPI_Request * pReq ) +{ + if ( !pReq ) + return NULL; + return pReq->m_pAppData; +} + static inline char * LSAPI_GetQueryString_r( LSAPI_Request * pReq ) { if ( pReq ) @@ -228,21 +241,22 @@ static inline char * LSAPI_GetRequestMethod_r( LSAPI_Request * pReq) -static inline int LSAPI_GetReqBodyLen_r( LSAPI_Request * pReq ) +static inline off_t LSAPI_GetReqBodyLen_r( LSAPI_Request * pReq ) { if ( pReq ) - return pReq->m_pHeader->m_reqBodyLen; + return pReq->m_reqBodyLen; return -1; } -static inline int LSAPI_GetReqBodyRemain_r( LSAPI_Request * pReq ) +static inline off_t LSAPI_GetReqBodyRemain_r( LSAPI_Request * pReq ) { if ( pReq ) - return pReq->m_pHeader->m_reqBodyLen - pReq->m_reqBodyRead; + return pReq->m_reqBodyLen - pReq->m_reqBodyRead; return -1; } + int LSAPI_Is_Listen(void); static inline int LSAPI_Accept( void ) @@ -282,13 +296,13 @@ static inline char * LSAPI_GetScriptName() static inline char * LSAPI_GetRequestMethod() { return LSAPI_GetRequestMethod_r( &g_req ); } -static inline int LSAPI_GetReqBodyLen() +static inline off_t LSAPI_GetReqBodyLen() { return LSAPI_GetReqBodyLen_r( &g_req ); } -static inline int LSAPI_GetReqBodyRemain() +static inline off_t LSAPI_GetReqBodyRemain() { return LSAPI_GetReqBodyRemain_r( &g_req ); } -static inline int LSAPI_ReadReqBody( char * pBuf, int len ) +static inline ssize_t LSAPI_ReadReqBody( char * pBuf, size_t len ) { return LSAPI_ReadReqBody_r( &g_req, pBuf, len ); } static inline int LSAPI_ReqBodyGetChar() @@ -302,10 +316,15 @@ static inline int LSAPI_ReqBodyGetLine( char * pBuf, int len, int *getLF ) static inline int LSAPI_FinalizeRespHeaders(void) { return LSAPI_FinalizeRespHeaders_r( &g_req ); } -static inline int LSAPI_Write( const char * pBuf, int len ) +static inline ssize_t LSAPI_Write( const char * pBuf, ssize_t len ) { return LSAPI_Write_r( &g_req, pBuf, len ); } -static inline int LSAPI_Write_Stderr( const char * pBuf, int len ) +static inline ssize_t LSAPI_sendfile( int fdIn, off_t* off, size_t size ) +{ + return LSAPI_sendfile_r(&g_req, fdIn, off, size ); +} + +static inline ssize_t LSAPI_Write_Stderr( const char * pBuf, ssize_t len ) { return LSAPI_Write_Stderr_r( &g_req, pBuf, len ); } static inline int LSAPI_Flush() @@ -317,6 +336,9 @@ static inline int LSAPI_AppendRespHeader( char * pBuf, int len ) static inline int LSAPI_SetRespStatus( int code ) { return LSAPI_SetRespStatus_r( &g_req, code ); } +static inline int LSAPI_ErrResponse( int code, const char ** pRespHeaders, const char * pBody, int bodyLen ) +{ return LSAPI_ErrResponse_r( &g_req, code, pRespHeaders, pBody, bodyLen ); } + int LSAPI_IsRunning(void); int LSAPI_CreateListenSock( const char * pBind, int backlog ); @@ -341,7 +363,13 @@ void LSAPI_Set_Server_Max_Idle_Secs( int serverMaxIdle ); void LSAPI_Set_Max_Process_Time( int secs ); -void LSAPI_Init_Env_Parameters( fn_select_t fp ); +int LSAPI_Init_Env_Parameters( fn_select_t fp ); + +void LSAPI_Set_Slow_Req_Msecs( int msecs ); + +int LSAPI_Get_Slow_Req_Msecs( ); + +int LSAPI_is_suEXEC_Daemon(); #if defined (c_plusplus) || defined (__cplusplus) } From 9d75b9fb27cd93c19cd168a486ab2efe2ce2aa78 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Wed, 6 Nov 2013 16:53:45 +0800 Subject: [PATCH 385/400] Revert "Fixed issue #115 (path issue when using phar)." We need another better way to fix this This reverts commit 098855433dc5d609e3970f0bc9d6766c007273f3. Conflicts: ext/opcache/ZendAccelerator.c --- NEWS | 1 - ext/opcache/ZendAccelerator.c | 44 ++++------------------------------- 2 files changed, 5 insertions(+), 40 deletions(-) diff --git a/NEWS b/NEWS index 26990debce239..3a690bbafe6e4 100644 --- a/NEWS +++ b/NEWS @@ -75,7 +75,6 @@ PHP NEWS imap). (ryotakatsuki at gmail dot com) - OPcache: - . Fixed issue #115 (path issue when using phar). (Laruence) . Added support for GNU Hurd. (Svante Signell) . Added function opcache_compile_file() to load PHP scripts into cache without execution. (Julien) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 8cee80f77693d..72b5a1b9fe7e7 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -37,7 +37,6 @@ #include "zend_API.h" #include "zend_ini.h" #include "TSRM/tsrm_virtual_cwd.h" -#include "ext/phar/php_phar.h" #include "zend_accelerator_util_funcs.h" #include "zend_accelerator_hash.h" @@ -145,21 +144,6 @@ static inline int is_cacheable_stream_path(const char *filename) memcmp(filename, "phar://", sizeof("phar://") - 1) == 0; } -static inline int is_phar_relative_alias_path(const char *filename, char **alias, int *alias_len) -{ - if (memcmp(filename, "phar://", sizeof("phar://") - 1) == 0 - && filename[sizeof("phar://") - 1] != '\0' && filename[sizeof("phar://") - 1] != '/') { - char *slash; - *alias = (char*)filename + sizeof("phar://") - 1; - slash = strstr(*alias, "/"); - if (slash) { - *alias_len = slash - *alias; - return 1; - } - } - return 0; -} - /* O+ overrides PHP chdir() function and remembers the current working directory * in ZCG(cwd) and ZCG(cwd_len). Later accel_getcwd() can use stored value and * avoid getcwd() call. @@ -1044,33 +1028,15 @@ char *accel_make_persistent_key_ex(zend_file_handle *file_handle, int path_lengt } memcpy(ZCG(key) + cur_len, include_path, include_path_len); ZCG(key)[key_length] = '\0'; - } else { - /* not use_cwd */ - key_length = path_length; + } else { + /* not use_cwd */ + key_length = path_length; if ((size_t)key_length >= sizeof(ZCG(key))) { ZCG(key_len) = 0; return NULL; - } else { - char *alias; - int alias_len; - if (is_phar_relative_alias_path(file_handle->filename, &alias, &alias_len)) { - char *phar_path; - int phar_path_len; - if (phar_resolve_alias(alias, alias_len, &phar_path, &phar_path_len TSRMLS_CC) == SUCCESS) { - int filename_len = strlen(file_handle->filename); - memcpy(ZCG(key), "phar://", sizeof("phar://") -1); - memcpy(ZCG(key) + sizeof("phar://") - 1, phar_path, phar_path_len); - memcpy(ZCG(key) + sizeof("phar://") - 1 + phar_path_len, - alias + alias_len, filename_len - alias_len - sizeof("phar://") + 2); - key_length = filename_len + (phar_path_len - alias_len); - } else { - memcpy(ZCG(key), file_handle->filename, key_length + 1); - } - } else { - memcpy(ZCG(key), file_handle->filename, key_length + 1); - } } - } + memcpy(ZCG(key), file_handle->filename, key_length + 1); + } *key_len = ZCG(key_len) = key_length; return ZCG(key); From c439ac6c3558363059a743941e85586e12a808de Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Wed, 10 Jul 2013 11:17:52 -0700 Subject: [PATCH 386/400] Cleanup temp test file --- ext/spl/tests/SplFileObject_rewind_error001.phpt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ext/spl/tests/SplFileObject_rewind_error001.phpt b/ext/spl/tests/SplFileObject_rewind_error001.phpt index bdb3301e6349b..ac536a0a44af5 100644 --- a/ext/spl/tests/SplFileObject_rewind_error001.phpt +++ b/ext/spl/tests/SplFileObject_rewind_error001.phpt @@ -13,6 +13,10 @@ $fo = new SplFileObject('testdata.csv'); $fo->rewind( "invalid" ); +?> +--CLEAN-- + --EXPECTF-- Warning: SplFileObject::rewind() expects exactly 0 parameters, 1 given in %s on line %d From 9c1e1bbc0585c43c46ef450dff42b465af1a97da Mon Sep 17 00:00:00 2001 From: ptarjan Date: Thu, 26 Sep 2013 00:18:05 -0700 Subject: [PATCH 387/400] fix many parallel test issues While running these on HHVM I've run into a lot of parallelism issues. I'm backporting all the fixes I had to do in https://github.com/facebook/hiphop-php/blob/master/hphp/tools/import_zend_test.py#L650 to php core. Most of these changes were just filenames that were shared between tests, but I did more surgery on the fixed ports. I can apreciate port 31337 as much as the next nerd, but random ports are better for tests. --- ext/ftp/tests/ftp_fget_basic1.phpt | 4 ++-- ext/ftp/tests/ftp_fget_basic2.phpt | 4 ++-- ext/ftp/tests/ftp_fget_basic3.phpt | 4 ++-- ext/ftp/tests/ftp_nb_fget_basic1.phpt | 4 ++-- ext/ftp/tests/ftp_nb_fget_basic2.phpt | 4 ++-- ext/ftp/tests/ftp_nb_fget_basic3.phpt | 4 ++-- ext/ftp/tests/ftp_nb_get_large.phpt | 4 ++-- .../tests/SplFileObject_getflags_basic.phpt | 6 +++--- .../SplFileObject_getflags_error001.phpt | 6 +++--- .../SplFileObject_getflags_error002.phpt | 6 +++--- .../tests/SplFileObject_rewind_error001.phpt | 6 +++--- .../tests/file/fgets_socket_variation1.phpt | 12 +++++++++--- .../tests/file/fgets_socket_variation2.phpt | 12 +++++++++--- .../file/file_put_contents_variation9.phpt | 8 ++++---- .../tests/file/fread_socket_variation1.phpt | 9 ++++++++- .../tests/general_functions/bug41445_1.phpt | 2 +- .../tests/network/fsockopen_basic.phpt | 10 ++++++++-- .../tests/network/fsockopen_variation1.phpt | 10 ++++++++-- ext/standard/tests/network/shutdown.phpt | 18 +++++++++++++----- .../network/socket_get_status_basic.phpt | 14 +++++++++++--- ext/standard/tests/network/tcp4loop.phpt | 13 ++++++++++--- ext/standard/tests/network/tcp6loop.phpt | 14 +++++++++++--- ext/standard/tests/network/udp6loop.phpt | 14 +++++++++++--- .../streams/stream_set_timeout_error.phpt | 12 +++++++++--- .../tests/strings/vfprintf_basic1.phpt | 2 +- .../tests/strings/vfprintf_basic2.phpt | 2 +- .../tests/strings/vfprintf_basic3.phpt | 2 +- .../tests/strings/vfprintf_basic4.phpt | 2 +- .../tests/strings/vfprintf_basic5.phpt | 2 +- .../tests/strings/vfprintf_basic6.phpt | 2 +- .../tests/strings/vfprintf_basic7.phpt | 2 +- .../tests/strings/vfprintf_basic7_64bit.phpt | 2 +- .../tests/strings/vfprintf_basic8.phpt | 2 +- .../tests/strings/vfprintf_basic9.phpt | 2 +- .../tests/strings/vfprintf_variation10.phpt | Bin 2963 -> 2979 bytes .../tests/strings/vfprintf_variation11.phpt | 2 +- .../strings/vfprintf_variation11_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation12.phpt | 2 +- .../strings/vfprintf_variation12_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation13.phpt | 2 +- .../strings/vfprintf_variation13_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation14.phpt | 2 +- .../strings/vfprintf_variation14_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation15.phpt | 2 +- .../strings/vfprintf_variation15_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation16.phpt | 2 +- .../strings/vfprintf_variation16_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation17.phpt | 2 +- .../tests/strings/vfprintf_variation18.phpt | 2 +- .../tests/strings/vfprintf_variation19.phpt | 2 +- .../strings/vfprintf_variation19_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation20.phpt | 2 +- .../tests/strings/vfprintf_variation21.phpt | 2 +- .../tests/strings/vfprintf_variation3.phpt | 2 +- .../tests/strings/vfprintf_variation4.phpt | 2 +- .../strings/vfprintf_variation4_64bit.phpt | 2 +- .../tests/strings/vfprintf_variation5.phpt | 2 +- .../tests/strings/vfprintf_variation6.phpt | 2 +- .../tests/strings/vfprintf_variation7.phpt | Bin 2391 -> 2406 bytes .../tests/strings/vfprintf_variation8.phpt | 2 +- .../tests/strings/vfprintf_variation9.phpt | Bin 1857 -> 1872 bytes ext/zlib/tests/gzeof_variation1.phpt | 2 +- ext/zlib/tests/gzfile_basic.phpt | 2 +- ext/zlib/tests/gzfile_basic2.phpt | 2 +- ext/zlib/tests/gzopen_basic2.phpt | 2 +- ext/zlib/tests/gzputs_basic.phpt | 2 +- ext/zlib/tests/gzread_variation1.phpt | 2 +- ext/zlib/tests/gzwrite_basic.phpt | 2 +- ext/zlib/tests/gzwrite_error.phpt | 2 +- ext/zlib/tests/gzwrite_error2.phpt | 2 +- ext/zlib/tests/readgzfile_basic.phpt | 2 +- ext/zlib/tests/readgzfile_basic2.phpt | 2 +- ext/zlib/tests/zlib_wrapper_fflush_basic.phpt | 2 +- .../tests/zlib_wrapper_ftruncate_basic.phpt | 2 +- 74 files changed, 185 insertions(+), 109 deletions(-) diff --git a/ext/ftp/tests/ftp_fget_basic1.phpt b/ext/ftp/tests/ftp_fget_basic1.phpt index 475f7183d2532..5909d35cef608 100644 --- a/ext/ftp/tests/ftp_fget_basic1.phpt +++ b/ext/ftp/tests/ftp_fget_basic1.phpt @@ -16,7 +16,7 @@ ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); ftp_set_option($ftp, FTP_AUTOSEEK, false); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_fget_basic1.txt"; $handle = fopen($local_file, 'w'); var_dump(ftp_fget($ftp, $handle, 'fget.txt', FTP_ASCII, FTP_AUTORESUME)); @@ -24,7 +24,7 @@ var_dump(file_get_contents($local_file)); ?> --CLEAN-- --EXPECT-- bool(true) diff --git a/ext/ftp/tests/ftp_fget_basic2.phpt b/ext/ftp/tests/ftp_fget_basic2.phpt index 00a26752d9150..622cea3683b0d 100644 --- a/ext/ftp/tests/ftp_fget_basic2.phpt +++ b/ext/ftp/tests/ftp_fget_basic2.phpt @@ -15,7 +15,7 @@ $ftp = ftp_connect('127.0.0.1', $port); ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_fget_basic2.txt"; file_put_contents($local_file, 'ASCIIFoo'); $handle = fopen($local_file, 'a'); @@ -24,7 +24,7 @@ var_dump(file_get_contents($local_file)); ?> --CLEAN-- --EXPECT-- bool(true) diff --git a/ext/ftp/tests/ftp_fget_basic3.phpt b/ext/ftp/tests/ftp_fget_basic3.phpt index b7098701ab12e..9485473b1c6a3 100644 --- a/ext/ftp/tests/ftp_fget_basic3.phpt +++ b/ext/ftp/tests/ftp_fget_basic3.phpt @@ -15,7 +15,7 @@ $ftp = ftp_connect('127.0.0.1', $port); ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_fget_basic3.txt"; file_put_contents($local_file, 'ASCIIFoo'); $handle = fopen($local_file, 'a'); @@ -24,7 +24,7 @@ var_dump(file_get_contents($local_file)); ?> --CLEAN-- --EXPECT-- bool(true) diff --git a/ext/ftp/tests/ftp_nb_fget_basic1.phpt b/ext/ftp/tests/ftp_nb_fget_basic1.phpt index cac4eec56bc99..5e6389ff1336a 100644 --- a/ext/ftp/tests/ftp_nb_fget_basic1.phpt +++ b/ext/ftp/tests/ftp_nb_fget_basic1.phpt @@ -16,7 +16,7 @@ ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); ftp_set_option($ftp, FTP_AUTOSEEK, false); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_nb_fget_basic1.txt"; $handle = fopen($local_file, 'w'); var_dump(ftp_nb_fget($ftp, $handle, 'fget.txt', FTP_ASCII, FTP_AUTORESUME)); @@ -24,7 +24,7 @@ var_dump(file_get_contents($local_file)); ?> --CLEAN-- --EXPECT-- int(2) diff --git a/ext/ftp/tests/ftp_nb_fget_basic2.phpt b/ext/ftp/tests/ftp_nb_fget_basic2.phpt index dc92f4e23bc99..215b79ac4a986 100644 --- a/ext/ftp/tests/ftp_nb_fget_basic2.phpt +++ b/ext/ftp/tests/ftp_nb_fget_basic2.phpt @@ -15,7 +15,7 @@ $ftp = ftp_connect('127.0.0.1', $port); ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_nb_fget_basic2.txt"; file_put_contents($local_file, 'ASCIIFoo'); $handle = fopen($local_file, 'a'); @@ -24,7 +24,7 @@ var_dump(file_get_contents($local_file)); ?> --CLEAN-- --EXPECT-- int(2) diff --git a/ext/ftp/tests/ftp_nb_fget_basic3.phpt b/ext/ftp/tests/ftp_nb_fget_basic3.phpt index d1a87c4f3dfe3..66daf2ba0a030 100644 --- a/ext/ftp/tests/ftp_nb_fget_basic3.phpt +++ b/ext/ftp/tests/ftp_nb_fget_basic3.phpt @@ -15,7 +15,7 @@ $ftp = ftp_connect('127.0.0.1', $port); ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_nb_fget_basic3.txt"; file_put_contents($local_file, 'ASCIIFoo'); $handle = fopen($local_file, 'a'); @@ -24,7 +24,7 @@ var_dump(file_get_contents($local_file)); ?> --CLEAN-- --EXPECT-- int(2) diff --git a/ext/ftp/tests/ftp_nb_get_large.phpt b/ext/ftp/tests/ftp_nb_get_large.phpt index 3fbf2a4831d14..0c354d7c1978f 100644 --- a/ext/ftp/tests/ftp_nb_get_large.phpt +++ b/ext/ftp/tests/ftp_nb_get_large.phpt @@ -18,7 +18,7 @@ $ftp = ftp_connect('127.0.0.1', $port); ftp_login($ftp, 'user', 'pass'); if (!$ftp) die("Couldn't connect to the server"); -$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "localfile.txt"; +$local_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . "ftp_nb_get_large.txt"; touch($local_file); ftp_nb_get($ftp, $local_file, 'fget_large.txt', FTP_BINARY, 5368709119); $fp = fopen($local_file, 'r'); @@ -29,7 +29,7 @@ fclose($fp); ?> --CLEAN-- --EXPECT-- string(1) "X" diff --git a/ext/spl/tests/SplFileObject_getflags_basic.phpt b/ext/spl/tests/SplFileObject_getflags_basic.phpt index 5addadf38046e..88cf6861a2921 100644 --- a/ext/spl/tests/SplFileObject_getflags_basic.phpt +++ b/ext/spl/tests/SplFileObject_getflags_basic.phpt @@ -7,16 +7,16 @@ Erwin Poeze --FILE-- setFlags(SplFileObject::DROP_NEW_LINE); var_dump($fo->getFlags()); ?> --CLEAN-- --EXPECT-- int(1) diff --git a/ext/spl/tests/SplFileObject_getflags_error001.phpt b/ext/spl/tests/SplFileObject_getflags_error001.phpt index 1602f88885e11..ca53c857e7e6b 100644 --- a/ext/spl/tests/SplFileObject_getflags_error001.phpt +++ b/ext/spl/tests/SplFileObject_getflags_error001.phpt @@ -7,10 +7,10 @@ Erwin Poeze --FILE-- setFlags(SplFileObject::READ_CSV); $fo->setFlags(SplFileObject::DROP_NEW_LINE); @@ -20,7 +20,7 @@ var_dump($fo->getFlags()); ?> --CLEAN-- --EXPECT-- int(1) diff --git a/ext/spl/tests/SplFileObject_getflags_error002.phpt b/ext/spl/tests/SplFileObject_getflags_error002.phpt index e2c8255f44960..00fd351db8cca 100644 --- a/ext/spl/tests/SplFileObject_getflags_error002.phpt +++ b/ext/spl/tests/SplFileObject_getflags_error002.phpt @@ -5,9 +5,9 @@ Erwin Poeze --FILE-- setFlags(SplFileObject::READ_CSV); $fo->getFlags('fake'); @@ -15,7 +15,7 @@ $fo->getFlags('fake'); ?> --CLEAN-- --EXPECTF-- Warning: SplFileObject::getFlags() expects exactly 0 parameters, 1 given in %s on line %d diff --git a/ext/spl/tests/SplFileObject_rewind_error001.phpt b/ext/spl/tests/SplFileObject_rewind_error001.phpt index ac536a0a44af5..5f2379aa13911 100644 --- a/ext/spl/tests/SplFileObject_rewind_error001.phpt +++ b/ext/spl/tests/SplFileObject_rewind_error001.phpt @@ -7,16 +7,16 @@ Erwin Poeze --FILE-- rewind( "invalid" ); ?> --CLEAN-- --EXPECTF-- Warning: SplFileObject::rewind() expects exactly 0 parameters, 1 given in %s on line %d diff --git a/ext/standard/tests/file/fgets_socket_variation1.phpt b/ext/standard/tests/file/fgets_socket_variation1.phpt index 57944d8b563c1..429ad67d69677 100644 --- a/ext/standard/tests/file/fgets_socket_variation1.phpt +++ b/ext/standard/tests/file/fgets_socket_variation1.phpt @@ -5,11 +5,17 @@ Dave Kelsey --FILE-- --FILE-- --EXPECTF-- diff --git a/ext/standard/tests/network/tcp4loop.phpt b/ext/standard/tests/network/tcp4loop.phpt index afd955918e8fb..a163cd9b35816 100644 --- a/ext/standard/tests/network/tcp4loop.phpt +++ b/ext/standard/tests/network/tcp4loop.phpt @@ -2,14 +2,21 @@ Streams Based IPv4 TCP Loopback test --FILE-- --FILE-- --FILE-- P%01CC;505bXoQ~&?~ diff --git a/ext/standard/tests/strings/vfprintf_variation11.phpt b/ext/standard/tests/strings/vfprintf_variation11.phpt index 45f1f61fa63f6..4bc38851d271e 100644 --- a/ext/standard/tests/strings/vfprintf_variation11.phpt +++ b/ext/standard/tests/strings/vfprintf_variation11.phpt @@ -45,7 +45,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation11.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation11_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation11_64bit.phpt index d6549846b5a55..a55297999ee45 100644 --- a/ext/standard/tests/strings/vfprintf_variation11_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation11_64bit.phpt @@ -45,7 +45,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation11_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation12.phpt b/ext/standard/tests/strings/vfprintf_variation12.phpt index e95fd5bb7f972..f0fa354ea639a 100644 --- a/ext/standard/tests/strings/vfprintf_variation12.phpt +++ b/ext/standard/tests/strings/vfprintf_variation12.phpt @@ -68,7 +68,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation12.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation12_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation12_64bit.phpt index a1e57bc42c7ab..fe786d3f495d2 100644 --- a/ext/standard/tests/strings/vfprintf_variation12_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation12_64bit.phpt @@ -68,7 +68,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation12_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation13.phpt b/ext/standard/tests/strings/vfprintf_variation13.phpt index 245feb5a2388a..fd3424242458b 100644 --- a/ext/standard/tests/strings/vfprintf_variation13.phpt +++ b/ext/standard/tests/strings/vfprintf_variation13.phpt @@ -45,7 +45,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation13.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation13_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation13_64bit.phpt index bf6fcb5ec0005..68baed853745e 100644 --- a/ext/standard/tests/strings/vfprintf_variation13_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation13_64bit.phpt @@ -45,7 +45,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation13_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation14.phpt b/ext/standard/tests/strings/vfprintf_variation14.phpt index c714d89758cdb..0173a27fb7071 100644 --- a/ext/standard/tests/strings/vfprintf_variation14.phpt +++ b/ext/standard/tests/strings/vfprintf_variation14.phpt @@ -68,7 +68,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation14.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation14_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation14_64bit.phpt index 930ee3d03de83..fb34befd3ccc5 100644 --- a/ext/standard/tests/strings/vfprintf_variation14_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation14_64bit.phpt @@ -68,7 +68,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation14_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation15.phpt b/ext/standard/tests/strings/vfprintf_variation15.phpt index 95667b5a81895..19e319a557d8b 100644 --- a/ext/standard/tests/strings/vfprintf_variation15.phpt +++ b/ext/standard/tests/strings/vfprintf_variation15.phpt @@ -38,7 +38,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation15.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation15_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation15_64bit.phpt index d2e331c2d3b4a..7bb0d150e01e6 100644 --- a/ext/standard/tests/strings/vfprintf_variation15_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation15_64bit.phpt @@ -38,7 +38,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation15_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation16.phpt b/ext/standard/tests/strings/vfprintf_variation16.phpt index 21630521b8dc1..4995ab02a4243 100644 --- a/ext/standard/tests/strings/vfprintf_variation16.phpt +++ b/ext/standard/tests/strings/vfprintf_variation16.phpt @@ -61,7 +61,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation16.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation16_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation16_64bit.phpt index 381e67c3397a9..16d0624018066 100644 --- a/ext/standard/tests/strings/vfprintf_variation16_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation16_64bit.phpt @@ -61,7 +61,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation16_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation17.phpt b/ext/standard/tests/strings/vfprintf_variation17.phpt index 871ae98d857e6..6c17b801f6f23 100644 --- a/ext/standard/tests/strings/vfprintf_variation17.phpt +++ b/ext/standard/tests/strings/vfprintf_variation17.phpt @@ -34,7 +34,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation17.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation18.phpt b/ext/standard/tests/strings/vfprintf_variation18.phpt index 76168621c3a51..5467753dc0a3e 100644 --- a/ext/standard/tests/strings/vfprintf_variation18.phpt +++ b/ext/standard/tests/strings/vfprintf_variation18.phpt @@ -57,7 +57,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation18.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation19.phpt b/ext/standard/tests/strings/vfprintf_variation19.phpt index 7ee01a97e16d0..26c21e1e3c0c3 100644 --- a/ext/standard/tests/strings/vfprintf_variation19.phpt +++ b/ext/standard/tests/strings/vfprintf_variation19.phpt @@ -46,7 +46,7 @@ $args_array = array( /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation19.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation19_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation19_64bit.phpt index 58810a811aa8c..a56357cfdf58d 100644 --- a/ext/standard/tests/strings/vfprintf_variation19_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation19_64bit.phpt @@ -46,7 +46,7 @@ $args_array = array( /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation19_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation20.phpt b/ext/standard/tests/strings/vfprintf_variation20.phpt index cd348d8350c35..48fea341edd31 100644 --- a/ext/standard/tests/strings/vfprintf_variation20.phpt +++ b/ext/standard/tests/strings/vfprintf_variation20.phpt @@ -84,7 +84,7 @@ $values = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation20.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation21.phpt b/ext/standard/tests/strings/vfprintf_variation21.phpt index 4dc9ed5666d4a..09bf703957ef1 100644 --- a/ext/standard/tests/strings/vfprintf_variation21.phpt +++ b/ext/standard/tests/strings/vfprintf_variation21.phpt @@ -81,7 +81,7 @@ $values = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation21.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation3.phpt b/ext/standard/tests/strings/vfprintf_variation3.phpt index 02535cefb659c..1ae945990cc82 100644 --- a/ext/standard/tests/strings/vfprintf_variation3.phpt +++ b/ext/standard/tests/strings/vfprintf_variation3.phpt @@ -45,7 +45,7 @@ $args_array = array( // and with int values from the above $args_array array /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation3.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation4.phpt b/ext/standard/tests/strings/vfprintf_variation4.phpt index 72ca9fe3b9f0a..642f35c46a704 100644 --- a/ext/standard/tests/strings/vfprintf_variation4.phpt +++ b/ext/standard/tests/strings/vfprintf_variation4.phpt @@ -62,7 +62,7 @@ $args_array = array( /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation4.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation4_64bit.phpt b/ext/standard/tests/strings/vfprintf_variation4_64bit.phpt index f7038ff76c256..6bf814003a3d6 100644 --- a/ext/standard/tests/strings/vfprintf_variation4_64bit.phpt +++ b/ext/standard/tests/strings/vfprintf_variation4_64bit.phpt @@ -62,7 +62,7 @@ $args_array = array( /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation4_64bit.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation5.phpt b/ext/standard/tests/strings/vfprintf_variation5.phpt index 4bac1ebe57a00..eb3646ca1f3af 100644 --- a/ext/standard/tests/strings/vfprintf_variation5.phpt +++ b/ext/standard/tests/strings/vfprintf_variation5.phpt @@ -42,7 +42,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation5.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation6.phpt b/ext/standard/tests/strings/vfprintf_variation6.phpt index 6b5425d5cff1e..b5b82bbc62b06 100644 --- a/ext/standard/tests/strings/vfprintf_variation6.phpt +++ b/ext/standard/tests/strings/vfprintf_variation6.phpt @@ -57,7 +57,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation6.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation7.phpt b/ext/standard/tests/strings/vfprintf_variation7.phpt index a206fd869113e4a6b21861ea638b51cb2b2831bc..ee836edc774c84a9cd9f83a9b3df8801d98126e8 100644 GIT binary patch delta 32 ncmcaE^h{_22b*wNT0v1}UP)SfSz=LUVo7Fxp7~}THg9GC%$p0C delta 17 YcmaDRbX{lz2OCRDX>P%0X*O?W068NCd;kCd diff --git a/ext/standard/tests/strings/vfprintf_variation8.phpt b/ext/standard/tests/strings/vfprintf_variation8.phpt index cda05c4d79842..a72e260e09bd6 100644 --- a/ext/standard/tests/strings/vfprintf_variation8.phpt +++ b/ext/standard/tests/strings/vfprintf_variation8.phpt @@ -60,7 +60,7 @@ $args_array = array( ); /* creating dumping file */ -$data_file = dirname(__FILE__) . '/dump.txt'; +$data_file = dirname(__FILE__) . '/vfprintf_variation8.txt'; if (!($fp = fopen($data_file, 'wt'))) return; diff --git a/ext/standard/tests/strings/vfprintf_variation9.phpt b/ext/standard/tests/strings/vfprintf_variation9.phpt index d10c8aed506e5ccf781091912c459c6fdd7ae235..dd3093c8c9e981b6494d2e7e8cdd2fc534b0a494 100644 GIT binary patch delta 32 ncmX@ecY$w1FpF?mT0v1}UP)SfSz=LUVo7Fxp5^9nmRC#w(0dG) delta 17 Ycmcb>caU#GFbhjcX>P&hG?rIP06V+}cmMzZ diff --git a/ext/zlib/tests/gzeof_variation1.phpt b/ext/zlib/tests/gzeof_variation1.phpt index 6d1e0401dff1c..77a1eccb66bb3 100644 --- a/ext/zlib/tests/gzeof_variation1.phpt +++ b/ext/zlib/tests/gzeof_variation1.phpt @@ -9,7 +9,7 @@ if (!extension_loaded("zlib")) { --FILE-- --FILE-- Date: Thu, 26 Sep 2013 01:06:36 -0700 Subject: [PATCH 388/400] fix missing change from 'tcp_socket' to the more common 'server' --- ext/standard/tests/file/fread_socket_variation1.phpt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/standard/tests/file/fread_socket_variation1.phpt b/ext/standard/tests/file/fread_socket_variation1.phpt index f5086ced09122..d65565d3cc11a 100644 --- a/ext/standard/tests/file/fread_socket_variation1.phpt +++ b/ext/standard/tests/file/fread_socket_variation1.phpt @@ -12,11 +12,11 @@ for ($i=0; $i<100; $i++) { } } -socket_set_timeout($tcp_socket, 0, 1000); +socket_set_timeout($server, 0, 1000); -var_dump(fread($tcp_socket, 1)); +var_dump(fread($server, 1)); -fclose($tcp_socket); +fclose($server); ?> --EXPECT-- From 8b6b39fdcffc8486fedd391b8d8aa7700f0c7f93 Mon Sep 17 00:00:00 2001 From: Sara Golemon Date: Wed, 10 Jul 2013 08:26:47 -0700 Subject: [PATCH 389/400] Add a couple more test cases to parse_url() tests http://::# (valid but silly) http://# (invalid) --- ext/standard/tests/url/parse_url_basic_001.phpt | 11 ++++++++++- ext/standard/tests/url/parse_url_basic_002.phpt | 4 +++- ext/standard/tests/url/parse_url_basic_003.phpt | 4 +++- ext/standard/tests/url/parse_url_basic_004.phpt | 4 +++- ext/standard/tests/url/parse_url_basic_005.phpt | 4 +++- ext/standard/tests/url/parse_url_basic_006.phpt | 4 +++- ext/standard/tests/url/parse_url_basic_007.phpt | 4 +++- ext/standard/tests/url/parse_url_basic_008.phpt | 4 +++- ext/standard/tests/url/parse_url_basic_009.phpt | 4 +++- ext/standard/tests/url/urls.inc | 4 +++- 10 files changed, 37 insertions(+), 10 deletions(-) diff --git a/ext/standard/tests/url/parse_url_basic_001.phpt b/ext/standard/tests/url/parse_url_basic_001.phpt index 1edc32eabad53..4c5b0944c6603 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 464e977ffc7a4..ed0f08a84f534 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 57f182bfa311d..a2bbfa6482bd6 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 6abf4ed453c9e..839ebee554fff 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 3bcc89106d2e4..c113461fe7591 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 741a424a616d9..24de1cc23384f 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 bf8f98042e63f..d4006879f4e99 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 a61fd06943cc0..b283829c46624 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 5302388f6f515..a7d70f34da7ec 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 27521c852007e..4192f4a869770 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 +?> From 929bf11e910ec3fc85617a1c766bba31bad22c26 Mon Sep 17 00:00:00 2001 From: Ferenc Kovacs Date: Wed, 6 Nov 2013 11:17:58 +0100 Subject: [PATCH 390/400] bump API versions --- Zend/zend_extensions.h | 2 +- Zend/zend_modules.h | 2 +- main/php.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Zend/zend_extensions.h b/Zend/zend_extensions.h index 83cad7f38d648..e7f289a656097 100644 --- a/Zend/zend_extensions.h +++ b/Zend/zend_extensions.h @@ -28,7 +28,7 @@ /* The first number is the engine version and the rest is the date. * This way engine 2/3 API no. is always greater than engine 1 API no.. */ -#define ZEND_EXTENSION_API_NO 220121212 +#define ZEND_EXTENSION_API_NO 220131106 typedef struct _zend_extension_version_info { int zend_extension_api_no; diff --git a/Zend/zend_modules.h b/Zend/zend_modules.h index d4adcf5aac982..00209a0ddc81d 100644 --- a/Zend/zend_modules.h +++ b/Zend/zend_modules.h @@ -33,7 +33,7 @@ #define ZEND_MODULE_INFO_FUNC_ARGS zend_module_entry *zend_module TSRMLS_DC #define ZEND_MODULE_INFO_FUNC_ARGS_PASSTHRU zend_module TSRMLS_CC -#define ZEND_MODULE_API_NO 20121212 +#define ZEND_MODULE_API_NO 20131106 #ifdef ZTS #define USING_ZTS 1 #else diff --git a/main/php.h b/main/php.h index f9c6f2030c839..ed8a2bb08e5dc 100644 --- a/main/php.h +++ b/main/php.h @@ -26,7 +26,7 @@ #include #endif -#define PHP_API_VERSION 20121113 +#define PHP_API_VERSION 20131106 #define PHP_HAVE_STREAMS #define YYDEBUG 0 From 890ea8411f908ee8ab84389b42066f66d4a033e6 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Thu, 7 Nov 2013 18:05:08 -0800 Subject: [PATCH 391/400] Fix bug #65946 - pdo_sql_parser.c permanently converts values bound to strings --- ext/pdo/pdo_sql_parser.c | 25 ++++++++++++++----------- ext/pdo/pdo_sql_parser.re | 23 +++++++++++++---------- ext/pdo/tests/bug65946.phpt | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 21 deletions(-) create mode 100644 ext/pdo/tests/bug65946.phpt diff --git a/ext/pdo/pdo_sql_parser.c b/ext/pdo/pdo_sql_parser.c index 1ed78c1cc5e6a..29d69898f4f4e 100644 --- a/ext/pdo/pdo_sql_parser.c +++ b/ext/pdo/pdo_sql_parser.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.13.5 on Tue Aug 20 18:02:48 2013 */ +/* Generated by re2c 0.13.5 on Thu Nov 7 18:02:29 2013 */ #line 1 "ext/pdo/pdo_sql_parser.re" /* +----------------------------------------------------------------------+ @@ -586,7 +586,9 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, } plc->freeq = 1; } else { - switch (Z_TYPE_P(param->parameter)) { + zval tmp_param = *param->parameter; + zval_copy_ctor(&tmp_param); + switch (Z_TYPE(tmp_param)) { case IS_NULL: plc->quoted = "NULL"; plc->qlen = sizeof("NULL")-1; @@ -594,20 +596,20 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, break; case IS_BOOL: - convert_to_long(param->parameter); - + convert_to_long(&tmp_param); + /* fall through */ case IS_LONG: case IS_DOUBLE: - convert_to_string(param->parameter); - plc->qlen = Z_STRLEN_P(param->parameter); - plc->quoted = Z_STRVAL_P(param->parameter); - plc->freeq = 0; + convert_to_string(&tmp_param); + plc->qlen = Z_STRLEN(tmp_param); + plc->quoted = estrdup(Z_STRVAL(tmp_param)); + plc->freeq = 1; break; default: - convert_to_string(param->parameter); - if (!stmt->dbh->methods->quoter(stmt->dbh, Z_STRVAL_P(param->parameter), - Z_STRLEN_P(param->parameter), &plc->quoted, &plc->qlen, + convert_to_string(&tmp_param); + if (!stmt->dbh->methods->quoter(stmt->dbh, Z_STRVAL(tmp_param), + Z_STRLEN(tmp_param), &plc->quoted, &plc->qlen, param->param_type TSRMLS_CC)) { /* bork */ ret = -1; @@ -616,6 +618,7 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, } plc->freeq = 1; } + zval_dtor(&tmp_param); } } else { plc->quoted = Z_STRVAL_P(param->parameter); diff --git a/ext/pdo/pdo_sql_parser.re b/ext/pdo/pdo_sql_parser.re index 1936a37340bb1..fa8ef187fa9a1 100644 --- a/ext/pdo/pdo_sql_parser.re +++ b/ext/pdo/pdo_sql_parser.re @@ -228,7 +228,9 @@ safe: } plc->freeq = 1; } else { - switch (Z_TYPE_P(param->parameter)) { + zval tmp_param = *param->parameter; + zval_copy_ctor(&tmp_param); + switch (Z_TYPE(tmp_param)) { case IS_NULL: plc->quoted = "NULL"; plc->qlen = sizeof("NULL")-1; @@ -236,20 +238,20 @@ safe: break; case IS_BOOL: - convert_to_long(param->parameter); - + convert_to_long(&tmp_param); + /* fall through */ case IS_LONG: case IS_DOUBLE: - convert_to_string(param->parameter); - plc->qlen = Z_STRLEN_P(param->parameter); - plc->quoted = Z_STRVAL_P(param->parameter); - plc->freeq = 0; + convert_to_string(&tmp_param); + plc->qlen = Z_STRLEN(tmp_param); + plc->quoted = estrdup(Z_STRVAL(tmp_param)); + plc->freeq = 1; break; default: - convert_to_string(param->parameter); - if (!stmt->dbh->methods->quoter(stmt->dbh, Z_STRVAL_P(param->parameter), - Z_STRLEN_P(param->parameter), &plc->quoted, &plc->qlen, + convert_to_string(&tmp_param); + if (!stmt->dbh->methods->quoter(stmt->dbh, Z_STRVAL(tmp_param), + Z_STRLEN(tmp_param), &plc->quoted, &plc->qlen, param->param_type TSRMLS_CC)) { /* bork */ ret = -1; @@ -258,6 +260,7 @@ safe: } plc->freeq = 1; } + zval_dtor(&tmp_param); } } else { plc->quoted = Z_STRVAL_P(param->parameter); diff --git a/ext/pdo/tests/bug65946.phpt b/ext/pdo/tests/bug65946.phpt new file mode 100644 index 0000000000000..30261d638aa89 --- /dev/null +++ b/ext/pdo/tests/bug65946.phpt @@ -0,0 +1,33 @@ +--TEST-- +Bug #65946 (pdo_sql_parser.c permanently converts values bound to strings) +--SKIPIF-- + +--FILE-- +setAttribute(PDO::ATTR_EMULATE_PREPARES, true); +$db->exec('CREATE TABLE test(id int)'); +$db->exec('INSERT INTO test VALUES(1)'); +$db->exec('INSERT INTO test VALUES(2)'); +$stmt = $db->prepare('SELECT * FROM testtable LIMIT :limit'); +$stmt->bindValue('limit', 1, PDO::PARAM_INT); +if(!($res = $stmt->execute())) var_dump($stmt->errorInfo()); +if(!($res = $stmt->execute())) var_dump($stmt->errorInfo()); +var_dump($stmt->fetchAll(PDO::FETCH_ASSOC)); +?> +--EXPECTF-- +array(1) { + [0]=> + array(1) { + ["id"]=> + string(1) "2" + } +} From 224dc52ea99f088597a7f5d1d09ddf68dca9dfb8 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Thu, 7 Nov 2013 18:15:15 -0800 Subject: [PATCH 392/400] NEWS entry --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index c3e70d94a3f51..7e426956e5057 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,8 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2013, PHP 5.4.23 +- PDO + . Fixed bug 65946 (sql_parser permanently converts values bound to strings) ?? ??? 2013, PHP 5.4.22 From caab95155d236c0222189aaef6e49c54777257e6 Mon Sep 17 00:00:00 2001 From: Rasmus Lerdorf Date: Thu, 7 Nov 2013 18:16:12 -0800 Subject: [PATCH 393/400] NEWS entry --- NEWS | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS b/NEWS index 3a690bbafe6e4..8c2b651819b1b 100644 --- a/NEWS +++ b/NEWS @@ -24,6 +24,7 @@ PHP NEWS - PDO: . Fixed bug #66033 (Segmentation Fault when constructor of PDO statement throws an exception). (Laruence) + . Fixed bug 65946 (sql_parser permanently converts values bound to strings) - Standard: . Fixed bug #64760 (var_export() does not use full precision for floating-point From fd3fa9b53c6bc8f34c1c8bf75141f7ee74dc8db0 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Fri, 8 Nov 2013 15:06:36 +0800 Subject: [PATCH 394/400] Fixed Bug #66043 (Segfault calling bind_param() on mysqli) Although the doc said it is (unsigned int *), but it is ulong* in the libmysql 5.0 's source codes --- NEWS | 4 ++++ ext/mysqli/mysqli_api.c | 2 +- ext/mysqli/tests/bug66043.phpt | 24 ++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 ext/mysqli/tests/bug66043.phpt diff --git a/NEWS b/NEWS index 7e426956e5057..091ae9aa814c0 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2013, PHP 5.4.23 + +- MySQLi: + . Fixed bug #66043 (Segfault calling bind_param() on mysqli). (Laruence) + - PDO . Fixed bug 65946 (sql_parser permanently converts values bound to strings) diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index 2cda0aa903cf4..6078a5e758d59 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -384,7 +384,7 @@ mysqli_stmt_bind_result_do_bind(MY_STMT *stmt, zval ***args, unsigned int argc, /* Changed to my_bool in MySQL 5.1. See MySQL Bug #16144 */ my_bool tmp; #else - uint tmp = 0; + ulong tmp = 0; #endif stmt->result.buf[ofs].type = IS_STRING; /* diff --git a/ext/mysqli/tests/bug66043.phpt b/ext/mysqli/tests/bug66043.phpt new file mode 100644 index 0000000000000..d0e8b1c3d391f --- /dev/null +++ b/ext/mysqli/tests/bug66043.phpt @@ -0,0 +1,24 @@ +--TEST-- +Bug #66043 (Segfault calling bind_param() on mysqli) +--SKIPIF-- + +--FILE-- +stmt_init(); +$stmt->prepare("SELECT User FROM user WHERE password=\"\""); +$stmt->execute(); +$stmt->bind_result($testArg); +echo "Okey"; +?> +--EXPECTF-- +Okey From f345152037b72b7d3155e366e6fbe091c228062b Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Fri, 8 Nov 2013 15:08:07 +0800 Subject: [PATCH 395/400] Update NEWS --- NEWS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/NEWS b/NEWS index 8c2b651819b1b..02d8b0ec3283b 100644 --- a/NEWS +++ b/NEWS @@ -14,6 +14,9 @@ PHP NEWS - FPM: . Changed default listen() backlog to 65535. (Tony) +- MySQLi: + . Fixed bug #66043 (Segfault calling bind_param() on mysqli). (Laruence) + - OPcache . Increased limit for opcache.max_accelerated_files to 1,000,000. (Chris) From cf2626f10c92709f8db44afa15fc09ec6a9d8b0c Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Fri, 8 Nov 2013 15:32:28 +0800 Subject: [PATCH 396/400] Fixed bug #65947 (basename is no more working after fgetcsv in certain situation) previous codes: "#define php_mblen(ptr, len) ((ptr) == NULL ? mbsinit(&BG(mblen_state)): (int)mbrlen(ptr, len, &BG(mblen_state)))# it use mbsinit there, seems try to initialize the mblen_state, but: "This function does not change the state identified by ps. Typical ways to make the state pointed by ps an initial state are: memset (ps,0,sizeof(*ps)); // ps points to zero-valued object " http://www.cplusplus.com/reference/cwchar/mbsinit/?kw=mbsinit --- NEWS | 4 ++++ ext/standard/php_string.h | 2 +- ext/standard/tests/strings/bug65947.phpt | 17 +++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 ext/standard/tests/strings/bug65947.phpt diff --git a/NEWS b/NEWS index 091ae9aa814c0..4689a436ca412 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2013, PHP 5.4.23 +- Core: + . Fixed bug #65947 (basename is no more working after fgetcsv in certain + situation). (Laruence) + - MySQLi: . Fixed bug #66043 (Segfault calling bind_param() on mysqli). (Laruence) diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h index 65219f257adee..1ce98ee07a21e 100644 --- a/ext/standard/php_string.h +++ b/ext/standard/php_string.h @@ -156,7 +156,7 @@ PHPAPI char *php_strerror(int errnum); # define php_mblen(ptr, len) 1 #else # if defined(_REENTRANT) && defined(HAVE_MBRLEN) && defined(HAVE_MBSTATE_T) -# define php_mblen(ptr, len) ((ptr) == NULL ? mbsinit(&BG(mblen_state)): (int)mbrlen(ptr, len, &BG(mblen_state))) +# define php_mblen(ptr, len) ((ptr) == NULL ? memset(&BG(mblen_state), 0, sizeof(BG(mblen_state))): (int)mbrlen(ptr, len, &BG(mblen_state))) # else # define php_mblen(ptr, len) mblen(ptr, len) # endif diff --git a/ext/standard/tests/strings/bug65947.phpt b/ext/standard/tests/strings/bug65947.phpt new file mode 100644 index 0000000000000..956aa6049a247 --- /dev/null +++ b/ext/standard/tests/strings/bug65947.phpt @@ -0,0 +1,17 @@ +--TEST-- +Bug #65947 (basename is no more working after fgetcsv in certain situation) +--SKIPIF-- + Date: Fri, 8 Nov 2013 15:33:49 +0800 Subject: [PATCH 397/400] Update NEWS --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index 02d8b0ec3283b..0fd30ced060b7 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,8 @@ PHP NEWS ?? ??? 2013, PHP 5.5.6 - Core: + . Fixed bug #65947 (basename is no more working after fgetcsv in certain + situation). (Laruence) . Improved performance of array_merge() and func_get_args() by eliminating useless copying. (Dmitry) . Fixed bug #65939 (Space before ";" breaks php.ini parsing). From 49fbe2579e9cbb4314346c8eaf959c670de0abdb Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 8 Nov 2013 13:50:57 +0400 Subject: [PATCH 398/400] Added tests for PHAR/OPCahce incompatibilities --- ext/opcache/tests/issue0115.phpt | 48 ++++++++++++++++++++++++++++ ext/opcache/tests/issue0149.phpt | 35 ++++++++++++++++++++ ext/opcache/tests/php_cli_server.inc | 47 +++++++++++++++++++++++++++ 3 files changed, 130 insertions(+) create mode 100644 ext/opcache/tests/issue0115.phpt create mode 100644 ext/opcache/tests/issue0149.phpt create mode 100644 ext/opcache/tests/php_cli_server.inc diff --git a/ext/opcache/tests/issue0115.phpt b/ext/opcache/tests/issue0115.phpt new file mode 100644 index 0000000000000..a1e469ff2fec2 --- /dev/null +++ b/ext/opcache/tests/issue0115.phpt @@ -0,0 +1,48 @@ +--TEST-- +ISSUE #115 (path issue when using phar) +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +phar.readonly=0 +--SKIPIF-- + + + +--FILE-- +'; +$p = new Phar(__DIR__ . '/issue0115_1.phar.php', 0, 'this'); +$p['index.php'] = 'setStub($stub); +unset($p); +$p = new Phar(__DIR__ . '/issue0115_2.phar.php', 0, 'this'); +$p['index.php'] = 'setStub($stub); +unset($p); + +include "php_cli_server.inc"; +php_cli_server_start('-d opcache.enable=1 -d opcache.enable_cli=1'); +echo file_get_contents('http://' . PHP_CLI_SERVER_ADDRESS . '/issue0115_1.phar.php'); +echo file_get_contents('http://' . PHP_CLI_SERVER_ADDRESS . '/issue0115_2.phar.php'); +?> +--CLEAN-- + +--EXPECT-- +Hello from Index 1. +Hello World 1! +Hello from Index 2. +Hello World 2! diff --git a/ext/opcache/tests/issue0149.phpt b/ext/opcache/tests/issue0149.phpt new file mode 100644 index 0000000000000..7044d3938837a --- /dev/null +++ b/ext/opcache/tests/issue0149.phpt @@ -0,0 +1,35 @@ +--TEST-- +ISSUE #149 (Phar mount points not working this OPcache enabled) +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +phar.readonly=0 +--SKIPIF-- + + + +--FILE-- +"; +$p = new Phar(__DIR__ . '/issue0149.phar.php', 0, 'this'); +$p['index.php'] = ""; # A Phar must have at least one file, hence this dummy +$p->setStub($stub); +unset($p); + +include "php_cli_server.inc"; +php_cli_server_start('-d opcache.enable=1 -d opcache.enable_cli=1'); +echo file_get_contents('http://' . PHP_CLI_SERVER_ADDRESS . '/issue0149.phar.php'); +echo file_get_contents('http://' . PHP_CLI_SERVER_ADDRESS . '/issue0149.phar.php'); +echo file_get_contents('http://' . PHP_CLI_SERVER_ADDRESS . '/issue0149.phar.php'); +?> +--CLEAN-- + +--EXPECT-- +OK +OK +OK diff --git a/ext/opcache/tests/php_cli_server.inc b/ext/opcache/tests/php_cli_server.inc new file mode 100644 index 0000000000000..0878bfafc0d27 --- /dev/null +++ b/ext/opcache/tests/php_cli_server.inc @@ -0,0 +1,47 @@ + STDIN, + 1 => STDOUT, + 2 => STDERR, + ); + + if (substr(PHP_OS, 0, 3) == 'WIN') { + $cmd = "{$php_executable} -t {$doc_root} $ini -S " . PHP_CLI_SERVER_ADDRESS; + $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} $ini -S " . PHP_CLI_SERVER_ADDRESS . " 2>/dev/null"; + $handle = proc_open($cmd, $descriptorspec, $pipes, $doc_root); + } + + // note: even when server prints 'Listening on localhost:8964...Press Ctrl-C to quit.' + // it might not be listening yet...need to wait until fsockopen() call returns + $i = 0; + while (($i++ < 30) && !($fp = @fsockopen(PHP_CLI_SERVER_HOSTNAME, PHP_CLI_SERVER_PORT))) { + usleep(10000); + } + + if ($fp) { + fclose($fp); + } + + register_shutdown_function( + function($handle) { + proc_terminate($handle); + }, + $handle + ); + // don't bother sleeping, server is already up + // server can take a variable amount of time to be up, so just sleeping a guessed amount of time + // does not work. this is why tests sometimes pass and sometimes fail. to get a reliable pass + // sleeping doesn't work. +} +?> + From 915c428ba1006a144c4fca45e44631ec058a5074 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 8 Nov 2013 16:35:05 +0400 Subject: [PATCH 399/400] Fixed issue #115 (path issue when using phar). Fixed issue #149 (Phar mount points not working with OPcache enabled). --- NEWS | 3 +++ ext/opcache/ZendAccelerator.c | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 0fd30ced060b7..d0359fe185f41 100644 --- a/NEWS +++ b/NEWS @@ -21,6 +21,9 @@ PHP NEWS - OPcache . Increased limit for opcache.max_accelerated_files to 1,000,000. (Chris) + . Fixed issue #115 (path issue when using phar). (Dmitry) + . Fixed issue #149 (Phar mount points not working with OPcache enabled). + (Dmitry) - ODBC . Fixed bug #65950 (Field name truncation if the field name is bigger than diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 72b5a1b9fe7e7..8eaa0a37788c6 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -1196,6 +1196,8 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr /* store script structure in the hash table */ bucket = zend_accel_hash_update(&ZCSG(hash), new_persistent_script->full_path, new_persistent_script->full_path_len + 1, 0, new_persistent_script); if (bucket && + /* key may contain non-persistent PHAR aliases (see issues #115 and #149) */ + memcmp(key, "phar://", sizeof("phar://") - 1) != 0 && (new_persistent_script->full_path_len != key_length || memcmp(new_persistent_script->full_path, key, key_length) != 0)) { /* link key to the same persistent script in hash table */ @@ -1651,7 +1653,18 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type T #endif void *dummy = (void *) 1; - zend_hash_quick_add(&EG(included_files), persistent_script->full_path, persistent_script->full_path_len + 1, persistent_script->hash_value, &dummy, sizeof(void *), NULL); + if (zend_hash_quick_add(&EG(included_files), persistent_script->full_path, persistent_script->full_path_len + 1, persistent_script->hash_value, &dummy, sizeof(void *), NULL) == SUCCESS) { + /* ext/phar has to load phar's metadata into memory */ + if (strstr(persistent_script->full_path, ".phar") && !strstr(persistent_script->full_path, "://")) { + php_stream_statbuf ssb; + char *fname = emalloc(sizeof("phar://") + persistent_script->full_path_len); + + memcpy(fname, "phar://", sizeof("phar://") - 1); + memcpy(fname + sizeof("phar://") - 1, persistent_script->full_path, persistent_script->full_path_len + 1); + php_stream_stat_path(fname, &ssb); + efree(fname); + } + } } } #if ZEND_EXTENSION_API_NO < PHP_5_3_X_API_NO From 611da37617749c81ab22b1e44a0cc1f294cc493a Mon Sep 17 00:00:00 2001 From: Igor Wiedler Date: Sat, 9 Nov 2013 13:48:23 -0500 Subject: [PATCH 400/400] use ZVAL_ZVAL to init ZVAL from ZVAL --- Zend/zend_compile.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 3bee745171973..44e95adf86cf2 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -7055,7 +7055,7 @@ void zend_do_use(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{ } ALLOC_ZVAL(ns); - *ns = ns_name->u.constant; + ZVAL_ZVAL(ns, &ns_name->u.constant, 0, 0); if (new_name) { name = &new_name->u.constant; } else { @@ -7068,8 +7068,7 @@ void zend_do_use(znode *ns_name, znode *new_name, int is_global TSRMLS_DC) /* {{ if (p) { ZVAL_STRING(name, p+1, 1); } else { - *name = *ns; - zval_copy_ctor(name); + ZVAL_ZVAL(name, ns, 1, 0); warn = !is_global && !CG(current_namespace); } } @@ -7133,7 +7132,7 @@ void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, int i zend_bool warn = 0; ALLOC_ZVAL(ns); - *ns = ns_name->u.constant; + ZVAL_ZVAL(ns, &ns_name->u.constant, 0, 0); if (new_name) { name = &new_name->u.constant; } else { @@ -7146,8 +7145,7 @@ void zend_do_use_non_class(znode *ns_name, znode *new_name, int is_global, int i if (p) { ZVAL_STRING(name, p+1, 1); } else { - *name = *ns; - zval_copy_ctor(name); + ZVAL_ZVAL(name, ns, 1, 0); warn = !is_global && !CG(current_namespace); } }