From 6106edeefe56fad73b1b8095ef4ef9e5076ab5a1 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 11 Oct 2023 20:15:16 -0700 Subject: [PATCH] =?UTF-8?q?Avoid=20stack=20overflow=20when=20self-referent?= =?UTF-8?q?ial=20elemetns=20present,=20only=20use=E2=80=A6=20(#218)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Avoid stack overflow when self-referential elemetns present, only use first ID * bumps --- packages/vector_graphics/CHANGELOG.md | 7 ++++++ packages/vector_graphics/pubspec.yaml | 6 ++--- packages/vector_graphics_codec/CHANGELOG.md | 7 ++++++ packages/vector_graphics_codec/pubspec.yaml | 2 +- .../vector_graphics_compiler/CHANGELOG.md | 7 ++++++ .../lib/src/svg/parser.dart | 16 ++++++++---- .../vector_graphics_compiler/pubspec.yaml | 6 ++--- .../test/parser_test.dart | 25 +++++++++++++++++++ 8 files changed, 64 insertions(+), 12 deletions(-) diff --git a/packages/vector_graphics/CHANGELOG.md b/packages/vector_graphics/CHANGELOG.md index b7018303..d0233d9b 100644 --- a/packages/vector_graphics/CHANGELOG.md +++ b/packages/vector_graphics/CHANGELOG.md @@ -1,5 +1,12 @@ # CHANGELOG +## 1.1.9 + +- Fix handling of invalid XML `@id` attributes. +- Fix handling of self-referential `` elements. +- Add `--out-dir` option to compiler. +- Tweak warning message for unhandled eleemnts. + ## 1.1.8 - Fix bugs in transform parsing. diff --git a/packages/vector_graphics/pubspec.yaml b/packages/vector_graphics/pubspec.yaml index a95d8962..243979f6 100644 --- a/packages/vector_graphics/pubspec.yaml +++ b/packages/vector_graphics/pubspec.yaml @@ -1,6 +1,6 @@ name: vector_graphics description: A vector graphics rendering package for Flutter. -version: 1.1.8 +version: 1.1.9 homepage: https://github.com/dnfield/vector_graphics environment: @@ -10,13 +10,13 @@ environment: dependencies: flutter: sdk: flutter - vector_graphics_codec: 1.1.8 + vector_graphics_codec: 1.1.9 dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^1.0.0 - vector_graphics_compiler: 1.1.8 + vector_graphics_compiler: 1.1.9 # Comment out before publishing dependency_overrides: diff --git a/packages/vector_graphics_codec/CHANGELOG.md b/packages/vector_graphics_codec/CHANGELOG.md index 198a4392..e72b21f8 100644 --- a/packages/vector_graphics_codec/CHANGELOG.md +++ b/packages/vector_graphics_codec/CHANGELOG.md @@ -1,5 +1,12 @@ # CHANGELOG +## 1.1.9 + +- Fix handling of invalid XML `@id` attributes. +- Fix handling of self-referential `` elements. +- Add `--out-dir` option to compiler. +- Tweak warning message for unhandled eleemnts. + ## 1.1.8 - Fix bugs in transform parsing. diff --git a/packages/vector_graphics_codec/pubspec.yaml b/packages/vector_graphics_codec/pubspec.yaml index 871eccc1..fcb1319b 100644 --- a/packages/vector_graphics_codec/pubspec.yaml +++ b/packages/vector_graphics_codec/pubspec.yaml @@ -1,6 +1,6 @@ name: vector_graphics_codec description: An encoding library for `package:vector_graphics` -version: 1.1.8 +version: 1.1.9 homepage: https://github.com/dnfield/vector_graphics environment: diff --git a/packages/vector_graphics_compiler/CHANGELOG.md b/packages/vector_graphics_compiler/CHANGELOG.md index 7f5fe4f4..f4eded61 100644 --- a/packages/vector_graphics_compiler/CHANGELOG.md +++ b/packages/vector_graphics_compiler/CHANGELOG.md @@ -1,5 +1,12 @@ # CHANGELOG +## 1.1.9 + +- Fix handling of invalid XML `@id` attributes. +- Fix handling of self-referential `` elements. +- Add `--out-dir` option to compiler. +- Tweak warning message for unhandled eleemnts. + ## 1.1.8 - Fix bugs in transform parsing. diff --git a/packages/vector_graphics_compiler/lib/src/svg/parser.dart b/packages/vector_graphics_compiler/lib/src/svg/parser.dart index e829c681..766d211c 100644 --- a/packages/vector_graphics_compiler/lib/src/svg/parser.dart +++ b/packages/vector_graphics_compiler/lib/src/svg/parser.dart @@ -226,7 +226,9 @@ class _Elements { maskResolver: parserState._definitions.getDrawable, patternResolver: parserState._definitions.getDrawable, ); - parserState.checkForIri(group); + if ('#${parserState._currentAttributes.id}' != xlinkHref) { + parserState.checkForIri(group); + } parent!.addChild( group, clipId: parserState._currentAttributes.clipPathId, @@ -864,10 +866,11 @@ class SvgParser { } /// Whether this [DrawableStyleable] belongs in the [DrawableDefinitions] or not. - bool checkForIri(AttributedNode? drawable) { + bool checkForIri(AttributedNode drawable) { + assert('#${_currentAttributes.id}' != _currentAttributes.href); final String iri = buildUrlIri(); if (iri != emptyUrlIri) { - _definitions.addDrawable(iri, drawable!); + _definitions.addDrawable(iri, drawable); return true; } return false; @@ -1797,6 +1800,9 @@ class _Resolver { String? href, ) { assert(!_sealed); + if (_shaders.containsKey(gradient.id)) { + return; + } _shaders[gradient.id] = gradient; if (href != null) { href = 'url($href)'; @@ -1820,13 +1826,13 @@ class _Resolver { /// Add the clip defined by [pathNodes] to the resolver identifier by [ref]. void addClipPath(String ref, List pathNodes) { assert(!_sealed); - _clips[ref] = pathNodes; + _clips.putIfAbsent(ref, () => pathNodes); } /// Add the [drawable] to the resolver identifier by [ref]. void addDrawable(String ref, AttributedNode drawable) { assert(!_sealed); - _drawables[ref] = drawable; + _drawables.putIfAbsent(ref, () => drawable); } } diff --git a/packages/vector_graphics_compiler/pubspec.yaml b/packages/vector_graphics_compiler/pubspec.yaml index 687adac0..efe891fe 100644 --- a/packages/vector_graphics_compiler/pubspec.yaml +++ b/packages/vector_graphics_compiler/pubspec.yaml @@ -1,6 +1,6 @@ name: vector_graphics_compiler description: A compiler for `package:vector_graphics`. -version: 1.1.8 +version: 1.1.9 homepage: https://github.com/dnfield/vector_graphics executables: @@ -14,7 +14,7 @@ dependencies: meta: ^1.7.0 path_parsing: ^1.0.1 xml: ^6.3.0 - vector_graphics_codec: 1.1.8 + vector_graphics_codec: 1.1.9 path: ^1.8.0 dev_dependencies: @@ -25,7 +25,7 @@ dev_dependencies: sdk: flutter flutter_test: sdk: flutter - vector_graphics: 1.1.8 + vector_graphics: 1.1.9 # Comment out before publishing dependency_overrides: diff --git a/packages/vector_graphics_compiler/test/parser_test.dart b/packages/vector_graphics_compiler/test/parser_test.dart index d9dd3561..e32f4a23 100644 --- a/packages/vector_graphics_compiler/test/parser_test.dart +++ b/packages/vector_graphics_compiler/test/parser_test.dart @@ -4,6 +4,31 @@ import 'package:vector_graphics_compiler/vector_graphics_compiler.dart'; import 'test_svg_strings.dart'; void main() { + test('Reuse ID self-referentially', () { + final VectorInstructions instructions = parseWithoutOptimizers(''' + + + + + + + +'''); + + expect(instructions.paths.length, 1); + }); + + test('Self-referentially ID', () { + final VectorInstructions instructions = parseWithoutOptimizers(''' + + + + +'''); + + expect(instructions.paths.length, 0); + }); + test('Text transform but no xy', () { final VectorInstructions instructions = parseWithoutOptimizers('''