Skip to content

Commit

Permalink
Backport of #4319 && Partial backport of #4300
Browse files Browse the repository at this point in the history
* Protect asio exception hotfix (#4527)

* Refs #20599: Handle error code before function call

Signed-off-by: cferreiragonz <carlosferreira@eprosima.com>

* Apply suggestion

Co-authored-by: Miguel Company <miguelcompany@eprosima.com>

---------

Signed-off-by: cferreiragonz <carlosferreira@eprosima.com>
Co-authored-by: Miguel Company <miguelcompany@eprosima.com>
(cherry picked from commit 08193d5)

* Backport of #4319 && Partial backport of #4300

Signed-off-by: cferreiragonz <carlosferreira@eprosima.com>

---------

Signed-off-by: cferreiragonz <carlosferreira@eprosima.com>
Co-authored-by: Carlos Ferreira González <carlosferreira@eprosima.com>
  • Loading branch information
mergify[bot] and cferreiragonz committed Apr 4, 2024
1 parent 56fd8c3 commit f2e0bc1
Show file tree
Hide file tree
Showing 9 changed files with 109 additions and 13 deletions.
26 changes: 26 additions & 0 deletions src/cpp/rtps/transport/TCPChannelResource.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,10 +130,36 @@ class TCPChannelResource : public ChannelResource
size_t size,
asio::error_code& ec) = 0;

/**
* @brief Gets the remote endpoint of the socket connection.
* @throws Exception on failure.
* @return asio::ip::tcp::endpoint of the remote endpoint.
*/
virtual asio::ip::tcp::endpoint remote_endpoint() const = 0;

/**
* @brief Gets the local endpoint of the socket connection.
* @throws Exception on failure.
* @return asio::ip::tcp::endpoint of the local endpoint.
*/
virtual asio::ip::tcp::endpoint local_endpoint() const = 0;

/**
* @brief Gets the remote endpoint, setting error code if any.
* @param ec Set to indicate what error occurred, if any.
* @return asio::ip::tcp::endpoint of the remote endpoint or returns a default-constructed endpoint object if an error occurred.
*/
virtual asio::ip::tcp::endpoint remote_endpoint(
asio::error_code& ec) const = 0;

/**
* @brief Gets the local endpoint, setting error code if any.
* @param ec Set to indicate what error occurred, if any.
* @return asio::ip::tcp::endpoint of the remote endpoint or returns a default-constructed endpoint object if an error occurred.
*/
virtual asio::ip::tcp::endpoint local_endpoint(
asio::error_code& ec) const = 0;

virtual void set_options(
const TCPTransportDescriptor* options) = 0;

Expand Down
13 changes: 12 additions & 1 deletion src/cpp/rtps/transport/TCPChannelResourceBasic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,18 @@ asio::ip::tcp::endpoint TCPChannelResourceBasic::remote_endpoint() const

asio::ip::tcp::endpoint TCPChannelResourceBasic::local_endpoint() const
{
std::error_code ec;
return socket_->local_endpoint();
}

asio::ip::tcp::endpoint TCPChannelResourceBasic::remote_endpoint(
asio::error_code& ec) const
{
return socket_->remote_endpoint(ec);
}

asio::ip::tcp::endpoint TCPChannelResourceBasic::local_endpoint(
asio::error_code& ec) const
{
return socket_->local_endpoint(ec);
}

Expand Down
7 changes: 7 additions & 0 deletions src/cpp/rtps/transport/TCPChannelResourceBasic.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,16 @@ class TCPChannelResourceBasic : public TCPChannelResource
size_t size,
asio::error_code& ec) override;

// Throwing asio calls
asio::ip::tcp::endpoint remote_endpoint() const override;
asio::ip::tcp::endpoint local_endpoint() const override;

// Non-throwing asio calls
asio::ip::tcp::endpoint remote_endpoint(
asio::error_code& ec) const override;
asio::ip::tcp::endpoint local_endpoint(
asio::error_code& ec) const override;

void set_options(
const TCPTransportDescriptor* options) override;

Expand Down
12 changes: 12 additions & 0 deletions src/cpp/rtps/transport/TCPChannelResourceSecure.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,18 @@ asio::ip::tcp::endpoint TCPChannelResourceSecure::local_endpoint() const
return secure_socket_->lowest_layer().local_endpoint();
}

asio::ip::tcp::endpoint TCPChannelResourceSecure::remote_endpoint(
asio::error_code& ec) const
{
return secure_socket_->lowest_layer().remote_endpoint(ec);
}

asio::ip::tcp::endpoint TCPChannelResourceSecure::local_endpoint(
asio::error_code& ec) const
{
return secure_socket_->lowest_layer().local_endpoint(ec);
}

void TCPChannelResourceSecure::set_options(
const TCPTransportDescriptor* options)
{
Expand Down
7 changes: 7 additions & 0 deletions src/cpp/rtps/transport/TCPChannelResourceSecure.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,16 @@ class TCPChannelResourceSecure : public TCPChannelResource
size_t size,
asio::error_code& ec) override;

// Throwing asio calls
asio::ip::tcp::endpoint remote_endpoint() const override;
asio::ip::tcp::endpoint local_endpoint() const override;

