]> granicus.if.org Git - php/commitdiff
Fixed bug #80634 (write_property handler of internal classes is skipped on preloaded...
authorDmitry Stogov <dmitry@zend.com>
Wed, 20 Jan 2021 08:03:37 +0000 (11:03 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 20 Jan 2021 08:03:37 +0000 (11:03 +0300)
NEWS
ext/opcache/jit/zend_jit_x86.dasc
ext/opcache/tests/jit/bug80634.phpt [new file with mode: 0644]
ext/opcache/tests/jit/preload_bug80634.inc [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 06da4d05b86cf6dac845b2b6ffe3239879458bb4..95d96df80e400e56d9f343fab38d7fc83f19e10c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,9 @@ PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? ??? 2021, PHP 8.0.3
 
+- Opcache:
+  . Fixed bug #80634 (write_property handler of internal classes is skipped on
+    preloaded JITted code). (Dmitry)
 
 21 Jan 2021, PHP 8.0.2
 
index 5ff3c050344933c03a72658abf40670c0b96fc78..91038b1be4217f39f7692140a9f8c140157cd200 100644 (file)
@@ -12626,7 +12626,10 @@ static zend_property_info* zend_get_known_property_info(zend_class_entry *ce, ze
 {
        zend_property_info *info = NULL;
 
-       if (!ce || !(ce->ce_flags & ZEND_ACC_LINKED) || (ce->ce_flags & ZEND_ACC_TRAIT)) {
+       if (!ce ||
+           !(ce->ce_flags & ZEND_ACC_LINKED) ||
+           (ce->ce_flags & ZEND_ACC_TRAIT) ||
+           ce->create_object) {
                return NULL;
        }
 
diff --git a/ext/opcache/tests/jit/bug80634.phpt b/ext/opcache/tests/jit/bug80634.phpt
new file mode 100644 (file)
index 0000000..579adda
--- /dev/null
@@ -0,0 +1,22 @@
+--TEST--
+Bug #80634 (write_property handler of internal classes is skipped on preloaded JITted code)
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.file_update_protection=0
+opcache.jit_buffer_size=1M
+opcache.protect_memory=1
+opcache.jit=function
+opcache.preload={PWD}/preload_bug80634.inc
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+$v = new SomeClass(5);
+?>
+--EXPECTF--
+Fatal error: Uncaught Error: Writing to DatePeriod->interval is unsupported in %spreload_bug80634.inc:7
+Stack trace:
+#0 %sbug80634.php(2): SomeClass->__construct(5)
+#1 {main}
+  thrown in %spreload_bug80634.inc on line 7
\ No newline at end of file
diff --git a/ext/opcache/tests/jit/preload_bug80634.inc b/ext/opcache/tests/jit/preload_bug80634.inc
new file mode 100644 (file)
index 0000000..feee9ec
--- /dev/null
@@ -0,0 +1,10 @@
+<?php
+class SomeClass extends \DatePeriod {
+       public $interval;
+
+       public function __construct(int $v) {
+               parent::__construct(new \DateTime('2020-12-31'), new \DateInterval("P1Y"), 1);
+               $this->interval = $v;
+               var_dump($this->interval);
+       }
+}
\ No newline at end of file