diff options
author | Carlos Garcia Campos <cgarcia@igalia.com> | 2021-11-22 12:07:36 +0100 |
---|---|---|
committer | Carlos Garcia Campos <cgarcia@igalia.com> | 2021-11-22 12:19:33 +0100 |
commit | f0c5126e241fc9ee939b8d64b81012b25a907736 (patch) | |
tree | 3a5fad33c5972eb103a1e039de01b609ebacf51e | |
parent | 9596a869414bb0811f1e1f6009c950ca7af81189 (diff) | |
download | libsoup-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.c | 13 |
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: |