From: jkummerow@chromium.org Date: Wed, 29 Jun 2011 10:27:14 +0000 (+0000) Subject: Error checking for length parameter of external array constructors in shell X-Git-Tag: upstream/4.7.83~19046 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6f66664386bce2b4120473158efa456bf5598db0;p=platform%2Fupstream%2Fv8.git Error checking for length parameter of external array constructors in shell BUG=v8:1501 Review URL: http://codereview.chromium.org/7268002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@8458 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/samples/shell.cc b/samples/shell.cc index 950370a..15c1a5a 100644 --- a/samples/shell.cc +++ b/samples/shell.cc @@ -497,14 +497,39 @@ void ExternalArrayWeakCallback(v8::Persistent object, void* data) { v8::Handle CreateExternalArray(const v8::Arguments& args, v8::ExternalArrayType type, - int element_size) { + size_t element_size) { + ASSERT(element_size == 1 || element_size == 2 || element_size == 4 || + element_size == 8); 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); + size_t length = 0; + if (args[0]->IsUint32()) { + length = args[0]->Uint32Value(); + } else if (args[0]->IsNumber()) { + double raw_length = args[0]->NumberValue(); + if (raw_length < 0) { + return v8::ThrowException( + v8::String::New("Array length must not be negative.")); + } + if (raw_length > v8::internal::ExternalArray::kMaxLength) { + return v8::ThrowException( + v8::String::New("Array length exceeds maximum length.")); + } + length = static_cast(raw_length); + } else { + return v8::ThrowException( + v8::String::New("Array length must be a number.")); + } + if (length > static_cast(v8::internal::ExternalArray::kMaxLength)) { + return v8::ThrowException( + v8::String::New("Array length exceeds maximum length.")); + } + void* data = calloc(length, element_size); + if (data == NULL) { + return v8::ThrowException(v8::String::New("Memory allocation failed.")); + } v8::Handle array = v8::Object::New(); v8::Persistent persistent_array = v8::Persistent::New(array); diff --git a/src/d8.cc b/src/d8.cc index 7655aad..6f948c6 100644 --- a/src/d8.cc +++ b/src/d8.cc @@ -223,14 +223,36 @@ Handle Shell::Load(const Arguments& args) { Handle Shell::CreateExternalArray(const Arguments& args, ExternalArrayType type, - int element_size) { + size_t element_size) { + ASSERT(element_size == 1 || element_size == 2 || element_size == 4 || + element_size == 8); if (args.Length() != 1) { return ThrowException( String::New("Array constructor needs one parameter.")); } - int length = args[0]->Int32Value(); - void* data = malloc(length * element_size); - memset(data, 0, length * element_size); + size_t length = 0; + if (args[0]->IsUint32()) { + length = args[0]->Uint32Value(); + } else if (args[0]->IsNumber()) { + double raw_length = args[0]->NumberValue(); + if (raw_length < 0) { + return ThrowException(String::New("Array length must not be negative.")); + } + if (raw_length > v8::internal::ExternalArray::kMaxLength) { + return ThrowException( + String::New("Array length exceeds maximum length.")); + } + length = static_cast(raw_length); + } else { + return ThrowException(String::New("Array length must be a number.")); + } + if (length > static_cast(internal::ExternalArray::kMaxLength)) { + return ThrowException(String::New("Array length exceeds maximum length.")); + } + void* data = calloc(length, element_size); + if (data == NULL) { + return ThrowException(String::New("Memory allocation failed.")); + } Handle array = Object::New(); Persistent persistent_array = Persistent::New(array); persistent_array.MakeWeak(data, ExternalArrayWeakCallback); diff --git a/src/d8.h b/src/d8.h index f3760e8..e225469 100644 --- a/src/d8.h +++ b/src/d8.h @@ -217,7 +217,7 @@ class Shell: public i::AllStatic { static Counter* GetCounter(const char* name, bool is_histogram); static Handle CreateExternalArray(const Arguments& args, ExternalArrayType type, - int element_size); + size_t element_size); static void ExternalArrayWeakCallback(Persistent object, void* data); };