[glib/glib-2-68: 1/2] gsocks5proxy: Handle EOF when reading from a stream




commit 56fe8cccc57212378ff5be6df230bd3f8e3f63b1
Author: Benjamin Berg <bberg redhat com>
Date:   Tue Apr 6 16:52:23 2021 +0200

    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.

 gio/gsocks5proxy.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)
---
diff --git a/gio/gsocks5proxy.c b/gio/gsocks5proxy.c
index 09b7fcac2..873db7ea6 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)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]