st

fork of suckless's simple terminal
Index Commits Files Refs README LICENSE
commit 939e149544e4da958c333f3b6d00991d459c2e34
parent 02ae3ce6fdc178ca6eb9b10b6447bb56a6513a27
Author: Mark Edgar <medgar123@gmail.com>
Date:   Sat,  5 Oct 2013 11:45:44 +0200

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

Diffstat:
Mst.c | 35++++++++++++++++++-----------------
1 file changed, 18 insertions(+), 17 deletions(-)
diff --git a/st.c b/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);