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
This commit is contained in:
Ian Lance Taylor 2016-11-14 23:16:04 +00:00
parent 6964bb3ed9
commit 7b9f5ceef1
4 changed files with 16 additions and 4 deletions

View File

@ -1,4 +1,4 @@
3c8d91cff0ad3d233ebd268f88a3749d38a0aac1
eb716b515356166d3177e6244619be5901f31162
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.

View File

@ -47,7 +47,14 @@ type sigctxt struct {
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
func sigblock() {

View File

@ -29,7 +29,8 @@ func sigtrampgo(sig uint32, info *_siginfo_t, ctx unsafe.Pointer) {
// get here anyhow.
return
}
badsignal(uintptr(sig), &sigctxt{info, ctx})
c := sigctxt{info, ctx}
badsignal(uintptr(sig), &c)
return
}

View File

@ -187,7 +187,11 @@ getSiginfo(siginfo_t *info, void *context __attribute__((unused)))
Location loc[1];
int32 n;
ret.sigaddr = (uintptr)(info->si_addr);
if (info == nil) {
ret.sigaddr = 0;
} else {
ret.sigaddr = (uintptr)(info->si_addr);
}
ret.sigpc = 0;
// There doesn't seem to be a portable way to get the PC.