[vlc-commits] vlm: fix memory leaks.
Rémi Duraffort
git at videolan.org
Mon Mar 21 21:45:47 CET 2011
vlc | branch: master | Rémi Duraffort <ivoire at videolan.org> | Mon Mar 21 21:44:11 2011 +0100| [f972ae1353851298beb8f03a6dfa6be8a5b6a570] | committer: Rémi Duraffort
vlm: fix memory leaks.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=f972ae1353851298beb8f03a6dfa6be8a5b6a570
---
src/control/vlm.c | 41 ++++++++++++++++++++++++++---------------
1 files changed, 26 insertions(+), 15 deletions(-)
diff --git a/src/control/vlm.c b/src/control/vlm.c
index 81ba9fc..c6d5f36 100644
--- a/src/control/vlm.c
+++ b/src/control/vlm.c
@@ -227,6 +227,7 @@ static char* recurse_answer( vlm_message_t *p_answer, const char* psz_delim,
char* psz_childdelim = NULL;
char* psz_nametag = NULL;
char* psz_response = strdup( "" );
+ char *psz_tmp;
int i_success = 0;
int i;
vlm_message_t *aw_child, **paw_child;
@@ -248,9 +249,11 @@ static char* recurse_answer( vlm_message_t *p_answer, const char* psz_delim,
/* Append name of child node, if not in a list */
if( !i_list )
{
- i_success = asprintf( &psz_response, "%s\"%s\": ",
+ i_success = asprintf( &psz_tmp, "%s\"%s\": ",
psz_response, aw_child->psz_name );
if( i_success == -1 ) break;
+ free( psz_response );
+ psz_response = psz_tmp;
}
/* If child node has children, */
@@ -278,24 +281,28 @@ static char* recurse_answer( vlm_message_t *p_answer, const char* psz_delim,
strcmp( aw_child->psz_name, "inputs" ) == 0 ||
strcmp( aw_child->psz_name, "options" ) == 0 )
{
- i_success = asprintf( &psz_response, "%s[%s%s%s]%c%s",
- psz_response, psz_childdelim,
- recurse_answer( aw_child,
- psz_childdelim, 1 ),
+ char *psz_recurse = recurse_answer( aw_child, psz_childdelim, 1 ),
+ i_success = asprintf( &psz_tmp, "%s[%s%s%s]%c%s",
+ psz_response, psz_childdelim, psz_recurse,
psz_delim, c_comma, psz_delim );
+ free( psz_recurse );
if( i_success == -1 ) break;
+ free( psz_response );
+ psz_response = psz_tmp;
}
/* Not a list, so format the child as a JSON object and
* recurse through the child's children
*/
else
{
- i_success = asprintf( &psz_response, "%s{%s%s%s%s}%c%s",
+ char *psz_recurse = recurse_answer( aw_child, psz_childdelim, 0 ),
+ i_success = asprintf( &psz_tmp, "%s{%s%s%s%s}%c%s",
psz_response, psz_childdelim, psz_nametag,
- recurse_answer( aw_child,
- psz_childdelim, 0 ),
- psz_delim, c_comma, psz_delim );
+ psz_recurse, psz_delim, c_comma, psz_delim );
+ free( psz_recurse );
if( i_success == -1 ) break;
+ free( psz_response );
+ psz_response = psz_tmp;
}
}
/* Otherwise - when no children are present - the node is a
@@ -307,18 +314,21 @@ static char* recurse_answer( vlm_message_t *p_answer, const char* psz_delim,
if( aw_child->psz_value == NULL
|| strcmp( aw_child->psz_value, "(null)" ) == 0 )
{
- i_success = asprintf( &psz_response, "%snull%c%s",
+ i_success = asprintf( &psz_tmp, "%snull%c%s",
psz_response, c_comma, psz_delim );
- if( i_success == -1 )
- break;
+ if( i_success == -1 ) break;
+ free( psz_response );
+ psz_response = psz_tmp;
}
/* Otherwise print the value in quotation marks */
else
{
- i_success = asprintf( &psz_response, "%s\"%s\"%c%s",
+ i_success = asprintf( &psz_tmp, "%s\"%s\"%c%s",
psz_response, aw_child->psz_value,
c_comma, psz_delim );
if( i_success == -1 ) break;
+ free( psz_response );
+ psz_response = psz_tmp;
}
}
/* getting next child */
@@ -373,12 +383,13 @@ const char* libvlc_vlm_show_media( libvlc_instance_t *p_instance,
psz_delimiter = "\n";
i_list = 1;
}
- if( asprintf( &psz_response, psz_fmt,
- recurse_answer( answer, psz_delimiter, i_list ) ) == -1 )
+ char *psz_tmp = recurse_answer( answer, psz_delimiter, i_list );
+ if( asprintf( &psz_response, psz_fmt, psz_tmp ) == -1 )
{
libvlc_printerr( "Out of memory" );
psz_response = NULL;
}
+ free( psz_tmp );
}
free( psz_message );
return( psz_response );
More information about the vlc-commits
mailing list