diff options
author | Max Kellermann <max@duempel.org> | 2012-09-05 20:49:04 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2012-09-05 20:56:20 +0200 |
commit | 886255e38afb2e0599080fce11ff9abe4e18dd95 (patch) | |
tree | f56f48939f1b43ef29950e572179cd349539abdb | |
parent | 0240e75426f483ff558422f99e29708e3f31fdb7 (diff) | |
download | mpd-886255e38afb2e0599080fce11ff9abe4e18dd95.tar.gz mpd-886255e38afb2e0599080fce11ff9abe4e18dd95.tar.xz mpd-886255e38afb2e0599080fce11ff9abe4e18dd95.zip |
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.
-rw-r--r-- | src/db/SimpleDatabasePlugin.cxx | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/src/db/SimpleDatabasePlugin.cxx b/src/db/SimpleDatabasePlugin.cxx index 1e5ffe9bb..d83c1ca73 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); |