From 40dd38813cba4bc8425e846f220e358ffb0d19ac Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 31 Jan 2023 11:25:54 -0800 Subject: QMimeDatabase: don't stat() something that isn't a local file We must check that the path is an actual file on the filesystem before using native APIs. This regression was introduced by commit 047d8f36de45ebb318726167f941b0dbc64754ba. [ChangeLog][QtCore][QMimeDatabase] Fixed a regression from 6.4.0 that made certain QMimeDatabase functions that inspected file contents to fail on Unix systems, if the file was not a native file (e.g., a Qt resource). Fixes: QTBUG-110707 Pick-to: 6.4 6.5 Change-Id: I570832c9ac8b4e03bde8fffd173f7b4c6b164192 Reviewed-by: Igor Kushnir Reviewed-by: David Faure --- .../qmimedatabase-cache/CMakeLists.txt | 8 +++++ .../qmimedatabase/qmimedatabase-xml/CMakeLists.txt | 8 +++++ .../auto/corelib/mimetypes/qmimedatabase/test.txt | 6 ++++ .../mimetypes/qmimedatabase/tst_qmimedatabase.cpp | 39 ++++++++++++++++++++++ 4 files changed, 61 insertions(+) create mode 100644 tests/auto/corelib/mimetypes/qmimedatabase/test.txt (limited to 'tests/auto/corelib/mimetypes') diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/CMakeLists.txt b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/CMakeLists.txt index c32ad90437..589b129fad 100644 --- a/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/CMakeLists.txt +++ b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/CMakeLists.txt @@ -48,6 +48,14 @@ qt_internal_add_resource(tst_qmimedatabase-cache "testdata" ${testdata_resource_files} ) +qt_internal_add_resource(tst_qmimedatabase-cache "testfiles" + PREFIX + "/files" + FILES + "../test.txt" + "../test.qml" +) + # special case begin set(corelib_source_dir ../../../../../../src/corelib) include(${corelib_source_dir}/mimetypes/mimetypes_resources.cmake) diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/CMakeLists.txt b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/CMakeLists.txt index 831e879764..a2633b5fec 100644 --- a/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/CMakeLists.txt +++ b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/CMakeLists.txt @@ -48,6 +48,14 @@ qt_internal_add_resource(tst_qmimedatabase-xml "testdata" ${testdata_resource_files} ) +qt_internal_add_resource(tst_qmimedatabase-xml "testfiles" + PREFIX + "/files" + FILES + "../test.txt" + "../test.qml" +) + # special case begin set(corelib_source_dir ../../../../../../src/corelib) include(${corelib_source_dir}/mimetypes/mimetypes_resources.cmake) diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/test.txt b/tests/auto/corelib/mimetypes/qmimedatabase/test.txt new file mode 100644 index 0000000000..752cf553e9 --- /dev/null +++ b/tests/auto/corelib/mimetypes/qmimedatabase/test.txt @@ -0,0 +1,6 @@ +// Copyright (C) 2012 David Faure +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +import QtQuick 1.1 +Item { +} diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp b/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp index 61a7682ac6..4145219bde 100644 --- a/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp +++ b/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp @@ -26,6 +26,8 @@ #include #endif +using namespace Qt::StringLiterals; + static const char *const additionalMimeFiles[] = { "yast2-metapackage-handler-mimetypes.xml", "qml-again.xml", @@ -246,6 +248,7 @@ void tst_QMimeDatabase::mimeTypeForFileName_data() // fdo bug 15436, needs shared-mime-info >= 0.40 (and this tests the globs2-parsing code). QTest::newRow("glob that ends with *, also matches *.pdf. *.pdf has higher weight") << "README.pdf" << "application/pdf"; QTest::newRow("directory") << "/" << "inode/directory"; + QTest::newRow("resource-directory") << ":/files/" << "inode/directory"; QTest::newRow("doesn't exist, no extension") << "IDontExist" << "application/octet-stream"; QTest::newRow("doesn't exist but has known extension") << "IDontExist.txt" << "text/plain"; QTest::newRow("empty") << "" << "application/octet-stream"; @@ -498,6 +501,42 @@ void tst_QMimeDatabase::mimeTypeForFileWithContent() QCOMPARE(mime.name(), QString::fromLatin1("application/smil+xml")); } + // Test what happens with Qt resources (file engines in general) + { + QFile rccFile(":/files/test.txt"); + + mime = db.mimeTypeForFile(rccFile.fileName()); + QCOMPARE(mime.name(), "text/plain"_L1); + + QVERIFY(rccFile.open(QIODevice::ReadOnly)); + mime = db.mimeTypeForData(&rccFile); + QCOMPARE(mime.name(), "text/x-qml"_L1); + QVERIFY(rccFile.isOpen()); + + mime = db.mimeTypeForFile(rccFile.fileName(), QMimeDatabase::MatchContent); + QCOMPARE(mime.name(), "text/x-qml"_L1); + } + + // Directories + { + mime = db.mimeTypeForFile("/"); + QCOMPARE(mime.name(), "inode/directory"_L1); + + QString dirName = QDir::tempPath(); + if (!dirName.endsWith(u'/')) + dirName += u'/'; + mime = db.mimeTypeForFile(dirName); + QCOMPARE(mime.name(), "inode/directory"_L1); + + while (dirName.endsWith(u'/')) + dirName.chop(1); + mime = db.mimeTypeForFile(dirName); + QCOMPARE(mime.name(), "inode/directory"_L1); + + mime = db.mimeTypeForFile(":/files"); + QCOMPARE(mime.name(), "inode/directory"_L1); + } + // Test what happens with an incorrect path mime = db.mimeTypeForFile(QString::fromLatin1("file:///etc/passwd" /* incorrect code, use a path instead */)); QVERIFY(mime.isDefault()); -- cgit v1.2.3