diff options
author | Christoph Lohmann <20h@r-36.net> | 2013-02-26 21:43:40 +0100 |
---|---|---|
committer | Christoph Lohmann <20h@r-36.net> | 2013-02-26 21:43:40 +0100 |
commit | c6b89f23e7546c30dea42a3c49f99682c5818190 (patch) | |
tree | dc2f411410882c2c8b2abc95189ecc830704d09e | |
parent | 1c1621da699adae49a4344b145f856dacb57270c (diff) | |
download | st-c6b89f23e7546c30dea42a3c49f99682c5818190.tar.gz |
Using strsep and fixing null termination in csiparse.
Thanks for the hint from Alexander Sedov <alex0player@gmail.com>!
-rw-r--r-- | config.mk | 2 | ||||
-rw-r--r-- | st.c | 15 |
2 files changed, 8 insertions, 9 deletions
@@ -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} @@ -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(); |