diff options
| author | Linus Jahn <lnj@kaidan.im> | 2022-03-13 01:09:24 +0100 |
|---|---|---|
| committer | Linus Jahn <lnj@kaidan.im> | 2022-03-13 02:11:14 +0100 |
| commit | 063d7fa9360899aa33b5891df15a2b9f4840f392 (patch) | |
| tree | 4cdb4d1308eb71d2acfeea1a8d47ed1e9b716bd1 /src/base/QXmppStun.cpp | |
| parent | 00908fb3477c8e983bcd82dc33d3d1f380143b39 (diff) | |
| download | qxmpp-063d7fa9360899aa33b5891df15a2b9f4840f392.tar.gz | |
Fix possibly detaching containers
Diffstat (limited to 'src/base/QXmppStun.cpp')
| -rw-r--r-- | src/base/QXmppStun.cpp | 72 |
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(); } |
