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
This commit is contained in:
Sara Golemon 2013-12-03 16:36:07 -08:00
parent 6f52f566f3
commit 00a7b1ff7f

View File

@ -1929,6 +1929,23 @@ int php_register_extensions(zend_module_entry **ptr, int count TSRMLS_DC)
} }
return SUCCESS; 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 #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 */ /* 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) /* load and startup extensions compiled as shared objects (aka DLLs)
as requested by php.ini entries as requested by php.ini entries