From 410652d42a6b96dfe4d56e9d345e92b697dd9a6c Mon Sep 17 00:00:00 2001 From: Martin Stein Date: Fri, 1 Jun 2018 21:45:18 +0200 Subject: [PATCH] nic_router: invalidate domains with same name If two domains have the same name, invalidate (dissolve, destroy) them both. Issue #2840 --- .../src/server/nic_router/avl_string_tree.h | 17 ++++++++++++-- .../os/src/server/nic_router/configuration.cc | 22 +++++++++++++++++-- .../os/src/server/nic_router/configuration.h | 3 +++ 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/repos/os/src/server/nic_router/avl_string_tree.h b/repos/os/src/server/nic_router/avl_string_tree.h index 5ccb4cf0ea..31a4e956b8 100644 --- a/repos/os/src/server/nic_router/avl_string_tree.h +++ b/repos/os/src/server/nic_router/avl_string_tree.h @@ -14,6 +14,9 @@ #ifndef _AVL_STRING_TREE_H_ #define _AVL_STRING_TREE_H_ +/* local includes */ +#include + /* Genode includes */ #include #include @@ -44,7 +47,13 @@ class Net::Avl_string_tree : public Genode::Avl_tree public: - struct No_match : Genode::Exception { }; + struct No_match : Genode::Exception { }; + struct Name_not_unique : Genode::Exception + { + OBJECT &object; + + Name_not_unique(OBJECT &object) : object(object) { } + }; OBJECT &find_by_name(NAME const &name) { return _find_by_name(name.string()); } @@ -72,7 +81,11 @@ class Net::Avl_string_tree : public Genode::Avl_tree } } - void insert(OBJECT &object) { Tree::insert(&object); } + void insert(OBJECT &object) + { + try { throw Name_not_unique(_find_by_name(static_cast(&object)->name())); } + catch (No_match) { Tree::insert(&object); } + } void remove(OBJECT &object) { Tree::remove(&object); } }; diff --git a/repos/os/src/server/nic_router/configuration.cc b/repos/os/src/server/nic_router/configuration.cc index 353383f9fc..33d3efb6e0 100644 --- a/repos/os/src/server/nic_router/configuration.cc +++ b/repos/os/src/server/nic_router/configuration.cc @@ -35,6 +35,17 @@ Configuration::Configuration(Xml_node const node, { } +void Configuration::_invalid_domain(Domain &domain, + char const *reason) +{ + if (_verbose) { + log("[", domain, "] invalid domain (", reason, ") "); } + + _domains.remove(domain); + destroy(_alloc, &domain); +} + + Configuration::Configuration(Env &env, Xml_node const node, Allocator &alloc, @@ -56,8 +67,15 @@ Configuration::Configuration(Env &env, { /* read domains */ node.for_each_sub_node("domain", [&] (Xml_node const node) { - try { _domains.insert(*new (_alloc) Domain(*this, node, _alloc)); } - catch (Domain::Invalid) { log("invalid domain"); } + try { + Domain &domain = *new (_alloc) Domain(*this, node, _alloc); + try { _domains.insert(domain); } + catch (Domain_tree::Name_not_unique exception) { + _invalid_domain(domain, "name not unique"); + _invalid_domain(exception.object, "name not unique"); + } + } + catch (Domain::Invalid) { log("[?] invalid domain"); } }); /* do those parts of domain init that require the domain tree to be complete */ List invalid_domains; diff --git a/repos/os/src/server/nic_router/configuration.h b/repos/os/src/server/nic_router/configuration.h index 97f1dd9ffa..deb1334947 100644 --- a/repos/os/src/server/nic_router/configuration.h +++ b/repos/os/src/server/nic_router/configuration.h @@ -48,6 +48,9 @@ class Net::Configuration Domain_tree _domains { }; Genode::Xml_node const _node; + void _invalid_domain(Domain &domain, + char const *reason); + public: enum { DEFAULT_REPORT_INTERVAL_SEC = 5 };