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) | |
| download | st-transparency-37863356b00cd41c24e10243121649473b98824f.tar.gz st-transparency-37863356b00cd41c24e10243121649473b98824f.tar.xz st-transparency-37863356b00cd41c24e10243121649473b98824f.zip  | |
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;  | 
