mirror of https://github.com/nodejs/node.git
deps: V8: cherry-pick e06ace6b5cdb
Original commit message:
[api] Fix empty Maybe crash in GetRealNamedPropertyAttributes
`Object::GetRealNamedPropertyAttributes()` can crash if an empty
`Maybe` is returned by `JSReceiver::GetPropertyAttributes()` because
it was not checking for that. Fix that.
Refs: https://github.com/nodejs/node/issues/34606
Change-Id: Ic83f904ba7134786bcd8f786eb2ce98adb4fea1e
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2335057
Commit-Queue: Leszek Swirski <leszeks@chromium.org>
Reviewed-by: Leszek Swirski <leszeks@chromium.org>
Cr-Commit-Position: refs/heads/master@{#69258}
Refs: e06ace6b5c
PR-URL: https://github.com/nodejs/node/pull/34673
Fixes: https://github.com/nodejs/node/issues/34606
Reviewed-By: Jiawen Geng <technicalcute@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
pull/33424/head
parent
5b6cd6fa1a
commit
b8b5e1e5d0
|
@ -36,7 +36,7 @@
|
|||
|
||||
# Reset this number to 0 on major V8 upgrades.
|
||||
# Increment by one for each non-official patch applied to deps/v8.
|
||||
'v8_embedder_string': '-node.13',
|
||||
'v8_embedder_string': '-node.14',
|
||||
|
||||
##### V8 defaults for Node.js #####
|
||||
|
||||
|
|
|
@ -4653,9 +4653,9 @@ Maybe<PropertyAttribute>
|
|||
v8::Object::GetRealNamedPropertyAttributesInPrototypeChain(
|
||||
Local<Context> context, Local<Name> key) {
|
||||
auto isolate = reinterpret_cast<i::Isolate*>(context->GetIsolate());
|
||||
ENTER_V8_NO_SCRIPT(isolate, context, Object,
|
||||
GetRealNamedPropertyAttributesInPrototypeChain,
|
||||
Nothing<PropertyAttribute>(), i::HandleScope);
|
||||
ENTER_V8(isolate, context, Object,
|
||||
GetRealNamedPropertyAttributesInPrototypeChain,
|
||||
Nothing<PropertyAttribute>(), i::HandleScope);
|
||||
i::Handle<i::JSReceiver> self = Utils::OpenHandle(this);
|
||||
if (!self->IsJSObject()) return Nothing<PropertyAttribute>();
|
||||
i::Handle<i::Name> key_obj = Utils::OpenHandle(*key);
|
||||
|
@ -4668,6 +4668,7 @@ v8::Object::GetRealNamedPropertyAttributesInPrototypeChain(
|
|||
i::LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR);
|
||||
Maybe<i::PropertyAttributes> result =
|
||||
i::JSReceiver::GetPropertyAttributes(&it);
|
||||
has_pending_exception = result.IsNothing();
|
||||
RETURN_ON_FAILED_EXECUTION_PRIMITIVE(PropertyAttribute);
|
||||
if (!it.IsFound()) return Nothing<PropertyAttribute>();
|
||||
if (result.FromJust() == i::ABSENT) return Just(None);
|
||||
|
@ -4692,14 +4693,15 @@ MaybeLocal<Value> v8::Object::GetRealNamedProperty(Local<Context> context,
|
|||
Maybe<PropertyAttribute> v8::Object::GetRealNamedPropertyAttributes(
|
||||
Local<Context> context, Local<Name> key) {
|
||||
auto isolate = reinterpret_cast<i::Isolate*>(context->GetIsolate());
|
||||
ENTER_V8_NO_SCRIPT(isolate, context, Object, GetRealNamedPropertyAttributes,
|
||||
Nothing<PropertyAttribute>(), i::HandleScope);
|
||||
ENTER_V8(isolate, context, Object, GetRealNamedPropertyAttributes,
|
||||
Nothing<PropertyAttribute>(), i::HandleScope);
|
||||
i::Handle<i::JSReceiver> self = Utils::OpenHandle(this);
|
||||
i::Handle<i::Name> key_obj = Utils::OpenHandle(*key);
|
||||
i::LookupIterator::Key lookup_key(isolate, key_obj);
|
||||
i::LookupIterator it(isolate, self, lookup_key, self,
|
||||
i::LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR);
|
||||
auto result = i::JSReceiver::GetPropertyAttributes(&it);
|
||||
has_pending_exception = result.IsNothing();
|
||||
RETURN_ON_FAILED_EXECUTION_PRIMITIVE(PropertyAttribute);
|
||||
if (!it.IsFound()) return Nothing<PropertyAttribute>();
|
||||
if (result.FromJust() == i::ABSENT) {
|
||||
|
|
|
@ -11959,6 +11959,48 @@ THREADED_TEST(VariousGetPropertiesAndThrowingCallbacks) {
|
|||
CHECK(result.IsEmpty());
|
||||
}
|
||||
|
||||
THREADED_TEST(GetRealNamedPropertyAttributes_With_Proxy) {
|
||||
LocalContext context;
|
||||
HandleScope scope(context->GetIsolate());
|
||||
|
||||
{
|
||||
Local<Object> proxy =
|
||||
CompileRun(
|
||||
"new Proxy({ p: 1 }, { getOwnPropertyDescriptor: _ => { "
|
||||
" throw new Error('xyz'); } });")
|
||||
.As<Object>();
|
||||
TryCatch try_catch(context->GetIsolate());
|
||||
v8::Maybe<v8::PropertyAttribute> result =
|
||||
proxy->GetRealNamedPropertyAttributes(context.local(), v8_str("p"));
|
||||
CHECK(result.IsNothing());
|
||||
CHECK(try_catch.HasCaught());
|
||||
CHECK(try_catch.Exception()
|
||||
.As<Object>()
|
||||
->Get(context.local(), v8_str("message"))
|
||||
.ToLocalChecked()
|
||||
->StrictEquals(v8_str("xyz")));
|
||||
}
|
||||
|
||||
{
|
||||
Local<Object> proxy =
|
||||
CompileRun(
|
||||
"Object.create("
|
||||
" new Proxy({ p: 1 }, { getOwnPropertyDescriptor: _ => { "
|
||||
" throw new Error('abc'); } }))")
|
||||
.As<Object>();
|
||||
TryCatch try_catch(context->GetIsolate());
|
||||
v8::Maybe<v8::PropertyAttribute> result =
|
||||
proxy->GetRealNamedPropertyAttributesInPrototypeChain(context.local(),
|
||||
v8_str("p"));
|
||||
CHECK(result.IsNothing());
|
||||
CHECK(try_catch.HasCaught());
|
||||
CHECK(try_catch.Exception()
|
||||
.As<Object>()
|
||||
->Get(context.local(), v8_str("message"))
|
||||
.ToLocalChecked()
|
||||
->StrictEquals(v8_str("abc")));
|
||||
}
|
||||
}
|
||||
|
||||
static void ThrowingCallbackWithTryCatch(
|
||||
const v8::FunctionCallbackInfo<v8::Value>& args) {
|
||||
|
|
Loading…
Reference in New Issue