From 4ba6be6c2a4b64c321c28f9620b6188f919078c1 Mon Sep 17 00:00:00 2001 From: Zach Bjornson Date: Sat, 11 May 2019 13:46:04 -0700 Subject: [PATCH] Fix crash when resurfacing SVG canvases Fixes #1380 --- CHANGELOG.md | 1 + src/backend/SvgBackend.cc | 10 ++++++++-- test/canvas.test.js | 5 +++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d3c67348..be1fcab5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ project adheres to [Semantic Versioning](http://semver.org/). ### Fixed * Fix crash when changing canvas width/height while `fillStyle` or `strokeStyle` was set to a `CanvasPattern` or `CanvasGradient` (#1357). +* Fix crash when changing width/height of SVG canvases (#1380). 2.5.0 ================== diff --git a/src/backend/SvgBackend.cc b/src/backend/SvgBackend.cc index d9cd9cf8e..168f29956 100644 --- a/src/backend/SvgBackend.cc +++ b/src/backend/SvgBackend.cc @@ -3,6 +3,7 @@ #include #include "../Canvas.h" #include "../closure.h" +#include using namespace v8; @@ -13,7 +14,10 @@ SvgBackend::SvgBackend(int width, int height) SvgBackend::~SvgBackend() { cairo_surface_finish(surface); - if (_closure) delete _closure; + if (_closure) { + delete _closure; + _closure = nullptr; + } destroySurface(); } @@ -22,7 +26,8 @@ Backend *SvgBackend::construct(int width, int height){ } cairo_surface_t* SvgBackend::createSurface() { - if (!_closure) _closure = new PdfSvgClosure(canvas); + assert(!_closure); + _closure = new PdfSvgClosure(canvas); surface = cairo_svg_surface_create_for_stream(PdfSvgClosure::writeVec, _closure, width, height); return surface; } @@ -30,6 +35,7 @@ cairo_surface_t* SvgBackend::createSurface() { cairo_surface_t* SvgBackend::recreateSurface() { cairo_surface_finish(surface); delete _closure; + _closure = nullptr; cairo_surface_destroy(surface); return createSurface(); diff --git a/test/canvas.test.js b/test/canvas.test.js index acdf30caf..289af26f7 100644 --- a/test/canvas.test.js +++ b/test/canvas.test.js @@ -392,6 +392,11 @@ describe('Canvas', function () { }) }); + it('SVG Canvas#width changes don\'t crash (#1380)', function () { + const myCanvas = createCanvas(100, 100, 'svg') + myCanvas.width = 120; + }); + it('Canvas#stride', function() { var canvas = createCanvas(24, 10); assert.ok(canvas.stride >= 24, 'canvas.stride is too short');