Преглед на файлове

Avoid buffer overrun in kpress() and remove limit on shortcut strings.

Mark Edgar преди 11 години
родител
ревизия
939e149544
променени са 1 файла, в които са добавени 18 реда и са изтрити 17 реда
  1. 18 17
      st.c

+ 18 - 17
st.c

@@ -264,7 +264,7 @@ typedef struct {
 typedef struct {
 	KeySym k;
 	uint mask;
-	char s[ESC_BUF_SIZ];
+	char *s;
 	/* three valued logic variables: 0 indifferent, 1 on, -1 off */
 	signed char appkey;    /* application keypad */
 	signed char appcursor; /* application cursor */
@@ -3585,26 +3585,27 @@ kpress(XEvent *ev) {
 	/* 2. custom keys from config.h */
 	if((customkey = kmap(ksym, e->state))) {
 		len = strlen(customkey);
-		memcpy(buf, customkey, len);
-	/* 3. composed string from input method */
-	} else {
-		if(len == 0)
-			return;
+		ttywrite(customkey, len);
+		if(IS_SET(MODE_ECHO))
+			techo(customkey, len);
+		return;
+	}
 
-		if(len == 1 && e->state & Mod1Mask) {
-			if(IS_SET(MODE_8BIT)) {
-				if(*buf < 0177) {
-					c = *buf | 0x80;
-					len = utf8encode(&c, buf);
-				}
-			} else {
-				buf[1] = buf[0];
-				buf[0] = '\033';
-				len = 2;
+	/* 3. composed string from input method */
+	if(len == 0)
+		return;
+	if(len == 1 && e->state & Mod1Mask) {
+		if(IS_SET(MODE_8BIT)) {
+			if(*buf < 0177) {
+				c = *buf | 0x80;
+				len = utf8encode(&c, buf);
 			}
+		} else {
+			buf[1] = buf[0];
+			buf[0] = '\033';
+			len = 2;
 		}
 	}
-
 	ttywrite(buf, len);
 	if(IS_SET(MODE_ECHO))
 		techo(buf, len);