aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2012-08-16 00:04:03 +0200
committerMax Kellermann <max@duempel.org>2012-08-16 00:04:03 +0200
commitf45616e5f6f7d6aa0fb5ca90a0599eacddf1166b (patch)
tree5ee81fb82624bca41381005b92f8cd316d32e51b
parente391f4b17b2fdd092b729f0dfec0b84265894e41 (diff)
parentef5125f8f4ee992c5a8f24d1b93851db5df5c43d (diff)
Merge branch 'v0.17.x'
-rw-r--r--NEWS2
-rw-r--r--src/playlist_print.c3
-rw-r--r--src/playlist_song.c6
3 files changed, 9 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index bda00cb2..d71fba2b 100644
--- a/NEWS
+++ b/NEWS
@@ -14,6 +14,8 @@ ver 0.17.2 (2012/??/??)
- httpd: fix throttling bug after resuming playback
* mapper: fix non-UTF8 music directory name
* mapper: fix potential crash in file permission check
+* playlist: fix use-after-free bug
+* playlist: fix memory leak
ver 0.17.1 (2012/07/31)
diff --git a/src/playlist_print.c b/src/playlist_print.c
index 78f1cb29..204ce358 100644
--- a/src/playlist_print.c
+++ b/src/playlist_print.c
@@ -156,6 +156,9 @@ playlist_provider_print(struct client *client, const char *uri,
song_print_info(client, song);
else
song_print_uri(client, song);
+
+ if (!song_in_database(song) || song_is_detached(song))
+ song_free(song);
}
g_free(base_uri);
diff --git a/src/playlist_song.c b/src/playlist_song.c
index 88ef1059..29efef2e 100644
--- a/src/playlist_song.c
+++ b/src/playlist_song.c
@@ -69,7 +69,6 @@ apply_song_metadata(struct song *dest, const struct song *src)
} else {
tmp = song_file_new(dest->uri, NULL);
merge_song_metadata(tmp, dest, src);
- song_free(dest);
}
if (dest->tag != NULL && dest->tag->time > 0 &&
@@ -80,11 +79,14 @@ apply_song_metadata(struct song *dest, const struct song *src)
(e.g. last track on a CUE file); fix it up here */
tmp->tag->time = dest->tag->time - src->start_ms / 1000;
+ if (!song_in_database(dest))
+ song_free(dest);
+
return tmp;
}
static struct song *
-playlist_check_load_song(struct song *song, const char *uri, bool secure)
+playlist_check_load_song(const struct song *song, const char *uri, bool secure)
{
struct song *dest;