[FFmpeg-devel] [PATCH 01/11] avcodec/vulkan_encode_h264: Fix memleak on error

James Almer jamrial at gmail.com
Sun May 25 05:49:45 EEST 2025


On 5/5/2025 8:37 PM, Andreas Rheinhardt wrote:
> diff --git a/libavcodec/cbs_apv.c b/libavcodec/cbs_apv.c
> index ebf57d3bbb..ddc363fbf3 100644
> --- a/libavcodec/cbs_apv.c
> +++ b/libavcodec/cbs_apv.c
> @@ -276,12 +276,14 @@ static int cbs_apv_read_unit(CodedBitstreamContext *ctx,
>              if (err < 0)
>                  return err;
>  
> -            // Each tile inside the frame has pointers into the unit
> -            // data buffer; make a single reference here for all of
> -            // them together.
> -            frame->tile_data_ref = av_buffer_ref(unit->data_ref);
> -            if (!frame->tile_data_ref)
> -                return AVERROR(ENOMEM);
> +            if (unit->data_ref) {
> +                // Each tile inside the frame has pointers into the unit
> +                // data buffer; make a single reference here for all of
> +                // them together.
> +                frame->tile_data_ref = av_buffer_ref(unit->data_ref);
> +                if (!frame->tile_data_ref)
> +                    return AVERROR(ENOMEM);
> +            }
>          }
>          break;
>      case APV_PBU_ACCESS_UNIT_INFORMATION:
> diff --git a/libavcodec/cbs_av1.c b/libavcodec/cbs_av1.c
> index 4edb6ecd50..40c3cc8167 100644
> --- a/libavcodec/cbs_av1.c
> +++ b/libavcodec/cbs_av1.c
> @@ -824,9 +824,11 @@ static int cbs_av1_ref_tile_data(CodedBitstreamContext *ctx,
>      // Must be byte-aligned at this point.
>      av_assert0(pos % 8 == 0);
>  
> -    *data_ref = av_buffer_ref(unit->data_ref);
> -    if (!*data_ref)
> -        return AVERROR(ENOMEM);
> +    if (unit->data_ref) {
> +        *data_ref = av_buffer_ref(unit->data_ref);
> +        if (!*data_ref)
> +            return AVERROR(ENOMEM);
> +    }
>  
>      *data      = unit->data      + pos / 8;
>      *data_size = unit->data_size - pos / 8;
> diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c
> index 369e3ac876..45b0c2ce87 100644
> --- a/libavcodec/cbs_h2645.c
> +++ b/libavcodec/cbs_h2645.c
> @@ -902,9 +902,11 @@ static int cbs_h264_read_nal_unit(CodedBitstreamContext *ctx,
>              len = unit->data_size;
>  
>              slice->data_size = len - pos / 8;
> -            slice->data_ref  = av_buffer_ref(unit->data_ref);
> -            if (!slice->data_ref)
> -                return AVERROR(ENOMEM);
> +            if (unit->data_ref) {
> +                slice->data_ref  = av_buffer_ref(unit->data_ref);
> +                if (!slice->data_ref)
> +                    return AVERROR(ENOMEM);
> +            }
>              slice->data = unit->data + pos / 8;
>              slice->data_bit_start = pos % 8;
>          }
> @@ -1039,9 +1041,11 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx,
>              len = unit->data_size;
>  
>              slice->data_size = len - pos / 8;
> -            slice->data_ref  = av_buffer_ref(unit->data_ref);
> -            if (!slice->data_ref)
> -                return AVERROR(ENOMEM);
> +            if (unit->data_ref) {
> +                slice->data_ref  = av_buffer_ref(unit->data_ref);
> +                if (!slice->data_ref)
> +                    return AVERROR(ENOMEM);
> +            }
>              slice->data = unit->data + pos / 8;
>              slice->data_bit_start = pos % 8;
>          }
> @@ -1205,9 +1209,11 @@ static int cbs_h266_read_nal_unit(CodedBitstreamContext *ctx,
>  
>              slice->header_size = pos / 8;
>              slice->data_size = len - pos / 8;
> -            slice->data_ref  = av_buffer_ref(unit->data_ref);
> -            if (!slice->data_ref)
> -                return AVERROR(ENOMEM);
> +            if (unit->data_ref) {
> +                slice->data_ref  = av_buffer_ref(unit->data_ref);
> +                if (!slice->data_ref)
> +                    return AVERROR(ENOMEM);
> +            }
>              slice->data = unit->data + pos / 8;
>              slice->data_bit_start = pos % 8;
>          }
> diff --git a/libavcodec/cbs_jpeg.c b/libavcodec/cbs_jpeg.c
> index 281606e7af..cfb9b6d46c 100644
> --- a/libavcodec/cbs_jpeg.c
> +++ b/libavcodec/cbs_jpeg.c
> @@ -255,9 +255,11 @@ static int cbs_jpeg_read_unit(CodedBitstreamContext *ctx,
>          av_assert0(pos % 8 == 0);
>          if (pos > 0) {
>              scan->data_size = unit->data_size - pos / 8;
> -            scan->data_ref  = av_buffer_ref(unit->data_ref);
> -            if (!scan->data_ref)
> -                return AVERROR(ENOMEM);
> +            if (unit->data_ref) {
> +                scan->data_ref  = av_buffer_ref(unit->data_ref);
> +                if (!scan->data_ref)
> +                    return AVERROR(ENOMEM);
> +            }
>              scan->data = unit->data + pos / 8;
>          }
>  
> diff --git a/libavcodec/cbs_mpeg2.c b/libavcodec/cbs_mpeg2.c
> index 37fc28a4e6..4b51647b13 100644
> --- a/libavcodec/cbs_mpeg2.c
> +++ b/libavcodec/cbs_mpeg2.c
> @@ -234,9 +234,11 @@ static int cbs_mpeg2_read_unit(CodedBitstreamContext *ctx,
>          len = unit->data_size;
>  
>          slice->data_size = len - pos / 8;
> -        slice->data_ref  = av_buffer_ref(unit->data_ref);
> -        if (!slice->data_ref)
> -            return AVERROR(ENOMEM);
> +        if (unit->data_ref) {
> +            slice->data_ref  = av_buffer_ref(unit->data_ref);
> +            if (!slice->data_ref)
> +                return AVERROR(ENOMEM);
> +        }
>          slice->data = unit->data + pos / 8;
>  
>          slice->data_bit_start = pos % 8;
> diff --git a/libavcodec/cbs_vp8.c b/libavcodec/cbs_vp8.c
> index 1f80f34faf..9bfba71d9e 100644
> --- a/libavcodec/cbs_vp8.c
> +++ b/libavcodec/cbs_vp8.c
> @@ -344,9 +344,11 @@ static int cbs_vp8_read_unit(CodedBitstreamContext *ctx,
>      pos = (pos + 7) / 8;
>      av_assert0(pos <= unit->data_size);
>  
> -    frame->data_ref = av_buffer_ref(unit->data_ref);
> -    if (!frame->data_ref)
> -        return AVERROR(ENOMEM);
> +    if (unit->data_ref) {
> +        frame->data_ref = av_buffer_ref(unit->data_ref);
> +        if (!frame->data_ref)
> +            return AVERROR(ENOMEM);
> +    }
>  
>      frame->data = unit->data + pos;
>      frame->data_size = unit->data_size - pos;
> diff --git a/libavcodec/cbs_vp9.c b/libavcodec/cbs_vp9.c
> index ff99fe32fb..3ca52770f3 100644
> --- a/libavcodec/cbs_vp9.c
> +++ b/libavcodec/cbs_vp9.c
> @@ -460,9 +460,11 @@ static int cbs_vp9_read_unit(CodedBitstreamContext *ctx,
>      if (pos == unit->data_size) {
>          // No data (e.g. a show-existing-frame frame).
>      } else {
> -        frame->data_ref = av_buffer_ref(unit->data_ref);
> -        if (!frame->data_ref)
> -            return AVERROR(ENOMEM);
> +        if (unit->data_ref) {
> +            frame->data_ref = av_buffer_ref(unit->data_ref);
> +            if (!frame->data_ref)
> +                return AVERROR(ENOMEM);
> +        }

You can use av_buffer_replace() for all of these to simplify this change.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature.asc
Type: application/pgp-signature
Size: 495 bytes
Desc: OpenPGP digital signature
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20250524/beea2b5c/attachment.sig>


More information about the ffmpeg-devel mailing list