Hopefully valid patch attached.

On Mon, Mar 20, 2017 at 2:39 PM, Fredrik Hubinette <hu...@google.com> wrote:

> It looks like the value in s->error also comes from an earlier call to
> avio_read().
> ogg_read_page tries to read 4439 bytes from the file. It has 524 bytes
> already buffered.
> fill_buffer() fails with an EIO, but because of the buffered bytes,
> avio_read()
> returns 524 and leaves the EIO in s->error.
>
>   /Fredrik "Hubbe" Hubinette
>
>
> On Mon, Mar 20, 2017 at 1:53 PM, Fredrik Hubinette <hu...@google.com>
> wrote:
>
>>
>> On Mon, Mar 20, 2017 at 1:35 PM, Michael Niedermayer <
>> mich...@niedermayer.cc> wrote:
>>
>>> On Mon, Mar 20, 2017 at 10:21:08AM -0700, Fredrik Hubinette wrote:
>>> > In some cases (when parsing OGG) non-fatal errors can happen, which
>>> > will cause s->error to be set. In most cases, this is not a problem
>>> beucase
>>> > s->error is not checked unless an actual error has occurred.  However,
>>> > when avio_read() fails to read more bytes, it checks s->error to
>>> decide if
>>> > it just reached the end of the file, or an error occurred. Since
>>> s->error is
>>> > not modified if no error occurred, this is not reliable unless we first
>>> > clear
>>> > s->error before reading.
>>> >
>>> > ---
>>> >  libavformat/aviobuf.c   | 2 ++
>>> >
>>> >  2 files changed, 7 insertions(+)
>>>
>>> how can the issue you describe be reproduced
>>>
>>>
>> I don't currently have a simple repro. I discovered it while trying to
>> add some buffering
>> between the demuxer and decoder in chrome. One of our tests fails, and
>> when
>> looked into it, I discovered that s->error was already 5 (EIO) when
>> entering
>> avio_read. I have not yet tracked down where the EIO came from
>> originally.
>>
>> also thats not a valid git patc
>>>
>>
>> Ops, I had a chrome patch and I removed the chrome-specific parts, but
>> I must have messed it up. I will make a better patch.
>>
>>
>>> [...]
>>> --
>>> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>>>
>>> Those who are best at talking, realize last or never when they are wrong.
>>>
>>> _______________________________________________
>>> ffmpeg-devel mailing list
>>> ffmpeg-devel@ffmpeg.org
>>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>>
>>>
>>
>
From a26c186d2ac6d013215e9707fa3508ba1ef8537a Mon Sep 17 00:00:00 2001
From: Fredrik Hubinette <hu...@google.com>
Date: Mon, 20 Mar 2017 14:47:06 -0700
Subject: [PATCH] clear s->error in avio_read

---
 libavformat/aviobuf.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c
index 4ade4d0d7e..0912dfdb57 100644
--- a/libavformat/aviobuf.c
+++ b/libavformat/aviobuf.c
@@ -615,6 +615,8 @@ int avio_read(AVIOContext *s, unsigned char *buf, int size)
 {
     int len, size1;
 
+    s->error = 0;
+
     size1 = size;
     while (size > 0) {
         len = FFMIN(s->buf_end - s->buf_ptr, size);
-- 
2.12.0.367.g23dc2f6d3c-goog

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to