Commit 886255e3 authored by Max Kellermann's avatar Max Kellermann

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.
parent 0240e754
......@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment