From ebc5a7052d4801c5c6a4fe4ee7b20ac06bc9056e Mon Sep 17 00:00:00 2001 From: Armin Luntzer <armin.luntzer@univie.ac.at> Date: Tue, 28 May 2019 09:55:40 +0000 Subject: [PATCH] net server: catch more issues; set timeout on connection, not on socket --- src/server/net.c | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/src/server/net.c b/src/server/net.c index e3e2920..f234ffb 100644 --- a/src/server/net.c +++ b/src/server/net.c @@ -164,23 +164,49 @@ static void do_send(gpointer data, gpointer user_data) GIOStream *stream; GOutputStream *ostream; + GSocket *socket; + GError *error = NULL; gboolean ret; g_mutex_lock(&c->lock); - if (!G_IS_IO_STREAM(c->con)) - goto bye; + if (!G_IS_IO_STREAM(c->con)) { + c->kick = TRUE; + goto bye; + } + socket = g_socket_connection_get_socket(c->con); + if (!G_IS_SOCKET(socket)) { + c->kick = TRUE; + goto bye; + } + - g_socket_set_timeout(g_socket_connection_get_socket(c->con), 10); + g_socket_set_timeout(socket, 10); stream = G_IO_STREAM(c->con); + + if (!G_IS_IO_STREAM(stream)) { + c->kick = TRUE; + goto bye; + } + ostream = g_io_stream_get_output_stream(stream); + + if (!G_IS_OUTPUT_STREAM(ostream)) { + c->kick = TRUE; + goto bye; + } + ret = g_output_stream_write_all(ostream, th->buf, th->bytes, NULL, NULL, &error); - g_socket_set_timeout(g_socket_connection_get_socket(c->con), 0); + if (!G_IS_SOCKET(socket)) { + c->kick = TRUE; + goto bye; + } + if (!ret) { if (error) { @@ -192,6 +218,7 @@ static void do_send(gpointer data, gpointer user_data) } bye: + g_socket_set_timeout(socket, 0); g_mutex_unlock(&c->lock); g_free(th->buf); -- GitLab