diff --git a/src/corelib/io/qdiriterator.cpp b/src/corelib/io/qdiriterator.cpp index faea8088cb5..7d7fe156845 100644 --- a/src/corelib/io/qdiriterator.cpp +++ b/src/corelib/io/qdiriterator.cpp @@ -103,6 +103,11 @@ public: void advance() { + // Match the behavior of advance() from before porting to QDirListing, + // that is, even if hasNext() returns false, calling next() returns an + // empty string without crashing. QTBUG-130142 + if (it == lister.end()) + return; currentFileInfo = nextFileInfo; if (++it != lister.end()) { nextFileInfo = it->fileInfo(); diff --git a/tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp b/tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp index a0a8917c270..b739f0eb112 100644 --- a/tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp +++ b/tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp @@ -86,6 +86,8 @@ private slots: void hiddenDirs_hiddenFiles(); #endif + void hasNextFalseNoCrash(); + private: QSharedPointer m_dataDir; }; @@ -642,6 +644,15 @@ void tst_QDirIterator::hiddenDirs_hiddenFiles() } #endif // Q_OS_WIN +void tst_QDirIterator::hasNextFalseNoCrash() +{ + QDirIterator iter(u"empty"_s, QDir::NoDotAndDotDot); + // QTBUG-130142 + // No crash if you call next() after hasNext() returned false + QVERIFY(!iter.hasNext()); + QVERIFY(iter.next().isEmpty()); +} + QTEST_MAIN(tst_QDirIterator) #include "tst_qdiriterator.moc"