[PATCH] Fix stdio exit handling

Sebastian Huber <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
Make sure that the stdio exit handler is set in all stdio initialization paths.

The bug was introduced by commit 26747c47bc0a1137e02e0377306d721cc3478855.
---
 newlib/libc/stdio/findfp.c | 29 +++++++++++++++++------------
 1 file changed, 17 insertions(+), 12 deletions(-)

diff --git a/newlib/libc/stdio/findfp.c b/newlib/libc/stdio/findfp.c
index 19952d4e0..118637a18 100644
--- a/newlib/libc/stdio/findfp.c
+++ b/newlib/libc/stdio/findfp.c
@@ -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);
-- 
2.35.3
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.