Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Marton Balint <cus@passwd.hu>
To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Subject: Re: [FFmpeg-devel] [PATCH 1/5] avformat/aviobuf: set AVIOContext->error on bprint buffer ENOMEM
Date: Fri, 31 Dec 2021 17:53:36 +0100 (CET)
Message-ID: <23148c44-cec7-8d6c-6060-f719bea7c65c@passwd.hu> (raw)
In-Reply-To: <AM7PR03MB666005C097FD6E57A494890C8F469@AM7PR03MB6660.eurprd03.prod.outlook.com>



On Fri, 31 Dec 2021, Andreas Rheinhardt wrote:

> Marton Balint:
>> This makes sure the error condition is kept in AVIOContext even if the user
>> does not check the return value of avio_read_to_bprint or
>> ff_read_line_to_bprint.
>>
>> Signed-off-by: Marton Balint <cus@passwd.hu>
>> ---
>>  libavformat/aviobuf.c | 8 ++++++--
>>  1 file changed, 6 insertions(+), 2 deletions(-)
>>
>> diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c
>> index 29d4bd7510..6f8a822ee3 100644
>> --- a/libavformat/aviobuf.c
>> +++ b/libavformat/aviobuf.c
>> @@ -875,8 +875,10 @@ static int64_t read_string_to_bprint_overwrite(AVIOContext *s, AVBPrint *bp,
>>      if (ret < 0)
>>          return ret;
>>
>> -    if (!av_bprint_is_complete(bp))
>> +    if (!av_bprint_is_complete(bp)) {
>> +        s->error = AVERROR(ENOMEM);
>>          return AVERROR(ENOMEM);
>> +    }
>>
>>      return bp->len;
>>  }
>> @@ -1351,8 +1353,10 @@ int avio_read_to_bprint(AVIOContext *h, AVBPrint *pb, size_t max_size)
>>          if (ret <= 0)
>>              return ret;
>>          av_bprint_append_data(pb, buf, ret);
>> -        if (!av_bprint_is_complete(pb))
>> +        if (!av_bprint_is_complete(pb)) {
>> +            h->error = AVERROR(ENOMEM);
>>              return AVERROR(ENOMEM);
>> +        }
>>          max_size -= ret;
>>      }
>>      return 0;
>>
>
> I don't really see the point of this: It is not a real read error that
> should stick to the AVIOContext (which can still be used afterwards
> without any issue).
> If the user does not check the errors, then the user
> has no one to blame but himself for missing errors.

AVIO read/write behaviour is to store IO errors in the context so the user 
does not have to check for them in every call. It is not well documented 
which calls should be checked always, so the user might be under the 
impression that errors during read/write may be checked sometime 
later.

Admittedly, ENOMEM is not an IO error, but I think it is better to store 
that as well in the context to keep the behaviour consistent, because 
in case of ENOMEM avio_read_to_bprint reads and drops undefined amount of 
data, so the context will also be in an undefined state.

Other possibilities:
  - make avio_read_to_bprint read all the data regardless of AVBPrint 
fullness
  - mark avio_read_to_bprint av_warn_unused_result.
  - both :)

But these also forces the user to check return values... So I kind of like 
my original approach better, because it maintains avio_read/write call 
behaviour that it is safe to check errors sometime later.

Regards,
Marton


>
> - Andreas
>
> PS: If the AVBPrint API had a documented way of marking data as used,
> one could avoid those stack buffers and use the AVBPrint buffer directly
> with av_bprint_get_buffer(). (Marking data as used would be equivalent
> to incrementing len and ensuring that the buffer stays zero-terminated.)
> If this were done, no already read data would be lost in case of a later
> allocation failure.
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

  reply	other threads:[~2021-12-31 16:53 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-27  0:26 Marton Balint
2021-12-27  0:26 ` [FFmpeg-devel] [PATCH 2/5] avformat/movenc: factorize data shifting Marton Balint
2021-12-31 12:36   ` Andreas Rheinhardt
2021-12-27  0:26 ` [FFmpeg-devel] [PATCH 3/5] avformat/flvenc: use ff_format_shift_data for " Marton Balint
2021-12-27  0:26 ` [FFmpeg-devel] [PATCH 4/5] avformat/segafilmenc: use ff_format_shift_data for shifting Marton Balint
2021-12-31 12:30   ` Andreas Rheinhardt
2021-12-27  0:26 ` [FFmpeg-devel] [PATCH 5/5] avformat/utils: propagate return value of ff_format_io_close in ff_format_shift_data Marton Balint
2021-12-31 10:40 ` [FFmpeg-devel] [PATCH 1/5] avformat/aviobuf: set AVIOContext->error on bprint buffer ENOMEM Andreas Rheinhardt
2021-12-31 16:53   ` Marton Balint [this message]
2022-01-02 20:46     ` Marton Balint
2022-01-03  8:31       ` Andreas Rheinhardt
2022-01-03 19:18         ` Marton Balint

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=23148c44-cec7-8d6c-6060-f719bea7c65c@passwd.hu \
    --to=cus@passwd.hu \
    --cc=ffmpeg-devel@ffmpeg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git