This is the mail archive of the
cygwin-developers@cygwin.com
mailing list for the Cygwin project.
Reentrancy problem in Cygwin/newlib
- From: Corinna Vinschen <vinschen at redhat dot com>
- To: cygwin-developers at cygwin dot com
- Cc: Thomas Pfaff <tpfaff at gmx dot net>
- Date: Fri, 18 Jun 2004 11:56:49 +0200
- Subject: Reentrancy problem in Cygwin/newlib
- Reply-to: cygwin-developers at cygwin dot com
Hi,
yesterday I came across a problem where data send over a pipe gets
truncated. Searching for the culprit, I found that a change in newlib
from 2004-06-11 introduced this problem. My (non-voluntary) testcase
was a configure script which calls
case `m4 --help` in ...
to look for a specific string in the help output. It didn't work
anymore due to the truncation. On the command line, you can simply
observe the behaviour by calling
echo `m4 --help`
Very interesting is also
echo `m4 --help` | wc
which prints exactly nothing!
The patch in newlib has been introduced in this thread:
http://sources.redhat.com/ml/newlib/2004/msg00274.html
Besides some minor changes, this patch introduces a new global variable
called "_global_reent_ptr" and the include/sys/reent.h file defines
_GLOBAL_REENT as _global_reent_ptr.
I tried several changes, for example substituting _GLOBAL_REENT in
_cygtls::init_thread() by _impure_ptr. This actually changes the
behaviour slightly. The above example with `| wc -l' suddenly prints
the output of `wc', but the backtick command still is truncated.
I also tried to add a line
_global_impure_ptr = &reent_data;
in dll_crt0() in dcrt0.cc but the truncation still happened.
Another change in the above mentioned patch was to change _cleanup_r()
in newlib/libc/stdio.findfp.c to call fclose instead of fflush. I also
reverted that change and I changed the next function in that file,
_cleanup(), to call _cleanup_r with _impure_ptr instead of _GLOBAL_REENT
but this also didn't help.
I'm not as fluent in the _impure_ptr stuff as Chris and Thomas, so I'd
like to ask if you could have a look why that change exactly results in
the truncation. Or a hint where to set a breakpoint would be helpful
already.
For now Jeff reverted the change in include/sys/reent.h so that
_GLOBAL_REENT is defined as _impure_ptr in CVS head again. If you
want to observe the wrong behaviour, just define _GLOBAL_REENT as
_global_impure_ptr again and recompile newlib as well as Cygwin.
Thanks,
Corinna
--
Corinna Vinschen Please, send mails regarding Cygwin to
Cygwin Co-Project Leader mailto:cygwin@cygwin.com
Red Hat, Inc.