diff options
author | Ahmad Samir <[email protected]> | 2025-05-05 20:04:38 +0300 |
---|---|---|
committer | Ahmad Samir <[email protected]> | 2025-06-01 19:39:59 +0300 |
commit | 1f2863ae48714dfa8b421ffd58168bfbe8fa19b0 (patch) | |
tree | bb7796635bd5b845f276f28c7fe08f155c53a278 | |
parent | c140d9ab8ee5d56f6a024d156e6fe45cda13a026 (diff) |
Change-Id: I2faa8ce7c9932eb82a853421290c39a37ad91bcf
Reviewed-by: Thiago Macieira <[email protected]>
-rw-r--r-- | src/corelib/io/qdataurl.cpp | 9 | ||||
-rw-r--r-- | 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)); |