diff options
author | Fedor Indutny <fedor@indutny.com> | 2015-11-01 19:34:19 -0500 |
---|---|---|
committer | Fedor Indutny <fedor@indutny.com> | 2015-11-02 08:37:38 -0500 |
commit | 827ee498e332e316421f565c5f763f347f81274c (patch) | |
tree | 28733db3c04c83a3f2cf3b5a5a06dcc750083263 /test/addons/null-buffer-neuter | |
parent | 9e3aa451a1e285998d3a46bdeba84fe3e4a9efce (diff) | |
download | android-node-v8-827ee498e332e316421f565c5f763f347f81274c.tar.gz android-node-v8-827ee498e332e316421f565c5f763f347f81274c.tar.bz2 android-node-v8-827ee498e332e316421f565c5f763f347f81274c.zip |
buffer: neuter external `nullptr` buffers
Neuter external `nullptr` buffers, otherwise their contents will be
materialized on access, and the buffer instance will be internalized.
This leads to a crash like this:
v8::ArrayBuffer::Neuter Only externalized ArrayBuffers can be
neutered
Fix: #3619
PR-URL: https://github.com/nodejs/node/pull/3624
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Trevor Norris <trev.norris@gmail.com>
Diffstat (limited to 'test/addons/null-buffer-neuter')
-rw-r--r-- | test/addons/null-buffer-neuter/binding.cc | 40 | ||||
-rw-r--r-- | test/addons/null-buffer-neuter/binding.gyp | 8 | ||||
-rw-r--r-- | test/addons/null-buffer-neuter/test.js | 7 |
3 files changed, 55 insertions, 0 deletions
diff --git a/test/addons/null-buffer-neuter/binding.cc b/test/addons/null-buffer-neuter/binding.cc new file mode 100644 index 0000000000..da75919011 --- /dev/null +++ b/test/addons/null-buffer-neuter/binding.cc @@ -0,0 +1,40 @@ +#include <node.h> +#include <node_buffer.h> +#include <util.h> +#include <v8.h> + +static int alive; + +static void FreeCallback(char* data, void* hint) { + CHECK_EQ(data, nullptr); + alive--; +} + +void Run(const v8::FunctionCallbackInfo<v8::Value>& args) { + v8::Isolate* isolate = args.GetIsolate(); + alive++; + + { + v8::HandleScope scope(isolate); + v8::Local<v8::Object> buf = node::Buffer::New( + isolate, + nullptr, + 0, + FreeCallback, + nullptr).ToLocalChecked(); + + char* data = node::Buffer::Data(buf); + CHECK_EQ(data, nullptr); + } + + isolate->RequestGarbageCollectionForTesting( + v8::Isolate::kFullGarbageCollection); + + CHECK_EQ(alive, 0); +} + +void init(v8::Local<v8::Object> target) { + NODE_SET_METHOD(target, "run", Run); +} + +NODE_MODULE(binding, init); diff --git a/test/addons/null-buffer-neuter/binding.gyp b/test/addons/null-buffer-neuter/binding.gyp new file mode 100644 index 0000000000..3bfb84493f --- /dev/null +++ b/test/addons/null-buffer-neuter/binding.gyp @@ -0,0 +1,8 @@ +{ + 'targets': [ + { + 'target_name': 'binding', + 'sources': [ 'binding.cc' ] + } + ] +} diff --git a/test/addons/null-buffer-neuter/test.js b/test/addons/null-buffer-neuter/test.js new file mode 100644 index 0000000000..bca76e27af --- /dev/null +++ b/test/addons/null-buffer-neuter/test.js @@ -0,0 +1,7 @@ +'use strict'; +// Flags: --expose-gc + +require('../../common'); +var binding = require('./build/Release/binding'); + +binding.run(); |