diff --git a/src/syncterm/conn_pty.c b/src/syncterm/conn_pty.c
index 024713a2c3ec064c8199b594f3e1d31b47abdd79..232ab7fb16da7556ef379b7e56ca8c44eab8b34a 100644
--- a/src/syncterm/conn_pty.c
+++ b/src/syncterm/conn_pty.c
@@ -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);
diff --git a/src/syncterm/conn_telnet.c b/src/syncterm/conn_telnet.c
index 29e50fbda94134e8365213fb761c2d73c5340234..2490108add3af01decb028c3a42bb17f3addb759 100644
--- a/src/syncterm/conn_telnet.c
+++ b/src/syncterm/conn_telnet.c
@@ -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);
diff --git a/src/syncterm/modem.c b/src/syncterm/modem.c
index 22120ab349c75d15019619391d12abe4d1299a6a..3951856133f048baa3b1c73ca5ab0e2533cea34a 100644
--- a/src/syncterm/modem.c
+++ b/src/syncterm/modem.c
@@ -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);
diff --git a/src/syncterm/rlogin.c b/src/syncterm/rlogin.c
index 865478278b52d00b60e919c1958f908a6a1dcfce..5351e13237fc7d11b988515a27163868c34ca42a 100644
--- a/src/syncterm/rlogin.c
+++ b/src/syncterm/rlogin.c
@@ -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);
diff --git a/src/syncterm/ssh.c b/src/syncterm/ssh.c
index 8ec4ebbaf277dc07aa44ae322564069bd822ea6f..e2be607e3863c19ab846fe1dbc4f998059c11b3f 100644
--- a/src/syncterm/ssh.c
+++ b/src/syncterm/ssh.c
@@ -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;
diff --git a/src/syncterm/syncterm.c b/src/syncterm/syncterm.c
index 0f1a36d83592266b3af2fd60398382fa181ec4b5..b36432d27e5d41c21d796cf58004902d79cfbc47 100644
--- a/src/syncterm/syncterm.c
+++ b/src/syncterm/syncterm.c
@@ -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];