Add EventChannel messages for uncaught signals.

PiperOrigin-RevId: 226936778
Change-Id: I2a6dda157c55d39d81e1b543ab11a58a0bfe5c05
This commit is contained in:
Brian Geffon
2018-12-26 11:26:28 -08:00
committed by Shentubot
parent 0df0df35fc
commit bfa2f314ca
3 changed files with 74 additions and 0 deletions
+18
View File
@@ -1,3 +1,5 @@
load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
package(licenses = ["notice"]) # Apache 2.0
load("//tools/go_generics:defs.bzl", "go_template_instance")
@@ -62,6 +64,21 @@ go_template_instance(
},
)
proto_library(
name = "uncaught_signal_proto",
srcs = ["uncaught_signal.proto"],
visibility = ["//visibility:public"],
deps = ["//pkg/sentry/arch:registers_proto"],
)
go_proto_library(
name = "uncaught_signal_go_proto",
importpath = "gvisor.googlesource.com/gvisor/pkg/sentry/kernel/uncaught_signal_go_proto",
proto = ":uncaught_signal_proto",
visibility = ["//visibility:public"],
deps = ["//pkg/sentry/arch:registers_go_proto"],
)
go_library(
name = "kernel",
srcs = [
@@ -122,6 +139,7 @@ go_library(
],
visibility = ["//:sandbox"],
deps = [
":uncaught_signal_go_proto",
"//pkg/abi",
"//pkg/abi/linux",
"//pkg/amutex",
+19
View File
@@ -22,8 +22,10 @@ import (
"time"
"gvisor.googlesource.com/gvisor/pkg/abi/linux"
"gvisor.googlesource.com/gvisor/pkg/eventchannel"
"gvisor.googlesource.com/gvisor/pkg/sentry/arch"
"gvisor.googlesource.com/gvisor/pkg/sentry/kernel/auth"
ucspb "gvisor.googlesource.com/gvisor/pkg/sentry/kernel/uncaught_signal_go_proto"
"gvisor.googlesource.com/gvisor/pkg/sentry/usermem"
"gvisor.googlesource.com/gvisor/pkg/syserror"
)
@@ -184,6 +186,23 @@ func (t *Task) deliverSignal(info *arch.SignalInfo, act arch.SignalAct) taskRunS
case SignalActionTerm, SignalActionCore:
// "Default action is to terminate the process." - signal(7)
t.Debugf("Signal %d: terminating thread group", info.Signo)
// Emit an event channel messages related to this uncaught signal.
ucs := &ucspb.UncaughtSignal{
Tid: int32(t.Kernel().TaskSet().Root.IDOfTask(t)),
Pid: int32(t.Kernel().TaskSet().Root.IDOfThreadGroup(t.ThreadGroup())),
Registers: t.Arch().StateData().Proto(),
SignalNumber: info.Signo,
}
// Attach an fault address if appropriate.
switch linux.Signal(info.Signo) {
case linux.SIGSEGV, linux.SIGFPE, linux.SIGILL, linux.SIGTRAP, linux.SIGBUS:
ucs.FaultAddr = info.Addr()
}
eventchannel.Emit(ucs)
t.PrepareGroupExit(ExitStatus{Signo: int(info.Signo)})
return (*runExit)(nil)
+37
View File
@@ -0,0 +1,37 @@
// Copyright 2018 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
syntax = "proto3";
package gvisor;
import "pkg/sentry/arch/registers.proto";
message UncaughtSignal {
// Thread ID.
int32 tid = 1;
// Process ID.
int32 pid = 2;
// Registers at the time of the fault or signal.
Registers registers = 3;
// Signal number.
int32 signal_number = 4;
// The memory location which caused the fault (set if applicable, 0
// otherwise). This will be set for SIGILL, SIGFPE, SIGSEGV, and SIGBUS.
uint64 fault_addr = 5;
}