summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demux_mkv.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmpdemux/demux_mkv.c')
-rw-r--r--libmpdemux/demux_mkv.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c
index dcf2a71721..3874298172 100644
--- a/libmpdemux/demux_mkv.c
+++ b/libmpdemux/demux_mkv.c
@@ -1093,6 +1093,7 @@ static uint64_t read_one_chapter(struct demuxer *demuxer, stream_t *s)
char *name = 0;
int i;
uint32_t id;
+ bool badchapter = false;
len = ebml_read_length(s, &i);
uint64_t bytes_read = len + i;
@@ -1147,6 +1148,15 @@ static uint64_t read_one_chapter(struct demuxer *demuxer, stream_t *s)
}
break;
+ case MATROSKA_ID_CHAPTERSEGMENTEDITIONUID:
+ mp_tmsg(MSGT_DEMUX, MSGL_WARN,
+ "[mkv] Warning: unsupported edition recursion in chapter; "
+ "will skip on playback!\n");
+ ebml_read_skip(s, &l);
+ len -= l;
+ badchapter = true;
+ break;
+
default:
ebml_read_skip(s, &l);
len -= l;
@@ -1169,6 +1179,11 @@ static uint64_t read_one_chapter(struct demuxer *demuxer, stream_t *s)
m->ordered_chapters[m->num_ordered_chapters] = chapter;
m->num_ordered_chapters++;
+ if (badchapter) {
+ memset(&chapter.segment_uid, 0, sizeof(chapter.segment_uid));
+ goto cleanup;
+ }
+
mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Chapter %u from %02d:%02d:%02d."
"%03d to %02d:%02d:%02d.%03d, %s\n",
cid,
@@ -1181,6 +1196,7 @@ static uint64_t read_one_chapter(struct demuxer *demuxer, stream_t *s)
(int) ((end / 1000) % 60),
(int) (end % 1000), name);
+cleanup:
free(name);
return bytes_read;
}