@@ -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-
130143bool 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