Commit 7b9f5cee by Ian Lance Taylor

runtime: don't crash if signal handler info argument is nil

    
    Apparently on Solaris 10 a SA_SIGINFO signal handler can be invoked with
    a nil info argument.  I would not have believed it but I've now seen it
    happen, and the sigaction man page actually says "If the second argument
    is not equal to NULL, it points to a siginfo_t structure...."  So, if
    that happens, don't crash.
    
    Also fix another case where we want to make sure that &T{} does not
    allocate.
    
    Reviewed-on: https://go-review.googlesource.com/33150

From-SVN: r242403
parent 6964bb3e
3c8d91cff0ad3d233ebd268f88a3749d38a0aac1 eb716b515356166d3177e6244619be5901f31162
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -47,7 +47,14 @@ type sigctxt struct { ...@@ -47,7 +47,14 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
func (c *sigctxt) sigcode() uint64 { return uint64(c.info.si_code) } func (c *sigctxt) sigcode() uint64 {
if c.info == nil {
// This can happen on Solaris 10. We don't know the
// code, just avoid a misleading value.
return _SI_USER + 1
}
return uint64(c.info.si_code)
}
//go:nosplit //go:nosplit
func sigblock() { func sigblock() {
......
...@@ -29,7 +29,8 @@ func sigtrampgo(sig uint32, info *_siginfo_t, ctx unsafe.Pointer) { ...@@ -29,7 +29,8 @@ func sigtrampgo(sig uint32, info *_siginfo_t, ctx unsafe.Pointer) {
// get here anyhow. // get here anyhow.
return return
} }
badsignal(uintptr(sig), &sigctxt{info, ctx}) c := sigctxt{info, ctx}
badsignal(uintptr(sig), &c)
return return
} }
......
...@@ -187,7 +187,11 @@ getSiginfo(siginfo_t *info, void *context __attribute__((unused))) ...@@ -187,7 +187,11 @@ getSiginfo(siginfo_t *info, void *context __attribute__((unused)))
Location loc[1]; Location loc[1];
int32 n; int32 n;
ret.sigaddr = (uintptr)(info->si_addr); if (info == nil) {
ret.sigaddr = 0;
} else {
ret.sigaddr = (uintptr)(info->si_addr);
}
ret.sigpc = 0; ret.sigpc = 0;
// There doesn't seem to be a portable way to get the PC. // There doesn't seem to be a portable way to get the PC.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment