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
parent
ba92215432
commit
0831cb26f4
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -175,6 +175,7 @@ public:
|
|||
|
||||
uchar *map(qint64 offset, qint64 size, QFile::MemoryMapFlags flags);
|
||||
bool unmap(uchar *ptr);
|
||||
void unmapAll();
|
||||
|
||||
mutable QFileSystemMetaData metaData;
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
Loading…
Reference in New Issue