diff --git a/repos/base/include/util/xml_node.h b/repos/base/include/util/xml_node.h index bada06cea3..518c607d3a 100644 --- a/repos/base/include/util/xml_node.h +++ b/repos/base/include/util/xml_node.h @@ -891,15 +891,17 @@ class Genode::Xml_node if (_num_sub_nodes == 0) return; - Xml_node node = sub_node(); - for (int i = 0; ; node = node.next()) { + try { + Xml_node node = sub_node(); + for (int i = 0; ; node = node.next()) { - if (!type || node.has_type(type)) - fn(node); + if (!type || node.has_type(type)) + fn(node); - if (++i == _num_sub_nodes) - break; - } + if (++i == _num_sub_nodes) + break; + } + } catch (Nonexistent_sub_node) { } } /** diff --git a/repos/base/recipes/pkg/test-xml_node/runtime b/repos/base/recipes/pkg/test-xml_node/runtime index 8bf46c06ea..dc9d024687 100644 --- a/repos/base/recipes/pkg/test-xml_node/runtime +++ b/repos/base/recipes/pkg/test-xml_node/runtime @@ -103,6 +103,8 @@ [init -> test-xml_node] step 4 [init -> test-xml_node] step 5 [init -> test-xml_node] + [init -> test-xml_node] -- Test iterating over invalid node -- + [init -> test-xml_node] [init -> test-xml_node] --- End of XML-parser test ---* [init] child "test-xml_node" exited with exit value 0 diff --git a/repos/base/src/test/xml_node/test.cc b/repos/base/src/test/xml_node/test.cc index d9b6146482..d69a298728 100644 --- a/repos/base/src/test/xml_node/test.cc +++ b/repos/base/src/test/xml_node/test.cc @@ -413,6 +413,13 @@ void Component::construct(Genode::Env &env) test_decoded_content<0 >(env, 5, xml_test_comments, 8, 119); log(""); + log("-- Test iterating over invalid node --"); + { + /* this must not raise a 'Nonexistent_sub_node' exception */ + Xml_node("").for_each_sub_node("c", [&] (Xml_node) { }); + } + log(""); + log("--- End of XML-parser test ---"); env.parent().exit(0); }