From f8eb0365767bda7ed8f211ccd9406818306e1d07 Mon Sep 17 00:00:00 2001 From: Jonathan Neuhauser Date: Wed, 23 Feb 2022 21:16:02 +0100 Subject: [PATCH] dxf14: better error message on too deeply nested SVG --- dxf_outlines.py | 20 ++++++++++++++------ tests/test_dxf_outlines.py | 25 +++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/dxf_outlines.py b/dxf_outlines.py index de05289a..b56b61e7 100755 --- a/dxf_outlines.py +++ b/dxf_outlines.py @@ -341,12 +341,20 @@ class DxfOutlines(inkex.OutputExtension): if trans: self.groupmat.append(Transform(self.groupmat[-1]) @ Transform(trans)) for node in group: - if isinstance(node, Group): - self.process_group(node) - elif isinstance(node, Use): - self.process_clone(node) - else: - self.process_shape(node, self.groupmat[-1]) + try: + if isinstance(node, Group): + self.process_group(node) + inkex.errormsg(node.get_id()) + elif isinstance(node, Use): + self.process_clone(node) + else: + self.process_shape(node, self.groupmat[-1]) + except RecursionError as e: + raise inkex.AbortExtension( + _( + 'Too many nested groups. Please use the "Deep Ungroup" extension first.' + ) + ) from e # pylint: disable=line-too-long if trans: self.groupmat.pop() diff --git a/tests/test_dxf_outlines.py b/tests/test_dxf_outlines.py index 250e9b83..a65fac9c 100644 --- a/tests/test_dxf_outlines.py +++ b/tests/test_dxf_outlines.py @@ -2,6 +2,9 @@ from dxf_outlines import DxfOutlines from inkex.tester import ComparisonMixin, InkscapeExtensionTestMixin, TestCase from inkex.tester.filters import WindowsTextCompat +from inkex.elements._parser import load_svg + +from inkex.utils import AbortExtension class DFXOutlineBasicTest(ComparisonMixin, InkscapeExtensionTestMixin, TestCase): @@ -13,3 +16,25 @@ class DFXOutlineBasicTest(ComparisonMixin, InkscapeExtensionTestMixin, TestCase) ("--ROBO=true",), ] compare_filters = [WindowsTextCompat()] + + +class DXFDeeplyNestedTest(TestCase): + """Check that a deeply nested SVG raises an AbortExtension""" + + @staticmethod + def create_deep_svg(amount): + """Create a very deep svg and test getting ancestors""" + svg = '' + for i in range(amount): + svg += f'' + svg = load_svg(svg + ("" * amount) + "") + return svg + + def test_deeply_nested(self): + "Run test" + ext = DxfOutlines() + ext.parse_arguments([]) + ext.document = self.create_deep_svg(1500) + ext.svg = ext.document.getroot() + with self.assertRaisesRegex(AbortExtension, "Deep Ungroup"): + ext.effect() -- GitLab