From 89b8ef5e9cb4079b2f9cf4f23a6b17370708ad07 Mon Sep 17 00:00:00 2001 From: joehni Date: Mon, 4 Jan 2021 00:32:48 +0100 Subject: [PATCH 1/4] Fix position on MXParser (#121) This closes #121 --- .../plexus/util/xml/pull/MXParser.java | 4 +- .../plexus/util/xml/pull/MXParserTest.java | 45 ++++++++++++++++--- 2 files changed, 42 insertions(+), 7 deletions(-) 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 e21b66cb..20fdcc8e 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 @@ -464,7 +464,7 @@ private void reset() // System.out.println("reset() called"); location = null; lineNumber = 1; - columnNumber = 0; + columnNumber = 1; seenRoot = false; reachedEnd = false; eventType = START_DOCUMENT; @@ -3156,7 +3156,7 @@ else if ( !seenInnerTag ) { // seenPITarget && !seenQ throw new XmlPullParserException( "processing instruction started on line " + curLine - + " and column " + curColumn + " was not closed", this, null ); + + " and column " + (curColumn -2) + " was not closed", this, null ); } } 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 27ba5f8c..b1dd6139 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 @@ -353,6 +353,35 @@ public void testValidCharacterReferenceDecimal() * * @throws java.lang.Exception if any. */ + @Test + public void testParserPosition() + throws Exception + { + String input = " \n \tnnn\n"; + + MXParser parser = new MXParser(); + parser.setInput( new StringReader( input ) ); + + assertEquals( XmlPullParser.PROCESSING_INSTRUCTION, parser.nextToken() ); + assertPosition( 1, 39, parser ); + assertEquals( XmlPullParser.COMMENT, parser.nextToken() ); + assertPosition( 1, 49, parser ); + assertEquals( XmlPullParser.IGNORABLE_WHITESPACE, parser.nextToken() ); + assertPosition( 2, 3, parser ); // end when next token starts + assertEquals( XmlPullParser.COMMENT, parser.nextToken() ); + assertPosition( 2, 12, parser ); + assertEquals( XmlPullParser.START_TAG, parser.nextToken() ); + assertPosition( 2, 18, parser ); + assertEquals( XmlPullParser.TEXT, parser.nextToken() ); + assertPosition( 2, 23, parser ); // end when next token starts + assertEquals( XmlPullParser.END_TAG, parser.nextToken() ); + assertPosition( 2, 29, parser ); + assertEquals( XmlPullParser.IGNORABLE_WHITESPACE, parser.nextToken() ); + assertPosition( 3, 2, parser ); // end when next token starts + assertEquals( XmlPullParser.COMMENT, parser.nextToken() ); + assertPosition( 4, 6, parser ); + } + @Test public void testProcessingInstruction() throws Exception @@ -624,7 +653,7 @@ public void testMalformedProcessingInstructionNoClosingQuestionMark() } catch ( XmlPullParserException ex ) { - assertTrue( ex.getMessage().contains( "processing instruction started on line 1 and column 2 was not closed" ) ); + assertTrue( ex.getMessage().contains( "processing instruction started on line 1 and column 1 was not closed" ) ); } } @@ -657,7 +686,7 @@ public void testSubsequentMalformedProcessingInstructionNoClosingQuestionMark() } catch ( XmlPullParserException ex ) { - assertTrue( ex.getMessage().contains( "processing instruction started on line 1 and column 13 was not closed" ) ); + assertTrue( ex.getMessage().contains( "processing instruction started on line 1 and column 12 was not closed" ) ); } } @@ -900,6 +929,12 @@ public void testEncodingISO_8859_1_setInputStream() } } + private static void assertPosition( int row, int col, MXParser parser ) + { + assertEquals( "Current line", row, parser.getLineNumber() ); + assertEquals( "Current column", col, parser.getColumnNumber() ); + } + /** * Issue 163: https://github.com/codehaus-plexus/plexus-utils/issues/163 * @@ -958,7 +993,7 @@ public void testCustomEntityNotFoundInText() } catch ( XmlPullParserException e ) { - assertTrue( e.getMessage().contains( "could not resolve entity named 'otherentity' (position: START_TAG seen &otherentity;... @1:19)" ) ); + assertTrue( e.getMessage().contains( "could not resolve entity named 'otherentity' (position: START_TAG seen &otherentity;... @1:20)" ) ); assertEquals( XmlPullParser.START_TAG, parser.getEventType() ); // not an ENTITY_REF assertEquals( "otherentity", parser.getText() ); } @@ -1025,7 +1060,7 @@ public void testCustomEntityNotFoundInAttr() } catch ( XmlPullParserException e ) { - assertTrue( e.getMessage().contains( "could not resolve entity named 'otherentity' (position: START_DOCUMENT seen Date: Tue, 5 Jan 2021 00:33:34 +0100 Subject: [PATCH 2/4] Fix start position of PI and comment for all reported errors (#124) This closes #124 --- .../java/org/codehaus/plexus/util/xml/pull/MXParser.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 20fdcc8e..d1c6ef18 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 @@ -2988,7 +2988,7 @@ private void parseComment() posStart = pos; final int curLine = lineNumber; - final int curColumn = columnNumber; + final int curColumn = columnNumber - 4; try { final boolean normalizeIgnorableWS = tokenize && !roundtripSupported; @@ -3109,7 +3109,7 @@ private boolean parsePI() if ( tokenize ) posStart = pos; final int curLine = lineNumber; - final int curColumn = columnNumber; + final int curColumn = columnNumber - 2; int piTargetStart = pos; int piTargetEnd = -1; final boolean normalizeIgnorableWS = tokenize && !roundtripSupported; @@ -3156,7 +3156,7 @@ else if ( !seenInnerTag ) { // seenPITarget && !seenQ throw new XmlPullParserException( "processing instruction started on line " + curLine - + " and column " + (curColumn -2) + " was not closed", this, null ); + + " and column " + curColumn + " was not closed", this, null ); } } else if ( ch == '<' ) From 11c749d677176b5b04573a1acd37997ec61dcc05 Mon Sep 17 00:00:00 2001 From: joehni Date: Mon, 4 Jan 2021 00:41:38 +0100 Subject: [PATCH 3/4] 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 From 0d97c8ba8dfa4663e86c5827555f980fd47c27a9 Mon Sep 17 00:00:00 2001 From: joehni Date: Tue, 5 Jan 2021 00:38:32 +0100 Subject: [PATCH 4/4] Fix endless loop caused by aborted subsequent PI or comment (#124) This closes #124 --- .../plexus/util/xml/pull/MXParser.java | 2 +- .../plexus/util/xml/pull/MXParserTest.java | 52 +++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) 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 30c30fef..d44c9a7f 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 @@ -3964,7 +3964,7 @@ private char more() fillBuf(); // this return value should be ignored as it is used in epilog parsing ... if ( reachedEnd ) - return (char) -1; + throw new EOFException( "no more data available" + getPositionDescription() ); } final char ch = buf[pos++]; // line/columnNumber 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 8e8dc231..e5e04708 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 @@ -726,6 +726,58 @@ public void testSubsequentMalformedProcessingInstructionNoClosingQuestionMark() * * @throws java.lang.Exception if any. */ + @Test + public void testSubsequentAbortedProcessingInstruction() + throws Exception + { + MXParser parser = new MXParser(); + StringBuilder sb = new StringBuilder(); + sb.append( "" ); + sb.append( "" ); + sb.append( "