libsframe: fix a memory leak in sframe_decode
authorIndu Bhagat <indu.bhagat@oracle.com>
Fri, 23 Dec 2022 21:04:06 +0000 (13:04 -0800)
committerIndu Bhagat <indu.bhagat@oracle.com>
Fri, 23 Dec 2022 21:04:06 +0000 (13:04 -0800)
sframe_decode () needs to malloc a temporary buffer of the same size as
the input buffer (containing the SFrame section bytes) when endian
flipping is needed.  The decoder keeps the endian flipped contents in
this buffer for its usage.  This code is necessary when the target
endianneess is not the same as host endianness.

The malloc'd buffer needs to be kept track of, so that it can freed up in
sframe_decoder_free () later.

ChangeLog:

* libsframe/sframe-impl.h (struct sframe_decoder_ctx): Add new
member to keep track of the internally malloc'd buffer.
* libsframe/sframe.c (sframe_decoder_free): Free it up.
(sframe_decode): Update the reference to the buffer.

libsframe/sframe-impl.h
libsframe/sframe.c

index 0e61c977886556392492f8c29b6cc29e5454ae9b..340d3b35042877efaa378541d267b1dabc6cfe3b 100644 (file)
@@ -32,10 +32,17 @@ extern "C"
 
 struct sframe_decoder_ctx
 {
-  sframe_header sfd_header;          /* SFrame header.  */
-  uint32_t *sfd_funcdesc;            /* SFrame function desc entries table.  */
-  void *sfd_fres;                    /* SFrame FRE table.  */
-  int sfd_fre_nbytes;                /* Number of bytes needed for SFrame FREs.  */
+  /* SFrame header.  */
+  sframe_header sfd_header;
+  /* SFrame function desc entries table.  */
+  uint32_t *sfd_funcdesc;
+  /* SFrame FRE table.  */
+  void *sfd_fres;
+  /* Number of bytes needed for SFrame FREs.  */
+  int sfd_fre_nbytes;
+  /* Reference to the internally malloc'd buffer, if any, for endian flipping
+     the original input buffer before decoding.  */
+  void *sfd_buf;
 };
 
 struct sframe_encoder_ctx
index b8fde2f04f8eeb2a6abd16968fe9d4eec5783b86..e41c95b99448e3aaea87ed003a2b0532fd953f68 100644 (file)
@@ -548,6 +548,11 @@ sframe_decoder_free (sframe_decoder_ctx **decoder)
          free (dctx->sfd_fres);
          dctx->sfd_fres = NULL;
        }
+      if (dctx->sfd_buf != NULL)
+       {
+         free (dctx->sfd_buf);
+         dctx->sfd_buf = NULL;
+       }
 
       free (*decoder);
       *decoder = NULL;
@@ -824,6 +829,10 @@ sframe_decode (const char *sf_buf, size_t sf_size, int *errp)
          return sframe_ret_set_errno (errp, SFRAME_ERR_BUF_INVAL);
        }
       frame_buf = tempbuf;
+      /* This buffer is malloc'd when endian flipping the contents of the input
+        buffer are needed.  Keep a reference to it so it can be free'd up
+        later in sframe_decoder_free ().  */
+      dctx->sfd_buf = tempbuf;
     }
   else
     frame_buf = (char *)sf_buf;