summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAhmad Samir <[email protected]>2025-05-05 20:04:38 +0300
committerAhmad Samir <[email protected]>2025-06-01 19:39:59 +0300
commit1f2863ae48714dfa8b421ffd58168bfbe8fa19b0 (patch)
treebb7796635bd5b845f276f28c7fe08f155c53a278
parentc140d9ab8ee5d56f6a024d156e6fe45cda13a026 (diff)
qdataurl: fix parsing parameter values with percent-encoded commaHEADdev
Change-Id: I2faa8ce7c9932eb82a853421290c39a37ad91bcf Reviewed-by: Thiago Macieira <[email protected]>
-rw-r--r--src/corelib/io/qdataurl.cpp9
-rw-r--r--tests/auto/corelib/io/qdataurl/tst_qdataurl.cpp4
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));