[libsoup] http2: Close in idle to ensure all pending io is finished first



commit f0c5126e241fc9ee939b8d64b81012b25a907736
Author: Carlos Garcia Campos <cgarcia igalia com>
Date:   Mon Nov 22 12:07:36 2021 +0100

    http2: Close in idle to ensure all pending io is finished first
    
    Fixes a crash after sending GOAWAY frame introduced in 4787b4298075557f79b5348c6432ac27625cda8c

 libsoup/http2/soup-client-message-io-http2.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)
---
diff --git a/libsoup/http2/soup-client-message-io-http2.c b/libsoup/http2/soup-client-message-io-http2.c
index 9658e630..26bcf99b 100644
--- a/libsoup/http2/soup-client-message-io-http2.c
+++ b/libsoup/http2/soup-client-message-io-http2.c
@@ -798,6 +798,15 @@ remove_closed_stream (SoupHTTP2MessageData *data,
         return data->stream_id == frame->hd.stream_id;
 }
 
+static gboolean
+close_in_idle_cb (SoupClientMessageIOHTTP2 *io)
+{
+        g_task_return_boolean (io->close_task, TRUE);
+        g_clear_object (&io->close_task);
+
+        return G_SOURCE_REMOVE;
+}
+
 static int
 on_frame_send_callback (nghttp2_session     *session,
                         const nghttp2_frame *frame,
@@ -851,8 +860,8 @@ on_frame_send_callback (nghttp2_session     *session,
                 h2_debug (io, data, "[SEND] [%s]", frame_type_to_string (frame->hd.type));
                 io->goaway_sent = TRUE;
                 if (io->close_task) {
-                        g_task_return_boolean (io->close_task, TRUE);
-                        g_clear_object (&io->close_task);
+                        /* Close in idle to ensure all pending io is finished first */
+                        g_idle_add ((GSourceFunc)close_in_idle_cb, io);
                 }
                 break;
         default:


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]