diff --git a/NEWS b/NEWS index 1d18cbd732f3a..ad99a49e6bb65 100644 --- a/NEWS +++ b/NEWS @@ -28,6 +28,8 @@ PHP NEWS - Intl: . Bumped ICU requirement to ICU >= 57.1. (cmb) + . IntlDateFormatter::setTimeZone()/datefmt_set_timezone() throws an exception + with uninitialised classes or clone failure. (David Carlier) - MySQLnd: . Added mysqlnd.collect_memory_statistics to ini quick reference. diff --git a/UPGRADING b/UPGRADING index 28805e0f824fd..1bdca204a0f35 100644 --- a/UPGRADING +++ b/UPGRADING @@ -100,10 +100,9 @@ PHP 8.5 UPGRADE NOTES 5. Changed Functions ======================================== -- Zlib: - . The "use_include_path" argument for the - gzfile, gzopen and readgzfile functions had been changed - from int to boolean. +- Intl: + . IntlDateFormatter::setTimeZone()()/datefmt_set_timezone + throws an IntlException on uninitialised classes/clone failures. - PCNTL: . pcntl_exec() now has a formal return type of false. @@ -125,6 +124,11 @@ PHP 8.5 UPGRADE NOTES . posix_fpathconf checks invalid file descriptors and sets last_error to EBADF and raises an E_WARNING message. +- Zlib: + . The "use_include_path" argument for the + gzfile, gzopen and readgzfile functions had been changed + from int to boolean. + ======================================== 6. New Functions ======================================== diff --git a/ext/intl/tests/bug62017.phpt b/ext/intl/tests/bug62017.phpt index be91594ada521..53b0deb4fa7d8 100644 --- a/ext/intl/tests/bug62017.phpt +++ b/ext/intl/tests/bug62017.phpt @@ -5,19 +5,22 @@ intl --FILE-- getMessage() . " in " . $e->getFile() . " on line " . $e->getLine() . PHP_EOL; +} + try { - var_dump( new IntlDateFormatter('', IntlDateFormatter::NONE, IntlDateFormatter::NONE, "Europe/Lisbon", - IntlDateFormatter::GREGORIAN, "\x80")); + IntlDateFormatter::GREGORIAN, "\x80"); } catch (IntlException $e) { echo PHP_EOL."Exception: " . $e->getMessage() . " in " . $e->getFile() . " on line " . $e->getLine() . PHP_EOL; } ?> --EXPECTF-- -Warning: datefmt_create(): datefmt_create: Time zone identifier given is not a valid UTF-8 string in %s on line %d -NULL -Exception: IntlDateFormatter::__construct(): datefmt_create: error converting pattern to UTF-16 in %sbug62017.php on line %d +Exception: datefmt_create: Time zone identifier given is not a valid UTF-8 string in %s on line %d + +Exception: IntlDateFormatter::__construct(): datefmt_create: error converting pattern to UTF-16 in %s on line %d diff --git a/ext/intl/tests/calendar_createInstance_error.phpt b/ext/intl/tests/calendar_createInstance_error.phpt index 91c904f32b4c4..a48b6b12c2d13 100644 --- a/ext/intl/tests/calendar_createInstance_error.phpt +++ b/ext/intl/tests/calendar_createInstance_error.phpt @@ -10,8 +10,11 @@ class X extends IntlTimeZone { function __construct() {} } -var_dump(intlcal_create_instance(new X, NULL)); +try { + intlcal_create_instance(new X, NULL); +} catch (IntlException $e) { + echo $e->getMessage(); +} ?> ---EXPECTF-- -Warning: intlcal_create_instance(): intlcal_create_instance: passed IntlTimeZone is not properly constructed in %s on line %d -NULL +--EXPECT-- +intlcal_create_instance: passed IntlTimeZone is not properly constructed diff --git a/ext/intl/tests/dateformat___construct_bad_tz_cal.phpt b/ext/intl/tests/dateformat___construct_bad_tz_cal.phpt index c0c5412e4ab4c..ca7cd5a13dee4 100644 --- a/ext/intl/tests/dateformat___construct_bad_tz_cal.phpt +++ b/ext/intl/tests/dateformat___construct_bad_tz_cal.phpt @@ -29,7 +29,8 @@ try { } ?> --EXPECTF-- -Exception: IntlDateFormatter::__construct(): datefmt_create: No such time zone: 'bad timezone' in %s on line %d + +Exception: datefmt_create: No such time zone: 'bad timezone' in %s on line %d Exception: 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 %s on line %d diff --git a/ext/intl/tests/dateformat_setTimeZone_error.phpt b/ext/intl/tests/dateformat_setTimeZone_error.phpt index 4467204134062..b911c4b41ec0c 100644 --- a/ext/intl/tests/dateformat_setTimeZone_error.phpt +++ b/ext/intl/tests/dateformat_setTimeZone_error.phpt @@ -10,15 +10,19 @@ ini_set("date.timezone", 'Atlantic/Azores'); $df = new IntlDateFormatter(NULL, 0, 0); -var_dump($df->setTimeZone(array())); -var_dump($df->setTimeZone('non existing timezone')); +try { + $df->setTimeZone(array()); +} catch (IntlException $e) { + echo $e->getMessage() . PHP_EOL; +} +try { + $df->setTimeZone('non existing timezone'); +} catch (IntlException $e) { + echo $e->getMessage(); +} ?> --EXPECTF-- Warning: Array to string conversion in %s on line %d - -Warning: IntlDateFormatter::setTimeZone(): datefmt_set_timezone: No such time zone: 'Array' in %s on line %d -bool(false) - -Warning: IntlDateFormatter::setTimeZone(): datefmt_set_timezone: No such time zone: 'non existing timezone' in %s on line %d -bool(false) +datefmt_set_timezone: No such time zone: 'Array' +datefmt_set_timezone: No such time zone: 'non existing timezone' diff --git a/ext/intl/tests/dateformat_set_timezone_id3.phpt b/ext/intl/tests/dateformat_set_timezone_id3.phpt index a964bb620bc1f..16c0bb05b9be3 100644 --- a/ext/intl/tests/dateformat_set_timezone_id3.phpt +++ b/ext/intl/tests/dateformat_set_timezone_id3.phpt @@ -37,7 +37,11 @@ function ut_main() $res_str .= "-----------"; $res_str .= "\nTrying to set timezone_id= $timezone_id_entry"; - if (ut_datefmt_set_timezone_id( $fmt , $timezone_id_entry ) !== $result) die("ut_datefmt_set_timezone_id failed"); + try { + ut_datefmt_set_timezone_id( $fmt , $timezone_id_entry ); + } catch (IntlException $e) { + echo $e->getMessage() . PHP_EOL; + } $timezone_id = ut_datefmt_get_timezone_id( $fmt ); $res_str .= "\nAfter call to set_timezone_id : timezone_id= $timezone_id"; $formatted = ut_datefmt_format( $fmt, 0); @@ -58,9 +62,8 @@ include_once( 'ut_common.inc' ); ut_run(); ?> --EXPECTF-- -Warning: IntlDateFormatter::setTimeZone(): datefmt_set_timezone: No such time zone: 'CN' in %sut_common.inc on line %d - -Warning: datefmt_set_timezone(): datefmt_set_timezone: No such time zone: 'CN' in %sut_common.inc on line %d +datefmt_set_timezone: No such time zone: 'CN' +datefmt_set_timezone: No such time zone: 'CN' After creation of the dateformatter : timezone_id= US/Pacific ----------- diff --git a/ext/intl/tests/dateformat_set_timezone_id_icu72-1.phpt b/ext/intl/tests/dateformat_set_timezone_id_icu72-1.phpt index 79953ab26b465..eebc6f0973a05 100644 --- a/ext/intl/tests/dateformat_set_timezone_id_icu72-1.phpt +++ b/ext/intl/tests/dateformat_set_timezone_id_icu72-1.phpt @@ -37,7 +37,11 @@ function ut_main() $res_str .= "-----------"; $res_str .= "\nTrying to set timezone_id= $timezone_id_entry"; - if (ut_datefmt_set_timezone_id( $fmt , $timezone_id_entry ) !== $result) die("ut_datefmt_set_timezone_id failed"); + try { + ut_datefmt_set_timezone_id( $fmt , $timezone_id_entry ); + } catch (IntlException $e) { + echo $e->getMessage() . PHP_EOL; + } $timezone_id = ut_datefmt_get_timezone_id( $fmt ); $res_str .= "\nAfter call to set_timezone_id : timezone_id= $timezone_id"; $formatted = ut_datefmt_format( $fmt, 0); @@ -58,9 +62,8 @@ include_once( 'ut_common.inc' ); ut_run(); ?> --EXPECTF-- -Warning: IntlDateFormatter::setTimeZone(): datefmt_set_timezone: No such time zone: 'CN' in %sut_common.inc on line %d - -Warning: datefmt_set_timezone(): datefmt_set_timezone: No such time zone: 'CN' in %sut_common.inc on line %d +datefmt_set_timezone: No such time zone: 'CN' +datefmt_set_timezone: No such time zone: 'CN' After creation of the dateformatter : timezone_id= US/Pacific ----------- diff --git a/ext/intl/timezone/timezone_class.cpp b/ext/intl/timezone/timezone_class.cpp index f7b3d4eeb08f2..9d477aaeca83b 100644 --- a/ext/intl/timezone/timezone_class.cpp +++ b/ext/intl/timezone/timezone_class.cpp @@ -22,6 +22,7 @@ #include #include #include "../intl_convertcpp.h" +#include "../intl_common.h" #include "../common/common_date.h" @@ -147,24 +148,15 @@ U_CFUNC TimeZone *timezone_process_timezone_argument(zval *zv_timezone, instanceof_function(Z_OBJCE_P(zv_timezone), TimeZone_ce_ptr)) { TimeZone_object *to = Z_INTL_TIMEZONE_P(zv_timezone); - /* TODO Throw proper Error exceptions for uninitialized classes and failure to clone */ if (to->utimezone == NULL) { - spprintf(&message, 0, "%s: passed IntlTimeZone is not " + zend_throw_error(IntlException_ce_ptr, "%s: passed IntlTimeZone is not " "properly constructed", func); - if (message) { - intl_errors_set(outside_error, U_ILLEGAL_ARGUMENT_ERROR, message, 1); - efree(message); - } zval_ptr_dtor_str(&local_zv_tz); return NULL; } timeZone = to->utimezone->clone(); if (UNEXPECTED(timeZone == NULL)) { - spprintf(&message, 0, "%s: could not clone TimeZone", func); - if (message) { - intl_errors_set(outside_error, U_MEMORY_ALLOCATION_ERROR, message, 1); - efree(message); - } + zend_throw_error(IntlException_ce_ptr, "%s: could not clone TimeZone", func); zval_ptr_dtor_str(&local_zv_tz); return NULL; } @@ -185,32 +177,20 @@ U_CFUNC TimeZone *timezone_process_timezone_argument(zval *zv_timezone, } if (intl_stringFromChar(id, Z_STRVAL_P(zv_timezone), Z_STRLEN_P(zv_timezone), &status) == FAILURE) { - spprintf(&message, 0, "%s: Time zone identifier given is not a " + zend_throw_error(IntlException_ce_ptr, "%s: Time zone identifier given is not a " "valid UTF-8 string", func); - if (message) { - intl_errors_set(outside_error, status, message, 1); - efree(message); - } zval_ptr_dtor_str(&local_zv_tz); return NULL; } timeZone = TimeZone::createTimeZone(id); if (UNEXPECTED(timeZone == NULL)) { - spprintf(&message, 0, "%s: Could not create time zone", func); - if (message) { - intl_errors_set(outside_error, U_MEMORY_ALLOCATION_ERROR, message, 1); - efree(message); - } + zend_throw_error(IntlException_ce_ptr, "%s: Could not create time zone", func); zval_ptr_dtor_str(&local_zv_tz); return NULL; } if (*timeZone == TimeZone::getUnknown()) { - spprintf(&message, 0, "%s: No such time zone: '%s'", + zend_throw_error(IntlException_ce_ptr, "%s: No such time zone: '%s'", func, Z_STRVAL_P(zv_timezone)); - if (message) { - intl_errors_set(outside_error, U_ILLEGAL_ARGUMENT_ERROR, message, 1); - efree(message); - } zval_ptr_dtor_str(&local_zv_tz); delete timeZone; return NULL; diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 3bb69eb107e35..08243f16b1ed2 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -2165,7 +2165,10 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type) */ from_shared_memory = false; if (persistent_script) { + /* See GH-17246: we disable GC so that user code cannot be executed during the optimizer run. */ + bool orig_gc_state = gc_enable(false); persistent_script = cache_script_in_shared_memory(persistent_script, key, &from_shared_memory); + gc_enable(orig_gc_state); } /* Caching is disabled, returning op_array; diff --git a/ext/opcache/tests/jit/gh17246.inc b/ext/opcache/tests/jit/gh17246.inc new file mode 100644 index 0000000000000..f9e7d78fc165a --- /dev/null +++ b/ext/opcache/tests/jit/gh17246.inc @@ -0,0 +1,8 @@ +field = function() {}; + } + + public function __destruct() + { + // Necessary because we need to invoke tracing JIT during destruction + } +} + +for ($i = 0; $i < 10000; ++$i) { + $obj = new Test(); +} + +require __DIR__.'/gh17246.inc'; + +?> +--EXPECTF-- +Fatal error: Uncaught Error: Class "NonExistentClass" not found in %s:%d +Stack trace: +#0 %s(%d): require() +#1 {main} + thrown in %s on line %d diff --git a/sapi/embed/README.md b/sapi/embed/README.md index 53ced49488778..78bae1fa44fee 100644 --- a/sapi/embed/README.md +++ b/sapi/embed/README.md @@ -36,12 +36,12 @@ To compile this, we must point the compiler to the PHP header files. The paths t We must also point the linker and the runtime loader to the `libphp.so` shared lib for linking PHP (`-lphp`) which is located at `$(php-config --prefix)/lib`. So the complete command to compile ends up being: ```bash -$ gcc \ +$ cc \ $(php-config --includes) \ -L$(php-config --prefix)/lib \ embed_sapi_basic_example.c \ -lphp \ - -Wl,-rpath=$(php-config --prefix)/lib + -Wl,-rpath,$(php-config --prefix)/lib ``` > :memo: The embed SAPI is disabled by default. In order for the above example to compile, PHP must be built with the embed SAPI enabled. To see what SAPIs are installed, run `php-config --php-sapis`. If you don't see `embed` in the list, you'll need to rebuild PHP with `./configure --enable-embed`. The PHP shared library `libphp.so` is built when the embed SAPI is enabled.