diff mbox series

[FFmpeg-devel,1/4] avcodec/rtv1: Check if the minimal size is available in decode_rtv1()

Message ID 20230726235916.30058-1-michael@niedermayer.cc
State New
Headers show
Series [FFmpeg-devel,1/4] avcodec/rtv1: Check if the minimal size is available in decode_rtv1() | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Michael Niedermayer July 26, 2023, 11:59 p.m. UTC
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
---
 libavcodec/rtv1.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

Comments

Michael Niedermayer Sept. 22, 2023, 7:22 p.m. UTC | #1
On Thu, Jul 27, 2023 at 01:59:13AM +0200, Michael Niedermayer wrote:
> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
> ---
>  libavcodec/rtv1.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)

will apply 1-3 of this patchset

[...]
Paul B Mahol Sept. 22, 2023, 7:32 p.m. UTC | #2
On 9/22/23, Michael Niedermayer <michael@niedermayer.cc> wrote:
> On Thu, Jul 27, 2023 at 01:59:13AM +0200, Michael Niedermayer wrote:
>> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
>> ---
>>  libavcodec/rtv1.c | 6 +++++-
>>  1 file changed, 5 insertions(+), 1 deletion(-)
>
> will apply 1-3 of this patchset

Are you sure this does not break decoding?

It would not be first time you intentionally break decoders because of hacks.


>
> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> He who knows, does not speak. He who speaks, does not know. -- Lao Tsu
>
Michael Niedermayer Sept. 22, 2023, 9:26 p.m. UTC | #3
On Fri, Sep 22, 2023 at 09:32:47PM +0200, Paul B Mahol wrote:
> On 9/22/23, Michael Niedermayer <michael@niedermayer.cc> wrote:
> > On Thu, Jul 27, 2023 at 01:59:13AM +0200, Michael Niedermayer wrote:
> >> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
> >> ---
> >>  libavcodec/rtv1.c | 6 +++++-
> >>  1 file changed, 5 insertions(+), 1 deletion(-)
> >
> > will apply 1-3 of this patchset
> 
> Are you sure this does not break decoding?

Well, its a loop over 4x4 blocks, a 16bit "skip" run so the minimum
check looks correct.
There are 2 end of bitstream checks for early exit but they look like
error handling not some normal exit as they leave the frame uninitialized

Do you have some files so i can double check this is not breaking anything ?

thx

[...]
Paul B Mahol Sept. 22, 2023, 9:30 p.m. UTC | #4
On 9/22/23, Michael Niedermayer <michael@niedermayer.cc> wrote:
> On Fri, Sep 22, 2023 at 09:32:47PM +0200, Paul B Mahol wrote:
>> On 9/22/23, Michael Niedermayer <michael@niedermayer.cc> wrote:
>> > On Thu, Jul 27, 2023 at 01:59:13AM +0200, Michael Niedermayer wrote:
>> >> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
>> >> ---
>> >>  libavcodec/rtv1.c | 6 +++++-
>> >>  1 file changed, 5 insertions(+), 1 deletion(-)
>> >
>> > will apply 1-3 of this patchset
>>
>> Are you sure this does not break decoding?
>
> Well, its a loop over 4x4 blocks, a 16bit "skip" run so the minimum
> check looks correct.
> There are 2 end of bitstream checks for early exit but they look like
> error handling not some normal exit as they leave the frame uninitialized
>

FFmpeg default initialization code for AVFrame's buffers does it
twice, so they are always zeroed or previous values of previous
buffers in pool.

> Do you have some files so i can double check this is not breaking anything

Search trac tickets.

> ?
>
> thx
>
> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> Those who would give up essential Liberty, to purchase a little
> temporary Safety, deserve neither Liberty nor Safety -- Benjamin Franklin
>
Michael Niedermayer Sept. 22, 2023, 9:52 p.m. UTC | #5
On Fri, Sep 22, 2023 at 11:30:37PM +0200, Paul B Mahol wrote:
> On 9/22/23, Michael Niedermayer <michael@niedermayer.cc> wrote:
> > On Fri, Sep 22, 2023 at 09:32:47PM +0200, Paul B Mahol wrote:
> >> On 9/22/23, Michael Niedermayer <michael@niedermayer.cc> wrote:
> >> > On Thu, Jul 27, 2023 at 01:59:13AM +0200, Michael Niedermayer wrote:
> >> >> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
> >> >> ---
> >> >>  libavcodec/rtv1.c | 6 +++++-
> >> >>  1 file changed, 5 insertions(+), 1 deletion(-)
> >> >
> >> > will apply 1-3 of this patchset
> >>
> >> Are you sure this does not break decoding?
> >
> > Well, its a loop over 4x4 blocks, a 16bit "skip" run so the minimum
> > check looks correct.
> > There are 2 end of bitstream checks for early exit but they look like
> > error handling not some normal exit as they leave the frame uninitialized
> >
> 
> FFmpeg default initialization code for AVFrame's buffers does it
> twice, so they are always zeroed or previous values of previous
> buffers in pool.

