Skip to content

Commit 6740583

Browse files
netmindzsofthack007
authored andcommitted
Merge pull request wled#5407 from wled/copilot/allow-upgrade-to-esp32
Allow OTA upgrade between ESP32_V4 and ESP32 release names
1 parent bcdf0ce commit 6740583

1 file changed

Lines changed: 20 additions & 15 deletions

File tree

wled00/wled_metadata.cpp

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -118,35 +118,40 @@ bool findWledMetadata(const uint8_t* binaryData, size_t dataSize, wled_metadata_
118118
}
119119

120120

121+
// Strip "_V4" suffix from a release name to allow upgrading between IDF v4 and newer IDF builds.
122+
static String normalizeReleaseName(const String& name) {
123+
if (name.endsWith("_V4")) return name.substring(0, name.length() - 3);
124+
return name;
125+
}
126+
127+
template<size_t len>
128+
static inline String bufToString(const char (&buf)[len]) {
129+
char sbuf[len+1];
130+
size_t real_len = strnlen(buf, len);
131+
memcpy(sbuf, buf, real_len);
132+
sbuf[len] = '\0';
133+
return sbuf;
134+
}
135+
121136
/**
122137
* Check if OTA should be allowed based on release compatibility using custom description
123-
* @param binaryData Pointer to binary file data (not modified)
124-
* @param dataSize Size of binary data in bytes
138+
* @param firmwareDescription Description object from proposed new firmware
125139
* @param errorMessage Buffer to store error message if validation fails
126140
* @param errorMessageLen Maximum length of error message buffer
127141
* @return true if OTA should proceed, false if it should be blocked
128142
*/
129-
130143
bool shouldAllowOTA(const wled_metadata_t& firmwareDescription, char* errorMessage, size_t errorMessageLen) {
131144
// Clear error message
132145
if (errorMessage && errorMessageLen > 0) {
133146
errorMessage[0] = '\0';
134147
}
135148

136-
// Validate compatibility using extracted release name
137-
// We make a stack copy so we can print it safely
138-
char safeFirmwareRelease[WLED_RELEASE_NAME_MAX_LEN];
139-
strncpy(safeFirmwareRelease, firmwareDescription.release_name, WLED_RELEASE_NAME_MAX_LEN - 1);
140-
safeFirmwareRelease[WLED_RELEASE_NAME_MAX_LEN - 1] = '\0';
149+
const String uploadedRelease = bufToString(firmwareDescription.release_name);
141150

142-
if (strlen(safeFirmwareRelease) == 0) {
143-
return false;
144-
}
145-
146-
if (strncmp_P(safeFirmwareRelease, releaseString, WLED_RELEASE_NAME_MAX_LEN) != 0) {
151+
if (normalizeReleaseName(uploadedRelease) != normalizeReleaseName(releaseString)) {
147152
if (errorMessage && errorMessageLen > 0) {
148-
snprintf_P(errorMessage, errorMessageLen, PSTR("Firmware release name mismatch: current='%s', uploaded='%s'."),
149-
releaseString, safeFirmwareRelease);
153+
snprintf_P(errorMessage, errorMessageLen, PSTR("Firmware release name mismatch: current='%s', uploaded='%s'."),
154+
releaseString, uploadedRelease.c_str());
150155
errorMessage[errorMessageLen - 1] = '\0'; // Ensure null termination
151156
}
152157
return false;

0 commit comments

Comments
 (0)