Fix memory leak due to m_receivedIdentityPackets growing
We didn't always remove entries from m_receivedIdentityPackets indexed by sockets that got deleted.
This commit is contained in:
parent
dd5e61ab0a
commit
b454a6f880
1 changed files with 12 additions and 7 deletions
|
@ -301,6 +301,9 @@ void LanLinkProvider::udpBroadcastReceived()
|
||||||
m_receivedIdentityPackets[socket].sender = sender;
|
m_receivedIdentityPackets[socket].sender = sender;
|
||||||
connect(socket, &QAbstractSocket::connected, this, &LanLinkProvider::tcpSocketConnected);
|
connect(socket, &QAbstractSocket::connected, this, &LanLinkProvider::tcpSocketConnected);
|
||||||
connect(socket, &QAbstractSocket::errorOccurred, this, &LanLinkProvider::connectError);
|
connect(socket, &QAbstractSocket::errorOccurred, this, &LanLinkProvider::connectError);
|
||||||
|
connect(socket, &QObject::destroyed, this, [this, socket]() {
|
||||||
|
delete m_receivedIdentityPackets.take(socket).np;
|
||||||
|
});
|
||||||
socket->connectToHost(sender, tcpPort);
|
socket->connectToHost(sender, tcpPort);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -319,7 +322,6 @@ void LanLinkProvider::connectError(QAbstractSocket::SocketError socketError)
|
||||||
|
|
||||||
// The socket we created didn't work, and we didn't manage
|
// The socket we created didn't work, and we didn't manage
|
||||||
// to create a LanDeviceLink from it, deleting everything.
|
// to create a LanDeviceLink from it, deleting everything.
|
||||||
delete m_receivedIdentityPackets.take(socket).np;
|
|
||||||
socket->deleteLater();
|
socket->deleteLater();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -368,9 +370,8 @@ void LanLinkProvider::tcpSocketConnected()
|
||||||
qCDebug(KDECONNECT_CORE) << "Fallback (2), try reverse connection (send udp packet)";
|
qCDebug(KDECONNECT_CORE) << "Fallback (2), try reverse connection (send udp packet)";
|
||||||
m_udpSocket.writeDatagram(np2.serialize(), m_receivedIdentityPackets[socket].sender, m_udpBroadcastPort);
|
m_udpSocket.writeDatagram(np2.serialize(), m_receivedIdentityPackets[socket].sender, m_udpBroadcastPort);
|
||||||
|
|
||||||
// Cleanup the network packet now. The socket should be deleted via the disconnected() signal.
|
// Disconnect should trigger deleteLater, which should remove the socket from m_receivedIdentityPackets
|
||||||
// We don't do this on success, because it is done later in the encrypted() slot.
|
socket->disconnectFromHost();
|
||||||
delete m_receivedIdentityPackets.take(socket).np;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -388,10 +389,11 @@ void LanLinkProvider::encrypted()
|
||||||
|
|
||||||
DeviceInfo deviceInfo = DeviceInfo::FromIdentityPacketAndCert(*identityPacket, socket->peerCertificate());
|
DeviceInfo deviceInfo = DeviceInfo::FromIdentityPacketAndCert(*identityPacket, socket->peerCertificate());
|
||||||
|
|
||||||
addLink(socket, deviceInfo);
|
|
||||||
|
|
||||||
// We don't delete the socket because now it's owned by the LanDeviceLink
|
// We don't delete the socket because now it's owned by the LanDeviceLink
|
||||||
|
disconnect(socket, &QObject::destroyed, nullptr, nullptr);
|
||||||
delete m_receivedIdentityPackets.take(socket).np;
|
delete m_receivedIdentityPackets.take(socket).np;
|
||||||
|
|
||||||
|
addLink(socket, deviceInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LanLinkProvider::sslErrors(const QList<QSslError> &errors)
|
void LanLinkProvider::sslErrors(const QList<QSslError> &errors)
|
||||||
|
@ -411,8 +413,8 @@ void LanLinkProvider::sslErrors(const QList<QSslError> &errors)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fatal) {
|
if (fatal) {
|
||||||
|
// Disconnect should trigger deleteLater, which should remove the socket from m_receivedIdentityPackets
|
||||||
socket->disconnectFromHost();
|
socket->disconnectFromHost();
|
||||||
delete m_receivedIdentityPackets.take(socket).np;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -487,6 +489,9 @@ void LanLinkProvider::dataReceived()
|
||||||
|
|
||||||
// Needed in "encrypted" if ssl is used, similar to "tcpSocketConnected"
|
// Needed in "encrypted" if ssl is used, similar to "tcpSocketConnected"
|
||||||
m_receivedIdentityPackets[socket].np = np;
|
m_receivedIdentityPackets[socket].np = np;
|
||||||
|
connect(socket, &QObject::destroyed, this, [this, socket]() {
|
||||||
|
delete m_receivedIdentityPackets.take(socket).np;
|
||||||
|
});
|
||||||
|
|
||||||
const QString &deviceId = np->get<QString>(QStringLiteral("deviceId"));
|
const QString &deviceId = np->get<QString>(QStringLiteral("deviceId"));
|
||||||
// qCDebug(KDECONNECT_CORE) << "Handshaking done (i'm the new device)";
|
// qCDebug(KDECONNECT_CORE) << "Handshaking done (i'm the new device)";
|
||||||
|
|
Loading…
Reference in a new issue