Skip to content

Commit 929bbb2

Browse files
committed
Merge branch 'PHP-8.2' into PHP-8.3
* PHP-8.2: Fix persisting of inherited class constants
2 parents 5aa5080 + 42ede55 commit 929bbb2

File tree

3 files changed

+16
-1
lines changed

3 files changed

+16
-1
lines changed

NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ PHP NEWS
1717
. Fix crash when calling childNodes next() when iterator is exhausted.
1818
(nielsdos)
1919

20+
- Opcache:
21+
. Fixed bug GH-14109 (Fix accidental persisting of internal class constant in
22+
shm). (ilutov)
23+
2024
- XML:
2125
. Fixed bug GH-14124 (Segmentation fault with XML extension under certain
2226
memory limit). (nielsdos)

ext/opcache/zend_persist.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -805,12 +805,17 @@ static zend_property_info *zend_persist_property_info(zend_property_info *prop)
805805

806806
static void zend_persist_class_constant(zval *zv)
807807
{
808-
zend_class_constant *c = zend_shared_alloc_get_xlat_entry(Z_PTR_P(zv));
808+
zend_class_constant *orig_c = Z_PTR_P(zv);
809+
zend_class_constant *c = zend_shared_alloc_get_xlat_entry(orig_c);
809810
zend_class_entry *ce;
810811

811812
if (c) {
812813
Z_PTR_P(zv) = c;
813814
return;
815+
} else if (((orig_c->ce->ce_flags & ZEND_ACC_IMMUTABLE) && !(Z_CONSTANT_FLAGS(orig_c->value) & CONST_OWNED))
816+
|| orig_c->ce->type == ZEND_INTERNAL_CLASS) {
817+
/* Class constant comes from a different file in shm or internal class, keep existing pointer. */
818+
return;
814819
} else if (!ZCG(current_persistent_script)->corrupted
815820
&& zend_accel_in_shm(Z_PTR_P(zv))) {
816821
return;

ext/opcache/zend_persist_calc.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "zend_shared_alloc.h"
2727
#include "zend_operators.h"
2828
#include "zend_attributes.h"
29+
#include "zend_constants.h"
2930

3031
#define ADD_DUP_SIZE(m,s) ZCG(current_persistent_script)->size += zend_shared_memdup_size((void*)m, s)
3132
#define ADD_SIZE(m) ZCG(current_persistent_script)->size += ZEND_ALIGNED_SIZE(m)
@@ -386,6 +387,11 @@ static void zend_persist_class_constant_calc(zval *zv)
386387
zend_class_constant *c = Z_PTR_P(zv);
387388

388389
if (!zend_shared_alloc_get_xlat_entry(c)) {
390+
if (((c->ce->ce_flags & ZEND_ACC_IMMUTABLE) && !(Z_CONSTANT_FLAGS(c->value) & CONST_OWNED))
391+
|| c->ce->type == ZEND_INTERNAL_CLASS) {
392+
/* Class constant comes from a different file in shm or internal class, keep existing pointer. */
393+
return;
394+
}
389395
if (!ZCG(current_persistent_script)->corrupted
390396
&& zend_accel_in_shm(Z_PTR_P(zv))) {
391397
return;

0 commit comments

Comments
 (0)