Commit 6015f8b8 authored by Rémi Duraffort's avatar Rémi Duraffort

demux_qtl: fix potential object leak and remove dummy private structure.

parent b9a78ce5
...@@ -58,14 +58,6 @@ volume - 0 (mute) - 100 (max) ...@@ -58,14 +58,6 @@ volume - 0 (mute) - 100 (max)
#include "playlist.h" #include "playlist.h"
#include <vlc_xml.h> #include <vlc_xml.h>
struct demux_sys_t
{
input_item_t *p_current_input;
xml_t *p_xml;
xml_reader_t *p_xml_reader;
};
typedef enum { FULLSCREEN_NORMAL, typedef enum { FULLSCREEN_NORMAL,
FULLSCREEN_DOUBLE, FULLSCREEN_DOUBLE,
FULLSCREEN_HALF, FULLSCREEN_HALF,
...@@ -88,9 +80,15 @@ static int Control( demux_t *p_demux, int i_query, va_list args ); ...@@ -88,9 +80,15 @@ static int Control( demux_t *p_demux, int i_query, va_list args );
*****************************************************************************/ *****************************************************************************/
int Import_QTL( vlc_object_t *p_this ) int Import_QTL( vlc_object_t *p_this )
{ {
DEMUX_BY_EXTENSION_MSG( ".qtl", "using QuickTime Media Link reader" ); demux_t *p_demux = (demux_t *)p_this;
p_demux->p_sys->p_xml = NULL;
p_demux->p_sys->p_xml_reader = NULL; if( !demux_IsPathExtension( p_demux, ".qtl" ) )
return VLC_EGENERIC;
p_demux->pf_demux = Demux;
p_demux->pf_control = Control;
msg_Dbg( p_demux, "using QuickTime Media Link reader" );
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -99,23 +97,16 @@ int Import_QTL( vlc_object_t *p_this ) ...@@ -99,23 +97,16 @@ int Import_QTL( vlc_object_t *p_this )
*****************************************************************************/ *****************************************************************************/
void Close_QTL( vlc_object_t *p_this ) void Close_QTL( vlc_object_t *p_this )
{ {
demux_t *p_demux = (demux_t *)p_this; (void)p_this;
demux_sys_t *p_sys = p_demux->p_sys;
if( p_sys->p_xml_reader )
xml_ReaderDelete( p_sys->p_xml, p_sys->p_xml_reader );
if( p_sys->p_xml )
xml_Delete( p_sys->p_xml );
free( p_sys );
} }
static int Demux( demux_t *p_demux ) static int Demux( demux_t *p_demux )
{ {
demux_sys_t *p_sys = p_demux->p_sys;
xml_t *p_xml; xml_t *p_xml;
xml_reader_t *p_xml_reader; xml_reader_t *p_xml_reader = NULL;
char *psz_eltname = NULL; char *psz_eltname = NULL;
input_item_t *p_input; input_item_t *p_input;
int i_ret = -1;
/* List of all possible attributes. The only required one is "src" */ /* List of all possible attributes. The only required one is "src" */
bool b_autoplay = false; bool b_autoplay = false;
...@@ -135,20 +126,19 @@ static int Demux( demux_t *p_demux ) ...@@ -135,20 +126,19 @@ static int Demux( demux_t *p_demux )
INIT_PLAYLIST_STUFF; INIT_PLAYLIST_STUFF;
p_sys->p_current_input = p_current_input; p_xml = xml_Create( p_demux );
if( !p_xml )
p_xml = p_sys->p_xml = xml_Create( p_demux ); goto error;
if( !p_xml ) return -1;
p_xml_reader = xml_ReaderCreate( p_xml, p_demux->s ); p_xml_reader = xml_ReaderCreate( p_xml, p_demux->s );
if( !p_xml_reader ) return -1; if( !p_xml_reader )
p_sys->p_xml_reader = p_xml_reader; goto error;
/* check root node */ /* check root node */
if( xml_ReaderRead( p_xml_reader ) != 1 ) if( xml_ReaderRead( p_xml_reader ) != 1 )
{ {
msg_Err( p_demux, "invalid file (no root node)" ); msg_Err( p_demux, "invalid file (no root node)" );
return -1; goto error;
} }
if( xml_ReaderNodeType( p_xml_reader ) != XML_READER_STARTELEM || if( xml_ReaderNodeType( p_xml_reader ) != XML_READER_STARTELEM ||
...@@ -169,21 +159,21 @@ static int Demux( demux_t *p_demux ) ...@@ -169,21 +159,21 @@ static int Demux( demux_t *p_demux )
msg_Err( p_demux, "invalid root node %i, %s", msg_Err( p_demux, "invalid root node %i, %s",
xml_ReaderNodeType( p_xml_reader ), psz_eltname ); xml_ReaderNodeType( p_xml_reader ), psz_eltname );
free( psz_eltname ); free( psz_eltname );
return -1; goto error;
} }
} }
free( psz_eltname ); free( psz_eltname );
while( xml_ReaderNextAttr( p_sys->p_xml_reader ) == VLC_SUCCESS ) while( xml_ReaderNextAttr( p_xml_reader ) == VLC_SUCCESS )
{ {
char *psz_attrname = xml_ReaderName( p_sys->p_xml_reader ); char *psz_attrname = xml_ReaderName( p_xml_reader );
char *psz_attrvalue = xml_ReaderValue( p_sys->p_xml_reader ); char *psz_attrvalue = xml_ReaderValue( p_xml_reader );
if( !psz_attrname || !psz_attrvalue ) if( !psz_attrname || !psz_attrvalue )
{ {
free( psz_attrname ); free( psz_attrname );
free( psz_attrvalue ); free( psz_attrvalue );
return -1; goto error;
} }
if( !strcmp( psz_attrname, "autoplay" ) ) if( !strcmp( psz_attrname, "autoplay" ) )
...@@ -329,6 +319,14 @@ static int Demux( demux_t *p_demux ) ...@@ -329,6 +319,14 @@ static int Demux( demux_t *p_demux )
} }
} }
i_ret = 0; /* Needed for correct operation of go back */
error:
if( p_xml_reader )
xml_ReaderDelete( p_xml, p_xml_reader );
if( p_xml )
xml_Delete( p_xml );
HANDLE_PLAY_AND_RELEASE; HANDLE_PLAY_AND_RELEASE;
free( psz_href ); free( psz_href );
...@@ -336,8 +334,7 @@ static int Demux( demux_t *p_demux ) ...@@ -336,8 +334,7 @@ static int Demux( demux_t *p_demux )
free( psz_qtnext ); free( psz_qtnext );
free( psz_src ); free( psz_src );
free( psz_mimetype ); free( psz_mimetype );
return i_ret;
return 0; /* Needed for correct operation of go back */
} }
static int Control( demux_t *p_demux, int i_query, va_list args ) static int Control( demux_t *p_demux, int i_query, va_list args )
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment