changeset 32602:1cedf73225e0

Fix possible memory leaks on error.
author reimar
date Sat, 11 Dec 2010 17:45:41 +0000
parents f23e289e35c6
children 02830ab7afb7
files libmpcodecs/ad_speex.c
diffstat 1 files changed, 8 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/libmpcodecs/ad_speex.c	Sat Dec 11 16:36:17 2010 +0000
+++ b/libmpcodecs/ad_speex.c	Sat Dec 11 17:45:41 2010 +0000
@@ -65,7 +65,7 @@
   const SpeexStereoState st_st = SPEEX_STEREO_STATE_INIT; // hack
   if (!sh->wf || sh->wf->cbSize < 80) {
     mp_msg(MSGT_DECAUDIO, MSGL_FATAL, "Missing extradata!\n");
-    return 0;
+    goto err_out;
   }
   ctx->hdr = speex_packet_to_header((char *)&sh->wf[1], sh->wf->cbSize);
   if (!ctx->hdr && sh->wf->cbSize == 0x72 && hdr[0] == 1 && hdr[1] == 0) {
@@ -87,7 +87,7 @@
   }
   if (!ctx->hdr) {
     mp_msg(MSGT_DECAUDIO, MSGL_FATAL, "Invalid extradata!\n");
-    return 0;
+    goto err_out;
   }
   if (ctx->hdr->nb_channels != 1 && ctx->hdr->nb_channels != 2) {
     mp_msg(MSGT_DECAUDIO, MSGL_WARN, "Invalid number of channels (%i), "
@@ -119,6 +119,12 @@
   sh->sample_format = AF_FORMAT_S16_NE;
   sh->context = ctx;
   return 1;
+
+err_out:
+  if (ctx)
+    free(ctx->hdr);
+  free(ctx);
+  return 0;
 }
 
 static void uninit(sh_audio_t *sh) {