From e78b0cd47422869e980db633cbdc0c7cfcdd8dd8 Mon Sep 17 00:00:00 2001 From: Ahmad Samir Date: Thu, 13 May 2021 17:02:52 +0200 Subject: [PATCH 2/3] MimeTypeFinderJob: the StatJob details should include the mimetype Apparently we forgot to specify that we want the UDS_MIME_TYPE field in the statFile() method (both when it lived in OpenUrlJob and when it was moved to MimeTypeFinderJob). And now there is a dedicated StatJob flag, StatMimeType, that we can use. Not passing KIO::StatMimeType when creating the StatJob meant the code always used a get job to determine the mime type, which mean that e.g. opening an ISO file from Dolphin, which supposedly just needs to launch Ark, had the whole file read into memory, which means that opening a couple of ISO's and you're out of memory... Thanks to sitter for doing a big chunk of the investigative work in the bug report. CCBUG: 398908 (cherry picked from commit c19876052ecec18a87a82f5950e8909e22e895ba) --- src/core/mimetypefinderjob.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/core/mimetypefinderjob.cpp b/src/core/mimetypefinderjob.cpp index 48fc8c28..baca5869 100644 --- a/src/core/mimetypefinderjob.cpp +++ b/src/core/mimetypefinderjob.cpp @@ -122,7 +122,9 @@ void KIO::MimeTypeFinderJobPrivate::statFile() { Q_ASSERT(m_mimeTypeName.isEmpty()); - KIO::StatJob *job = KIO::statDetails(m_url, KIO::StatJob::SourceSide, KIO::StatBasic | KIO::StatResolveSymlink, KIO::HideProgressInfo); + static constexpr auto statFlags = KIO::StatBasic | KIO::StatResolveSymlink | KIO::StatMimeType; + + KIO::StatJob *job = KIO::statDetails(m_url, KIO::StatJob::SourceSide, statFlags, KIO::HideProgressInfo); if (!m_authPrompts) { job->addMetaData(QStringLiteral("no-auth-prompt"), QStringLiteral("true")); } @@ -147,6 +149,8 @@ void KIO::MimeTypeFinderJobPrivate::statFile() const KIO::UDSEntry entry = job->statResult(); + qCDebug(KIO_CORE) << "UDSEntry from StatJob in MimeTypeFinderJob" << entry; + const QString localPath = entry.stringValue(KIO::UDSEntry::UDS_LOCAL_PATH); if (!localPath.isEmpty()) { m_url = QUrl::fromLocalFile(localPath); -- 2.25.1