summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSara Golemon <pollita@php.net>2013-12-03 16:36:07 -0800
committerSara Golemon <pollita@php.net>2013-12-03 18:20:19 -0800
commit00a7b1ff7fed49df51d0392d47aa79f63bf1c66e (patch)
tree99e4ba3822158318a231ae73cb4dd77da133fc77
parent6f52f566f3d3a08418917baa6b659249a39c3f18 (diff)
downloadphp-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.c19
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