Fix incomplete move construction of SSLSocket. Add move constructor to Socket and TcpSocket

This commit is contained in:
rexy712 2021-06-25 14:34:32 -07:00
parent c97280d190
commit d3f8f3a92b
7 changed files with 46 additions and 26 deletions

View File

@ -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;
/*!

View File

@ -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
#endif //FRNETLIB_SOCKET_H

View File

@ -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
#endif //FRNETLIB_TCPSOCKET_H

View File

@ -8,7 +8,6 @@
#include <mbedtls/ssl.h>
#include <cstdlib> //size_t
#include <cstring> //memcpy, memset
#include <utility> //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;
}
}

View File

@ -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);

View File

@ -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();
}
}
}

View File

@ -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
}
}
}