From 268675fdbec203e3ee2bb44261fcc126a4429215 Mon Sep 17 00:00:00 2001 From: Marshall Greenblatt Date: Wed, 16 Nov 2011 22:12:54 +0000 Subject: [PATCH] Add additional error checking for CefV8Value methods (issue #427). git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@381 5089003a-bbd8-11dd-ad1f-f1f9622dbc98 --- libcef/v8_impl.cc | 79 +++++++++++++++++++++-------- libcef_dll/cpptoc/v8value_cpptoc.cc | 32 ++++++++---- libcef_dll/ctocpp/v8value_ctocpp.cc | 34 +++++++++++++ 3 files changed, 114 insertions(+), 31 deletions(-) diff --git a/libcef/v8_impl.cc b/libcef/v8_impl.cc index 2d7a32dea..570c722f0 100644 --- a/libcef/v8_impl.cc +++ b/libcef/v8_impl.cc @@ -785,7 +785,12 @@ bool CefV8ValueImpl::HasValue(const CefString& key) { CEF_REQUIRE_UI_THREAD(false); if(!GetHandle()->IsObject()) { - NOTREACHED(); + NOTREACHED() << "V8 value is not an object"; + return false; + } + + if (key.empty()) { + NOTREACHED() << "invalid input parameter"; return false; } @@ -798,7 +803,12 @@ bool CefV8ValueImpl::HasValue(int index) { CEF_REQUIRE_UI_THREAD(false); if(!GetHandle()->IsObject()) { - NOTREACHED(); + NOTREACHED() << "V8 value is not an object"; + return false; + } + + if (index < 0) { + NOTREACHED() << "invalid input parameter"; return false; } @@ -811,7 +821,12 @@ bool CefV8ValueImpl::DeleteValue(const CefString& key) { CEF_REQUIRE_UI_THREAD(false); if(!GetHandle()->IsObject()) { - NOTREACHED(); + NOTREACHED() << "V8 value is not an object"; + return false; + } + + if (key.empty()) { + NOTREACHED() << "invalid input parameter"; return false; } @@ -824,7 +839,12 @@ bool CefV8ValueImpl::DeleteValue(int index) { CEF_REQUIRE_UI_THREAD(false); if(!GetHandle()->IsObject()) { - NOTREACHED(); + NOTREACHED() << "V8 value is not an object"; + return false; + } + + if (index < 0) { + NOTREACHED() << "invalid input parameter"; return false; } @@ -837,9 +857,14 @@ CefRefPtr CefV8ValueImpl::GetValue(const CefString& key) { CEF_REQUIRE_UI_THREAD(NULL); if(!GetHandle()->IsObject()) { - NOTREACHED(); + NOTREACHED() << "V8 value is not an object"; return NULL; } + + if (key.empty()) { + NOTREACHED() << "invalid input parameter"; + return false; + } v8::HandleScope handle_scope; v8::Local obj = GetHandle()->ToObject(); @@ -850,10 +875,15 @@ CefRefPtr CefV8ValueImpl::GetValue(int index) { CEF_REQUIRE_UI_THREAD(NULL); if(!GetHandle()->IsObject()) { - NOTREACHED(); + NOTREACHED() << "V8 value is not an object"; return NULL; } + if (index < 0) { + NOTREACHED() << "invalid input parameter"; + return false; + } + v8::HandleScope handle_scope; v8::Local obj = GetHandle()->ToObject(); return new CefV8ValueImpl(obj->Get(v8::Number::New(index))); @@ -865,18 +895,18 @@ bool CefV8ValueImpl::SetValue(const CefString& key, { CEF_REQUIRE_UI_THREAD(false); if(!GetHandle()->IsObject()) { - NOTREACHED(); + NOTREACHED() << "V8 value is not an object"; return false; } CefV8ValueImpl *impl = static_cast(value.get()); - if(impl) { + if(impl && !key.empty()) { v8::HandleScope handle_scope; v8::Local obj = GetHandle()->ToObject(); return obj->Set(GetV8String(key), impl->GetHandle(), static_cast(attribute)); } else { - NOTREACHED(); + NOTREACHED() << "invalid input parameter"; return false; } } @@ -885,11 +915,13 @@ bool CefV8ValueImpl::SetValue(int index, CefRefPtr value) { CEF_REQUIRE_UI_THREAD(false); - if (index < 0) - return false; - if(!GetHandle()->IsObject()) { - NOTREACHED(); + NOTREACHED() << "V8 value is not an object"; + return false; + } + + if (index < 0) { + NOTREACHED() << "invalid input parameter"; return false; } @@ -899,7 +931,7 @@ bool CefV8ValueImpl::SetValue(int index, CefRefPtr value) v8::Local obj = GetHandle()->ToObject(); return obj->Set(index, impl->GetHandle()); } else { - NOTREACHED(); + NOTREACHED() << "invalid input parameter"; return false; } } @@ -909,7 +941,12 @@ bool CefV8ValueImpl::SetValue(const CefString& key, AccessControl settings, { CEF_REQUIRE_UI_THREAD(false); if(!GetHandle()->IsObject()) { - NOTREACHED(); + NOTREACHED() << "V8 value is not an object"; + return false; + } + + if (key.empty()) { + NOTREACHED() << "invalid input parameter"; return false; } @@ -934,7 +971,7 @@ bool CefV8ValueImpl::GetKeys(std::vector& keys) { CEF_REQUIRE_UI_THREAD(false); if(!GetHandle()->IsObject()) { - NOTREACHED(); + NOTREACHED() << "V8 value is not an object"; return false; } @@ -955,7 +992,7 @@ CefRefPtr CefV8ValueImpl::GetUserData() { CEF_REQUIRE_UI_THREAD(NULL); if(!GetHandle()->IsObject()) { - NOTREACHED(); + NOTREACHED() << "V8 value is not an object"; return NULL; } @@ -974,7 +1011,7 @@ int CefV8ValueImpl::GetArrayLength() { CEF_REQUIRE_UI_THREAD(0); if(!GetHandle()->IsArray()) { - NOTREACHED(); + NOTREACHED() << "V8 value is not an array"; return 0; } @@ -989,7 +1026,7 @@ CefString CefV8ValueImpl::GetFunctionName() CefString rv; CEF_REQUIRE_UI_THREAD(rv); if(!GetHandle()->IsFunction()) { - NOTREACHED(); + NOTREACHED() << "V8 value is not a function"; return rv; } @@ -1004,7 +1041,7 @@ CefRefPtr CefV8ValueImpl::GetFunctionHandler() { CEF_REQUIRE_UI_THREAD(NULL); if(!GetHandle()->IsFunction()) { - NOTREACHED(); + NOTREACHED() << "V8 value is not a function"; return NULL; } @@ -1041,7 +1078,7 @@ bool CefV8ValueImpl::ExecuteFunctionWithContext( { CEF_REQUIRE_UI_THREAD(false); if(!GetHandle()->IsFunction()) { - NOTREACHED(); + NOTREACHED() << "V8 value is not a function"; return false; } diff --git a/libcef_dll/cpptoc/v8value_cpptoc.cc b/libcef_dll/cpptoc/v8value_cpptoc.cc index 84c0a9d6f..e60573c6b 100644 --- a/libcef_dll/cpptoc/v8value_cpptoc.cc +++ b/libcef_dll/cpptoc/v8value_cpptoc.cc @@ -286,7 +286,8 @@ int CEF_CALLBACK v8value_has_value_bykey(struct _cef_v8value_t* self, const cef_string_t* key) { DCHECK(self); - if(!self) + DCHECK(key); + if(!self || !key) return 0; return CefV8ValueCppToC::Get(self)->HasValue(CefString(key)); @@ -296,7 +297,8 @@ int CEF_CALLBACK v8value_has_value_byindex(struct _cef_v8value_t* self, int index) { DCHECK(self); - if(!self) + DCHECK(index >= 0); + if(!self || index < 0) return 0; return CefV8ValueCppToC::Get(self)->HasValue(index); @@ -306,7 +308,8 @@ int CEF_CALLBACK v8value_delete_value_bykey(struct _cef_v8value_t* self, const cef_string_t* key) { DCHECK(self); - if(!self) + DCHECK(key); + if(!self || !key) return 0; return CefV8ValueCppToC::Get(self)->DeleteValue(CefString(key)); @@ -316,7 +319,8 @@ int CEF_CALLBACK v8value_delete_value_byindex(struct _cef_v8value_t* self, int index) { DCHECK(self); - if(!self) + DCHECK(index >= 0); + if(!self || index < 0) return 0; return CefV8ValueCppToC::Get(self)->DeleteValue(index); @@ -326,7 +330,8 @@ struct _cef_v8value_t* CEF_CALLBACK v8value_get_value_bykey( struct _cef_v8value_t* self, const cef_string_t* key) { DCHECK(self); - if(!self) + DCHECK(key); + if(!self || !key) return 0; CefRefPtr valuePtr = @@ -338,7 +343,8 @@ struct _cef_v8value_t* CEF_CALLBACK v8value_get_value_byindex( struct _cef_v8value_t* self, int index) { DCHECK(self); - if(!self) + DCHECK(index >= 0); + if(!self || index < 0) return 0; CefRefPtr valuePtr = @@ -351,7 +357,9 @@ int CEF_CALLBACK v8value_set_value_bykey(struct _cef_v8value_t* self, enum cef_v8_propertyattribute_t attribute) { DCHECK(self); - if(!self) + DCHECK(key); + DCHECK(value); + if(!self || !key || !value) return 0; CefRefPtr valuePtr = CefV8ValueCppToC::Unwrap(value); @@ -363,7 +371,9 @@ int CEF_CALLBACK v8value_set_value_byindex(struct _cef_v8value_t* self, int index, struct _cef_v8value_t* value) { DCHECK(self); - if(!self) + DCHECK(index >= 0); + DCHECK(value); + if(!self || index < 0 || !value) return 0; CefRefPtr valuePtr = CefV8ValueCppToC::Unwrap(value); @@ -375,7 +385,8 @@ int CEF_CALLBACK v8value_set_value_byaccessor(struct _cef_v8value_t* self, enum cef_v8_propertyattribute_t attribute) { DCHECK(self); - if(!self) + DCHECK(key); + if(!self || !key) return 0; return CefV8ValueCppToC::Get(self)->SetValue(CefString(key), @@ -386,7 +397,8 @@ int CEF_CALLBACK v8value_get_keys(struct _cef_v8value_t* self, cef_string_list_t keys) { DCHECK(self); - if(!self) + DCHECK(keys); + if(!self || !keys) return 0; std::vector keysList; diff --git a/libcef_dll/ctocpp/v8value_ctocpp.cc b/libcef_dll/ctocpp/v8value_ctocpp.cc index def6c51f6..999cd5f6c 100644 --- a/libcef_dll/ctocpp/v8value_ctocpp.cc +++ b/libcef_dll/ctocpp/v8value_ctocpp.cc @@ -276,6 +276,10 @@ bool CefV8ValueCToCpp::HasValue(int index) if(CEF_MEMBER_MISSING(struct_, has_value_byindex)) return false; + DCHECK(index >= 0); + if (index < 0) + return false; + return struct_->has_value_byindex(struct_, index)?true:false; } @@ -284,6 +288,10 @@ bool CefV8ValueCToCpp::DeleteValue(const CefString& key) if(CEF_MEMBER_MISSING(struct_, delete_value_bykey)) return false; + DCHECK(!key.empty()); + if (key.empty()) + return false; + return struct_->delete_value_bykey(struct_, key.GetStruct())?true:false; } @@ -292,6 +300,10 @@ bool CefV8ValueCToCpp::DeleteValue(int index) if(CEF_MEMBER_MISSING(struct_, delete_value_byindex)) return false; + DCHECK(index >= 0); + if (index < 0) + return false; + return struct_->delete_value_byindex(struct_, index)?true:false; } @@ -300,6 +312,10 @@ CefRefPtr CefV8ValueCToCpp::GetValue(const CefString& key) if(CEF_MEMBER_MISSING(struct_, get_value_bykey)) return NULL; + DCHECK(!key.empty()); + if (key.empty()) + return NULL; + cef_v8value_t* valueStruct = struct_->get_value_bykey(struct_, key.GetStruct()); if(valueStruct) @@ -312,6 +328,10 @@ CefRefPtr CefV8ValueCToCpp::GetValue(int index) if(CEF_MEMBER_MISSING(struct_, get_value_byindex)) return NULL; + DCHECK(index >= 0); + if (index < 0) + return NULL; + cef_v8value_t* valueStruct = struct_->get_value_byindex(struct_, index); if(valueStruct) return CefV8ValueCToCpp::Wrap(valueStruct); @@ -324,6 +344,11 @@ bool CefV8ValueCToCpp::SetValue(const CefString& key, if(CEF_MEMBER_MISSING(struct_, set_value_bykey)) return false; + DCHECK(!key.empty()); + DCHECK(value.get()); + if (key.empty() || !value.get()) + return false; + return struct_->set_value_bykey(struct_, key.GetStruct(), CefV8ValueCToCpp::Unwrap(value), attribute)?true:false; } @@ -333,6 +358,11 @@ bool CefV8ValueCToCpp::SetValue(int index, CefRefPtr value) if(CEF_MEMBER_MISSING(struct_, set_value_byindex)) return false; + DCHECK(index >= 0); + DCHECK(value.get()); + if (index < 0 || !value.get()) + return false; + return struct_->set_value_byindex(struct_, index, CefV8ValueCToCpp::Unwrap(value))?true:false; } @@ -343,6 +373,10 @@ bool CefV8ValueCToCpp::SetValue(const CefString& key, AccessControl settings, if(CEF_MEMBER_MISSING(struct_, set_value_byaccessor)) return false; + DCHECK(!key.empty()); + if (key.empty()) + return false; + return struct_->set_value_byaccessor(struct_, key.GetStruct(), settings, attribute)?true:false; }