Skip to content

Commit 5de212a

Browse files
committed
src: Avoid calling into C++ with a null this
when exceptions are off
1 parent 0e34f22 commit 5de212a

File tree

2 files changed

+18
-7
lines changed

2 files changed

+18
-7
lines changed

napi-inl.h

+7-7
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) : nullptr;
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
}
@@ -4340,7 +4340,7 @@ inline napi_value InstanceWrap<T>::InstanceVoidMethodCallbackWrapper(
43404340
callbackInfo.SetData(callbackData->data);
43414341
T* instance = T::Unwrap(callbackInfo.This().As<Object>());
43424342
auto cb = callbackData->callback;
4343-
(instance->*cb)(callbackInfo);
4343+
if (instance) (instance->*cb)(callbackInfo);
43444344
return nullptr;
43454345
});
43464346
}
@@ -4355,7 +4355,7 @@ inline napi_value InstanceWrap<T>::InstanceMethodCallbackWrapper(
43554355
callbackInfo.SetData(callbackData->data);
43564356
T* instance = T::Unwrap(callbackInfo.This().As<Object>());
43574357
auto cb = callbackData->callback;
4358-
return (instance->*cb)(callbackInfo);
4358+
return instance ? (instance->*cb)(callbackInfo) : nullptr;
43594359
});
43604360
}
43614361

@@ -4369,7 +4369,7 @@ inline napi_value InstanceWrap<T>::InstanceGetterCallbackWrapper(
43694369
callbackInfo.SetData(callbackData->data);
43704370
T* instance = T::Unwrap(callbackInfo.This().As<Object>());
43714371
auto cb = callbackData->getterCallback;
4372-
return (instance->*cb)(callbackInfo);
4372+
return instance ? (instance->*cb)(callbackInfo) : nullptr;
43734373
});
43744374
}
43754375

@@ -4383,7 +4383,7 @@ inline napi_value InstanceWrap<T>::InstanceSetterCallbackWrapper(
43834383
callbackInfo.SetData(callbackData->data);
43844384
T* instance = T::Unwrap(callbackInfo.This().As<Object>());
43854385
auto cb = callbackData->setterCallback;
4386-
(instance->*cb)(callbackInfo, callbackInfo[0]);
4386+
if (instance) (instance->*cb)(callbackInfo, callbackInfo[0]);
43874387
return nullptr;
43884388
});
43894389
}
@@ -4395,7 +4395,7 @@ inline napi_value InstanceWrap<T>::WrappedMethod(
43954395
return details::WrapCallback([&] {
43964396
const CallbackInfo cbInfo(env, info);
43974397
T* instance = T::Unwrap(cbInfo.This().As<Object>());
4398-
(instance->*method)(cbInfo, cbInfo[0]);
4398+
if (instance) (instance->*method)(cbInfo, cbInfo[0]);
43994399
return nullptr;
44004400
});
44014401
}

test/objectwrap.js

+11
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ 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+
// eslint-disable-next-line no-unused-expressions
29+
try { clazz.prototype.testGetter; } catch (e) { }
30+
// eslint-disable-next-line no-unused-expressions
31+
try { clazz.prototype.testGetterT; } catch (e) { }
2732
}
2833

2934
// read write-only
@@ -61,6 +66,9 @@ async function test (binding) {
6166

6267
obj.testGetSetT = 'instance getset 4';
6368
assert.strictEqual(obj.testGetSetT, 'instance getset 4');
69+
70+
try { clazz.prototype.testGetSet = 'instance getset'; } catch (e) { }
71+
try { clazz.prototype.testGetSetT = 'instance getset'; } catch (e) { }
6472
}
6573

6674
// rw symbol
@@ -98,6 +106,9 @@ async function test (binding) {
98106
assert.strictEqual(obj.testMethodT(), 'method<>(const char*)');
99107
obj[clazz.kTestVoidMethodTInternal]('method<>(Symbol)');
100108
assert.strictEqual(obj[clazz.kTestMethodTInternal](), 'method<>(Symbol)');
109+
try { clazz.prototype.testMethod('method'); } catch (e) { }
110+
try { clazz.prototype.testMethodT(); } catch (e) { }
111+
try { clazz.prototype.testVoidMethodT('method<>(const char*)'); } catch (e) { }
101112
};
102113

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

0 commit comments

Comments
 (0)