Ensure that QTemporaryFile clears all file mappings.

Factor out code to clear all mappings into
QFSFileEnginePrivate::unmapAll() and call that
from QTemporaryFile.

Task-number: QTBUG-39976
Change-Id: Ic1ceeba0ba4451866f1081fee430e5c458c0819d
Reviewed-by: Jonathan Liu <net147@gmail.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
bb10
Friedemann Kleint 2014-07-02 14:40:38 +02:00
parent ba92215432
commit 0831cb26f4
4 changed files with 22 additions and 3 deletions

View File

@ -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

View File

@ -175,6 +175,7 @@ public:
uchar *map(qint64 offset, qint64 size, QFile::MemoryMapFlags flags);
bool unmap(uchar *ptr);
void unmapAll();
mutable QFileSystemMetaData metaData;

View File

@ -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();

View File

@ -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));