From 47d24a00da56cbd13a52fe33597d8d82e78024b1 Mon Sep 17 00:00:00 2001 From: Paulo Cabral Sanz Date: Tue, 12 Jan 2021 18:52:43 -0300 Subject: [PATCH 1/4] Avoid UB and abort on nullptr buffer --- libraries/ESP8266WiFi/src/WiFiClient.cpp | 2 +- libraries/Netdump/src/Netdump.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/ESP8266WiFi/src/WiFiClient.cpp b/libraries/ESP8266WiFi/src/WiFiClient.cpp index 5aa09b8874..bd3408b75d 100644 --- a/libraries/ESP8266WiFi/src/WiFiClient.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClient.cpp @@ -207,7 +207,7 @@ size_t WiFiClient::write(uint8_t b) size_t WiFiClient::write(const uint8_t *buf, size_t size) { - if (!_client || !size) + if (!buf || !_client || !size) { return 0; } diff --git a/libraries/Netdump/src/Netdump.cpp b/libraries/Netdump/src/Netdump.cpp index 4d6a9f42dc..d032b42180 100644 --- a/libraries/Netdump/src/Netdump.cpp +++ b/libraries/Netdump/src/Netdump.cpp @@ -162,7 +162,7 @@ void Netdump::tcpDumpProcess(const Packet& np) } size_t incl_len = np.getPacketSize() > maxPcapLength ? maxPcapLength : np.getPacketSize(); - if (bufferIndex + 16 + incl_len < tcpBufferSize) // only add if enough space available + if (packetBuffer && bufferIndex + 16 + incl_len < tcpBufferSize) // only add if enough space available { struct timeval tv; gettimeofday(&tv, nullptr); From c19e025432607532544c7292c3505defbe20dbb7 Mon Sep 17 00:00:00 2001 From: Paulo Cabral Sanz Date: Tue, 12 Jan 2021 19:04:38 -0300 Subject: [PATCH 2/4] Improve handling of nullptr buffer --- libraries/ESP8266WiFi/src/WiFiClient.cpp | 2 +- libraries/Netdump/src/Netdump.cpp | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/libraries/ESP8266WiFi/src/WiFiClient.cpp b/libraries/ESP8266WiFi/src/WiFiClient.cpp index bd3408b75d..5aa09b8874 100644 --- a/libraries/ESP8266WiFi/src/WiFiClient.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClient.cpp @@ -207,7 +207,7 @@ size_t WiFiClient::write(uint8_t b) size_t WiFiClient::write(const uint8_t *buf, size_t size) { - if (!buf || !_client || !size) + if (!_client || !size) { return 0; } diff --git a/libraries/Netdump/src/Netdump.cpp b/libraries/Netdump/src/Netdump.cpp index d032b42180..4cafd2be51 100644 --- a/libraries/Netdump/src/Netdump.cpp +++ b/libraries/Netdump/src/Netdump.cpp @@ -90,6 +90,10 @@ void Netdump::tcpDump(WiFiServer &tcpDumpServer, const Filter nf) if (!packetBuffer) { packetBuffer = new (std::nothrow) char[tcpBufferSize]; + + if (!packetBuffer) { + return; + } } bufferIndex = 0; @@ -162,7 +166,7 @@ void Netdump::tcpDumpProcess(const Packet& np) } size_t incl_len = np.getPacketSize() > maxPcapLength ? maxPcapLength : np.getPacketSize(); - if (packetBuffer && bufferIndex + 16 + incl_len < tcpBufferSize) // only add if enough space available + if (bufferIndex + 16 + incl_len < tcpBufferSize) // only add if enough space available { struct timeval tv; gettimeofday(&tv, nullptr); From 34bbf1390f12d3fa6390e7f5f89135e4c0493490 Mon Sep 17 00:00:00 2001 From: Paulo Cabral Sanz Date: Tue, 12 Jan 2021 19:09:10 -0300 Subject: [PATCH 3/4] Fix style --- libraries/Netdump/src/Netdump.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/Netdump/src/Netdump.cpp b/libraries/Netdump/src/Netdump.cpp index 4cafd2be51..cec2284a0c 100644 --- a/libraries/Netdump/src/Netdump.cpp +++ b/libraries/Netdump/src/Netdump.cpp @@ -91,7 +91,8 @@ void Netdump::tcpDump(WiFiServer &tcpDumpServer, const Filter nf) { packetBuffer = new (std::nothrow) char[tcpBufferSize]; - if (!packetBuffer) { + if (!packetBuffer) + { return; } } From 0b55775e635f243581f0f4fc100f033dfb920c13 Mon Sep 17 00:00:00 2001 From: Paulo Cabral Sanz Date: Tue, 12 Jan 2021 19:30:32 -0300 Subject: [PATCH 4/4] Report OOM on return value --- libraries/Netdump/src/Netdump.cpp | 5 +++-- libraries/Netdump/src/Netdump.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/libraries/Netdump/src/Netdump.cpp b/libraries/Netdump/src/Netdump.cpp index cec2284a0c..326f2eaa73 100644 --- a/libraries/Netdump/src/Netdump.cpp +++ b/libraries/Netdump/src/Netdump.cpp @@ -84,7 +84,7 @@ void Netdump::fileDump(File& outfile, const Filter nf) fileDumpProcess(outfile, ndp); }, nf); } -void Netdump::tcpDump(WiFiServer &tcpDumpServer, const Filter nf) +bool Netdump::tcpDump(WiFiServer &tcpDumpServer, const Filter nf) { if (!packetBuffer) @@ -93,7 +93,7 @@ void Netdump::tcpDump(WiFiServer &tcpDumpServer, const Filter nf) if (!packetBuffer) { - return; + return false; } } bufferIndex = 0; @@ -102,6 +102,7 @@ void Netdump::tcpDump(WiFiServer &tcpDumpServer, const Filter nf) { tcpDumpLoop(tcpDumpServer, nf); }); + return true; } void Netdump::capture(int netif_idx, const char* data, size_t len, int out, int success) diff --git a/libraries/Netdump/src/Netdump.h b/libraries/Netdump/src/Netdump.h index 1011a8e955..8ef4532883 100644 --- a/libraries/Netdump/src/Netdump.h +++ b/libraries/Netdump/src/Netdump.h @@ -53,7 +53,7 @@ class Netdump void printDump(Print& out, Packet::PacketDetail ndd, const Filter nf = nullptr); void fileDump(File& outfile, const Filter nf = nullptr); - void tcpDump(WiFiServer &tcpDumpServer, const Filter nf = nullptr); + bool tcpDump(WiFiServer &tcpDumpServer, const Filter nf = nullptr); private: