mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-07-20 00:47:52 +02:00
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.
This commit is contained in:
@@ -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)
|
||||
|
Reference in New Issue
Block a user