From 9439d6d3f3386c39e856593cb58f85fa8b2bbc5a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Patrick=20Kn=C3=B6bel?=
 <5472845+im-pro-at@users.noreply.github.com>
Date: Fri, 28 Jan 2022 21:24:20 +0100
Subject: [PATCH] Fix random CaptivePortal.ino crashes

CaptivePortal.ino example did randomly crash for me ... so I start investigate ;-)

Decoding stack results
0x4016faea: WiFiUDP::write(unsigned char const*, unsigned int) at C:\Users\knoeb\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.5\libraries\WiFi\src\WiFiUdp.cpp line 201
0x400d4a4a: DNSServer::replyWithIP() at C:\Users\knoeb\AppData\Local\Temp\arduino_build_486825\sketch\src\DNSServer\DNSServer.cpp line 187
0x400d4d01: DNSServer::processNextRequest() at C:\Users\knoeb\AppData\Local\Temp\arduino_build_486825\sketch\src\DNSServer\DNSServer.cpp line 117
0x400d3e81: loop() at D:\Drive\Dokumente\HTL_Lehrer\2021_22\Projekte\Stromzaehler_Patrick\arduino/arduino.ino line 1078
0x400dd545: loopTask(void*) at C:\Users\knoeb\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.5\cores\esp32\main.cpp line 37
0x4008a0de: vPortTaskWrapper at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/port.c line 143

I found with wireshark a possibility to trigger the crash on demand is:
nslookup 3.1o1osr0092ons87rp375p1pq8q066o8p56or1sqsps6rs17r4384q9748qr1r52.699p1r741q737393648s29917o45p16q50rn517rnsp73pp68p1q259s92693qp.s607408539s0p06p7559os0899866344r7qq7rpns960o9576q65.r5n94r5so9784pq1.i.03.s.sophosxl.net

The problem was that QNameLength is a signed byte and therefore its not possible to count up to 255. Additionally we need 256 bytes for the QName string to accommodate for the zero termination.
---
 libraries/DNSServer/src/DNSServer.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/libraries/DNSServer/src/DNSServer.h b/libraries/DNSServer/src/DNSServer.h
index a10ef9eaaf1..a8de0eff73b 100644
--- a/libraries/DNSServer/src/DNSServer.h
+++ b/libraries/DNSServer/src/DNSServer.h
@@ -66,8 +66,8 @@ struct DNSHeader
 
 struct DNSQuestion
 {
-  uint8_t   QName[255] ;
-  int8_t    QNameLength ; 
+  uint8_t   QName[256] ; //need 1 Byte for zero termination!
+  uint8_t   QNameLength ; 
   uint16_t  QType ; 
   uint16_t  QClass ; 
 } ; 
@@ -106,4 +106,4 @@ class DNSServer
     void replyWithIP();
     void replyWithCustomCode();
 };
-#endif
\ No newline at end of file
+#endif