diff --git a/include/Utils.h b/include/Utils.h index fddc2ab9..35d648bc 100644 --- a/include/Utils.h +++ b/include/Utils.h @@ -11,5 +11,6 @@ public: static int getTimezoneOffset(); static void restartDtu(); static bool checkJsonAlloc(const DynamicJsonDocument& doc, const char* function, const uint16_t line); + static bool checkJsonOverflow(const DynamicJsonDocument& doc, const char* function, const uint16_t line); static void removeAllFiles(); }; diff --git a/src/MqttHandlVedirectHass.cpp b/src/MqttHandlVedirectHass.cpp index 01b718ab..b839af3c 100644 --- a/src/MqttHandlVedirectHass.cpp +++ b/src/MqttHandlVedirectHass.cpp @@ -151,6 +151,8 @@ void MqttHandleVedirectHassClass::publishSensor(const char *caption, const char root["stat_cla"] = stateClass; } + if (Utils::checkJsonOverflow(root, __FUNCTION__, __LINE__)) { return; } + char buffer[512]; serializeJson(root, buffer); publish(configTopic, buffer); @@ -195,6 +197,8 @@ void MqttHandleVedirectHassClass::publishBinarySensor(const char *caption, const JsonObject deviceObj = root.createNestedObject("dev"); createDeviceInfo(deviceObj, spMpptData); + if (Utils::checkJsonOverflow(root, __FUNCTION__, __LINE__)) { return; } + char buffer[512]; serializeJson(root, buffer); publish(configTopic, buffer); diff --git a/src/MqttHandleBatteryHass.cpp b/src/MqttHandleBatteryHass.cpp index 96428ea3..75912817 100644 --- a/src/MqttHandleBatteryHass.cpp +++ b/src/MqttHandleBatteryHass.cpp @@ -173,6 +173,8 @@ void MqttHandleBatteryHassClass::publishSensor(const char* caption, const char* root["stat_cla"] = stateClass; } + if (Utils::checkJsonOverflow(root, __FUNCTION__, __LINE__)) { return; } + char buffer[512]; serializeJson(root, buffer); publish(configTopic, buffer); @@ -216,6 +218,8 @@ void MqttHandleBatteryHassClass::publishBinarySensor(const char* caption, const JsonObject deviceObj = root.createNestedObject("dev"); createDeviceInfo(deviceObj); + if (Utils::checkJsonOverflow(root, __FUNCTION__, __LINE__)) { return; } + char buffer[512]; serializeJson(root, buffer); publish(configTopic, buffer); diff --git a/src/MqttHandlePowerLimiterHass.cpp b/src/MqttHandlePowerLimiterHass.cpp index 47edfbae..9576a84a 100644 --- a/src/MqttHandlePowerLimiterHass.cpp +++ b/src/MqttHandlePowerLimiterHass.cpp @@ -133,6 +133,8 @@ void MqttHandlePowerLimiterHassClass::publishSelect( JsonObject deviceObj = root.createNestedObject("dev"); createDeviceInfo(deviceObj); + if (Utils::checkJsonOverflow(root, __FUNCTION__, __LINE__)) { return; } + String buffer; serializeJson(root, buffer); publish(configTopic, buffer); @@ -179,6 +181,8 @@ void MqttHandlePowerLimiterHassClass::publishNumber( JsonObject deviceObj = root.createNestedObject("dev"); createDeviceInfo(deviceObj); + if (Utils::checkJsonOverflow(root, __FUNCTION__, __LINE__)) { return; } + String buffer; serializeJson(root, buffer); publish(configTopic, buffer); diff --git a/src/Utils.cpp b/src/Utils.cpp index 7ad07293..938b002d 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -79,6 +79,16 @@ bool Utils::checkJsonAlloc(const DynamicJsonDocument& doc, const char* function, return true; } +bool Utils::checkJsonOverflow(const DynamicJsonDocument& doc, const char* function, const uint16_t line) +{ + if (doc.overflowed()) { + MessageOutput.printf("DynamicJsonDocument overflowed: %s, %d\r\n", function, line); + return true; + } + + return false; +} + /// @brief Remove all files but the PINMAPPING_FILENAME void Utils::removeAllFiles() { diff --git a/src/WebApi_ws_Huawei.cpp b/src/WebApi_ws_Huawei.cpp index 1bf6870e..c674e05d 100644 --- a/src/WebApi_ws_Huawei.cpp +++ b/src/WebApi_ws_Huawei.cpp @@ -64,6 +64,8 @@ void WebApiWsHuaweiLiveClass::sendDataTaskCb() JsonVariant var = root; generateJsonResponse(var); + if (Utils::checkJsonOverflow(root, __FUNCTION__, __LINE__)) { return; } + String buffer; serializeJson(root, buffer); diff --git a/src/WebApi_ws_battery.cpp b/src/WebApi_ws_battery.cpp index be904f71..39aaf728 100644 --- a/src/WebApi_ws_battery.cpp +++ b/src/WebApi_ws_battery.cpp @@ -67,6 +67,8 @@ void WebApiWsBatteryLiveClass::sendDataTaskCb() JsonVariant var = root; generateJsonResponse(var); + if (Utils::checkJsonOverflow(root, __FUNCTION__, __LINE__)) { return; } + // battery provider does not generate a card, e.g., MQTT provider if (root.isNull()) { return; } diff --git a/src/WebApi_ws_live.cpp b/src/WebApi_ws_live.cpp index 12725923..7f42bf44 100644 --- a/src/WebApi_ws_live.cpp +++ b/src/WebApi_ws_live.cpp @@ -123,6 +123,8 @@ void WebApiWsLiveClass::sendOnBatteryStats() if (root.isNull()) { return; } + if (Utils::checkJsonOverflow(root, __FUNCTION__, __LINE__)) { return; } + String buffer; serializeJson(root, buffer); diff --git a/src/WebApi_ws_vedirect_live.cpp b/src/WebApi_ws_vedirect_live.cpp index 1a21ee03..967372cc 100644 --- a/src/WebApi_ws_vedirect_live.cpp +++ b/src/WebApi_ws_vedirect_live.cpp @@ -91,6 +91,8 @@ void WebApiWsVedirectLiveClass::sendDataTaskCb() JsonVariant var = root; generateJsonResponse(var, fullUpdate); + if (Utils::checkJsonOverflow(root, __FUNCTION__, __LINE__)) { return; } + String buffer; serializeJson(root, buffer);