From 55b9d8142977dcba03a6b701db6d20ec5a4ecf70 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 8 Mar 2026 01:15:33 -1000 Subject: [PATCH 1/3] Add diagnostic message before abort on buffer overflow --- esphome/components/rp2040/printf_stubs.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/esphome/components/rp2040/printf_stubs.cpp b/esphome/components/rp2040/printf_stubs.cpp index 83d916cd2c..c2174a1dec 100644 --- a/esphome/components/rp2040/printf_stubs.cpp +++ b/esphome/components/rp2040/printf_stubs.cpp @@ -32,6 +32,9 @@ static int write_printf_buffer(FILE *stream, char *buf, int len) { size_t write_len = len; if (write_len >= PRINTF_BUFFER_SIZE) { fwrite(buf, 1, PRINTF_BUFFER_SIZE - 1, stream); + // Use fwrite for the message to avoid recursive __wrap_printf call + static const char msg[] = "\nprintf buffer overflow\n"; + fwrite(msg, 1, sizeof(msg) - 1, stream); abort(); } if (fwrite(buf, 1, write_len, stream) < write_len || ferror(stream)) { From 27cebf591c357d7ae9c27d3afb4c37e6efa3e9c5 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 8 Mar 2026 01:18:19 -1000 Subject: [PATCH 2/3] Add enable_full_printf escape hatch --- esphome/components/rp2040/__init__.py | 18 ++++++++++++++---- esphome/components/rp2040/const.py | 1 + 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/esphome/components/rp2040/__init__.py b/esphome/components/rp2040/__init__.py index 7ee8381ca5..54e1db27aa 100644 --- a/esphome/components/rp2040/__init__.py +++ b/esphome/components/rp2040/__init__.py @@ -21,7 +21,13 @@ from esphome.const import ( from esphome.core import CORE, CoroPriority, EsphomeError, coroutine_with_priority from esphome.helpers import copy_file_if_changed, read_file, write_file_if_changed -from .const import KEY_BOARD, KEY_PIO_FILES, KEY_RP2040, rp2040_ns +from .const import ( + CONF_ENABLE_FULL_PRINTF, + KEY_BOARD, + KEY_PIO_FILES, + KEY_RP2040, + rp2040_ns, +) # force import gpio to register pin schema from .gpio import rp2040_pin_to_code # noqa @@ -153,6 +159,7 @@ CONFIG_SCHEMA = cv.All( cv.positive_time_period_milliseconds, cv.Range(max=cv.TimePeriod(milliseconds=8388)), ), + cv.Optional(CONF_ENABLE_FULL_PRINTF, default=False): cv.boolean, } ), set_core_data, @@ -191,9 +198,12 @@ async def to_code(config): ) # Wrap FILE*-based printf functions to eliminate newlib's _vfprintf_r - # (~8.9 KB). See printf_stubs.cpp for implementation. - for symbol in ("vprintf", "printf", "fprintf"): - cg.add_build_flag(f"-Wl,--wrap={symbol}") + # (~9.2 KB). See printf_stubs.cpp for implementation. + if config.get(CONF_ENABLE_FULL_PRINTF): + cg.add_define("USE_FULL_PRINTF") + else: + for symbol in ("vprintf", "printf", "fprintf"): + cg.add_build_flag(f"-Wl,--wrap={symbol}") cg.add_platformio_option("board_build.core", "earlephilhower") cg.add_platformio_option("board_build.filesystem_size", "1m") diff --git a/esphome/components/rp2040/const.py b/esphome/components/rp2040/const.py index ab5f42d757..7eeddffc76 100644 --- a/esphome/components/rp2040/const.py +++ b/esphome/components/rp2040/const.py @@ -1,5 +1,6 @@ import esphome.codegen as cg +CONF_ENABLE_FULL_PRINTF = "enable_full_printf" KEY_BOARD = "board" KEY_RP2040 = "rp2040" KEY_PIO_FILES = "pio_files" From f13a2e08da6b805a7ce453a91cc787ba7bf8b7b3 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 8 Mar 2026 01:30:47 -1000 Subject: [PATCH 3/3] Add enable_full_printf test coverage --- tests/components/rp2040/test.rp2040-ard.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/components/rp2040/test.rp2040-ard.yaml b/tests/components/rp2040/test.rp2040-ard.yaml index 039a261016..1eb315a3b4 100644 --- a/tests/components/rp2040/test.rp2040-ard.yaml +++ b/tests/components/rp2040/test.rp2040-ard.yaml @@ -1,3 +1,6 @@ +rp2040: + enable_full_printf: false + logger: level: VERBOSE