diff --git a/CHANGELOG.md b/CHANGELOG.md index be1fcab5a..35734c4dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,11 +8,13 @@ project adheres to [Semantic Versioning](http://semver.org/). (Unreleased) ================== ### Changed +* Allow larger buffers to be returned from `toBuffer('raw')`. ### Added ### 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). +* Fix crash when using `toBuffer('raw')` with large canvases (#1158). 2.5.0 ================== diff --git a/src/Canvas.cc b/src/Canvas.cc index 72bcdbdb6..06485e57b 100644 --- a/src/Canvas.cc +++ b/src/Canvas.cc @@ -20,6 +20,7 @@ #include #include "Util.h" #include +#include "node_buffer.h" #ifdef HAVE_JPEG #include "JPEGStream.h" @@ -413,8 +414,13 @@ NAN_METHOD(Canvas::ToBuffer) { if (info[0]->StrictEquals(Nan::New("raw").ToLocalChecked())) { cairo_surface_t *surface = canvas->surface(); cairo_surface_flush(surface); + if (canvas->nBytes() > node::Buffer::kMaxLength) { + Nan::ThrowError("Data exceeds maximum buffer length."); + return; + } const unsigned char *data = cairo_image_surface_get_data(surface); - Local buf = Nan::CopyBuffer(reinterpret_cast(data), canvas->nBytes()).ToLocalChecked(); + Isolate* iso = Nan::GetCurrentContext()->GetIsolate(); + Local buf = node::Buffer::Copy(iso, reinterpret_cast(data), canvas->nBytes()).ToLocalChecked(); info.GetReturnValue().Set(buf); return; }