summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2016-05-16 22:24:39 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2016-05-16 22:24:39 +0200
commit83f8d591689cae964ba58fbcf172f6a4fa7003ed (patch)
tree6e29365d89a006c313c48387ee5a4745be804e55
parent32e23bdb5939c879f947cd6c0ae423165646180c (diff)
downloadplan9front-83f8d591689cae964ba58fbcf172f6a4fa7003ed.tar.xz
cc: prevent symbol buffer overflow
-rw-r--r--sys/src/cmd/cc/lex.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/sys/src/cmd/cc/lex.c b/sys/src/cmd/cc/lex.c
index 837cf668c..bc05f3d1b 100644
--- a/sys/src/cmd/cc/lex.c
+++ b/sys/src/cmd/cc/lex.c
@@ -734,6 +734,8 @@ talph:
* prefix has been stored
*/
for(;;) {
+ if(cp >= &symb[NSYMB-UTFmax-1])
+ goto toolong;
if(c >= Runeself) {
for(c1=0;;) {
cp[c1++] = c;
@@ -782,6 +784,8 @@ tnum:
if(c != '0') {
c1 |= Numdec;
for(;;) {
+ if(cp >= &symb[NSYMB-1])
+ goto toolong;
*cp++ = c;
c = GETC();
if(isdigit(c))
@@ -793,6 +797,8 @@ tnum:
c = GETC();
if(c == 'x' || c == 'X')
for(;;) {
+ if(cp >= &symb[NSYMB-1])
+ goto toolong;
*cp++ = c;
c = GETC();
if(isdigit(c))
@@ -809,6 +815,8 @@ tnum:
goto dc;
for(;;) {
if(c >= '0' && c <= '7') {
+ if(cp >= &symb[NSYMB-1])
+ goto toolong;
*cp++ = c;
c = GETC();
continue;
@@ -880,6 +888,8 @@ nret:
casedot:
for(;;) {
+ if(cp >= &symb[NSYMB-1])
+ goto toolong;
*cp++ = c;
c = GETC();
if(!isdigit(c))
@@ -889,6 +899,8 @@ casedot:
goto caseout;
casee:
+ if(cp >= &symb[NSYMB-2])
+ goto toolong;
*cp++ = 'e';
c = GETC();
if(c == '+' || c == '-') {
@@ -898,6 +910,8 @@ casee:
if(!isdigit(c))
yyerror("malformed fp constant exponent");
while(isdigit(c)) {
+ if(cp >= &symb[NSYMB-1])
+ goto toolong;
*cp++ = c;
c = GETC();
}
@@ -921,6 +935,11 @@ caseout:
if(c1 & Numflt)
return LFCONST;
return LDCONST;
+
+toolong:
+ yyerror("token too long: %.*s...", (int)(cp-symb), symb);
+ errorexit();
+ return -1;
}
/*