111 lines
3.0 KiB
Diff
111 lines
3.0 KiB
Diff
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
|
|
|