mirror of
https://github.com/espressif/esp-idf.git
synced 2026-04-27 19:13:21 +00:00
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:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user