Reviewers: rossberg,
Message:
ptal
Description:
negative bounds checking on realm calls
[email protected]
BUG=344285
Please review this at https://codereview.chromium.org/169393002/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+20, -19 lines):
M src/d8.cc
A + test/mjsunit/regress/regress-cr-344285.js
Index: src/d8.cc
diff --git a/src/d8.cc b/src/d8.cc
index
76ff4f94318890a4cd3b23b3b42208fec4c3d409..05a2f84a362cbd4cc35c5596b602679329b1b115
100644
--- a/src/d8.cc
+++ b/src/d8.cc
@@ -113,9 +113,9 @@ class PerIsolateData {
friend class Shell;
friend class RealmScope;
Isolate* isolate_;
- int realm_count_;
- int realm_current_;
- int realm_switch_;
+ uint32_t realm_count_;
+ uint32_t realm_current_;
+ uint32_t realm_switch_;
Persistent<Context>* realms_;
Persistent<Value> realm_shared_;
@@ -272,7 +272,7 @@ PerIsolateData::RealmScope::RealmScope(PerIsolateData*
data) : data_(data) {
PerIsolateData::RealmScope::~RealmScope() {
// Drop realms to avoid keeping them alive.
- for (int i = 0; i < data_->realm_count_; ++i)
+ for (uint32_t i = 0; i < data_->realm_count_; ++i)
data_->realms_[i].Reset();
delete[] data_->realms_;
if (!data_->realm_shared_.IsEmpty())
@@ -281,7 +281,7 @@ PerIsolateData::RealmScope::~RealmScope() {
int PerIsolateData::RealmFind(Handle<Context> context) {
- for (int i = 0; i < realm_count_; ++i) {
+ for (uint32_t i = 0; i < realm_count_; ++i) {
if (realms_[i] == context) return i;
}
return -1;
@@ -329,7 +329,7 @@ void Shell::RealmGlobal(const
v8::FunctionCallbackInfo<v8::Value>& args) {
Throw(args.GetIsolate(), "Invalid argument");
return;
}
- int index = args[0]->Uint32Value();
+ uint32_t index = args[0]->Uint32Value();
if (index >= data->realm_count_ || data->realms_[index].IsEmpty()) {
Throw(args.GetIsolate(), "Invalid realm index");
return;
@@ -344,9 +344,9 @@ void Shell::RealmCreate(const
v8::FunctionCallbackInfo<v8::Value>& args) {
Isolate* isolate = args.GetIsolate();
PerIsolateData* data = PerIsolateData::Get(isolate);
Persistent<Context>* old_realms = data->realms_;
- int index = data->realm_count_;
+ uint32_t index = data->realm_count_;
data->realms_ = new Persistent<Context>[++data->realm_count_];
- for (int i = 0; i < index; ++i) {
+ for (uint32_t i = 0; i < index; ++i) {
data->realms_[i].Reset(isolate, old_realms[i]);
}
delete[] old_realms;
@@ -365,7 +365,7 @@ void Shell::RealmDispose(const
v8::FunctionCallbackInfo<v8::Value>& args) {
Throw(args.GetIsolate(), "Invalid argument");
return;
}
- int index = args[0]->Uint32Value();
+ uint32_t index = args[0]->Uint32Value();
if (index >= data->realm_count_ || data->realms_[index].IsEmpty() ||
index == 0 ||
index == data->realm_current_ || index == data->realm_switch_) {
@@ -384,7 +384,7 @@ void Shell::RealmSwitch(const
v8::FunctionCallbackInfo<v8::Value>& args) {
Throw(args.GetIsolate(), "Invalid argument");
return;
}
- int index = args[0]->Uint32Value();
+ uint32_t index = args[0]->Uint32Value();
if (index >= data->realm_count_ || data->realms_[index].IsEmpty()) {
Throw(args.GetIsolate(), "Invalid realm index");
return;
@@ -401,7 +401,7 @@ void Shell::RealmEval(const
v8::FunctionCallbackInfo<v8::Value>& args) {
Throw(args.GetIsolate(), "Invalid argument");
return;
}
- int index = args[0]->Uint32Value();
+ uint32_t index = args[0]->Uint32Value();
if (index >= data->realm_count_ || data->realms_[index].IsEmpty()) {
Throw(args.GetIsolate(), "Invalid realm index");
return;
Index: test/mjsunit/regress/regress-cr-344285.js
diff --git a/test/mjsunit/function-arguments-duplicate.js
b/test/mjsunit/regress/regress-cr-344285.js
similarity index 87%
copy from test/mjsunit/function-arguments-duplicate.js
copy to test/mjsunit/regress/regress-cr-344285.js
index
80f03a106b30a7e2f984a83b9d54b2edd8fb840a..42e8bd109bb34cfb3de436af96f91104f698b836
100644
--- a/test/mjsunit/function-arguments-duplicate.js
+++ b/test/mjsunit/regress/regress-cr-344285.js
@@ -25,12 +25,13 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-// Execises ArgumentsAccessStub::GenerateNewNonStrictSlow.
-
-function f(a, a) {
- assertEquals(2, a);
- assertEquals(1, arguments[0]);
- assertEquals(2, arguments[1]);
+function __f_1(g) { return (g/-1) ^ 1; }
+var __v_0 = 1 << 31;
+var __v_2 = __f_1(__v_0);
+caught = false;
+try {
+ Realm.eval(__v_2, "Realm.global(0).y = 1");
+} catch (e) {
+ caught = true;
}
-
-f(1, 2);
+assertTrue(caught, "exception not caught");
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.