Index: samples/shell.cc |
diff --git a/samples/shell.cc b/samples/shell.cc |
index 950370adaa80fda9bd7896a41a0c3f32e7e69eaa..72a00f7d7841d7e0ac5eb3dac46d0963a391778e 100644 |
--- a/samples/shell.cc |
+++ b/samples/shell.cc |
@@ -497,14 +497,31 @@ void ExternalArrayWeakCallback(v8::Persistent<v8::Value> object, void* data) { |
v8::Handle<v8::Value> CreateExternalArray(const v8::Arguments& args, |
v8::ExternalArrayType type, |
- int element_size) { |
+ size_t element_size) { |
Lasse Reichstein
2011/06/28 09:28:58
Let's ASSERT that element_size it's a meaningful v
Jakob Kummerow
2011/06/28 14:02:38
Done.
Changed the interface to size_t anyway becau
|
if (args.Length() != 1) { |
return v8::ThrowException( |
v8::String::New("Array constructor needs one parameter.")); |
} |
- int length = args[0]->Int32Value(); |
- void* data = malloc(length * element_size); |
- memset(data, 0, length * element_size); |
+ if (args[0]->Int32Value() < 0) { |
Lasse Reichstein
2011/06/28 09:28:58
You convert args[0] to int32 twice. Just do it onc
Lasse Reichstein
2011/06/28 09:44:12
That is, ofcourse, unless there is a specification
Jakob Kummerow
2011/06/28 14:02:38
Spec says the c'tor argument is an "unsigned long"
Lasse Reichstein
2011/06/29 08:51:05
An unsigned long can take values that are too big
|
+ return v8::ThrowException( |
+ v8::String::New("Array length must not be negative.")); |
+ } |
+ size_t length = static_cast<size_t>(args[0]->Int32Value()); |
+ if (length > static_cast<size_t>(v8::internal::ExternalArray::kMaxLength)) { |
Lasse Reichstein
2011/06/28 09:28:58
If both values are int32, there's no need to conve
Jakob Kummerow
2011/06/28 14:02:38
True. Removed the cast.
|
+ return v8::ThrowException( |
+ v8::String::New("Array length exceeds maximum length.")); |
+ } |
+ size_t malloc_size = length * element_size; |
+ // Check for overflow in the multiplication. |
+ if (malloc_size / length != element_size) { |
+ return v8::ThrowException( |
+ v8::String::New("Array size exceeds memory limit.")); |
Lasse Reichstein
2011/06/28 09:28:58
Can this happen?
I.e., is kMaxLength * maximal ele
Jakob Kummerow
2011/06/28 14:02:38
It can happen. kMaxLength is 2^30 - 1, and Float64
|
+ } |
+ void* data = malloc(malloc_size); |
Lasse Reichstein
2011/06/28 09:28:58
How about using calloc instead? It seems like just
Jakob Kummerow
2011/06/28 14:02:38
Done, thanks for the hint.
|
+ if (data == NULL) { |
+ return v8::ThrowException(v8::String::New("Memory allocation failed.")); |
+ } |
+ memset(data, 0, malloc_size); |
v8::Handle<v8::Object> array = v8::Object::New(); |
v8::Persistent<v8::Object> persistent_array = |
v8::Persistent<v8::Object>::New(array); |