This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC 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]

libgo patch committed: Avoid GC crash with callbacks in new thread


There is a private program that crashes when using gccgo in a rather
complex scenario.  Newly created C threads call into Go code, forcing
the Go code to allocate new M and G structures.  While executing Go
code, the stack is split.  The Go code then returns.  Returning from a
Go callback is treated as entering a system call, so the G gcstack
field is set to point to the Go stack.  In this case, though, we were
called from a newly created C thread, so we drop the extra M and G
structures.  The C thread then exits.

Then a new C thread calls into Go code, reusing the previously created
M and G.  The Go code requires a larger stack frame, causing the old
stack segment to be unmapped and a new stack segment allocated.  At
this point the gcstack field is
pointing to the old stack segment.

Then a garbage collection occurs.  The garbage collector sees that the
gcstack field is not nil, so it scans it as the first stack segment.
Unfortunately it points to memory that was unmapped.  So the program
crashes.

The fix is simple: when handling extra G structures created for
callbacks from new C threads, clear the gcstack field.

This patch implements that.  Bootstrapped and ran Go testsuite on
x86_64-unknown-linux-gnu.  Committed to mainline.

Ian

Attachment: foo.txt
Description: Text document


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