aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-03-26 17:46:10 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-03-26 17:46:10 -0300
commit81215cd59f58923ae9807d34f1dd46a51f400e4b (patch)
tree9317d562ae3ea5d54cd5487b220f6e0a20c259a3
parent0b9b53e21c30fff06ae39abc00a3c43ab5a18596 (diff)
downloadlua-81215cd59f58923ae9807d34f1dd46a51f400e4b.tar.gz
lua-81215cd59f58923ae9807d34f1dd46a51f400e4b.tar.bz2
lua-81215cd59f58923ae9807d34f1dd46a51f400e4b.zip
simpler way to control stack overflow
-rw-r--r--lapi.c4
-rw-r--r--ldo.c73
-rw-r--r--llimits.h14
-rw-r--r--lstate.h4
4 files changed, 51 insertions, 44 deletions
diff --git a/lapi.c b/lapi.c
index 7f696443..1f8d296f 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lapi.c,v 1.178 2002/03/18 20:11:52 roberto Exp roberto $ 2** $Id: lapi.c,v 1.179 2002/03/20 12:51:29 roberto Exp roberto $
3** Lua API 3** Lua API
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -85,7 +85,7 @@ void luaA_pushobject (lua_State *L, const TObject *o) {
85LUA_API int lua_checkstack (lua_State *L, int size) { 85LUA_API int lua_checkstack (lua_State *L, int size) {
86 int res; 86 int res;
87 lua_lock(L); 87 lua_lock(L);
88 if ((L->top - L->stack) >= LUA_MAXSTACK - size) 88 if ((L->top - L->ci->base + size) > LUA_MAXCSTACK)
89 res = 0; /* stack overflow */ 89 res = 0; /* stack overflow */
90 else { 90 else {
91 luaD_checkstack(L, size); 91 luaD_checkstack(L, size);
diff --git a/ldo.c b/ldo.c
index 3e0053f4..b0a0bd25 100644
--- a/ldo.c
+++ b/ldo.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldo.c,v 1.166 2002/03/25 17:47:14 roberto Exp roberto $ 2** $Id: ldo.c,v 1.167 2002/03/25 19:45:06 roberto Exp roberto $
3** Stack and Call structure of Lua 3** Stack and Call structure of Lua
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -70,30 +70,51 @@ void luaD_reallocstack (lua_State *L, int newsize) {
70} 70}
71 71
72 72
73static void correctCI (lua_State *L, CallInfo *oldci) {
74 struct lua_longjmp *lj;
75 for (lj = L->errorJmp; lj != NULL; lj = lj->previous) {
76 lj->ci = (lj->ci - oldci) + L->base_ci;
77 }
78}
79
80
81void luaD_reallocCI (lua_State *L, int newsize) {
82 CallInfo *oldci = L->base_ci;
83 luaM_reallocvector(L, L->base_ci, L->size_ci, newsize, CallInfo);
84 L->size_ci = newsize;
85 L->ci = (L->ci - oldci) + L->base_ci;
86 L->end_ci = L->base_ci + L->size_ci;
87 correctCI(L, oldci);
88}
89
90
73static void restore_stack_limit (lua_State *L) { 91static void restore_stack_limit (lua_State *L) {
74 if (L->stacksize > LUA_MAXSTACK) { /* there was an overflow? */ 92 if (L->size_ci > LUA_MAXCALLS) { /* there was an overflow? */
75 int inuse = (L->top - L->stack); 93 int inuse = (L->ci - L->base_ci);
76 if (inuse + MAXSTACK < LUA_MAXSTACK) /* can `undo' overflow? */ 94 if (inuse + 1 < LUA_MAXCALLS) /* can `undo' overflow? */
77 luaD_reallocstack(L, LUA_MAXSTACK); 95 luaD_reallocCI(L, LUA_MAXCALLS);
78 } 96 }
79} 97}
80 98
81 99
82void luaD_growstack (lua_State *L, int n) { 100void luaD_growstack (lua_State *L, int n) {
83 if (L->stacksize > LUA_MAXSTACK) { /* overflow while handling overflow? */ 101 if (n <= L->stacksize) /* double size is enough? */
102 luaD_reallocstack(L, 2*L->stacksize);
103 else
104 luaD_reallocstack(L, L->stacksize + n + EXTRA_STACK);
105}
106
107
108static void luaD_growCI (lua_State *L) {
109 L->ci--;
110 if (L->size_ci > LUA_MAXCALLS) /* overflow while handling overflow? */
84 luaD_breakrun(L, LUA_ERRERR); /* break run without error message */ 111 luaD_breakrun(L, LUA_ERRERR); /* break run without error message */
85 }
86 else { 112 else {
87 if (n <= L->stacksize && 2*L->stacksize < LUA_MAXSTACK) /* can double? */ 113 luaD_reallocCI(L, 2*L->size_ci);
88 luaD_reallocstack(L, 2*L->stacksize); 114 if (L->size_ci > LUA_MAXCALLS)
89 else if ((L->top - L->stack) + n <= LUA_MAXSTACK) /* no overflow? */
90 luaD_reallocstack(L, LUA_MAXSTACK);
91 else {
92 /* resize to maximum + some extra space to handle error */
93 luaD_reallocstack(L, LUA_MAXSTACK+4*LUA_MINSTACK);
94 luaD_error(L, "stack overflow"); 115 luaD_error(L, "stack overflow");
95 }
96 } 116 }
117 L->ci++;
97} 118}
98 119
99 120
@@ -145,26 +166,6 @@ static void luaD_callHook (lua_State *L, lua_Hook callhook, const char *event) {
145} 166}
146 167
147 168
148static void correctCI (lua_State *L, CallInfo *oldci) {
149 struct lua_longjmp *lj;
150 for (lj = L->errorJmp; lj != NULL; lj = lj->previous) {
151 lj->ci = (lj->ci - oldci) + L->base_ci;
152 }
153}
154
155
156void luaD_reallocCI (lua_State *L, int newsize) {
157 CallInfo *oldci = L->base_ci;
158 luaM_reallocvector(L, L->base_ci, L->size_ci, newsize, CallInfo);
159 L->size_ci = newsize;
160 if (oldci != L->ci) {
161 L->ci = (L->ci - oldci) + L->base_ci;
162 L->end_ci = L->base_ci + L->size_ci;
163 correctCI(L, oldci);
164 }
165}
166
167
168static void adjust_varargs (lua_State *L, int nfixargs) { 169static void adjust_varargs (lua_State *L, int nfixargs) {
169 int i; 170 int i;
170 Table *htab; 171 Table *htab;
@@ -205,7 +206,7 @@ static StkId tryfuncTM (lua_State *L, StkId func) {
205StkId luaD_precall (lua_State *L, StkId func) { 206StkId luaD_precall (lua_State *L, StkId func) {
206 CallInfo *ci; 207 CallInfo *ci;
207 LClosure *cl; 208 LClosure *cl;
208 if (++L->ci == L->end_ci) luaD_reallocCI(L, 2*L->size_ci); 209 if (++L->ci == L->end_ci) luaD_growCI(L);
209 ci = L->ci; 210 ci = L->ci;
210 ci->base = ci->top = func+1; /* pre-init `top' in case of errors */ 211 ci->base = ci->top = func+1; /* pre-init `top' in case of errors */
211 ci->pc = NULL; 212 ci->pc = NULL;
diff --git a/llimits.h b/llimits.h
index 4633284b..f953861f 100644
--- a/llimits.h
+++ b/llimits.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: llimits.h,v 1.40 2002/03/14 18:01:52 roberto Exp roberto $ 2** $Id: llimits.h,v 1.41 2002/03/18 18:16:16 roberto Exp roberto $
3** Limits, basic types, and some other `installation-dependent' definitions 3** Limits, basic types, and some other `installation-dependent' definitions
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -101,9 +101,15 @@ union L_Umaxalign { LUSER_ALIGNMENT_T u; void *s; long l; };
101typedef unsigned long Instruction; 101typedef unsigned long Instruction;
102 102
103 103
104/* maximum size for the Lua stack */ 104/* maximum depth for calls */
105#ifndef LUA_MAXSTACK 105#ifndef LUA_MAXCALLS
106#define LUA_MAXSTACK 14000 106#define LUA_MAXCALLS 2048
107#endif
108
109
110/* maximum size for the C stack */
111#ifndef LUA_MAXCSTACK
112#define LUA_MAXCSTACK 2048
107#endif 113#endif
108 114
109 115
diff --git a/lstate.h b/lstate.h
index ee91e853..a7ec7e2c 100644
--- a/lstate.h
+++ b/lstate.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lstate.h,v 1.79 2002/03/11 12:45:00 roberto Exp roberto $ 2** $Id: lstate.h,v 1.80 2002/03/25 17:47:14 roberto Exp roberto $
3** Global State 3** Global State
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -69,7 +69,7 @@ struct lua_longjmp; /* defined in ldo.c */
69#define EXTRA_STACK 4 69#define EXTRA_STACK 4
70 70
71 71
72#define BASIC_CI_SIZE 6 72#define BASIC_CI_SIZE 8
73 73
74#define BASIC_STACK_SIZE (2*LUA_MINSTACK) 74#define BASIC_STACK_SIZE (2*LUA_MINSTACK)
75 75