immunio 1.0.4 → 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/immunio/agent.rb +9 -9
- data/lib/immunio/authentication.rb +1 -1
- data/lib/immunio/channel.rb +15 -15
- data/lib/immunio/plugins/active_record.rb +3 -3
- data/lib/immunio/plugins/authlogic.rb +3 -3
- data/lib/immunio/plugins/csrf.rb +1 -1
- data/lib/immunio/plugins/devise.rb +1 -1
- data/lib/immunio/plugins/eval.rb +1 -1
- data/lib/immunio/plugins/http_finisher.rb +2 -2
- data/lib/immunio/plugins/http_tracker.rb +1 -1
- data/lib/immunio/plugins/io.rb +7 -7
- data/lib/immunio/plugins/redirect.rb +2 -2
- data/lib/immunio/plugins/warden.rb +5 -6
- data/lib/immunio/processor.rb +7 -7
- data/lib/immunio/request.rb +3 -3
- data/lib/immunio/version.rb +1 -1
- data/lib/immunio/vm.rb +6 -6
- data/lua-hooks/Makefile +49 -6
- data/lua-hooks/lib/boot.lua +49 -277
- metadata +2 -11
- data/lua-hooks/lib/encode.lua +0 -4
- data/lua-hooks/lib/lexers/LICENSE +0 -21
- data/lua-hooks/lib/lexers/bash.lua +0 -134
- data/lua-hooks/lib/lexers/bash_dqstr.lua +0 -59
- data/lua-hooks/lib/lexers/css.lua +0 -101
- data/lua-hooks/lib/lexers/css_attr.lua +0 -13
- data/lua-hooks/lib/lexers/html.lua +0 -113
- data/lua-hooks/lib/lexers/javascript.lua +0 -68
- data/lua-hooks/lib/lexers/lexer.lua +0 -1575
data/lib/immunio/request.rb
CHANGED
@@ -20,7 +20,7 @@ module Immunio
|
|
20
20
|
@paused_times = {}
|
21
21
|
@start_time = Time.now
|
22
22
|
|
23
|
-
Immunio.logger.debug "Created new Request #{id} with data #{@data}"
|
23
|
+
Immunio.logger.debug { "Created new Request #{id} with data #{@data}" }
|
24
24
|
end
|
25
25
|
|
26
26
|
def id
|
@@ -78,7 +78,7 @@ module Immunio
|
|
78
78
|
result = Immunio.run_hook "request", "should_report"
|
79
79
|
# If the hook doesn't exist, turn a nil report value into a false value
|
80
80
|
report = !!result["report"]
|
81
|
-
Immunio.logger.debug "Report request: #{report}"
|
81
|
+
Immunio.logger.debug { "Report request: #{report}" }
|
82
82
|
report
|
83
83
|
end
|
84
84
|
|
@@ -98,7 +98,7 @@ module Immunio
|
|
98
98
|
|
99
99
|
def self.current=(request)
|
100
100
|
Thread.current["immunio.request"] = request
|
101
|
-
Immunio.logger.debug "Setting current request for thread #{Thread.current.object_id} to #{request && request.id || nil}"
|
101
|
+
Immunio.logger.debug { "Setting current request for thread #{Thread.current.object_id} to #{request && request.id || nil}" }
|
102
102
|
end
|
103
103
|
|
104
104
|
# This shim exists to preserve the stack depth into hooks when self.time and self.pause are
|
data/lib/immunio/version.rb
CHANGED
data/lib/immunio/vm.rb
CHANGED
@@ -54,7 +54,7 @@ module Immunio
|
|
54
54
|
@functions = functions
|
55
55
|
@utils = utils
|
56
56
|
}
|
57
|
-
Immunio.logger.info "Lua code updated to version #{version}."
|
57
|
+
Immunio.logger.info { "Lua code updated to version #{version}." }
|
58
58
|
end
|
59
59
|
|
60
60
|
def update_data(version, data)
|
@@ -65,7 +65,7 @@ module Immunio
|
|
65
65
|
@data_version = version
|
66
66
|
@data = new_data
|
67
67
|
}
|
68
|
-
Immunio.logger.debug "Lua data updated to version #{version}."
|
68
|
+
Immunio.logger.debug { "Lua data updated to version #{version}." }
|
69
69
|
end
|
70
70
|
|
71
71
|
def current_state
|
@@ -76,7 +76,7 @@ module Immunio
|
|
76
76
|
end
|
77
77
|
|
78
78
|
def new_vm
|
79
|
-
Immunio.logger.debug "Creating new Lua VM"
|
79
|
+
Immunio.logger.debug { "Creating new Lua VM" }
|
80
80
|
dev_mode_hook_update if @dev_mode
|
81
81
|
|
82
82
|
@update_lock.synchronize {
|
@@ -87,7 +87,7 @@ module Immunio
|
|
87
87
|
def dev_mode_hook_update
|
88
88
|
# Load default hook handlers if present (they do not ship with the gem)
|
89
89
|
path = File.expand_path("#{Immunio::DIR}/../lua-hooks/hooks")
|
90
|
-
Immunio.logger.info "Checking hook handlers from #{path}"
|
90
|
+
Immunio.logger.info { "Checking hook handlers from #{path}" }
|
91
91
|
|
92
92
|
unique_files = Dir[path + "/*.lua"].collect do |file|
|
93
93
|
name = File.basename(file, ".*")
|
@@ -100,7 +100,7 @@ module Immunio
|
|
100
100
|
end
|
101
101
|
checksum = unique_files.join
|
102
102
|
if checksum == @dev_checksum
|
103
|
-
Immunio.logger.info "Reusing dev vm, files unchanged"
|
103
|
+
Immunio.logger.info { "Reusing dev vm, files unchanged" }
|
104
104
|
return
|
105
105
|
end
|
106
106
|
|
@@ -118,7 +118,7 @@ module Immunio
|
|
118
118
|
handlers[name] = data
|
119
119
|
handlers
|
120
120
|
end
|
121
|
-
Immunio.logger.info "Updating dev vm code, files changed"
|
121
|
+
Immunio.logger.info { "Updating dev vm code, files changed" }
|
122
122
|
update_code("DEV-#{Time.now.strftime("%H:%M:%S")}", functions)
|
123
123
|
@dev_checksum = checksum
|
124
124
|
end
|
data/lua-hooks/Makefile
CHANGED
@@ -14,16 +14,61 @@ SRC = \
|
|
14
14
|
ext/lpeg/lpprint.c \
|
15
15
|
ext/lpeg/lpvm.c
|
16
16
|
|
17
|
+
LUA_SRC = \
|
18
|
+
lib/cookie.lua \
|
19
|
+
lib/DataDumper.lua \
|
20
|
+
lib/date.lua \
|
21
|
+
lib/defence.lua \
|
22
|
+
lib/escape.lua \
|
23
|
+
lib/extensions.lua \
|
24
|
+
lib/hooks.lua \
|
25
|
+
lib/idn.lua \
|
26
|
+
lib/lexgraph.lua \
|
27
|
+
lib/neturl.lua \
|
28
|
+
lib/paths.lua \
|
29
|
+
lib/permit.lua \
|
30
|
+
lib/sanitize_sql.lua \
|
31
|
+
lib/semver.lua \
|
32
|
+
lib/sha1.lua \
|
33
|
+
lib/snap.lua \
|
34
|
+
lib/utils.lua \
|
35
|
+
lib/lexers/bash_dqstr.lua \
|
36
|
+
lib/lexers/bash.lua \
|
37
|
+
lib/lexers/css_attr.lua \
|
38
|
+
lib/lexers/css.lua \
|
39
|
+
lib/lexers/html.lua \
|
40
|
+
lib/lexers/javascript.lua \
|
41
|
+
lib/lexer.lua \
|
42
|
+
lib/hooks/authenticate.lua \
|
43
|
+
lib/hooks/bad_cookie.lua \
|
44
|
+
lib/hooks/custom_threat.lua \
|
45
|
+
lib/hooks/eval.lua \
|
46
|
+
lib/hooks/exception.lua \
|
47
|
+
lib/hooks/file_io.lua \
|
48
|
+
lib/hooks/framework_csrf_check.lua \
|
49
|
+
lib/hooks/framework_login.lua \
|
50
|
+
lib/hooks/framework_password_reset.lua \
|
51
|
+
lib/hooks/framework_redirect.lua \
|
52
|
+
lib/hooks/framework_session.lua \
|
53
|
+
lib/hooks/framework_user.lua \
|
54
|
+
lib/hooks/http_request_finish.lua \
|
55
|
+
lib/hooks/http_request_start.lua \
|
56
|
+
lib/hooks/http_response_start.lua \
|
57
|
+
lib/hooks/should_report.lua \
|
58
|
+
lib/hooks/sql_execute.lua \
|
59
|
+
lib/hooks/template_render_done.lua
|
60
|
+
|
17
61
|
OBJ = ${SRC:.c=.o}
|
18
62
|
|
19
63
|
SHA1OBJ = ext/sha1/sha1.o
|
64
|
+
OBJ = ${SRC:.c=.o} ${SHA1OBJ}
|
20
65
|
|
21
66
|
# Library archive. Used for compiling along agent bindings.
|
22
67
|
SO_OUT = libimmunio.so
|
23
68
|
A_OUT = libimmunio.a
|
24
69
|
|
25
70
|
# CLI for running tests
|
26
|
-
CLI = lua
|
71
|
+
CLI = ./lua
|
27
72
|
CLI_SRC = ext/luajit/src/luajit.c ${SRC}
|
28
73
|
|
29
74
|
XCFLAGS =
|
@@ -59,7 +104,7 @@ all: ${CLI} ${INIT_HOOK} ${HOOKS_TARBALL} ${HOOKS_SRCS_TARBALL}
|
|
59
104
|
${SHA1OBJ}:
|
60
105
|
${CC} -O -c ${INCS} -o ${SHA1OBJ} ${SHA1OBJ:.o=.c}
|
61
106
|
|
62
|
-
${SO_OUT}: ${OBJ} ${LUAJIT_OBJ}
|
107
|
+
${SO_OUT}: ${OBJ} ${LUAJIT_OBJ}
|
63
108
|
${CC} -shared ${CFLAGS} ${LIBS} -o $@ -lc $^
|
64
109
|
|
65
110
|
${A_OUT}: ${OBJ}
|
@@ -77,11 +122,9 @@ ${CLI}: ${CLI_SRC} ${LUAJIT_OBJ} ${SHA1OBJ}
|
|
77
122
|
${CC} ${CFLAGS} -DLUA_UNSAFE_MODE ${INCS} -o $@ $^ ${LIBS}
|
78
123
|
|
79
124
|
# Concatenate init hooks into one __init__.lua hook with two newlines in between
|
80
|
-
${INIT_HOOK}:
|
125
|
+
${INIT_HOOK}: ${LUA_SRC} ${CLI}
|
81
126
|
rm -f hooks/__init__.lua
|
82
|
-
|
83
|
-
for file in hooks/init/*.lua; do cat "$$file" >> hooks/__init__.lua; printf "\n\n" >> hooks/__init__.lua; done
|
84
|
-
echo "return utils" >> hooks/__init__.lua
|
127
|
+
${CLI} ./luald.lua ${LUA_SRC} > hooks/__init__.lua
|
85
128
|
|
86
129
|
build/%.lua: hooks/%.lua ${CLI}
|
87
130
|
@mkdir -p build
|
data/lua-hooks/lib/boot.lua
CHANGED
@@ -1,290 +1,62 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
--
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
--
|
10
|
-
--
|
11
|
-
--
|
12
|
-
|
13
|
-
|
14
|
-
-- Lua libs
|
15
|
-
ipairs = ipairs,
|
16
|
-
next = next,
|
17
|
-
pairs = pairs,
|
18
|
-
pcall = pcall,
|
19
|
-
tonumber = tonumber,
|
20
|
-
tostring = tostring,
|
21
|
-
type = type,
|
22
|
-
unpack = unpack,
|
23
|
-
assert = assert,
|
24
|
-
error = error,
|
25
|
-
getmetatable = getmetatable,
|
26
|
-
setmetatable = setmetatable,
|
27
|
-
rawget = rawget,
|
28
|
-
rawset = rawset,
|
29
|
-
collectgarbage = collectgarbage,
|
30
|
-
math = math,
|
31
|
-
string = string,
|
32
|
-
bit = {
|
33
|
-
band = bit.band,
|
34
|
-
extract = bit.extract,
|
35
|
-
bor = bit.bor,
|
36
|
-
bnot = bit.bnot,
|
37
|
-
arshift = bit.arshift,
|
38
|
-
rshift = bit.rshift,
|
39
|
-
rrotate = bit.rrotate,
|
40
|
-
replace = bit.replace,
|
41
|
-
lshift = bit.lshift,
|
42
|
-
lrotate = bit.lrotate,
|
43
|
-
btest = bit.btest,
|
44
|
-
bxor = bit.bxor
|
45
|
-
},
|
46
|
-
coroutine = {
|
47
|
-
create = coroutine.create,
|
48
|
-
resume = coroutine.resume,
|
49
|
-
running = coroutine.running,
|
50
|
-
status = coroutine.status,
|
51
|
-
wrap = coroutine.wrap,
|
52
|
-
yield = coroutine.yield,
|
53
|
-
},
|
54
|
-
debug = {
|
55
|
-
-- Block most debug in sandbox, but allow tracebacks
|
56
|
-
traceback = debug.traceback
|
57
|
-
},
|
58
|
-
select = select,
|
59
|
-
sha1 = sha1,
|
60
|
-
utf8 = {
|
61
|
-
byte = utf8.byte,
|
62
|
-
char = utf8.char,
|
63
|
-
find = utf8.find,
|
64
|
-
format = utf8.format,
|
65
|
-
gmatch = utf8.gmatch,
|
66
|
-
gsub = utf8.gsub,
|
67
|
-
len = utf8.len,
|
68
|
-
lower = utf8.lower,
|
69
|
-
match = utf8.match,
|
70
|
-
rep = utf8.rep,
|
71
|
-
reverse = utf8.reverse,
|
72
|
-
sub = utf8.sub,
|
73
|
-
upper = utf8.upper,
|
74
|
-
split = utf8.split,
|
75
|
-
escape = utf8.escape,
|
76
|
-
charpos = utf8.charpos,
|
77
|
-
insert = utf8.insert,
|
78
|
-
remove = utf8.remove,
|
79
|
-
next = utf8.next,
|
80
|
-
ncasecmp = utf8.ncasecmp,
|
81
|
-
},
|
82
|
-
table = {
|
83
|
-
insert = table.insert,
|
84
|
-
maxn = table.maxn,
|
85
|
-
remove = table.remove,
|
86
|
-
sort = table.sort,
|
87
|
-
map = table.map,
|
88
|
-
reduce = table.reduce,
|
89
|
-
length = table.length,
|
90
|
-
concat = table.concat,
|
91
|
-
},
|
92
|
-
libinjection = {
|
93
|
-
sqli = libinjection.sqli,
|
94
|
-
fingerprint = libinjection.fingerprint,
|
95
|
-
xss = libinjection.xss,
|
96
|
-
sqli_tokenize = libinjection.sqli_tokenize
|
97
|
-
},
|
98
|
-
-- LPeg Library
|
99
|
-
lpeg = {
|
100
|
-
ptree = lpeg.ptree,
|
101
|
-
pcode = lpeg.pcode,
|
102
|
-
match = lpeg.match,
|
103
|
-
B = lpeg.B,
|
104
|
-
V = lpeg.V,
|
105
|
-
C = lpeg.C,
|
106
|
-
Cc = lpeg.Cc,
|
107
|
-
Cmt = lpeg.Cmt,
|
108
|
-
Cb = lpeg.Cb,
|
109
|
-
Carg = lpeg.Carg,
|
110
|
-
Cp = lpeg.Cp,
|
111
|
-
Cs = lpeg.Cs,
|
112
|
-
Ct = lpeg.Ct,
|
113
|
-
Cf = lpeg.Cf,
|
114
|
-
Cg = lpeg.Cg,
|
115
|
-
P = lpeg.P,
|
116
|
-
S = lpeg.S,
|
117
|
-
R = lpeg.R,
|
118
|
-
locale = lpeg.locale,
|
119
|
-
version = lpeg.version,
|
120
|
-
setmaxstack = lpeg.setmaxstack,
|
121
|
-
type = lpeg.type,
|
122
|
-
},
|
123
|
-
-- pre built lexer library
|
124
|
-
-- the call to load here will both load the code
|
125
|
-
-- and compile the LPeg grammar
|
126
|
-
lexers = {
|
127
|
-
lexer = require('lexers/lexer'),
|
128
|
-
bash = require('lexers/lexer').load('bash'), -- bash
|
129
|
-
bash_dqstr = require('lexers/lexer').load('bash_dqstr'), -- bash strings
|
130
|
-
html = require('lexers/lexer').load('html'),
|
131
|
-
javascript = require('lexers/lexer').load('javascript'),
|
132
|
-
css = require('lexers/lexer').load('css'),
|
133
|
-
css_attr = require('lexers/lexer').load('css_attr'),
|
134
|
-
},
|
135
|
-
-- Immunio vars
|
136
|
-
serverdata = {}, -- Default empty serverdata
|
137
|
-
agentdata = {},
|
138
|
-
utils = {}, -- Used to store utility functions declared in the sandbox.
|
139
|
-
-- pass mode flags into the VM
|
140
|
-
DEV_MODE = DEV_MODE,
|
141
|
-
DEBUG_MODE = DEBUG_MODE,
|
142
|
-
LUA_PLATFORM = LUA_PLATFORM or 'unix',
|
143
|
-
IMMUNIO_KEY = IMMUNIO_KEY,
|
144
|
-
IMMUNIO_SECRET = IMMUNIO_SECRET
|
145
|
-
}
|
146
|
-
|
147
|
-
-- Enable a few more things in dev mode. For debugging.
|
148
|
-
if DEBUG_MODE or DEV_MODE then
|
149
|
-
SANDBOX_ENV.print = print
|
150
|
-
SANDBOX_ENV.snapshot = snapshot
|
151
|
-
else
|
152
|
-
SANDBOX_ENV.print = function(...) end
|
1
|
+
VM_VERSION = 1
|
2
|
+
-- Global reference to hold the VM itself.
|
3
|
+
VM = nil
|
4
|
+
|
5
|
+
-- Create global agentdata and serverdata
|
6
|
+
agentdata = agentdata or {}
|
7
|
+
serverdata = serverdata or {}
|
8
|
+
|
9
|
+
-- XXX Java agent has built in assumption that this function exists before VM
|
10
|
+
-- initialisation.
|
11
|
+
-- Encode a Lua object to be sent to the server.
|
12
|
+
function encode(object)
|
13
|
+
return cmsgpack.pack(object)
|
153
14
|
end
|
154
15
|
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
SANDBOX_ENV.utils.debug_prefix = "UNKNOWN"
|
160
|
-
-- Change the values here to toggle debugging per module.
|
161
|
-
SANDBOX_ENV.utils.debug_module_prefixes = {
|
162
|
-
UNKNOWN = true,
|
163
|
-
IO = true,
|
164
|
-
SQLi = true,
|
165
|
-
ExceptionHandler = true,
|
166
|
-
Redirect = true,
|
167
|
-
XSS = true,
|
168
|
-
Eval = true,
|
169
|
-
}
|
170
|
-
end
|
171
|
-
-- Merges the vars and the default sandbox env.
|
172
|
-
-- The vars can override the sandbox environment.
|
173
|
-
-- The table is copied to keep data from leaking
|
174
|
-
-- out of the functions.
|
175
|
-
local merged_vars = {}
|
176
|
-
merged_vars._G = merged_vars
|
177
|
-
for k, v in pairs(SANDBOX_ENV) do
|
178
|
-
merged_vars[k] = v
|
179
|
-
end
|
180
|
-
|
16
|
+
-- Function called by the Agent to call and sandbox a function.
|
17
|
+
function sandboxed_call(method, vars)
|
18
|
+
local rval = nil
|
19
|
+
-- Merge caller supplied vars
|
181
20
|
if vars then
|
21
|
+
-- utils.debug_dump("Merge vars from agent: ", vars)
|
182
22
|
for k, v in pairs(vars) do
|
183
|
-
|
184
|
-
|
185
|
-
end
|
186
|
-
|
187
|
-
-- XXX Open sandbox in DEBUG_MODE
|
188
|
-
if DEBUG_MODE then
|
189
|
-
merged_vars['__REAL_G'] = _G
|
190
|
-
end
|
191
|
-
-- Sets the environment of the function.
|
192
|
-
setfenv(method, merged_vars)
|
193
|
-
-- Call it!
|
194
|
-
local rval = nil
|
195
|
-
if object then
|
196
|
-
rval = method(object)
|
197
|
-
else
|
198
|
-
rval = method()
|
199
|
-
end
|
200
|
-
-- Hint the lua VM GC that the references held to values in merged_vars don't
|
201
|
-
-- count anymore. If we omit this line the function environment is held onto
|
202
|
-
-- by the GC and we leak the universe... --ol
|
203
|
-
setmetatable( merged_vars, {__mode = "v"} )
|
204
|
-
-- Remove merged_vars from function environment so it can be collected sooner
|
205
|
-
setfenv(method, _G)
|
206
|
-
return rval
|
207
|
-
end
|
208
|
-
|
209
|
-
-- Function called by the VM to call and sandbox a function.
|
210
|
-
function sandboxed_call(func, vars)
|
211
|
-
return sandboxed_method_call(func, nil, vars)
|
212
|
-
end
|
213
|
-
|
214
|
-
if DEBUG_MODE then
|
215
|
-
-- Memory Snapshot Debugger
|
216
|
-
local saved_snapshot = {}
|
217
|
-
local saved_usage = 0
|
218
|
-
function dump_snapshot( label )
|
219
|
-
collectgarbage()
|
220
|
-
collectgarbage()
|
221
|
-
saved_snapshot = snapshot.snapshot()
|
222
|
-
saved_usage = collectgarbage('count')
|
223
|
-
print("------------------------\nSNAPSHOT\n")
|
224
|
-
print("USAGE: " .. saved_usage .. "\n")
|
225
|
-
if label then print(label) end
|
226
|
-
for k,v in pairs(saved_snapshot) do
|
227
|
-
print( "ALLOCATION:" .. tostring(k):gsub("userdata:", "") .. " " .. v)
|
228
|
-
end
|
229
|
-
end
|
230
|
-
|
231
|
-
function update_snapshot()
|
232
|
-
collectgarbage()
|
233
|
-
collectgarbage()
|
234
|
-
saved_snapshot = snapshot.snapshot()
|
235
|
-
saved_usage = collectgarbage('count')
|
236
|
-
end
|
237
|
-
|
238
|
-
function diff_snapshot( update )
|
239
|
-
collectgarbage()
|
240
|
-
collectgarbage()
|
241
|
-
local S = snapshot.snapshot()
|
242
|
-
local U = collectgarbage('count')
|
243
|
-
local output = ("------------------------\nDIFF SNAPSHOT\n")
|
244
|
-
output = output .. "USAGE DELTA: " .. U - saved_usage .. "\n"
|
245
|
-
for k,v in pairs(S) do
|
246
|
-
if saved_snapshot[k] == nil then
|
247
|
-
output = output .. "ALLOCATION:" .. tostring(k):gsub("userdata:", "") .. " " .. v .. "\n"
|
248
|
-
|
23
|
+
if k ~= "utils" then -- XXX agent API compatability. Ignore utils.
|
24
|
+
_G[k] = v
|
249
25
|
end
|
250
26
|
end
|
251
|
-
if update then saved_snapshot = S end
|
252
|
-
return output
|
253
27
|
end
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
total = total + 1
|
265
|
-
if saved_snapshot[k] == nil then
|
266
|
-
count = count + 1
|
28
|
+
if type(method) == "function" then
|
29
|
+
-- legacy hooks. Convert to new hook call
|
30
|
+
rval = method(vars)
|
31
|
+
if rval and type(rval) == 'table' then
|
32
|
+
-- Special handling for the __init__ hook
|
33
|
+
-- If rval contains a _vm_update key then (re)install the package loader
|
34
|
+
-- and (re)load packages and hooks
|
35
|
+
if rval._vm_update then
|
36
|
+
VM = rval._vm_update(DEV_MODE, VM_VERSION)
|
37
|
+
rval = {}
|
267
38
|
end
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
if S[k] == nil then
|
276
|
-
count = count + 1
|
39
|
+
-- Special handling for the other hooks
|
40
|
+
if rval._vm_hook_call then
|
41
|
+
-- swap _vm_hook_call string into method which will be passed to hooks.run below
|
42
|
+
method = rval._vm_hook_call
|
43
|
+
else
|
44
|
+
-- Just punt the rval back to the caller.
|
45
|
+
return rval
|
277
46
|
end
|
278
47
|
end
|
279
|
-
output = output .. "\n*** OLD ALLOCATIONS ***\nTOTAL: " .. total .. "\nFREED: " .. count .. "\nUSAGE: " .. saved_usage .. "\n"
|
280
|
-
if update then saved_snapshot = S end
|
281
|
-
return output
|
282
48
|
end
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
49
|
+
if type(method) == "string" then
|
50
|
+
-- new style hook call
|
51
|
+
if VM then
|
52
|
+
-- Call it!
|
53
|
+
rval = VM.run(method, vars)
|
54
|
+
else
|
55
|
+
error("Attempt to call hook '" .. method .. "' before VM code has loaded.")
|
56
|
+
end
|
57
|
+
elseif type(method) ~= 'function' then
|
58
|
+
error("sandboxed_call called with a method of type " .. type(method) .. ".")
|
59
|
+
end
|
60
|
+
return rval
|
289
61
|
end
|
290
62
|
|