`WrapperInfo` casts pointer in JS object's internal field to
`AsyncWrap`. This approach fails miserably for `TLSWrap` because it was
inhereted from the `StreamBase` first, creating different kind of
`vtable` for the whole class.
Reorder parent classes to put `AsyncWrap` first.
Fix: https://github.com/nodejs/node/issues/4250
PR-URL: https://github.com/nodejs/node/pull/4268
Reviewed-By: James M Snell <jasnell@gmail.com>
Kind kind,
StreamBase* stream,
SecureContext* sc)
- : SSLWrap<TLSWrap>(env, sc, kind),
- StreamBase(env),
- AsyncWrap(env,
+ : AsyncWrap(env,
env->tls_wrap_constructor_function()->NewInstance(),
AsyncWrap::PROVIDER_TLSWRAP),
+ SSLWrap<TLSWrap>(env, sc, kind),
+ StreamBase(env),
sc_(sc),
stream_(stream),
enc_in_(nullptr),
class SecureContext;
}
-class TLSWrap : public crypto::SSLWrap<TLSWrap>,
- public StreamBase,
- public AsyncWrap {
+class TLSWrap : public AsyncWrap,
+ public crypto::SSLWrap<TLSWrap>,
+ public StreamBase {
public:
~TLSWrap() override;