Skip to content

Commit

Permalink
bug fix: tester's Segmentation fault
Browse files Browse the repository at this point in the history
  • Loading branch information
cnbatch committed Jan 12, 2025
1 parent 287fa51 commit 10b8fa1
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 17 deletions.
14 changes: 10 additions & 4 deletions src/modes/tester.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,9 @@ void test_mode::data_sender(kcp_mappings *kcp_mappings_ptr, std::unique_ptr<uint
std::shared_ptr<forwarder> egress_forwarder = std::atomic_load(&(kcp_mappings_ptr->egress_forwarder));
if (egress_forwarder == nullptr || !error_message.empty() || cipher_size == 0)
return;
std::shared_ptr<udp::endpoint> egress_target_endpoint = std::atomic_load(&(kcp_mappings_ptr->egress_target_endpoint));
egress_forwarder->async_send_out(std::move(new_buffer), cipher_size, *egress_target_endpoint);
//std::shared_ptr<udp::endpoint> egress_target_endpoint_ptr = std::atomic_load(&(kcp_mappings_ptr->egress_target_endpoint));
udp::endpoint egress_target_endpoint = *std::atomic_load(&(kcp_mappings_ptr->egress_target_endpoint));
egress_forwarder->async_send_out(std::move(new_buffer), cipher_size, egress_target_endpoint);
}

std::unique_ptr<udp::endpoint> test_mode::get_udp_target(std::shared_ptr<forwarder> target_connector, size_t index)
Expand Down Expand Up @@ -262,16 +263,21 @@ void test_mode::handshake_test_failure(kcp_mappings *handshake_ptr)
void test_mode::handshake_test_cleanup(kcp_mappings *handshake_ptr)
{
std::shared_ptr<forwarder> egress_forwarder = std::atomic_load(&(handshake_ptr->egress_forwarder));
#if __GNUC__ == 12 && __GNUC_MINOR__ < 3
handshake_ptr->egress_forwarder.store(nullptr);
#else
handshake_ptr->egress_forwarder = nullptr;
#endif
egress_forwarder->remove_callback();
egress_forwarder->stop();

std::scoped_lock lock_handshake{ mutex_handshakes };
std::unique_lock lock_handshake{ mutex_handshakes };
auto session_iter = handshakes.find(handshake_ptr);
if (session_iter == handshakes.end())
return;
if (session_iter->second != nullptr)
kcp_updater.remove(handshake_ptr->egress_kcp);
handshakes.erase(session_iter);
lock_handshake.unlock();
}

void test_mode::handle_handshake(std::shared_ptr<KCP::KCP> kcp_ptr, std::unique_ptr<uint8_t[]> data, size_t data_size, udp::endpoint peer, asio::ip::port_type local_port_number)
Expand Down
26 changes: 13 additions & 13 deletions src/networks/connections.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -639,25 +639,25 @@ struct kcp_mappings : public std::enable_shared_from_this<kcp_mappings>
{
protocol_type connection_protocol;
#ifdef __cpp_lib_atomic_shared_ptr
std::atomic<std::shared_ptr<udp::endpoint>> ingress_source_endpoint;
std::atomic<std::shared_ptr<udp::endpoint>> egress_target_endpoint;
std::atomic<std::shared_ptr<udp::endpoint>> egress_previous_target_endpoint;
alignas(64) std::atomic<std::shared_ptr<udp::endpoint>> ingress_source_endpoint;
alignas(64) std::atomic<std::shared_ptr<udp::endpoint>> egress_target_endpoint;
alignas(64) std::atomic<std::shared_ptr<udp::endpoint>> egress_previous_target_endpoint;
#else
std::shared_ptr<udp::endpoint> ingress_source_endpoint;
std::shared_ptr<udp::endpoint> egress_target_endpoint;
std::shared_ptr<udp::endpoint> egress_previous_target_endpoint;
alignas(64) std::shared_ptr<udp::endpoint> ingress_source_endpoint;
alignas(64) std::shared_ptr<udp::endpoint> egress_target_endpoint;
alignas(64) std::shared_ptr<udp::endpoint> egress_previous_target_endpoint;
#endif
std::atomic<size_t> egress_endpoint_index;
std::shared_ptr<KCP::KCP> ingress_kcp;
std::shared_ptr<KCP::KCP> egress_kcp;
alignas(64) std::atomic<size_t> egress_endpoint_index;
alignas(64) std::shared_ptr<KCP::KCP> ingress_kcp;
alignas(64) std::shared_ptr<KCP::KCP> egress_kcp;
alignas(64) std::atomic<udp_server *> ingress_listener;
#ifdef __cpp_lib_atomic_shared_ptr
std::atomic<std::shared_ptr<forwarder>> egress_forwarder;
alignas(64) std::atomic<std::shared_ptr<forwarder>> egress_forwarder;
#else
std::shared_ptr<forwarder> egress_forwarder;
alignas(64) std::shared_ptr<forwarder> egress_forwarder;
#endif
std::shared_ptr<tcp_session> local_tcp;
std::shared_ptr<udp_client> local_udp;
alignas(64) std::shared_ptr<tcp_session> local_tcp;
alignas(64) std::shared_ptr<udp_client> local_udp;
alignas(64) std::atomic<int64_t> handshake_setup_time;
alignas(64) std::atomic<int64_t> last_data_transfer_time;
alignas(64) std::atomic<int64_t> hopping_timestamp;
Expand Down

0 comments on commit 10b8fa1

Please sign in to comment.