Xml_generator: fix and test missing '\0'

Ensure that a '\0' always appears at the end of the ouput of the XML
generator.  Previously, exceptions during the Node(...) constructor
might have prevented this. This commit also extends the xml_generator
test to drive a harder test on exceptions in the Xml_generator.

Issue #2953
This commit is contained in:
Martin Stein 2018-09-07 13:50:54 +02:00 committed by Christian Helmuth
parent 85d589a49c
commit 364f69edad
3 changed files with 125 additions and 46 deletions

View File

@ -329,6 +329,7 @@ class Genode::Xml_generator
if (dst) { if (dst) {
node(name, func); node(name, func);
_out_buffer.append('\n'); _out_buffer.append('\n');
_out_buffer.append('\0');
} }
} }

View File

@ -30,46 +30,56 @@ run_genode_until "--- XML generator test finished ---.*\n" 30
grep_output {^\[init -> test-xml_generator} grep_output {^\[init -> test-xml_generator}
compare_output_to { compare_output_to {
[init -> test-xml_generator] --- XML generator test started --- [init -> test-xml_generator] --- XML generator test started ---
[init -> test-xml_generator] result: [init -> test-xml_generator]
[init -> test-xml_generator] [init -> test-xml_generator] used 308 bytes, result:
[init -> test-xml_generator] <config xpos="27" ypos="34"> [init -> test-xml_generator]
[init -> test-xml_generator] <box width="320" height="240"/> [init -> test-xml_generator] <config xpos="27" ypos="34">
[init -> test-xml_generator] <label name="a test"> [init -> test-xml_generator] <box width="320" height="240"/>
[init -> test-xml_generator] <sub_label/> [init -> test-xml_generator] <label name="a test">
[init -> test-xml_generator] <another_sub_label> [init -> test-xml_generator] <sub_label/>
[init -> test-xml_generator] <sub_sub_label/> [init -> test-xml_generator] <another_sub_label>
[init -> test-xml_generator] </another_sub_label> [init -> test-xml_generator] <sub_sub_label/>
[init -> test-xml_generator] </label> [init -> test-xml_generator] </another_sub_label>
[init -> test-xml_generator] <bool true="true" false="false"/> [init -> test-xml_generator] </label>
[init -> test-xml_generator] <signed int="-1" long="-2" longlong="-3"/> [init -> test-xml_generator] <bool true="true" false="false"/>
[init -> test-xml_generator] <unsigned int="1" long="2" longlong="3"/> [init -> test-xml_generator] <signed int="-1" long="-2" longlong="-3"/>
[init -> test-xml_generator] </config> [init -> test-xml_generator] <unsigned int="1" long="2" longlong="3"/>
[init -> test-xml_generator] [init -> test-xml_generator] </config>
[init -> test-xml_generator] used 307 bytes [init -> test-xml_generator]
[init -> test-xml_generator] buffer exceeded (expected error) [init -> test-xml_generator] buffer exceeded (expected error)
[init -> test-xml_generator] [init -> test-xml_generator]
[init -> test-xml_generator] exception on level3 (expected exception value=10) [init -> test-xml_generator] exception with value 10 on level 4 (expected error)
[init -> test-xml_generator] exception on level3 (expected exception value=11) [init -> test-xml_generator] exception with value 20 on level 8 (expected error)
[init -> test-xml_generator] exception on level3 (expected exception value=12) [init -> test-xml_generator] exception with value 30 on level 4 (expected error)
[init -> test-xml_generator] [init -> test-xml_generator] exception with value 11 on level 4 (expected error)
[init -> test-xml_generator] used 180 bytes, result: [init -> test-xml_generator] exception with value 21 on level 8 (expected error)
[init -> test-xml_generator] [init -> test-xml_generator] exception with value 31 on level 4 (expected error)
[init -> test-xml_generator] <config> [init -> test-xml_generator] exception with value 12 on level 4 (expected error)
[init -> test-xml_generator] <level1> [init -> test-xml_generator] exception with value 22 on level 8 (expected error)
[init -> test-xml_generator] <level2> [init -> test-xml_generator] exception with value 32 on level 4 (expected error)
[init -> test-xml_generator] <level3> [init -> test-xml_generator] exception with value 40 on level 2 (expected error)
[init -> test-xml_generator] <level4/> [init -> test-xml_generator]
[init -> test-xml_generator] </level3> [init -> test-xml_generator] used 419 bytes, result:
[init -> test-xml_generator] <level3> [init -> test-xml_generator]
[init -> test-xml_generator] <level4/> [init -> test-xml_generator] <config>
[init -> test-xml_generator] </level3> [init -> test-xml_generator] <level1>
[init -> test-xml_generator] <level3> [init -> test-xml_generator] <level2 attr1="2271560481">
[init -> test-xml_generator] <level4/> [init -> test-xml_generator] <level3 attr1="Hallo" attr2="123000">
[init -> test-xml_generator] </level3> [init -> test-xml_generator] <level4_1 attr1="true" attr2="Welt"/>
[init -> test-xml_generator] </level2> [init -> test-xml_generator] <level4_2/>
[init -> test-xml_generator] </level1> [init -> test-xml_generator] </level3>
[init -> test-xml_generator] </config> [init -> test-xml_generator] <level3 attr1="Hallo" attr2="123001">
[init -> test-xml_generator] [init -> test-xml_generator] <level4_1 attr1="true" attr2="Welt"/>
[init -> test-xml_generator] --- XML generator test finished --- [init -> test-xml_generator] <level4_2/>
[init -> test-xml_generator] </level3>
[init -> test-xml_generator] <level3 attr1="Hallo" attr2="123002">
[init -> test-xml_generator] <level4_1 attr1="true" attr2="Welt"/>
[init -> test-xml_generator] <level4_2/>
[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 ---
} }

View File

@ -71,21 +71,89 @@ static size_t xml_with_exceptions(char *dst, size_t dst_len)
{ {
xml.node("level2", [&] () xml.node("level2", [&] ()
{ {
xml.attribute("attr1", 0x87654321ULL);
for (unsigned i=0; i < 3; i++) { for (unsigned i=0; i < 3; i++) {
try { try {
xml.node("level3_exception", [&] () xml.node("level3_exception", [&] ()
{ {
throw 10 + i; xml.attribute("attr1", 1234);
xml.attribute("attr2", 4321);
xml.attribute("attr3", 2143);
xml.node("level4_exception", [&] ()
{
xml.attribute("attr1", "Hallo");
xml.node("level5_exception_1", [&] ()
{
xml.attribute("attr1", true);
xml.attribute("attr2", false);
});
xml.node("level5_exception_2", [&] () { });
throw 10 + i;
});
}); });
} catch (unsigned error) { } catch (unsigned error) {
Genode::log("exception on level3 (expected exception value=", error, ")"); Genode::log("exception with value ", error, " on level 4 (expected error)");
} }
xml.node("level3", [&] () xml.node("level3", [&] ()
{ {
xml.node("level4", [&] () { }); xml.attribute("attr1", "Hallo");
xml.attribute("attr2", 123000 + i);
xml.node("level4_1", [&] () {
xml.attribute("attr1", true);
xml.attribute("attr2", "Welt");
});
try {
xml.node("level4_exception", [&] ()
{
xml.attribute("attr1", "Welt");
xml.attribute("attr2", 2143);
xml.attribute("attr3", false);
xml.attribute("attr3", 0x12345678ULL);
xml.node("level5_exception_1", [&] () { });
xml.node("level5_exception_2", [&] () { });
xml.node("level5_exception_3", [&] ()
{
xml.node("level6_exception", [&] ()
{
xml.attribute("attr1", 0x12345678ULL);
xml.node("level7_exception_3", [&] ()
{
xml.node("level8_exception_1", [&] () { });
xml.node("level8_exception_2", [&] () { });
xml.node("level8_exception_3", [&] () { });
xml.node("level8_exception_4", [&] ()
{
throw 20 + i;
});
});
});
});
});
} catch (unsigned error) {
Genode::log("exception with value ", error, " on level 8 (expected error)");
}
xml.node("level4_2", [&] () { });
try {
xml.node("level4_exception", [&] ()
{
xml.attribute("attr1", "Welt");
xml.attribute("attr2", 2143);
throw 30 + i;
});
} catch (unsigned error) {
Genode::log("exception with value ", error, " on level 4 (expected error)");
}
}); });
} }
}); });
try {
xml.node("level2_exception", [&] ()
{
throw 40;
});
} catch (int error) {
Genode::log("exception with value ", error, " on level 2 (expected error)");
}
}); });
}); });
return xml.used(); return xml.used();
@ -105,7 +173,7 @@ void Component::construct(Genode::Env &env)
* corresponding run script). * corresponding run script).
*/ */
size_t used = fill_buffer_with_xml(dst, sizeof(dst)); size_t used = fill_buffer_with_xml(dst, sizeof(dst));
log("result:\n\n", Cstring(dst), "\nused ", used, " bytes"); log("\nused ", used, " bytes, result:\n\n", Cstring(dst));
/* /*
* Test buffer overflow * Test buffer overflow