SYNERGY1-1497 memory leaks in synergyc on mac os (#7170)

* SYNERGY1-1497 Fix memory leak in screen saver functionality

* SYNERGY1-1497 Fix memory leak in ArchNetworkBSD::nameToAddr

* SYNERGY1-1497 Fix memory leak in TLS for synergyc

* SYNERGY1-1497 Fix code smells

* Update ChangeLog

* SYNERGY1-1497 Fix meory leak in ArchNetworkWinsock::nameToAddr

* Update ChangeLog as it was requested
This commit is contained in:
Serhii Hadzhilov 2022-05-16 19:00:16 +03:00 committed by GitHub
parent 9f8e7a17f5
commit 5b6f5df6ea
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 28 additions and 25 deletions

View file

@ -9,7 +9,7 @@ Bug fixes:
- #7144 Fix double lines when pasting text from Linux to Windows - #7144 Fix double lines when pasting text from Linux to Windows
- #7149 Address issues with modifiers and dead keys - #7149 Address issues with modifiers and dead keys
- #7163 Fix compilation issues for FreeBSD - #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: Github Actions:
- #7148 Fix unstable build for windows core - #7148 Fix unstable build for windows core

View file

@ -673,14 +673,8 @@ ArchNetworkBSD::copyAddr(ArchNetAddress addr)
std::vector<ArchNetAddress> std::vector<ArchNetAddress>
ArchNetworkBSD::nameToAddr(const std::string& name) ArchNetworkBSD::nameToAddr(const std::string& name)
{ {
// allocate address
std::vector<ArchNetAddressImpl*> addresses;
char ipstr[INET6_ADDRSTRLEN];
struct addrinfo hints; struct addrinfo hints;
struct addrinfo *pResult;
struct in6_addr serveraddr; struct in6_addr serveraddr;
int ret;
memset(&hints, 0, sizeof(hints)); memset(&hints, 0, sizeof(hints));
hints.ai_flags = AI_NUMERICSERV; hints.ai_flags = AI_NUMERICSERV;
@ -698,21 +692,24 @@ ArchNetworkBSD::nameToAddr(const std::string& name)
// done with static buffer // done with static buffer
ARCH->lockMutex(m_mutex); 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) { if (ret != 0) {
ARCH->unlockMutex(m_mutex); ARCH->unlockMutex(m_mutex);
throwNameError(ret); throwNameError(ret);
} }
for(; pResult != nullptr; pResult = pResult->ai_next ) { // allocate address
std::vector<ArchNetAddressImpl*> addresses;
for (auto address = pResult; address != nullptr; address = address->ai_next ) {
addresses.push_back(new ArchNetAddressImpl); 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); addresses.back()->m_len = (socklen_t)sizeof(struct sockaddr_in);
} else { } else {
addresses.back()->m_len = (socklen_t)sizeof(struct sockaddr_in6); 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); freeaddrinfo(pResult);

View file

@ -734,15 +734,15 @@ ArchNetworkWinsock::nameToAddr(const std::string& name)
throwNameError(ret); throwNameError(ret);
} }
for(; pResult != nullptr; pResult = pResult->ai_next ){ for(auto address = pResult; address != nullptr; address = address->ai_next ){
addresses.push_back(new ArchNetAddressImpl); 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); addresses.back()->m_len = (socklen_t)sizeof(struct sockaddr_in);
} else { } else {
addresses.back()->m_len = (socklen_t)sizeof(struct sockaddr_in6); 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); freeaddrinfo(pResult);

View file

@ -152,11 +152,14 @@ NetworkAddress::resolve(size_t index)
// Logic for temporary filtring only ipv4 addresses // Logic for temporary filtring only ipv4 addresses
std::vector<ArchNetAddress> ipv4OnlyAddresses; std::vector<ArchNetAddress> ipv4OnlyAddresses;
{ {
auto adresses = ARCH->nameToAddr(m_hostname); auto addresses = ARCH->nameToAddr(m_hostname);
for (auto address : adresses) { for (auto address : addresses) {
if (ARCH->getAddrFamily(address) == IArchNetwork::kINET) { if (ARCH->getAddrFamily(address) == IArchNetwork::kINET) {
ipv4OnlyAddresses.emplace_back(address); ipv4OnlyAddresses.emplace_back(address);
} }
else {
ARCH->closeAddr(address);
}
} }
} }

View file

@ -683,12 +683,12 @@ bool
SecureSocket::verifyCertFingerprint() SecureSocket::verifyCertFingerprint()
{ {
// calculate received certificate fingerprint // calculate received certificate fingerprint
X509 *cert = cert = SSL_get_peer_certificate(m_ssl->m_ssl); using AutoX509 = std::unique_ptr<X509, decltype (&X509_free)>;
EVP_MD* tempDigest; AutoX509 cert(SSL_get_peer_certificate(m_ssl->m_ssl), &X509_free);
unsigned char tempFingerprint[EVP_MAX_MD_SIZE]; unsigned char tempFingerprint[EVP_MAX_MD_SIZE];
unsigned int tempFingerprintLen; unsigned int tempFingerprintLen;
tempDigest = (EVP_MD*)EVP_sha256(); int digestResult = X509_digest(cert.get(), EVP_sha256(), tempFingerprint, &tempFingerprintLen);
int digestResult = X509_digest(cert, tempDigest, tempFingerprint, &tempFingerprintLen);
if (digestResult <= 0) { if (digestResult <= 0) {
LOG((CLOG_ERR "failed to calculate fingerprint, digest result: %d", digestResult)); LOG((CLOG_ERR "failed to calculate fingerprint, digest result: %d", digestResult));

View file

@ -28,7 +28,7 @@
// TODO: upgrade deprecated function usage in these functions. // TODO: upgrade deprecated function usage in these functions.
void getProcessSerialNumber(const char* name, ProcessSerialNumber& psn); void getProcessSerialNumber(const char* name, ProcessSerialNumber& psn);
bool testProcessName(const char* name, const ProcessSerialNumber& psn); bool isScreenSaverEngine(const ProcessSerialNumber& psn);
// //
// OSXScreenSaver // OSXScreenSaver
@ -106,7 +106,7 @@ OSXScreenSaver::isActive() const
void void
OSXScreenSaver::processLaunched(ProcessSerialNumber psn) OSXScreenSaver::processLaunched(ProcessSerialNumber psn)
{ {
if (testProcessName("ScreenSaverEngine", psn)) { if (isScreenSaverEngine(psn)) {
m_screenSaverPSN = psn; m_screenSaverPSN = psn;
LOG((CLOG_DEBUG1 "ScreenSaverEngine launched. Enabled=%d", m_enabled)); LOG((CLOG_DEBUG1 "ScreenSaverEngine launched. Enabled=%d", m_enabled));
if (m_enabled) { if (m_enabled) {
@ -191,11 +191,14 @@ getProcessSerialNumber(const char* name, ProcessSerialNumber& psn)
} }
bool bool
testProcessName(const char* name, const ProcessSerialNumber& psn) isScreenSaverEngine(const ProcessSerialNumber& psn)
{ {
CFStringRef processName; CFStringRef processName;
OSStatus err = CopyProcessName(&psn, &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" #pragma GCC diagnostic error "-Wdeprecated-declarations"