diff --git a/CHANGELOG.md b/CHANGELOG.md index 1988a35e..1c05e543 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ HEAD * Fixed `array[idx].as()` and `object[key].as()` * Fixed return value of `JsonObject::set()` (issue #350) +* Fixed undefined behavior in `Prettyfier` and `Print` (issue #354) v5.6.6 ------ diff --git a/include/ArduinoJson/Internals/Prettyfier.hpp b/include/ArduinoJson/Internals/Prettyfier.hpp index 0136b1c0..192e63e1 100644 --- a/include/ArduinoJson/Internals/Prettyfier.hpp +++ b/include/ArduinoJson/Internals/Prettyfier.hpp @@ -66,28 +66,46 @@ class Prettyfier : public Print { } size_t writeBlockClose(uint8_t c) { - return unindentIfNeeded() + _sink.write(c); + size_t n = 0; + n += unindentIfNeeded(); + n += _sink.write(c); + return n; } size_t writeBlockOpen(uint8_t c) { - return indentIfNeeded() + _sink.write(c); + size_t n = 0; + n += indentIfNeeded(); + n += _sink.write(c); + return n; } size_t writeColon() { - return _sink.write(':') + _sink.write(' '); + size_t n = 0; + n += _sink.write(':'); + n += _sink.write(' '); + return n; } size_t writeComma() { - return _sink.write(',') + _sink.println(); + size_t n = 0; + n += _sink.write(','); + n += _sink.println(); + return n; } size_t writeQuoteOpen() { _inString = true; - return indentIfNeeded() + _sink.write('"'); + size_t n = 0; + n += indentIfNeeded(); + n += _sink.write('"'); + return n; } size_t writeNormalChar(uint8_t c) { - return indentIfNeeded() + _sink.write(c); + size_t n = 0; + n += indentIfNeeded(); + n += _sink.write(c); + return n; } size_t indentIfNeeded() { diff --git a/include/ArduinoJson/Print.hpp b/include/ArduinoJson/Print.hpp index 4a880a55..367b3ae3 100644 --- a/include/ArduinoJson/Print.hpp +++ b/include/ArduinoJson/Print.hpp @@ -28,7 +28,12 @@ class Print { return n; } - size_t println() { return write('\r') + write('\n'); } + size_t println() { + size_t n = 0; + n += write('\r'); + n += write('\n'); + return n; + } }; }