[qt] Fix crash on Qt filesource
When opening many maps and sharing the same filesource: - Say we open around 30 maps and they all have the same style. - They will all request the same sprite.json, but Qt filesource will restrict simultaneous request to 20. - Mapbox GL will send some sprite.json to the filesource and queue some internally along with other requests. - When the first sprite.json arrives and the Qt filesource calls the callback, Mapbox GL will synchronously push queued requests to the Qt filesource when a request is handled. - We are walking a QVector dispatching sprite.json requests, but more requests get added to this QVector while we are walking it using an iterator. - That corrupts the iterator and we get a crash. The fix is simple, just pop items from the QVector until it is empty instead of using iterators.
This commit is contained in:
@@ -75,8 +75,12 @@ void HTTPFileSource::Impl::onReplyFinished()
|
||||
|
||||
QByteArray data = reply->readAll();
|
||||
QVector<HTTPRequest*>& requestsVector = it.value().second;
|
||||
for (auto req : requestsVector) {
|
||||
req->handleNetworkReply(reply, data);
|
||||
|
||||
// Cannot use the iterator to walk the requestsVector
|
||||
// because calling handleNetworkReply() might get
|
||||
// requests added to the requestsVector.
|
||||
while (!requestsVector.isEmpty()) {
|
||||
requestsVector.takeFirst()->handleNetworkReply(reply, data);
|
||||
}
|
||||
|
||||
m_pending.erase(it);
|
||||
|
||||
Reference in New Issue
Block a user