[ogr] Fix use-after-free

getLayer can alter the container we are iterating over, which
means that key is deleted while we are still using it.

Make a copy instead to avoid.
This commit is contained in:
Nyall Dawson 2025-02-17 11:38:08 +10:00
parent a152cbecdb
commit 6a7b8fde00
No known key found for this signature in database
GPG Key ID: 4C61673F0BF197FC

View File

@ -1521,7 +1521,9 @@ QgsOgrLayerUniquePtr QgsOgrProviderUtils::getLayer( const QString &dsName,
QMutexLocker locker( sGlobalMutex() );
for ( auto iter = sMapSharedDS.begin(); iter != sMapSharedDS.end(); ++iter )
{
if ( iter.key().dsName == dsName )
const DatasetIdentification dsId = iter.key();
if ( dsId.dsName == dsName )
{
// Browse through this list, to look for a DatasetWithLayers*
// instance that don't use yet our layer of interest
@ -1549,7 +1551,7 @@ QgsOgrLayerUniquePtr QgsOgrProviderUtils::getLayer( const QString &dsName,
errCause = QObject::tr( "Cannot find layer %1." ).arg( layerIndex );
return nullptr;
}
return getLayer( dsName, iter.key().updateMode, iter.key().options, layerName, errCause, true );
return getLayer( dsName, dsId.updateMode, dsId.options, layerName, errCause, true );
}
}
}