[Backport release-10.x] server player req: parse malformed json (#4513)

This commit is contained in:
Alexandru Ionut Tripon 2025-12-16 16:35:45 +02:00 committed by GitHub
commit 708222bb80
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 19 additions and 2 deletions

View file

@ -80,7 +80,18 @@ void McClient::parseResponse()
Q_UNUSED(readVarInt(m_resp)); // json length
// 'resp' should now be the JSON string
QJsonDocument doc = QJsonDocument::fromJson(m_resp);
QJsonParseError parseError;
QJsonDocument doc = QJsonDocument::fromJson(m_resp, &parseError);
if (parseError.error != QJsonParseError::NoError) {
QByteArray validJson = m_resp.left(parseError.offset);
doc = QJsonDocument::fromJson(validJson, &parseError);
if (parseError.error != QJsonParseError::NoError) {
qDebug() << "Failed to parse JSON:" << parseError.errorString();
emitFail(parseError.errorString());
return;
}
}
emitSucceed(doc.object());
}

View file

@ -1,13 +1,19 @@
#include <QFutureWatcher>
#include <Json.h>
#include "Exception.h"
#include "McClient.h"
#include "McResolver.h"
#include "ServerPingTask.h"
unsigned getOnlinePlayers(QJsonObject data)
{
return Json::requireInteger(Json::requireObject(data, "players"), "online");
try {
return Json::requireInteger(Json::requireObject(data, "players"), "online");
} catch (Exception& e) {
qWarning() << "server ping failed to parse response" << e.what();
return 0;
}
}
void ServerPingTask::executeTask()