Просмотр исходного кода

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

Benoit Blanchon 9 лет назад
Родитель
Сommit
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 return value of `JsonObject::set()` (issue #350)
+* Fixed undefined behavior in `Prettyfier` and `Print` (issue #354)
 
 v5.6.6
 ------

+ 24 - 6
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() {

+ 6 - 1
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;
+  }
 };
 }