From 51b47050f92123ed01c04dd99af1e619e25b261a Mon Sep 17 00:00:00 2001 From: Dylan Schooner Date: Thu, 18 Dec 2025 15:23:48 -0500 Subject: [PATCH] Check specifically for GarbageAtEnd error - Out parameter for garbage data\n- Rename parseUntilMalformed to parseUntilGarbage Signed-off-by: Dylan Schooner --- launcher/Json.cpp | 10 +++++++--- launcher/Json.h | 4 ++-- .../minecraft/mod/tasks/LocalDataPackParseTask.cpp | 2 +- launcher/ui/pages/instance/McClient.cpp | 2 +- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/launcher/Json.cpp b/launcher/Json.cpp index 7c6d82325..688f9dae7 100644 --- a/launcher/Json.cpp +++ b/launcher/Json.cpp @@ -101,12 +101,16 @@ QJsonArray requireArray(const QJsonDocument& doc, const QString& what) return doc.array(); } -QJsonDocument parseUntilMalformed(const QByteArray& json, QJsonParseError* error) +QJsonDocument parseUntilGarbage(const QByteArray& json, QJsonParseError* error, QString* garbage) { auto doc = QJsonDocument::fromJson(json, error); - if (error->error != QJsonParseError::NoError) { - QByteArray validJson = json.left(error->offset); + if (error->error == QJsonParseError::GarbageAtEnd) { + qsizetype offset = error->offset; + QByteArray validJson = json.left(offset); doc = QJsonDocument::fromJson(validJson, error); + + if (garbage) + *garbage = json.right(json.size() - offset); } return doc; diff --git a/launcher/Json.h b/launcher/Json.h index 35a5b655b..7a50af167 100644 --- a/launcher/Json.h +++ b/launcher/Json.h @@ -107,8 +107,8 @@ QJsonArray toJsonArray(const QList& container) ////////////////// READING //////////////////// -// Attempt to parse JSON up until unexpected data is encountered -QJsonDocument parseUntilMalformed(const QByteArray& json, QJsonParseError* error = nullptr); +// Attempt to parse JSON up until garbage is encountered +QJsonDocument parseUntilGarbage(const QByteArray& json, QJsonParseError* error = nullptr, QString* garbage = nullptr); /// @throw JsonException template diff --git a/launcher/minecraft/mod/tasks/LocalDataPackParseTask.cpp b/launcher/minecraft/mod/tasks/LocalDataPackParseTask.cpp index 345db807b..60f836b4d 100644 --- a/launcher/minecraft/mod/tasks/LocalDataPackParseTask.cpp +++ b/launcher/minecraft/mod/tasks/LocalDataPackParseTask.cpp @@ -169,7 +169,7 @@ bool processZIP(DataPack* pack, ProcessingLevel level) bool processMCMeta(DataPack* pack, QByteArray&& raw_data) { QJsonParseError parse_error; - auto json_doc = Json::parseUntilMalformed(raw_data, &parse_error); + auto json_doc = Json::parseUntilGarbage(raw_data, &parse_error); if (parse_error.error != QJsonParseError::NoError) { qWarning() << "Failed to parse JSON:" << parse_error.errorString(); return false; diff --git a/launcher/ui/pages/instance/McClient.cpp b/launcher/ui/pages/instance/McClient.cpp index f91194dfe..25c167122 100644 --- a/launcher/ui/pages/instance/McClient.cpp +++ b/launcher/ui/pages/instance/McClient.cpp @@ -81,7 +81,7 @@ void McClient::parseResponse() // 'resp' should now be the JSON string QJsonParseError parseError; - QJsonDocument doc = Json::parseUntilMalformed(m_resp, &parseError); + QJsonDocument doc = Json::parseUntilGarbage(m_resp, &parseError); if (parseError.error != QJsonParseError::NoError) { qDebug() << "Failed to parse JSON:" << parseError.errorString(); emitFail(parseError.errorString());