aboutsummaryrefslogtreecommitdiffhomepage
path: root/demux
diff options
context:
space:
mode:
authorGravatar Kevin Mitchell <kevmitch@gmail.com>2015-12-17 01:40:31 -0800
committerGravatar Kevin Mitchell <kevmitch@gmail.com>2015-12-17 12:38:57 -0800
commit7137afeb2c466135ab0e01ee0f9cbd2abd000563 (patch)
tree04d3531660fc9f6ed2a0ebee538a95e3b77eae78 /demux
parentad80cc4eeec506fddd11e2a29d0b1868b3ca8170 (diff)
demux: check embedded cuesheet refers to only one file
If someone was "clever" enough to embed a cuesheet referencing multiple files, mpv would create a bunch of nonsense chapter markers.
Diffstat (limited to 'demux')
-rw-r--r--demux/cue.c15
-rw-r--r--demux/cue.h1
-rw-r--r--demux/demux.c13
3 files changed, 25 insertions, 4 deletions
diff --git a/demux/cue.c b/demux/cue.c
index d72e84249b..50ce4b7639 100644
--- a/demux/cue.c
+++ b/demux/cue.c
@@ -218,3 +218,18 @@ struct cue_file *mp_parse_cue(struct bstr data)
return f;
}
+
+int mp_check_embedded_cue(struct cue_file *f)
+{
+ char *fn0 = f->tracks[0].filename;
+ for (int n = 1; n < f->num_tracks; n++) {
+ char *fn = f->tracks[n].filename;
+ // both filenames have the same address (including NULL)
+ if (fn0 == fn)
+ continue;
+ // only one filename is NULL, or the strings don't match
+ if (!fn0 || !fn || strcmp(fn0, fn) != 0)
+ return -1;
+ }
+ return 0;
+}
diff --git a/demux/cue.h b/demux/cue.h
index cf4b4c1a08..1ae5f0a203 100644
--- a/demux/cue.h
+++ b/demux/cue.h
@@ -38,5 +38,6 @@ struct cue_track {
bool mp_probe_cue(struct bstr data);
struct cue_file *mp_parse_cue(struct bstr data);
+int mp_check_embedded_cue(struct cue_file *f);
#endif
diff --git a/demux/demux.c b/demux/demux.c
index dcad692be5..972bf31bae 100644
--- a/demux/demux.c
+++ b/demux/demux.c
@@ -926,10 +926,15 @@ static void demux_init_cuesheet(struct demuxer *demuxer)
if (cue && !demuxer->num_chapters) {
struct cue_file *f = mp_parse_cue(bstr0(cue));
if (f) {
- for (int n = 0; n < f->num_tracks; n++) {
- struct cue_track *t = &f->tracks[n];
- int idx = demuxer_add_chapter(demuxer, "", t->start, -1);
- mp_tags_merge(demuxer->chapters[idx].metadata, t->tags);
+ if (mp_check_embedded_cue(f) < 0) {
+ MP_WARN(demuxer, "Embedded cue sheet references more than one file. "
+ "Ignoring it.\n");
+ } else {
+ for (int n = 0; n < f->num_tracks; n++) {
+ struct cue_track *t = &f->tracks[n];
+ int idx = demuxer_add_chapter(demuxer, "", t->start, -1);
+ mp_tags_merge(demuxer->chapters[idx].metadata, t->tags);
+ }
}
}
talloc_free(f);