immunio 0.15.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (157) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +234 -0
  3. data/README.md +147 -0
  4. data/bin/immunio +5 -0
  5. data/lib/immunio.rb +29 -0
  6. data/lib/immunio/agent.rb +260 -0
  7. data/lib/immunio/authentication.rb +96 -0
  8. data/lib/immunio/blocked_app.rb +38 -0
  9. data/lib/immunio/channel.rb +432 -0
  10. data/lib/immunio/cli.rb +39 -0
  11. data/lib/immunio/context.rb +114 -0
  12. data/lib/immunio/errors.rb +43 -0
  13. data/lib/immunio/immunio_ca.crt +45 -0
  14. data/lib/immunio/logger.rb +87 -0
  15. data/lib/immunio/plugins/action_dispatch.rb +45 -0
  16. data/lib/immunio/plugins/action_view.rb +431 -0
  17. data/lib/immunio/plugins/active_record.rb +707 -0
  18. data/lib/immunio/plugins/active_record_relation.rb +370 -0
  19. data/lib/immunio/plugins/authlogic.rb +80 -0
  20. data/lib/immunio/plugins/csrf.rb +24 -0
  21. data/lib/immunio/plugins/devise.rb +40 -0
  22. data/lib/immunio/plugins/environment_reporter.rb +69 -0
  23. data/lib/immunio/plugins/eval.rb +51 -0
  24. data/lib/immunio/plugins/exception_handler.rb +55 -0
  25. data/lib/immunio/plugins/gems_tracker.rb +5 -0
  26. data/lib/immunio/plugins/haml.rb +36 -0
  27. data/lib/immunio/plugins/http_finisher.rb +50 -0
  28. data/lib/immunio/plugins/http_tracker.rb +203 -0
  29. data/lib/immunio/plugins/io.rb +96 -0
  30. data/lib/immunio/plugins/redirect.rb +42 -0
  31. data/lib/immunio/plugins/warden.rb +66 -0
  32. data/lib/immunio/processor.rb +234 -0
  33. data/lib/immunio/rails.rb +26 -0
  34. data/lib/immunio/request.rb +139 -0
  35. data/lib/immunio/rufus_lua_ext/ref.rb +27 -0
  36. data/lib/immunio/rufus_lua_ext/state.rb +157 -0
  37. data/lib/immunio/rufus_lua_ext/table.rb +137 -0
  38. data/lib/immunio/rufus_lua_ext/utils.rb +13 -0
  39. data/lib/immunio/version.rb +5 -0
  40. data/lib/immunio/vm.rb +291 -0
  41. data/lua-hooks/ext/all.c +78 -0
  42. data/lua-hooks/ext/bitop/README +22 -0
  43. data/lua-hooks/ext/bitop/bit.c +189 -0
  44. data/lua-hooks/ext/extconf.rb +38 -0
  45. data/lua-hooks/ext/libinjection/COPYING +37 -0
  46. data/lua-hooks/ext/libinjection/libinjection.h +65 -0
  47. data/lua-hooks/ext/libinjection/libinjection_html5.c +847 -0
  48. data/lua-hooks/ext/libinjection/libinjection_html5.h +54 -0
  49. data/lua-hooks/ext/libinjection/libinjection_sqli.c +2301 -0
  50. data/lua-hooks/ext/libinjection/libinjection_sqli.h +295 -0
  51. data/lua-hooks/ext/libinjection/libinjection_sqli_data.h +9349 -0
  52. data/lua-hooks/ext/libinjection/libinjection_xss.c +531 -0
  53. data/lua-hooks/ext/libinjection/libinjection_xss.h +21 -0
  54. data/lua-hooks/ext/libinjection/lualib.c +109 -0
  55. data/lua-hooks/ext/lpeg/HISTORY +90 -0
  56. data/lua-hooks/ext/lpeg/lpcap.c +537 -0
  57. data/lua-hooks/ext/lpeg/lpcap.h +43 -0
  58. data/lua-hooks/ext/lpeg/lpcode.c +986 -0
  59. data/lua-hooks/ext/lpeg/lpcode.h +34 -0
  60. data/lua-hooks/ext/lpeg/lpeg-128.gif +0 -0
  61. data/lua-hooks/ext/lpeg/lpeg.html +1429 -0
  62. data/lua-hooks/ext/lpeg/lpprint.c +244 -0
  63. data/lua-hooks/ext/lpeg/lpprint.h +35 -0
  64. data/lua-hooks/ext/lpeg/lptree.c +1238 -0
  65. data/lua-hooks/ext/lpeg/lptree.h +77 -0
  66. data/lua-hooks/ext/lpeg/lptypes.h +149 -0
  67. data/lua-hooks/ext/lpeg/lpvm.c +355 -0
  68. data/lua-hooks/ext/lpeg/lpvm.h +58 -0
  69. data/lua-hooks/ext/lpeg/makefile +55 -0
  70. data/lua-hooks/ext/lpeg/re.html +498 -0
  71. data/lua-hooks/ext/lpeg/test.lua +1409 -0
  72. data/lua-hooks/ext/lua-cmsgpack/CMakeLists.txt +45 -0
  73. data/lua-hooks/ext/lua-cmsgpack/README.md +115 -0
  74. data/lua-hooks/ext/lua-cmsgpack/lua_cmsgpack.c +957 -0
  75. data/lua-hooks/ext/lua-cmsgpack/test.lua +570 -0
  76. data/lua-hooks/ext/lua-snapshot/LICENSE +7 -0
  77. data/lua-hooks/ext/lua-snapshot/Makefile +12 -0
  78. data/lua-hooks/ext/lua-snapshot/README.md +18 -0
  79. data/lua-hooks/ext/lua-snapshot/dump.lua +15 -0
  80. data/lua-hooks/ext/lua-snapshot/snapshot.c +455 -0
  81. data/lua-hooks/ext/lua/COPYRIGHT +34 -0
  82. data/lua-hooks/ext/lua/lapi.c +1087 -0
  83. data/lua-hooks/ext/lua/lapi.h +16 -0
  84. data/lua-hooks/ext/lua/lauxlib.c +652 -0
  85. data/lua-hooks/ext/lua/lauxlib.h +174 -0
  86. data/lua-hooks/ext/lua/lbaselib.c +659 -0
  87. data/lua-hooks/ext/lua/lcode.c +831 -0
  88. data/lua-hooks/ext/lua/lcode.h +76 -0
  89. data/lua-hooks/ext/lua/ldblib.c +398 -0
  90. data/lua-hooks/ext/lua/ldebug.c +638 -0
  91. data/lua-hooks/ext/lua/ldebug.h +33 -0
  92. data/lua-hooks/ext/lua/ldo.c +519 -0
  93. data/lua-hooks/ext/lua/ldo.h +57 -0
  94. data/lua-hooks/ext/lua/ldump.c +164 -0
  95. data/lua-hooks/ext/lua/lfunc.c +174 -0
  96. data/lua-hooks/ext/lua/lfunc.h +34 -0
  97. data/lua-hooks/ext/lua/lgc.c +710 -0
  98. data/lua-hooks/ext/lua/lgc.h +110 -0
  99. data/lua-hooks/ext/lua/linit.c +38 -0
  100. data/lua-hooks/ext/lua/liolib.c +556 -0
  101. data/lua-hooks/ext/lua/llex.c +463 -0
  102. data/lua-hooks/ext/lua/llex.h +81 -0
  103. data/lua-hooks/ext/lua/llimits.h +128 -0
  104. data/lua-hooks/ext/lua/lmathlib.c +263 -0
  105. data/lua-hooks/ext/lua/lmem.c +86 -0
  106. data/lua-hooks/ext/lua/lmem.h +49 -0
  107. data/lua-hooks/ext/lua/loadlib.c +705 -0
  108. data/lua-hooks/ext/lua/loadlib_rel.c +760 -0
  109. data/lua-hooks/ext/lua/lobject.c +214 -0
  110. data/lua-hooks/ext/lua/lobject.h +381 -0
  111. data/lua-hooks/ext/lua/lopcodes.c +102 -0
  112. data/lua-hooks/ext/lua/lopcodes.h +268 -0
  113. data/lua-hooks/ext/lua/loslib.c +243 -0
  114. data/lua-hooks/ext/lua/lparser.c +1339 -0
  115. data/lua-hooks/ext/lua/lparser.h +82 -0
  116. data/lua-hooks/ext/lua/lstate.c +214 -0
  117. data/lua-hooks/ext/lua/lstate.h +169 -0
  118. data/lua-hooks/ext/lua/lstring.c +111 -0
  119. data/lua-hooks/ext/lua/lstring.h +31 -0
  120. data/lua-hooks/ext/lua/lstrlib.c +871 -0
  121. data/lua-hooks/ext/lua/ltable.c +588 -0
  122. data/lua-hooks/ext/lua/ltable.h +40 -0
  123. data/lua-hooks/ext/lua/ltablib.c +287 -0
  124. data/lua-hooks/ext/lua/ltm.c +75 -0
  125. data/lua-hooks/ext/lua/ltm.h +54 -0
  126. data/lua-hooks/ext/lua/lua.c +392 -0
  127. data/lua-hooks/ext/lua/lua.def +131 -0
  128. data/lua-hooks/ext/lua/lua.h +388 -0
  129. data/lua-hooks/ext/lua/lua.rc +28 -0
  130. data/lua-hooks/ext/lua/lua_dll.rc +26 -0
  131. data/lua-hooks/ext/lua/luac.c +200 -0
  132. data/lua-hooks/ext/lua/luac.rc +1 -0
  133. data/lua-hooks/ext/lua/luaconf.h +763 -0
  134. data/lua-hooks/ext/lua/luaconf.h.in +724 -0
  135. data/lua-hooks/ext/lua/luaconf.h.orig +763 -0
  136. data/lua-hooks/ext/lua/lualib.h +53 -0
  137. data/lua-hooks/ext/lua/lundump.c +227 -0
  138. data/lua-hooks/ext/lua/lundump.h +36 -0
  139. data/lua-hooks/ext/lua/lvm.c +767 -0
  140. data/lua-hooks/ext/lua/lvm.h +36 -0
  141. data/lua-hooks/ext/lua/lzio.c +82 -0
  142. data/lua-hooks/ext/lua/lzio.h +67 -0
  143. data/lua-hooks/ext/lua/print.c +227 -0
  144. data/lua-hooks/ext/luautf8/README.md +152 -0
  145. data/lua-hooks/ext/luautf8/lutf8lib.c +1274 -0
  146. data/lua-hooks/ext/luautf8/unidata.h +3064 -0
  147. data/lua-hooks/lib/boot.lua +254 -0
  148. data/lua-hooks/lib/encode.lua +4 -0
  149. data/lua-hooks/lib/lexers/LICENSE +21 -0
  150. data/lua-hooks/lib/lexers/bash.lua +134 -0
  151. data/lua-hooks/lib/lexers/bash_dqstr.lua +62 -0
  152. data/lua-hooks/lib/lexers/css.lua +216 -0
  153. data/lua-hooks/lib/lexers/html.lua +106 -0
  154. data/lua-hooks/lib/lexers/javascript.lua +68 -0
  155. data/lua-hooks/lib/lexers/lexer.lua +1575 -0
  156. data/lua-hooks/lib/lexers/markers.lua +33 -0
  157. metadata +308 -0
