Index: modules/http2/h2_bucket_beam.c
===================================================================
--- modules/http2/h2_bucket_beam.c	(revision 1791774)
+++ modules/http2/h2_bucket_beam.c	(working copy)
@@ -496,6 +496,20 @@
     }
 }
 
+static void recv_buffer_cleanup(h2_bucket_beam *beam, h2_beam_lock *bl)
+{
+    if (beam->recv_buffer && !APR_BRIGADE_EMPTY(beam->recv_buffer)) {
+        apr_bucket_brigade *bb = beam->recv_buffer;
+        beam->recv_buffer = NULL;
+        
+        /* need to do this unlocked since bucket destroy might 
+         * call this beam again. */
+        if (bl) leave_yellow(beam, bl);
+        apr_brigade_destroy(bb);
+        if (bl) enter_yellow(beam, bl);
+    }
+}
+
 static apr_status_t beam_cleanup(void *data)
 {
     h2_bucket_beam *beam = data;
@@ -526,10 +540,7 @@
             pool_kill(beam, beam->recv_pool, beam_recv_cleanup);
             beam->recv_pool = NULL;
         }
-        if (beam->recv_buffer) {
-            apr_brigade_destroy(beam->recv_buffer);
-            beam->recv_buffer = NULL;
-        }
+        recv_buffer_cleanup(beam, NULL);
     }
     else {
         beam->recv_buffer = NULL;
@@ -697,9 +708,7 @@
     h2_beam_lock bl;
     
     if (enter_yellow(beam, &bl) == APR_SUCCESS) {
-        if (beam->recv_buffer && !APR_BRIGADE_EMPTY(beam->recv_buffer)) {
-            apr_brigade_cleanup(beam->recv_buffer);
-        }
+        recv_buffer_cleanup(beam, &bl);
         beam->aborted = 1;
         beam_close(beam);
         leave_yellow(beam, &bl);
@@ -932,9 +941,7 @@
     if (enter_yellow(beam, &bl) == APR_SUCCESS) {
 transfer:
         if (beam->aborted) {
-            if (beam->recv_buffer && !APR_BRIGADE_EMPTY(beam->recv_buffer)) {
-                apr_brigade_cleanup(beam->recv_buffer);
-            }
+            recv_buffer_cleanup(beam, &bl);
             status = APR_ECONNABORTED;
             goto leave;
         }
