[vlc-commits] lua: fixed object release function

Quentin Chateau git at videolan.org
Sun Feb 23 16:52:35 CET 2020


vlc | branch: master | Quentin Chateau <quentin.chateau at deepskycorp.com> | 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 <remi at remlab.net>

> 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;



More information about the vlc-commits mailing list