smalloc: prevent double free on dispose()
authorTrevor Norris <trev.norris@gmail.com>
Fri, 23 May 2014 10:42:46 +0000 (03:42 -0700)
committerTrevor Norris <trev.norris@gmail.com>
Fri, 23 May 2014 10:42:46 +0000 (03:42 -0700)
dispose() free's the memory when executed and sets the external array
data to NULL and length to zero.

To prevent the same memory from being free'd twice when the object is
garbage collected we first check if the object's external array data
length == 0. Since alloc() passes NULL to
SetIndexedPropertiesToExternalArrayData() if length == 0 there's no
opportunity for memory leak.

src/smalloc.cc

index 7b8b3e4..918e897 100644 (file)
@@ -157,8 +157,9 @@ Free::Free(char* data) : data_(data) {
 void Free::WeakCallback(Isolate* isolate,
                         Local<Object> object,
                         CallbackInfo<Free>* info) {
-  free(data_);
   size_t length = object->GetIndexedPropertiesExternalArrayDataLength();
+  if (length > 0)
+    free(data_);
   enum ExternalArrayType array_type =
       object->GetIndexedPropertiesExternalArrayDataType();
   size_t array_size = ExternalArraySize(array_type);