diff --git a/ext/opcache/Optimizer/pass1_5.c b/ext/opcache/Optimizer/pass1_5.c index 5ab5bf400bd..8f76c63d966 100644 --- a/ext/opcache/Optimizer/pass1_5.c +++ b/ext/opcache/Optimizer/pass1_5.c @@ -274,7 +274,11 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) { Z_STRVAL(op_array->literals[opline->op1.constant + 1].constant), Z_STRLEN(op_array->literals[opline->op1.constant].constant) + 1, Z_HASH_P(&op_array->literals[opline->op1.constant + 1].constant), - (void **)&pce) == FAILURE) { + (void **)&pce) == FAILURE || + ((*pce)->type == ZEND_INTERNAL_CLASS && + (*pce)->info.internal.module->type != MODULE_PERSISTENT) || + ((*pce)->type == ZEND_USER_CLASS && + ZEND_CE_FILENAME(*pce) != op_array->filename)) { break; } } diff --git a/ext/opcache/tests/bug66338.phpt b/ext/opcache/tests/bug66338.phpt new file mode 100644 index 00000000000..cf0018df94e --- /dev/null +++ b/ext/opcache/tests/bug66338.phpt @@ -0,0 +1,42 @@ +--TEST-- +Bug #66338 (Optimization binding of class constants is not safely opcacheable) +--INI-- +opcache.enable=0 +--SKIPIF-- + +--FILE-- + +--EXPECT-- +The President of the USA is Barack Hussein Obama II +The Prime Minister of the UK is David William Donald Cameron