From 1f2863ae48714dfa8b421ffd58168bfbe8fa19b0 Mon Sep 17 00:00:00 2001 From: Ahmad Samir Date: Mon, 5 May 2025 20:04:38 +0300 Subject: [PATCH] qdataurl: fix parsing parameter values with percent-encoded comma Change-Id: I2faa8ce7c9932eb82a853421290c39a37ad91bcf Reviewed-by: Thiago Macieira --- src/corelib/io/qdataurl.cpp | 9 ++++++--- tests/auto/corelib/io/qdataurl/tst_qdataurl.cpp | 4 ++++ 2 files changed, 10 insertions(+), 3 deletions(-) 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));