From 96cbfb4a2cbb74fadf0d99c1922d380c1bb17191 Mon Sep 17 00:00:00 2001 From: Konstantin Shcheglov Date: Tue, 14 Jan 2020 20:08:13 +0000 Subject: [PATCH] Issue 39059. Check for minor / major version overflow. Bug: https://github.com/dart-lang/sdk/issues/39059 Change-Id: I78a5598b2433d772409a41f7c6e87b32f859c6be Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/131705 Reviewed-by: Paul Berry Commit-Queue: Konstantin Shcheglov --- .../lib/src/dart/scanner/scanner.dart | 10 ++-- pkg/analyzer/test/generated/scanner_test.dart | 47 +++++++++++++++++++ 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/pkg/analyzer/lib/src/dart/scanner/scanner.dart b/pkg/analyzer/lib/src/dart/scanner/scanner.dart index ec2b6211b97..6058b89e40e 100644 --- a/pkg/analyzer/lib/src/dart/scanner/scanner.dart +++ b/pkg/analyzer/lib/src/dart/scanner/scanner.dart @@ -4,9 +4,9 @@ import 'package:_fe_analyzer_shared/src/scanner/errors.dart' show translateErrorToken; +import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' as fasta; import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token, TokenType; -import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' as fasta; import 'package:analyzer/dart/analysis/features.dart'; import 'package:analyzer/error/error.dart'; import 'package:analyzer/error/listener.dart'; @@ -190,9 +190,11 @@ class Scanner { void _languageVersionChanged( fasta.Scanner scanner, fasta.LanguageVersionToken languageVersion) { if (_featureSet != null) { - _featureSet = _featureSet.restrictToVersion( - Version(languageVersion.major, languageVersion.minor, 0)); - scanner.configuration = buildConfig(_featureSet); + if (languageVersion.major >= 0 && languageVersion.minor >= 0) { + _featureSet = _featureSet.restrictToVersion( + Version(languageVersion.major, languageVersion.minor, 0)); + scanner.configuration = buildConfig(_featureSet); + } } } diff --git a/pkg/analyzer/test/generated/scanner_test.dart b/pkg/analyzer/test/generated/scanner_test.dart index bec2ac56b53..f37d25e1120 100644 --- a/pkg/analyzer/test/generated/scanner_test.dart +++ b/pkg/analyzer/test/generated/scanner_test.dart @@ -5,11 +5,14 @@ import 'package:_fe_analyzer_shared/src/scanner/error_token.dart'; import 'package:analyzer/dart/analysis/features.dart'; import 'package:analyzer/dart/ast/token.dart'; +import 'package:analyzer/error/listener.dart'; import 'package:analyzer/source/line_info.dart'; import 'package:analyzer/src/dart/ast/token.dart'; import 'package:analyzer/src/dart/scanner/reader.dart'; import 'package:analyzer/src/dart/scanner/scanner.dart'; import 'package:analyzer/src/generated/source.dart'; +import 'package:analyzer/src/string_source.dart'; +import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart'; import 'package:test/test.dart'; import 'package:test_reflective_loader/test_reflective_loader.dart'; @@ -18,6 +21,7 @@ import 'test_support.dart'; main() { defineReflectiveSuite(() { defineReflectiveTests(LineInfoTest); + defineReflectiveTests(ScannerTest); }); } @@ -183,6 +187,49 @@ class LineInfoTest { } } +@reflectiveTest +class ScannerTest with ResourceProviderMixin { + test_featureSet() { + var scanner = _createScanner(r''' +// @dart = 2.0 +'''); + var defaultFeatureSet = FeatureSet.fromEnableFlags([]); + expect(defaultFeatureSet.isEnabled(Feature.extension_methods), isTrue); + + scanner.configureFeatures(FeatureSet.forTesting()); + scanner.tokenize(); + + var featureSet = scanner.featureSet; + expect(featureSet.isEnabled(Feature.extension_methods), isFalse); + } + + test_featureSet_majorOverflow() { + var scanner = _createScanner(r''' +// @dart = 99999999999999999999999999999999.0 +'''); + scanner.configureFeatures(FeatureSet.forTesting()); + scanner.tokenize(); + // Don't check features, but should not crash. + } + + test_featureSet_minorOverflow() { + var scanner = _createScanner(r''' +// @dart = 2.99999999999999999999999999999999 +'''); + scanner.configureFeatures(FeatureSet.forTesting()); + scanner.tokenize(); + // Don't check features, but should not crash. + } + + Scanner _createScanner(String content) { + var path = convertPath('/test/lib/a.dart'); + var source = StringSource(content, path); + var reader = CharSequenceReader(content); + var errorCollector = RecordingErrorListener(); + return Scanner(source, reader, errorCollector); + } +} + /** * An `ExpectedLocation` encodes information about the expected location of a * given offset in source code.