aboutsummaryrefslogtreecommitdiff
path: root/test/addons/null-buffer-neuter
diff options
context:
space:
mode:
authorFedor Indutny <fedor@indutny.com>2015-11-01 19:34:19 -0500
committerFedor Indutny <fedor@indutny.com>2015-11-02 08:37:38 -0500
commit827ee498e332e316421f565c5f763f347f81274c (patch)
tree28733db3c04c83a3f2cf3b5a5a06dcc750083263 /test/addons/null-buffer-neuter
parent9e3aa451a1e285998d3a46bdeba84fe3e4a9efce (diff)
downloadandroid-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.cc40
-rw-r--r--test/addons/null-buffer-neuter/binding.gyp8
-rw-r--r--test/addons/null-buffer-neuter/test.js7
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();