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) | |
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); | 
