Fixing bugs in the strtol and strtok_r replacements.

Thanks "Roberto E. Vargas Caballero" <k0ga@shike2.com> for the comments!
This commit is contained in:
Christoph Lohmann 2013-02-26 18:19:44 +01:00
parent 7cb0d95509
commit 7d32471eff
1 changed files with 17 additions and 23 deletions

40
st.c
View File

@ -1306,23 +1306,18 @@ csiparse(void) {
} }
while(p < csiescseq.buf+csiescseq.len) { while(p < csiescseq.buf+csiescseq.len) {
np = NULL;
v = strtol(p, &np, 10); v = strtol(p, &np, 10);
if(np == p)
break;
if(v == LONG_MAX || v == LONG_MIN) if(v == LONG_MAX || v == LONG_MIN)
v = -1; v = -1;
csiescseq.arg[csiescseq.narg] = v; csiescseq.arg[csiescseq.narg++] = v;
if(np != NULL) p = np;
p = np; if(*p != ';' || csiescseq.narg == ESC_ARG_SIZ)
break;
if(*p == ';' && csiescseq.narg+1 < ESC_ARG_SIZ) { p++;
csiescseq.narg++, p++;
} else {
csiescseq.mode = *p;
csiescseq.narg++;
return;
}
} }
csiescseq.mode = *p;
} }
/* for absolute user moves, when decom is set */ /* for absolute user moves, when decom is set */
@ -1930,16 +1925,13 @@ strhandle(void) {
void void
strparse(void) { strparse(void) {
char *p = strescseq.buf, *np, *sp; char *p = strescseq.buf, *sp;
strescseq.narg = 0; strescseq.buf[strescseq.len] = '\0';
np = strtok_r(strescseq.buf, ";", &sp); for(p = strtok_r(p, ";", &sp); p; p = strtok_r(NULL, ";", &sp)) {
while(p < strescseq.buf+strescseq.len && np != NULL) { if(strescseq.narg == STR_ARG_SIZ)
return;
strescseq.args[strescseq.narg++] = p; 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); printf("ESC%c", strescseq.type);
for(i = 0; i < strescseq.len; i++) { for(i = 0; i < strescseq.len; i++) {
c = strescseq.buf[i] & 0xff; c = strescseq.buf[i] & 0xff;
if(isprint(c)) { if(c == '\0') {
return;
} else if(isprint(c)) {
putchar(c); putchar(c);
} else if(c == '\n') { } else if(c == '\n') {
printf("(\\n)"); printf("(\\n)");
@ -2039,7 +2033,7 @@ tputc(char *c, int len) {
strhandle(); strhandle();
break; break;
default: default:
if(strescseq.len + len < sizeof(strescseq.buf)) { if(strescseq.len + len < sizeof(strescseq.buf) - 1) {
memmove(&strescseq.buf[strescseq.len], c, len); memmove(&strescseq.buf[strescseq.len], c, len);
strescseq.len += len; strescseq.len += len;
} else { } else {