its rare that correct frame decoding depends on internal AVFrame buffer
ordering


> 
> > Do you have some files so i can double check this is not breaking anything
> 
> Search trac tickets.

thanks, found a zip with 2 video files
ill check it


[...]
Paul B Mahol Sept. 22, 2023, 10:01 p.m. UTC | #6
On 9/22/23, Michael Niedermayer <michael@niedermayer.cc> wrote:
> On Fri, Sep 22, 2023 at 11:30:37PM +0200, Paul B Mahol wrote:
>> On 9/22/23, Michael Niedermayer <michael@niedermayer.cc> wrote:
>> > On Fri, Sep 22, 2023 at 09:32:47PM +0200, Paul B Mahol wrote:
>> >> On 9/22/23, Michael Niedermayer <michael@niedermayer.cc> wrote:
>> >> > On Thu, Jul 27, 2023 at 01:59:13AM +0200, Michael Niedermayer wrote:
>> >> >> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
>> >> >> ---
>> >> >>  libavcodec/rtv1.c | 6 +++++-
>> >> >>  1 file changed, 5 insertions(+), 1 deletion(-)
>> >> >
>> >> > will apply 1-3 of this patchset
>> >>
>> >> Are you sure this does not break decoding?
>> >
>> > Well, its a loop over 4x4 blocks, a 16bit "skip" run so the minimum
>> > check looks correct.
>> > There are 2 end of bitstream checks for early exit but they look like
>> > error handling not some normal exit as they leave the frame
>> > uninitialized
>> >
>>
>> FFmpeg default initialization code for AVFrame's buffers does it
>> twice, so they are always zeroed or previous values of previous
>> buffers in pool.
>
> its rare that correct frame decoding depends on internal AVFrame buffer
> ordering
>

Users are supposed to use error checking. And I think decoder returns
error on missing frame data.

When we lost interest in preserving all decoded frame pixels as much
as possible?

>
>>
>> > Do you have some files so i can double check this is not breaking
>> > anything
>>
>> Search trac tickets.
>
> thanks, found a zip with 2 video files
> ill check it
>
>
> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> "I am not trying to be anyone's saviour, I'm trying to think about the
>  future and not be sad" - Elon Musk
>
>
Michael Niedermayer Sept. 22, 2023, 10:33 p.m. UTC | #7
On Sat, Sep 23, 2023 at 12:01:17AM +0200, Paul B Mahol wrote:
> On 9/22/23, Michael Niedermayer <michael@niedermayer.cc> wrote:
> > On Fri, Sep 22, 2023 at 11:30:37PM +0200, Paul B Mahol wrote:
> >> On 9/22/23, Michael Niedermayer <michael@niedermayer.cc> wrote:
> >> > On Fri, Sep 22, 2023 at 09:32:47PM +0200, Paul B Mahol wrote:
> >> >> On 9/22/23, Michael Niedermayer <michael@niedermayer.cc> wrote:
> >> >> > On Thu, Jul 27, 2023 at 01:59:13AM +0200, Michael Niedermayer wrote:
> >> >> >> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
> >> >> >> ---
> >> >> >>  libavcodec/rtv1.c | 6 +++++-
> >> >> >>  1 file changed, 5 insertions(+), 1 deletion(-)
> >> >> >
> >> >> > will apply 1-3 of this patchset
> >> >>
> >> >> Are you sure this does not break decoding?
> >> >
> >> > Well, its a loop over 4x4 blocks, a 16bit "skip" run so the minimum
> >> > check looks correct.
> >> > There are 2 end of bitstream checks for early exit but they look like
> >> > error handling not some normal exit as they leave the frame
> >> > uninitialized
> >> >
> >>
> >> FFmpeg default initialization code for AVFrame's buffers does it
> >> twice, so they are always zeroed or previous values of previous
> >> buffers in pool.
> >
> > its rare that correct frame decoding depends on internal AVFrame buffer
> > ordering
> >
> 
> Users are supposed to use error checking. And I think decoder returns
> error on missing frame data.

yes, the rtv1 decoder looks a bit sloppy written, not returning error
codes on what looks like error checks.
Its not the only code doing that, ive seen this in other files too


