diff --git a/src/corelib/io/qdataurl.cpp b/src/corelib/io/qdataurl.cpp index 23bc114d9d4..129aaa1c25f 100644 --- a/src/corelib/io/qdataurl.cpp +++ b/src/corelib/io/qdataurl.cpp @@ -30,12 +30,14 @@ Q_CORE_EXPORT bool qDecodeDataUrl(const QUrl &uri, QString &mimeType, QByteArray if (uri.scheme() != "data"_L1 || !uri.host().isEmpty()) return false; - payload = QByteArray::fromPercentEncoding(uri.toEncoded(QUrl::RemoveScheme)); + payload = uri.toEncoded(QUrl::RemoveScheme); // parse it: + // percent decode after finding the `,`, to workaround parameter + // values containing a percent-encoded comma const qsizetype pos = payload.indexOf(','); if (pos != -1) { - auto data = QLatin1StringView{payload}; - data.truncate(pos); + QByteArray contentType = payload.first(pos).percentDecoded(); + auto data = QLatin1StringView{contentType}; data = data.trimmed(); QLatin1StringView mime; @@ -74,6 +76,7 @@ Q_CORE_EXPORT bool qDecodeDataUrl(const QUrl &uri, QString &mimeType, QByteArray payload.slice(pos + 1); data = {}; + payload = std::move(payload).percentDecoded(); if (isBas64) { auto r = QByteArray::fromBase64Encoding(std::move(payload)); diff --git a/tests/auto/corelib/io/qdataurl/tst_qdataurl.cpp b/tests/auto/corelib/io/qdataurl/tst_qdataurl.cpp index 2936e20d15d..dd79a859869 100644 --- a/tests/auto/corelib/io/qdataurl/tst_qdataurl.cpp +++ b/tests/auto/corelib/io/qdataurl/tst_qdataurl.cpp @@ -62,6 +62,10 @@ void tst_QDataUrl::decode_data() "text/plain;charset=UTF-8", ""); row("not-real-charset", "data:incharsetter=true,", true, defaultMimeType, ""); + row("percent-encoded-comma-in-parameter-value", + "data:;charset=%22UTF-8%22;x-bar=\"a%2Cb%2Cc\",Hello%2C%20world", true, + "text/plain;charset=\"UTF-8\""_L1, "Hello, world"); + QString path = QFINDTESTDATA("arrow-down-16.png"); QFile img(path); QVERIFY(img.open(QFile::ReadOnly));