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

Side by Side Diff: src/isolate.cc

Issue 2087823002: Optionally invoke an interceptor on failed access checks (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: updates Created 4 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 unified diff | Download patch
« no previous file with comments | « src/api.cc ('k') | src/keys.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/isolate.h" 5 #include "src/isolate.h"
6 6
7 #include <stdlib.h> 7 #include <stdlib.h>
8 8
9 #include <fstream> // NOLINT(readability/streams) 9 #include <fstream> // NOLINT(readability/streams)
10 #include <sstream> 10 #include <sstream>
(...skipping 784 matching lines...) Expand 10 before | Expand all | Expand 10 after
795 accumulator->Add("=====================\n\n"); 795 accumulator->Add("=====================\n\n");
796 } 796 }
797 797
798 798
799 void Isolate::SetFailedAccessCheckCallback( 799 void Isolate::SetFailedAccessCheckCallback(
800 v8::FailedAccessCheckCallback callback) { 800 v8::FailedAccessCheckCallback callback) {
801 thread_local_top()->failed_access_check_callback_ = callback; 801 thread_local_top()->failed_access_check_callback_ = callback;
802 } 802 }
803 803
804 804
805 static inline AccessCheckInfo* GetAccessCheckInfo(Isolate* isolate,
806 Handle<JSObject> receiver) {
807 Object* maybe_constructor = receiver->map()->GetConstructor();
808 if (!maybe_constructor->IsJSFunction()) return NULL;
809 JSFunction* constructor = JSFunction::cast(maybe_constructor);
810 if (!constructor->shared()->IsApiFunction()) return NULL;
811
812 Object* data_obj =
813 constructor->shared()->get_api_func_data()->access_check_info();
814 if (data_obj->IsUndefined(isolate)) return NULL;
815
816 return AccessCheckInfo::cast(data_obj);
817 }
818
819
820 void Isolate::ReportFailedAccessCheck(Handle<JSObject> receiver) { 805 void Isolate::ReportFailedAccessCheck(Handle<JSObject> receiver) {
821 if (!thread_local_top()->failed_access_check_callback_) { 806 if (!thread_local_top()->failed_access_check_callback_) {
822 return ScheduleThrow(*factory()->NewTypeError(MessageTemplate::kNoAccess)); 807 return ScheduleThrow(*factory()->NewTypeError(MessageTemplate::kNoAccess));
823 } 808 }
824 809
825 DCHECK(receiver->IsAccessCheckNeeded()); 810 DCHECK(receiver->IsAccessCheckNeeded());
826 DCHECK(context()); 811 DCHECK(context());
827 812
828 // Get the data object from access check info. 813 // Get the data object from access check info.
829 HandleScope scope(this); 814 HandleScope scope(this);
830 Handle<Object> data; 815 Handle<Object> data;
831 { DisallowHeapAllocation no_gc; 816 { DisallowHeapAllocation no_gc;
832 AccessCheckInfo* access_check_info = GetAccessCheckInfo(this, receiver); 817 AccessCheckInfo* access_check_info = AccessCheckInfo::Get(this, receiver);
833 if (!access_check_info) { 818 if (!access_check_info) {
834 AllowHeapAllocation doesnt_matter_anymore; 819 AllowHeapAllocation doesnt_matter_anymore;
835 return ScheduleThrow( 820 return ScheduleThrow(
836 *factory()->NewTypeError(MessageTemplate::kNoAccess)); 821 *factory()->NewTypeError(MessageTemplate::kNoAccess));
837 } 822 }
838 data = handle(access_check_info->data(), this); 823 data = handle(access_check_info->data(), this);
839 } 824 }
840 825
841 // Leaving JavaScript. 826 // Leaving JavaScript.
842 VMState<EXTERNAL> state(this); 827 VMState<EXTERNAL> state(this);
(...skipping 28 matching lines...) Expand all
871 if (Context::cast(receiver_context)->security_token() == 856 if (Context::cast(receiver_context)->security_token() ==
872 native_context->security_token()) 857 native_context->security_token())
873 return true; 858 return true;
874 } 859 }
875 } 860 }
876 861
877 HandleScope scope(this); 862 HandleScope scope(this);
878 Handle<Object> data; 863 Handle<Object> data;
879 v8::AccessCheckCallback callback = nullptr; 864 v8::AccessCheckCallback callback = nullptr;
880 { DisallowHeapAllocation no_gc; 865 { DisallowHeapAllocation no_gc;
881 AccessCheckInfo* access_check_info = GetAccessCheckInfo(this, receiver); 866 AccessCheckInfo* access_check_info = AccessCheckInfo::Get(this, receiver);
882 if (!access_check_info) return false; 867 if (!access_check_info) return false;
883 Object* fun_obj = access_check_info->callback(); 868 Object* fun_obj = access_check_info->callback();
884 callback = v8::ToCData<v8::AccessCheckCallback>(fun_obj); 869 callback = v8::ToCData<v8::AccessCheckCallback>(fun_obj);
885 data = handle(access_check_info->data(), this); 870 data = handle(access_check_info->data(), this);
886 } 871 }
887 872
888 LOG(this, ApiSecurityCheck()); 873 LOG(this, ApiSecurityCheck());
889 874
890 { 875 {
891 // Leaving JavaScript. 876 // Leaving JavaScript.
(...skipping 2166 matching lines...) Expand 10 before | Expand all | Expand 10 after
3058 // Then check whether this scope intercepts. 3043 // Then check whether this scope intercepts.
3059 if ((flag & intercept_mask_)) { 3044 if ((flag & intercept_mask_)) {
3060 intercepted_flags_ |= flag; 3045 intercepted_flags_ |= flag;
3061 return true; 3046 return true;
3062 } 3047 }
3063 return false; 3048 return false;
3064 } 3049 }
3065 3050
3066 } // namespace internal 3051 } // namespace internal
3067 } // namespace v8 3052 } // namespace v8
OLDNEW
« no previous file with comments | « src/api.cc ('k') | src/keys.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698