From a878dcfbfc717f817ae7f3a2ecfbef4c016ee046 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 17 Sep 2008 12:29:15 +0200 Subject: [PATCH] playlist: added playlist_remove_reuse() playlist_remove_reuse() removes a song from the playlist, but does not free it. Use this function in mpdclient_cmd_delete() to fix a segmentation fault: the song pointer was still used after it was freed, by passing it to mpdclient_playlist_callback(). Free the song manually now. Reorganize and simply some code in mpdclient_cmd_delete(). --- src/mpdclient.c | 4 +++- src/playlist.h | 9 +++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/mpdclient.c b/src/mpdclient.c index f67b091..469c794 100644 --- a/src/mpdclient.c +++ b/src/mpdclient.c @@ -459,7 +459,7 @@ mpdclient_cmd_delete(mpdclient_t *c, gint idx) c->playlist.id++; /* remove the song from the playlist */ - playlist_remove(&c->playlist, idx); + playlist_remove_reuse(&c->playlist, idx); /* call playlist updated callback */ mpdclient_playlist_callback(c, PLAYLIST_EVENT_DELETE, (gpointer) song); @@ -470,6 +470,8 @@ mpdclient_cmd_delete(mpdclient_t *c, gint idx) c->need_update = TRUE; } + mpd_freeSong(song); + #else c->need_update = TRUE; #endif diff --git a/src/playlist.h b/src/playlist.h index 9cd88ab..93c034f 100644 --- a/src/playlist.h +++ b/src/playlist.h @@ -96,11 +96,16 @@ playlist_replace(struct mpdclient_playlist *playlist, guint idx, playlist_set(playlist, idx, song); } +static inline struct mpd_song * +playlist_remove_reuse(struct mpdclient_playlist *playlist, guint idx) +{ + return g_ptr_array_remove_index(playlist->list, idx); +} + static inline void playlist_remove(struct mpdclient_playlist *playlist, guint idx) { - mpd_Song *song = g_ptr_array_remove_index(playlist->list, idx); - mpd_freeSong(song); + mpd_freeSong(playlist_remove_reuse(playlist, idx)); } static inline void -- 2.30.2