From dfbcb8903ae8bd0d1ff984889f1b5cf1e041865e Mon Sep 17 00:00:00 2001 From: Zach Koopmans Date: Mon, 30 Aug 2021 15:32:22 -0700 Subject: [syserr] Fix SIGBUS on syserr.FromError Fix syzcaller panic SIGBUS on error handling. Done by adding an interface, errors.GuestError, which errors can implement in order to be compared against each other. PiperOrigin-RevId: 393867554 --- pkg/syserr/BUILD | 1 + pkg/syserr/syserr.go | 16 ++++++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) (limited to 'pkg') diff --git a/pkg/syserr/BUILD b/pkg/syserr/BUILD index 1cd5d641d..d8c4c9613 100644 --- a/pkg/syserr/BUILD +++ b/pkg/syserr/BUILD @@ -14,6 +14,7 @@ go_library( "//pkg/abi/linux/errno", "//pkg/errors", "//pkg/errors/linuxerr", + "//pkg/safecopy", "//pkg/tcpip", "@org_golang_x_sys//unix:go_default_library", ], diff --git a/pkg/syserr/syserr.go b/pkg/syserr/syserr.go index a5e386e38..b679f3046 100644 --- a/pkg/syserr/syserr.go +++ b/pkg/syserr/syserr.go @@ -24,6 +24,7 @@ import ( "gvisor.dev/gvisor/pkg/abi/linux/errno" "gvisor.dev/gvisor/pkg/errors" "gvisor.dev/gvisor/pkg/errors/linuxerr" + "gvisor.dev/gvisor/pkg/safecopy" ) // Error represents an internal error. @@ -278,15 +279,18 @@ func FromError(err error) *Error { if err == nil { return nil } - if errno, ok := err.(unix.Errno); ok { - return FromHost(errno) - } - if linuxErr, ok := err.(*errors.Error); ok { - return FromHost(unix.Errno(linuxErr.Errno())) + switch e := err.(type) { + case unix.Errno: + return FromHost(e) + case *errors.Error: + return FromHost(unix.Errno(e.Errno())) + case safecopy.SegvError, safecopy.BusError, safecopy.AlignmentError: + return FromHost(unix.EFAULT) } - panic("unknown error: " + err.Error()) + msg := fmt.Sprintf("err: %s type: %T", err.Error(), err) + panic(msg) } // ConvertIntr converts the provided error code (err) to another one (intr) if -- cgit v1.2.3