From 41a47f99f770ae9cccd8f78d52b6cd299620151c Mon Sep 17 00:00:00 2001 From: TheLastRar Date: Tue, 17 Jan 2023 13:29:57 +0000 Subject: [PATCH] DEV9: Use unique_ptr via typedef for ifadddrs buffer --- pcsx2/DEV9/AdapterUtils.cpp | 30 ++++++++++++++++-------------- pcsx2/DEV9/AdapterUtils.h | 12 +++++++++--- pcsx2/DEV9/pcap_io.cpp | 15 +++++---------- pcsx2/DEV9/sockets.cpp | 17 ++++------------- 4 files changed, 34 insertions(+), 40 deletions(-) diff --git a/pcsx2/DEV9/AdapterUtils.cpp b/pcsx2/DEV9/AdapterUtils.cpp index 830aa50c74..906c4f7f9e 100644 --- a/pcsx2/DEV9/AdapterUtils.cpp +++ b/pcsx2/DEV9/AdapterUtils.cpp @@ -42,7 +42,7 @@ using namespace PacketReader::IP; #ifdef _WIN32 -bool AdapterUtils::GetWin32Adapter(const std::string& name, PIP_ADAPTER_ADDRESSES adapter, std::unique_ptr* buffer) +bool AdapterUtils::GetWin32Adapter(const std::string& name, PIP_ADAPTER_ADDRESSES adapter, AdapterBuffer* buffer) { int neededSize = 128; std::unique_ptr adapterInfo = std::make_unique(neededSize); @@ -91,7 +91,7 @@ bool AdapterUtils::GetWin32Adapter(const std::string& name, PIP_ADAPTER_ADDRESSE return false; } -bool AdapterUtils::GetWin32AdapterAuto(PIP_ADAPTER_ADDRESSES adapter, std::unique_ptr* buffer) +bool AdapterUtils::GetWin32AdapterAuto(PIP_ADAPTER_ADDRESSES adapter, AdapterBuffer* buffer) { int neededSize = 128; std::unique_ptr adapterInfo = std::make_unique(neededSize); @@ -168,16 +168,18 @@ bool AdapterUtils::GetWin32AdapterAuto(PIP_ADAPTER_ADDRESSES adapter, std::uniqu return false; } #elif defined(__POSIX__) -bool AdapterUtils::GetIfAdapter(const std::string& name, ifaddrs* adapter, ifaddrs** buffer) +bool AdapterUtils::GetIfAdapter(const std::string& name, ifaddrs* adapter, AdapterBuffer* buffer) { - ifaddrs* adapterInfo; + ifaddrs* ifa; ifaddrs* pAdapter; - int error = getifaddrs(&adapterInfo); + int error = getifaddrs(&ifa); if (error) return false; - pAdapter = adapterInfo; + std::unique_ptr adapterInfo(ifa, IfAdaptersDeleter()); + + pAdapter = adapterInfo.get(); do { @@ -190,23 +192,24 @@ bool AdapterUtils::GetIfAdapter(const std::string& name, ifaddrs* adapter, ifadd if (pAdapter != nullptr) { *adapter = *pAdapter; - *buffer = adapterInfo; + buffer->swap(adapterInfo); return true; } - freeifaddrs(adapterInfo); return false; } -bool AdapterUtils::GetIfAdapterAuto(ifaddrs* adapter, ifaddrs** buffer) +bool AdapterUtils::GetIfAdapterAuto(ifaddrs* adapter, AdapterBuffer* buffer) { - ifaddrs* adapterInfo; + ifaddrs* ifa; ifaddrs* pAdapter; - int error = getifaddrs(&adapterInfo); + int error = getifaddrs(&ifa); if (error) return false; - pAdapter = adapterInfo; + std::unique_ptr adapterInfo(ifa, IfAdaptersDeleter()); + + pAdapter = adapterInfo.get(); do { @@ -229,7 +232,7 @@ bool AdapterUtils::GetIfAdapterAuto(ifaddrs* adapter, ifaddrs** buffer) if (hasIPv4 && hasGateway) { *adapter = *pAdapter; - *buffer = adapterInfo; + buffer->swap(adapterInfo); return true; } } @@ -237,7 +240,6 @@ bool AdapterUtils::GetIfAdapterAuto(ifaddrs* adapter, ifaddrs** buffer) pAdapter = pAdapter->ifa_next; } while (pAdapter); - freeifaddrs(adapterInfo); return false; } #endif diff --git a/pcsx2/DEV9/AdapterUtils.h b/pcsx2/DEV9/AdapterUtils.h index 52b902111a..3a57af84c1 100644 --- a/pcsx2/DEV9/AdapterUtils.h +++ b/pcsx2/DEV9/AdapterUtils.h @@ -31,7 +31,8 @@ namespace AdapterUtils { #ifdef _WIN32 - bool GetWin32Adapter(const std::string& name, PIP_ADAPTER_ADDRESSES adapter, std::unique_ptr* buffer); + typedef std::unique_ptr AdapterBuffer; + bool GetWin32Adapter(const std::string& name, PIP_ADAPTER_ADDRESSES adapter, AdapterBuffer* buffer); bool GetWin32AdapterAuto(PIP_ADAPTER_ADDRESSES adapter, std::unique_ptr* buffer); std::optional GetAdapterIP(PIP_ADAPTER_ADDRESSES adapter); @@ -39,8 +40,13 @@ namespace AdapterUtils std::vector GetGateways(PIP_ADAPTER_ADDRESSES adapter); std::vector GetDNS(PIP_ADAPTER_ADDRESSES adapter); #elif defined(__POSIX__) - bool GetIfAdapter(const std::string& name, ifaddrs* adapter, ifaddrs** buffer); - bool GetIfAdapterAuto(ifaddrs* adapter, ifaddrs** buffer); + struct IfAdaptersDeleter + { + void operator()(ifaddrs* buffer) const { freeifaddrs(buffer); } + }; + typedef std::unique_ptr AdapterBuffer; + bool GetIfAdapter(const std::string& name, ifaddrs* adapter, AdapterBuffer* buffer); + bool GetIfAdapterAuto(ifaddrs* adapter, AdapterBuffer* buffer); std::optional GetAdapterIP(ifaddrs* adapter); // Mask. diff --git a/pcsx2/DEV9/pcap_io.cpp b/pcsx2/DEV9/pcap_io.cpp index 7ee049da0b..92851e8a65 100644 --- a/pcsx2/DEV9/pcap_io.cpp +++ b/pcsx2/DEV9/pcap_io.cpp @@ -311,7 +311,7 @@ PCAPAdapter::PCAPAdapter() #ifdef _WIN32 IP_ADAPTER_ADDRESSES adapter; - std::unique_ptr buffer; + AdapterUtils::AdapterBuffer buffer; if (AdapterUtils::GetWin32Adapter(EmuConfig.DEV9.EthDevice, &adapter, &buffer)) InitInternalServer(&adapter); else @@ -319,14 +319,12 @@ PCAPAdapter::PCAPAdapter() Console.Error("DEV9: Failed to get adapter information"); InitInternalServer(nullptr); } + #elif defined(__POSIX__) ifaddrs adapter; - ifaddrs* buffer; + AdapterUtils::AdapterBuffer buffer; if (AdapterUtils::GetIfAdapter(EmuConfig.DEV9.EthDevice, &adapter, &buffer)) - { InitInternalServer(&adapter); - freeifaddrs(buffer); - } else { Console.Error("DEV9: Failed to get adapter information"); @@ -383,19 +381,16 @@ void PCAPAdapter::reloadSettings() { #ifdef _WIN32 IP_ADAPTER_ADDRESSES adapter; - std::unique_ptr buffer; + AdapterUtils::AdapterBuffer buffer; if (AdapterUtils::GetWin32Adapter(EmuConfig.DEV9.EthDevice, &adapter, &buffer)) ReloadInternalServer(&adapter); else ReloadInternalServer(nullptr); #elif defined(__POSIX__) ifaddrs adapter; - ifaddrs* buffer; + AdapterUtils::AdapterBuffer buffer; if (AdapterUtils::GetIfAdapter(EmuConfig.DEV9.EthDevice, &adapter, &buffer)) - { ReloadInternalServer(&adapter); - freeifaddrs(buffer); - } else ReloadInternalServer(nullptr); #endif diff --git a/pcsx2/DEV9/sockets.cpp b/pcsx2/DEV9/sockets.cpp index 8f2bc97095..2280c26042 100644 --- a/pcsx2/DEV9/sockets.cpp +++ b/pcsx2/DEV9/sockets.cpp @@ -162,7 +162,7 @@ SocketAdapter::SocketAdapter() #ifdef _WIN32 IP_ADAPTER_ADDRESSES adapter; - std::unique_ptr buffer; + AdapterUtils::AdapterBuffer buffer; if (strcmp(EmuConfig.DEV9.EthDevice.c_str(), "Auto") != 0) { @@ -196,7 +196,7 @@ SocketAdapter::SocketAdapter() } #elif defined(__POSIX__) ifaddrs adapter; - ifaddrs* buffer; + AdapterUtils::AdapterBuffer buffer; if (strcmp(EmuConfig.DEV9.EthDevice.c_str(), "Auto") != 0) { @@ -214,7 +214,6 @@ SocketAdapter::SocketAdapter() else { Console.Error("DEV9: Socket: Failed To Get Adapter IP"); - freeifaddrs(buffer); return; } } @@ -239,9 +238,6 @@ SocketAdapter::SocketAdapter() const IP_Address gateway = internalIP; InitInternalServer(&adapter, true, ps2IP, subnet, gateway); -#ifdef __POSIX__ - freeifaddrs(buffer); -#endif u8 hostMAC[6]; u8 newMAC[6]; @@ -433,7 +429,7 @@ void SocketAdapter::reloadSettings() bool foundAdapter = false; #ifdef _WIN32 IP_ADAPTER_ADDRESSES adapter; - std::unique_ptr buffer; + AdapterUtils::AdapterBuffer buffer; if (strcmp(EmuConfig.DEV9.EthDevice.c_str(), "Auto") != 0) foundAdapter = AdapterUtils::GetWin32Adapter(EmuConfig.DEV9.EthDevice, &adapter, &buffer); @@ -442,7 +438,7 @@ void SocketAdapter::reloadSettings() #elif defined(__POSIX__) ifaddrs adapter; - ifaddrs* buffer; + AdapterUtils::AdapterBuffer buffer; if (strcmp(EmuConfig.DEV9.EthDevice.c_str(), "Auto") != 0) foundAdapter = AdapterUtils::GetIfAdapter(EmuConfig.DEV9.EthDevice, &adapter, &buffer); @@ -455,12 +451,7 @@ void SocketAdapter::reloadSettings() const IP_Address gateway = internalIP; if (foundAdapter) - { ReloadInternalServer(&adapter, true, ps2IP, subnet, gateway); -#ifdef __POSIX__ - freeifaddrs(buffer); -#endif - } else { pxAssert(false);