Skip to content
Snippets Groups Projects
Commit 224f0ca1 authored by deuce's avatar deuce
Browse files

A deadlock could occur if you called conn_close() while the remote was sending

a buttload of data.  If the input queue filled up before the socket was closed,
the input queue could be stuck waiting for the ring buffer to drain while
conn_close() is stuck waiting for the input thread to stop.

We now consume data from the input buffer while waiting for the input thread
to stop.
parent 7d1ae3ab
No related branches found
No related tags found
No related merge requests found
......@@ -502,6 +502,7 @@ int pty_connect(struct bbslist *bbs)
int pty_close(void)
{
time_t start;
char garbage[1024];
conn_api.terminate=1;
start=time(NULL);
......@@ -515,8 +516,10 @@ int pty_close(void)
kill(child_pid, SIGKILL);
waitpid(child_pid, &status, 0);
while(conn_api.input_thread_running || conn_api.output_thread_running)
while(conn_api.input_thread_running || conn_api.output_thread_running) {
conn_recv_upto(garbage, sizeof(garbage), 0);
SLEEP(1);
}
destroy_conn_buf(&conn_inbuf);
destroy_conn_buf(&conn_outbuf);
FREE_AND_NULL(conn_api.rd_buf);
......
......@@ -170,10 +170,14 @@ int telnet_connect(struct bbslist *bbs)
int telnet_close(void)
{
char garbage[1024];
conn_api.terminate=1;
closesocket(telnet_sock);
while(conn_api.input_thread_running || conn_api.output_thread_running)
while(conn_api.input_thread_running || conn_api.output_thread_running) {
conn_recv_upto(garbage, sizeof(garbage), 0);
SLEEP(1);
}
destroy_conn_buf(&conn_inbuf);
destroy_conn_buf(&conn_outbuf);
FREE_AND_NULL(conn_api.rd_buf);
......
......@@ -313,6 +313,7 @@ int serial_close(void)
int modem_close(void)
{
time_t start;
char garbage[1024];
conn_api.terminate=1;
......@@ -333,8 +334,10 @@ int modem_close(void)
}
CLOSEIT:
while(conn_api.input_thread_running || conn_api.output_thread_running)
while(conn_api.input_thread_running || conn_api.output_thread_running) {
conn_recv_upto(garbage, sizeof(garbage), 0);
SLEEP(1);
}
comClose(com);
destroy_conn_buf(&conn_inbuf);
......
......@@ -174,10 +174,14 @@ int rlogin_connect(struct bbslist *bbs)
int rlogin_close(void)
{
char garbage[1024];
conn_api.terminate=1;
closesocket(sock);
while(conn_api.input_thread_running || conn_api.output_thread_running)
while(conn_api.input_thread_running || conn_api.output_thread_running) {
conn_recv_upto(garbage, sizeof(garbage), 0);
SLEEP(1);
}
destroy_conn_buf(&conn_inbuf);
destroy_conn_buf(&conn_outbuf);
FREE_AND_NULL(conn_api.rd_buf);
......
......@@ -295,11 +295,15 @@ int ssh_connect(struct bbslist *bbs)
int ssh_close(void)
{
char garbage[1024];
conn_api.terminate=1;
ssh_active=FALSE;
cl.SetAttribute(ssh_session, CRYPT_SESSINFO_ACTIVE, 0);
while(conn_api.input_thread_running || conn_api.output_thread_running)
while(conn_api.input_thread_running || conn_api.output_thread_running) {
conn_recv_upto(garbage, sizeof(garbage), 0);
SLEEP(1);
}
cl.DestroySession(ssh_session);
closesocket(sock);
sock=INVALID_SOCKET;
......
......@@ -1612,6 +1612,8 @@ int main(int argc, char **argv)
last_bbs=strdup(bbs->name);
bbs=NULL;
}
if (last_bbs)
free(last_bbs);
// Save changed settings
if(getscaling() > 0 && getscaling() != settings.scaling_factor) {
char inipath[MAX_PATH+1];
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment