Update mime database from Qt

qtbase/40dd38813cba4bc8425e846f220e358ffb0d19ac
  QMimeDatabase: don't stat() something that isn't a local file

Change-Id: Id9af310b19649897c4bbaff0c5fb81e0f390bc20
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
This commit is contained in:
Eike Ziller
2024-08-27 12:01:08 +02:00
parent 2338325df1
commit e3fd418a6a
2 changed files with 26 additions and 24 deletions

View File

@@ -507,31 +507,32 @@ MimeType MimeDatabasePrivate::mimeTypeForData(QIODevice *device)
} }
MimeType MimeDatabasePrivate::mimeTypeForFile(const QString &fileName, MimeType MimeDatabasePrivate::mimeTypeForFile(const QString &fileName,
[[maybe_unused]] const QFileInfo *fileInfo, const QFileInfo &fileInfo,
MimeDatabase::MatchMode mode) MimeDatabase::MatchMode mode)
{ {
if (false) {
#ifdef Q_OS_UNIX #ifdef Q_OS_UNIX
// Cannot access statBuf.st_mode from the filesystem engine, so we have to stat again. } else if (fileInfo.isNativePath()) {
// In addition we want to follow symlinks. // Cannot access statBuf.st_mode from the filesystem engine, so we have to stat again.
const QByteArray nativeFilePath = QFile::encodeName(fileName); // In addition we want to follow symlinks.
QT_STATBUF statBuffer; const QByteArray nativeFilePath = QFile::encodeName(fileName);
if (QT_STAT(nativeFilePath.constData(), &statBuffer) == 0) { QT_STATBUF statBuffer;
if (S_ISDIR(statBuffer.st_mode)) if (QT_STAT(nativeFilePath.constData(), &statBuffer) == 0) {
return mimeTypeForName(directoryMimeType()); if (S_ISDIR(statBuffer.st_mode))
if (S_ISCHR(statBuffer.st_mode)) return mimeTypeForName(directoryMimeType());
return mimeTypeForName(QStringLiteral("inode/chardevice")); if (S_ISCHR(statBuffer.st_mode))
if (S_ISBLK(statBuffer.st_mode)) return mimeTypeForName(QStringLiteral("inode/chardevice"));
return mimeTypeForName(QStringLiteral("inode/blockdevice")); if (S_ISBLK(statBuffer.st_mode))
if (S_ISFIFO(statBuffer.st_mode)) return mimeTypeForName(QStringLiteral("inode/blockdevice"));
return mimeTypeForName(QStringLiteral("inode/fifo")); if (S_ISFIFO(statBuffer.st_mode))
if (S_ISSOCK(statBuffer.st_mode)) return mimeTypeForName(QStringLiteral("inode/fifo"));
return mimeTypeForName(QStringLiteral("inode/socket")); if (S_ISSOCK(statBuffer.st_mode))
} return mimeTypeForName(QStringLiteral("inode/socket"));
#else }
const bool isDirectory = fileInfo ? fileInfo->isDir() : QFileInfo(fileName).isDir();
if (isDirectory)
return mimeTypeForName(directoryMimeType());
#endif #endif
} else if (fileInfo.isDir()) {
return mimeTypeForName(directoryMimeType());
}
switch (mode) { switch (mode) {
case MimeDatabase::MatchDefault: case MimeDatabase::MatchDefault:
@@ -680,7 +681,7 @@ MimeType MimeDatabase::mimeTypeForFile(const QFileInfo &fileInfo, MatchMode mode
d->checkInitPhase(fileInfo.filePath()); d->checkInitPhase(fileInfo.filePath());
QMutexLocker locker(&d->mutex); QMutexLocker locker(&d->mutex);
return d->mimeTypeForFile(fileInfo.filePath(), &fileInfo, mode); return d->mimeTypeForFile(fileInfo.filePath(), fileInfo, mode);
} }
/*! /*!
@@ -696,7 +697,8 @@ MimeType MimeDatabase::mimeTypeForFile(const QString &fileName, MatchMode mode)
if (mode == MatchExtension) { if (mode == MatchExtension) {
return d->mimeTypeForFileExtension(fileName); return d->mimeTypeForFileExtension(fileName);
} else { } else {
return d->mimeTypeForFile(fileName, nullptr, mode); QFileInfo fileInfo(fileName);
return d->mimeTypeForFile(fileName, fileInfo, mode);
} }
} }

View File

@@ -64,7 +64,7 @@ public:
MimeType mimeTypeForFileNameAndData(const QString &fileName, QIODevice *device); MimeType mimeTypeForFileNameAndData(const QString &fileName, QIODevice *device);
MimeType mimeTypeForFileExtension(const QString &fileName); MimeType mimeTypeForFileExtension(const QString &fileName);
MimeType mimeTypeForData(QIODevice *device); MimeType mimeTypeForData(QIODevice *device);
MimeType mimeTypeForFile(const QString &fileName, const QFileInfo *fileInfo, MimeDatabase::MatchMode mode); MimeType mimeTypeForFile(const QString &fileName, const QFileInfo &fileInfo, MimeDatabase::MatchMode mode);
MimeType findByData(const QByteArray &data, int *priorityPtr); MimeType findByData(const QByteArray &data, int *priorityPtr);
QStringList mimeTypeForFileName(const QString &fileName); QStringList mimeTypeForFileName(const QString &fileName);
MimeGlobMatchResult findByFileName(const QString &fileName); MimeGlobMatchResult findByFileName(const QString &fileName);