From 11b0869b7f4cf4910d33ecc1c9984f13a22b6537 Mon Sep 17 00:00:00 2001 From: Lev Stipakov Date: Thu, 21 Apr 2022 17:37:27 +0300 Subject: [PATCH] dco-win: improve stability Add missing halt etc checks. Replace dco_error with fatal exception ErrorCode(TUN_SETUP_FAILED). IOCTL commands are not expected to fail and of they do, threat it as fatal error. Signed-off-by: Lev Stipakov --- openvpn/dco/dcocli.hpp | 2 -- openvpn/dco/ovpndcowincli.hpp | 17 ++++++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/openvpn/dco/dcocli.hpp b/openvpn/dco/dcocli.hpp index ee3a6fdd..5ac31be3 100644 --- a/openvpn/dco/dcocli.hpp +++ b/openvpn/dco/dcocli.hpp @@ -67,8 +67,6 @@ enum { OVPN_PEER_ID_UNDEF = 0x00FFFFFF, }; -OPENVPN_EXCEPTION(dco_error); - class ClientConfig : public DCO, public TransportClientFactory, public TunClientFactory { diff --git a/openvpn/dco/ovpndcowincli.hpp b/openvpn/dco/ovpndcowincli.hpp index d945e343..83a4e818 100644 --- a/openvpn/dco/ovpndcowincli.hpp +++ b/openvpn/dco/ovpndcowincli.hpp @@ -184,10 +184,13 @@ protected: buf_.mutable_buffer_clamp(), [self = Ptr(this)](const openvpn_io::error_code &error, const size_t bytes_recvd) { + if (self->halt) + return; if (!error) { self->buf_.set_size(bytes_recvd); self->transport_parent->transport_recv(self->buf_); - self->queue_read_(); + if (!self->halt) + self->queue_read_(); } else if (!self->halt) { self->stop_(); self->transport_parent->transport_error(Error::TRANSPORT_ERROR, @@ -214,7 +217,8 @@ protected: std::ostringstream os; halt = true; async_resolve_cancel(); - tun_setup_->destroy(os); + if (tun_setup_) + tun_setup_->destroy(os); handle_.reset(); OPENVPN_LOG_STRING(os.str()); } @@ -298,8 +302,7 @@ protected: void add_crypto_(const CryptoDCInstance::RekeyType type, const KoRekey::KeyConfig *kc) { if (kc->cipher_alg != OVPN_CIPHER_ALG_AES_GCM) { - OPENVPN_LOG("unsupported cipher for DCO"); - throw dco_error(); + throw ErrorCode(Error::TUN_SETUP_FAILED, true, "unsupported cipher for DCO"); } OVPN_CRYPTO_DATA data; @@ -360,9 +363,9 @@ protected: ov->complete(error, 0); } - OPENVPN_LOG("DeviceIoControl(" << code_str.at(code) << ")" - << " failed with code " << error_code); - throw dco_error(); + std::ostringstream os; + os << "DeviceIoControl(" << code_str.at(code) << ")" << " failed with code " << error_code; + throw ErrorCode(Error::TUN_SETUP_FAILED, true, os.str()); } return ERROR_SUCCESS; }