From f2fd7be1d7b80da32611c57360e71fb777b95c7d Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 9 Oct 2008 15:48:07 +0200 Subject: update: make addDirectoryPathToDB() non-recursive This recursive function is very dangerous because it allocates a large buffer on the stack in every iteration. That may be misused to generate a stack overflow. --- src/update.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) (limited to 'src/update.c') diff --git a/src/update.c b/src/update.c index dd48bfe78..1415852e0 100644 --- a/src/update.c +++ b/src/update.c @@ -340,21 +340,23 @@ directory_make_child_checked(struct directory *parent, const char *path) static struct directory * addDirectoryPathToDB(const char *utf8path) { - char path_max_tmp[MPD_PATH_MAX]; - char *parent; - struct directory *parentDirectory; + struct directory *directory = db_get_root(); + char *duplicated = xstrdup(utf8path); + char *slash = duplicated; - parent = parent_path(path_max_tmp, utf8path); + while (1) { + if ((slash = strchr(slash, '/'))) + *slash = 0; - if (strlen(parent) == 0) - parentDirectory = db_get_root(); - else - parentDirectory = addDirectoryPathToDB(parent); + directory = directory_make_child_checked(directory, duplicated); + if (!directory || !slash) + break; - if (!parentDirectory) - return NULL; + *slash++ = '/'; + } - return directory_make_child_checked(parentDirectory, utf8path); + free(duplicated); + return directory; } static struct directory * addParentPathToDB(const char *utf8path) -- cgit v1.2.3