From 12fd63d6bb38d4fbd41dc4dd8d1b106ee64d1f7c Mon Sep 17 00:00:00 2001 From: Rajaram Gaunker Date: Thu, 8 Jun 2017 01:17:02 -0700 Subject: [PATCH] v8: add a js class for Serializer/Dserializer Calling Serializer/Deserializer without new crashes node. Adding a js class which just inherits cpp bindings. Added regression tests. Fixes: https://github.com/nodejs/node/issues/13326 PR-URL: https://github.com/nodejs/node/pull/13541 Reviewed-By: Refael Ackermann Reviewed-By: Anna Henningsen Reviewed-By: Colin Ihrig --- lib/v8.js | 12 +++++++++++- test/parallel/test-v8-serdes.js | 12 ++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/v8.js b/lib/v8.js index e5b31564ad63c7..ba95c98dadc1ee 100644 --- a/lib/v8.js +++ b/lib/v8.js @@ -15,11 +15,21 @@ 'use strict'; const { Buffer } = require('buffer'); -const { Serializer, Deserializer } = process.binding('serdes'); +const { + Serializer: _Serializer, + Deserializer: _Deserializer +} = process.binding('serdes'); const { copy } = process.binding('buffer'); const { objectToString } = require('internal/util'); const { FastBuffer } = require('internal/buffer'); +// Calling exposed c++ functions directly throws exception as it expected to be +// called with new operator and caused an assert to fire. +// Creating JS wrapper so that it gets caught at JS layer. +class Serializer extends _Serializer { } + +class Deserializer extends _Deserializer { } + const { cachedDataVersionTag, setFlagsFromString, diff --git a/test/parallel/test-v8-serdes.js b/test/parallel/test-v8-serdes.js index d3a879fc225353..806cbc5fc3414d 100644 --- a/test/parallel/test-v8-serdes.js +++ b/test/parallel/test-v8-serdes.js @@ -131,3 +131,15 @@ const objects = [ assert.deepStrictEqual(v8.deserialize(buf), expectedResult); } + +{ + assert.throws( + () => { v8.Serializer(); }, + /^TypeError: Class constructor Serializer cannot be invoked without 'new'$/ + ); + + assert.throws( + () => { v8.Deserializer(); }, + /^TypeError: Class constructor Deserializer cannot be invoked without 'new'$/ + ); +}