[vlc-devel] [PATCH 1/1] stream_filter: smooth: fix leaks (cid #1251056)
Tristan Matthews
le.businessman at gmail.com
Wed Nov 5 15:12:54 CET 2014
---
modules/stream_filter/smooth/smooth.c | 53 ++++++++++++++++++++---------------
1 file changed, 30 insertions(+), 23 deletions(-)
diff --git a/modules/stream_filter/smooth/smooth.c b/modules/stream_filter/smooth/smooth.c
index f876778..eee774d 100644
--- a/modules/stream_filter/smooth/smooth.c
+++ b/modules/stream_filter/smooth/smooth.c
@@ -116,6 +116,16 @@ static void print_chunk( stream_t *s, chunk_t *ck )
}
#endif
+static void cleanup_attributes(custom_attrs_t **cp)
+{
+ if( !*cp )
+ return;
+
+ free( (*cp)->psz_key );
+ free( (*cp)->psz_value );
+ FREENULL( *cp );
+}
+
static int parse_Manifest( stream_t *s )
{
stream_sys_t *p_sys = s->p_sys;
@@ -152,6 +162,7 @@ static int parse_Manifest( stream_t *s )
unsigned next_qid = 1;
int loop_count = 0;
bool b_weird = false;
+ int ret = VLC_SUCCESS;
#define TIMESCALE 10000000
while( (type = xml_ReaderNextNode( vlc_reader, &node )) > 0 )
@@ -180,9 +191,8 @@ static int parse_Manifest( stream_t *s )
sms = sms_New();
if( unlikely( !sms ) )
{
- xml_ReaderDelete( vlc_reader );
- xml_Delete( vlc_xml );
- return VLC_ENOMEM;
+ ret = VLC_ENOMEM;
+ goto cleanup;
}
sms->id = next_track_id;
next_track_id++;
@@ -238,6 +248,11 @@ static int parse_Manifest( stream_t *s )
if (!sms || !ql || cp)
break;
cp = (custom_attrs_t *) calloc( 1, sizeof(*cp) );
+ if( unlikely( !cp ) )
+ {
+ ret = VLC_ENOMEM;
+ goto cleanup;
+ }
}
else if ( !strcmp( node, "Attribute" ) )
{
@@ -260,10 +275,8 @@ static int parse_Manifest( stream_t *s )
ql = ql_New();
if( !ql )
{
- sms_Free( sms );
- xml_ReaderDelete( vlc_reader );
- xml_Delete( vlc_xml );
- return VLC_ENOMEM;
+ ret = VLC_ENOMEM;
+ goto cleanup;
}
ql->id = next_qid;
next_qid++;
@@ -366,10 +379,8 @@ static int parse_Manifest( stream_t *s )
if( unlikely( chunk_New( sms, computed_duration,
computed_start_time ) == NULL ) )
{
- sms_Free( sms );
- xml_ReaderDelete( vlc_reader );
- xml_Delete( vlc_xml );
- return VLC_ENOMEM;
+ ret = VLC_ENOMEM;
+ goto cleanup;
}
if( b_weird && start_time != -1 )
computed_start_time = start_time;
@@ -389,9 +400,7 @@ static int parse_Manifest( stream_t *s )
{
if( !cp->psz_key || !cp->psz_value )
{
- free( cp->psz_key );
- free( cp->psz_value );
- FREENULL( cp );
+ cleanup_attributes( &cp );
}
}
else if( strcmp( node, "StreamIndex" ) )
@@ -405,10 +414,8 @@ static int parse_Manifest( stream_t *s )
loop_count = 0;
if( b_weird && !chunk_New( sms, computed_duration, computed_start_time ) )
{
- sms_Free( sms );
- xml_ReaderDelete( vlc_reader );
- xml_Delete( vlc_xml );
- return VLC_ENOMEM;
+ ret = VLC_ENOMEM;
+ goto cleanup;
}
b_weird = false;
@@ -424,19 +431,19 @@ static int parse_Manifest( stream_t *s )
case XML_READER_TEXT:
break;
default:
- sms_Free( sms );
- xml_ReaderDelete( vlc_reader );
- xml_Delete( vlc_xml );
- return VLC_EGENERIC;
+ ret = VLC_EGENERIC;
+ goto cleanup;
}
}
#undef TIMESCALE
+cleanup:
+ cleanup_attributes( &cp );
sms_Free( sms );
xml_ReaderDelete( vlc_reader );
xml_Delete( vlc_xml );
- return VLC_SUCCESS;
+ return ret;
}
static void SysCleanup( stream_sys_t *p_sys )
--
1.9.3
More information about the vlc-devel
mailing list