Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
12 changes: 8 additions & 4 deletions UPGRADING
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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
========================================
Expand Down
17 changes: 10 additions & 7 deletions ext/intl/tests/bug62017.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,22 @@ intl
--FILE--
<?php
ini_set('intl.error_level', E_WARNING);
var_dump(
try {
datefmt_create('', IntlDateFormatter::NONE, IntlDateFormatter::NONE, "\xFF",
IntlDateFormatter::GREGORIAN, 'a'));
IntlDateFormatter::GREGORIAN, 'a');
} catch (IntlException $e) {
echo PHP_EOL."Exception: " . $e->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
11 changes: 7 additions & 4 deletions ext/intl/tests/calendar_createInstance_error.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -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
3 changes: 2 additions & 1 deletion ext/intl/tests/dateformat___construct_bad_tz_cal.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
20 changes: 12 additions & 8 deletions ext/intl/tests/dateformat_setTimeZone_error.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -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'
11 changes: 7 additions & 4 deletions ext/intl/tests/dateformat_set_timezone_id3.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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
-----------
Expand Down
11 changes: 7 additions & 4 deletions ext/intl/tests/dateformat_set_timezone_id_icu72-1.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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
-----------
Expand Down
32 changes: 6 additions & 26 deletions ext/intl/timezone/timezone_class.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include <unicode/timezone.h>
#include <unicode/calendar.h>
#include "../intl_convertcpp.h"
#include "../intl_common.h"

#include "../common/common_date.h"

Expand Down Expand Up @@ -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;
}
Expand All @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions ext/opcache/ZendAccelerator.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
8 changes: 8 additions & 0 deletions ext/opcache/tests/jit/gh17246.inc
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

// Need to cause a trace exit, so extend non existent class
class MyXSLTProcessor extends NonExistentClass {
public function registerCycle() {
[[$this]]; // Non trivial array
}
}
39 changes: 39 additions & 0 deletions ext/opcache/tests/jit/gh17246.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
--TEST--
GH-17246 (Nested shm protections cause segfault)
--EXTENSIONS--
opcache
--INI--
opcache.protect_memory=1
opcache.jit_buffer_size=32M
opcache.jit=1254
--FILE--
<?php

class Test
{
private $field;

public function __construct()
{
$this->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
4 changes: 2 additions & 2 deletions sapi/embed/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down