diff options
author | Mark Edgar | 2013-10-05 11:45:44 +0200 |
---|---|---|
committer | Roberto E. Vargas Caballero | 2013-10-07 21:03:51 +0200 |
commit | 939e149544e4da958c333f3b6d00991d459c2e34 (patch) | |
tree | 030e8e35cef8ab3ff333da711287ce4d3909936c | |
parent | 02ae3ce6fdc178ca6eb9b10b6447bb56a6513a27 (diff) | |
download | st-939e149544e4da958c333f3b6d00991d459c2e34.tar.gz st-939e149544e4da958c333f3b6d00991d459c2e34.tar.xz st-939e149544e4da958c333f3b6d00991d459c2e34.zip |
Avoid buffer overrun in kpress() and remove limit on shortcut strings.
-rw-r--r-- | st.c | 35 |
1 files changed, 18 insertions, 17 deletions
@@ -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); |