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