Hi,
Am 15.02.2017 um 12:19 schrieb Yann Ylavic:
> Hi Stefan,
>
> On Wed, Feb 15, 2017 at 9:34 AM, Stefan Priebe - Profihost AG
> <[email protected]> wrote:
>> Current status: no segfaults.
>
> Is this with or without the mpm_event's wakeup and/or allocator patches?
it's with the mpm_event_listener_wakeup_bug57399_V7 +
--- a/build/httpd/server/mpm/event/event.c (revision 1776076)
+++ b/build/httpd/server/mpm/event/event.c (working copy)
@@ -1743,6 +1743,8 @@ static void * APR_THREAD_FUNC listener_thread(apr_
enable_listensocks(process_slot);
}
if (!listeners_disabled) {
+ apr_thread_mutex_t *mutex;
+
lr = (ap_listen_rec *) pt->baton;
ap_pop_pool(&ptrans, worker_queue_info);
@@ -1751,19 +1753,24 @@ static void * APR_THREAD_FUNC listener_thread(apr_
apr_allocator_t *allocator;
apr_allocator_create(&allocator);
- apr_allocator_max_free_set(allocator,
- ap_max_mem_free);
- apr_pool_create_ex(&ptrans, pconf, NULL,
allocator);
- apr_allocator_owner_set(allocator, ptrans);
- if (ptrans == NULL) {
+ apr_allocator_max_free_set(allocator,
ap_max_mem_free);
+ rc = apr_pool_create_ex(&ptrans, pconf, NULL,
+ allocator);
+ if (rc != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_CRIT, rc,
ap_server_conf, APLOGNO(03097)
"Failed to create transaction
pool");
+ apr_allocator_destroy(allocator);
signal_threads(ST_GRACEFUL);
return NULL;
}
+ apr_allocator_owner_set(allocator, ptrans);
+ apr_pool_tag(ptrans, "transaction");
}
- apr_pool_tag(ptrans, "transaction");
+ apr_thread_mutex_create(&mutex,
APR_THREAD_MUTEX_DEFAULT,
+ ptrans);
+ apr_allocator_mutex_set(apr_pool_allocator_get(ptrans),
+ mutex);
get_worker(&have_idle_worker, 1, &workers_were_busy);
rc = lr->accept_func(&csd, lr, ptrans);
+
Index: a/build/httpd/modules/ssl/ssl_engine_io.c
===================================================================
--- a/build/httpd/modules/ssl/ssl_engine_io.c (revision 1781324)
+++ b/build/httpd/modules/ssl/ssl_engine_io.c (working copy)
@@ -138,6 +138,7 @@ static int bio_filter_out_pass(bio_filter_out_ctx_
outctx->rc = ap_pass_brigade(outctx->filter_ctx->pOutputFilter->next,
outctx->bb);
+ apr_brigade_cleanup(outctx->bb);
/* Fail if the connection was reset: */
if (outctx->rc == APR_SUCCESS && outctx->c->aborted) {
outctx->rc = APR_ECONNRESET;
@@ -1699,13 +1700,12 @@ static apr_status_t ssl_io_filter_output(ap_filter
while (!APR_BRIGADE_EMPTY(bb) && status == APR_SUCCESS) {
apr_bucket *bucket = APR_BRIGADE_FIRST(bb);
- if (APR_BUCKET_IS_METADATA(bucket)) {
+ if (APR_BUCKET_IS_METADATA(bucket) || !filter_ctx->pssl) {
/* Pass through metadata buckets untouched. EOC is
* special; terminate the SSL layer first. */
if (AP_BUCKET_IS_EOC(bucket)) {
ssl_filter_io_shutdown(filter_ctx, f->c, 0);
}
- AP_DEBUG_ASSERT(APR_BRIGADE_EMPTY(outctx->bb));
/* Metadata buckets are passed one per brigade; it might
* be more efficient (but also more complex) to use
@@ -1712,11 +1712,10 @@ static apr_status_t ssl_io_filter_output(ap_filter
* outctx->bb as a true buffer and interleave these with
* data buckets. */
APR_BUCKET_REMOVE(bucket);
- APR_BRIGADE_INSERT_HEAD(outctx->bb, bucket);
- status = ap_pass_brigade(f->next, outctx->bb);
- if (status == APR_SUCCESS && f->c->aborted)
- status = APR_ECONNRESET;
- apr_brigade_cleanup(outctx->bb);
+ APR_BRIGADE_INSERT_TAIL(outctx->bb, bucket);
+ if (bio_filter_out_pass(outctx) < 0) {
+ status = outctx->rc;
+ }
}
else {
/* Filter a data bucket. */
Greets,
Stefan