@@ -0,0 +1,33 @@
1
+ /*
2
+ ** $Id: ldebug.h,v 2.3.1.1 2007/12/27 13:02:25 roberto Exp $
3
+ ** Auxiliary functions from Debug Interface module
4
+ ** See Copyright Notice in lua.h
5
+ */
6
+
7
+ #ifndef ldebug_h
8
+ #define ldebug_h
9
+
10
+
11
+ #include "lstate.h"
12
+
13
+
14
+ #define pcRel(pc, p) (cast(int, (pc) - (p)->code) - 1)
15
+
16
+ #define lgetline(f,pc) (((f)->lineinfo) ? (f)->lineinfo[pc] : 0)
17
+
18
+ #define resethookcount(L) (L->hookcount = L->basehookcount)
19
+
20
+
21
+ LUAI_FUNC void luaG_typeerror (lua_State *L, const TValue *o,
22
+ const char *opname);
23
+ LUAI_FUNC void luaG_concaterror (lua_State *L, StkId p1, StkId p2);
24
+ LUAI_FUNC void luaG_aritherror (lua_State *L, const TValue *p1,
25
+ const TValue *p2);
26
+ LUAI_FUNC int luaG_ordererror (lua_State *L, const TValue *p1,
27
+ const TValue *p2);
28
+ LUAI_FUNC void luaG_runerror (lua_State *L, const char *fmt, ...);
29
+ LUAI_FUNC void luaG_errormsg (lua_State *L);
30
+ LUAI_FUNC int luaG_checkcode (const Proto *pt);
31
+ LUAI_FUNC int luaG_checkopenop (Instruction i);
32
+
33
+ #endif
@@ -0,0 +1,519 @@
1
+ /*
2
+ ** $Id: ldo.c,v 2.38.1.4 2012/01/18 02:27:10 roberto Exp $
3
+ ** Stack and Call structure of Lua
4
+ ** See Copyright Notice in lua.h
5
+ */
6
+
7
+
8
+ #include <setjmp.h>
9
+ #include <stdlib.h>
10
+ #include <string.h>
11
+
12
+ #define ldo_c
13
+ #define LUA_CORE
14
+
15
+ #include "lua.h"
16
+
17
+ #include "ldebug.h"
18
+ #include "ldo.h"
19
+ #include "lfunc.h"
20
+ #include "lgc.h"
21
+ #include "lmem.h"
22
+ #include "lobject.h"
23
+ #include "lopcodes.h"
24
+ #include "lparser.h"
25
+ #include "lstate.h"
26
+ #include "lstring.h"
27
+ #include "ltable.h"
28
+ #include "ltm.h"
29
+ #include "lundump.h"
30
+ #include "lvm.h"
31
+ #include "lzio.h"
32
+
33
+
34
+
35
+
36
+ /*
37
+ ** {======================================================
38
+ ** Error-recovery functions
39
+ ** =======================================================
40
+ */
41
+
42
+
43
+ /* chain list of long jump buffers */
44
+ struct lua_longjmp {
45
+ struct lua_longjmp *previous;
46
+ luai_jmpbuf b;
47
+ volatile int status; /* error code */
48
+ };
49
+
50
+
51
+ void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop) {
52
+ switch (errcode) {
53
+ case LUA_ERRMEM: {
54
+ setsvalue2s(L, oldtop, luaS_newliteral(L, MEMERRMSG));
55
+ break;
56
+ }
57
+ case LUA_ERRERR: {
58
+ setsvalue2s(L, oldtop, luaS_newliteral(L, "error in error handling"));
59
+ break;
60
+ }
61
+ case LUA_ERRSYNTAX:
62
+ case LUA_ERRRUN: {
63
+ setobjs2s(L, oldtop, L->top - 1); /* error message on current top */
64
+ break;
65
+ }
66
+ }
67
+ L->top = oldtop + 1;
68
+ }
69
+
70
+
71
+ static void restore_stack_limit (lua_State *L) {
72
+ lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK - 1);
73
+ if (L->size_ci > LUAI_MAXCALLS) { /* there was an overflow? */
74
+ int inuse = cast_int(L->ci - L->base_ci);
75
+ if (inuse + 1 < LUAI_MAXCALLS) /* can `undo' overflow? */
76
+ luaD_reallocCI(L, LUAI_MAXCALLS);
77
+ }
78
+ }
79
+
80
+
81
+ static void resetstack (lua_State *L, int status) {
82
+ L->ci = L->base_ci;
83
+ L->base = L->ci->base;
84
+ luaF_close(L, L->base); /* close eventual pending closures */
85
+ luaD_seterrorobj(L, status, L->base);
86
+ L->nCcalls = L->baseCcalls;
87
+ L->allowhook = 1;
88
+ restore_stack_limit(L);
89
+ L->errfunc = 0;
90
+ L->errorJmp = NULL;
91
+ }
92
+
93
+
94
+ void luaD_throw (lua_State *L, int errcode) {
95
+ if (L->errorJmp) {
96
+ L->errorJmp->status = errcode;
97
+ LUAI_THROW(L, L->errorJmp);
98
+ }
99
+ else {
100
+ L->status = cast_byte(errcode);
101
+ if (G(L)->panic) {
102
+ resetstack(L, errcode);
103
+ lua_unlock(L);
104
+ G(L)->panic(L);
105
+ }
106
+ exit(EXIT_FAILURE);
107
+ }
108
+ }
109
+
110
+
111
+ int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) {
112
+ struct lua_longjmp lj;
113
+ lj.status = 0;
114
+ lj.previous = L->errorJmp; /* chain new error handler */
115
+ L->errorJmp = &lj;
116
+ LUAI_TRY(L, &lj,
117
+ (*f)(L, ud);
118
+ );
119
+ L->errorJmp = lj.previous; /* restore old error handler */
120
+ return lj.status;
121
+ }
122
+
123
+ /* }====================================================== */
124
+
125
+
126
+ static void correctstack (lua_State *L, TValue *oldstack) {
127
+ CallInfo *ci;
128
+ GCObject *up;
129
+ L->top = (L->top - oldstack) + L->stack;
130
+ for (up = L->openupval; up != NULL; up = up->gch.next)
131
+ gco2uv(up)->v = (gco2uv(up)->v - oldstack) + L->stack;
132
+ for (ci = L->base_ci; ci <= L->ci; ci++) {
133
+ ci->top = (ci->top - oldstack) + L->stack;
134
+ ci->base = (ci->base - oldstack) + L->stack;
135
+ ci->func = (ci->func - oldstack) + L->stack;
136
+ }
137
+ L->base = (L->base - oldstack) + L->stack;
138
+ }
139
+
140
+
141
+ void luaD_reallocstack (lua_State *L, int newsize) {
142
+ TValue *oldstack = L->stack;
143
+ int realsize = newsize + 1 + EXTRA_STACK;
144
+ lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK - 1);
145
+ luaM_reallocvector(L, L->stack, L->stacksize, realsize, TValue);
146
+ L->stacksize = realsize;
147
+ L->stack_last = L->stack+newsize;
148
+ correctstack(L, oldstack);
149
+ }
150
+
151
+
152
+ void luaD_reallocCI (lua_State *L, int newsize) {
153
+ CallInfo *oldci = L->base_ci;
154
+ luaM_reallocvector(L, L->base_ci, L->size_ci, newsize, CallInfo);
155
+ L->size_ci = newsize;
156
+ L->ci = (L->ci - oldci) + L->base_ci;
157
+ L->end_ci = L->base_ci + L->size_ci - 1;
158
+ }
159
+
160
+
161
+ void luaD_growstack (lua_State *L, int n) {
162
+ if (n <= L->stacksize) /* double size is enough? */
163
+ luaD_reallocstack(L, 2*L->stacksize);
164
+ else
165
+ luaD_reallocstack(L, L->stacksize + n);
166
+ }
167
+
168
+
169
+ static CallInfo *growCI (lua_State *L) {
170
+ if (L->size_ci > LUAI_MAXCALLS) /* overflow while handling overflow? */
171
+ luaD_throw(L, LUA_ERRERR);
172
+ else {
173
+ luaD_reallocCI(L, 2*L->size_ci);
174
+ if (L->size_ci > LUAI_MAXCALLS)
175
+ luaG_runerror(L, "stack overflow");
176
+ }
177
+ return ++L->ci;
178
+ }
179
+
180
+
181
+ void luaD_callhook (lua_State *L, int event, int line) {
182
+ lua_Hook hook = L->hook;
183
+ if (hook && L->allowhook) {
184
+ ptrdiff_t top = savestack(L, L->top);
185
+ ptrdiff_t ci_top = savestack(L, L->ci->top);
186
+ lua_Debug ar;
187
+ ar.event = event;
188
+ ar.currentline = line;
189
+ if (event == LUA_HOOKTAILRET)
190
+ ar.i_ci = 0; /* tail call; no debug information about it */
191
+ else
192
+ ar.i_ci = cast_int(L->ci - L->base_ci);
193
+ luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */
194
+ L->ci->top = L->top + LUA_MINSTACK;
195
+ lua_assert(L->ci->top <= L->stack_last);
196
+ L->allowhook = 0; /* cannot call hooks inside a hook */
197
+ lua_unlock(L);
198
+ (*hook)(L, &ar);
199
+ lua_lock(L);
200
+ lua_assert(!L->allowhook);
201
+ L->allowhook = 1;
202
+ L->ci->top = restorestack(L, ci_top);
203
+ L->top = restorestack(L, top);
204
+ }
205
+ }
206
+
207
+
208
+ static StkId adjust_varargs (lua_State *L, Proto *p, int actual) {
209
+ int i;
210
+ int nfixargs = p->numparams;
211
+ Table *htab = NULL;
212
+ StkId base, fixed;
213
+ for (; actual < nfixargs; ++actual)
214
+ setnilvalue(L->top++);
215
+ #if defined(LUA_COMPAT_VARARG)
216
+ if (p->is_vararg & VARARG_NEEDSARG) { /* compat. with old-style vararg? */
217
+ int nvar = actual - nfixargs; /* number of extra arguments */
218
+ lua_assert(p->is_vararg & VARARG_HASARG);
219
+ luaC_checkGC(L);
220
+ luaD_checkstack(L, p->maxstacksize);
221
+ htab = luaH_new(L, nvar, 1); /* create `arg' table */
222
+ for (i=0; i<nvar; i++) /* put extra arguments into `arg' table */
223
+ setobj2n(L, luaH_setnum(L, htab, i+1), L->top - nvar + i);
224
+ /* store counter in field `n' */
225
+ setnvalue(luaH_setstr(L, htab, luaS_newliteral(L, "n")), cast_num(nvar));
226
+ }
227
+ #endif
228
+ /* move fixed parameters to final position */
229
+ fixed = L->top - actual; /* first fixed argument */
230
+ base = L->top; /* final position of first argument */
231
+ for (i=0; i<nfixargs; i++) {
232
+ setobjs2s(L, L->top++, fixed+i);
233
+ setnilvalue(fixed+i);
234
+ }
235
+ /* add `arg' parameter */
236
+ if (htab) {
237
+ sethvalue(L, L->top++, htab);
238
+ lua_assert(iswhite(obj2gco(htab)));
239
+ }
240
+ return base;
241
+ }
242
+
243
+
244
+ static StkId tryfuncTM (lua_State *L, StkId func) {
245
+ const TValue *tm = luaT_gettmbyobj(L, func, TM_CALL);
246
+ StkId p;
247
+ ptrdiff_t funcr = savestack(L, func);
248
+ if (!ttisfunction(tm))
249
+ luaG_typeerror(L, func, "call");
250
+ /* Open a hole inside the stack at `func' */
251
+ for (p = L->top; p > func; p--) setobjs2s(L, p, p-1);
252
+ incr_top(L);
253
+ func = restorestack(L, funcr); /* previous call may change stack */
254
+ setobj2s(L, func, tm); /* tag method is the new function to be called */
255
+ return func;
256
+ }
257
+
258
+
259
+
260
+ #define inc_ci(L) \
261
+ ((L->ci == L->end_ci) ? growCI(L) : \
262
+ (condhardstacktests(luaD_reallocCI(L, L->size_ci)), ++L->ci))
263
+
264
+
265
+ int luaD_precall (lua_State *L, StkId func, int nresults) {
266
+ LClosure *cl;
267
+ ptrdiff_t funcr;
268
+ if (!ttisfunction(func)) /* `func' is not a function? */
269
+ func = tryfuncTM(L, func); /* check the `function' tag method */
270
+ funcr = savestack(L, func);
271
+ cl = &clvalue(func)->l;
272
+ L->ci->savedpc = L->savedpc;
273
+ if (!cl->isC) { /* Lua function? prepare its call */
274
+ CallInfo *ci;
275
+ StkId st, base;
276
+ Proto *p = cl->p;
277
+ luaD_checkstack(L, p->maxstacksize);
278
+ func = restorestack(L, funcr);
279
+ if (!p->is_vararg) { /* no varargs? */
280
+ base = func + 1;
281
+ if (L->top > base + p->numparams)
282
+ L->top = base + p->numparams;
283
+ }
284
+ else { /* vararg function */
285
+ int nargs = cast_int(L->top - func) - 1;
286
+ base = adjust_varargs(L, p, nargs);
287
+ func = restorestack(L, funcr); /* previous call may change the stack */
288
+ }
289
+ ci = inc_ci(L); /* now `enter' new function */
290
+ ci->func = func;
291
+ L->base = ci->base = base;
292
+ ci->top = L->base + p->maxstacksize;
293
+ lua_assert(ci->top <= L->stack_last);
294
+ L->savedpc = p->code; /* starting point */
295
+ ci->tailcalls = 0;
296
+ ci->nresults = nresults;
297
+ for (st = L->top; st < ci->top; st++)
298
+ setnilvalue(st);
299
+ L->top = ci->top;
300
+ if (L->hookmask & LUA_MASKCALL) {
301
+ L->savedpc++; /* hooks assume 'pc' is already incremented */
302
+ luaD_callhook(L, LUA_HOOKCALL, -1);
303
+ L->savedpc--; /* correct 'pc' */
304
+ }
305
+ return PCRLUA;
306
+ }
307
+ else { /* if is a C function, call it */
308
+ CallInfo *ci;
309
+ int n;
310
+ luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */
311
+ ci = inc_ci(L); /* now `enter' new function */
312
+ ci->func = restorestack(L, funcr);
313
+ L->base = ci->base = ci->func + 1;
314
+ ci->top = L->top + LUA_MINSTACK;
315
+ lua_assert(ci->top <= L->stack_last);
316
+ ci->nresults = nresults;
317
+ if (L->hookmask & LUA_MASKCALL)
318
+ luaD_callhook(L, LUA_HOOKCALL, -1);
319
+ lua_unlock(L);
320
+ n = (*curr_func(L)->c.f)(L); /* do the actual call */
321
+ lua_lock(L);
322
+ if (n < 0) /* yielding? */
323
+ return PCRYIELD;
324
+ else {
325
+ luaD_poscall(L, L->top - n);
326
+ return PCRC;
327
+ }
328
+ }
329
+ }
330
+
331
+
332
+ static StkId callrethooks (lua_State *L, StkId firstResult) {
333
+ ptrdiff_t fr = savestack(L, firstResult); /* next call may change stack */
334
+ luaD_callhook(L, LUA_HOOKRET, -1);
335
+ if (f_isLua(L->ci)) { /* Lua function? */
336
+ while ((L->hookmask & LUA_MASKRET) && L->ci->tailcalls--) /* tail calls */
337
+ luaD_callhook(L, LUA_HOOKTAILRET, -1);
338
+ }
339
+ return restorestack(L, fr);
340
+ }
341
+
342
+
343
+ int luaD_poscall (lua_State *L, StkId firstResult) {
344
+ StkId res;
345
+ int wanted, i;
346
+ CallInfo *ci;
347
+ if (L->hookmask & LUA_MASKRET)
348
+ firstResult = callrethooks(L, firstResult);
349
+ ci = L->ci--;
350
+ res = ci->func; /* res == final position of 1st result */
351
+ wanted = ci->nresults;
352
+ L->base = (ci - 1)->base; /* restore base */
353
+ L->savedpc = (ci - 1)->savedpc; /* restore savedpc */
354
+ /* move results to correct place */
355
+ for (i = wanted; i != 0 && firstResult < L->top; i--)
356
+ setobjs2s(L, res++, firstResult++);
357
+ while (i-- > 0)
358
+ setnilvalue(res++);
359
+ L->top = res;
360
+ return (wanted - LUA_MULTRET); /* 0 iff wanted == LUA_MULTRET */
361
+ }
362
+
363
+
364
+ /*
365
+ ** Call a function (C or Lua). The function to be called is at *func.
366
+ ** The arguments are on the stack, right after the function.
367
+ ** When returns, all the results are on the stack, starting at the original
368
+ ** function position.
369
+ */
370
+ void luaD_call (lua_State *L, StkId func, int nResults) {
371
+ if (++L->nCcalls >= LUAI_MAXCCALLS) {
372
+ if (L->nCcalls == LUAI_MAXCCALLS)
373
+ luaG_runerror(L, "C stack overflow");
374
+ else if (L->nCcalls >= (LUAI_MAXCCALLS + (LUAI_MAXCCALLS>>3)))
375
+ luaD_throw(L, LUA_ERRERR); /* error while handing stack error */
376
+ }
377
+ if (luaD_precall(L, func, nResults) == PCRLUA) /* is a Lua function? */
378
+ luaV_execute(L, 1); /* call it */
379
+ L->nCcalls--;
380
+ luaC_checkGC(L);
381
+ }
382
+
383
+
384
+ static void resume (lua_State *L, void *ud) {
385
+ StkId firstArg = cast(StkId, ud);
386
+ CallInfo *ci = L->ci;
387
+ if (L->status == 0) { /* start coroutine? */
388
+ lua_assert(ci == L->base_ci && firstArg > L->base);
389
+ if (luaD_precall(L, firstArg - 1, LUA_MULTRET) != PCRLUA)
390
+ return;
391
+ }
392
+ else { /* resuming from previous yield */
393
+ lua_assert(L->status == LUA_YIELD);
394
+ L->status = 0;
395
+ if (!f_isLua(ci)) { /* `common' yield? */
396
+ /* finish interrupted execution of `OP_CALL' */
397
+ lua_assert(GET_OPCODE(*((ci-1)->savedpc - 1)) == OP_CALL ||
398
+ GET_OPCODE(*((ci-1)->savedpc - 1)) == OP_TAILCALL);
399
+ if (luaD_poscall(L, firstArg)) /* complete it... */
400
+ L->top = L->ci->top; /* and correct top if not multiple results */
401
+ }
402
+ else /* yielded inside a hook: just continue its execution */
403
+ L->base = L->ci->base;
404
+ }
405
+ luaV_execute(L, cast_int(L->ci - L->base_ci));
406
+ }
407
+
408
+
409
+ static int resume_error (lua_State *L, const char *msg) {
410
+ L->top = L->ci->base;
411
+ setsvalue2s(L, L->top, luaS_new(L, msg));
412
+ incr_top(L);
413
+ lua_unlock(L);
414
+ return LUA_ERRRUN;
415
+ }
416
+
417
+
418
+ LUA_API int lua_resume (lua_State *L, int nargs) {
419
+ int status;
420
+ lua_lock(L);
421
+ if (L->status != LUA_YIELD && (L->status != 0 || L->ci != L->base_ci))
422
+ return resume_error(L, "cannot resume non-suspended coroutine");
423
+ if (L->nCcalls >= LUAI_MAXCCALLS)
424
+ return resume_error(L, "C stack overflow");
425
+ luai_userstateresume(L, nargs);
426
+ lua_assert(L->errfunc == 0);
427
+ L->baseCcalls = ++L->nCcalls;
428
+ status = luaD_rawrunprotected(L, resume, L->top - nargs);
429
+ if (status != 0) { /* error? */
430
+ L->status = cast_byte(status); /* mark thread as `dead' */
431
+ luaD_seterrorobj(L, status, L->top);
432
+ L->ci->top = L->top;
433
+ }
434
+ else {
435
+ lua_assert(L->nCcalls == L->baseCcalls);
436
+ status = L->status;
437
+ }
438
+ --L->nCcalls;
439
+ lua_unlock(L);
440
+ return status;
441
+ }
442
+
443
+
444
+ LUA_API int lua_yield (lua_State *L, int nresults) {
445
+ luai_userstateyield(L, nresults);
446
+ lua_lock(L);
447
+ if (L->nCcalls > L->baseCcalls)
448
+ luaG_runerror(L, "attempt to yield across metamethod/C-call boundary");
449
+ L->base = L->top - nresults; /* protect stack slots below */
450
+ L->status = LUA_YIELD;
451
+ lua_unlock(L);
452
+ return -1;
453
+ }
454
+
455
+
456
+ int luaD_pcall (lua_State *L, Pfunc func, void *u,
457
+ ptrdiff_t old_top, ptrdiff_t ef) {
458
+ int status;
459
+ unsigned short oldnCcalls = L->nCcalls;
460
+ ptrdiff_t old_ci = saveci(L, L->ci);
461
+ lu_byte old_allowhooks = L->allowhook;
462
+ ptrdiff_t old_errfunc = L->errfunc;
463
+ L->errfunc = ef;
464
+ status = luaD_rawrunprotected(L, func, u);
465
+ if (status != 0) { /* an error occurred? */
466
+ StkId oldtop = restorestack(L, old_top);
467
+ luaF_close(L, oldtop); /* close eventual pending closures */
468
+ luaD_seterrorobj(L, status, oldtop);
469
+ L->nCcalls = oldnCcalls;
470
+ L->ci = restoreci(L, old_ci);
471
+ L->base = L->ci->base;
472
+ L->savedpc = L->ci->savedpc;
473
+ L->allowhook = old_allowhooks;
474
+ restore_stack_limit(L);
475
+ }
476
+ L->errfunc = old_errfunc;
477
+ return status;
478
+ }
479
+
480
+
481
+
482
+ /*
483
+ ** Execute a protected parser.
484
+ */
485
+ struct SParser { /* data to `f_parser' */
486
+ ZIO *z;
487
+ Mbuffer buff; /* buffer to be used by the scanner */
488
+ const char *name;
489
+ };
490
+
491
+ static void f_parser (lua_State *L, void *ud) {
492
+ int i;
493
+ Proto *tf;
494
+ Closure *cl;
495
+ struct SParser *p = cast(struct SParser *, ud);
496
+ int c = luaZ_lookahead(p->z);
497
+ luaC_checkGC(L);
498
+ tf = ((c == LUA_SIGNATURE[0]) ? luaU_undump : luaY_parser)(L, p->z,
499
+ &p->buff, p->name);
500
+ cl = luaF_newLclosure(L, tf->nups, hvalue(gt(L)));
501
+ cl->l.p = tf;
502
+ for (i = 0; i < tf->nups; i++) /* initialize eventual upvalues */
503
+ cl->l.upvals[i] = luaF_newupval(L);
504
+ setclvalue(L, L->top, cl);
505
+ incr_top(L);
506
+ }
507
+
508
+
509
+ int luaD_protectedparser (lua_State *L, ZIO *z, const char *name) {
510
+ struct SParser p;
511
+ int status;
512
+ p.z = z; p.name = name;
513
+ luaZ_initbuffer(L, &p.buff);
514
+ status = luaD_pcall(L, f_parser, &p, savestack(L, L->top), L->errfunc);
515
+ luaZ_freebuffer(L, &p.buff);
516
+ return status;
517
+ }
518
+
519
+