diff --git a/misc/comm.c b/misc/comm.c
index 3ae2634c92fc43de5b3d35b636d62ff8f141fffb..25b5a7cf68af7c73add98d946e7d2d387b48184c 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -233,7 +233,7 @@ static void comm_notification(int fd,void*private)
       } else {
 	/* check for events */
 	if ((ptr->eventmask & EV_RXFLAG) &&
-	    memchr(ptr->inbuf + ptr->ibuf_head, ptr->evtchar, bleft)) {
+	    memchr(ptr->inbuf + ptr->ibuf_head, ptr->evtchar, len)) {
 	  *(WORD*)(unknown[cid]) |= EV_RXFLAG;
 	  mask |= CN_EVENT;
 	}
@@ -564,13 +564,15 @@ LONG WINAPI EscapeCommFunction16(UINT16 cid,UINT16 nFunction)
 	struct termios port;
 
     	TRACE("cid=%d, function=%d\n", cid, nFunction);
-	if ((ptr = GetDeviceStruct(cid)) == NULL) {
-		return -1;
-	}
-	if (tcgetattr(ptr->fd,&port) == -1) {
-		ptr->commerror=WinError();	
-		return -1;
-	}
+	if ((nFunction != GETMAXCOM) && (nFunction != GETMAXLPT)) {
+		if ((ptr = GetDeviceStruct(cid)) == NULL) {
+			return -1;
+		}
+		if (tcgetattr(ptr->fd,&port) == -1) {
+			ptr->commerror=WinError();	
+			return -1;
+		}
+	} else ptr = NULL;
 
 	switch (nFunction) {
 		case RESETDEV:
@@ -588,6 +590,19 @@ LONG WINAPI EscapeCommFunction16(UINT16 cid,UINT16 nFunction)
 			return FLAG_LPT + max;
 			break;
 
+		case GETBASEIRQ:
+			/* FIXME: use tables */
+			/* just fake something for now */
+			if (cid & FLAG_LPT) {
+				/* LPT1: irq 7, LPT2: irq 5 */
+				return (cid & 0x7f) ? 5 : 7;
+			} else {
+				/* COM1: irq 4, COM2: irq 3,
+				   COM3: irq 4, COM4: irq 3 */
+				return 4 - (cid & 1);
+			}
+			break;
+
 #ifdef TIOCM_DTR
 		case CLRDTR:
 			return COMM_WhackModem(ptr->fd, ~TIOCM_DTR, 0);