Reviewers: Dean McNamee,

Description:
Make sure to set property attributes in GetProperty in the case of
failed access checks.

Added assert to GetPropertyWithReceiver which was hit by our tests in
debug mode.

Please review this at http://codereview.chromium.org/13242

SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/

Affected files:
   M     src/objects.h
   M     src/objects.cc


Index: src/objects.cc
===================================================================
--- src/objects.cc      (revision 923)
+++ src/objects.cc      (working copy)
@@ -147,7 +147,9 @@
                                          PropertyAttributes* attributes) {
    LookupResult result;
    Lookup(name, &result);
-  return GetProperty(receiver, &result, name, attributes);
+  Object* value = GetProperty(receiver, &result, name, attributes);
+  ASSERT(*attributes <= ABSENT);
+  return value;
  }


@@ -215,9 +217,11 @@


  // Only deal with CALLBACKS and INTERCEPTOR
-Object* JSObject::GetPropertyWithFailedAccessCheck(Object* receiver,
-                                                   LookupResult* result,
-                                                   String* name) {
+Object* JSObject::GetPropertyWithFailedAccessCheck(
+    Object* receiver,
+    LookupResult* result,
+    String* name,
+    PropertyAttributes* attributes) {
    if (result->IsValid()) {
      switch (result->type()) {
        case CALLBACKS: {
@@ -226,6 +230,7 @@
          if (obj->IsAccessorInfo()) {
            AccessorInfo* info = AccessorInfo::cast(obj);
            if (info->all_can_read()) {
+            *attributes = result->GetAttributes();
              return GetPropertyWithCallback(receiver,
                                             result->GetCallbackObject(),
                                             name,
@@ -241,7 +246,10 @@
          LookupResult r;
          result->holder()->LookupRealNamedPropertyInPrototypes(name, &r);
          if (r.IsValid()) {
-          return GetPropertyWithFailedAccessCheck(receiver, &r, name);
+          return GetPropertyWithFailedAccessCheck(receiver,
+                                                  &r,
+                                                  name,
+                                                  attributes);
          }
          break;
        }
@@ -251,9 +259,11 @@
          LookupResult r;
          result->holder()->LookupRealNamedProperty(name, &r);
          if (r.IsValid()) {
-          return GetPropertyWithFailedAccessCheck(receiver, &r, name);
+          return GetPropertyWithFailedAccessCheck(receiver,
+                                                  &r,
+                                                  name,
+                                                  attributes);
          }
-        break;
        }
        default: {
          break;
@@ -261,6 +271,8 @@
      }
    }

+  // No accessible property found.
+  *attributes = ABSENT;
    Top::ReportFailedAccessCheck(this, v8::ACCESS_GET);
    return Heap::undefined_value();
  }
@@ -402,7 +414,8 @@
        if (!Top::MayNamedAccess(checked, name, v8::ACCESS_GET)) {
          return checked->GetPropertyWithFailedAccessCheck(receiver,
                                                           result,
-                                                         name);
+                                                         name,
+                                                         attributes);
        }
      }
      // Stop traversing the chain once we reach the last object in the
Index: src/objects.h
===================================================================
--- src/objects.h       (revision 923)
+++ src/objects.h       (working copy)
@@ -1185,7 +1185,8 @@
    // Used from Object::GetProperty().
    Object* GetPropertyWithFailedAccessCheck(Object* receiver,
                                             LookupResult* result,
-                                           String* name);
+                                           String* name,
+                                           PropertyAttributes* attributes);
    Object* GetPropertyWithInterceptor(JSObject* receiver,
                                       String* name,
                                       PropertyAttributes* attributes);



--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to