From d3f8f3a92b0abf5be5bad102a2650db9a06d3048 Mon Sep 17 00:00:00 2001 From: rexy712 Date: Fri, 25 Jun 2021 14:34:32 -0700 Subject: [PATCH] Fix incomplete move construction of SSLSocket. Add move constructor to Socket and TcpSocket --- include/frnetlib/SSLSocket.h | 2 +- include/frnetlib/Socket.h | 6 +++--- include/frnetlib/TcpSocket.h | 6 +++--- include/frnetlib/Util.h | 18 +++--------------- src/SSLSocket.cpp | 6 ++++-- src/Socket.cpp | 19 ++++++++++++++++++- src/TcpSocket.cpp | 15 ++++++++++++++- 7 files changed, 46 insertions(+), 26 deletions(-) diff --git a/include/frnetlib/SSLSocket.h b/include/frnetlib/SSLSocket.h index 303eb7c..3711538 100644 --- a/include/frnetlib/SSLSocket.h +++ b/include/frnetlib/SSLSocket.h @@ -23,7 +23,7 @@ namespace fr ~SSLSocket() override; SSLSocket(SSLSocket &&); SSLSocket(const SSLSocket &) = delete; - SSLSocket& operator=(SSLSocket &&); + SSLSocket &operator=(SSLSocket &&); void operator=(const SSLSocket &)=delete; /*! diff --git a/include/frnetlib/Socket.h b/include/frnetlib/Socket.h index 1660a36..fc20b2f 100644 --- a/include/frnetlib/Socket.h +++ b/include/frnetlib/Socket.h @@ -52,10 +52,10 @@ namespace fr }; Socket(); - Socket(Socket &&) =delete; + Socket(Socket &&); Socket(const Socket &) =delete; void operator=(const Socket &) =delete; - void operator=(Socket &&) =delete; + Socket &operator=(Socket &&); /*! * Converts an fr::Socket::Status value to a printable string @@ -314,4 +314,4 @@ namespace fr } -#endif //FRNETLIB_SOCKET_H \ No newline at end of file +#endif //FRNETLIB_SOCKET_H diff --git a/include/frnetlib/TcpSocket.h b/include/frnetlib/TcpSocket.h index 10d72ef..d79e562 100644 --- a/include/frnetlib/TcpSocket.h +++ b/include/frnetlib/TcpSocket.h @@ -16,9 +16,9 @@ namespace fr public: TcpSocket() noexcept; ~TcpSocket() override; - TcpSocket(TcpSocket &&) = delete; + TcpSocket(TcpSocket &&); TcpSocket(const TcpSocket &) = delete; - void operator=(TcpSocket &&)=delete; + TcpSocket &operator=(TcpSocket &&); void operator=(const TcpSocket &)=delete; /*! @@ -126,4 +126,4 @@ namespace fr } -#endif //FRNETLIB_TCPSOCKET_H \ No newline at end of file +#endif //FRNETLIB_TCPSOCKET_H diff --git a/include/frnetlib/Util.h b/include/frnetlib/Util.h index a76a2dd..54dae98 100644 --- a/include/frnetlib/Util.h +++ b/include/frnetlib/Util.h @@ -8,7 +8,6 @@ #include #include //size_t #include //memcpy, memset -#include //move namespace fr { @@ -29,22 +28,11 @@ namespace fr } } - constexpr mbedtls_ssl_config move_mbedtls_ssl_config(mbedtls_ssl_config &&src) + static inline mbedtls_ssl_config move_mbedtls_ssl_config(mbedtls_ssl_config &&src) { mbedtls_ssl_config retval = {}; - swap(retval.ciphersuite_list, src.ciphersuite_list); - swap(retval.p_dbg, src.p_dbg); - swap(retval.f_get_cache, src.f_get_cache); - swap(retval.f_set_cache, src.f_set_cache); - swap(retval.p_cache, src.p_cache); - retval.max_major_ver = src.max_major_ver; - retval.max_minor_ver = src.max_minor_ver; - retval.min_major_ver = src.min_major_ver; - retval.min_minor_ver = src.min_minor_ver; - retval.endpoint = src.endpoint; - retval.transport = src.transport; - retval.authmode = src.authmode; - retval.allow_legacy_renegotiation = src.allow_legacy_renegotiation; + memcpy(&retval, &src, sizeof(src)); + memset(&src, 0, sizeof(src)); return retval; } } diff --git a/src/SSLSocket.cpp b/src/SSLSocket.cpp index 8fe2952..84d4860 100644 --- a/src/SSLSocket.cpp +++ b/src/SSLSocket.cpp @@ -60,7 +60,8 @@ namespace fr } SSLSocket::SSLSocket(SSLSocket &&s) - : ssl_context(std::move(s.ssl_context)), + : Socket(std::move(s)), + ssl_context(std::move(s.ssl_context)), ssl_socket_descriptor(std::move(s.ssl_socket_descriptor)), ssl(std::move(s.ssl)), conf(move_mbedtls_ssl_config(std::move(s.conf))), @@ -68,8 +69,9 @@ namespace fr receive_timeout(s.receive_timeout), is_blocking(s.is_blocking){} - SSLSocket& SSLSocket::operator=(SSLSocket &&s) + SSLSocket &SSLSocket::operator=(SSLSocket &&s) { + Socket::operator=(std::move(s)); ssl_context = std::move(s.ssl_context); ssl_socket_descriptor = std::move(s.ssl_socket_descriptor); ssl = std::move(s.ssl); diff --git a/src/Socket.cpp b/src/Socket.cpp index 7fc3e1d..a274787 100644 --- a/src/Socket.cpp +++ b/src/Socket.cpp @@ -24,6 +24,23 @@ namespace fr init_wsa(); } + Socket::Socket(Socket &&s) + : fr_socket_remote_address(std::move(s.fr_socket_remote_address)), + ai_family(s.ai_family), + max_receive_size(s.max_receive_size), + socket_read_timeout(s.socket_read_timeout), + socket_write_timeout(s.socket_write_timeout){} + + Socket &Socket::operator=(Socket &&s) + { + fr_socket_remote_address = std::move(s.fr_socket_remote_address); + ai_family = s.ai_family; + max_receive_size = s.max_receive_size; + socket_read_timeout = s.socket_read_timeout; + socket_write_timeout = s.socket_write_timeout; + return *this; + } + Socket::Status Socket::send(const Sendable &obj) { if(!connected()) @@ -166,4 +183,4 @@ namespace fr { close_socket(); } -} \ No newline at end of file +} diff --git a/src/TcpSocket.cpp b/src/TcpSocket.cpp index f37abda..26ff5e5 100644 --- a/src/TcpSocket.cpp +++ b/src/TcpSocket.cpp @@ -17,11 +17,24 @@ namespace fr } + TcpSocket::TcpSocket(TcpSocket &&t) + : Socket(std::move(t)), + socket_descriptor(std::exchange(t.socket_descriptor, -1)), + is_blocking(t.is_blocking){} + TcpSocket::~TcpSocket() { TcpSocket::close_socket(); } + TcpSocket &TcpSocket::operator=(TcpSocket &&t) + { + Socket::operator=(std::move(t)); + std::swap(socket_descriptor, t.socket_descriptor); + is_blocking = t.is_blocking; + return *this; + } + Socket::Status TcpSocket::send_raw(const char *data, size_t size, size_t &sent) { while(sent < size) @@ -257,4 +270,4 @@ namespace fr } -} \ No newline at end of file +}