From 9dd02953eec209187d1d9c8caa083ff5d14d05a8 Mon Sep 17 00:00:00 2001 From: Andrew Snyder Date: Mon, 21 Oct 2024 14:43:24 -0400 Subject: [PATCH 1/2] remove static cast with undefined behavior --- napi-inl.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/napi-inl.h b/napi-inl.h index c3034e299..3d7678768 100644 --- a/napi-inl.h +++ b/napi-inl.h @@ -4583,11 +4583,10 @@ inline ObjectWrap::ObjectWrap(const Napi::CallbackInfo& callbackInfo) { napi_value wrapper = callbackInfo.This(); napi_status status; napi_ref ref; - T* instance = static_cast(this); - status = napi_wrap(env, wrapper, instance, FinalizeCallback, nullptr, &ref); + status = napi_wrap(env, wrapper, this, FinalizeCallback, nullptr, &ref); NAPI_THROW_IF_FAILED_VOID(env, status); - Reference* instanceRef = instance; + Reference* instanceRef = this; *instanceRef = Reference(env, ref); } From 96a180d30736ac62e0c49155f611ebe371ce0b1c Mon Sep 17 00:00:00 2001 From: Andrew Snyder Date: Tue, 22 Oct 2024 10:50:03 -0400 Subject: [PATCH 2/2] needed to multipl inheritance --- napi-inl.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/napi-inl.h b/napi-inl.h index 3d7678768..864f3a4fb 100644 --- a/napi-inl.h +++ b/napi-inl.h @@ -4576,17 +4576,18 @@ inline napi_value InstanceWrap::WrappedMethod( //////////////////////////////////////////////////////////////////////////////// // ObjectWrap class //////////////////////////////////////////////////////////////////////////////// - template -inline ObjectWrap::ObjectWrap(const Napi::CallbackInfo& callbackInfo) { +inline ObjectWrap::ObjectWrap(const Napi::CallbackInfo& callbackInfo) + __attribute__((no_sanitize("vptr"))) { napi_env env = callbackInfo.Env(); napi_value wrapper = callbackInfo.This(); napi_status status; napi_ref ref; - status = napi_wrap(env, wrapper, this, FinalizeCallback, nullptr, &ref); + T* instance = static_cast(this); + status = napi_wrap(env, wrapper, instance, FinalizeCallback, nullptr, &ref); NAPI_THROW_IF_FAILED_VOID(env, status); - Reference* instanceRef = this; + Reference* instanceRef = instance; *instanceRef = Reference(env, ref); }