]> granicus.if.org Git - php/commitdiff
Fix php_module_startup() when loading more than one additional module
authorSara Golemon <pollita@php.net>
Wed, 4 Dec 2013 00:36:07 +0000 (16:36 -0800)
committerSara Golemon <pollita@php.net>
Wed, 4 Dec 2013 02:20:19 +0000 (18:20 -0800)
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

index 5942b23f729a11309dadacd2de73bff26a1c8947..ce31cae432a00952153d6d72ae8fa4dfa0611576 100644 (file)
@@ -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