On Fri, Oct 25, 2019 at 05:57:44PM -0300, James Almer wrote:
> On 10/25/2019 5:44 PM, Michael Niedermayer wrote:
> > On Fri, Oct 25, 2019 at 11:11:46AM +0200, Andreas Rheinhardt wrote:
> >> Using a linked list had very much overhead (the pointer to the next
> >> entry increased the size of the index entry struct from 16 to 24 bytes,
> >> not to mention the overhead of having separate allocations), so it is
> >> better to (re)allocate a continuous array for the index.
> >>
> >> Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@gmail.com>
> >> ---
> >>  libavformat/flvenc.c | 58 +++++++++++++++-----------------------------
> >>  1 file changed, 19 insertions(+), 39 deletions(-)
> >>
> >> diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c
> >> index 0e6c66a5ff..a2bd791c59 100644
> >> --- a/libavformat/flvenc.c
> >> +++ b/libavformat/flvenc.c
> >> @@ -74,7 +74,6 @@ typedef enum {
> >>  typedef struct FLVFileposition {
> >>      int64_t keyframe_position;
> >>      double keyframe_timestamp;
> >> -    struct FLVFileposition *next;
> >>  } FLVFileposition;
> >>  
> >>  typedef struct FLVContext {
> >> @@ -108,9 +107,9 @@ typedef struct FLVContext {
> >>      int acurframeindex;
> >>      int64_t keyframes_info_offset;
> >>  
> >> -    int64_t filepositions_count;
> >>      FLVFileposition *filepositions;
> >> -    FLVFileposition *head_filepositions;
> >> +    size_t filepositions_allocated;
> >> +    int64_t filepositions_count;
> >>  
> >>      AVCodecParameters *audio_par;
> >>      AVCodecParameters *video_par;
> >> @@ -549,27 +548,19 @@ static void flv_write_codec_header(AVFormatContext* 
> >> s, AVCodecParameters* par, i
> >>  
> >>  static int flv_append_keyframe_info(AVFormatContext *s, FLVContext *flv, 
> >> double ts, int64_t pos)
> >>  {
> >> -    FLVFileposition *position = av_malloc(sizeof(FLVFileposition));
> >> -
> >> -    if (!position) {
> >> -        av_log(s, AV_LOG_WARNING, "no mem for add keyframe index!\n");
> >> -        return AVERROR(ENOMEM);
> >> -    }
> >> -
> >> -    position->keyframe_timestamp = ts;
> >> -    position->keyframe_position = pos;
> >> -
> >> -    if (!flv->filepositions_count) {
> >> -        flv->filepositions = position;
> >> -        flv->head_filepositions = flv->filepositions;
> >> -        position->next = NULL;
> >> -    } else {
> >> -        flv->filepositions->next = position;
> >> -        position->next = NULL;
> >> -        flv->filepositions = flv->filepositions->next;
> >> +    if (flv->filepositions_count >= flv->filepositions_allocated) {
> >> +        void *pos = av_realloc_array(flv->filepositions,
> >> +                                     2 * flv->filepositions_allocated + 1,
> >> +                                     sizeof(*flv->filepositions));
> > 
> > can the 2* overflow ?
> > av_fast_realloc() would check for that
> > i wonder if a av_fast_realloc_array() would make sense
> 
> av_fast_realloc() doesn't do any overflow check. It only checks that the
> min_size argument is below the max allowed alloc size.

it does this:
FFMAX(min_size + min_size / 16 + 32, min_size)

which should check for the overflow. min_size is a unsigned type so overflow
is defined so we can do it and check afterwards.

[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Good people do not need laws to tell them to act responsibly, while bad
people will find a way around the laws. -- Plato

Attachment: signature.asc
Description: PGP signature

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

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

Reply via email to