From 0af2a84cbbb69c8a3ea33a389b9e893e6de8ef4d Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Wed, 2 Oct 2019 12:45:51 -0700 Subject: [PATCH] Handle empty entry in asset list and add more explicit validation (#41735) --- .../lib/src/flutter_manifest.dart | 23 ++++++++++++++----- .../general.shard/flutter_manifest_test.dart | 20 ++++++++++++++++ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/packages/flutter_tools/lib/src/flutter_manifest.dart b/packages/flutter_tools/lib/src/flutter_manifest.dart index 247a21d6b07..5334b5b1d6f 100644 --- a/packages/flutter_tools/lib/src/flutter_manifest.dart +++ b/packages/flutter_tools/lib/src/flutter_manifest.dart @@ -186,16 +186,27 @@ class FlutterManifest { : fontList.map>(castStringKeyedMap).toList(); } - List get assets { + List get assets => _assets ??= _computeAssets(); + List _assets; + List _computeAssets() { final List assets = _flutterDescriptor['assets']; if (assets == null) { return const []; } - return assets - .cast() - .map(Uri.encodeFull) - ?.map(Uri.parse) - ?.toList(); + final List results = []; + for (Object asset in assets) { + if (asset is! String || asset == null || asset == '') { + printError('Asset manifest contains a null or empty uri.'); + continue; + } + final String stringAsset = asset; + try { + results.add(Uri.parse(Uri.encodeFull(stringAsset))); + } on FormatException { + printError('Asset manifest contains invalid uri: $asset.'); + } + } + return results; } List _fonts; diff --git a/packages/flutter_tools/test/general.shard/flutter_manifest_test.dart b/packages/flutter_tools/test/general.shard/flutter_manifest_test.dart index ef3c910d978..84324879c0e 100644 --- a/packages/flutter_tools/test/general.shard/flutter_manifest_test.dart +++ b/packages/flutter_tools/test/general.shard/flutter_manifest_test.dart @@ -572,6 +572,26 @@ flutter: expect(flutterManifest, null); expect(logger.errorText, contains('Expected a map.')); }); + + testUsingContext('Does not crash on empty entry', () async { + final BufferLogger logger = context.get(); + const String manifest = ''' +name: test +dependencies: + flutter: + sdk: flutter +flutter: + uses-material-design: true + assets: + - lib/gallery/example_code.dart + - +'''; + final FlutterManifest flutterManifest = FlutterManifest.createFromString(manifest); + final List assets = flutterManifest.assets; + + expect(logger.errorText, contains('Asset manifest contains a null or empty uri.')); + expect(assets.length, 1); + }); }); group('FlutterManifest with MemoryFileSystem', () {