From a3ae1eaee8ae5e972cc29133684fdf878708c8b2 Mon Sep 17 00:00:00 2001 From: Greg Hudson Date: Wed, 16 Jul 2014 16:02:21 -0400 Subject: [PATCH] Fix deleted node handling in libprofile In profile_find_node, skip deleted nodes when finding the second match. Otherwise, profile_clear_nodes could return an error if a node has some values to clear but the last one is deleted. In profile_node_iterator, skip deleted nodes when looking up the section names. Otherwise we could iterate over a deleted section and/or ignore its replacement. (cherry picked from commit e7f50a1c11845ba73ce4ffa4729d10113563a247) ticket: 7971 version_fixed: 1.12.2 status: resolved --- src/util/profile/prof_tree.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/util/profile/prof_tree.c b/src/util/profile/prof_tree.c index cc5bdfd80b..081f688e4a 100644 --- a/src/util/profile/prof_tree.c +++ b/src/util/profile/prof_tree.c @@ -294,6 +294,8 @@ errcode_t profile_find_node(struct profile_node *section, const char *name, if (value && (strcmp(p->value, value))) continue; } + if (p->deleted) + continue; /* A match! */ break; } @@ -519,7 +521,7 @@ get_new_file: assert(section != NULL); for (cpp = iter->names; cpp[iter->done_idx]; cpp++) { for (p=section->first_child; p; p = p->next) { - if (!strcmp(p->name, *cpp) && !p->value) + if (!strcmp(p->name, *cpp) && !p->value && !p->deleted) break; } if (!p) { -- 2.47.2