Commit 2bb7bcc7 authored by Max Kellermann's avatar Max Kellermann

update: locked delete after update error

When a directory failed to update, it was removed from the database, without freeing all children and songs (memory leak), and without locking (race condition). Introduce the functions clear_directory() and delete_directory(), which do both.
parent 96c681e2
...@@ -81,6 +81,45 @@ delete_song(struct directory *dir, struct song *del) ...@@ -81,6 +81,45 @@ delete_song(struct directory *dir, struct song *del)
song_free(del); song_free(del);
} }
static int
delete_each_song(struct song *song, mpd_unused void *data)
{
struct directory *directory = data;
assert(song->parent == directory);
delete_song(directory, song);
return 0;
}
/**
* Recursively remove all sub directories and songs from a directory,
* leaving an empty directory.
*/
static void
clear_directory(struct directory *directory)
{
int i;
for (i = directory->children.nr; --i >= 0;)
clear_directory(directory->children.base[i]);
dirvec_clear(&directory->children);
songvec_for_each(&directory->songs, delete_each_song, directory);
}
/**
* Recursively free a directory and all its contents.
*/
static void
delete_directory(struct directory *directory)
{
assert(directory->parent != NULL);
clear_directory(directory);
dirvec_delete(&directory->parent->children, directory);
directory_free(directory);
}
struct delete_data { struct delete_data {
char *tmp; char *tmp;
struct directory *dir; struct directory *dir;
...@@ -374,7 +413,7 @@ static enum update_return updatePath(const char *utf8path) ...@@ -374,7 +413,7 @@ static enum update_return updatePath(const char *utf8path)
/* if updateDirectory fails, means we should delete it */ /* if updateDirectory fails, means we should delete it */
else { else {
LOG("removing directory: %s\n", path); LOG("removing directory: %s\n", path);
dirvec_delete(&parentDirectory->children, directory); delete_directory(directory);
ret = UPDATE_RETURN_UPDATED; ret = UPDATE_RETURN_UPDATED;
/* don't return, path maybe a song now */ /* don't return, path maybe a song now */
} }
......
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