Using strsep and fixing null termination in csiparse. - 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 c6b89f23e7546c30dea42a3c49f99682c5818190
 (DIR) parent 1c1621da699adae49a4344b145f856dacb57270c
 (HTM) Author: Christoph Lohmann <20h@r-36.net>
       Date:   Tue, 26 Feb 2013 21:43:40 +0100
       
       Using strsep and fixing null termination in csiparse.
       
       Thanks for the hint from Alexander Sedov <alex0player@gmail.com>!
       
       Diffstat:
         M config.mk                           |       2 +-
         M st.c                                |      15 +++++++--------
       
       2 files changed, 8 insertions(+), 9 deletions(-)
       ---
 (DIR) diff --git a/config.mk b/config.mk
       @@ -19,7 +19,7 @@ LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lutil -lXext -lXft \
               $(shell pkg-config --libs freetype2)
        
        # flags
       -CPPFLAGS = -DVERSION=\"${VERSION}\"
       +CPPFLAGS = -DVERSION=\"${VERSION}\" -D_BSD_SOURCE -D_XOPEN_SOURCE=600
        CFLAGS += -g -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS}
        LDFLAGS += -g ${LIBS}
        
 (DIR) diff --git a/st.c b/st.c
       @@ -1,5 +1,4 @@
        /* See LICENSE for licence details. */
       -#define _XOPEN_SOURCE 600
        #include <ctype.h>
        #include <errno.h>
        #include <fcntl.h>
       @@ -1304,6 +1303,7 @@ csiparse(void) {
                        p++;
                }
        
       +        csiescseq.buf[csiescseq.len] = '\0';
                while(p < csiescseq.buf+csiescseq.len) {
                        np = NULL;
                        v = strtol(p, &np, 10);
       @@ -1925,14 +1925,12 @@ strhandle(void) {
        
        void
        strparse(void) {
       -        char *p = strescseq.buf, *sp;
       +        char *p = strescseq.buf;
        
       +        strescseq.narg = 0;
                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;
       -        }
       +        while(p && strescseq.narg < STR_ARG_SIZ)
       +                strescseq.args[strescseq.narg++] = strsep(&p, ";");
        }
        
        void
       @@ -2109,7 +2107,8 @@ tputc(char *c, int len) {
                        if(term.esc & ESC_CSI) {
                                csiescseq.buf[csiescseq.len++] = ascii;
                                if(BETWEEN(ascii, 0x40, 0x7E)
       -                                        || csiescseq.len >= ESC_BUF_SIZ) {
       +                                        || csiescseq.len >= \
       +                                        sizeof(csiescseq.buf)-1) {
                                        term.esc = 0;
                                        csiparse();
                                        csihandle();