From 8de7f62af142e23c9301b498a0004848bd5be667 Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Tue, 6 Dec 2011 02:44:25 +0000
Subject: [PATCH] Fix xmodem upload bug where a FILE handle leak could occure
 and telnet could stay in binary mode.

Allow transfer abort callback to ignore mouse keys (and each extended keys)
---
 src/syncterm/term.c | 48 ++++++++++++++++++++++++++++++++-------------
 1 file changed, 34 insertions(+), 14 deletions(-)

diff --git a/src/syncterm/term.c b/src/syncterm/term.c
index fb81a7d292..deeb60b9b7 100644
--- a/src/syncterm/term.c
+++ b/src/syncterm/term.c
@@ -263,17 +263,26 @@ static BOOL zmodem_check_abort(void* vp)
 	zmodem_t*				zm=zcb->zm;
 	static time_t			last_check=0;
 	time_t					now=time(NULL);
+	int						key;
 
 	if(last_check != now) {
 		last_check=now;
-		if(zm!=NULL && kbhit()) {
-			switch(getch()) {
-				case ESC:
-				case CTRL_C:
-				case CTRL_X:
+		if(zm!=NULL) {
+			while(kbhit()) {
+				switch((key=getch())) {
+					case ESC:
+					case CTRL_C:
+					case CTRL_X:
 						zm->cancelled=TRUE;
-					zm->local_abort=TRUE;
-					break;
+						zm->local_abort=TRUE;
+						break;
+					case 0:
+					case 0xff:
+						key |= (getch() << 8);
+						if(key==CIO_KEY_MOUSE)
+							getmouse(NULL);
+						break;
+				}
 			}
 		}
 	}
@@ -1196,16 +1205,25 @@ static BOOL xmodem_check_abort(void* vp)
 	xmodem_t* xm = (xmodem_t*)vp;
 	static time_t			last_check=0;
 	time_t					now=time(NULL);
+	int						key;
 
 	if(last_check != now) {
 		last_check=now;
-		if(xm!=NULL && kbhit()) {
-			switch(getch()) {
-				case ESC:
-				case CTRL_C:
-				case CTRL_X:
-					xm->cancelled=TRUE;
-					break;
+		if(xm!=NULL) {
+			while(kbhit()) {
+				switch((key=getch())) {
+					case ESC:
+					case CTRL_C:
+					case CTRL_X:
+						xm->cancelled=TRUE;
+						break;
+					case 0:
+					case 0xff:
+						key |= (getch() << 8);
+						if(key==CIO_KEY_MOUSE)
+							getmouse(NULL);
+						break;
+				}
 			}
 		}
 	}
@@ -1417,6 +1435,8 @@ void xmodem_upload(struct bbslist *bbs, FILE *fp, char *path, long mode, int las
 			,path,fsize/1024,(mode&GMODE)?"-g":"");
 	}
 	else {
+		fclose(fp);
+		conn_binary_mode_off();
 		return;
 	}
 
-- 
GitLab