// Non-throwing asio calls
asio::ip::tcp::endpoint remote_endpoint(
asio::error_code& ec) const override;
asio::ip::tcp::endpoint local_endpoint(
asio::error_code& ec) const override;

void set_options(
const TCPTransportDescriptor* options) override;

Expand Down
23 changes: 11 additions & 12 deletions src/cpp/rtps/transport/TCPTransportInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -225,8 +225,6 @@ void TCPTransportInterface::clean()
}
}

<<<<<<< HEAD
=======
Locator TCPTransportInterface::remote_endpoint_to_locator(
const std::shared_ptr<TCPChannelResource>& channel) const
{
Expand Down Expand Up @@ -261,7 +259,6 @@ Locator TCPTransportInterface::local_endpoint_to_locator(
return locator;
}

>>>>>>> 08193d5f7 (Protect asio exception hotfix (#4527))
void TCPTransportInterface::bind_socket(
std::shared_ptr<TCPChannelResource>& channel)
{
Expand Down Expand Up @@ -911,10 +908,11 @@ void TCPTransportInterface::perform_listen_operation(
if (rtcp_message_manager)
{
channel = channel_weak.lock();
endpoint_to_locator(channel->remote_endpoint(), remote_locator);

if (channel)
{
remote_locator = remote_endpoint_to_locator(channel);

if (channel->tcp_connection_type() == TCPChannelResource::TCPConnectionType::TCP_CONNECT_TYPE)
{
rtcp_message_manager->sendConnectionRequest(channel);
Expand Down Expand Up @@ -1182,6 +1180,11 @@ bool TCPTransportInterface::Receive(
}
else
{
if (!IsLocatorValid(remote_locator))
{
remote_locator = remote_endpoint_to_locator(channel);
}

IPLocator::setLogicalPort(remote_locator, tcp_header.logical_port);
logInfo(RTCP_MSG_IN, "[RECEIVE] From: " << remote_locator \
<< " - " << receive_buffer_size << " bytes.");
Expand Down Expand Up @@ -1399,10 +1402,8 @@ void TCPTransportInterface::SocketAccepted(
channel_weak_ptr, rtcp_manager_weak_ptr));

logInfo(RTCP, "Accepted connection (local: "
<< channel->local_endpoint().address() << ":"
<< channel->local_endpoint().port() << "), remote: "
<< channel->remote_endpoint().address() << ":"
<< channel->remote_endpoint().port() << ")");
<< local_endpoint_to_locator(channel) << ", remote: "
<< remote_endpoint_to_locator(channel) << ")");
}
else
{
Expand Down Expand Up @@ -1447,10 +1448,8 @@ void TCPTransportInterface::SecureSocketAccepted(
channel_weak_ptr, rtcp_manager_weak_ptr));

logInfo(RTCP, " Accepted connection (local: "
<< socket->lowest_layer().local_endpoint().address() << ":"
<< socket->lowest_layer().local_endpoint().port() << "), remote: "
<< socket->lowest_layer().remote_endpoint().address() << ":"
<< socket->lowest_layer().remote_endpoint().port() << ")");
<< local_endpoint_to_locator(secure_channel) << ", remote: "
<< remote_endpoint_to_locator(secure_channel) << ")");
}
else
{
Expand Down
12 changes: 12 additions & 0 deletions src/cpp/rtps/transport/TCPTransportInterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,18 @@ class TCPTransportInterface : public TransportInterface
const asio::ip::tcp::endpoint& endpoint,
Locator& locator) const = 0;

/**
* Converts a remote endpoint to a locator if possible. Otherwise, it sets an invalid locator.
*/
Locator remote_endpoint_to_locator(
const std::shared_ptr<TCPChannelResource>& channel) const;

/**
* Converts a local endpoint to a locator if possible. Otherwise, it sets an invalid locator.
*/
Locator local_endpoint_to_locator(
const std::shared_ptr<TCPChannelResource>& channel) const;

/**
* Shutdown method to close the connections of the transports.
*/
Expand Down
16 changes: 16 additions & 0 deletions test/unittest/transport/mock/MockTCPChannelResource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,22 @@ asio::ip::tcp::endpoint MockTCPChannelResource::local_endpoint() const
return ep;
}

asio::ip::tcp::endpoint MockTCPChannelResource::remote_endpoint(
asio::error_code& ec) const
{
ec = asio::error_code(); // Indicate no error
asio::ip::tcp::endpoint ep;
return ep;
}

asio::ip::tcp::endpoint MockTCPChannelResource::local_endpoint(
asio::error_code& ec) const
{
ec = asio::error_code(); // Indicate no error
asio::ip::tcp::endpoint ep;
return ep;
}

void MockTCPChannelResource::set_options(
const TCPTransportDescriptor*)
{
Expand Down
6 changes: 6 additions & 0 deletions test/unittest/transport/mock/MockTCPChannelResource.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,12 @@ class MockTCPChannelResource : public TCPChannelResource

asio::ip::tcp::endpoint local_endpoint() const override;

asio::ip::tcp::endpoint remote_endpoint(
asio::error_code& ec) const override;

asio::ip::tcp::endpoint local_endpoint(
asio::error_code& ec) const override;

void set_options(
const TCPTransportDescriptor* options) override;

Expand Down

0 comments on commit f2e0bc1

Please sign in to comment.