This patch is to fix http://bugs.php.net/33690 which is caused by the
fact that php_handler() in sapi/apache2handler/sapi_apache.c calls
apply_config() well before it has allocated SG(server_context) and set
ctx->r to the current request_rec. Downstream from that any ini handler
that needs something from SG(server_context) is thus out of luck.
Following the chain up the backtrace in bug #33690 should make that very
clear if you didn't follow my bad explanation.
So, this patch simply moves the allocation of the context up before the
call to apply_config(). It's not my sapi, and I still don't run Apache2
in anger anywhere, so I'd appreciate a quick sanity check.
-Rasmus
? o
Index: sapi_apache2.c
===================================================================
RCS file: /repository/php-src/sapi/apache2handler/sapi_apache2.c,v
retrieving revision 1.1.2.40
diff -u -r1.1.2.40 sapi_apache2.c
--- sapi_apache2.c 8 Apr 2005 20:35:02 -0000 1.1.2.40
+++ sapi_apache2.c 14 Jul 2005 08:08:58 -0000
@@ -276,6 +276,11 @@
}
}
+static time_t php_apache_sapi_get_request_time(TSRMLS_D) {
+ php_struct *ctx = SG(server_context);
+ return apr_time_sec(ctx->r->request_time);
+}
+
static void php_apache_sapi_log_message_ex(char *msg, request_rec *r)
{
if (r) {
@@ -321,7 +326,7 @@
php_apache_sapi_register_variables,
php_apache_sapi_log_message, /* Log message */
-
+ php_apache_sapi_get_request_time,
STANDARD_SAPI_MODULE_PROPERTIES
};
@@ -454,6 +459,21 @@
TSRMLS_FETCH();
conf = ap_get_module_config(r->per_dir_config, &php4_module);
+
+ /* apply_config() needs r in some cases, so allocate server_context
early */
+ ctx = SG(server_context);
+ if (ctx == NULL) {
+ ctx = SG(server_context) = apr_pcalloc(r->pool, sizeof(*ctx));
+ /* register a cleanup so we clear out the SG(server_context)
+ * after each request. Note: We pass in the pointer to the
+ * server_context in case this is handled by a different thread.
+ */
+ apr_pool_cleanup_register(r->pool, (void *)&SG(server_context),
php_server_context_cleanup, apr_pool_cleanup_null);
+ ctx->r = r;
+ ctx = NULL; /* May look weird to null it here, but it is to
catch the right case in the first_try later on */
+ } else {
+ ctx->r = r;
+ }
apply_config(conf);
if (strcmp(r->handler, PHP_MAGIC_TYPE) && strcmp(r->handler,
PHP_SOURCE_MAGIC_TYPE) && strcmp(r->handler, PHP_SCRIPT)) {
@@ -511,17 +531,9 @@
zend_first_try {
- ctx = SG(server_context);
if (ctx == NULL) {
- ctx = SG(server_context) = apr_pcalloc(r->pool, sizeof(*ctx));
- /* register a cleanup so we clear out the SG(server_context)
- * after each request. Note: We pass in the pointer to the
- * server_context in case this is handled by a different thread.
- */
- apr_pool_cleanup_register(r->pool, (void *)&SG(server_context),
php_server_context_cleanup, apr_pool_cleanup_null);
-
- ctx->r = r;
brigade = apr_brigade_create(r->pool,
r->connection->bucket_alloc);
+ ctx = SG(server_context);
ctx->brigade = brigade;
if (php_apache_request_ctor(r, ctx TSRMLS_CC)!=SUCCESS) {
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php