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
> <s.pri...@profihost.ag> 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

Reply via email to