Skip to content

Commit

Permalink
Merge pull request #58094 from qgis/backport-58093-to-release-3_34
Browse files Browse the repository at this point in the history
[Backport release-3_34] Fix use-after-free in QgsVectorLayerCache iterators
  • Loading branch information
alexbruy committed Jul 24, 2024
2 parents 4e81d14 + 7749995 commit 98edabb
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 4 deletions.
4 changes: 2 additions & 2 deletions src/core/qgscachedfeatureiterator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ bool QgsCachedFeatureIterator::fetchFeature( QgsFeature &f )
{
f.setValid( false );

if ( mClosed )
if ( mClosed || !mVectorLayerCache )
return false;

while ( mFeatureIdIterator != mFeatureIds.constEnd() )
Expand Down Expand Up @@ -174,7 +174,7 @@ QgsCachedFeatureWriterIterator::QgsCachedFeatureWriterIterator( QgsVectorLayerCa

bool QgsCachedFeatureWriterIterator::fetchFeature( QgsFeature &f )
{
if ( mClosed )
if ( mClosed || !mVectorLayerCache )
{
f.setValid( false );
return false;
Expand Down
6 changes: 4 additions & 2 deletions src/core/qgscachedfeatureiterator.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
#include "qgsfeature.h"
#include "qgsfeatureiterator.h"
#include "qgscoordinatetransform.h"
#include "qgsvectorlayercache.h"
#include <QPointer>

class QgsVectorLayerCache;

Expand Down Expand Up @@ -84,7 +86,7 @@ class CORE_EXPORT QgsCachedFeatureIterator : public QgsAbstractFeatureIterator
#endif

QList< QgsFeatureId > mFeatureIds;
QgsVectorLayerCache *mVectorLayerCache = nullptr;
QPointer< QgsVectorLayerCache > mVectorLayerCache = nullptr;
QList< QgsFeatureId >::ConstIterator mFeatureIdIterator;
QgsCoordinateTransform mTransform;
QgsRectangle mFilterRect;
Expand Down Expand Up @@ -140,7 +142,7 @@ class CORE_EXPORT QgsCachedFeatureWriterIterator : public QgsAbstractFeatureIter

private:
QgsFeatureIterator mFeatIt;
QgsVectorLayerCache *mVectorLayerCache = nullptr;
QPointer< QgsVectorLayerCache > mVectorLayerCache;
QgsFeatureIds mFids;
QgsCoordinateTransform mTransform;
QgsRectangle mFilterRect;
Expand Down
6 changes: 6 additions & 0 deletions tests/src/python/test_qgsvectorlayercache.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,12 @@ def testAllFeatureIds(self):
"""
pass

def testOpenIteratorAfterSourceRemoval(self):
"""
Skip this test -- the iterators from the cache CANNOT be used after the cache is deleted
"""
pass


if __name__ == '__main__':
unittest.main()

0 comments on commit 98edabb

Please sign in to comment.