tesla1889

Safe Debug Library

Feb 6th, 2013
309
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.08 KB | None | 0 0
  1. --[[
  2.     Safe Debug
  3.     tesla1889
  4.     Public Domain
  5. --]]
  6. local no_good_info = {}
  7. do
  8.     local baseLevel = 0
  9.     local info = debug.getinfo(baseLevel)
  10.     while info do
  11.         no_good_info[info] = true   -- get collection of protected info
  12.         baseLevel = (baseLevel + 1)
  13.     end
  14. end
  15. local db = {}   --  move unsandboxed debug here
  16. for k,v in pairs(debug) do
  17.     db[k] = v
  18.     debug[k] = nil
  19. end
  20. --  debug.debug = db.debug  --  not completely sure what to protect here, so I'll comment it out
  21. debug.gethook = function()
  22.     return db.gethook() --  ensure no optional values are passed
  23. end
  24. debug.getinfo = function(n,m)
  25.     local raw = db.getinfo(n)
  26.     if no_good_info[raw]
  27.         then error("debug.getinfo: level out of range")
  28.     end
  29.     local mask = {
  30.         currentline = false,
  31.         func = false,
  32.         linedefined = false,
  33.         name = false,
  34.         namewhat = false,
  35.         nups = false,
  36.         short_src = false,
  37.         source = false,
  38.         what = false
  39.     }
  40.     if m then
  41.         if (type(m) ~= "string")
  42.             then error("debug.getinfo: string mask expected")
  43.         end
  44.         local len = #m
  45.         for n = 1,len do
  46.             local c = string.sub(m,n,n)
  47.             if  (c == "n") then
  48.                 mask.name = true
  49.                 mask.namewhat = true
  50.             elseif  (c == "f") then
  51.                 mask.func = true
  52.             elseif  (c == "S") then
  53.                 mask.linedefined = true
  54.                 mask.short_src = true
  55.                 mask.source = true
  56.                 mask.what = true
  57.             elseif  (c == "l") then
  58.                 mask.currentline = true
  59.             elseif  (c == "u") then
  60.                 mask.nups = true
  61.             else
  62.                 error("debug.getinfo: invalid mask option '" .. c .. "'")
  63.             end
  64.         end
  65.     else
  66.         mask = {
  67.             currentline = true,
  68.             func = true,
  69.             linedefined = true,
  70.             name = true,
  71.             namewhat = true,
  72.             nups = true,
  73.             short_src = true,
  74.             source = true,
  75.             what = true
  76.         }
  77.     end
  78.     local info = {}
  79.     for k,v in pairs(raw) do
  80.         if mask[k]
  81.             then info[k] = v
  82.         end
  83.     end
  84.     return info
  85. end
  86. debug.getlocal = function(n,l)
  87.     if (type(n) == "function")  --  restrict getlocal to functions
  88.         then return db.getlocal(n,l)
  89.     end
  90. end
  91. local meta_critical = {
  92.     --  insert all values with metatables you don't want accessible
  93. }
  94. do
  95.     local t,c = {},#meta_critical
  96.     for n = 1,c
  97.         do t[meta_critical[n]] = true
  98.     end
  99.     meta_critical = t
  100. end
  101. debug.getmetatable = function(obj)
  102.     if (not meta_critical[obj])
  103.         then return db.getmetatable(obj)
  104.     end
  105. end
  106. --  leave out debug.getregistry
  107. debug.getupvalue = db.getupvalue    --  safe
  108. --  leave out debug.getuservalue
  109. debug.sethook = db.sethook  --  safe
  110. --  leave out debug.setlocal
  111. debug.setmetatable = function(obj)
  112.     if (not meta_critical[obj])
  113.         then return db.setmetatable(obj)
  114.     end
  115. end
  116. local fn_critical = {
  117.     --  insert all functions that you want to protect
  118. }
  119. do
  120.     local t,c = {},#fn_critical
  121.     for n = 1,c
  122.         do t[fn_critical[n]] = true
  123.     end
  124.     fn_critical = t
  125. end
  126. debug.setupvalue = function(f,u,v)
  127.     if (not fn_critical[f])
  128.         then return db.setupvalue(f,u,v)
  129.     end
  130. end
  131. --  leave out debug.setuservalue
  132. debug.traceback = db.traceback  --  a string of info never hurt anyone
  133. debug.upvalueid = db.upvalueid  --  safe
  134. debug.upvaluejoin = function(f1,n1,f2,n2)
  135.     if (not (fn_critical[fl] or fn_critical[f2]))
  136.         then return db.upvaluejoin(f1,n1,f2,n2)
  137.     end
  138. end
Advertisement
Add Comment
Please, Sign In to add comment