conf: Remove <metadata> elements with no namespace

Our docs state that subelements of <metadata> shall have a namespace
and the medatata APIs expect that too. To avoid inaccessible
<metadata> sub-elements, just remove those that don't conform to the
documentation.

Apart from adding the new condition this patch renames the function and
refactors the code flow to allow the changes.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1245525
This commit is contained in:
Peter Krempa 2015-10-05 09:58:30 +02:00
parent bb5fc5c778
commit 51a4178f24
2 changed files with 25 additions and 7 deletions

View File

@ -3688,27 +3688,40 @@ virDomainDefRejectDuplicateControllers(virDomainDefPtr def)
/** /**
* virDomainDefRemoveDuplicateMetadata: * virDomainDefMetadataSanitize:
* @def: Remove duplicate metadata for this def * @def: Sanitize metadata for this def
* *
* This function removes metadata elements in @def that share the namespace. * This function removes metadata elements in @def that share the namespace.
* The first metadata entry of every duplicate namespace is kept. * The first metadata entry of every duplicate namespace is kept. Additionally
* elements with no namespace are deleted.
*/ */
static void static void
virDomainDefRemoveDuplicateMetadata(virDomainDefPtr def) virDomainDefMetadataSanitize(virDomainDefPtr def)
{ {
xmlNodePtr child; xmlNodePtr child;
xmlNodePtr next; xmlNodePtr next;
xmlNodePtr dupl;
if (!def || !def->metadata) if (!def || !def->metadata)
return; return;
for (child = def->metadata->children; child; child = child->next) { child = def->metadata->children;
while (child) {
/* remove metadata entries that don't have any namespace at all */
if (!child->ns || !child->ns->href) {
dupl = child;
child = child->next;
xmlUnlinkNode(dupl);
xmlFreeNode(dupl);
continue;
}
/* check that every other child of @root doesn't share the namespace of /* check that every other child of @root doesn't share the namespace of
* the current one and delete them possibly */ * the current one and delete them possibly */
next = child->next; next = child->next;
while (next) { while (next) {
xmlNodePtr dupl = NULL; dupl = NULL;
if (child->ns && next->ns && if (child->ns && next->ns &&
STREQ_NULLABLE((const char *) child->ns->href, STREQ_NULLABLE((const char *) child->ns->href,
@ -3722,6 +3735,8 @@ virDomainDefRemoveDuplicateMetadata(virDomainDefPtr def)
xmlFreeNode(dupl); xmlFreeNode(dupl);
} }
} }
child = child->next;
} }
} }
@ -3956,7 +3971,7 @@ virDomainDefPostParseInternal(virDomainDefPtr def,
} }
/* clean up possibly duplicated metadata entries */ /* clean up possibly duplicated metadata entries */
virDomainDefRemoveDuplicateMetadata(def); virDomainDefMetadataSanitize(def);
return 0; return 0;
} }

View File

@ -24,6 +24,9 @@
</devices> </devices>
<!-- intentional mis-indentation --> <!-- intentional mis-indentation -->
<metadata> <metadata>
<herp2erp xmlns:foobar="http://foo.bar3/"/>
<herp2erp xmlns:foobar="http://foo.bar3/"/>
<herp2erp xmlns:foobar="http://foo.bar3/"/>
<app1:foo xmlns:app1="http://foo.org/">fooish</app1:foo> <app1:foo xmlns:app1="http://foo.org/">fooish</app1:foo>
<app3:foo xmlns:app3="http://foo.org/">fooish</app3:foo> <app3:foo xmlns:app3="http://foo.org/">fooish</app3:foo>
<app1:foo xmlns:app1="http://foo.org/">fooish</app1:foo> <app1:foo xmlns:app1="http://foo.org/">fooish</app1:foo>