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) {
node(name, func);
_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}
compare_output_to {
[init -> test-xml_generator] --- XML generator test started ---
[init -> test-xml_generator] result:
[init -> test-xml_generator]
[init -> test-xml_generator] <config xpos="27" ypos="34">
[init -> test-xml_generator] <box width="320" height="240"/>
[init -> test-xml_generator] <label name="a test">
[init -> test-xml_generator] <sub_label/>
[init -> test-xml_generator] <another_sub_label>
[init -> test-xml_generator] <sub_sub_label/>
[init -> test-xml_generator] </another_sub_label>
[init -> test-xml_generator] </label>
[init -> test-xml_generator] <bool true="true" false="false"/>
[init -> test-xml_generator] <signed int="-1" long="-2" longlong="-3"/>
[init -> test-xml_generator] <unsigned int="1" long="2" longlong="3"/>
[init -> test-xml_generator] </config>
[init -> test-xml_generator]
[init -> test-xml_generator] used 307 bytes
[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 180 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] <level3>
[init -> test-xml_generator] <level4/>
[init -> test-xml_generator] </level3>
[init -> test-xml_generator] <level3>
[init -> test-xml_generator] <level4/>
[init -> test-xml_generator] </level3>
[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 started ---
[init -> test-xml_generator]
[init -> test-xml_generator] used 308 bytes, result:
[init -> test-xml_generator]
[init -> test-xml_generator] <config xpos="27" ypos="34">
[init -> test-xml_generator] <box width="320" height="240"/>
[init -> test-xml_generator] <label name="a test">
[init -> test-xml_generator] <sub_label/>
[init -> test-xml_generator] <another_sub_label>
[init -> test-xml_generator] <sub_sub_label/>
[init -> test-xml_generator] </another_sub_label>
[init -> test-xml_generator] </label>
[init -> test-xml_generator] <bool true="true" false="false"/>
[init -> test-xml_generator] <signed int="-1" long="-2" longlong="-3"/>
[init -> test-xml_generator] <unsigned int="1" long="2" longlong="3"/>
[init -> test-xml_generator] </config>
[init -> test-xml_generator]
[init -> test-xml_generator] buffer exceeded (expected error)
[init -> test-xml_generator]
[init -> test-xml_generator] exception with value 10 on level 4 (expected error)
[init -> test-xml_generator] exception with value 20 on level 8 (expected error)
[init -> test-xml_generator] exception with value 30 on level 4 (expected error)
[init -> test-xml_generator] exception with value 11 on level 4 (expected error)
[init -> test-xml_generator] exception with value 21 on level 8 (expected error)
[init -> test-xml_generator] exception with value 31 on level 4 (expected error)
[init -> test-xml_generator] exception with value 12 on level 4 (expected error)
[init -> test-xml_generator] exception with value 22 on level 8 (expected error)
[init -> test-xml_generator] exception with value 32 on level 4 (expected error)
[init -> test-xml_generator] exception with value 40 on level 2 (expected error)
[init -> test-xml_generator]
[init -> test-xml_generator] used 419 bytes, result:
[init -> test-xml_generator]
[init -> test-xml_generator] <config>
[init -> test-xml_generator] <level1>
[init -> test-xml_generator] <level2 attr1="2271560481">
[init -> test-xml_generator] <level3 attr1="Hallo" attr2="123000">
[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] <level3 attr1="Hallo" attr2="123001">
[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] <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.attribute("attr1", 0x87654321ULL);
for (unsigned i=0; i < 3; i++) {
try {
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) {
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("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();
@ -105,7 +173,7 @@ void Component::construct(Genode::Env &env)
* corresponding run script).
*/
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