From 7276967d040f8e02573aedb61b8d949c297cedd9 Mon Sep 17 00:00:00 2001 From: joehni Date: Mon, 4 Jan 2021 00:32:48 +0100 Subject: [PATCH 1/3] Fix position on MXParser. --- .../plexus/util/xml/pull/MXParser.java | 4 +- .../plexus/util/xml/pull/MXParserTest.java | 37 ++++++++++++++++++- 2 files changed, 37 insertions(+), 4 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 40a12a21..a75f9b0e 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 @@ -460,7 +460,7 @@ private void reset() // System.out.println("reset() called"); location = null; lineNumber = 1; - columnNumber = 0; + columnNumber = 1; seenRoot = false; reachedEnd = false; eventType = START_DOCUMENT; @@ -3082,7 +3082,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 0cb9c061..68d607a9 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 @@ -286,6 +286,35 @@ public void testValidCharacterReferenceDecimal() } } + @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 @@ -517,7 +546,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" ) ); } } @@ -545,7 +574,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" ) ); } } @@ -661,4 +690,8 @@ public void testMalformedXMLRootElement5() } } + private static void assertPosition(int row, int col, MXParser parser) { + assertEquals("Current line", row, parser.getLineNumber()); + assertEquals("Current column", col, parser.getColumnNumber()); + } } From 9d95846ee090badddee140eb1a0e8261cdd4d5c7 Mon Sep 17 00:00:00 2001 From: joehni Date: Tue, 5 Jan 2021 00:33:34 +0100 Subject: [PATCH 2/3] Fix start position of PI and comment for all reported errors. --- .../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 a75f9b0e..a952b0eb 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 @@ -2918,7 +2918,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; @@ -3035,7 +3035,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; @@ -3082,7 +3082,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 9a8be1542579bb8a36960961cb1f1ce0ea63d78d Mon Sep 17 00:00:00 2001 From: joehni Date: Tue, 5 Jan 2021 00:38:32 +0100 Subject: [PATCH 3/3] Fix endless loop caused by aborted subsequent PI or comment. --- .../plexus/util/xml/pull/MXParser.java | 12 ++++- .../plexus/util/xml/pull/MXParserTest.java | 52 +++++++++++++++++++ 2 files changed, 62 insertions(+), 2 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 a952b0eb..1acd1fae 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 @@ -2930,7 +2930,11 @@ private void parseComment() { // scan until it hits --> ch = more(); - if ( seenDashDash && ch != '>' ) + if ( ch == (char)-1 ) + { + throw new EOFException( "no more data available" + getPositionDescription() ); + } + else if ( seenDashDash && ch != '>' ) { throw new XmlPullParserException( "in comment after two dashes (--) next character must be >" + " not " + printable( ch ), this, null ); @@ -3057,7 +3061,11 @@ private boolean parsePI() // scan until it hits ?> // ch = more(); - if ( ch == '?' ) + if ( ch == (char)-1 ) + { + throw new EOFException( "no more data available" + getPositionDescription() ); + } + else if ( ch == '?' ) { if ( !seenPITarget ) { 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 68d607a9..2f7c350b 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 @@ -578,6 +578,58 @@ public void testSubsequentMalformedProcessingInstructionNoClosingQuestionMark() } } + @Test + public void testSubsequentAbortedProcessingInstruction() + throws Exception + { + MXParser parser = new MXParser(); + StringBuilder sb = new StringBuilder(); + sb.append( "" ); + sb.append( "" ); + sb.append( "