fix operator table overflow causing hangs and wierd behavior as reported on 9fans. example code follows. it is quite rude, but the point of cpp is to handle rude code. (i also deleted some unused code.) #if (' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126) /* The character set is ASCII or one of its variants or extensions, not EBCDIC. Testing the value of '\n' and '\r' is not relevant. */ #define C_CTYPE_ASCII 1 #endif #include Reference: /n/sources/patch/applied/cppbigif Date: Tue Jul 26 03:40:53 CES 2011 Signed-off-by: quanstro@quanstro.net --- /sys/src/cmd/cpp/eval.c Tue Jul 26 03:40:43 2011 +++ /sys/src/cmd/cpp/eval.c Tue Jul 26 03:40:42 2011 @@ -2,7 +2,7 @@ #include #include "cpp.h" -#define NSTAK 32 +#define NSTAK 1024 #define SGN 0 #define UNS 1 #define UND 2 @@ -92,8 +92,8 @@ int evalop(struct pri); struct value tokval(Token *); -struct value vals[NSTAK], *vp; -enum toktype ops[NSTAK], *op; +struct value vals[NSTAK + 1], *vp; +enum toktype ops[NSTAK + 1], *op; /* * Evaluate an #if #elif #ifdef #ifndef line. trp->tp points to the keyword. @@ -122,6 +122,8 @@ op = ops; *op++ = END; for (rand=0, tp = trp->bp+ntok; tp < trp->lp; tp++) { + if(op >= ops + NSTAK) + sysfatal("cpp: can't evalute #if: increase NSTAK"); switch(tp->type) { case WS: case NL: --- /sys/src/cmd/cpp/lex.c Tue Jul 26 03:40:46 2011 +++ /sys/src/cmd/cpp/lex.c Tue Jul 26 03:40:45 2011 @@ -45,8 +45,6 @@ S_STNL, S_COMNL, S_EOFCOM, S_COMMENT, S_EOB, S_WS, S_NAME }; -int tottok; -int tokkind[256]; struct fsm { int state; /* if in this state */ uchar ch[4]; /* and see one of these characters */