Procházet zdrojové kódy

Using strsep and fixing null termination in csiparse.

Thanks for the hint from Alexander Sedov <alex0player@gmail.com>!
Christoph Lohmann před 12 roky
rodič
revize
c6b89f23e7
2 změnil soubory, kde provedl 8 přidání a 9 odebrání
  1. 1 1
      config.mk
  2. 7 8
      st.c

+ 1 - 1
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}
 

+ 7 - 8
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();