Browse Source

Using strtol with overflow checking.

master
Christoph Lohmann 12 years ago
parent
commit
37863356b0
1 changed files with 12 additions and 6 deletions
  1. +12
    -6
      st.c

+ 12
- 6
st.c View File

@ -1296,17 +1296,22 @@ tnewline(int first_col) {
void void
csiparse(void) { csiparse(void) {
/* int noarg = 1; */ /* int noarg = 1; */
char *p = csiescseq.buf;
char *p = csiescseq.buf, *np;
long int v;
csiescseq.narg = 0; csiescseq.narg = 0;
if(*p == '?') if(*p == '?')
csiescseq.priv = 1, p++; csiescseq.priv = 1, p++;
while(p < csiescseq.buf+csiescseq.len) { while(p < csiescseq.buf+csiescseq.len) {
while(isdigit(*p)) {
csiescseq.arg[csiescseq.narg] *= 10;
csiescseq.arg[csiescseq.narg] += *p++ - '0'/*, noarg = 0 */;
}
np = NULL;
v = strtol(p, &np, 10);
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) { if(*p == ';' && csiescseq.narg+1 < ESC_ARG_SIZ) {
csiescseq.narg++, p++; csiescseq.narg++, p++;
} else { } else {
@ -2116,7 +2121,8 @@ tputc(char *c, int len) {
if(BETWEEN(ascii, 0x40, 0x7E) if(BETWEEN(ascii, 0x40, 0x7E)
|| csiescseq.len >= ESC_BUF_SIZ) { || csiescseq.len >= ESC_BUF_SIZ) {
term.esc = 0; term.esc = 0;
csiparse(), csihandle();
csiparse();
csihandle();
} }
} else if(term.esc & ESC_STR_END) { } else if(term.esc & ESC_STR_END) {
term.esc = 0; term.esc = 0;


Loading…
Cancel
Save