From 2c24456389d6518d0d429c0c4f41e5bf52c2d793 Mon Sep 17 00:00:00 2001 From: Antoine Cellerier Date: Fri, 26 Feb 2010 11:56:32 +0100 Subject: [PATCH] Do not store p_this in a table value visible from lua code. --- modules/misc/lua/demux.c | 3 +-- modules/misc/lua/extension.c | 5 ++--- modules/misc/lua/intf.c | 6 ++---- modules/misc/lua/libs/misc.c | 16 +++++++++++----- modules/misc/lua/meta.c | 5 ++--- modules/misc/lua/services_discovery.c | 3 +-- modules/misc/lua/vlc.h | 2 ++ 7 files changed, 21 insertions(+), 19 deletions(-) diff --git a/modules/misc/lua/demux.c b/modules/misc/lua/demux.c index 601287f058..c3d3595c69 100644 --- a/modules/misc/lua/demux.c +++ b/modules/misc/lua/demux.c @@ -135,14 +135,13 @@ static int probe_luascript( vlc_object_t *p_this, const char * psz_filename, /* Load Lua libraries */ luaL_openlibs( L ); /* FIXME: Don't open all the libs? */ + vlclua_set_this( L, p_demux ); luaL_register( L, "vlc", p_reg ); luaopen_msg( L ); luaopen_strings( L ); luaopen_stream( L ); luaopen_xml( L ); luaopen_md5( L ); - lua_pushlightuserdata( L, p_demux ); - lua_setfield( L, -2, "private" ); lua_pushstring( L, p_demux->psz_path ); lua_setfield( L, -2, "path" ); lua_pushstring( L, p_demux->psz_access ); diff --git a/modules/misc/lua/extension.c b/modules/misc/lua/extension.c index a6fa103359..174d18dda1 100644 --- a/modules/misc/lua/extension.c +++ b/modules/misc/lua/extension.c @@ -719,13 +719,12 @@ static lua_State* GetLuaState( extensions_manager_t *p_mgr, msg_Err( p_mgr, "Could not create new Lua State" ); return NULL; } + vlclua_set_this( L, p_mgr ); + luaL_openlibs( L ); luaL_register( L, "vlc", p_reg ); luaopen_msg( L ); - lua_pushlightuserdata( L, p_mgr ); - lua_setfield( L, -2, "private" ); - lua_pushlightuserdata( L, p_ext ); lua_setfield( L, -2, "extension" ); diff --git a/modules/misc/lua/intf.c b/modules/misc/lua/intf.c index 90bb782005..3415907616 100644 --- a/modules/misc/lua/intf.c +++ b/modules/misc/lua/intf.c @@ -168,15 +168,13 @@ int Open_LuaIntf( vlc_object_t *p_this ) goto error; } + vlclua_set_this( L, p_intf ); + luaL_openlibs( L ); /* register our functions */ luaL_register( L, "vlc", p_reg ); - /* store a pointer to p_intf (FIXME: user could overwrite this) */ - lua_pushlightuserdata( L, p_intf ); - lua_setfield( L, -2, "private" ); - /* register submodules */ luaopen_acl( L ); luaopen_config( L ); diff --git a/modules/misc/lua/libs/misc.c b/modules/misc/lua/libs/misc.c index 5e5e8060e6..444092dada 100644 --- a/modules/misc/lua/libs/misc.c +++ b/modules/misc/lua/libs/misc.c @@ -50,13 +50,19 @@ /***************************************************************************** * Internal lua<->vlc utils *****************************************************************************/ +void __vlclua_set_this( lua_State *L, vlc_object_t *p_this ) +{ + lua_pushlightuserdata( L, __vlclua_set_this ); + lua_pushlightuserdata( L, p_this ); + lua_rawset( L, LUA_REGISTRYINDEX ); +} + vlc_object_t * vlclua_get_this( lua_State *L ) { - vlc_object_t * p_this; - lua_getglobal( L, "vlc" ); - lua_getfield( L, -1, "private" ); - p_this = (vlc_object_t*)lua_topointer( L, lua_gettop( L ) ); - lua_pop( L, 2 ); + lua_pushlightuserdata( L, __vlclua_set_this ); + lua_rawget( L, LUA_REGISTRYINDEX ); + vlc_object_t *p_this = (vlc_object_t*)lua_topointer( L, -1 ); + lua_pop( L, 1 ); return p_this; } diff --git a/modules/misc/lua/meta.c b/modules/misc/lua/meta.c index b61ec4ec6a..a56fd091d2 100644 --- a/modules/misc/lua/meta.c +++ b/modules/misc/lua/meta.c @@ -60,6 +60,8 @@ static lua_State * init( vlc_object_t *p_this, input_item_t * p_item, const char return NULL; } + vlclua_set_this( L, p_this ); + /* Load Lua libraries */ luaL_openlibs( L ); /* XXX: Don't open all the libs? */ @@ -75,9 +77,6 @@ static lua_State * init( vlc_object_t *p_this, input_item_t * p_item, const char luaopen_md5( L ); luaopen_input_item( L, p_item ); - lua_pushlightuserdata( L, p_this ); - lua_setfield( L, -2, "private" ); - if( vlclua_add_modules_path( p_this, L, psz_filename ) ) { msg_Warn( p_this, "Error while setting the module search path for %s", diff --git a/modules/misc/lua/services_discovery.c b/modules/misc/lua/services_discovery.c index f5e21fdff7..d5f36494da 100644 --- a/modules/misc/lua/services_discovery.c +++ b/modules/misc/lua/services_discovery.c @@ -94,10 +94,9 @@ int Open_LuaSD( vlc_object_t *p_this ) msg_Err( p_sd, "Could not create new Lua State" ); goto error; } + vlclua_set_this( L, p_sd ); luaL_openlibs( L ); luaL_register( L, "vlc", p_reg ); - lua_pushlightuserdata( L, p_sd ); - lua_setfield( L, -2, "private" ); luaopen_input( L ); luaopen_msg( L ); luaopen_misc( L ); diff --git a/modules/misc/lua/vlc.h b/modules/misc/lua/vlc.h index e6e13d2ca8..20b19fd500 100644 --- a/modules/misc/lua/vlc.h +++ b/modules/misc/lua/vlc.h @@ -91,6 +91,8 @@ static inline const char *luaL_nilorcheckstring( lua_State *L, int narg ) return luaL_checkstring( L, narg ); } +#define vlclua_set_this(a, b) __vlclua_set_this(a, VLC_OBJECT(b)) +void __vlclua_set_this( lua_State *, vlc_object_t * ); vlc_object_t * vlclua_get_this( lua_State * ); /***************************************************************************** -- 2.39.2