This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] libc/stdio/findfp.c: Avoid infinite recursion


Hi,

I just applied the below patch.  It avoids an infinite recursion on
_REENT_SMALL targets.  This problem has been introduced by the patch
which I applied as aresult of the discussion in
http://sourceware.org/ml/newlib/2012/msg00107.html

The problem with this patch is that __sinit calls __sfp when running on
_REENT_SMALL targets.  It does so while __sdidinit is still 0.  But
__sfp starts with

  if (!_GLOBAL_REENT->__sdidinit)
    __sinit (_GLOBAL_REENT);

so it calls __sinit again, which calls __sfp again, ad infinitum.  The
applied patch handles this issue by setting __sdidinit before calling
__sfp, if the current reent pointer points to _GLOBAL_REENT.

	* libc/stdio/findfp.c (__sinit): Avoid infinite recursion on
	_REENT_SMALL targets.  Add comment to explain.

Index: libc/stdio/findfp.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/stdio/findfp.c,v
retrieving revision 1.23
diff -u -p -r1.23 findfp.c
--- libc/stdio/findfp.c	30 May 2012 08:58:42 -0000	1.23
+++ libc/stdio/findfp.c	5 Jun 2012 16:16:42 -0000
@@ -200,6 +200,11 @@ _DEFUN(__sinit, (s),
 #else
   s->__sglue._niobs = 0;
   s->__sglue._iobs = NULL;
+  /* Avoid infinite recursion when calling __sfp  for _GLOBAL_REENT.  The
+     problem is that __sfp checks for _GLOBAL_REENT->__sdidinit and calls
+     __sinit if it's 0. */
+  if (s == _GLOBAL_REENT)
+    s->__sdidinit = 1;
   s->_stdin = __sfp(s);
   s->_stdout = __sfp(s);
   s->_stderr = __sfp(s);


Corinna

-- 
Corinna Vinschen
Cygwin Project Co-Leader
Red Hat


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]