Merge branch 'PHP-8.3'

* PHP-8.3:
  Fix GH-13433: Segmentation Fault in zend_class_init_statics when using opcache.preload
This commit is contained in:
Niels Dossche 2024-03-26 21:29:29 +01:00
commit 6316eb1b2c
6 changed files with 53 additions and 4 deletions

View File

@ -0,0 +1,4 @@
<?php
abstract class ParentClass {
use TraitA;
}

View File

@ -0,0 +1,8 @@
<?php
class TheClass extends ParentClass {
use TraitA;
public function test() {
return self::$non_empty_array;
}
}

View File

@ -0,0 +1,4 @@
<?php
trait TraitA {
protected static $non_empty_array = ['non-empty'];
}

View File

@ -0,0 +1,28 @@
--TEST--
GH-13433 (Segmentation Fault in zend_class_init_statics when using opcache.preload)
--INI--
opcache.enable=1
opcache.enable_cli=1
opcache.optimization_level=0
opcache.preload={PWD}/preload.inc
--EXTENSIONS--
opcache
--SKIPIF--
<?php
if (PHP_OS_FAMILY == 'Windows') die('skip Preloading is not supported on Windows');
?>
--FILE--
<?php
$instance = new TheClass;
var_dump($instance);
var_dump($instance->test());
?>
OK
--EXPECT--
object(TheClass)#1 (0) {
}
array(1) {
[0]=>
string(9) "non-empty"
}
OK

View File

@ -0,0 +1,4 @@
<?php
require __DIR__.'/TraitA.inc';
require __DIR__.'/ParentClass.inc';
require __DIR__.'/TheClass.inc';

View File

@ -904,11 +904,12 @@ zend_class_entry *zend_persist_class_entry(zend_class_entry *orig_ce)
ce->default_static_members_table = zend_shared_memdup_free(ce->default_static_members_table, sizeof(zval) * ce->default_static_members_count);
/* Persist only static properties in this class.
* Static properties from parent classes will be handled in class_copy_ctor */
i = (ce->parent && (ce->ce_flags & ZEND_ACC_LINKED)) ? ce->parent->default_static_members_count : 0;
for (; i < ce->default_static_members_count; i++) {
* Static properties from parent classes will be handled in class_copy_ctor and are marked with IS_INDIRECT */
for (i = 0; i < ce->default_static_members_count; i++) {
if (Z_TYPE(ce->default_static_members_table[i]) != IS_INDIRECT) {
zend_persist_zval(&ce->default_static_members_table[i]);
}
}
if (ce->ce_flags & ZEND_ACC_IMMUTABLE) {
if (ce->ce_flags & ZEND_ACC_LINKED) {
ZEND_MAP_PTR_NEW(ce->static_members_table);