Skip to content

Commit 858942c

Browse files
chearonmhdawson
authored andcommitted
src: avoid calling into C++ with a null this
Avoid calling into C++ with a null this when exceptions are off PR-URL: #1313 Reviewed-By: Gabriel Schulhof <gabrielschulhof@gmail.com> Reviewed-By: Chengzhong Wu <legendecas@gmail.com> Reviewed-By: Michael Dawson <midawson@redhat.com
1 parent 64f6515 commit 858942c

File tree

2 files changed

+16
-7
lines changed

2 files changed

+16
-7
lines changed

napi-inl.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ napi_value TemplatedInstanceCallback(napi_env env,
165165
return details::WrapCallback([&] {
166166
CallbackInfo cbInfo(env, info);
167167
T* instance = T::Unwrap(cbInfo.This().As<Object>());
168-
return (instance->*UnwrapCallback)(cbInfo);
168+
return instance ? (instance->*UnwrapCallback)(cbInfo) : Napi::Value();
169169
});
170170
}
171171

@@ -175,7 +175,7 @@ napi_value TemplatedInstanceVoidCallback(napi_env env, napi_callback_info info)
175175
return details::WrapCallback([&] {
176176
CallbackInfo cbInfo(env, info);
177177
T* instance = T::Unwrap(cbInfo.This().As<Object>());
178-
(instance->*UnwrapCallback)(cbInfo);
178+
if (instance) (instance->*UnwrapCallback)(cbInfo);
179179
return nullptr;
180180
});
181181
}
@@ -4356,7 +4356,7 @@ inline napi_value InstanceWrap<T>::InstanceVoidMethodCallbackWrapper(
43564356
callbackInfo.SetData(callbackData->data);
43574357
T* instance = T::Unwrap(callbackInfo.This().As<Object>());
43584358
auto cb = callbackData->callback;
4359-
(instance->*cb)(callbackInfo);
4359+
if (instance) (instance->*cb)(callbackInfo);
43604360
return nullptr;
43614361
});
43624362
}
@@ -4371,7 +4371,7 @@ inline napi_value InstanceWrap<T>::InstanceMethodCallbackWrapper(
43714371
callbackInfo.SetData(callbackData->data);
43724372
T* instance = T::Unwrap(callbackInfo.This().As<Object>());
43734373
auto cb = callbackData->callback;
4374-
return (instance->*cb)(callbackInfo);
4374+
return instance ? (instance->*cb)(callbackInfo) : Napi::Value();
43754375
});
43764376
}
43774377

@@ -4385,7 +4385,7 @@ inline napi_value InstanceWrap<T>::InstanceGetterCallbackWrapper(
43854385
callbackInfo.SetData(callbackData->data);
43864386
T* instance = T::Unwrap(callbackInfo.This().As<Object>());
43874387
auto cb = callbackData->getterCallback;
4388-
return (instance->*cb)(callbackInfo);
4388+
return instance ? (instance->*cb)(callbackInfo) : Napi::Value();
43894389
});
43904390
}
43914391

@@ -4399,7 +4399,7 @@ inline napi_value InstanceWrap<T>::InstanceSetterCallbackWrapper(
43994399
callbackInfo.SetData(callbackData->data);
44004400
T* instance = T::Unwrap(callbackInfo.This().As<Object>());
44014401
auto cb = callbackData->setterCallback;
4402-
(instance->*cb)(callbackInfo, callbackInfo[0]);
4402+
if (instance) (instance->*cb)(callbackInfo, callbackInfo[0]);
44034403
return nullptr;
44044404
});
44054405
}
@@ -4411,7 +4411,7 @@ inline napi_value InstanceWrap<T>::WrappedMethod(
44114411
return details::WrapCallback([&] {
44124412
const CallbackInfo cbInfo(env, info);
44134413
T* instance = T::Unwrap(cbInfo.This().As<Object>());
4414-
(instance->*method)(cbInfo, cbInfo[0]);
4414+
if (instance) (instance->*method)(cbInfo, cbInfo[0]);
44154415
return nullptr;
44164416
});
44174417
}

test/objectwrap.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ async function test (binding) {
2424
obj.testSetter = 'instance getter 2';
2525
assert.strictEqual(obj.testGetter, 'instance getter 2');
2626
assert.strictEqual(obj.testGetterT, 'instance getter 2');
27+
28+
assert.throws(() => clazz.prototype.testGetter, /Invalid argument/);
29+
assert.throws(() => clazz.prototype.testGetterT, /Invalid argument/);
2730
}
2831

2932
// read write-only
@@ -61,6 +64,9 @@ async function test (binding) {
6164

6265
obj.testGetSetT = 'instance getset 4';
6366
assert.strictEqual(obj.testGetSetT, 'instance getset 4');
67+
68+
assert.throws(() => { clazz.prototype.testGetSet = 'instance getset'; }, /Invalid argument/);
69+
assert.throws(() => { clazz.prototype.testGetSetT = 'instance getset'; }, /Invalid argument/);
6470
}
6571

6672
// rw symbol
@@ -98,6 +104,9 @@ async function test (binding) {
98104
assert.strictEqual(obj.testMethodT(), 'method<>(const char*)');
99105
obj[clazz.kTestVoidMethodTInternal]('method<>(Symbol)');
100106
assert.strictEqual(obj[clazz.kTestMethodTInternal](), 'method<>(Symbol)');
107+
assert.throws(() => clazz.prototype.testMethod('method'));
108+
assert.throws(() => clazz.prototype.testMethodT());
109+
assert.throws(() => clazz.prototype.testVoidMethodT('method<>(const char*)'));
101110
};
102111

103112
const testEnumerables = (obj, clazz) => {

0 commit comments

Comments
 (0)