aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Edgar <medgar123@gmail.com>2013-10-05 11:45:44 +0200
committerRoberto E. Vargas Caballero <k0ga@shike2.com>2013-10-07 21:03:51 +0200
commit939e149544e4da958c333f3b6d00991d459c2e34 (patch)
tree030e8e35cef8ab3ff333da711287ce4d3909936c
parent02ae3ce6fdc178ca6eb9b10b6447bb56a6513a27 (diff)
downloadst-939e149544e4da958c333f3b6d00991d459c2e34.tar.gz
Avoid buffer overrun in kpress() and remove limit on shortcut strings.
-rw-r--r--st.c35
1 files changed, 18 insertions, 17 deletions
diff --git a/st.c b/st.c
index 331509f..16bf68b 100644
--- 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);