Description
A signal can occur on a thread with no p, that is, where g != nil && g.m != nil && g.m.p == nil
. Thus, the signal hander must not have any write barriers. A signal can cause a panic, which the signal handler implements by calling startpanic_m
. The code in startpanic_m
is permitted to have write barriers, because write barriers are permitted, even if g.m.p == nil
, if g.m.dying > 0
. This check is made in wbBufFlush
.
However, write barriers are currently implemented by calling gcWriteBarrier
. And that function, written in assembler, assumes that g.m.p != nil
. So when startpanic_m
has a write barrier, which it does when setting _g_.writebuf = nil
, we can get a segmentation violation while handling a signal.
I believe this can happen starting in the 1.10 release.
cc @aclements