diff --git a/main/main.c b/main/main.c index 5942b23f729..ce31cae432a 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