diff --git a/src/pixie/fileformats/svg.nim b/src/pixie/fileformats/svg.nim index 65dfa38..f8d5d86 100644 --- a/src/pixie/fileformats/svg.nim +++ b/src/pixie/fileformats/svg.nim @@ -60,16 +60,21 @@ proc draw(img: Image, matStack: var seq[Mat3], xml: XmlNode) = proc decodeSvg*(data: string): Image = ## Render SVG file and return the image. - var xml = parseXml(data) - assert xml.tag == "svg" - var viewBox = xml.attr "viewBox" - let box = viewBox.split(" ") - assert parseInt(box[0]) == 0 - assert parseInt(box[1]) == 0 - let w = parseInt(box[2]) - let h = parseInt(box[3]) - result = newImage(w, h) + try: + var xml = parseXml(data) + assert xml.tag == "svg" + var viewBox = xml.attr "viewBox" + let box = viewBox.split(" ") + assert parseInt(box[0]) == 0 + assert parseInt(box[1]) == 0 + let w = parseInt(box[2]) + let h = parseInt(box[3]) + result = newImage(w, h) - var matStack = @[mat3()] - for n in xml: - result.draw(matStack, n) + var matStack = @[mat3()] + for n in xml: + result.draw(matStack, n) + except PixieError as e: + raise e + except: + raise newException(PixieError, "Unable to load SVG") diff --git a/tests/fuzz_svg.nim b/tests/fuzz_svg.nim new file mode 100644 index 0000000..faaf4ab --- /dev/null +++ b/tests/fuzz_svg.nim @@ -0,0 +1,17 @@ +import random, strformat, pixie/fileformats/svg, pixie/common + +randomize() + +let original = readFile("tests/images/svg/Ghostscript_Tiger.svg") + +for i in 0 ..< 10_000: + var data = original + let + pos = rand(data.len) + value = rand(255).char + data[pos] = value + echo &"{i} {pos} {value}" + try: + discard decodeSvg(data) + except PixieError: + discard