From 15f3b4613317acdc7ba697f6e38b6411886eb96d Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 29 Apr 2022 16:03:02 +0200 Subject: [PATCH] Fix mime type parsing with Qt 5 The behavior of QStringView::mid is slightly different between Qt 5 and Qt 6, so use Utils::midView which was created exactly to cover that. Change-Id: Ia084e93c36fb152ac725f1b8eaa38a07dfb939e1 Reviewed-by: Eike Ziller Reviewed-by: Christian Stenger Reviewed-by: Qt CI Bot --- src/libs/utils/mimetypes2/mimemagicrule.cpp | 12 +++++++++--- src/libs/utils/porting.h | 4 ++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/libs/utils/mimetypes2/mimemagicrule.cpp b/src/libs/utils/mimetypes2/mimemagicrule.cpp index fc69a9ec9b0..5db88c2f717 100644 --- a/src/libs/utils/mimetypes2/mimemagicrule.cpp +++ b/src/libs/utils/mimetypes2/mimemagicrule.cpp @@ -40,8 +40,11 @@ #include "mimemagicrule_p.h" #include "mimetypeparser_p.h" -#include + +#include "porting.h" + #include +#include #include namespace Utils { @@ -260,8 +263,11 @@ MimeMagicRule::MimeMagicRule(const QString &type, // Parse for offset as "1" or "1:10" const int colonIndex = offsets.indexOf(QLatin1Char(':')); - const QStringView startPosStr = QStringView{offsets}.mid(0, colonIndex); // \ These decay to returning 'offsets' - const QStringView endPosStr = QStringView{offsets}.mid(colonIndex + 1);// / unchanged when colonIndex == -1 + const QStringView startPosStr + = Utils::midView(offsets, 0, colonIndex); // \ These decay to returning 'offsets' + const QStringView endPosStr = Utils::midView(offsets, + colonIndex + + 1); // / unchanged when colonIndex == -1 if (Q_UNLIKELY(!MimeTypeParserBase::parseNumber(startPosStr, &m_startPos, errorString)) || Q_UNLIKELY(!MimeTypeParserBase::parseNumber(endPosStr, &m_endPos, errorString))) { m_type = Invalid; diff --git a/src/libs/utils/porting.h b/src/libs/utils/porting.h index c84ea60dfb4..8b13e366180 100644 --- a/src/libs/utils/porting.h +++ b/src/libs/utils/porting.h @@ -65,7 +65,7 @@ inline StringView make_stringview(const QString &s) } // QStringView::mid in Qt5 does not do bounds checking, in Qt6 it does -inline QStringView midView(const QString &s, int offset, int length) +inline QStringView midView(const QString &s, int offset, int length = -1) { #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) const int size = s.size(); @@ -77,7 +77,7 @@ inline QStringView midView(const QString &s, int offset, int length) if (length + offset <= 0) return {}; return QStringView(s).left(length + offset); - } else if (length > size - offset) + } else if (length < 0 || length > size - offset) return QStringView(s).mid(offset); return QStringView(s).mid(offset, length); #else