[FFmpeg-devel] [PATCH 13/37] avformat/matroskadec: Improve error/EOF checks III
Andreas Rheinhardt
andreas.rheinhardt at gmail.com
Fri May 17 01:29:57 EEST 2019
Up until now, when an element was skipped, it was relied upon
ffio_limit to make sure that there is enough data available to skip.
ffio_limit itself relies upon the availability of the file's size. As
this needn't be available, the check has been refined: First one byte
less than intended is skipped, then another byte is read, followed by a
check of the error flags.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
---
libavformat/matroskadec.c | 24 +++++++++++++++++-------
1 file changed, 17 insertions(+), 7 deletions(-)
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 3f11f60878..e01f1703e7 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -1280,13 +1280,23 @@ static int ebml_parse_elem(MatroskaDemuxContext *matroska,
case EBML_STOP:
return 1;
default:
- if (ffio_limit(pb, length) != length) {
- // ffio_limit emits its own error message,
- // so we don't have to.
- return AVERROR_EOF;
- }
- res = avio_skip(pb, length);
- res = res < 0 ? res : 0;
+ if (length) {
+ if (ffio_limit(pb, length) != length) {
+ // ffio_limit emits its own error message,
+ // so we don't have to.
+ return AVERROR_EOF;
+ }
+ if ((res = avio_skip(pb, length - 1)) >= 0) {
+ // avio_skip might take us past EOF. We check for this
+ // by skipping only length - 1 bytes, reading a byte and
+ // checking the error flags. This is done in order to check
+ // that the element has been properly skipped even when
+ // no filesize (that ffio_limit relies on) is available.
+ avio_r8(pb);
+ res = NEEDS_CHECKING;
+ }
+ } else
+ res = 0;
}
if (res) {
if (res == NEEDS_CHECKING) {
--
2.21.0
More information about the ffmpeg-devel
mailing list