On Fri, Mar 19, 2004 at 06:51:41PM -0800, Mathihalli, Madhusudan wrote:
> Do we need to do the following ? I tried it - the test continued to a
> certain extent, only to fail again after some time (with the same
> stack trace)
What's the repro case for this? You're running swamp against an
SSL->HTTP reverse proxy? The problem seems to be because:
- ssl_io_filter_cleanup() is registered as a cleanup on ptrans.
- core_output_filter creates the deferred_write_pool as a subpool of
ptrans.
- when ssl_io_filter_cleanup() runs, it calls ssl_filter_io_shutdown(),
which tries to do an SSL shutdown and hence passes a brigade down
through core_output_filter.
- apr_pool_clear destroys subpools before running cleanups
So when apr_pool_clear(ptrans) is run in the MPM, it goes:
1. destroy deferred_write_pool
2. run ssl_io_filter_cleanup, which calls core_output_filter
3. core_output_filter goes boom since its ->deferred_write_pool pointer
is pointing at a destroyed pool
I'm not sure why this would trigger in 2.0.49 but not .48 particularly.
If anything I'd expect the opposite because the EOC should ensure that
ssl_filter_io_shutdown is a noop when called from the pool cleanup under
normal operation. Hmmm.
I think the correct fix is to stop trying to send the shutdown from the
cleanup, which didn't actually work anyway. Can you test something
like:
Index: ssl_engine_io.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/ssl/ssl_engine_io.c,v
retrieving revision 1.121
diff -u -r1.121 ssl_engine_io.c
--- ssl_engine_io.c 29 Feb 2004 00:29:20 -0000 1.121
+++ ssl_engine_io.c 24 Mar 2004 15:44:37 -0000
@@ -984,22 +984,19 @@
static apr_status_t ssl_io_filter_cleanup(void *data)
{
- apr_status_t ret;
- ssl_filter_ctx_t *filter_ctx = (ssl_filter_ctx_t *)data;
- conn_rec *c;
+ ssl_filter_ctx_t *filter_ctx = data;
- if (!filter_ctx->pssl) {
- /* already been shutdown */
- return APR_SUCCESS;
- }
+ if (filter_ctx->pssl) {
+ conn_rec *c = (conn_rec *)SSL_get_app_data(filter_ctx->pssl);
+ SSLConnRec *sslconn = myConnConfig(c);
- c = (conn_rec *)SSL_get_app_data(filter_ctx->pssl);
- if ((ret = ssl_filter_io_shutdown(filter_ctx, c, 0)) != APR_SUCCESS) {
- ap_log_error(APLOG_MARK, APLOG_INFO, ret, NULL,
- "SSL filter error shutting down I/O");
+ SSL_free(filter_ctx->pssl);
+ filter_ctx->pssl = NULL;
+
+ if (sslconn) sslconn->ssl = NULL;
}
- return ret;
+ return APR_SUCCESS;
}
/*