Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- Safe Debug
- tesla1889
- Public Domain
- --]]
- local no_good_info = {}
- do
- local baseLevel = 0
- local info = debug.getinfo(baseLevel)
- while info do
- no_good_info[info] = true -- get collection of protected info
- baseLevel = (baseLevel + 1)
- end
- end
- local db = {} -- move unsandboxed debug here
- for k,v in pairs(debug) do
- db[k] = v
- debug[k] = nil
- end
- -- debug.debug = db.debug -- not completely sure what to protect here, so I'll comment it out
- debug.gethook = function()
- return db.gethook() -- ensure no optional values are passed
- end
- debug.getinfo = function(n,m)
- local raw = db.getinfo(n)
- if no_good_info[raw]
- then error("debug.getinfo: level out of range")
- end
- local mask = {
- currentline = false,
- func = false,
- linedefined = false,
- name = false,
- namewhat = false,
- nups = false,
- short_src = false,
- source = false,
- what = false
- }
- if m then
- if (type(m) ~= "string")
- then error("debug.getinfo: string mask expected")
- end
- local len = #m
- for n = 1,len do
- local c = string.sub(m,n,n)
- if (c == "n") then
- mask.name = true
- mask.namewhat = true
- elseif (c == "f") then
- mask.func = true
- elseif (c == "S") then
- mask.linedefined = true
- mask.short_src = true
- mask.source = true
- mask.what = true
- elseif (c == "l") then
- mask.currentline = true
- elseif (c == "u") then
- mask.nups = true
- else
- error("debug.getinfo: invalid mask option '" .. c .. "'")
- end
- end
- else
- mask = {
- currentline = true,
- func = true,
- linedefined = true,
- name = true,
- namewhat = true,
- nups = true,
- short_src = true,
- source = true,
- what = true
- }
- end
- local info = {}
- for k,v in pairs(raw) do
- if mask[k]
- then info[k] = v
- end
- end
- return info
- end
- debug.getlocal = function(n,l)
- if (type(n) == "function") -- restrict getlocal to functions
- then return db.getlocal(n,l)
- end
- end
- local meta_critical = {
- -- insert all values with metatables you don't want accessible
- }
- do
- local t,c = {},#meta_critical
- for n = 1,c
- do t[meta_critical[n]] = true
- end
- meta_critical = t
- end
- debug.getmetatable = function(obj)
- if (not meta_critical[obj])
- then return db.getmetatable(obj)
- end
- end
- -- leave out debug.getregistry
- debug.getupvalue = db.getupvalue -- safe
- -- leave out debug.getuservalue
- debug.sethook = db.sethook -- safe
- -- leave out debug.setlocal
- debug.setmetatable = function(obj)
- if (not meta_critical[obj])
- then return db.setmetatable(obj)
- end
- end
- local fn_critical = {
- -- insert all functions that you want to protect
- }
- do
- local t,c = {},#fn_critical
- for n = 1,c
- do t[fn_critical[n]] = true
- end
- fn_critical = t
- end
- debug.setupvalue = function(f,u,v)
- if (not fn_critical[f])
- then return db.setupvalue(f,u,v)
- end
- end
- -- leave out debug.setuservalue
- debug.traceback = db.traceback -- a string of info never hurt anyone
- debug.upvalueid = db.upvalueid -- safe
- debug.upvaluejoin = function(f1,n1,f2,n2)
- if (not (fn_critical[fl] or fn_critical[f2]))
- then return db.upvaluejoin(f1,n1,f2,n2)
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment