[FFmpeg-devel,37/37] avformat/matroskadec: Improve check for level 1 duplicates

Submitted by Andreas Rheinhardt on May 16, 2019, 10:30 p.m.

Details

Message ID 20190516223018.30827-38-andreas.rheinhardt@gmail.com
State Accepted
Commit 806ac7da6927c1a9db2d6bc7af272733078964a0
Headers show

Commit Message

Andreas Rheinhardt May 16, 2019, 10:30 p.m.
If a file uses unknown-length level 1 elements besides clusters and such
elements are after the first cluster, then these elements will usually
be parsed twice: Once during parsing of the file header and once when
reading the file reaches the position where these elements are located.
The second time the element is parsed leads to a "Duplicate element"
error message. Known-length elements are not affected by this as they
are skipped except during parsing the header.

This commit fixes this by explicitly adding a check for whether the
position of the element to be parsed is the same as the position of the
already known level 1 element.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
---
 libavformat/matroskadec.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

Patch hide | download patch | download mbox

diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 0bf6477b0e..a4ba9720c6 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -1386,7 +1386,10 @@  static int ebml_parse(MatroskaDemuxContext *matroska,
             matroska->cues_parsing_deferred = 0;
         if (syntax->type == EBML_LEVEL1 &&
             (level1_elem = matroska_find_level1_elem(matroska, syntax->id))) {
-            if (level1_elem->parsed)
+            if (!level1_elem->pos) {
+                // Zero is not a valid position for a level 1 element.
+                level1_elem->pos = pos;
+            } else if (level1_elem->pos != pos)
                 av_log(matroska->ctx, AV_LOG_ERROR, "Duplicate element\n");
             level1_elem->parsed = 1;
         }