summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garcia Campos <cgarcia@igalia.com>2021-11-22 12:07:36 +0100
committerCarlos Garcia Campos <cgarcia@igalia.com>2021-11-22 12:19:33 +0100
commitf0c5126e241fc9ee939b8d64b81012b25a907736 (patch)
tree3a5fad33c5972eb103a1e039de01b609ebacf51e
parent9596a869414bb0811f1e1f6009c950ca7af81189 (diff)
downloadlibsoup-f0c5126e241fc9ee939b8d64b81012b25a907736.tar.gz
http2: Close in idle to ensure all pending io is finished first
Fixes a crash after sending GOAWAY frame introduced in 4787b4298075557f79b5348c6432ac27625cda8c
-rw-r--r--libsoup/http2/soup-client-message-io-http2.c13
1 files 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: