Browse Source

codec: webvtt: fix recursive cleanup

no siblings were reclaimed on cleanup

regression by 150a7f5648

(cherry picked from commit 73861536c3)
cherry-pick-c5513cf9
François Cartegnie 9 months ago
committed by Felix Paul Kühne
parent
commit
b125e361b2
  1. 39
      modules/codec/webvtt/subsvtt.c

39
modules/codec/webvtt/subsvtt.c

@ -462,16 +462,14 @@ static void webvtt_domnode_AppendLast( webvtt_dom_node_t **pp_append,
webvtt_domnode_AppendLast( (webvtt_dom_node_t **) a, (webvtt_dom_node_t *) b )
static webvtt_dom_node_t *webvtt_domnode_DeleteNode( webvtt_dom_node_t *p_node )
static void webvtt_domnode_DeleteNode( webvtt_dom_node_t *p_node )
{
webvtt_dom_node_t *p_child = NULL;
if( p_node->type == NODE_TAG )
{
webvtt_dom_tag_t *p_tag_node = (webvtt_dom_tag_t *) p_node;
text_style_Delete( p_tag_node->p_cssstyle );
free( p_tag_node->psz_attrs );
free( p_tag_node->psz_tag );
p_child = p_tag_node->p_child;
}
else if( p_node->type == NODE_TEXT )
{
@ -484,30 +482,51 @@ static webvtt_dom_node_t *webvtt_domnode_DeleteNode( webvtt_dom_node_t *p_node )
text_style_Delete( p_cue_node->p_cssstyle );
webvtt_cue_settings_Clean( &p_cue_node->settings );
free( p_cue_node->psz_id );
p_child = p_cue_node->p_child;
}
else if( p_node->type == NODE_REGION )
{
webvtt_region_t *p_region_node = (webvtt_region_t *)p_node;
text_style_Delete( p_region_node->p_cssstyle );
free( p_region_node->psz_id );
p_child = p_region_node->p_child;
}
free( p_node );
return p_child;
}
static webvtt_dom_node_t * webvtt_domnode_getFirstChild( webvtt_dom_node_t *p_node );
static void webvtt_domnode_ChainDelete( webvtt_dom_node_t *p_node )
{
vlc_array_t stack;
vlc_array_init( &stack );
while( p_node )
{
webvtt_dom_node_t *p_child = webvtt_domnode_getFirstChild( p_node );
webvtt_dom_node_t *p_next = p_node->p_next;
webvtt_dom_node_t *p_child = webvtt_domnode_DeleteNode( p_node );
while ( p_child )
p_child = webvtt_domnode_DeleteNode( p_child );
/* delete current node, then go to child, and then siblings */
webvtt_domnode_DeleteNode( p_node );
p_node = p_child;
if( p_next )
{
if( p_child ) /* go to child, process sibling later */
vlc_array_append( &stack, p_next );
else
p_node = p_next;
}
p_node = p_next;
if( !p_node )
{
/* pop saved next node */
size_t idx = vlc_array_count( &stack );
if( idx )
{
p_node = vlc_array_item_at_index( &stack, idx - 1 );
vlc_array_remove( &stack, idx - 1 );
}
}
}
vlc_array_clear( &stack );
}
static webvtt_dom_text_t * webvtt_dom_text_New( webvtt_dom_node_t *p_parent )

Loading…
Cancel
Save