From 7a3628e797e1c86e1aa15f8211e090ad8ef1feb0 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
Date: Mon, 2 Feb 2009 18:19:11 +0100
Subject: shout_mp3: call lame_close() in clear_encoder() method

The shout_mp3 encoder had two bugs: when no song was ever played, MPD
segfaulted during cleanup.  Second bug: memory leak, each time the
shout device was opened, lame_init() was called again, and
lame_close() is only called once during shutdown.

Fix this by shutting down LAME each time the clear_encoder() method is
called.
---
 NEWS                   | 1 +
 src/output/shout_mp3.c | 8 ++++++--
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/NEWS b/NEWS
index 36e8789df..c68a9189e 100644
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,7 @@ ver 0.14.2 (2009/??/??)
   - jack: allocate ring buffers before connecting
   - jack: clear "shutdown" flag on reconnect
   - jack: reduced sleep time to 1ms
+  - shout: fixed memory leak in the mp3 encoder
 * mapper: remove trailing slashes from music_directory
 * player: set player error when output device fails
 
diff --git a/src/output/shout_mp3.c b/src/output/shout_mp3.c
index eb95c8b3e..1369f6c80 100644
--- a/src/output/shout_mp3.c
+++ b/src/output/shout_mp3.c
@@ -19,6 +19,8 @@
 #include "shout_plugin.h"
 
 #include <lame/lame.h>
+
+#include <assert.h>
 #include <stdlib.h>
 
 struct lame_data {
@@ -45,6 +47,9 @@ static int shout_mp3_encoder_clear_encoder(struct shout_data *sd)
 				     buf->len)) < 0)
 		g_warning("error flushing lame buffers\n");
 
+	lame_close(ld->gfp);
+	ld->gfp = NULL;
+
 	return (ret > 0);
 }
 
@@ -52,8 +57,7 @@ static void shout_mp3_encoder_finish(struct shout_data *sd)
 {
 	struct lame_data *ld = (struct lame_data *)sd->encoder_data;
 
-	lame_close(ld->gfp);
-	ld->gfp = NULL;
+	assert(ld->gfp == NULL);
 
 	g_free(ld);
 }
-- 
cgit v1.2.3