diff options
author | Mark Edgar <medgar123@gmail.com> | 2013-10-05 11:45:44 +0200 |
---|---|---|
committer | Roberto E. Vargas Caballero <k0ga@shike2.com> | 2013-10-07 21:03:51 +0200 |
commit | 939e149544e4da958c333f3b6d00991d459c2e34 (patch) | |
tree | 030e8e35cef8ab3ff333da711287ce4d3909936c | |
parent | 02ae3ce6fdc178ca6eb9b10b6447bb56a6513a27 (diff) | |
download | st-patched-939e149544e4da958c333f3b6d00991d459c2e34.tar.bz2 st-patched-939e149544e4da958c333f3b6d00991d459c2e34.tar.xz st-patched-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 { | |||
264 | typedef struct { | 264 | typedef struct { |
265 | KeySym k; | 265 | KeySym k; |
266 | uint mask; | 266 | uint mask; |
267 | char s[ESC_BUF_SIZ]; | 267 | char *s; |
268 | /* three valued logic variables: 0 indifferent, 1 on, -1 off */ | 268 | /* three valued logic variables: 0 indifferent, 1 on, -1 off */ |
269 | signed char appkey; /* application keypad */ | 269 | signed char appkey; /* application keypad */ |
270 | signed char appcursor; /* application cursor */ | 270 | signed char appcursor; /* application cursor */ |
@@ -3585,26 +3585,27 @@ kpress(XEvent *ev) { | |||
3585 | /* 2. custom keys from config.h */ | 3585 | /* 2. custom keys from config.h */ |
3586 | if((customkey = kmap(ksym, e->state))) { | 3586 | if((customkey = kmap(ksym, e->state))) { |
3587 | len = strlen(customkey); | 3587 | len = strlen(customkey); |
3588 | memcpy(buf, customkey, len); | 3588 | ttywrite(customkey, len); |
3589 | /* 3. composed string from input method */ | 3589 | if(IS_SET(MODE_ECHO)) |
3590 | } else { | 3590 | techo(customkey, len); |
3591 | if(len == 0) | 3591 | return; |
3592 | return; | 3592 | } |
3593 | 3593 | ||
3594 | if(len == 1 && e->state & Mod1Mask) { | 3594 | /* 3. composed string from input method */ |
3595 | if(IS_SET(MODE_8BIT)) { | 3595 | if(len == 0) |
3596 | if(*buf < 0177) { | 3596 | return; |
3597 | c = *buf | 0x80; | 3597 | if(len == 1 && e->state & Mod1Mask) { |
3598 | len = utf8encode(&c, buf); | 3598 | if(IS_SET(MODE_8BIT)) { |
3599 | } | 3599 | if(*buf < 0177) { |
3600 | } else { | 3600 | c = *buf | 0x80; |
3601 | buf[1] = buf[0]; | 3601 | len = utf8encode(&c, buf); |
3602 | buf[0] = '\033'; | ||
3603 | len = 2; | ||
3604 | } | 3602 | } |
3603 | } else { | ||
3604 | buf[1] = buf[0]; | ||
3605 | buf[0] = '\033'; | ||
3606 | len = 2; | ||
3605 | } | 3607 | } |
3606 | } | 3608 | } |
3607 | |||
3608 | ttywrite(buf, len); | 3609 | ttywrite(buf, len); |
3609 | if(IS_SET(MODE_ECHO)) | 3610 | if(IS_SET(MODE_ECHO)) |
3610 | techo(buf, len); | 3611 | techo(buf, len); |