From 3b0a78fe0dc9f4110692975f54cd1e585d2c6e27 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Mon, 2 Feb 2009 18:19:11 +0100 Subject: [PATCH] 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 0190d4cc5..424c5ead3 100644 --- a/NEWS +++ b/NEWS @@ -43,6 +43,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 + +#include #include 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); }