Using strtol with overflow checking.
This commit is contained in:
parent
be7c6d7fb0
commit
37863356b0
18
st.c
18
st.c
@ -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)) {
|
np = NULL;
|
||||||
csiescseq.arg[csiescseq.narg] *= 10;
|
v = strtol(p, &np, 10);
|
||||||
csiescseq.arg[csiescseq.narg] += *p++ - '0'/*, noarg = 0 */;
|
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…
Reference in New Issue
Block a user