prosody: sandboxed require(): Point __index of _G at current env for modules that need to reference globals they already set
authorMatthew Wild <mwild1@gmail.com>
Mon, 23 Jan 2012 01:04:15 +0000
changeset 4549 15fe442e70c5
parent 4548 e6e5c76ff009
child 4550 1c41e4a846a2
prosody: sandboxed require(): Point __index of _G at current env for modules that need to reference globals they already set
prosody
--- a/prosody	Mon Jan 23 00:56:57 2012 +0000
+++ b/prosody	Mon Jan 23 01:04:15 2012 +0000
@@ -150,10 +150,14 @@
 		local curr_env_mt = getmetatable(getfenv(2));
 		local _realG_mt = getmetatable(_realG);
 		if curr_env_mt and curr_env_mt.__index and not curr_env_mt.__newindex and _realG_mt then
-			local old_newindex
+			local old_newindex, old_index;
 			old_newindex, _realG_mt.__newindex = _realG_mt.__newindex, curr_env;
+			old_index, _realG_mt.__index = _realG_mt.__index, function (_G, k)
+				return rawget(curr_env, k);
+			end;
 			local ret = _real_require(...);
 			_realG_mt.__newindex = old_newindex;
+			_realG_mt.__index = old_index;
 			return ret;
 		end
 		return _real_require(...);