Fix stdio exit handling

Make sure that the stdio exit handler is set in all stdio initialization paths.

The bug was introduced by commit 26747c47bc.
This commit is contained in:
Sebastian Huber 2022-05-17 11:52:24 +02:00
parent 93bea9f538
commit e826fbb2ae
1 changed files with 17 additions and 12 deletions

View File

@ -168,6 +168,19 @@ stdio_exit_handler (void)
(void) _fwalk_sglue (_GLOBAL_REENT, CLEANUP_FILE, &__sglue);
}
static void
global_stdio_init (void)
{
if (__stdio_exit_handler == NULL) {
__stdio_exit_handler = stdio_exit_handler;
#ifdef _REENT_GLOBAL_STDIO_STREAMS
stdin_init (&__sf[0]);
stdout_init (&__sf[1]);
stderr_init (&__sf[2]);
#endif
}
}
/*
* Find a free FILE for fopen et al.
*/
@ -180,11 +193,7 @@ __sfp (struct _reent *d)
struct _glue *g;
_newlib_sfp_lock_start ();
if (__stdio_exit_handler == NULL) {
__sinit (_GLOBAL_REENT);
__stdio_exit_handler = stdio_exit_handler;
}
global_stdio_init ();
for (g = &__sglue;; g = g->_next)
{
@ -273,13 +282,9 @@ __sinit (struct _reent *s)
# endif /* _REENT_GLOBAL_STDIO_STREAMS */
#endif
#ifdef _REENT_GLOBAL_STDIO_STREAMS
if (__sf[0]._cookie == NULL) {
stdin_init (&__sf[0]);
stdout_init (&__sf[1]);
stderr_init (&__sf[2]);
}
#else /* _REENT_GLOBAL_STDIO_STREAMS */
global_stdio_init ();
#ifndef _REENT_GLOBAL_STDIO_STREAMS
stdin_init (s->_stdin);
stdout_init (s->_stdout);
stderr_init (s->_stderr);