Merge pull request #198 from bkw/unknownInterpolator

Runtime guard against unknown interpolator class, avoids segfault.
This commit is contained in:
Lovell Fuller 2015-04-20 10:17:44 +01:00
commit 54f2243386
3 changed files with 21 additions and 0 deletions

View File

@ -134,6 +134,9 @@ namespace sharp {
*/ */
int InterpolatorWindowSize(char const *name) { int InterpolatorWindowSize(char const *name) {
VipsInterpolate *interpolator = vips_interpolate_new(name); VipsInterpolate *interpolator = vips_interpolate_new(name);
if (interpolator == NULL) {
return -1;
}
int window_size = vips_interpolate_get_window_size(interpolator); int window_size = vips_interpolate_get_window_size(interpolator);
g_object_unref(interpolator); g_object_unref(interpolator);
return window_size; return window_size;

View File

@ -261,6 +261,9 @@ class ResizeWorker : public NanAsyncWorker {
// Get window size of interpolator, used for determining shrink vs affine // Get window size of interpolator, used for determining shrink vs affine
int interpolatorWindowSize = InterpolatorWindowSize(baton->interpolator.c_str()); int interpolatorWindowSize = InterpolatorWindowSize(baton->interpolator.c_str());
if (InterpolatorWindowSize < 0) {
return Error();
}
// Scaling calculations // Scaling calculations
double xfactor = 1.0; double xfactor = 1.0;
@ -510,6 +513,9 @@ class ResizeWorker : public NanAsyncWorker {
} }
// Create interpolator - "bilinear" (default), "bicubic" or "nohalo" // Create interpolator - "bilinear" (default), "bicubic" or "nohalo"
VipsInterpolate *interpolator = vips_interpolate_new(baton->interpolator.c_str()); VipsInterpolate *interpolator = vips_interpolate_new(baton->interpolator.c_str());
if (interpolator == NULL) {
return Error();
}
vips_object_local(hook, interpolator); vips_object_local(hook, interpolator);
// Perform affine transformation // Perform affine transformation
VipsImage *affined; VipsImage *affined;

View File

@ -93,4 +93,16 @@ describe('Interpolation', function() {
}); });
}); });
it('unknown interpolator throws', function(done) {
sharp(fixtures.inputJpg)
.resize(320, 240)
.interpolateWith('nonexistant')
.toBuffer()
.catch(function (e) {
assert(
e.toString().match(/VipsInterpolate: class "nonexistant" not found/)
);
})
.finally(done);
});
}); });