diff --git a/pkg/sentry/arch/signal_amd64.go b/pkg/sentry/arch/signal_amd64.go index 9f5b398a2..b47faf6d9 100644 --- a/pkg/sentry/arch/signal_amd64.go +++ b/pkg/sentry/arch/signal_amd64.go @@ -304,12 +304,10 @@ func (c *Context64) SignalRestore(st *Stack, rt bool, featureSet cpuid.FeatureSe if uc.MContext.Fpstate == 0 { c.fpState.Reset() } else { - fpSize, _ := featureSet.ExtendedStateSize() - f := make([]byte, fpSize) - if _, err := st.IO.CopyIn(context.Background(), hostarch.Addr(uc.MContext.Fpstate), f, usermem.IOOpts{}); err != nil { + if _, err := st.IO.CopyIn(context.Background(), hostarch.Addr(uc.MContext.Fpstate), c.fpState, usermem.IOOpts{}); err != nil { + c.fpState.Reset() return 0, linux.SignalStack{}, err } - copy(c.fpState, f) c.fpState.SanitizeUser(featureSet) } diff --git a/pkg/sentry/kernel/task_signals.go b/pkg/sentry/kernel/task_signals.go index 33c000ac5..d63c9e98c 100644 --- a/pkg/sentry/kernel/task_signals.go +++ b/pkg/sentry/kernel/task_signals.go @@ -305,6 +305,10 @@ func (t *Task) SignalReturn(rt bool) (*SyscallControl, error) { st := t.Stack() sigset, alt, err := t.Arch().SignalRestore(st, rt, t.k.featureSet) if err != nil { + // sigreturn syscalls never return errors. + t.Debugf("failed to restore from a signal frame: %v", err) + t.forceSignal(linux.SIGSEGV, false /* unconditional */) + t.SendSignal(SignalInfoPriv(linux.SIGSEGV)) return nil, err }