diff --git a/common-session.c b/common-session.c
index 19247a8f24a3c8695b7e43ba7ddcff6baad15679..be8f776a4a64239d291b3bce1781a90ca8373d4b 100644
--- a/common-session.c
+++ b/common-session.c
@@ -281,6 +281,8 @@ void session_cleanup() {
 	other session state is freed. */
 	remove_all_listeners();
 
+	remove_connect_pending();
+
 	while (!isempty(&ses.writequeue)) {
 		buf_free(dequeue(&ses.writequeue));
 	}
diff --git a/netio.c b/netio.c
index 9aa7ae5175bce641831f95e8f3773137cb25df6f..42d1b32d23113904ca617ae0444ff4e92a9a6594 100644
--- a/netio.c
+++ b/netio.c
@@ -177,6 +177,13 @@ struct dropbear_progress_connection *connect_remote(const char* remotehost, cons
 	return c;
 }
 
+void remove_connect_pending() {
+	while (ses.conn_pending.first) {
+		struct dropbear_progress_connection *c = ses.conn_pending.first->item;
+		remove_connect(c, ses.conn_pending.first);
+	}
+}
+
 
 void set_connect_fds(fd_set *writefd) {
 	m_list_elem *iter;
diff --git a/netio.h b/netio.h
index 280ccaf5f9485182c1df977b210f5fcb21b7b53d..1bf08ce6b049c62e94ca644fd6913c2b88eb14e4 100644
--- a/netio.h
+++ b/netio.h
@@ -30,8 +30,12 @@ typedef void(*connect_callback)(int result, int sock, void* data, const char* er
 struct dropbear_progress_connection * connect_remote (const char* remotehost, const char* remoteport,
 	connect_callback cb, void *cb_data);
 
+/* Sets up for select() */
 void set_connect_fds(fd_set *writefd);
+/* Handles ready sockets after select() */
 void handle_connect_fds(fd_set *writefd);
+/* Cleanup */
+void remove_connect_pending();
 
 /* Doesn't actually stop the connect, but adds a dummy callback instead */
 void cancel_connect(struct dropbear_progress_connection *c);