From 389c8345ca232b6263ab9cb6a59cd150bb25d0bd Mon Sep 17 00:00:00 2001 From: Norbert Date: Sat, 11 Jul 2026 23:05:23 +0200 Subject: [PATCH 1/5] Fix on/off transition flick (#5726) (cherry picked from commit c39d929854044e1c1598874a723a29f998f71b00) --- wled00/FX_fcn.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index 4afb99906b..f4b78087e6 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -1585,7 +1585,9 @@ void WS2812FX::blendSegment(const Segment &topSegment) const { // workaround for On/Off transition // (bri != briT) && !bri => from On to Off // (bri != briT) && bri => from Off to On - if ((briOld == 0 || bri == 0) && ((!clipped && (bri != briT) && !bri) || (clipped && (bri != briT) && bri))) c_a = BLACK; + // note: only blank pixels once the segment transition has actually started; bri changes before + // startTransition() is called (stateUpdated()) and a frame rendered in that window would blank the whole segment + if (topSegment.isInTransition() && (briOld == 0 || bri == 0) && ((!clipped && (bri != briT) && !bri) || (clipped && (bri != briT) && bri))) c_a = BLACK; } // map it into frame buffer x = c; // restore coordiates if we were PUSHing @@ -1657,7 +1659,9 @@ void WS2812FX::blendSegment(const Segment &topSegment) const { // workaround for On/Off transition // (bri != briT) && !bri => from On to Off // (bri != briT) && bri => from Off to On - if ((briOld == 0 || bri == 0) && ((!clipped && (bri != briT) && !bri) || (clipped && (bri != briT) && bri))) c_a = BLACK; + // note: only blank pixels once the segment transition has actually started; bri changes before + // startTransition() is called (stateUpdated()) and a frame rendered in that window would blank the whole segment + if (topSegment.isInTransition() && (briOld == 0 || bri == 0) && ((!clipped && (bri != briT) && !bri) || (clipped && (bri != briT) && bri))) c_a = BLACK; } // map into frame buffer i = k; // restore index if we were PUSHing From 08d86004855e3658bf6ee0a41344aca22301ebca Mon Sep 17 00:00:00 2001 From: Abolfazl Yazdanshenas Date: Sat, 11 Jul 2026 21:55:19 +0330 Subject: [PATCH 2/5] fix: prevent uint8 underflow in AP client disconnect handler (#5733) * fix: prevent uint8 underflow in AP client disconnect handler Add bounds check before decrementing apClients to prevent wraparound from 0 to 255 when WiFiEvent fires disconnect without a prior connect event. Also fix typo: awailable -> available (cherry picked from commit 2d738c8042221f7fd863ab310f8338365363bf1a) --- wled00/network.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/wled00/network.cpp b/wled00/network.cpp index 606fa65d9e..83e196178d 100644 --- a/wled00/network.cpp +++ b/wled00/network.cpp @@ -421,7 +421,8 @@ void WiFiEvent(WiFiEvent_t event) switch (event) { case ARDUINO_EVENT_WIFI_AP_STADISCONNECTED: // AP client disconnected - if (--apClients == 0 && isWiFiConfigured()) forceReconnect = true; // no clients reconnect WiFi if awailable + if (apClients > 0) apClients--; + if (apClients == 0 && isWiFiConfigured()) forceReconnect = true; // no clients reconnect WiFi if available DEBUG_PRINTF_P(PSTR("WiFi-E: AP Client Disconnected (%d) @ %lus.\n"), (int)apClients, millis()/1000); break; case ARDUINO_EVENT_WIFI_AP_STACONNECTED: From 6d77fd6bcee8f826c616fc29fc2eb57ae67460f0 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Sat, 8 Aug 2026 08:10:09 +0200 Subject: [PATCH 3/5] create default segment if out of heap (#5736) (cherry picked from commit bd31a830abc75a0679fdd9f1c7cf344e32f18615) --- wled00/FX_fcn.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index f4b78087e6..adcc5e7079 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -1911,8 +1911,9 @@ void WS2812FX::resetSegments() { if (isServicing()) return; _segments.clear(); // destructs all Segment as part of clearing _segments.emplace_back(0, isMatrix ? Segment::maxWidth : _length, 0, isMatrix ? Segment::maxHeight : 1); - if(_segments.size() == 0) { - _segments.emplace_back(); // if out of heap, create a default segment + if (getActiveSegmentsNum() == 0) { + _segments.clear(); // free failed segment + _segments.emplace_back(); // if out of heap, create a default 30 pixel segment errorFlag = ERR_NORAM_PX; } _segments.shrink_to_fit(); // just in case ... @@ -1989,6 +1990,7 @@ void WS2812FX::makeAutoSegments(bool forceReset) { #endif } } + if (getActiveSegmentsNum() == 0) resetSegments(); // fallback if auto segment creation failed _mainSegment = 0; fixInvalidSegments(); From 318a6afc359d597940cc97b190f88aaee2cd4c76 Mon Sep 17 00:00:00 2001 From: Damian Schneider Date: Fri, 25 Sep 2026 18:28:02 +0200 Subject: [PATCH 4/5] bugfix: reconnect if AP SSID changed, see #5866 (cherry picked from commit 4ee90bd9327faa7642956ce42796b4851075985c) --- wled00/set.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wled00/set.cpp b/wled00/set.cpp index fb516ac7d6..7f61cb87bb 100644 --- a/wled00/set.cpp +++ b/wled00/set.cpp @@ -105,7 +105,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) apBehavior = request->arg(F("AB")).toInt(); char oldSSID[33]; strcpy(oldSSID, apSSID); strlcpy(apSSID, request->arg(F("AS")).c_str(), 33); - if (!strcmp(oldSSID, apSSID) && apActive) forceReconnect = true; + if ((strcmp(oldSSID, apSSID) != 0) && apActive) forceReconnect = true; // AP SSID changed apHide = request->hasArg(F("AH")); int passlen = request->arg(F("AP")).length(); if (passlen == 0 || (passlen > 7 && !isAsterisksOnly(request->arg(F("AP")).c_str(), 65))) { From 5cbb475bd155a3629858bc02df6dde90d5bc0fab Mon Sep 17 00:00:00 2001 From: Christian Schwinne Date: Thu, 15 Oct 2026 20:01:02 +0200 Subject: [PATCH 5/5] Fix OOB playlist transition read (#5909) Advisory by @redhotchilihacker1 (cherry picked from commit 38df4ccc2234a73944b455de6fe9a328c95d96a1) --- wled00/playlist.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/wled00/playlist.cpp b/wled00/playlist.cpp index c5acecdaf1..d8dde0c744 100644 --- a/wled00/playlist.cpp +++ b/wled00/playlist.cpp @@ -109,7 +109,8 @@ int16_t loadPlaylist(JsonObject playlistObj, byte presetId) { it++; } } - for (int i = it; i < playlistLen; i++) playlistEntries[i].tr = playlistEntries[it -1].tr; + if (it > 0) // should never happen but just in case + for (int i = it; i < playlistLen; i++) playlistEntries[i].tr = playlistEntries[it -1].tr; int rep = playlistObj[F("repeat")]; bool shuffle = false;