base: reset unfinished xml nodes in xml_generator

Fixes #2855
This commit is contained in:
Alexander Boettcher 2018-06-12 14:47:50 +02:00 committed by Christian Helmuth
parent 7243fe74e4
commit ef482513c4
3 changed files with 74 additions and 5 deletions

View File

@ -252,10 +252,17 @@ class Genode::Xml_generator
xml._curr_node = this; xml._curr_node = this;
xml._curr_indent++; xml._curr_indent++;
/* try {
* Process attributes and sub nodes /*
*/ * Process attributes and sub nodes
func(); */
func();
} catch (...) {
/* reset and drop changes by not committing it */
xml._curr_node = _parent_node;
xml._curr_indent--;
throw;
}
xml._curr_node = _parent_node; xml._curr_node = _parent_node;
xml._curr_indent--; xml._curr_indent--;

View File

@ -48,5 +48,31 @@ compare_output_to {
[init -> test-xml_generator] [init -> test-xml_generator]
[init -> test-xml_generator] used 307 bytes [init -> test-xml_generator] used 307 bytes
[init -> test-xml_generator] buffer exceeded (expected error) [init -> test-xml_generator] buffer exceeded (expected error)
[init -> test-xml_generator]
[init -> test-xml_generator] exception on level3 (expected exception value=10)
[init -> test-xml_generator] exception on level3 (expected exception value=11)
[init -> test-xml_generator] exception on level3 (expected exception value=12)
[init -> test-xml_generator]
[init -> test-xml_generator] used 183 bytes, result:
[init -> test-xml_generator]
[init -> test-xml_generator] <config>
[init -> test-xml_generator] <level1>
[init -> test-xml_generator] <level2>
[init -> test-xml_generator]
[init -> test-xml_generator] <level3>
[init -> test-xml_generator] <level4/>
[init -> test-xml_generator] </level3>
[init -> test-xml_generator]
[init -> test-xml_generator] <level3>
[init -> test-xml_generator] <level4/>
[init -> test-xml_generator] </level3>
[init -> test-xml_generator]
[init -> test-xml_generator] <level3>
[init -> test-xml_generator] <level4/>
[init -> test-xml_generator] </level3>
[init -> test-xml_generator] </level2>
[init -> test-xml_generator] </level1>
[init -> test-xml_generator] </config>
[init -> test-xml_generator]
[init -> test-xml_generator] --- XML generator test finished --- [init -> test-xml_generator] --- XML generator test finished ---
} }

View File

@ -63,6 +63,35 @@ static size_t fill_buffer_with_xml(char *dst, size_t dst_len)
} }
static size_t xml_with_exceptions(char *dst, size_t dst_len)
{
Genode::Xml_generator xml(dst, dst_len, "config", [&]
{
xml.node("level1", [&] ()
{
xml.node("level2", [&] ()
{
for (unsigned i=0; i < 3; i++) {
try {
xml.node("level3_exception", [&] ()
{
throw 10 + i;
});
} catch (unsigned error) {
Genode::log("exception on level3 (expected exception value=", error, ")");
}
xml.node("level3", [&] ()
{
xml.node("level4", [&] () { });
});
}
});
});
});
return xml.used();
}
void Component::construct(Genode::Env &env) void Component::construct(Genode::Env &env)
{ {
using namespace Genode; using namespace Genode;
@ -84,7 +113,14 @@ void Component::construct(Genode::Env &env)
try { try {
fill_buffer_with_xml(dst, 20); } fill_buffer_with_xml(dst, 20); }
catch (Genode::Xml_generator::Buffer_exceeded) { catch (Genode::Xml_generator::Buffer_exceeded) {
log("buffer exceeded (expected error)"); } log("buffer exceeded (expected error)\n"); }
/*
* Test throwing non-XML related exceptions during xml generation
*/
memset(dst, 0, sizeof(dst));
used = xml_with_exceptions(dst, sizeof(dst));
log("\nused ", used, " bytes, result:\n\n", Cstring(dst));
/* /*
* Test the sanitizing of XML node content * Test the sanitizing of XML node content