-
Notifications
You must be signed in to change notification settings - Fork 2.7k
Closed
Description
Any CR characters in script output are backslash-escaped in XML output, while LFs are not:
<elem key="output">No LSB modules are available.\x0D
Distributor ID:	Ubuntu\x0D
Description:	Ubuntu 16.04.6 LTS\x0D
Release:	16.04\x0D
Codename:	xenial\x0D
</elem>The patch below rectifies the issue, treating CRs just like LFs:
<elem key="output">No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 16.04.6 LTS
Release:	16.04
Codename:	xenial
</elem>* Prevents backslash-escaping of CR characters in XML output
--- a/output.cc
+++ b/output.cc
@@ -493,8 +493,21 @@
xml_write_escaped is not enough; some characters are not allowed to appear in
XML, not even escaped. */
std::string protect_xml(const std::string s) {
- /* escape_for_screen is good enough. */
- return escape_for_screen(s);
+ std::string r;
+
+ for (unsigned int i = 0; i < s.size(); i++) {
+ char buf[5];
+ unsigned char c = s[i];
+ // Printable and some whitespace ok.
+ if (c == '\t' || c == '\r' || c == '\n' || (0x20 <= c && c <= 0x7e)) {
+ r += c;
+ } else {
+ Snprintf(buf, sizeof(buf), "\\x%02X", c);
+ r += buf;
+ }
+ }
+
+ return r;
}
/* This is a helper function to determine the ordering of the script results