From bafd299b61348bfb74f2e308351340668e423bf1 Mon Sep 17 00:00:00 2001 From: Little Angel Date: Thu, 9 May 2024 19:45:57 +0800 Subject: [PATCH] fix: check uv_ip*_addr result --- .../emmy_debugger/transporter/transporter.h | 2 ++ .../transporter/socket_client_transporter.cpp | 7 +++---- .../transporter/socket_server_transporter.cpp | 7 +++---- emmy_debugger/src/transporter/transporter.cpp | 19 +++++++++++++++++++ 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/emmy_debugger/include/emmy_debugger/transporter/transporter.h b/emmy_debugger/include/emmy_debugger/transporter/transporter.h index 6c6dcc39..89c21173 100644 --- a/emmy_debugger/include/emmy_debugger/transporter/transporter.h +++ b/emmy_debugger/include/emmy_debugger/transporter/transporter.h @@ -84,4 +84,6 @@ class Transporter { void Run(); virtual void OnDisconnect(); virtual void OnConnect(bool suc); + // helper for both client and server + static bool ParseSocketAddress(const std::string &host, int port, sockaddr_storage *addr, std::string &err); }; diff --git a/emmy_debugger/src/transporter/socket_client_transporter.cpp b/emmy_debugger/src/transporter/socket_client_transporter.cpp index e70d50c4..cf91e775 100644 --- a/emmy_debugger/src/transporter/socket_client_transporter.cpp +++ b/emmy_debugger/src/transporter/socket_client_transporter.cpp @@ -59,10 +59,9 @@ bool SocketClientTransporter::Connect(const std::string& host, int port, std::st uvClient.data = this; uv_tcp_init(loop, &uvClient); struct sockaddr_storage addr; - uv_ip6_addr(host.c_str(), port, (struct sockaddr_in6 *) &addr);// 尝试使用IPv6地址 - - if (addr.ss_family == AF_UNSPEC) { - uv_ip4_addr(host.c_str(), port, (struct sockaddr_in *) &addr);// 如果失败,改用IPv4地址 + bool addr_suc = ParseSocketAddress(host, port, &addr, err); + if (!addr_suc) { + return false; } connect_req.data = this; diff --git a/emmy_debugger/src/transporter/socket_server_transporter.cpp b/emmy_debugger/src/transporter/socket_server_transporter.cpp index a73cf5c6..2b37a63a 100644 --- a/emmy_debugger/src/transporter/socket_server_transporter.cpp +++ b/emmy_debugger/src/transporter/socket_server_transporter.cpp @@ -49,10 +49,9 @@ bool SocketServerTransporter::Listen(const std::string& host, int port, std::str uvServer.data = this; uv_tcp_init(loop, &uvServer); struct sockaddr_storage addr; - uv_ip6_addr(host.c_str(), port, (struct sockaddr_in6 *) &addr);// 尝试使用IPv6地址 - - if (addr.ss_family == AF_UNSPEC) { - uv_ip4_addr(host.c_str(), port, (struct sockaddr_in *) &addr);// 如果失败,改用IPv4地址 + bool addr_suc = ParseSocketAddress(host, port, &addr, err); + if (!addr_suc) { + return false; } uv_tcp_bind(&uvServer, reinterpret_cast(&addr), 0); diff --git a/emmy_debugger/src/transporter/transporter.cpp b/emmy_debugger/src/transporter/transporter.cpp index 7fbc53a9..5aeb28e6 100644 --- a/emmy_debugger/src/transporter/transporter.cpp +++ b/emmy_debugger/src/transporter/transporter.cpp @@ -244,3 +244,22 @@ int Transporter::Stop() running = false; return 0; } + +bool Transporter::ParseSocketAddress(const std::string &host, int port, sockaddr_storage *addr, std::string &err) +{ + const int ip6_addr_res = uv_ip6_addr(host.c_str(), port, reinterpret_cast(addr));// 尝试使用IPv6地址 + if (ip6_addr_res == 0) { + return true; + } + + const int ip4_addr_res = uv_ip4_addr(host.c_str(), port, reinterpret_cast(addr));// 如果失败,改用IPv4地址 + if (ip4_addr_res == 0) { + return true; + } + + err = "Invalid host. IPv6 error: "; + err += uv_strerror(ip6_addr_res); + err += ". IPv4 error: "; + err += uv_strerror(ip4_addr_res); + return false; +}