Merge branch 'fix/picolibc_setvbuf_ionbf_workaround_v5.5' into 'release/v5.5'

fix(esp_libc): picolibc: add workaround for setvbuf on _IONBF (v5.5)

See merge request espressif/esp-idf!47163
This commit is contained in:
Jiang Jiang Jian
2026-04-07 12:01:53 +08:00
2 changed files with 42 additions and 1 deletions
+3 -1
View File
@@ -65,7 +65,9 @@ else()
"src/picolibc/picolibc_init.c"
"src/picolibc/rand.c"
"src/picolibc/open_memstream.c"
"src/picolibc/errno.c")
"src/picolibc/errno.c"
"src/picolibc/bufio_setvbuf.c") # TODO IDF-15494: remove this and the following lines
list(APPEND EXTRA_LINK_FLAGS "-Wl,--wrap=__bufio_setvbuf")
if(CONFIG_LIBC_PICOLIBC_NEWLIB_COMPATIBILITY)
list(APPEND srcs "src/picolibc/getreent.c")
endif()
@@ -0,0 +1,39 @@
/*
* SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <stdio-bufio.h>
#include <stdlib.h>
#include <stdbool.h>
int __real___bufio_setvbuf(FILE *f, char *buf, int mode, size_t size);
int __wrap___bufio_setvbuf(FILE *f, char *buf, int mode, size_t size)
{
// File lock is already acquired by the caller
int ret = -1;
bool workaround = false;
if (mode == _IONBF) {
workaround = true;
mode = _IOFBF;
size = 1;
buf = malloc(size);
if (buf == NULL) {
goto exit;
}
}
ret = __real___bufio_setvbuf(f, buf, mode, size);
if (workaround) {
struct __file_bufio *bf = (struct __file_bufio *)f;
// Free buf if not applied
if (ret != 0 || bf->buf != buf) {
free(buf);
goto exit;
}
bf->bflags |= __BALL;
}
exit:
return ret;
}