From 7bf99fc5fdbd3372b3e4558bf78ac474bb057130 Mon Sep 17 00:00:00 2001 From: david gauchard Date: Wed, 15 Dec 2021 11:25:48 +0100 Subject: [PATCH 1/3] StreamConstPtr: prevent from passing a temporary String instance --- cores/esp8266/StreamDev.h | 1 + cores/esp8266/StreamSend.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cores/esp8266/StreamDev.h b/cores/esp8266/StreamDev.h index b61a0df55a..2aeee4c87a 100644 --- a/cores/esp8266/StreamDev.h +++ b/cores/esp8266/StreamDev.h @@ -160,6 +160,7 @@ class StreamConstPtr: public StreamNull size_t _peekPointer = 0; public: + StreamConstPtr(const String&& string) = delete; // prevents passing String temporary, use ctor(buffer,size) if you know what you are doing StreamConstPtr(const String& string): _buffer(string.c_str()), _size(string.length()), _byteAddressable(true) { } StreamConstPtr(const char* buffer, size_t size): _buffer(buffer), _size(size), _byteAddressable(__byteAddressable(buffer)) { } StreamConstPtr(const uint8_t* buffer, size_t size): _buffer((const char*)buffer), _size(size), _byteAddressable(__byteAddressable(buffer)) { } diff --git a/cores/esp8266/StreamSend.cpp b/cores/esp8266/StreamSend.cpp index c351575463..cce1fd0a4f 100644 --- a/cores/esp8266/StreamSend.cpp +++ b/cores/esp8266/StreamSend.cpp @@ -341,7 +341,7 @@ Stream& operator << (Stream& out, Stream& stream) Stream& operator << (Stream& out, const char* text) { - StreamConstPtr(text).sendAll(out); + StreamConstPtr(text, strlen(text)).sendAll(out); return out; } From d0d30b51e90389c7e492e8b5c158f4e5ff345e61 Mon Sep 17 00:00:00 2001 From: david gauchard Date: Wed, 15 Dec 2021 11:38:00 +0100 Subject: [PATCH 2/3] unconditionally allow progmem chars --- cores/esp8266/StreamSend.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp8266/StreamSend.cpp b/cores/esp8266/StreamSend.cpp index cce1fd0a4f..693e340cff 100644 --- a/cores/esp8266/StreamSend.cpp +++ b/cores/esp8266/StreamSend.cpp @@ -341,7 +341,7 @@ Stream& operator << (Stream& out, Stream& stream) Stream& operator << (Stream& out, const char* text) { - StreamConstPtr(text, strlen(text)).sendAll(out); + StreamConstPtr(text, strlen_P(text)).sendAll(out); return out; } From 9fad714141fafb8eb641f7382edc2b36222b3830 Mon Sep 17 00:00:00 2001 From: david gauchard Date: Wed, 15 Dec 2021 11:49:39 +0100 Subject: [PATCH 3/3] missing virtual destructor in Stream (warning: deleting object of abstract class type 'Stream' which has non-virtual destructor will cause undefined behavior [-Wdelete-non-virtual-dtor]) --- cores/esp8266/Stream.h | 1 + 1 file changed, 1 insertion(+) diff --git a/cores/esp8266/Stream.h b/cores/esp8266/Stream.h index 6408befe02..1dd2ee24a6 100644 --- a/cores/esp8266/Stream.h +++ b/cores/esp8266/Stream.h @@ -61,6 +61,7 @@ class Stream: public Print { virtual int peek() = 0; Stream() {} + virtual ~Stream() {} // parsing methods