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)
committerTrevor Norris <trev.norris@gmail.com>
Wed, 26 Nov 2014 20:39:02 +0000 (12:39 -0800)
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 fd82ba8..2b4175e 100644 (file)
@@ -86,6 +86,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 c7913d9..7dc3510 100644 (file)
@@ -446,6 +446,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.GetIsolate());
@@ -547,6 +550,7 @@ void Initialize(Handle<Object> exports,
   NODE_SET_METHOD(exports, "truncate", AllocTruncate);
 
   NODE_SET_METHOD(exports, "hasExternalData", HasExternalData);
+  NODE_SET_METHOD(exports, "isTypedArray", IsTypedArray);
 
   exports->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "kMaxLength"),
                Uint32::NewFromUnsigned(env->isolate(), kMaxLength));
index 091f5aa..198b5c7 100644 (file)
@@ -324,5 +324,9 @@ assert.throws(function() {
 });
 
 assert.throws(function() {
+  smalloc.dispose(new Uint8Array(new ArrayBuffer(1)));
+});
+
+assert.throws(function() {
   smalloc.dispose({});
 });