소스 검색

Fixed undefined behavior in `Prettyfier` and `Print` (issue #354)

Benoit Blanchon 9 년 전
부모
커밋
8a9b918bf4
3개의 변경된 파일31개의 추가작업 그리고 7개의 파일을 삭제
  1. 1 0
      CHANGELOG.md
  2. 24 6
      include/ArduinoJson/Internals/Prettyfier.hpp
  3. 6 1
      include/ArduinoJson/Print.hpp

+ 1 - 0
CHANGELOG.md

@@ -6,6 +6,7 @@ HEAD
 
 
 * Fixed `array[idx].as<JsonVariant>()` and `object[key].as<JsonVariant>()`
 * Fixed `array[idx].as<JsonVariant>()` and `object[key].as<JsonVariant>()`
 * Fixed return value of `JsonObject::set()` (issue #350)
 * Fixed return value of `JsonObject::set()` (issue #350)
+* Fixed undefined behavior in `Prettyfier` and `Print` (issue #354)
 
 
 v5.6.6
 v5.6.6
 ------
 ------

+ 24 - 6
include/ArduinoJson/Internals/Prettyfier.hpp

@@ -66,28 +66,46 @@ class Prettyfier : public Print {
   }
   }
 
 
   size_t writeBlockClose(uint8_t c) {
   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) {
   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() {
   size_t writeColon() {
-    return _sink.write(':') + _sink.write(' ');
+    size_t n = 0;
+    n += _sink.write(':');
+    n += _sink.write(' ');
+    return n;
   }
   }
 
 
   size_t writeComma() {
   size_t writeComma() {
-    return _sink.write(',') + _sink.println();
+    size_t n = 0;
+    n += _sink.write(',');
+    n += _sink.println();
+    return n;
   }
   }
 
 
   size_t writeQuoteOpen() {
   size_t writeQuoteOpen() {
     _inString = true;
     _inString = true;
-    return indentIfNeeded() + _sink.write('"');
+    size_t n = 0;
+    n += indentIfNeeded();
+    n += _sink.write('"');
+    return n;
   }
   }
 
 
   size_t writeNormalChar(uint8_t c) {
   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() {
   size_t indentIfNeeded() {

+ 6 - 1
include/ArduinoJson/Print.hpp

@@ -28,7 +28,12 @@ class Print {
     return n;
     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;
+  }
 };
 };
 }
 }