sighals and sockets
Andrew Haley
aph@redhat.com
Thu Aug 5 12:34:00 GMT 2004
Gladish, Jacob writes:
> I've been trying to track down a bug in my code for a few days now and I
> was looking at a pretty strange stack. It looked like the
> PlainSocketImpl::write would get as far as __libc_write, enter a signal
> handler, segv, enter the segv signal handler, then recurse forever until
> the process crashed. It was pretty confusing because the runtime sets an
> ignore on SIGPIPE and the args going into the write looked fine from
> gdb. After some thought, I realized that since the app uses a good deal
> of native (CNI) code, it's possible someone else is setting a sighandler
> for SIGPIPE. It turns out that the syslog call will do just that in
> glibc. It installs a temporary sighandler for PIPE, then restores
> whatever was there before returning to the caller. So there's a race
> condition that exists between a thread writing to a socket in the java
> runtime and a thread calling syslog. The only problem I see here is that
> the socket writing thread may inadvertantly close the syslog connection,
> which would then be re-stablished the next time someone calls syslog.
>
> Would it be safer to use the send(...) call instead of the write(...) in
> the socket code? Are there any other uses of the ignore on the SIGPIPE
> other that the socket writer?
>
> I still have not discovered why the application has crashed. But here's
> a snippet of the stack. This is 3.3.1
syslog() has a critical section in which it does all the messing with
signals. libc doesn't stash the user sigaction in a per thread
variable: it's just an array __sighandler[signo].
It seems from your stack trace that __sighandler[13] is set to
0x00000003. A GDB watchpoint on that memory can tell you how that
happens.
Andrew.
More information about the Java
mailing list