diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1999-06-17 14:04:03 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1999-06-17 14:04:03 -0300 |
commit | 36b6fe8d175bb2aec8fc55ffb090eab90cb12fd8 (patch) | |
tree | efa22fb54a0d354249d9f3c9e0a26118d6527bd0 /lparser.c | |
parent | d4dce57f5ca64c65c7c49eac683b8f807e8dc02d (diff) | |
download | lua-36b6fe8d175bb2aec8fc55ffb090eab90cb12fd8.tar.gz lua-36b6fe8d175bb2aec8fc55ffb090eab90cb12fd8.tar.bz2 lua-36b6fe8d175bb2aec8fc55ffb090eab90cb12fd8.zip |
better treatment for arbitrary limits
Diffstat (limited to 'lparser.c')
-rw-r--r-- | lparser.c | 50 |
1 files changed, 31 insertions, 19 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lparser.c,v 1.35 1999/06/16 13:22:04 roberto Exp roberto $ | 2 | ** $Id: lparser.c,v 1.36 1999/06/16 13:35:01 roberto Exp roberto $ |
3 | ** LL(1) Parser and code generator for Lua | 3 | ** LL(1) Parser and code generator for Lua |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -22,26 +22,32 @@ | |||
22 | #include "lzio.h" | 22 | #include "lzio.h" |
23 | 23 | ||
24 | 24 | ||
25 | /* for limit numbers in error messages */ | ||
26 | #define MES_LIM(x) "(limit=" x ")" | ||
27 | |||
28 | 25 | ||
29 | /* size of a "normal" jump instruction: OpCode + 1 byte */ | 26 | /* size of a "normal" jump instruction: OpCode + 1 byte */ |
30 | #define JMPSIZE 2 | 27 | #define JMPSIZE 2 |
31 | 28 | ||
32 | /* maximum number of local variables */ | 29 | /* maximum number of local variables */ |
33 | #define MAXLOCALS 200 | 30 | #ifndef MAXLOCALS |
34 | #define SMAXLOCALS "200" | 31 | #define MAXLOCALS 200 /* arbitrary limit (<256) */ |
32 | #endif | ||
35 | 33 | ||
36 | 34 | ||
37 | /* maximum number of upvalues */ | 35 | /* maximum number of upvalues */ |
38 | #define MAXUPVALUES 32 | 36 | #ifndef MAXUPVALUES |
39 | #define SMAXUPVALUES "32" | 37 | #define MAXUPVALUES 32 /* arbitrary limit (<256) */ |
38 | #endif | ||
40 | 39 | ||
41 | 40 | ||
42 | /* maximum number of variables in the left side of an assignment */ | 41 | /* maximum number of variables in the left side of an assignment */ |
43 | #define MAXVARSLH 100 | 42 | #ifndef MAXVARSLH |
44 | #define SMAXVARSLH "100" | 43 | #define MAXVARSLH 100 /* arbitrary limit (<255) */ |
44 | #endif | ||
45 | |||
46 | |||
47 | /* maximum number of parameters in a function */ | ||
48 | #ifndef MAXPARAMS | ||
49 | #define MAXPARAMS 100 /* arbitrary limit (<ZEROVARARG) */ | ||
50 | #endif | ||
45 | 51 | ||
46 | 52 | ||
47 | /* | 53 | /* |
@@ -136,6 +142,15 @@ static void var_or_func_tail (LexState *ls, vardesc *v); | |||
136 | 142 | ||
137 | 143 | ||
138 | 144 | ||
145 | static void checklimit (LexState *ls, int val, int limit, char *msg) { | ||
146 | if (val > limit) { | ||
147 | char buff[100]; | ||
148 | sprintf(buff, "too many %s (limit=%d)", msg, limit); | ||
149 | luaX_error(ls, buff); | ||
150 | } | ||
151 | } | ||
152 | |||
153 | |||
139 | static void check_pc (FuncState *fs, int n) { | 154 | static void check_pc (FuncState *fs, int n) { |
140 | luaM_growvector(fs->f->code, fs->pc, n, Byte, codeEM, MAX_INT); | 155 | luaM_growvector(fs->f->code, fs->pc, n, Byte, codeEM, MAX_INT); |
141 | } | 156 | } |
@@ -310,8 +325,7 @@ static void luaI_unregisterlocalvar (FuncState *fs, int line) { | |||
310 | 325 | ||
311 | static void store_localvar (LexState *ls, TaggedString *name, int n) { | 326 | static void store_localvar (LexState *ls, TaggedString *name, int n) { |
312 | FuncState *fs = ls->fs; | 327 | FuncState *fs = ls->fs; |
313 | if (fs->nlocalvar+n >= MAXLOCALS) | 328 | checklimit(ls, fs->nlocalvar+n+1, MAXLOCALS, "local variables"); |
314 | luaX_error(ls, "too many local variables " MES_LIM(SMAXLOCALS)); | ||
315 | fs->localvar[fs->nlocalvar+n] = name; | 329 | fs->localvar[fs->nlocalvar+n] = name; |
316 | luaI_registerlocalvar(fs, name, ls->linenumber); | 330 | luaI_registerlocalvar(fs, name, ls->linenumber); |
317 | } | 331 | } |
@@ -369,9 +383,8 @@ static int indexupvalue (LexState *ls, TaggedString *n) { | |||
369 | return i; | 383 | return i; |
370 | } | 384 | } |
371 | /* new one */ | 385 | /* new one */ |
372 | if (++(fs->nupvalues) > MAXUPVALUES) | 386 | ++(fs->nupvalues); |
373 | luaX_error(ls, "too many upvalues in a single function " | 387 | checklimit(ls, fs->nupvalues, MAXUPVALUES, "upvalues"); |
374 | MES_LIM(SMAXUPVALUES)); | ||
375 | fs->upvalues[i] = v; /* i = fs->nupvalues - 1 */ | 388 | fs->upvalues[i] = v; /* i = fs->nupvalues - 1 */ |
376 | return i; | 389 | return i; |
377 | } | 390 | } |
@@ -439,6 +452,7 @@ static void adjust_mult_assign (LexState *ls, int nvars, listdesc *d) { | |||
439 | static void code_args (LexState *ls, int nparams, int dots) { | 452 | static void code_args (LexState *ls, int nparams, int dots) { |
440 | FuncState *fs = ls->fs; | 453 | FuncState *fs = ls->fs; |
441 | fs->nlocalvar += nparams; /* "self" may already be there */ | 454 | fs->nlocalvar += nparams; /* "self" may already be there */ |
455 | checklimit(ls, fs->nlocalvar, MAXPARAMS, "parameters"); | ||
442 | nparams = fs->nlocalvar; | 456 | nparams = fs->nlocalvar; |
443 | if (!dots) { | 457 | if (!dots) { |
444 | fs->f->code[1] = (Byte)nparams; /* fill-in arg information */ | 458 | fs->f->code[1] = (Byte)nparams; /* fill-in arg information */ |
@@ -917,7 +931,7 @@ static int priority [POW+1] = {5, 5, 1, 1, 1, 1, 1, 1, 2, 3, 3, 4, 4, 6}; | |||
917 | static OpCode opcodes [POW+1] = {NOTOP, MINUSOP, EQOP, NEQOP, GTOP, LTOP, | 931 | static OpCode opcodes [POW+1] = {NOTOP, MINUSOP, EQOP, NEQOP, GTOP, LTOP, |
918 | LEOP, GEOP, CONCOP, ADDOP, SUBOP, MULTOP, DIVOP, POWOP}; | 932 | LEOP, GEOP, CONCOP, ADDOP, SUBOP, MULTOP, DIVOP, POWOP}; |
919 | 933 | ||
920 | #define MAXOPS 20 /* op's stack size */ | 934 | #define MAXOPS 20 /* op's stack size (arbitrary limit) */ |
921 | 935 | ||
922 | typedef struct stack_op { | 936 | typedef struct stack_op { |
923 | int ops[MAXOPS]; | 937 | int ops[MAXOPS]; |
@@ -1226,9 +1240,7 @@ static void decinit (LexState *ls, listdesc *d) { | |||
1226 | 1240 | ||
1227 | static int assignment (LexState *ls, vardesc *v, int nvars) { | 1241 | static int assignment (LexState *ls, vardesc *v, int nvars) { |
1228 | int left = 0; | 1242 | int left = 0; |
1229 | if (nvars > MAXVARSLH) | 1243 | checklimit(ls, nvars, MAXVARSLH, "variables in a multiple assignment"); |
1230 | luaX_error(ls, "too many variables in a multiple assignment " | ||
1231 | MES_LIM(SMAXVARSLH)); | ||
1232 | unloaddot(ls, v); | 1244 | unloaddot(ls, v); |
1233 | if (ls->token == ',') { /* assignment -> ',' NAME assignment */ | 1245 | if (ls->token == ',') { /* assignment -> ',' NAME assignment */ |
1234 | vardesc nv; | 1246 | vardesc nv; |