Add handling / mitigation for invalid XML
authorJeff Godin <jgodin@tadl.org>
Wed, 4 Dec 2013 18:03:00 +0000 (13:03 -0500)
committerJeff Godin <jgodin@tadl.org>
Thu, 15 May 2014 18:20:38 +0000 (14:20 -0400)
Wrap XML parsing attempts in an eval block to avoid having the CGI
generate an Internal Server Error.

Add support for removing raw Control-D characters, which we have
experienced in the wild when working with INN-REACH.

Generate warnings and attempt to gracefully fail with a log entry
and the "do not hang INN-REACH" message approach used in fail().

Signed-off-by: Jeff Godin <jgodin@tadl.org>
iNCIPit.cgi

index dc65d23..3466dc6 100644 (file)
@@ -133,7 +133,25 @@ close POST_DATA;
 
 # initialize the parser
 my $parser = new XML::LibXML;
-my $doc = $parser->load_xml( string => $xml );
+my $doc;
+
+# Attempt to parse XML without any modification
+eval {
+    $doc = $parser->load_xml( string => $xml );
+};
+
+# If unsuccessful, attempt to modify XML and try again
+# This is based on actual invalid XML encountered in the wild
+# in an INN-REACH environment.
+if ($@ && ref($@) == 'XML::LibXML::Error') {
+    warn "Unable to parse XML on first try. Attempting to de-mangle.\n";
+    $xml =~ s/\x04//g; # Remove ^D from xml
+    eval {
+        $doc = $parser->load_xml( string => $xml );
+    };
+}
+
+fail("Unable to parse XML. Giving up.") unless $doc;
 
 my %session = login();