diff options
-rw-r--r-- | src/corelib/io/qfsfileengine.cpp | 16 | ||||
-rw-r--r-- | src/corelib/io/qfsfileengine_p.h | 1 | ||||
-rw-r--r-- | src/corelib/io/qtemporaryfile.cpp | 3 | ||||
-rw-r--r-- | tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp | 5 |
4 files changed, 22 insertions, 3 deletions
diff --git a/src/corelib/io/qfsfileengine.cpp b/src/corelib/io/qfsfileengine.cpp index 998a3334c9..3c4a2fac0b 100644 --- a/src/corelib/io/qfsfileengine.cpp +++ b/src/corelib/io/qfsfileengine.cpp @@ -179,9 +179,7 @@ QFSFileEngine::~QFSFileEngine() } while (ret == -1 && errno == EINTR); } } - QList<uchar*> keys = d->maps.keys(); - for (int i = 0; i < keys.count(); ++i) - unmap(keys.at(i)); + d->unmapAll(); } /*! @@ -463,6 +461,18 @@ qint64 QFSFileEngine::size() const return d->nativeSize(); } +/*! + \internal +*/ +void QFSFileEnginePrivate::unmapAll() +{ + if (!maps.isEmpty()) { + const QList<uchar*> keys = maps.keys(); // Make a copy since unmap() modifies the map. + for (int i = 0; i < keys.count(); ++i) + unmap(keys.at(i)); + } +} + #ifndef Q_OS_WIN /*! \internal diff --git a/src/corelib/io/qfsfileengine_p.h b/src/corelib/io/qfsfileengine_p.h index 21f38fea1d..b0610b1459 100644 --- a/src/corelib/io/qfsfileengine_p.h +++ b/src/corelib/io/qfsfileengine_p.h @@ -175,6 +175,7 @@ public: uchar *map(qint64 offset, qint64 size, QFile::MemoryMapFlags flags); bool unmap(uchar *ptr); + void unmapAll(); mutable QFileSystemMetaData metaData; diff --git a/src/corelib/io/qtemporaryfile.cpp b/src/corelib/io/qtemporaryfile.cpp index 3cade0ed25..bc6c2f1f06 100644 --- a/src/corelib/io/qtemporaryfile.cpp +++ b/src/corelib/io/qtemporaryfile.cpp @@ -235,6 +235,8 @@ static bool createFileFromTemplate(NativeFileHandle &file, //************* QTemporaryFileEngine QTemporaryFileEngine::~QTemporaryFileEngine() { + Q_D(QFSFileEngine); + d->unmapAll(); QFSFileEngine::close(); } @@ -363,6 +365,7 @@ bool QTemporaryFileEngine::remove() Q_D(QFSFileEngine); // Since the QTemporaryFileEngine::close() does not really close the file, // we must explicitly call QFSFileEngine::close() before we remove it. + d->unmapAll(); QFSFileEngine::close(); if (QFSFileEngine::remove()) { d->fileEntry.clear(); diff --git a/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp b/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp index 5ad798ae1f..edf4dd2f00 100644 --- a/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp +++ b/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp @@ -251,6 +251,11 @@ void tst_QTemporaryFile::autoRemove() QTemporaryFile file("tempXXXXXX"); QVERIFY(file.open()); fileName = file.fileName(); + // QTBUG-39976, file mappings should be cleared as well. + QVERIFY(file.write("test")); + QVERIFY(file.flush()); + uchar *mapped = file.map(0, file.size()); + QVERIFY(mapped); file.close(); } QVERIFY(!QFile::exists(fileName)); |