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:
Benjamin Berg 2021-04-06 16:52:23 +02:00 committed by Sebastian Dröge
parent e0c0342688
commit 56fe8cccc5

View File

@ -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)