qdataurl: fix parsing parameter values with percent-encoded comma

Change-Id: I2faa8ce7c9932eb82a853421290c39a37ad91bcf
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Ahmad Samir 2025-05-05 20:04:38 +03:00
parent c140d9ab8e
commit 1f2863ae48
2 changed files with 10 additions and 3 deletions

View File

@ -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));

View File

@ -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));