So entfernen Sie bestimmte Funktionen aus der Betriebssystembibliothek, ohne die Lua-Header oder die Skripte zu bearbeiten
Ich habe meine Hausaufgaben gemacht und andere Antworten zu diesem Thema studiert, aber keine befasst sich mit meinem speziellen Problem.
Ich möchte die io-Bibliothek vollständig und das os nur teilweise entfernen (sagen wir, ich möchte os.clock () und andere behalten)
Wie kann ich dies nur von der C-API erreichen.
Aufgrund der Art des Projekts darf ich die Lua-Header und die Skripte, die an mich gesendet werden, nicht ändern. Diese stehen nicht unter meiner Kontrolle. Das einzige, was ich ändern kann, ist der Dolmetscher.
so etwas machen:
<code>lua_pushnil(state_pointer); lua_setglobal(state_pointer, "os.execute"); </code>
hilft nicht viel, da der Benutzer im Skript os = require ('os') aufrufen und alle Funktionen zurückholen kann
Ich darf die Require-Funktion nicht deaktivieren, damit es schwieriger wird.
Irgendwelche Ideen?
PS: Eher neugierig: wenn ich so etwas mache
<code>luaopen_base(L); luaopen_table(L); luaopen_string(L); luaopen_math(L); luaopen_loadlib(L); (basically i'm loading every library by hand except os and io) </code>
anstatt
<code>luaL_openlibs(L); (this loads all the libraries) </code>
Würde os = require ('os') oder io = require ('io') noch funktionieren?
@Nicol Bolas weiß nicht, ob ich etwas falsch mache, aber os = require ('os') & require ('io') bringt einfach alles zurück.
mein Code:
<code>luaL_openlibs(LuaInstance); /* load the libs */ lua_pushnil(LuaInstance); lua_setglobal(LuaInstance, "io"); lua_pushnil(LuaInstance); lua_setglobal(LuaInstance, "os.execute"); lua_pushnil(LuaInstance); lua_setglobal(LuaInstance, "os.rename"); lua_pushnil(LuaInstance); lua_setglobal(LuaInstance, "os.remove"); lua_pushnil(LuaInstance); lua_setglobal(LuaInstance, "os.exit"); </code>
In meinem Skript mache ich einfach eine
<code>os = require('os') io = require('io') </code>
Danach funktionieren OS-Funktionen und IO-Funktionen. os.exit schließt meine App immer noch und io.write funktioniert wie gewohnt