| tUsing strtol with overflow checking. - st - [fork] customized build of st, the… | |
| git clone git://src.adamsgaard.dk/st | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| commit 37863356b00cd41c24e10243121649473b98824f | |
| parent be7c6d7fb09ff50127332060d771b94a3bc8e44c | |
| Author: Christoph Lohmann <[email protected]> | |
| Date: Mon, 25 Feb 2013 13:23:56 +0100 | |
| Using strtol with overflow checking. | |
| Diffstat: | |
| M st.c | 18 ++++++++++++------ | |
| 1 file changed, 12 insertions(+), 6 deletions(-) | |
| --- | |
| diff --git a/st.c b/st.c | |
| t@@ -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 =… | |
| - } | |
| + 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 { | |
| t@@ -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; |