From 1c9456ac9d5c6b3424e6c9ebdec07e5944d5d246 Mon Sep 17 00:00:00 2001 From: Martin Ayotte Date: Sun, 6 Sep 2015 14:14:36 -0400 Subject: [PATCH] fix bug in WiFiClient::write_P/ESP8266WebServer::sendContent_P introduced few minutes ago when changing memccpy_P to memcpy_P --- .../ESP8266WebServer/src/ESP8266WebServer.cpp | 23 ++++++------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp b/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp index f2f21c781..326ed24bc 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp @@ -223,28 +223,19 @@ void ESP8266WebServer::sendContent_P(PGM_P content) { void ESP8266WebServer::sendContent_P(PGM_P content, size_t size) { char contentUnit[HTTP_DOWNLOAD_UNIT_SIZE + 1]; - contentUnit[HTTP_DOWNLOAD_UNIT_SIZE] = '\0'; + size_t remaining_size = size; - while (content != NULL) { - size_t contentUnitLen; - PGM_P contentNext; + while (content != NULL && remaining_size > 0) { + size_t contentUnitLen = HTTP_DOWNLOAD_UNIT_SIZE; + if (remaining_size < HTTP_DOWNLOAD_UNIT_SIZE) contentUnitLen = remaining_size; // due to the memcpy signature, lots of casts are needed - contentNext = (PGM_P)memcpy_P((void*)contentUnit, (PGM_VOID_P)content, HTTP_DOWNLOAD_UNIT_SIZE); + memcpy_P((void*)contentUnit, (PGM_VOID_P)content, contentUnitLen); - if (contentNext == NULL) { - // no terminator, more data available - content += HTTP_DOWNLOAD_UNIT_SIZE; - contentUnitLen = HTTP_DOWNLOAD_UNIT_SIZE; - } - else { - // reached terminator - contentUnitLen = contentNext - content; - content = NULL; - } + content += contentUnitLen; + remaining_size -= contentUnitLen; - if (size < WIFICLIENT_MAX_PACKET_SIZE) contentUnitLen = size; // write is so overloaded, had to use the cast to get it pick the right one _currentClient.write((const char*)contentUnit, contentUnitLen); }