From 717ca79ecb1f3698db7a32b6548374026cc1a56c Mon Sep 17 00:00:00 2001 From: Tijs van Roon Date: Sun, 8 Sep 2019 22:49:32 +0200 Subject: [PATCH] #3181 printf double vsnprintf() fix, malloc, va_end (#3184) * Use loc_buf for small strings, check for error return from vsnprintf * cleanup arg when bailing out of new * Use malloc/free instead of new/delete in printf * Return actual bytes written in printf * FIX: write before free --- cores/esp32/Print.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/cores/esp32/Print.cpp b/cores/esp32/Print.cpp index 65fa1e9da..76b00aa3c 100644 --- a/cores/esp32/Print.cpp +++ b/cores/esp32/Print.cpp @@ -52,19 +52,24 @@ size_t Print::printf(const char *format, ...) va_list copy; va_start(arg, format); va_copy(copy, arg); - size_t len = vsnprintf(NULL, 0, format, copy); + int len = vsnprintf(temp, sizeof(loc_buf), format, copy); va_end(copy); + if(len < 0) { + va_end(arg); + return 0; + }; if(len >= sizeof(loc_buf)){ - temp = new char[len+1]; + temp = (char*) malloc(len+1); if(temp == NULL) { + va_end(arg); return 0; } + len = vsnprintf(temp, len+1, format, arg); } - len = vsnprintf(temp, len+1, format, arg); - write((uint8_t*)temp, len); va_end(arg); - if(len >= sizeof(loc_buf)){ - delete[] temp; + len = write((uint8_t*)temp, len); + if(temp != loc_buf){ + free(temp); } return len; } -- GitLab