smalloc: don't allow to dispose typed arrays
authorVladimir Kurchatkin <vladimir.kurchatkin@gmail.com>
Tue, 18 Nov 2014 09:30:27 +0000 (12:30 +0300)
committerBert Belder <bertbelder@gmail.com>
Tue, 9 Dec 2014 16:57:09 +0000 (17:57 +0100)
PR-URL: https://github.com/joyent/node/pull/8743
Reviewed-by: Trevor Norris <trev.norris@gmail.com>
lib/smalloc.js
src/smalloc.cc
test/simple/test-smalloc.js

index b8b02e0ab7b7d9763f73fe65cc75e1014c1d95cb..994b3f281bae2282593abb3ee45daac2479ca1b4 100644 (file)
@@ -88,6 +88,8 @@ function dispose(obj) {
     throw new TypeError('obj must be an Object');
   if (util.isBuffer(obj))
     throw new TypeError('obj cannot be a Buffer');
+  if (smalloc.isTypedArray(obj))
+    throw new TypeError('obj cannot be a typed array');
   if (!smalloc.hasExternalData(obj))
     throw new Error('obj has no external array data');
 
index c3d27f9d8292d72c756fe6f80a2d6dced2e1c039..112ab1b93e009e7942bd0fa5d785231df88ae49a 100644 (file)
@@ -440,6 +440,9 @@ bool HasExternalData(Environment* env, Local<Object> obj) {
   return obj->HasIndexedPropertiesInExternalArrayData();
 }
 
+void IsTypedArray(const FunctionCallbackInfo<Value>& args) {
+  args.GetReturnValue().Set(args[0]->IsTypedArray());
+}
 
 void AllocTruncate(const FunctionCallbackInfo<Value>& args) {
   Environment* env = Environment::GetCurrent(args);
@@ -540,6 +543,7 @@ void Initialize(Handle<Object> exports,
   env->SetMethod(exports, "truncate", AllocTruncate);
 
   env->SetMethod(exports, "hasExternalData", HasExternalData);
+  env->SetMethod(exports, "isTypedArray", IsTypedArray);
 
   exports->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "kMaxLength"),
                Uint32::NewFromUnsigned(env->isolate(), kMaxLength));
index 091f5aa7e08e6d7c6f87d8bddb08199a1d6a6df6..198b5c7f5cc038783ec768f79721dbf3a9fbe5e3 100644 (file)
@@ -323,6 +323,10 @@ assert.throws(function() {
   smalloc.dispose(new Buffer());
 });
 
+assert.throws(function() {
+  smalloc.dispose(new Uint8Array(new ArrayBuffer(1)));
+});
+
 assert.throws(function() {
   smalloc.dispose({});
 });