ESP32: `spi:close/1` crashes the VM with a double free
Maintainers usually reply within 3 days
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 85/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Tech stack
- c, erlang
- Domain
- embedded-iot
Research direction
Start with src/platforms/esp32/components/avm_builtins/spi_driver.c at spidriver_close, then check src/libAtomVM/context.c at context_destroy to follow the second free. Reproduce with the ESP32-C6 example in the issue; done means closing the SPI device no longer triggers the heap assertion or reboot.
Written by the indexing model from the issue text.
Description
Description
Calling spi:close/1 on an ESP32 aborts the VM with a heap assertion.
spidriver_close frees the port's platform data but leaves ctx->platform_data pointing at it:
spidriver_consume_mailbox then returns NativeTerminate, and context_destroy frees ctx->platform_data a second time:
https://github.com/atomvm/AtomVM/blob/main/src/libAtomVM/context.c#L307
To reproduce
On an ESP32-C6 running v0.7.0-beta.0, which is also present on main:
SPI = spi:open([
{bus_config, [{mosi, 1}, {sclk, 23}, {peripheral, "spi2"}]},
{device_config, [{leds, [{clock_speed_hz, 2500000}, {mode, 0}, {cs, -1}, {address_len_bits, 0}]}]}
]),
ok = spi:write(SPI, leds, #{write_data => <<0>>}),
spi:close(SPI).
The log shows Removed SPI device. and Stopped SPI Bus., then assert failed: 0x4002838e and a reboot.
Suggested fix
Set ctx->platform_data = NULL; after free(spi_data); in spidriver_close, so context_destroy doesn't free it again.
- Dominant language
- Erlang
- Stars
- 2.3k
- Forks
- 171
- Avg merge
- 4d 11h
- Merged PRs (30d)
- 20
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from atomvm/AtomVM
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Maintainers usually reply within 3 days
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Maintainers usually reply within 3 days
-
lwIP sockets: a failed listen or connect leaves the socket lock held, a later close hangs foreverOpen
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
Maintainers usually reply within 3 days
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
Maintainers usually reply within 3 days
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
Maintainers usually reply within 3 days
Similar issues
-
SPIDevice selects an active-high device as soon as it is createdPossibly taken @mikeysklar claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 73/100
adafruit/circuitpython#11869 ·
Maintainers usually reply within 1 day
-
[Bug]: RFENCE rejects the architecturally defined full-range size when start_addr is nonzeroPossibly taken @hongwei-2026 claimed this today. OpenC-bug help wanted
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
rustsbi/rustsbi#484 · 1 comment ·
Maintainers usually reply within 1 day
-
Fan percentage in Auto mode shows the night-mode speed cap (`nmdv`) while the fan is idle (`fnst: OFF`)Possibly taken A pull request linked to this issue is open or already merged. Open
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
cmgrayb/hass-dyson#552 ·
Maintainers usually reply within 1 day
-
backlog bug
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
EchoTools/nevr-runtime#2664 ·
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
seven-lynx/HoundMind#108 ·
Maintainers usually reply within 1 day