Skip to content

Commit 42ede55

Browse files
committed
Fix persisting of inherited class constants
Class constants are inherited to user classes without cloning. Thus, internal class constants should not be persisted at all. Simply keep pointing to the internal class constant. Fixes GH-14109 Closes GH-14114
1 parent f8d1864 commit 42ede55

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
@@ -802,12 +802,17 @@ static zend_property_info *zend_persist_property_info(zend_property_info *prop)
802802

803803
static void zend_persist_class_constant(zval *zv)
804804
{
805-
zend_class_constant *c = zend_shared_alloc_get_xlat_entry(Z_PTR_P(zv));
805+
zend_class_constant *orig_c = Z_PTR_P(zv);
806+
zend_class_constant *c = zend_shared_alloc_get_xlat_entry(orig_c);
806807
zend_class_entry *ce;
807808

808809
if (c) {
809810
Z_PTR_P(zv) = c;
810811
return;
812+
} else if (((orig_c->ce->ce_flags & ZEND_ACC_IMMUTABLE) && !(Z_CONSTANT_FLAGS(orig_c->value) & CONST_OWNED))
813+
|| orig_c->ce->type == ZEND_INTERNAL_CLASS) {
814+
/* Class constant comes from a different file in shm or internal class, keep existing pointer. */
815+
return;
811816
} else if (!ZCG(current_persistent_script)->corrupted
812817
&& zend_accel_in_shm(Z_PTR_P(zv))) {
813818
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)