aboutsummaryrefslogtreecommitdiff
path: root/src/base/QXmppStun.cpp
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2022-03-13 01:09:24 +0100
committerLinus Jahn <lnj@kaidan.im>2022-03-13 02:11:14 +0100
commit063d7fa9360899aa33b5891df15a2b9f4840f392 (patch)
tree4cdb4d1308eb71d2acfeea1a8d47ed1e9b716bd1 /src/base/QXmppStun.cpp
parent00908fb3477c8e983bcd82dc33d3d1f380143b39 (diff)
downloadqxmpp-063d7fa9360899aa33b5891df15a2b9f4840f392.tar.gz
Fix possibly detaching containers
Diffstat (limited to 'src/base/QXmppStun.cpp')
-rw-r--r--src/base/QXmppStun.cpp72
1 files changed, 44 insertions, 28 deletions
diff --git a/src/base/QXmppStun.cpp b/src/base/QXmppStun.cpp
index dd031a93..748ac799 100644
--- a/src/base/QXmppStun.cpp
+++ b/src/base/QXmppStun.cpp
@@ -1323,8 +1323,9 @@ void QXmppTurnAllocation::handleDatagram(const QByteArray &buffer, const QHostAd
QXmppStunMessage message;
QStringList errors;
if (!message.decode(buffer, QByteArray(), &errors)) {
- for (const auto &error : errors)
+ for (const auto &error : std::as_const(errors)) {
warning(error);
+ }
return;
}
@@ -1333,7 +1334,7 @@ void QXmppTurnAllocation::handleDatagram(const QByteArray &buffer, const QHostAd
#endif
// find transaction
- for (auto *transaction : m_transactions) {
+ for (auto *transaction : std::as_const(m_transactions)) {
if (transaction->request().id() == message.id() &&
transaction->request().messageMethod() == message.messageMethod()) {
transaction->readStun(message);
@@ -1801,12 +1802,13 @@ bool QXmppIceComponentPrivate::addRemoteCandidate(const QXmppJingleCandidate &ca
candidate.host().protocol() != QAbstractSocket::IPv6Protocol))
return false;
- for (const auto &c : remoteCandidates)
+ for (const auto &c : std::as_const(remoteCandidates)) {
if (c.host() == candidate.host() && c.port() == candidate.port())
return false;
+ }
remoteCandidates << candidate;
- for (auto *transport : transports) {
+ for (auto *transport : std::as_const(transports)) {
// only pair compatible addresses
const QXmppJingleCandidate local = transport->localCandidate(component);
if (!isCompatibleAddress(local.host(), candidate.host()))
@@ -1828,7 +1830,7 @@ bool QXmppIceComponentPrivate::addRemoteCandidate(const QXmppJingleCandidate &ca
CandidatePair *QXmppIceComponentPrivate::findPair(QXmppStunTransaction *transaction)
{
- for (auto *pair : pairs) {
+ for (auto *pair : std::as_const(pairs)) {
if (pair->transaction == transaction)
return pair;
}
@@ -1859,13 +1861,14 @@ void QXmppIceComponentPrivate::setSockets(QList<QUdpSocket *> sockets)
// clear previous candidates and sockets
localCandidates.clear();
qDeleteAll(pairs);
- for (auto *transport : transports)
+ for (auto *transport : std::as_const(transports)) {
if (transport != turnAllocation)
delete transport;
+ }
transports.clear();
// store candidates
- for (auto *socket : sockets) {
+ for (auto *socket : std::as_const(sockets)) {
socket->setParent(q);
auto *transport = new QXmppUdpTransport(socket, q);
@@ -1883,7 +1886,7 @@ void QXmppIceComponentPrivate::setSockets(QList<QUdpSocket *> sockets)
for (auto &stunServer : config->stunServers) {
QXmppStunMessage request;
request.setType(QXmppStunMessage::Binding | QXmppStunMessage::Request);
- for (auto *transport : transports) {
+ for (auto *transport : std::as_const(transports)) {
const QXmppJingleCandidate local = transport->localCandidate(component);
if (!isCompatibleAddress(local.host(), stunServer.first)) {
continue;
@@ -1986,7 +1989,7 @@ void QXmppIceComponent::checkCandidates()
return;
debug(QStringLiteral("Checking remote candidates"));
- for (auto *pair : d->pairs) {
+ for (auto *pair : std::as_const(d->pairs)) {
if (pair->state() == CandidatePair::WaitingState) {
d->performCheck(pair, d->config->iceControlling);
break;
@@ -1999,8 +2002,9 @@ void QXmppIceComponent::checkCandidates()
///
void QXmppIceComponent::close()
{
- for (auto *transport : d->transports)
+ for (auto *transport : std::as_const(d->transports)) {
transport->disconnectFromHost();
+ }
d->turnAllocation->disconnectFromHost();
d->timer->stop();
d->activePair = nullptr;
@@ -2046,7 +2050,7 @@ void QXmppIceComponent::handleDatagram(const QByteArray &buffer, const QHostAddr
quint16 messageType = QXmppStunMessage::peekType(buffer, messageCookie, messageId);
if (!messageType || messageCookie != STUN_MAGIC) {
// use this as an opportunity to flag a potential pair
- for (auto *pair : d->pairs) {
+ for (auto *pair : std::as_const(d->pairs)) {
if (pair->remote.host() == remoteHost &&
pair->remote.port() == remotePort) {
d->fallbackPair = pair;
@@ -2079,8 +2083,9 @@ void QXmppIceComponent::handleDatagram(const QByteArray &buffer, const QHostAddr
QXmppStunMessage message;
QStringList errors;
if (!message.decode(buffer, messagePassword.toUtf8(), &errors)) {
- for (const auto &error : errors)
+ for (const auto &error : std::as_const(errors)) {
warning(error);
+ }
return;
}
#ifdef QXMPP_DEBUG_STUN
@@ -2120,7 +2125,7 @@ void QXmppIceComponent::handleDatagram(const QByteArray &buffer, const QHostAddr
// find or create remote candidate
QXmppJingleCandidate remoteCandidate;
bool remoteCandidateFound = false;
- for (const auto &c : d->remoteCandidates) {
+ for (const auto &c : std::as_const(d->remoteCandidates)) {
if (c.host() == remoteHost && c.port() == remotePort) {
remoteCandidate = c;
remoteCandidateFound = true;
@@ -2142,7 +2147,7 @@ void QXmppIceComponent::handleDatagram(const QByteArray &buffer, const QHostAddr
}
// construct pair
- for (auto *ptr : d->pairs) {
+ for (auto *ptr : std::as_const(d->pairs)) {
if (ptr->transport == transport && ptr->remote.host() == remoteHost && ptr->remote.port() == remotePort) {
pair = ptr;
break;
@@ -2178,7 +2183,7 @@ void QXmppIceComponent::handleDatagram(const QByteArray &buffer, const QHostAddr
} else if (message.messageClass() == QXmppStunMessage::Response || message.messageClass() == QXmppStunMessage::Error) {
// find the pair for this transaction
- for (auto *ptr : d->pairs) {
+ for (auto *ptr : std::as_const(d->pairs)) {
if (ptr->transaction && ptr->transaction->request().id() == message.id()) {
pair = ptr;
break;
@@ -2261,7 +2266,7 @@ void QXmppIceComponent::transactionFinished()
}
// check whether this candidates is already known
- for (const auto &candidate : d->localCandidates) {
+ for (const auto &candidate : std::as_const(d->localCandidates)) {
if (candidate.host() == reflexiveHost &&
candidate.port() == reflexivePort &&
candidate.type() == QXmppJingleCandidate::ServerReflexiveType)
@@ -2329,12 +2334,14 @@ static QList<QUdpSocket *> reservePort(const QList<QHostAddress> &addresses, qui
QList<QHostAddress> QXmppIceComponent::discoverAddresses()
{
QList<QHostAddress> addresses;
- for (const auto &interface : QNetworkInterface::allInterfaces()) {
+ const auto interfaces = QNetworkInterface::allInterfaces();
+ for (const auto &interface : interfaces) {
if (!(interface.flags() & QNetworkInterface::IsRunning) ||
interface.flags() & QNetworkInterface::IsLoopBack)
continue;
- for (const auto &entry : interface.addressEntries()) {
+ const auto addressEntries = interface.addressEntries();
+ for (const auto &entry : addressEntries) {
QHostAddress ip = entry.ip();
if ((ip.protocol() != QAbstractSocket::IPv4Protocol &&
ip.protocol() != QAbstractSocket::IPv6Protocol) ||
@@ -2588,8 +2595,9 @@ bool QXmppIceConnection::bind(const QList<QHostAddress> &addresses)
void QXmppIceConnection::close()
{
d->connectTimer->stop();
- for (auto *socket : d->components.values())
+ for (auto *socket : std::as_const(d->components)) {
socket->close();
+ }
}
///
@@ -2600,8 +2608,9 @@ void QXmppIceConnection::connectToHost()
if (isConnected() || d->connectTimer->isActive())
return;
- for (auto *socket : d->components.values())
+ for (auto *socket : std::as_const(d->components)) {
socket->connectToHost();
+ }
d->connectTimer->start();
}
@@ -2610,9 +2619,10 @@ void QXmppIceConnection::connectToHost()
///
bool QXmppIceConnection::isConnected() const
{
- for (auto *socket : d->components.values())
+ for (auto *socket : std::as_const(d->components)) {
if (!socket->isConnected())
return false;
+ }
return true;
}
@@ -2639,8 +2649,9 @@ void QXmppIceConnection::setIceControlling(bool controlling)
QList<QXmppJingleCandidate> QXmppIceConnection::localCandidates() const
{
QList<QXmppJingleCandidate> candidates;
- for (auto *socket : d->components.values())
+ for (auto *socket : std::as_const(d->components)) {
candidates += socket->localCandidates();
+ }
return candidates;
}
@@ -2722,8 +2733,9 @@ void QXmppIceConnection::setTurnServer(const QHostAddress &host, quint16 port)
{
d->turnHost = host;
d->turnPort = port;
- for (auto *socket : d->components.values())
+ for (auto *socket : std::as_const(d->components)) {
socket->d->setTurnServer(host, port);
+ }
}
///
@@ -2736,8 +2748,9 @@ void QXmppIceConnection::setTurnServer(const QHostAddress &host, quint16 port)
void QXmppIceConnection::setTurnUser(const QString &user)
{
d->turnUser = user;
- for (auto *socket : d->components.values())
+ for (auto *socket : std::as_const(d->components)) {
socket->d->setTurnUser(user);
+ }
}
///
@@ -2750,15 +2763,17 @@ void QXmppIceConnection::setTurnUser(const QString &user)
void QXmppIceConnection::setTurnPassword(const QString &password)
{
d->turnPassword = password;
- for (auto *socket : d->components.values())
+ for (auto *socket : std::as_const(d->components)) {
socket->d->setTurnPassword(password);
+ }
}
void QXmppIceConnection::slotConnected()
{
- for (auto *socket : d->components.values())
+ for (auto *socket : std::as_const(d->components)) {
if (!socket->isConnected())
return;
+ }
info(QStringLiteral("ICE negotiation completed"));
d->connectTimer->stop();
emit connected();
@@ -2769,7 +2784,7 @@ void QXmppIceConnection::slotGatheringStateChanged()
GatheringState newGatheringState;
bool allComplete = true;
bool allNew = true;
- for (auto *socket : d->components.values()) {
+ for (auto *socket : std::as_const(d->components)) {
if (socket->d->gatheringState != CompleteGatheringState)
allComplete = false;
if (socket->d->gatheringState != NewGatheringState)
@@ -2792,8 +2807,9 @@ void QXmppIceConnection::slotGatheringStateChanged()
void QXmppIceConnection::slotTimeout()
{
warning(QStringLiteral("ICE negotiation timed out"));
- for (auto *socket : d->components.values())
+ for (auto *socket : std::as_const(d->components)) {
socket->close();
+ }
emit disconnected();
}