Skip to content

Commit

Permalink
Improve error message for SVG render above limit #3167
Browse files Browse the repository at this point in the history
  • Loading branch information
lovell committed Apr 4, 2022
1 parent 926572b commit 5d36f5f
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 1 deletion.
3 changes: 3 additions & 0 deletions docs/changelog.md
Expand Up @@ -8,6 +8,9 @@ Requires libvips v8.12.2

* Increase control over sensitivity to invalid images via `failOn`, deprecate `failOnError` (equivalent to `failOn: 'warning'`).

* Improve error message when attempting to render SVG input greater than 32767x32767.
[#3167](https://github.com/lovell/sharp/issues/3167)

* Ensure `create` input image has correct bit depth and colour space.
[#3139](https://github.com/lovell/sharp/issues/3139)

Expand Down
8 changes: 7 additions & 1 deletion src/pipeline.cc
Expand Up @@ -241,8 +241,10 @@ class PipelineWorker : public Napi::AsyncWorker {
// Reload SVG file
image = VImage::svgload(const_cast<char*>(baton->input->file.data()), option);
}

sharp::SetDensity(image, baton->input->density);
if (image.width() > 32767 || image.height() > 32767) {
throw vips::VError("Input SVG image will exceed 32767x32767 pixel limit when scaled");
}
} else if (inputImageType == sharp::ImageType::PDF) {
option->set("n", baton->input->pages);
option->set("page", baton->input->page);
Expand All @@ -260,6 +262,10 @@ class PipelineWorker : public Napi::AsyncWorker {

sharp::SetDensity(image, baton->input->density);
}
} else {
if (inputImageType == sharp::ImageType::SVG && (image.width() > 32767 || image.height() > 32767)) {
throw vips::VError("Input SVG image exceeds 32767x32767 pixel limit");
}
}

// Any pre-shrinking may already have been done
Expand Down
14 changes: 14 additions & 0 deletions test/unit/svg.js
Expand Up @@ -136,6 +136,20 @@ describe('SVG input', function () {
assert.strictEqual(info.channels, 4);
});

it('Fails to render SVG larger than 32767x32767', () =>
assert.rejects(
() => sharp(Buffer.from('<svg width="32768" height="1" />')).toBuffer(),
/Input SVG image exceeds 32767x32767 pixel limit/
)
);

it('Fails to render scaled SVG larger than 32767x32767', () =>
assert.rejects(
() => sharp(Buffer.from('<svg width="32767" height="1" />')).resize(32768).toBuffer(),
/Input SVG image will exceed 32767x32767 pixel limit when scaled/
)
);

it('Detects SVG passed as a string', () =>
assert.rejects(
() => sharp('<svg></svg>').toBuffer(),
Expand Down

0 comments on commit 5d36f5f

Please sign in to comment.