Fixing bugs in the strtol and strtok_r replacements. - 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 7d32471efffa825f52d24930b5ee617105f9c83e
 (DIR) parent 7cb0d95509d1b2837e4fa7d131f497800b20d22c
 (HTM) Author: Christoph Lohmann <20h@r-36.net>
       Date:   Tue, 26 Feb 2013 18:19:44 +0100
       
       Fixing bugs in the strtol and strtok_r replacements.
       
       Thanks "Roberto E. Vargas Caballero" <k0ga@shike2.com> for the comments!
       
       Diffstat:
         M st.c                                |      40 +++++++++++++------------------
       
       1 file changed, 17 insertions(+), 23 deletions(-)
       ---
 (DIR) diff --git a/st.c b/st.c
       @@ -1306,23 +1306,18 @@ csiparse(void) {
                }
        
                while(p < csiescseq.buf+csiescseq.len) {
       -                np = NULL;
                        v = strtol(p, &np, 10);
       +                if(np == p)
       +                        break;
                        if(v == LONG_MAX || v == LONG_MIN)
                                v = -1;
       -                csiescseq.arg[csiescseq.narg] = v;
       -                if(np != NULL)
       -                        p = np;
       -
       -                if(*p == ';' && csiescseq.narg+1 < ESC_ARG_SIZ) {
       -                        csiescseq.narg++, p++;
       -                } else {
       -                        csiescseq.mode = *p;
       -                        csiescseq.narg++;
       -
       -                        return;
       -                }
       +                csiescseq.arg[csiescseq.narg++] = v;
       +                p = np;
       +                if(*p != ';' || csiescseq.narg == ESC_ARG_SIZ)
       +                        break;
       +                p++;
                }
       +        csiescseq.mode = *p;
        }
        
        /* for absolute user moves, when decom is set */
       @@ -1930,16 +1925,13 @@ strhandle(void) {
        
        void
        strparse(void) {
       -        char *p = strescseq.buf, *np, *sp;
       +        char *p = strescseq.buf, *sp;
        
       -        strescseq.narg = 0;
       -        np = strtok_r(strescseq.buf, ";", &sp);
       -        while(p < strescseq.buf+strescseq.len && np != NULL) {
       +        strescseq.buf[strescseq.len] = '\0';
       +        for(p = strtok_r(p, ";", &sp); p; p = strtok_r(NULL, ";", &sp)) {
       +                if(strescseq.narg == STR_ARG_SIZ)
       +                        return;
                        strescseq.args[strescseq.narg++] = p;
       -
       -                np = strtok_r(NULL, ";", &sp);
       -                if(np != NULL)
       -                        p = np;
                }
        }
        
       @@ -1951,7 +1943,9 @@ strdump(void) {
                printf("ESC%c", strescseq.type);
                for(i = 0; i < strescseq.len; i++) {
                        c = strescseq.buf[i] & 0xff;
       -                if(isprint(c)) {
       +                if(c == '\0') {
       +                        return;
       +                } else if(isprint(c)) {
                                putchar(c);
                        } else if(c == '\n') {
                                printf("(\\n)");
       @@ -2039,7 +2033,7 @@ tputc(char *c, int len) {
                                strhandle();
                                break;
                        default:
       -                        if(strescseq.len + len < sizeof(strescseq.buf)) {
       +                        if(strescseq.len + len < sizeof(strescseq.buf) - 1) {
                                        memmove(&strescseq.buf[strescseq.len], c, len);
                                        strescseq.len += len;
                                } else {