File tree Expand file tree Collapse file tree 3 files changed +16
-1
lines changed
Expand file tree Collapse file tree 3 files changed +16
-1
lines changed Original file line number Diff line number Diff 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)
Original file line number Diff line number Diff line change @@ -802,12 +802,17 @@ static zend_property_info *zend_persist_property_info(zend_property_info *prop)
802802
803803static 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 ;
Original file line number Diff line number Diff line change 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 ;
You can’t perform that action at this time.
0 commit comments