From 00a7b1ff7fed49df51d0392d47aa79f63bf1c66e Mon Sep 17 00:00:00 2001 From: Sara Golemon Date: Tue, 3 Dec 2013 16:36:07 -0800 Subject: [PATCH] Fix php_module_startup() when loading more than one additional module Dereferencing addition_modules within php_module_startup would point to a vector entirely on the stack (which is of course, wrong). Use a specialized helper to keep BC with the current php_module_startup() calling semantics. Fixes 63159 Thanks to @a-j-k --- main/main.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/main/main.c b/main/main.c index 5942b23f72..ce31cae432 100644 --- a/main/main.c +++ b/main/main.c @@ -1929,6 +1929,23 @@ int php_register_extensions(zend_module_entry **ptr, int count TSRMLS_DC) } return SUCCESS; } + +/* A very long time ago php_module_startup() was refactored in a way + * which broke calling it with more than one additional module. + * This alternative to php_register_extensions() works around that + * by walking the shallower structure. + * + * See algo: https://bugs.php.net/bug.php?id=63159 + */ +static int php_register_extensions_bc(zend_module_entry *ptr, int count TSRMLS_DC) +{ + while (count--) { + if (zend_register_internal_module(ptr++ TSRMLS_CC) == NULL) { + return FAILURE; + } + } + return SUCCESS; +} /* }}} */ #if defined(PHP_WIN32) && _MSC_VER >= 1400 @@ -2199,7 +2216,7 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod } /* start additional PHP extensions */ - php_register_extensions(&additional_modules, num_additional_modules TSRMLS_CC); + php_register_extensions_bc(additional_modules, num_additional_modules TSRMLS_CC); /* load and startup extensions compiled as shared objects (aka DLLs) as requested by php.ini entries -- 2.40.0