From b37a999274e8d2bb4110c545247397c6bcdd9989 Mon Sep 17 00:00:00 2001 From: DcruBro Date: Thu, 13 Nov 2025 15:43:46 +0100 Subject: [PATCH] Fixed crash trigger on Ctrl+C (errno == EINTR check) --- .../columnlynx/client/net/tcp/tcp_client.hpp | 3 +- .../columnlynx/client/net/udp/udp_client.hpp | 5 ++- panic_dump.txt | 1 - src/client/main.cpp | 38 ++++++++----------- src/client/net/udp/udp_client.cpp | 1 + src/common/virtual_interface.cpp | 6 ++- src/server/main.cpp | 2 - 7 files changed, 28 insertions(+), 28 deletions(-) delete mode 100644 panic_dump.txt diff --git a/include/columnlynx/client/net/tcp/tcp_client.hpp b/include/columnlynx/client/net/tcp/tcp_client.hpp index 965b7fc..820f534 100644 --- a/include/columnlynx/client/net/tcp/tcp_client.hpp +++ b/include/columnlynx/client/net/tcp/tcp_client.hpp @@ -40,7 +40,8 @@ namespace ColumnLynx::Net::TCP { mInsecureMode(insecureMode), mHeartbeatTimer(mSocket.get_executor()), mLastHeartbeatReceived(std::chrono::steady_clock::now()), - mLastHeartbeatSent(std::chrono::steady_clock::now()) + mLastHeartbeatSent(std::chrono::steady_clock::now()), + mTun(tun) {} void start(); diff --git a/include/columnlynx/client/net/udp/udp_client.hpp b/include/columnlynx/client/net/udp/udp_client.hpp index eddaec9..3eed06e 100644 --- a/include/columnlynx/client/net/udp/udp_client.hpp +++ b/include/columnlynx/client/net/udp/udp_client.hpp @@ -20,7 +20,10 @@ namespace ColumnLynx::Net::UDP { std::array* aesKeyRef, uint64_t* sessionIDRef, std::shared_ptr tunRef = nullptr) - : mSocket(ioContext), mResolver(ioContext), mHost(host), mPort(port), mAesKeyRef(aesKeyRef), mSessionIDRef(sessionIDRef), mTunRef(tunRef) { mStartReceive(); } + : mSocket(ioContext), mResolver(ioContext), mHost(host), mPort(port), mAesKeyRef(aesKeyRef), mSessionIDRef(sessionIDRef), mTunRef(tunRef) + { + mStartReceive(); + } void start(); void sendMessage(const std::string& data = ""); diff --git a/panic_dump.txt b/panic_dump.txt deleted file mode 100644 index 851c75c..0000000 --- a/panic_dump.txt +++ /dev/null @@ -1 +0,0 @@ -= \ No newline at end of file diff --git a/src/client/main.cpp b/src/client/main.cpp index bcd4b6e..c81c043 100644 --- a/src/client/main.cpp +++ b/src/client/main.cpp @@ -21,7 +21,7 @@ volatile sig_atomic_t done = 0; void signalHandler(int signum) { if (signum == SIGINT || signum == SIGTERM) { - log("Received termination signal. Shutting down client."); + //log("Received termination signal. Shutting down client."); done = 1; } } @@ -63,7 +63,7 @@ int main(int argc, char** argv) { WintunInitialize(); #endif - std::shared_ptr tun = std::make_shared("utun0"); + std::shared_ptr tun = std::make_shared("utun1"); log("Using virtual interface: " + tun->getName()); LibSodiumWrapper sodiumWrapper = LibSodiumWrapper(); @@ -82,37 +82,31 @@ int main(int argc, char** argv) { std::thread ioThread([&io]() { io.run(); }); - ioThread.detach(); + //ioThread.join(); log("Client connected to " + host + ":" + port); - + // Client is running - // TODO: SIGINT or SIGTERM seems to not kill this instantly! while ((client->isConnected() || !client->isHandshakeComplete()) && !done) { auto packet = tun->readPacket(); - - Nonce nonce{}; - randombytes_buf(nonce.data(), nonce.size()); - - auto ciphertext = LibSodiumWrapper::encryptMessage( - packet.data(), packet.size(), - aesKey, - nonce, - "udp-data" - ); - - std::vector udpPayload; - udpPayload.insert(udpPayload.end(), nonce.begin(), nonce.end()); - udpPayload.insert(udpPayload.end(), reinterpret_cast(&sessionID), reinterpret_cast(&sessionID) + sizeof(sessionID)); - udpPayload.insert(udpPayload.end(), ciphertext.begin(), ciphertext.end()); - udpClient->sendMessage(std::string(udpPayload.begin(), udpPayload.end())); + if (!client->isConnected() || done) { + break; // Bail out if connection died or signal set while blocked + } + + if (packet.empty()) { + continue; + } + + udpClient->sendMessage(std::string(packet.begin(), packet.end())); } log("Client shutting down."); udpClient->stop(); client->disconnect(); io.stop(); - ioThread.join(); + + if (ioThread.joinable()) + ioThread.join(); } catch (const std::exception& e) { error("Client error: " + std::string(e.what())); diff --git a/src/client/net/udp/udp_client.cpp b/src/client/net/udp/udp_client.cpp index e012e8a..61cf0f8 100644 --- a/src/client/net/udp/udp_client.cpp +++ b/src/client/net/udp/udp_client.cpp @@ -6,6 +6,7 @@ namespace ColumnLynx::Net::UDP { void UDPClient::start() { + // TODO: Add IPv6 auto endpoints = mResolver.resolve(asio::ip::udp::v4(), mHost, mPort); mRemoteEndpoint = *endpoints.begin(); mSocket.open(asio::ip::udp::v4()); diff --git a/src/common/virtual_interface.cpp b/src/common/virtual_interface.cpp index f544cac..76a0c67 100644 --- a/src/common/virtual_interface.cpp +++ b/src/common/virtual_interface.cpp @@ -93,8 +93,12 @@ namespace ColumnLynx::Net { #if defined(__linux__) || defined(__APPLE__) std::vector buf(4096); ssize_t n = read(mFd, buf.data(), buf.size()); - if (n < 0) + if (n < 0) { + if (errno == EINTR) { + return {}; // Interrupted, return empty + } throw std::runtime_error("read() failed: " + std::string(strerror(errno))); + } buf.resize(n); return buf; diff --git a/src/server/main.cpp b/src/server/main.cpp index b2d5b2f..c32074e 100644 --- a/src/server/main.cpp +++ b/src/server/main.cpp @@ -84,8 +84,6 @@ int main(int argc, char** argv) { hostRunning = false; server->stop(); udpServer->stop(); - tun.reset(); - tun = nullptr; }); });