> 
> When we lost interest in preserving all decoded frame pixels as much
> as possible?

when patches using discard_damaged_percentage where getting blocked in review
while simpler but less ideal solutions made all reviewers happy


I can implement this using discard_damaged_percentage, then the user can
decide at which point a frame would be too damaged to decode/return
and also to drop none or all with damage as the user prefers

thx

[...]
Paul B Mahol Sept. 22, 2023, 10:46 p.m. UTC | #8
On 9/23/23, Michael Niedermayer <michael@niedermayer.cc> wrote:
> On Sat, Sep 23, 2023 at 12:01:17AM +0200, Paul B Mahol wrote:
>> On 9/22/23, Michael Niedermayer <michael@niedermayer.cc> wrote:
>> > On Fri, Sep 22, 2023 at 11:30:37PM +0200, Paul B Mahol wrote:
>> >> On 9/22/23, Michael Niedermayer <michael@niedermayer.cc> wrote:
>> >> > On Fri, Sep 22, 2023 at 09:32:47PM +0200, Paul B Mahol wrote:
>> >> >> On 9/22/23, Michael Niedermayer <michael@niedermayer.cc> wrote:
>> >> >> > On Thu, Jul 27, 2023 at 01:59:13AM +0200, Michael Niedermayer
>> >> >> > wrote:
>> >> >> >> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
>> >> >> >> ---
>> >> >> >>  libavcodec/rtv1.c | 6 +++++-
>> >> >> >>  1 file changed, 5 insertions(+), 1 deletion(-)
>> >> >> >
>> >> >> > will apply 1-3 of this patchset
>> >> >>
>> >> >> Are you sure this does not break decoding?
>> >> >
>> >> > Well, its a loop over 4x4 blocks, a 16bit "skip" run so the minimum
>> >> > check looks correct.
>> >> > There are 2 end of bitstream checks for early exit but they look
>> >> > like
>> >> > error handling not some normal exit as they leave the frame
>> >> > uninitialized
>> >> >
>> >>
>> >> FFmpeg default initialization code for AVFrame's buffers does it
>> >> twice, so they are always zeroed or previous values of previous
>> >> buffers in pool.
>> >
>> > its rare that correct frame decoding depends on internal AVFrame buffer
>> > ordering
>> >
>>
>> Users are supposed to use error checking. And I think decoder returns
>> error on missing frame data.
>
> yes, the rtv1 decoder looks a bit sloppy written, not returning error
> codes on what looks like error checks.
> Its not the only code doing that, ive seen this in other files too

You are last person here to call some decoder(s) are sloppy written.

>
>
>>
>> When we lost interest in preserving all decoded frame pixels as much
>> as possible?
>
> when patches using discard_damaged_percentage where getting blocked in
> review
> while simpler but less ideal solutions made all reviewers happy
>
>
> I can implement this using discard_damaged_percentage, then the user can
> decide at which point a frame would be too damaged to decode/return
> and also to drop none or all with damage as the user prefers
>
> thx
>
> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> Homeopathy is like voting while filling the ballot out with transparent
> ink.
> Sometimes the outcome one wanted occurs. Rarely its worse than filling out
> a ballot properly.
>
diff mbox series

Patch

diff --git a/libavcodec/rtv1.c b/libavcodec/rtv1.c
index 4b202e6a21..95fa9210d8 100644
--- a/libavcodec/rtv1.c
+++ b/libavcodec/rtv1.c
@@ -44,6 +44,8 @@  static int decode_rtv1(GetByteContext *gb, uint8_t *dst, ptrdiff_t linesize,
     uint8_t block[8] = { 0 };
     int run = 0;
 
+    if (bytestream2_get_bytes_left(gb) < (width / 4) * (height / 4) / 0xFFFF * 4)
+        return AVERROR_INVALIDDATA;
     for (int y = 0; y < height; y += 4) {
         for (int x = 0; x < width * 4; x += 16) {
             int mode = 0;
@@ -126,7 +128,9 @@  static int decode_frame(AVCodecContext *avctx, AVFrame *p,
     dst = p->data[0] + p->linesize[0] * (avctx->coded_height - 1);
     linesize = -p->linesize[0];
 
-    decode_rtv1(&gb, dst, linesize, width, height, flags, dsp->dxt1_block);
+    ret = decode_rtv1(&gb, dst, linesize, width, height, flags, dsp->dxt1_block);
+    if (ret < 0)
+        return ret;
 
     p->pict_type = AV_PICTURE_TYPE_I;
     p->flags |= AV_FRAME_FLAG_KEY;