--- /sys/src/cmd/cc/lex.c +++ /sys/src/cmd/cc/lex.c @@ -727,6 +727,8 @@ * prefix has been stored */ for(;;) { + if(cp >= &symb[NSYMB-UTFmax-1]) + goto toolong; if(c >= Runeself) { for(c1=0;;) { cp[c1++] = c; @@ -775,6 +777,8 @@ if(c != '0') { c1 |= Numdec; for(;;) { + if(cp >= &symb[NSYMB-1]) + goto toolong; *cp++ = c; c = GETC(); if(isdigit(c)) @@ -786,6 +790,8 @@ c = GETC(); if(c == 'x' || c == 'X') for(;;) { + if(cp >= &symb[NSYMB-1]) + goto toolong; *cp++ = c; c = GETC(); if(isdigit(c)) @@ -802,6 +808,8 @@ goto dc; for(;;) { if(c >= '0' && c <= '7') { + if(cp >= &symb[NSYMB-1]) + goto toolong; *cp++ = c; c = GETC(); continue; @@ -873,6 +881,8 @@ casedot: for(;;) { + if(cp >= &symb[NSYMB-1]) + goto toolong; *cp++ = c; c = GETC(); if(!isdigit(c)) @@ -882,6 +892,8 @@ goto caseout; casee: + if(cp >= &symb[NSYMB-2]) + goto toolong; *cp++ = 'e'; c = GETC(); if(c == '+' || c == '-') { @@ -891,6 +903,8 @@ if(!isdigit(c)) yyerror("malformed fp constant exponent"); while(isdigit(c)) { + if(cp >= &symb[NSYMB-1]) + goto toolong; *cp++ = c; c = GETC(); } @@ -914,6 +928,11 @@ if(c1 & Numflt) return LFCONST; return LDCONST; + +toolong: + yyerror("token too long: %.*s...", utfnlen(symb, cp-symb), symb); + errorexit(); + return -1; } /*