diff mbox

[FFmpeg-devel,2/2] avcodec/avpacket: fix leaks on side data copying failure

Message ID 20170921220438.8216-2-jamrial@gmail.com
State Withdrawn
Headers show

Commit Message

James Almer Sept. 21, 2017, 10:04 p.m. UTC
pkt->side_data_elems being set at the very end of the process will leak memory
if some side data elements were already copied before an error ocurrs.

Signed-off-by: James Almer <jamrial@gmail.com>
---
 libavcodec/avpacket.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

Comments

James Almer Sept. 23, 2017, 6:47 p.m. UTC | #1
On 9/21/2017 7:04 PM, James Almer wrote:
> pkt->side_data_elems being set at the very end of the process will leak memory
> if some side data elements were already copied before an error ocurrs.
> 
> Signed-off-by: James Almer <jamrial@gmail.com>
> ---
>  libavcodec/avpacket.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c
> index a68e2501ad..13e830b781 100644
> --- a/libavcodec/avpacket.c
> +++ b/libavcodec/avpacket.c
> @@ -230,17 +230,20 @@ int av_copy_packet_side_data(AVPacket *pkt, const AVPacket *src)
>  
>      if (src->side_data_elems) {
>          int i;
> +
> +        pkt->side_data_elems = 0;
>          pkt->side_data = av_mallocz_array(src->side_data_elems, sizeof(*src->side_data));
>          if (!pkt->side_data)
>              goto failed_alloc;
> +
>          for (i = 0; i < src->side_data_elems; i++) {
>              DUP_DATA(pkt->side_data[i].data, src->side_data[i].data,
>                      src->side_data[i].size, 1, ALLOC_MALLOC);
>              pkt->side_data[i].size = src->side_data[i].size;
>              pkt->side_data[i].type = src->side_data[i].type;
> +            pkt->side_data_elems++;
>          }
>      }
> -    pkt->side_data_elems = src->side_data_elems;
>      return 0;
>  
>  failed_alloc:
> 

Dropped alongside patch 1/2.
diff mbox

Patch

diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c
index a68e2501ad..13e830b781 100644
--- a/libavcodec/avpacket.c
+++ b/libavcodec/avpacket.c
@@ -230,17 +230,20 @@  int av_copy_packet_side_data(AVPacket *pkt, const AVPacket *src)
 
     if (src->side_data_elems) {
         int i;
+
+        pkt->side_data_elems = 0;
         pkt->side_data = av_mallocz_array(src->side_data_elems, sizeof(*src->side_data));
         if (!pkt->side_data)
             goto failed_alloc;
+
         for (i = 0; i < src->side_data_elems; i++) {
             DUP_DATA(pkt->side_data[i].data, src->side_data[i].data,
                     src->side_data[i].size, 1, ALLOC_MALLOC);
             pkt->side_data[i].size = src->side_data[i].size;
             pkt->side_data[i].type = src->side_data[i].type;
+            pkt->side_data_elems++;
         }
     }
-    pkt->side_data_elems = src->side_data_elems;
     return 0;
 
 failed_alloc: