summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2017-10-14 13:02:02 +0200
committerAnna Henningsen <anna@addaleax.net>2017-10-18 11:29:45 +0200
commitb3f9b38174bd2fabd85055a456d06176000fc853 (patch)
tree52ee955fa7fcdfb5096ae271dbe0f7098f61b239 /src
parent19ab26189ea6ab91a943042f32f40558c6edb67a (diff)
downloadandroid-node-v8-b3f9b38174bd2fabd85055a456d06176000fc853.tar.gz
android-node-v8-b3f9b38174bd2fabd85055a456d06176000fc853.tar.bz2
android-node-v8-b3f9b38174bd2fabd85055a456d06176000fc853.zip
n-api: check against invalid handle scope usage
Fixes: https://github.com/nodejs/node/issues/16175 PR-URL: https://github.com/nodejs/node/pull/16201 Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/node_api.cc15
-rw-r--r--src/node_api_types.h3
2 files changed, 17 insertions, 1 deletions
diff --git a/src/node_api.cc b/src/node_api.cc
index ea9bcfb980..1c3d0915ad 100644
--- a/src/node_api.cc
+++ b/src/node_api.cc
@@ -42,6 +42,7 @@ struct napi_env__ {
v8::Persistent<v8::ObjectTemplate> function_data_template;
v8::Persistent<v8::ObjectTemplate> accessor_data_template;
napi_extended_error_info last_error;
+ int open_handle_scopes = 0;
};
#define ENV_OBJECT_TEMPLATE(env, prefix, destination, field_count) \
@@ -499,12 +500,16 @@ class CallbackWrapperBase : public CallbackWrapper {
// Make sure any errors encountered last time we were in N-API are gone.
napi_clear_last_error(env);
+ int open_handle_scopes = env->open_handle_scopes;
+
napi_value result = cb(env, cbinfo_wrapper);
if (result != nullptr) {
this->SetReturnValue(result);
}
+ CHECK_EQ(env->open_handle_scopes, open_handle_scopes);
+
if (!env->last_exception.IsEmpty()) {
isolate->ThrowException(
v8::Local<v8::Value>::New(isolate, env->last_exception));
@@ -2580,6 +2585,7 @@ napi_status napi_open_handle_scope(napi_env env, napi_handle_scope* result) {
*result = v8impl::JsHandleScopeFromV8HandleScope(
new v8impl::HandleScopeWrapper(env->isolate));
+ env->open_handle_scopes++;
return napi_clear_last_error(env);
}
@@ -2588,7 +2594,11 @@ napi_status napi_close_handle_scope(napi_env env, napi_handle_scope scope) {
// JS exceptions.
CHECK_ENV(env);
CHECK_ARG(env, scope);
+ if (env->open_handle_scopes == 0) {
+ return napi_handle_scope_mismatch;
+ }
+ env->open_handle_scopes--;
delete v8impl::V8HandleScopeFromJsHandleScope(scope);
return napi_clear_last_error(env);
}
@@ -2603,6 +2613,7 @@ napi_status napi_open_escapable_handle_scope(
*result = v8impl::JsEscapableHandleScopeFromV8EscapableHandleScope(
new v8impl::EscapableHandleScopeWrapper(env->isolate));
+ env->open_handle_scopes++;
return napi_clear_last_error(env);
}
@@ -2613,8 +2624,12 @@ napi_status napi_close_escapable_handle_scope(
// JS exceptions.
CHECK_ENV(env);
CHECK_ARG(env, scope);
+ if (env->open_handle_scopes == 0) {
+ return napi_handle_scope_mismatch;
+ }
delete v8impl::V8EscapableHandleScopeFromJsEscapableHandleScope(scope);
+ env->open_handle_scopes--;
return napi_clear_last_error(env);
}
diff --git a/src/node_api_types.h b/src/node_api_types.h
index 574cb6ff98..230c1f4ae3 100644
--- a/src/node_api_types.h
+++ b/src/node_api_types.h
@@ -69,7 +69,8 @@ typedef enum {
napi_generic_failure,
napi_pending_exception,
napi_cancelled,
- napi_escape_called_twice
+ napi_escape_called_twice,
+ napi_handle_scope_mismatch
} napi_status;
typedef napi_value (*napi_callback)(napi_env env,