Avoid buffer overrun in kpress() and remove limit on shortcut strings. - st - Personal fork of st
 (HTM) git clone git://git.drkhsh.at/st.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 939e149544e4da958c333f3b6d00991d459c2e34
 (DIR) parent 02ae3ce6fdc178ca6eb9b10b6447bb56a6513a27
 (HTM) Author: Mark Edgar <medgar123@gmail.com>
       Date:   Sat,  5 Oct 2013 11:45:44 +0200
       
       Avoid buffer overrun in kpress() and remove limit on shortcut strings.
       
       Diffstat:
         M st.c                                |      35 ++++++++++++++++---------------
       
       1 file changed, 18 insertions(+), 17 deletions(-)
       ---
 (DIR) diff --git 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);