From 2c08ba2760c40e459b17124ba647fb2670b838c0 Mon Sep 17 00:00:00 2001 From: Ryan Oldenburg Date: Fri, 4 Dec 2020 12:03:33 -0600 Subject: [PATCH 1/3] svg --- src/pixie/fileformats/svg.nim | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/pixie/fileformats/svg.nim b/src/pixie/fileformats/svg.nim index 8c0aac0..65dfa38 100644 --- a/src/pixie/fileformats/svg.nim +++ b/src/pixie/fileformats/svg.nim @@ -5,16 +5,14 @@ import chroma, pixie/images, pixie/common, pixie/paths, vmath, xmlparser, xmltre const svgSignature* = " Date: Fri, 4 Dec 2020 12:13:01 -0600 Subject: [PATCH 2/3] fuzz svg + exceptions --- src/pixie/fileformats/svg.nim | 29 +++++++++++++++++------------ tests/fuzz_svg.nim | 17 +++++++++++++++++ 2 files changed, 34 insertions(+), 12 deletions(-) create mode 100644 tests/fuzz_svg.nim 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 From cb0abe6e76a9437d2ac4c94393acb1fe20982594 Mon Sep 17 00:00:00 2001 From: Ryan Oldenburg Date: Fri, 4 Dec 2020 12:28:14 -0600 Subject: [PATCH 3/3] keep --- tests/benchmark_svg.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/benchmark_svg.nim b/tests/benchmark_svg.nim index 24109b5..cf6cf74 100644 --- a/tests/benchmark_svg.nim +++ b/tests/benchmark_svg.nim @@ -3,4 +3,4 @@ import pixie/fileformats/svg, benchy let data = readFile("tests/images/svg/Ghostscript_Tiger.svg") timeIt "svg decode": - discard decodeSvg(data) + keep decodeSvg(data)