diff --git a/ChangeLog b/ChangeLog index 7a602af6a7..c6a82137e0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -9,7 +9,7 @@ Bug fixes: - #7144 Fix double lines when pasting text from Linux to Windows - #7149 Address issues with modifiers and dead keys - #7163 Fix compilation issues for FreeBSD -- #7164 Fix memory leaks in language sync and TLS functionality +- #7172 Memory leaks in language sync and TLS functionality Github Actions: - #7148 Fix unstable build for windows core diff --git a/src/lib/arch/unix/ArchNetworkBSD.cpp b/src/lib/arch/unix/ArchNetworkBSD.cpp index 5d660ccb3e..0eed900b4b 100644 --- a/src/lib/arch/unix/ArchNetworkBSD.cpp +++ b/src/lib/arch/unix/ArchNetworkBSD.cpp @@ -673,14 +673,8 @@ ArchNetworkBSD::copyAddr(ArchNetAddress addr) std::vector ArchNetworkBSD::nameToAddr(const std::string& name) { - // allocate address - std::vector addresses; - - char ipstr[INET6_ADDRSTRLEN]; struct addrinfo hints; - struct addrinfo *pResult; struct in6_addr serveraddr; - int ret; memset(&hints, 0, sizeof(hints)); hints.ai_flags = AI_NUMERICSERV; @@ -698,21 +692,24 @@ ArchNetworkBSD::nameToAddr(const std::string& name) // done with static buffer ARCH->lockMutex(m_mutex); - ret = getaddrinfo(name.c_str(), nullptr, &hints, &pResult); + struct addrinfo *pResult = nullptr; + int ret = getaddrinfo(name.c_str(), nullptr, &hints, &pResult); if (ret != 0) { ARCH->unlockMutex(m_mutex); throwNameError(ret); } - for(; pResult != nullptr; pResult = pResult->ai_next ) { + // allocate address + std::vector addresses; + for (auto address = pResult; address != nullptr; address = address->ai_next ) { addresses.push_back(new ArchNetAddressImpl); - if (pResult->ai_family == AF_INET) { + if (address->ai_family == AF_INET) { addresses.back()->m_len = (socklen_t)sizeof(struct sockaddr_in); } else { addresses.back()->m_len = (socklen_t)sizeof(struct sockaddr_in6); } - memcpy(&addresses.back()->m_addr, pResult->ai_addr, addresses.back()->m_len); + memcpy(&addresses.back()->m_addr, address->ai_addr, addresses.back()->m_len); } freeaddrinfo(pResult); diff --git a/src/lib/arch/win32/ArchNetworkWinsock.cpp b/src/lib/arch/win32/ArchNetworkWinsock.cpp index 012ad3ec2f..b034c574f5 100644 --- a/src/lib/arch/win32/ArchNetworkWinsock.cpp +++ b/src/lib/arch/win32/ArchNetworkWinsock.cpp @@ -734,15 +734,15 @@ ArchNetworkWinsock::nameToAddr(const std::string& name) throwNameError(ret); } - for(; pResult != nullptr; pResult = pResult->ai_next ){ + for(auto address = pResult; address != nullptr; address = address->ai_next ){ addresses.push_back(new ArchNetAddressImpl); - if (pResult->ai_family == AF_INET) { + if (address->ai_family == AF_INET) { addresses.back()->m_len = (socklen_t)sizeof(struct sockaddr_in); } else { addresses.back()->m_len = (socklen_t)sizeof(struct sockaddr_in6); } - memcpy(&addresses.back()->m_addr, pResult->ai_addr, addresses.back()->m_len); + memcpy(&addresses.back()->m_addr, address->ai_addr, addresses.back()->m_len); } freeaddrinfo(pResult); diff --git a/src/lib/net/NetworkAddress.cpp b/src/lib/net/NetworkAddress.cpp index 5834af083a..687668d7df 100644 --- a/src/lib/net/NetworkAddress.cpp +++ b/src/lib/net/NetworkAddress.cpp @@ -152,11 +152,14 @@ NetworkAddress::resolve(size_t index) // Logic for temporary filtring only ipv4 addresses std::vector ipv4OnlyAddresses; { - auto adresses = ARCH->nameToAddr(m_hostname); - for (auto address : adresses) { + auto addresses = ARCH->nameToAddr(m_hostname); + for (auto address : addresses) { if (ARCH->getAddrFamily(address) == IArchNetwork::kINET) { ipv4OnlyAddresses.emplace_back(address); } + else { + ARCH->closeAddr(address); + } } } diff --git a/src/lib/net/SecureSocket.cpp b/src/lib/net/SecureSocket.cpp index 6760b7de45..a452470abe 100644 --- a/src/lib/net/SecureSocket.cpp +++ b/src/lib/net/SecureSocket.cpp @@ -683,12 +683,12 @@ bool SecureSocket::verifyCertFingerprint() { // calculate received certificate fingerprint - X509 *cert = cert = SSL_get_peer_certificate(m_ssl->m_ssl); - EVP_MD* tempDigest; + using AutoX509 = std::unique_ptr; + AutoX509 cert(SSL_get_peer_certificate(m_ssl->m_ssl), &X509_free); + unsigned char tempFingerprint[EVP_MAX_MD_SIZE]; unsigned int tempFingerprintLen; - tempDigest = (EVP_MD*)EVP_sha256(); - int digestResult = X509_digest(cert, tempDigest, tempFingerprint, &tempFingerprintLen); + int digestResult = X509_digest(cert.get(), EVP_sha256(), tempFingerprint, &tempFingerprintLen); if (digestResult <= 0) { LOG((CLOG_ERR "failed to calculate fingerprint, digest result: %d", digestResult)); diff --git a/src/lib/platform/OSXScreenSaver.cpp b/src/lib/platform/OSXScreenSaver.cpp index 49fe8fe8b6..5454f143bd 100644 --- a/src/lib/platform/OSXScreenSaver.cpp +++ b/src/lib/platform/OSXScreenSaver.cpp @@ -28,7 +28,7 @@ // TODO: upgrade deprecated function usage in these functions. void getProcessSerialNumber(const char* name, ProcessSerialNumber& psn); -bool testProcessName(const char* name, const ProcessSerialNumber& psn); +bool isScreenSaverEngine(const ProcessSerialNumber& psn); // // OSXScreenSaver @@ -106,7 +106,7 @@ OSXScreenSaver::isActive() const void OSXScreenSaver::processLaunched(ProcessSerialNumber psn) { - if (testProcessName("ScreenSaverEngine", psn)) { + if (isScreenSaverEngine(psn)) { m_screenSaverPSN = psn; LOG((CLOG_DEBUG1 "ScreenSaverEngine launched. Enabled=%d", m_enabled)); if (m_enabled) { @@ -191,11 +191,14 @@ getProcessSerialNumber(const char* name, ProcessSerialNumber& psn) } bool -testProcessName(const char* name, const ProcessSerialNumber& psn) +isScreenSaverEngine(const ProcessSerialNumber& psn) { - CFStringRef processName; + CFStringRef processName; OSStatus err = CopyProcessName(&psn, &processName); - return (err == 0 && CFEqual(CFSTR("ScreenSaverEngine"), processName)); + bool result = (err == 0 && CFEqual(CFSTR("ScreenSaverEngine"), processName)); + CFRelease(processName); + + return result; } #pragma GCC diagnostic error "-Wdeprecated-declarations"