From 31950e91b9178f85cf91946f67db3ec79d406a3b Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 11 Mar 2016 10:51:50 +0100 Subject: [PATCH] don't get stuck in _wordenize, don't allow evil regexp as word definition, fixes #3963 --- src/vs/editor/common/services/editorSimpleWorker.ts | 4 ++++ src/vs/workbench/api/node/extHost.api.impl.ts | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/src/vs/editor/common/services/editorSimpleWorker.ts b/src/vs/editor/common/services/editorSimpleWorker.ts index d3f19c25956..e8d071e30cf 100644 --- a/src/vs/editor/common/services/editorSimpleWorker.ts +++ b/src/vs/editor/common/services/editorSimpleWorker.ts @@ -96,6 +96,10 @@ class MirrorModel extends MirrorModel2 { var result:editorCommon.IWordRange[] = []; var match:RegExpExecArray; while (match = wordDefinition.exec(content)) { + if (match[0].length === 0) { + // it did match the empty string + break; + } result.push({ start: match.index, end: match.index + match[0].length }); } return result; diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index dd7a094f04f..138eba0c406 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -6,6 +6,7 @@ import {Emitter} from 'vs/base/common/event'; import {score} from 'vs/editor/common/modes/languageSelector'; +import {regExpLeadsToEndlessLoop} from 'vs/base/common/strings'; import {Remotable, IThreadService} from 'vs/platform/thread/common/thread'; import * as errors from 'vs/base/common/errors'; import {ExtHostFileSystemEventService} from 'vs/workbench/api/node/extHostFileSystemEventService'; @@ -398,6 +399,11 @@ export class ExtHostAPIImplementation { let {wordPattern} = configuration; + // check for a valid word pattern + if (wordPattern && regExpLeadsToEndlessLoop(wordPattern)) { + throw new Error(`Invalid language configuration: wordPattern '${wordPattern}' is not allowed to match the empty string.`); + } + // word definition if (wordPattern) { setWordDefinitionFor(modeId, wordPattern);