This is an automated email from the ASF dual-hosted git repository.

jerpelea pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 36f07f5c44b94b4471efaa4cc43acb0dfb9a377c
Author: Tiago Medicci Serrano <[email protected]>
AuthorDate: Thu Apr 9 17:06:15 2026 -0300

    arch/xtensa/esp32: Fix ROM strdup heap issue in USER_HEAP mode
    
    When ESP32's flat build mode is selected with the external PSRAM
    on USER_HEAP mode, the ROM strdup internally calls malloc which may
    be mapped to a different heap than lib_free, causing cross-heap
    allocation issues and system crashes.
    
    This commit adds a new Kconfig option ESP32_DONT_USE_ROM_LIBC to
    allow using NuttX libc instead of ROM newlib functions. When
    USER_HEAP mode is selected, this option is automatically enabled.
    
    Signed-off-by: Tiago Medicci Serrano <[email protected]>
---
 arch/xtensa/src/esp32/Kconfig | 11 +++++++++++
 arch/xtensa/src/esp32/hal.mk  |  5 +++--
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/arch/xtensa/src/esp32/Kconfig b/arch/xtensa/src/esp32/Kconfig
index baa95be1594..6c5416adec4 100644
--- a/arch/xtensa/src/esp32/Kconfig
+++ b/arch/xtensa/src/esp32/Kconfig
@@ -898,6 +898,16 @@ config ESP32_IRAM_HEAP
        select ARCH_USE_TEXT_HEAP
        default n
 
+config ESP32_DONT_USE_ROM_LIBC
+       bool "Don't use ROM libc functions"
+       default n
+       ---help---
+               If enabled, NuttX libc will be used instead of ROM newlib
+               functions (strdup, strndup, atoi, etc.).
+
+               This is required when using flat build with USER_HEAP mode
+               to avoid heap allocation issues with ROM strdup.
+
 endmenu # Memory Configuration
 
 config ESP32_GPIO_IRQ
@@ -1929,6 +1939,7 @@ config ESP32_SPI_FLASH_SUPPORT_PSRAM_STACK
        default n
        depends on ESP32_SPIRAM
        select SCHED_LPWORK
+       select ESP32_DONT_USE_ROM_LIBC
        ---help---
                Enable this option, Tasks which use PSRAM as stack
                can do SPI Flash read/write/erase/map/unmap.
diff --git a/arch/xtensa/src/esp32/hal.mk b/arch/xtensa/src/esp32/hal.mk
index 56ba95d7de7..71d3e575643 100644
--- a/arch/xtensa/src/esp32/hal.mk
+++ b/arch/xtensa/src/esp32/hal.mk
@@ -162,10 +162,11 @@ ARCHSCRIPT += 
$(ARCH_SRCDIR)$(DELIM)chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)
 ARCHSCRIPT += 
$(ARCH_SRCDIR)$(DELIM)chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)esp_rom$(DELIM)$(CHIP_SERIES)$(DELIM)ld$(DELIM)$(CHIP_SERIES).rom.libc-funcs.ld
 ARCHSCRIPT += 
$(ARCH_SRCDIR)$(DELIM)chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)esp_rom$(DELIM)$(CHIP_SERIES)$(DELIM)ld$(DELIM)$(CHIP_SERIES).rom.libgcc.ld
 ARCHSCRIPT += 
$(ARCH_SRCDIR)$(DELIM)chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)esp_rom$(DELIM)$(CHIP_SERIES)$(DELIM)ld$(DELIM)$(CHIP_SERIES).rom.newlib-data.ld
-ARCHSCRIPT += 
$(ARCH_SRCDIR)$(DELIM)chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)esp_rom$(DELIM)$(CHIP_SERIES)$(DELIM)ld$(DELIM)$(CHIP_SERIES).rom.newlib-reent-funcs.ld
 ARCHSCRIPT += 
$(ARCH_SRCDIR)$(DELIM)chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)esp_rom$(DELIM)$(CHIP_SERIES)$(DELIM)ld$(DELIM)$(CHIP_SERIES).rom.syscalls.ld
 ARCHSCRIPT += 
$(ARCH_SRCDIR)$(DELIM)chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)soc$(DELIM)$(CHIP_SERIES)$(DELIM)ld$(DELIM)$(CHIP_SERIES).peripherals.ld
-
+ifeq ($(CONFIG_ESP32_DONT_USE_ROM_LIBC),)
+ARCHSCRIPT += 
$(ARCH_SRCDIR)$(DELIM)chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)esp_rom$(DELIM)$(CHIP_SERIES)$(DELIM)ld$(DELIM)$(CHIP_SERIES).rom.newlib-reent-funcs.ld
+endif
 # Source files
 
 CHIP_CSRCS += 
chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)efuse$(DELIM)src$(DELIM)esp_efuse_api.c

Reply via email to