Skip to content

Commit 32ed6ca

Browse files
authored
ledmap parser robustness improvements
* do not read past end of array "]" * digest "unexpected" order of tags (always rewind input) * better user message on success
1 parent 9db1022 commit 32ed6ca

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

wled00/FX_fcn.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2660,6 +2660,7 @@ bool WS2812FX::deserializeMap(uint8_t n) {
26602660
//DEBUG_PRINTF(" (\"width\": %s) ", fileName)
26612661

26622662
memset(fileName, 0, sizeof(fileName)); // clear old buffer
2663+
f.seek(0); // rewind to start
26632664
f.find("\"height\":");
26642665
f.readBytesUntil('\n', fileName, sizeof(fileName)-1);
26652666
uint16_t maxHeight = atoi(cleanUpName(fileName));
@@ -2677,7 +2678,7 @@ bool WS2812FX::deserializeMap(uint8_t n) {
26772678
#endif
26782679
}
26792680

2680-
USER_PRINTF("deserializeMap %d x %d\n", Segment::maxWidth, Segment::maxHeight);
2681+
DEBUG_PRINTF("deserializeMap %d x %d\n", Segment::maxWidth, Segment::maxHeight);
26812682

26822683
//WLEDMM recreate customMappingTable if more space needed
26832684
if (Segment::maxWidth * Segment::maxHeight > customMappingTableSize) {
@@ -2707,21 +2708,27 @@ bool WS2812FX::deserializeMap(uint8_t n) {
27072708
// WLEDMM reset mapping table before loading
27082709
//memset(customMappingTable, 0xFF, customMappingTableSize * sizeof(uint16_t)); // FFFF = no pixel
27092710
for (unsigned i=0; i<customMappingTableSize; i++) customMappingTable[i]=i; // "neutral" 1:1 mapping
2710-
27112711
//WLEDMM: find the map values
2712+
f.seek(0); // rewind to start
27122713
f.find("\"map\":");
27132714
f.readBytesUntil('[', fileName, sizeof(fileName)-1); // drop everything until "["
27142715
uint16_t i=0;
2716+
bool endOfArray = false;
27152717
do { //for each element in the array
2716-
int mapi = f.readStringUntil(',').toInt();
2717-
// USER_PRINTF(", %d(%d)", mapi, i);
2718+
String entry = f.readStringUntil(',');
2719+
int mapi = entry.toInt();
2720+
//DEBUG_PRINTF("%c %d(%d)", i>0?',':' ', mapi, i);
27182721
if (i < customMappingSize) customMappingTable[i++] = (uint16_t) (mapi<0 ? 0xFFFFU : mapi); // WLEDMM do not write past array bounds
2719-
} while (f.available() && (i < customMappingSize));
2722+
endOfArray = entry.indexOf("]") >= 0; // if we hit "]", stop reading
2723+
} while (f.available() && (i < customMappingSize) && !endOfArray);
2724+
//DEBUG_PRINTLN("");
27202725

27212726
loadedLedmap = n;
27222727
f.close();
27232728

2724-
USER_PRINTF("Custom ledmap: %d size=%d\n", loadedLedmap, customMappingSize);
2729+
if ((customMappingTable != nullptr) && (customMappingSize>0)) {
2730+
USER_PRINTF(PSTR("Ledmap #%d read. Size=%d (%d x %d); %d items found.\n"), loadedLedmap, customMappingSize, Segment::maxWidth, Segment::maxHeight, i);
2731+
}
27252732
#ifdef WLED_DEBUG_MAPS
27262733
for (uint16_t j=0; j<customMappingSize; j++) { // fixing a minor warning: declaration of 'i' shadows a previous local
27272734
if (!(j%Segment::maxWidth)) DEBUG_PRINTLN();

0 commit comments

Comments
 (0)