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