Crash beim 2.Abspielen einer M3U-Playlist

Moin, mir ist ein Bug beim Testen aufgefallen:

Ich habe diese myPlaylist.zip (322 Bytes) Testdatei auf der SD-Karte und spiele sie über das Kontextmenu der Web-UI ab.
Das klappt auch fein beim ersten Mal. Allerdings werden in der Web-UI

grafik

angezeigt obwohl es nur zwei Tracks sind.
Der Crash kommt wenn ich die Datei nochmal über das Kontextmenu abspielen möchte:

..
[ 84694 ]  Gebe Speicher der alten Playlist frei.

assert failed: heap_caps_free heap_caps.c:360 (heap != NULL && "free() target pointer is outside heap areas")


Backtrace: 0x40084795:0x3ffe7d70 0x40090035:0x3ffe7d90 0x400968d5:0x3ffe7db0 0x40084d6e:0x3ffe7ee0 0x40096905:0x3ffe7f00 0x400d8191:0x3ffe7f20 0x400d861d:0x3ffe7f40 0x400d48b7:0x3ffe8200 0x400daf15:0x3ffe8340 0x401c5ffb:0x3ffe84a0 0x4010e48e:0x3ffe84c0 0x4010bcd5:0x3ffe8510 0x4010bdf2:0x3ffe8560 0x4010bfe5:0x3ffe85b0 0x401b276e:0x3ffe85d0 0x401b27ed:0x3ffe8600 0x401b306a:0x3ffe8620

  #0  0x40084795:0x3ffe7d70 in panic_abort at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/esp_system/panic.c:408
  #1  0x40090035:0x3ffe7d90 in esp_system_abort at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/esp_system/esp_system.c:137
  #2  0x400968d5:0x3ffe7db0 in __assert_func at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/newlib/assert.c:85
  #3  0x40084d6e:0x3ffe7ee0 in heap_caps_free at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/heap/heap_caps.c:360
      (inlined by) heap_caps_free at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/heap/heap_caps.c:345
  #4  0x40096905:0x3ffe7f00 in free at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/newlib/heap.c:39
  #5  0x400d8191:0x3ffe7f20 in freeMultiCharArray(char**, unsigned int) at src/Common.h:147 (discriminator 2)
  #6  0x400d861d:0x3ffe7f40 in SdCard_ReturnPlaylist(char const*, unsigned int) at src/SdCard.cpp:244
  #7  0x400d48b7:0x3ffe8200 in AudioPlayer_TrackQueueDispatcher(char const*, unsigned int, unsigned int, unsigned short) at src/AudioPlayer.cpp:844
  #8  0x400daf15:0x3ffe8340 in explorerHandleAudioRequest(AsyncWebServerRequest*) at src/Web.cpp:1186
  #9  0x401c5ffb:0x3ffe84a0 in std::_Function_handler<void (AsyncWebServerRequest*), void (*)(AsyncWebServerRequest*)>::_M_invoke(std::_Any_data const&, AsyncWebServerRequest*&&) at c:\users\dcars\.platformio\packages\toolchain-xtensa-esp32\xtensa-esp32-elf\include\c++\8.4.0\bits/std_function.h:297
  #10 0x4010e48e:0x3ffe84c0 in std::function<void (AsyncWebServerRequest*)>::operator()(AsyncWebServerRequest*) const at c:\users\dcars\.platformio\packages\toolchain-xtensa-esp32\xtensa-esp32-elf\include\c++\8.4.0\bits/std_function.h:687
      (inlined by) AsyncCallbackWebHandler::handleRequest(AsyncWebServerRequest*) at .pio/libdeps/lolin_d32_pro_sdmmc_pe/ESP Async WebServer/src/WebHandlerImpl.h:132 
  #11 0x4010bcd5:0x3ffe8510 in AsyncWebServerRequest::_parseLine() at .pio/libdeps/lolin_d32_pro_sdmmc_pe/ESP Async WebServer/src/WebRequest.cpp:581 (discriminator 1)
  #12 0x4010bdf2:0x3ffe8560 in AsyncWebServerRequest::_onData(void*, unsigned int) at .pio/libdeps/lolin_d32_pro_sdmmc_pe/ESP Async WebServer/src/WebRequest.cpp:123  
  #13 0x4010bfe5:0x3ffe85b0 in std::_Function_handler<void (void*, AsyncClient*, void*, unsigned int), AsyncWebServerRequest::AsyncWebServerRequest(AsyncWebServer*, AsyncClient*)::{lambda(void*, AsyncClient*, void*, unsigned int)#8}>::_M_invoke(std::_Any_data const&, void*&&, AsyncClient*&&, std::_Any_data const&, unsigned int&&) at .pio/libdeps/lolin_d32_pro_sdmmc_pe/ESP Async WebServer/src/WebRequest.cpp:76
      (inlined by) _M_invoke at c:\users\dcars\.platformio\packages\toolchain-xtensa-esp32\xtensa-esp32-elf\include\c++\8.4.0\bits/std_function.h:297
  #14 0x401b276e:0x3ffe85d0 in std::function<void (void*, AsyncClient*, void*, unsigned int)>::operator()(void*, AsyncClient*, void*, unsigned int) const at c:\users\dcars\.platformio\packages\toolchain-xtensa-esp32\xtensa-esp32-elf\include\c++\8.4.0\bits/std_function.h:687
      (inlined by) AsyncClient::_recv(tcp_pcb*, pbuf*, signed char) at .pio/libdeps/lolin_d32_pro_sdmmc_pe/AsyncTCP@src-b1b5fe1257067f03f2d57f92cc6925a2/src/AsyncTCP.cpp:934
  #15 0x401b27ed:0x3ffe8600 in AsyncClient::_s_recv(void*, tcp_pcb*, pbuf*, signed char) at .pio/libdeps/lolin_d32_pro_sdmmc_pe/AsyncTCP@src-b1b5fe1257067f03f2d57f92cc6925a2/src/AsyncTCP.cpp:1210
  #16 0x401b306a:0x3ffe8620 in _async_service_task(void*) at .pio/libdeps/lolin_d32_pro_sdmmc_pe/AsyncTCP@src-b1b5fe1257067f03f2d57f92cc6925a2/src/AsyncTCP.cpp:162   
      (inlined by) _async_service_task at .pio/libdeps/lolin_d32_pro_sdmmc_pe/AsyncTCP@src-b1b5fe1257067f03f2d57f92cc6925a2/src/AsyncTCP.cpp:197

Ist der Crash bei Euch reproduzierbar? Bei mir sowohl mit offizieller als auch DEV Version, Bug scheint also schon länger zu schlummern.

Soweit ich das sehen kann kommt der Crash beim Freigeben der Playlist SdCard_ReturnPlaylist. Ich vermute das sie bereits fehlerhaft generiert wird und evt. die Kommentarzeilen #EXTINF: den Fehler verursachen.

Leider kann ich das selbst nicht fixen aber evt. ein schlaues Köpfchen hier?

Gut möglich.

=> Das File muss einfaches M3U und nicht das erweiterte Format sein (M3U – Wikipedia).

1 „Gefällt mir“

OK, habe trotzdem dazu einen Bugfix erstellt damit keiner mehr drüber stolpert.

Dieser PR ist eine Sammlung der Probleme die mir so beim Testen aufgefallen sind. Hoffe das ist soweit übersichtlich, kompakt & entspricht den Coding-Styles:

1 „Gefällt mir“

Der Bugfix ist jetzt im DEV-branch enthalten, vielen Dank an @laszloh für die Review & @biologist für die schnelle Übernahme!

1 „Gefällt mir“