diff --git a/tunsafe_wg_plugin.cpp b/tunsafe_wg_plugin.cpp index a873305..33ef486 100644 --- a/tunsafe_wg_plugin.cpp +++ b/tunsafe_wg_plugin.cpp @@ -171,6 +171,11 @@ class PluginPeer : public WgPeerExtraData { public: PluginPeer(TunsafePluginImpl *plugin, WgPeer *peer) : plugin(plugin), peer(peer), token_client_handler(this) {} ~PluginPeer(); + + virtual void OnPeerDestroy() override { + delete this; + } + WgPeer *peer; TunsafePluginImpl *plugin; TokenClientHandler token_client_handler; diff --git a/wireguard_proto.cpp b/wireguard_proto.cpp index 5d13fb8..2b97441 100644 --- a/wireguard_proto.cpp +++ b/wireguard_proto.cpp @@ -392,7 +392,8 @@ WgPeer::~WgPeer() { assert(curr_keypair_ == NULL && next_keypair_ == NULL && prev_keypair_ == NULL); assert(local_key_id_during_hs_ == 0); assert(first_queued_packet_ == NULL); - delete peer_extra_data_; + if (peer_extra_data_) + peer_extra_data_->OnPeerDestroy(); } void WgPeer::DelayedDelete(void *x) { diff --git a/wireguard_proto.h b/wireguard_proto.h index 6438003..f447cde 100644 --- a/wireguard_proto.h +++ b/wireguard_proto.h @@ -468,7 +468,8 @@ private: // Allows associating extradata with peers that can be used by plugins etc. class WgPeerExtraData { public: - virtual ~WgPeerExtraData() {} + // This is called when the peer is destroyed. + virtual void OnPeerDestroy() = 0; }; // State for peer