vlc | branch: master | Quentin Chateau <[email protected]> | Fri Feb 21 15:04:31 2020 +0100| [e965992290173c0a0cdf4968c680e56a24988d68] | committer: Rémi Denis-Courmont
lua: fixed object release function As a single metatable for vlc_object exists all lua objects in objects.c would be freed with the same release function That caused segmentation faults Signed-off-by: Rémi Denis-Courmont <[email protected]> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=e965992290173c0a0cdf4968c680e56a24988d68 --- modules/lua/libs/objects.c | 53 ++++++++++++++++++++-------------------------- 1 file changed, 23 insertions(+), 30 deletions(-) diff --git a/modules/lua/libs/objects.c b/modules/lua/libs/objects.c index 6e9717d859..420eaea8ef 100644 --- a/modules/lua/libs/objects.c +++ b/modules/lua/libs/objects.c @@ -44,25 +44,36 @@ * Generic vlc_object_t wrapper creation *****************************************************************************/ +typedef struct vlclua_object { + vlc_object_t *object; + int (*release)(vlc_object_t *); +} vlclua_object_t; + +static void vlclua_release_vlc_object(lua_State *L) +{ + vlclua_object_t *p_luaobj = luaL_checkudata(L, 1, "vlc_object"); + + lua_pop(L, 1); + if (p_luaobj->release) + p_luaobj->release(p_luaobj->object); +} + static int vlclua_push_vlc_object(lua_State *L, vlc_object_t *p_obj, - int (*release)(lua_State *)) + int (*release)(vlc_object_t *)) { - vlc_object_t **udata = - (vlc_object_t **)lua_newuserdata(L, sizeof (vlc_object_t *)); + vlclua_object_t *udata = + (vlclua_object_t *)lua_newuserdata(L, sizeof (vlclua_object_t)); - *udata = p_obj; + udata->object = p_obj; + udata->release = release; if (luaL_newmetatable(L, "vlc_object")) { /* Hide the metatable */ lua_pushliteral(L, "none of your business"); lua_setfield(L, -2, "__metatable"); - /* Set the garbage collector if needed */ - if (release != NULL) - { - lua_pushcfunction(L, release); - lua_setfield(L, -2, "__gc"); - } + lua_pushcfunction(L, vlclua_release_vlc_object); + lua_setfield(L, -2, "__gc"); } lua_setmetatable(L, -2); return 1; @@ -95,39 +106,21 @@ static int vlclua_get_player( lua_State *L ) return 1; } -static int vlclua_vout_release(lua_State *L) -{ - vlc_object_t **pp = luaL_checkudata(L, 1, "vlc_object"); - - lua_pop(L, 1); - vout_Release((vout_thread_t *)*pp); - return 0; -} - static int vlclua_get_vout( lua_State *L ) { vout_thread_t *vout = vlclua_get_vout_internal(L); if (vout) - vlclua_push_vlc_object(L, VLC_OBJECT(vout), vlclua_vout_release); + vlclua_push_vlc_object(L, VLC_OBJECT(vout), vout_Release); else lua_pushnil(L); return 1; } -static int vlclua_aout_release(lua_State *L) -{ - vlc_object_t **pp = luaL_checkudata(L, 1, "vlc_object"); - - lua_pop(L, 1); - aout_Release((audio_output_t *)*pp); - return 0; -} - static int vlclua_get_aout( lua_State *L ) { audio_output_t *aout = vlclua_get_aout_internal(L); if (aout) - vlclua_push_vlc_object(L, VLC_OBJECT(aout), vlclua_aout_release); + vlclua_push_vlc_object(L, VLC_OBJECT(aout), aout_Release); else lua_pushnil(L); return 1; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
