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
- #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

View File

@ -673,14 +673,8 @@ ArchNetworkBSD::copyAddr(ArchNetAddress addr)
std::vector<ArchNetAddress>
ArchNetworkBSD::nameToAddr(const std::string& name)
{
// allocate address
std::vector<ArchNetAddressImpl*> 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<ArchNetAddressImpl*> 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);

View File

@ -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);

View File

@ -152,11 +152,14 @@ NetworkAddress::resolve(size_t index)
// Logic for temporary filtring only ipv4 addresses
std::vector<ArchNetAddress> 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);
}
}
}

View File

@ -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<X509, decltype (&X509_free)>;
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));

View File

@ -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"