Browse Source

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

master
Mark Edgar 11 years ago
committed by Roberto E. Vargas Caballero
parent
commit
939e149544
1 changed files with 18 additions and 17 deletions
  1. +18
    -17
      st.c

+ 18
- 17
st.c View File

@ -264,7 +264,7 @@ typedef struct {
typedef struct { typedef struct {
KeySym k; KeySym k;
uint mask; uint mask;
char s[ESC_BUF_SIZ];
char *s;
/* three valued logic variables: 0 indifferent, 1 on, -1 off */ /* three valued logic variables: 0 indifferent, 1 on, -1 off */
signed char appkey; /* application keypad */ signed char appkey; /* application keypad */
signed char appcursor; /* application cursor */ signed char appcursor; /* application cursor */
@ -3585,26 +3585,27 @@ kpress(XEvent *ev) {
/* 2. custom keys from config.h */ /* 2. custom keys from config.h */
if((customkey = kmap(ksym, e->state))) { if((customkey = kmap(ksym, e->state))) {
len = strlen(customkey); 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); ttywrite(buf, len);
if(IS_SET(MODE_ECHO)) if(IS_SET(MODE_ECHO))
techo(buf, len); techo(buf, len);


Loading…
Cancel
Save