From 40a46d1346fdd4e07c648ba1ee78dedd9bfa33ad Mon Sep 17 00:00:00 2001
From: Benjamin Berg <bberg@redhat.com>
Date: Tue, 6 Apr 2021 16:52:23 +0200
Subject: [PATCH] gsocks5proxy: Handle EOF when reading from a stream

The code did not handle EOF (0 byte read) correctly. This can e.g. cause
an infinite loop if an incorrect socks proxy is configured.

Add the appropriate checks and return an G_IO_ERROR_CONNECTION_CLOSED
error if EOF is encountered.

Conflict:NA
Reference:https://gitlab.gnome.org/GNOME/glib/-/commit/40a46d1346fdd4e07c648ba1ee78dedd9bfa33ad

---
 gio/gsocks5proxy.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)

diff --git a/gio/gsocks5proxy.c b/gio/gsocks5proxy.c
index 09b7fcac29..873db7ea6d 100644
--- a/gio/gsocks5proxy.c
+++ b/gio/gsocks5proxy.c
@@ -717,6 +717,16 @@ nego_reply_read_cb (GObject      *source,
       return;
     }
 
+  if (read == 0)
+    {
+      g_task_return_new_error (task,
+                               G_IO_ERROR,
+                               G_IO_ERROR_CONNECTION_CLOSED,
+                               "Connection to SOCKSv5 proxy server lost");
+      g_object_unref (task);
+      return;
+    }
+
   data->offset += read;
   
   if (data->offset == data->length)
@@ -821,6 +831,16 @@ auth_reply_read_cb (GObject      *source,
       return;
     }
 
+  if (read == 0)
+    {
+      g_task_return_new_error (task,
+                               G_IO_ERROR,
+                               G_IO_ERROR_CONNECTION_CLOSED,
+                               "Connection to SOCKSv5 proxy server lost");
+      g_object_unref (task);
+      return;
+    }
+
   data->offset += read;
 
   if (data->offset == data->length)
@@ -923,6 +943,16 @@ connect_reply_read_cb (GObject       *source,
       return;
     }
 
+  if (read == 0)
+    {
+      g_task_return_new_error (task,
+                               G_IO_ERROR,
+                               G_IO_ERROR_CONNECTION_CLOSED,
+                               "Connection to SOCKSv5 proxy server lost");
+      g_object_unref (task);
+      return;
+    }
+
   data->offset += read;
 
   if (data->offset == data->length)
@@ -983,6 +1013,16 @@ connect_addr_len_read_cb (GObject      *source,
       return;
     }
 
+  if (read == 0)
+    {
+      g_task_return_new_error (task,
+                               G_IO_ERROR,
+                               G_IO_ERROR_CONNECTION_CLOSED,
+                               "Connection to SOCKSv5 proxy server lost");
+      g_object_unref (task);
+      return;
+    }
+
   data->length = data->buffer[0] + 2;
   data->offset = 0;
 
@@ -1009,6 +1049,16 @@ connect_addr_read_cb (GObject      *source,
       return;
     }
 
+  if (read == 0)
+    {
+      g_task_return_new_error (task,
+                               G_IO_ERROR,
+                               G_IO_ERROR_CONNECTION_CLOSED,
+                               "Connection to SOCKSv5 proxy server lost");
+      g_object_unref (task);
+      return;
+    }
+
   data->offset += read;
 
   if (data->offset == data->length)
-- 
GitLab

