mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Move safecopy.ReplaceSignalHandler into sighandling package.
PiperOrigin-RevId: 399560357
This commit is contained in:
committed by
gVisor bot
parent
fa4c30c635
commit
65698b627e
+1
-1
@@ -18,9 +18,9 @@ go_library(
|
||||
],
|
||||
visibility = ["//:sandbox"],
|
||||
deps = [
|
||||
"//pkg/abi/linux",
|
||||
"//pkg/errors",
|
||||
"//pkg/errors/linuxerr",
|
||||
"//pkg/sighandling",
|
||||
"@org_golang_x_sys//unix:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
@@ -23,6 +23,7 @@ import (
|
||||
"golang.org/x/sys/unix"
|
||||
"gvisor.dev/gvisor/pkg/errors"
|
||||
"gvisor.dev/gvisor/pkg/errors/linuxerr"
|
||||
"gvisor.dev/gvisor/pkg/sighandling"
|
||||
)
|
||||
|
||||
// SegvError is returned when a safecopy function receives SIGSEGV.
|
||||
@@ -132,10 +133,10 @@ func initializeAddresses() {
|
||||
|
||||
func init() {
|
||||
initializeAddresses()
|
||||
if err := ReplaceSignalHandler(unix.SIGSEGV, addrOfSignalHandler(), &savedSigSegVHandler); err != nil {
|
||||
if err := sighandling.ReplaceSignalHandler(unix.SIGSEGV, addrOfSignalHandler(), &savedSigSegVHandler); err != nil {
|
||||
panic(fmt.Sprintf("Unable to set handler for SIGSEGV: %v", err))
|
||||
}
|
||||
if err := ReplaceSignalHandler(unix.SIGBUS, addrOfSignalHandler(), &savedSigBusHandler); err != nil {
|
||||
if err := sighandling.ReplaceSignalHandler(unix.SIGBUS, addrOfSignalHandler(), &savedSigBusHandler); err != nil {
|
||||
panic(fmt.Sprintf("Unable to set handler for SIGBUS: %v", err))
|
||||
}
|
||||
linuxerr.AddErrorUnwrapper(func(e error) (*errors.Error, bool) {
|
||||
|
||||
@@ -20,7 +20,6 @@ import (
|
||||
"unsafe"
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
"gvisor.dev/gvisor/pkg/abi/linux"
|
||||
)
|
||||
|
||||
// maxRegisterSize is the maximum register size used in memcpy and memclr. It
|
||||
@@ -332,39 +331,3 @@ func errorFromFaultSignal(addr uintptr, sig int32) error {
|
||||
panic(fmt.Sprintf("safecopy got unexpected signal %d at address %#x", sig, addr))
|
||||
}
|
||||
}
|
||||
|
||||
// ReplaceSignalHandler replaces the existing signal handler for the provided
|
||||
// signal with the one that handles faults in safecopy-protected functions.
|
||||
//
|
||||
// It stores the value of the previously set handler in previous.
|
||||
//
|
||||
// This function will be called on initialization in order to install safecopy
|
||||
// handlers for appropriate signals. These handlers will call the previous
|
||||
// handler however, and if this is function is being used externally then the
|
||||
// same courtesy is expected.
|
||||
func ReplaceSignalHandler(sig unix.Signal, handler uintptr, previous *uintptr) error {
|
||||
var sa linux.SigAction
|
||||
const maskLen = 8
|
||||
|
||||
// Get the existing signal handler information, and save the current
|
||||
// handler. Once we replace it, we will use this pointer to fall back to
|
||||
// it when we receive other signals.
|
||||
if _, _, e := unix.RawSyscall6(unix.SYS_RT_SIGACTION, uintptr(sig), 0, uintptr(unsafe.Pointer(&sa)), maskLen, 0, 0); e != 0 {
|
||||
return e
|
||||
}
|
||||
|
||||
// Fail if there isn't a previous handler.
|
||||
if sa.Handler == 0 {
|
||||
return fmt.Errorf("previous handler for signal %x isn't set", sig)
|
||||
}
|
||||
|
||||
*previous = uintptr(sa.Handler)
|
||||
|
||||
// Install our own handler.
|
||||
sa.Handler = uint64(handler)
|
||||
if _, _, e := unix.RawSyscall6(unix.SYS_RT_SIGACTION, uintptr(sig), uintptr(unsafe.Pointer(&sa)), 0, maskLen, 0, 0); e != 0 {
|
||||
return e
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -63,7 +63,6 @@ go_library(
|
||||
"//pkg/procid",
|
||||
"//pkg/ring0",
|
||||
"//pkg/ring0/pagetables",
|
||||
"//pkg/safecopy",
|
||||
"//pkg/seccomp",
|
||||
"//pkg/sentry/arch",
|
||||
"//pkg/sentry/arch/fpu",
|
||||
@@ -71,6 +70,7 @@ go_library(
|
||||
"//pkg/sentry/platform",
|
||||
"//pkg/sentry/platform/interrupt",
|
||||
"//pkg/sentry/time",
|
||||
"//pkg/sighandling",
|
||||
"//pkg/sync",
|
||||
"@org_golang_x_sys//unix:go_default_library",
|
||||
],
|
||||
|
||||
@@ -19,8 +19,8 @@ import (
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
"gvisor.dev/gvisor/pkg/ring0"
|
||||
"gvisor.dev/gvisor/pkg/safecopy"
|
||||
"gvisor.dev/gvisor/pkg/sentry/arch"
|
||||
"gvisor.dev/gvisor/pkg/sighandling"
|
||||
)
|
||||
|
||||
// bluepill enters guest mode.
|
||||
@@ -97,7 +97,7 @@ func (c *vCPU) die(context *arch.SignalContext64, msg string) {
|
||||
|
||||
func init() {
|
||||
// Install the handler.
|
||||
if err := safecopy.ReplaceSignalHandler(bluepillSignal, addrOfSighandler(), &savedHandler); err != nil {
|
||||
if err := sighandling.ReplaceSignalHandler(bluepillSignal, addrOfSighandler(), &savedHandler); err != nil {
|
||||
panic(fmt.Sprintf("Unable to set handler for signal %d: %v", bluepillSignal, err))
|
||||
}
|
||||
|
||||
|
||||
@@ -28,9 +28,9 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/procid"
|
||||
"gvisor.dev/gvisor/pkg/ring0"
|
||||
"gvisor.dev/gvisor/pkg/ring0/pagetables"
|
||||
"gvisor.dev/gvisor/pkg/safecopy"
|
||||
"gvisor.dev/gvisor/pkg/seccomp"
|
||||
ktime "gvisor.dev/gvisor/pkg/sentry/time"
|
||||
"gvisor.dev/gvisor/pkg/sighandling"
|
||||
"gvisor.dev/gvisor/pkg/sync"
|
||||
)
|
||||
|
||||
@@ -723,7 +723,7 @@ func addrOfSigsysHandler() uintptr
|
||||
func seccompMmapRules(m *machine) {
|
||||
seccompMmapRulesOnce.Do(func() {
|
||||
// Install the handler.
|
||||
if err := safecopy.ReplaceSignalHandler(unix.SIGSYS, addrOfSigsysHandler(), &savedSigsysHandler); err != nil {
|
||||
if err := sighandling.ReplaceSignalHandler(unix.SIGSYS, addrOfSigsysHandler(), &savedSigsysHandler); err != nil {
|
||||
panic(fmt.Sprintf("Unable to set handler for signal %d: %v", bluepillSignal, err))
|
||||
}
|
||||
rules := []seccomp.RuleSet{}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
package sighandling
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"unsafe"
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
@@ -37,3 +38,36 @@ func IgnoreChildStop() error {
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// ReplaceSignalHandler replaces the existing signal handler for the provided
|
||||
// signal with the function pointer at `handler`. This bypasses the Go runtime
|
||||
// signal handlers, and should only be used for low-level signal handlers where
|
||||
// use of signal.Notify is not appropriate.
|
||||
//
|
||||
// It stores the value of the previously set handler in previous.
|
||||
func ReplaceSignalHandler(sig unix.Signal, handler uintptr, previous *uintptr) error {
|
||||
var sa linux.SigAction
|
||||
const maskLen = 8
|
||||
|
||||
// Get the existing signal handler information, and save the current
|
||||
// handler. Once we replace it, we will use this pointer to fall back to
|
||||
// it when we receive other signals.
|
||||
if _, _, e := unix.RawSyscall6(unix.SYS_RT_SIGACTION, uintptr(sig), 0, uintptr(unsafe.Pointer(&sa)), maskLen, 0, 0); e != 0 {
|
||||
return e
|
||||
}
|
||||
|
||||
// Fail if there isn't a previous handler.
|
||||
if sa.Handler == 0 {
|
||||
return fmt.Errorf("previous handler for signal %x isn't set", sig)
|
||||
}
|
||||
|
||||
*previous = uintptr(sa.Handler)
|
||||
|
||||
// Install our own handler.
|
||||
sa.Handler = uint64(handler)
|
||||
if _, _, e := unix.RawSyscall6(unix.SYS_RT_SIGACTION, uintptr(sig), uintptr(unsafe.Pointer(&sa)), 0, maskLen, 0, 0); e != 0 {
|
||||
return e
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user