From bffeb000dc2b561733fb92fdf868e472a07ea258 Mon Sep 17 00:00:00 2001 From: Grigori Goronzy Date: Thu, 2 Jul 2009 16:37:52 +0200 Subject: Fix crash when event format spec is missing libass didn't properly initialize its idea about the event format specification (the Format: line in the [Events] section) in case none was explicitly specified. This ends in a crash due to access to a null pointer. It was changed so that the event format is initialized to a reasonable default, the way it is also done for embedded subtitles. --- libass/ass.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/libass/ass.c b/libass/ass.c index 7b90292..5aef144 100644 --- a/libass/ass.c +++ b/libass/ass.c @@ -560,6 +560,20 @@ static int process_info_line(ass_track_t *track, char *str) return 0; } +static void event_format_fallback(ass_track_t *track) +{ + track->parser_priv->state = PST_EVENTS; + if (track->track_type == TRACK_TYPE_SSA) + track->event_format = + strdup + ("Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text"); + else + track->event_format = + strdup + ("Format: Layer, Start, End, Style, Actor, MarginL, MarginR, MarginV, Effect, Text"); + ass_msg(MSGL_V, "No event format found, using fallback.\n"); +} + static int process_events_line(ass_track_t *track, char *str) { if (!strncmp(str, "Format:", 7)) { @@ -581,6 +595,10 @@ static int process_events_line(ass_track_t *track, char *str) eid = ass_alloc_event(track); event = track->events + eid; + // We can't parse events with event_format + if (!track->event_format) + event_format_fallback(track); + process_event_tail(track, event, str, 0); } else { ass_msg(MSGL_V, "Not understood: %s \n", str); @@ -799,19 +817,10 @@ void ass_process_codec_private(ass_track_t *track, char *data, int size) { ass_process_data(track, data, size); - if (!track->event_format) { - // probably an mkv produced by ancient mkvtoolnix - // such files don't have [Events] and Format: headers - track->parser_priv->state = PST_EVENTS; - if (track->track_type == TRACK_TYPE_SSA) - track->event_format = - strdup - ("Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text"); - else - track->event_format = - strdup - ("Format: Layer, Start, End, Style, Actor, MarginL, MarginR, MarginV, Effect, Text"); - } + // probably an mkv produced by ancient mkvtoolnix + // such files don't have [Events] and Format: headers + if (!track->event_format) + event_format_fallback(track); ass_process_force_style(track); } -- cgit v1.2.3