-
Notifications
You must be signed in to change notification settings - Fork 30.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
src: handle thrown errors in CopyProperties() #8649
Conversation
@@ -113,7 +113,7 @@ class ContextifyContext { | |||
// removed once there is a better way. | |||
void CopyProperties() { | |||
HandleScope scope(env()->isolate()); | |||
|
|||
TryCatch try_catch(env()->isolate()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You don't need a TryCatch because...
@@ -125,7 +125,8 @@ class ContextifyContext { | |||
int length = names->Length(); | |||
for (int i = 0; i < length; i++) { | |||
Local<String> key = names->Get(i)->ToString(env()->isolate()); | |||
bool has = sandbox_obj->HasOwnProperty(context, key).FromJust(); | |||
bool has = sandbox_obj->HasOwnProperty(context, key).FromMaybe(true); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
...the proper way is to check:
auto maybe_has = sandbox_obj->HasOwnProperty(context, key);
if (!maybe_has.IsJust()) break; // Exception pending.
auto has = maybe_has.FromJust();
// ...
@@ -161,6 +162,9 @@ class ContextifyContext { | |||
clone_property_method->Call(global, arraysize(args), args); | |||
} | |||
} | |||
|
|||
if (try_catch.HasCaught()) | |||
try_catch.ReThrow(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You don't need to ReThrow() if you drop the TryCatch, the exception will simply bubble up.
(I believe the caller of CopyProperties() is doing that wrong, too.)
Thanks @bnoordhuis. Updated with your suggestions. |
if (!maybe_has.IsJust()) | ||
break; | ||
|
||
auto has = maybe_has.FromJust(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
tiny nit: I would be okay with just keeping the bool
type explicit, using auto
here doesn’t save any space and erases information that a reader of the code may find helpful.
@addaleax done. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thanks!
Tangential: CopyProperties() doesn't look very rigorous to me. GetOwnPropertyNames() returns only enumerable string properties; no symbols, no non-enumerable properties. Perhaps only enumerable makes some sense because you don't want to copy over globals like Array and Date. |
FYI: We made API changes upstream in V8, so CopyProperties() will go away soon. |
Can you add a regression test? |
@fhinkel what do you mean? I thought I did (see the other changed file) :-) |
So sorry, I must have completely missed that! LGTM. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
This commit prevents thrown JavaScript exceptions from crashing the process in node_contextify's CopyProperties() function. Fixes: nodejs#8537 PR-URL: nodejs#8649 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Franziska Hinkelmann <franziska.hinkelmann@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Ilkka Myller <ilkka.myller@nodefield.com> Reviewed-By: Michaël Zasso <targos@protonmail.com>
@cjihrig I've set this as do not land as proxies are not on v4.x Let me know if I'm mistaken here |
I think it would be good to back-port, it's not just proxies that can cause exceptions. |
This commit prevents thrown JavaScript exceptions from crashing the process in node_contextify's CopyProperties() function. Fixes: #8537 PR-URL: #8649 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Franziska Hinkelmann <franziska.hinkelmann@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Ilkka Myller <ilkka.myller@nodefield.com> Reviewed-By: Michaël Zasso <targos@protonmail.com>
Checklist
make -j4 test
(UNIX), orvcbuild test nosign
(Windows) passesAffected core subsystem(s)
src
Description of change
This commit prevents thrown JavaScript exceptions from crashing the process in
node_contextify
'sCopyProperties()
function.Closes #8537