Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Niefer2004-09-17 15:06:12 +0000
committerAndrew Niefer2004-09-17 15:06:12 +0000
commit9ccd7573456c68655679b1537dcf7acb85d200d8 (patch)
treee2f5b9f1cef5c830d4f259f87c5fbbda9a18444c
parent99731c70190aa0d22b2002bf53fbb8090a607051 (diff)
downloadorg.eclipse.cdt-9ccd7573456c68655679b1537dcf7acb85d200d8.tar.gz
org.eclipse.cdt-9ccd7573456c68655679b1537dcf7acb85d200d8.tar.xz
org.eclipse.cdt-9ccd7573456c68655679b1537dcf7acb85d200d8.zip
fix 74176 - [Scanner] ArrayOutOfBoundsException scanning a string
-rw-r--r--core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java10
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java36
2 files changed, 37 insertions, 9 deletions
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java
index 791b9743721..a282b71fdfa 100644
--- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java
+++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner2/Scanner2Test.java
@@ -1807,5 +1807,15 @@ public class Scanner2Test extends BaseScanner2Test
assertTrue( callback.problems.isEmpty() );
}
+ public void testBug74176() throws Exception{
+ initializeScanner( "#define MYSTRING \"X Y Z " ); //$NON-NLS-1$
+ validateEOF();
+
+ initializeScanner( "#define m(b) #"); //$NON-NLS-1$
+ validateEOF();
+
+ initializeScanner( "#define m(foo,b) #b"); //$NON-NLS-1$
+ validateEOF();
+ }
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java
index 94a758f3126..94fb98f8942 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java
@@ -1715,15 +1715,24 @@ public class Scanner2 implements IScanner, IScannerData {
++bufferPos[bufferStackPos]; //advances us to the #
if( skipOverWhiteSpace() )
encounteredMultilineComment = true;
- ++bufferPos[bufferStackPos]; //advances us past the # (or last whitespace)
+
boolean isArg = false;
- for( int i = 0; i < arglist.length && arglist[i] != null; i++ ){
- if( CharArrayUtils.equals( buffer, bufferPos[bufferStackPos], arglist[i].length, arglist[i] ) ){
- isArg = true;
- //advance us to the end of the arg
- bufferPos[bufferStackPos] += arglist[i].length - 1;
- break;
- }
+ if( bufferPos[bufferStackPos] + 1 < limit )
+ {
+ ++bufferPos[bufferStackPos]; //advances us past the # (or last whitespace)
+ for( int i = 0; i < arglist.length && arglist[i] != null; i++ )
+ {
+ if( bufferPos[bufferStackPos] + arglist[i].length - 1 < limit )
+ {
+ if( CharArrayUtils.equals( buffer, bufferPos[bufferStackPos], arglist[i].length, arglist[i] ) )
+ {
+ isArg = true;
+ //advance us to the end of the arg
+ bufferPos[bufferStackPos] += arglist[i].length - 1;
+ break;
+ }
+ }
+ }
}
if( !isArg )
handleProblem( IProblem.PREPROCESSOR_MACRO_PASTING_ERROR, bufferPos[bufferStackPos], null );
@@ -2055,6 +2064,7 @@ public class Scanner2 implements IScanner, IScannerData {
--bufferPos[bufferStackPos];
return encounteredMultiLineComment;
}
+ --bufferPos[bufferStackPos];
return encounteredMultiLineComment;
}
@@ -2122,6 +2132,11 @@ public class Scanner2 implements IScanner, IScannerData {
escaped = false;
}
}
+ //if we hit the limit here, then the outer while loop will advance
+ //us 2 past the end and we'll back up one and still be past the end,
+ //so back up here as well to leave us at the last char.
+ if( bufferPos[bufferStackPos] == bufferLimit[bufferStackPos] )
+ bufferPos[bufferStackPos]--;
break;
case '\'':
escaped = false;
@@ -2141,10 +2156,13 @@ public class Scanner2 implements IScanner, IScannerData {
escaped = false;
}
}
+ if( bufferPos[bufferStackPos] == bufferLimit[bufferStackPos] )
+ bufferPos[bufferStackPos]--;
+
break;
case '#' :
if( stopAtPound ){
- if( buffer[ bufferPos[bufferStackPos] + 1] != '#' ){
+ if( bufferPos[bufferStackPos] + 1 >= limit || buffer[ bufferPos[bufferStackPos] + 1] != '#' ){
--bufferPos[bufferStackPos];
return false;
}

Back to the top