mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-11-15 07:42:42 +00:00
usvg copies the element a <use> shows, and every copy gets its own copy of the declarations its style attribute and matching style sheet rules give it. A chain of <use>s that doubles at each level made usvg build those copies before the import's object limit was checked: a 101 kB file whose rectangle has a 100 kB style took 4.7 GB at 14 levels, and one 100 kB style sheet rule on 16,000 groups took 1.5 GB without any <use>. A plain chain stopped at usvg's own 1,000,000-node limit with a parse error. The import now measures, before usvg reads the SVG, how many elements it expands to and how many bytes of style values those elements copy, each element measured once and each <use> counted as one addition. References follow usvg's rules: first element of an id, href before xlink:href, and the self and back references usvg leaves out. An SVG past 999,999 elements (500,000 on the web) is refused as too large, a loop of <use> references usvg would copy without end is refused too, and one past 64 MB of copied style values is refused with the new SvgError::StylesTooLarge. SVG images count toward the same 64 MB as the SVG showing them, an image past either limit refuses the whole import, and an image that doesn't decode does not count.