From e56d8cb8eb21fcdddd8e5f847ed6354246b9e76f Mon Sep 17 00:00:00 2001 From: Paul Spencer Date: Tue, 29 Jan 2019 07:30:55 -0500 Subject: [PATCH] Add toString on error object to prevent a segfault --- package-lock.json | 202 +++++++++++++++++++++++++++++++++++++++++++++ src/ms_error.cpp | 7 ++ src/ms_error.hpp | 4 +- tests/data/bad.map | 21 +++++ tests/tests.js | 23 ++++++ 5 files changed, 256 insertions(+), 1 deletion(-) create mode 100644 package-lock.json create mode 100755 tests/data/bad.map diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..984c763 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,202 @@ +{ + "name": "node-mapserver", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=", + "dev": true + }, + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha1-30boZ9D8Kuxmo0ZitAapzK//Ww8=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha1-bYrlCPWRZ/lA8rWzxKYSrlDJCuY=", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nan": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", + "integrity": "sha1-kOIrzLjKV+pM03zIPTgZtS7qZ2Y=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha1-HGszdALCE3YF7+GfEP7DkPb6q1Q=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } +} diff --git a/src/ms_error.cpp b/src/ms_error.cpp index c15d5ac..441481e 100644 --- a/src/ms_error.cpp +++ b/src/ms_error.cpp @@ -6,6 +6,8 @@ void MSError::Initialize(v8::Local target) { v8::Local tpl = Nan::New (MSError::New); tpl->InstanceTemplate()->SetInternalFieldCount(1); tpl->SetClassName(Nan::New("MSError").ToLocalChecked()); + Nan::SetPrototypeMethod(tpl, "toString", ToString); + Nan::SetPrototypeMethod(tpl, "toDetailString", ToString); Nan::SetNamedPropertyHandler( tpl->InstanceTemplate() @@ -52,6 +54,11 @@ v8::Local MSError::NewInstance(errorObj *err_ptr) { return scope.Escape(Nan::New(constructor)->GetFunction()->NewInstance(1, &ext)); } +NAN_METHOD(MSError::ToString) { + MSError *err = Nan::ObjectWrap::Unwrap(info.Holder()); + info.GetReturnValue().Set(Nan::New(err->this_->message).ToLocalChecked()); +} + NAN_PROPERTY_GETTER(MSError::NamedPropertyGetter) { MSError *err = Nan::ObjectWrap::Unwrap(info.Holder()); diff --git a/src/ms_error.hpp b/src/ms_error.hpp index 39384e9..b02d491 100644 --- a/src/ms_error.hpp +++ b/src/ms_error.hpp @@ -13,9 +13,12 @@ class MSError: public Nan::ObjectWrap { static NAN_METHOD(New); static v8::Local NewInstance(errorObj* err_ptr); + static NAN_METHOD(ToString); + MSError(); MSError(errorObj *err); inline errorObj *get() { return this_; } + errorObj *this_; protected: static NAN_PROPERTY_GETTER(NamedPropertyGetter); @@ -24,7 +27,6 @@ class MSError: public Nan::ObjectWrap { private: ~MSError(); - errorObj *this_; }; #endif diff --git a/tests/data/bad.map b/tests/data/bad.map new file mode 100755 index 0000000..0315364 --- /dev/null +++ b/tests/data/bad.map @@ -0,0 +1,21 @@ +MAP +NAME GMAP_DEMO +STATUS ON +SIZE 600 300 +EXTENT -180 -90 180 90 +UNITS DD +SHAPEPATH "./foo/bar" +IMAGECOLOR 255 255 255 +PROJECTION + "init=epsg:4326" +END +LAYER + PROJECTION + "init=epsg:4326" + END + NAME prov_bound + TYPE POLYGON + STATUS ON + DATA "foo/wgs_province" +END +END diff --git a/tests/tests.js b/tests/tests.js index adbfb73..ea139bf 100644 --- a/tests/tests.js +++ b/tests/tests.js @@ -28,6 +28,7 @@ var fs = require('fs'); var path = require('path'); var datadir = path.join(__dirname, 'data'); var mapfile = path.join(datadir, 'test.map'); +var badmapfile = path.join(datadir, 'bad.map'); var symbolfile = path.join(datadir, 'symbolset.txt'); var nomapfile = 'missing.map'; var map; @@ -533,6 +534,8 @@ describe('mapserver', function() { var defaultLayerText = 'LAYER\n NAME "foo"\n STATUS OFF\n TILEITEM "location"\n UNITS METERS\nEND # LAYER\n\n'; +console.log(layer) + assert.equal(layer.toString(), defaultLayerText, 'unexpected default layer text ' + layer.toString()); }); @@ -571,6 +574,26 @@ describe('mapserver', function() { }); }); + it('should not segfault', function(done) { + var v = mapserver.getVersionInt(); + assert.doesNotThrow(function() { + map = new mapserver.Map(badmapfile); + }, Error, 'loading a invalid map file should throw an error.'); + + map.drawMap(function(drawError, buffer) { + if (drawError) { + console.log('error', drawError) + assert.ok(true, 'Returned error from bad map') + done(); + } else { + fs.writeFileSync(path.join(__dirname, 'data', 'bad_out_'+v+'.png'), buffer); + + assert.ok(false, 'Did not receive error drawing map.'); + } + }); + }); + + it('should get the label cache', function(done) { assert.doesNotThrow(function() { map = new mapserver.Map(mapfile);