Commit 92b28877223 for php.net
commit 92b2887722329c9f7e5dad646f55551cf231bcaf
Author: Arnaud Le Blanc <365207+arnaud-lb@users.noreply.github.com>
Date: Wed Jan 7 18:54:29 2026 +0100
Fix handling of ZEND_AST_CALLABLE_CONVERT in file cache (#20860)
Nodes in zend_ast_fcc->args were serialized, but not zend_ast_fcc->args itself
diff --git a/ext/opcache/zend_file_cache.c b/ext/opcache/zend_file_cache.c
index fb6196abb93..3114e5b9271 100644
--- a/ext/opcache/zend_file_cache.c
+++ b/ext/opcache/zend_file_cache.c
@@ -384,7 +384,12 @@ static void zend_file_cache_serialize_ast(zend_ast *ast,
} else if (ast->kind == ZEND_AST_CALLABLE_CONVERT) {
zend_ast_fcc *fcc = (zend_ast_fcc*)ast;
ZEND_MAP_PTR_INIT(fcc->fptr, NULL);
- zend_file_cache_serialize_ast(fcc->args, script, info, buf);
+ if (!IS_SERIALIZED(fcc->args)) {
+ SERIALIZE_PTR(fcc->args);
+ tmp = fcc->args;
+ UNSERIALIZE_PTR(tmp);
+ zend_file_cache_serialize_ast(tmp, script, info, buf);
+ }
} else if (zend_ast_is_decl(ast)) {
/* Not implemented. */
ZEND_UNREACHABLE();
@@ -1305,7 +1310,10 @@ static void zend_file_cache_unserialize_ast(zend_ast *ast,
} else if (ast->kind == ZEND_AST_CALLABLE_CONVERT) {
zend_ast_fcc *fcc = (zend_ast_fcc*)ast;
ZEND_MAP_PTR_NEW(fcc->fptr);
- zend_file_cache_unserialize_ast(fcc->args, script, buf);
+ if (!IS_UNSERIALIZED(fcc->args)) {
+ UNSERIALIZE_PTR(fcc->args);
+ zend_file_cache_unserialize_ast(fcc->args, script, buf);
+ }
} else if (zend_ast_is_decl(ast)) {
/* Not implemented. */
ZEND_UNREACHABLE();