From dde2c769db6c2d5da181a1de5a6927822b8f2f61 Mon Sep 17 00:00:00 2001 From: david gauchard Date: Mon, 3 Jan 2022 13:42:27 +0100 Subject: [PATCH] StreamConstPtr: disallow passing a String temporary (#8410) * StreamConstPtr: prevent from passing a temporary String instance * unconditionally allow progmem chars * 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 + cores/esp8266/StreamDev.h | 1 + cores/esp8266/StreamSend.cpp | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/cores/esp8266/Stream.h b/cores/esp8266/Stream.h index 6408befe0..1dd2ee24a 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 diff --git a/cores/esp8266/StreamDev.h b/cores/esp8266/StreamDev.h index b61a0df55..2aeee4c87 100644 --- a/cores/esp8266/StreamDev.h +++ b/cores/esp8266/StreamDev.h @@ -160,6 +160,7 @@ protected: 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 c35157546..693e340cf 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_P(text)).sendAll(out); return out; }