From 6c81cd26ccb03f3452fedca651c876f2709ff0b8 Mon Sep 17 00:00:00 2001 From: Peter Rajnoha Date: Wed, 27 Feb 2013 13:47:57 +0100 Subject: [PATCH] config: fix config node lookup inside empty sections to not return the section itself When a section was empty in a configuration tree (no children - this is allowed) and we were looking for a config node inside that section, the _find_config_node function incorrectly returned the section itself if the node inside that section was not found. For example the configuration below: The config: abc { } And a function call to get the "def" node inside "abc" section: _find_config_node(..., "abc/def") ...returned the "abc" node instead of NULL ("def" not found). This in turn caused segfaults in the code using lookups in such a configuration tree as we (correctly) expected that the node returned was always the one we were looking for or NULL if not found. But if incorrect node was returned instead, we processed that as if this was the node we were looking for and so we processed its value as well. But sections don't have values => segfault. --- WHATS_NEW_DM | 1 + libdm/libdm-config.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM index 0052e5a1e..9d9c53d16 100644 --- a/WHATS_NEW_DM +++ b/WHATS_NEW_DM @@ -1,5 +1,6 @@ Version 1.02.78 - =================================== + Fix config node lookup inside empty sections to not return the section itself. Extend support for status info of thin pool target. Fix segfault for truncated string token in config file after the first '"'. Close open dmeventd FIFO file descriptors on exec (FD_CLOEXEC). diff --git a/libdm/libdm-config.c b/libdm/libdm-config.c index cc726aef0..bd29d32a1 100644 --- a/libdm/libdm-config.c +++ b/libdm/libdm-config.c @@ -752,12 +752,12 @@ static const struct dm_config_node *_find_config_node(const void *start, if (cn_found && *e) cn = cn_found->child; else - break; /* don't move into the last node */ + return cn_found; path = e; } - return cn_found; + return NULL; } static const struct dm_config_node *_find_first_config_node(const void *start, const char *path)