Skip to content

Commit

Permalink
Xml_generator: fix and test missing '\0'
Browse files Browse the repository at this point in the history
Previously, a '\0' was appended to the out buffer at the end of each
call of the Node constructor. At the end of the Xml_generator
constructor, at the other hand, '\n' was appended. Without exceptions in
the Node constructor this led to "\0\n" at the end of generated XML.
However, with exceptions, the '\0' of the last Node constructor call was
sometimes overwritten, leading to a mere "\n" at the end. It is better
to append '\0' only in one place, namely at the point where the '\n' was
appended in the Xml_generator constructor. This also fixes the problem
with the exceptions.

This also extends the xml_generator test to drive a harder test on
exceptions in the Xml_generator.

Fixes genodelabs#2967
  • Loading branch information
m-stein committed Sep 26, 2018
1 parent b48229a commit 693862d
Show file tree
Hide file tree
Showing 3 changed files with 126 additions and 50 deletions.
4 changes: 1 addition & 3 deletions repos/base/include/util/xml_generator.h
Expand Up @@ -306,8 +306,6 @@ class Genode::Xml_generator
_parent_node->_commit_content(_out_buffer);
else
xml._out_buffer = _out_buffer;

_out_buffer.append('\0');
}

bool has_content() { return _has_content; }
Expand All @@ -328,7 +326,7 @@ class Genode::Xml_generator
{
if (dst) {
node(name, func);
_out_buffer.append('\n');
_out_buffer.append('\0');
}
}

Expand Down
94 changes: 52 additions & 42 deletions repos/os/run/xml_generator.run
Expand Up @@ -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 307 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 418 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 ---
}
78 changes: 73 additions & 5 deletions repos/os/src/test/xml_generator/main.cc
Expand Up @@ -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();
Expand All @@ -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), "\n");

/*
* Test buffer overflow
Expand All @@ -120,7 +188,7 @@ void Component::construct(Genode::Env &env)
*/
memset(dst, 0, sizeof(dst));
used = xml_with_exceptions(dst, sizeof(dst));
log("\nused ", used, " bytes, result:\n\n", Cstring(dst));
log("\nused ", used, " bytes, result:\n\n", Cstring(dst), "\n");

/*
* Test the sanitizing of XML node content
Expand Down

0 comments on commit 693862d

Please sign in to comment.