diff options
author | Sara Golemon <pollita@php.net> | 2013-12-03 16:36:07 -0800 |
---|---|---|
committer | Sara Golemon <pollita@php.net> | 2013-12-03 18:20:19 -0800 |
commit | 00a7b1ff7fed49df51d0392d47aa79f63bf1c66e (patch) | |
tree | 99e4ba3822158318a231ae73cb4dd77da133fc77 | |
parent | 6f52f566f3d3a08418917baa6b659249a39c3f18 (diff) | |
download | php-git-00a7b1ff7fed49df51d0392d47aa79f63bf1c66e.tar.gz |
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
-rw-r--r-- | main/main.c | 19 |
1 files changed, 18 insertions, 1 deletions
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 |