From 11c749d677176b5b04573a1acd37997ec61dcc05 Mon Sep 17 00:00:00 2001 From: joehni Date: Mon, 4 Jan 2021 00:41:38 +0100 Subject: [PATCH] Fix endless loop with invalid PI containing XML (#122) This closes #122 --- .../plexus/util/xml/pull/MXParser.java | 4 +++ .../plexus/util/xml/pull/MXParserTest.java | 31 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/src/main/java/org/codehaus/plexus/util/xml/pull/MXParser.java b/src/main/java/org/codehaus/plexus/util/xml/pull/MXParser.java index d1c6ef18..30c30fef 100644 --- a/src/main/java/org/codehaus/plexus/util/xml/pull/MXParser.java +++ b/src/main/java/org/codehaus/plexus/util/xml/pull/MXParser.java @@ -3158,6 +3158,10 @@ else if ( !seenInnerTag ) throw new XmlPullParserException( "processing instruction started on line " + curLine + " and column " + curColumn + " was not closed", this, null ); } + else + { + seenInnerTag = false; + } } else if ( ch == '<' ) { diff --git a/src/test/java/org/codehaus/plexus/util/xml/pull/MXParserTest.java b/src/test/java/org/codehaus/plexus/util/xml/pull/MXParserTest.java index b1dd6139..8e8dc231 100644 --- a/src/test/java/org/codehaus/plexus/util/xml/pull/MXParserTest.java +++ b/src/test/java/org/codehaus/plexus/util/xml/pull/MXParserTest.java @@ -432,6 +432,37 @@ public void testProcessingInstructionsContainingXml() * * @throws java.lang.Exception if any. */ + @Test + public void testMalformedProcessingInstructionsContainingXmlNoClosingQuestionMark() + throws Exception + { + StringBuffer sb = new StringBuffer(); + sb.append( "\n" ); + sb.append( "\n" ); + sb.append( "\n" ); + sb.append( " >\n" ); + + MXParser parser = new MXParser(); + parser.setInput( new StringReader( sb.toString() ) ); + + try + { + assertEquals( XmlPullParser.PROCESSING_INSTRUCTION, parser.nextToken() ); + assertEquals( XmlPullParser.IGNORABLE_WHITESPACE, parser.nextToken() ); + assertEquals( XmlPullParser.START_TAG, parser.nextToken() ); + assertEquals( XmlPullParser.END_TAG, parser.nextToken() ); + assertEquals( XmlPullParser.IGNORABLE_WHITESPACE, parser.nextToken() ); + assertEquals( XmlPullParser.PROCESSING_INSTRUCTION, parser.nextToken() ); + + fail( "Should fail since it has invalid PI" ); + } + catch ( XmlPullParserException ex ) + { + assertTrue( ex.getMessage().contains( "processing instruction started on line 3 and column 1 was not closed" ) ); + } + } + @Test public void testSubsequentProcessingInstructionShort() throws Exception