diff --git a/src/blua/liolib.c b/src/blua/liolib.c
index 100dbb6c15448f1a5a335dc1f7d78e9a2cc865b5..ac168ef1807b81ac0d273ad196cf9ce8b7e1b9fb 100644
--- a/src/blua/liolib.c
+++ b/src/blua/liolib.c
@@ -17,6 +17,9 @@
 
 #include "lauxlib.h"
 #include "lualib.h"
+#include "../i_system.h"
+#include "../doomdef.h"
+#include "../m_misc.h"
 
 
 
@@ -173,11 +176,14 @@ static int io_open (lua_State *L) {
 		}
 	}
 	if (strstr(filename, "..") || strchr(filename, ':') || StartsWith(filename, "\\")
-		|| StartsWith(filename, "/") || !pass)
+		|| StartsWith(filename, "/") || strchr(filename, '%') || !pass)
 	{
 		luaL_error(L,"access denied to %s", filename);
 		return pushresult(L,0,filename);
 	}
+	I_mkdir("luafiles", 0755);
+	char* destFilename = va("luafiles"PATHSEP"%s", filename);
+	filename = destFilename;
 	const char *mode = luaL_optstring(L, 2, "r");
 	FILE **pf = newfile(L);
 	*pf = fopen(filename, mode);