[vlc-commits] lua: fix more sd input options and lua stack use-after-gc

Pierre Ynard git at videolan.org
Wed May 23 05:09:47 CEST 2012


vlc | branch: master | Pierre Ynard <linkfanel at yahoo.fr> | Wed May 23 05:07:19 2012 +0200| [8f048e9cabebeec8b514e981993d16acfbbd7c28] | committer: Pierre Ynard

lua: fix more sd input options and lua stack use-after-gc

Strings from the lua stack stop being valid after you pop them

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=8f048e9cabebeec8b514e981993d16acfbbd7c28
---

 modules/lua/libs/sd.c |   25 +++++++++++++++++--------
 1 file changed, 17 insertions(+), 8 deletions(-)

diff --git a/modules/lua/libs/sd.c b/modules/lua/libs/sd.c
index 5bca257..591ef46 100644
--- a/modules/lua/libs/sd.c
+++ b/modules/lua/libs/sd.c
@@ -220,19 +220,23 @@ static int vlclua_sd_add_item( lua_State *L )
         lua_getfield( L, -1, "path" );
         if( lua_isstring( L, -1 ) )
         {
-            char **ppsz_options = NULL;
-            int i_options = 0;
             const char *psz_path = lua_tostring( L, -1 );
 
-            lua_pop( L, 1 );
-            vlclua_read_options( p_sd, L, &i_options, &ppsz_options );
-            lua_getfield( L, -1, "title" );
+            lua_getfield( L, -2, "title" );
             const char *psz_title = luaL_checkstring( L, -1 ) ? luaL_checkstring( L, -1 ) : psz_path;
+
+            /* The table must be at the top of the stack when calling
+             * vlclua_read_options() */
+            char **ppsz_options = NULL;
+            int i_options = 0;
+            lua_pushvalue( L, -3 );
+            vlclua_read_options( p_sd, L, &i_options, &ppsz_options );
+
             input_item_t *p_input = input_item_NewExt( psz_path, psz_title,
                                                        i_options,
                                                        (const char **)ppsz_options,
                                                        VLC_INPUT_OPTION_TRUSTED, -1 );
-            lua_pop( L, 1 );
+            lua_pop( L, 3 );
 
             if( p_input )
             {
@@ -310,16 +314,21 @@ static int vlclua_node_add_subitem( lua_State *L )
             lua_getfield( L, -1, "path" );
             if( lua_isstring( L, -1 ) )
             {
+                const char *psz_path = lua_tostring( L, -1 );
+
+                /* The table must be at the top of the stack when calling
+                 * vlclua_read_options() */
                 char **ppsz_options = NULL;
                 int i_options = 0;
-                const char *psz_path = lua_tostring( L, -1 );
+                lua_pushvalue( L, -2 );
                 vlclua_read_options( p_sd, L, &i_options, &ppsz_options );
+
                 input_item_node_t *p_input_node = input_item_node_Create( *pp_node );
                 input_item_t *p_input = input_item_NewExt( psz_path,
                                                            psz_path, i_options,
                                                            (const char **)ppsz_options,
                                                            VLC_INPUT_OPTION_TRUSTED, -1 );
-                lua_pop( L, 1 );
+                lua_pop( L, 2 );
 
                 if( p_input )
                 {



More information about the vlc-commits mailing list