From 886255e38afb2e0599080fce11ff9abe4e18dd95 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 5 Sep 2012 20:49:04 +0200 Subject: db/SimpleDatabasePlugin: fix memory leak in Visit() When visiting a song, GetSong() was called, but this object was never returned by calling ReturnSong(). This patch locks the database only once in Visit() and passes the original song object to the visitor, avoiding the copy. --- src/db/SimpleDatabasePlugin.cxx | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'src/db/SimpleDatabasePlugin.cxx') diff --git a/src/db/SimpleDatabasePlugin.cxx b/src/db/SimpleDatabasePlugin.cxx index 1e5ffe9b..d83c1ca7 100644 --- a/src/db/SimpleDatabasePlugin.cxx +++ b/src/db/SimpleDatabasePlugin.cxx @@ -261,13 +261,18 @@ SimpleDatabase::Visit(const DatabaseSelection &selection, VisitPlaylist visit_playlist, GError **error_r) const { - const struct directory *directory = LookupDirectory(selection.uri); + ScopeDatabaseLock protect; + + const struct directory *directory = + directory_lookup_directory(root, selection.uri); if (directory == NULL) { - struct song *song; - if (visit_song && - (song = GetSong(selection.uri, NULL)) != NULL && - selection.Match(*song)) - return visit_song(*song, error_r); + if (visit_song) { + struct song *song = + directory_lookup_song(root, selection.uri); + if (song != nullptr) + return !selection.Match(*song) || + visit_song(*song, error_r); + } g_set_error(error_r, db_quark(), DB_NOT_FOUND, "No such directory"); @@ -278,7 +283,6 @@ SimpleDatabase::Visit(const DatabaseSelection &selection, !visit_directory(*directory, error_r)) return false; - ScopeDatabaseLock protect; return directory->Walk(selection.recursive, selection.filter, visit_directory, visit_song, visit_playlist, error_r); -- cgit v1.2.3