Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(521)

Unified Diff: lib/byte_array.cc

Issue 10782016: Enforce length/size limits for variable size heap object in order to (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « lib/array.cc ('k') | tests/vm/vm.status » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/byte_array.cc
===================================================================
--- lib/byte_array.cc (revision 10127)
+++ lib/byte_array.cc (working copy)
@@ -13,18 +13,36 @@
// ByteArray
+// Checks to see if (index * num_bytes) is in the range
+// [0..array.ByteLength()). without the risk of integer overflow. If
+// the index is out of range, then an IndexOutOfRangeException is thrown.
static void RangeCheck(const ByteArray& array,
intptr_t index,
intptr_t num_bytes) {
if (!Utils::RangeCheck(index, num_bytes, array.ByteLength())) {
- GrowableArray<const Object*> arguments;
- const Smi &index_object = Smi::Handle(Smi::New(index));
- arguments.Add(&index_object);
- Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, arguments);
+ const String& error = String::Handle(String::NewFormatted(
+ "index (%ld) must be in the range [0..%ld)",
+ index, (array.ByteLength() / num_bytes)));
+ GrowableArray<const Object*> args;
+ args.Add(&error);
+ Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, args);
}
}
+// Checks to see if a length is in the range [0..max]. If the length
+// is out of range, then an IllegalArgumentException is thrown.
+static void LengthCheck(intptr_t len, intptr_t max) {
+ if (len < 0 || len > max) {
+ const String& error = String::Handle(String::NewFormatted(
+ "length (%ld) must be in the range [0..%ld]", len, max));
+ GrowableArray<const Object*> args;
+ args.Add(&error);
+ Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
+ }
+}
+
+
#define GETTER_ARGUMENTS(ArrayT, ValueT) \
GET_NATIVE_ARGUMENT(ArrayT, array, arguments->At(0)); \
GET_NATIVE_ARGUMENT(Smi, index, arguments->At(1));
@@ -247,7 +265,10 @@
intptr_t src_start_value = src_start.Value();
intptr_t dst_start_value = dst_start.Value();
if (length_value < 0) {
+ const String& error = String::Handle(String::NewFormatted(
+ "length (%ld) must be non-negative", index));
GrowableArray<const Object*> args;
+ args.Add(&error);
Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
}
RangeCheck(src, src_start_value, length_value);
@@ -260,13 +281,9 @@
DEFINE_NATIVE_ENTRY(Int8Array_new, 1) {
GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0));
- if (length.Value() < 0) {
- GrowableArray<const Object*> args;
- args.Add(&length);
- Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
- }
- const Int8Array& new_array =
- Int8Array::Handle(Int8Array::New(length.Value()));
+ intptr_t len = length.Value();
+ LengthCheck(len, Int8Array::kMaxElements);
+ const Int8Array& new_array = Int8Array::Handle(Int8Array::New(len));
arguments->SetReturn(new_array);
}
@@ -285,13 +302,9 @@
DEFINE_NATIVE_ENTRY(Uint8Array_new, 1) {
GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0));
- if (length.Value() < 0) {
- GrowableArray<const Object*> args;
- args.Add(&length);
- Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
- }
- const Uint8Array& new_array =
- Uint8Array::Handle(Uint8Array::New(length.Value()));
+ intptr_t len = length.Value();
+ LengthCheck(len, Uint8Array::kMaxElements);
+ const Uint8Array& new_array = Uint8Array::Handle(Uint8Array::New(len));
arguments->SetReturn(new_array);
}
@@ -310,13 +323,9 @@
DEFINE_NATIVE_ENTRY(Int16Array_new, 1) {
GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0));
- if (length.Value() < 0) {
- GrowableArray<const Object*> args;
- args.Add(&length);
- Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
- }
- const Int16Array& new_array =
- Int16Array::Handle(Int16Array::New(length.Value()));
+ intptr_t len = length.Value();
+ LengthCheck(len, Int16Array::kMaxElements);
+ const Int16Array& new_array = Int16Array::Handle(Int16Array::New(len));
arguments->SetReturn(new_array);
}
@@ -335,13 +344,9 @@
DEFINE_NATIVE_ENTRY(Uint16Array_new, 1) {
GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0));
- if (length.Value() < 0) {
- GrowableArray<const Object*> args;
- args.Add(&length);
- Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
- }
- const Uint16Array& new_array =
- Uint16Array::Handle(Uint16Array::New(length.Value()));
+ intptr_t len = length.Value();
+ LengthCheck(len, Uint16Array::kMaxElements);
+ const Uint16Array& new_array = Uint16Array::Handle(Uint16Array::New(len));
arguments->SetReturn(new_array);
}
@@ -360,13 +365,9 @@
DEFINE_NATIVE_ENTRY(Int32Array_new, 1) {
GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0));
- if (length.Value() < 0) {
- GrowableArray<const Object*> args;
- args.Add(&length);
- Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
- }
- const Int32Array& new_array =
- Int32Array::Handle(Int32Array::New(length.Value()));
+ intptr_t len = length.Value();
+ LengthCheck(len, Int32Array::kMaxElements);
+ const Int32Array& new_array = Int32Array::Handle(Int32Array::New(len));
arguments->SetReturn(new_array);
}
@@ -385,13 +386,9 @@
DEFINE_NATIVE_ENTRY(Uint32Array_new, 1) {
GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0));
- if (length.Value() < 0) {
- GrowableArray<const Object*> args;
- args.Add(&length);
- Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
- }
- const Uint32Array& new_array =
- Uint32Array::Handle(Uint32Array::New(length.Value()));
+ intptr_t len = length.Value();
+ LengthCheck(len, Uint32Array::kMaxElements);
+ const Uint32Array& new_array = Uint32Array::Handle(Uint32Array::New(len));
arguments->SetReturn(new_array);
}
@@ -410,13 +407,9 @@
DEFINE_NATIVE_ENTRY(Int64Array_new, 1) {
GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0));
- if (length.Value() < 0) {
- GrowableArray<const Object*> args;
- args.Add(&length);
- Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
- }
- const Int64Array& new_array =
- Int64Array::Handle(Int64Array::New(length.Value()));
+ intptr_t len = length.Value();
+ LengthCheck(len, Int64Array::kMaxElements);
+ const Int64Array& new_array = Int64Array::Handle(Int64Array::New(len));
arguments->SetReturn(new_array);
}
@@ -435,13 +428,9 @@
DEFINE_NATIVE_ENTRY(Uint64Array_new, 1) {
GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0));
- if (length.Value() < 0) {
- GrowableArray<const Object*> args;
- args.Add(&length);
- Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
- }
- const Uint64Array& new_array =
- Uint64Array::Handle(Uint64Array::New(length.Value()));
+ intptr_t len = length.Value();
+ LengthCheck(len, Uint64Array::kMaxElements);
+ const Uint64Array& new_array = Uint64Array::Handle(Uint64Array::New(len));
arguments->SetReturn(new_array);
}
@@ -460,13 +449,9 @@
DEFINE_NATIVE_ENTRY(Float32Array_new, 1) {
GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0));
- if (length.Value() < 0) {
- GrowableArray<const Object*> args;
- args.Add(&length);
- Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
- }
- const Float32Array& new_array =
- Float32Array::Handle(Float32Array::New(length.Value()));
+ intptr_t len = length.Value();
+ LengthCheck(len, Float32Array::kMaxElements);
+ const Float32Array& new_array = Float32Array::Handle(Float32Array::New(len));
arguments->SetReturn(new_array);
}
@@ -485,13 +470,9 @@
DEFINE_NATIVE_ENTRY(Float64Array_new, 1) {
GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0));
- if (length.Value() < 0) {
- GrowableArray<const Object*> args;
- args.Add(&length);
- Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
- }
- const Float64Array& new_array =
- Float64Array::Handle(Float64Array::New(length.Value()));
+ intptr_t len = length.Value();
+ LengthCheck(len, Float64Array::kMaxElements);
+ const Float64Array& new_array = Float64Array::Handle(Float64Array::New(len));
arguments->SetReturn(new_array);
}
« no previous file with comments | « lib/array.cc ('k') | tests/vm/vm.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698