diff options
author | Anna Henningsen <anna@addaleax.net> | 2017-10-14 13:02:02 +0200 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2017-10-18 11:29:45 +0200 |
commit | b3f9b38174bd2fabd85055a456d06176000fc853 (patch) | |
tree | 52ee955fa7fcdfb5096ae271dbe0f7098f61b239 /src | |
parent | 19ab26189ea6ab91a943042f32f40558c6edb67a (diff) | |
download | android-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.cc | 15 | ||||
-rw-r--r-- | src/node_api_types.h | 3 |
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, |