From 232528b4b4161a6153eec940e0364f8a90613a82 Mon Sep 17 00:00:00 2001 From: Anton Leherbauer Date: Fri, 30 Mar 2007 13:06:28 +0000 Subject: [PATCH] Fix for 180172: Endless loop parsing nsNameSpaceManager.cpp --- .../core/parser/scanner2/BaseScanner.java | 16 +++++++++++++--- .../core/parser/scanner2/DOMScanner.java | 8 +++++++- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java index 376b182e2ab..8a7eb2a3fb6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java @@ -2337,9 +2337,11 @@ abstract class BaseScanner implements IScanner { char[] result = new char[text.length]; Arrays.fill(result, ' '); int resultCount = 0; + boolean insideString= false; + boolean backslash= false; // either a single-line or multi-line comment was found for (int i = 0; i < text.length; ++i) { - if (text[i] == '/' && (i + 1 < text.length) && (text[i + 1] == '*' || text[i + 1] == '/')) { + if (!insideString && (text[i] == '/' && (i + 1 < text.length) && (text[i + 1] == '*' || text[i + 1] == '/'))) { if (text[i + 1] == '/') { // done break; @@ -2350,9 +2352,17 @@ abstract class BaseScanner implements IScanner { ++i; } ++i; - } else + } else { + if (insideString && !backslash && text[i] == '\\') { + backslash= true; + } else { + backslash= false; + } + if (!backslash && text[i] == '"') { + insideString= !insideString; + } result[resultCount++] = text[i]; - + } } return CharArrayUtils.trim(result); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/DOMScanner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/DOMScanner.java index e5ebe1445e6..25f690c0c96 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/DOMScanner.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/DOMScanner.java @@ -655,7 +655,13 @@ public class DOMScanner extends BaseScanner { public final IToken getNext() { return next; } - public void setNext(IToken t) { next = t; } + public void setNext(IToken t) { + // guard against endless loop + // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=180172 + assert t != this : "Token recursion"; //$NON-NLS-1$ + if (t != this) + next = t; + } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ITokenDuple#contains(org.eclipse.cdt.core.parser.ITokenDuple)