diff options
author | Christoph Lohmann <20h@r-36.net> | 2013-02-25 13:23:56 +0100 |
---|---|---|
committer | Christoph Lohmann <20h@r-36.net> | 2013-02-25 13:23:56 +0100 |
commit | 37863356b00cd41c24e10243121649473b98824f (patch) | |
tree | 44268518a1b4f425487aff918d0d68f900806d7c | |
parent | be7c6d7fb09ff50127332060d771b94a3bc8e44c (diff) |
Using strtol with overflow checking.
-rw-r--r-- | st.c | 18 |
1 files changed, 12 insertions, 6 deletions
@@ -1296,17 +1296,22 @@ tnewline(int first_col) { void csiparse(void) { /* int noarg = 1; */ - char *p = csiescseq.buf; + char *p = csiescseq.buf, *np; + long int v; csiescseq.narg = 0; if(*p == '?') csiescseq.priv = 1, p++; 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) { csiescseq.narg++, p++; } else { @@ -2116,7 +2121,8 @@ tputc(char *c, int len) { if(BETWEEN(ascii, 0x40, 0x7E) || csiescseq.len >= ESC_BUF_SIZ) { term.esc = 0; - csiparse(), csihandle(); + csiparse(); + csihandle(); } } else if(term.esc & ESC_STR_END) { term.esc = 0; |