summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorBrian Geffon <bgeffon@google.com>2018-12-26 11:24:29 -0800
committerShentubot <shentubot@google.com>2018-12-26 11:26:28 -0800
commitbfa2f314ca05854b0d08aa2f5c2b93b16542d95f (patch)
tree41a42ad8a321171560513cea79faa2db946a48a9
parent0df0df35fc4aa4d69dc01f7c7e2d9e0530a34db7 (diff)
Add EventChannel messages for uncaught signals.
PiperOrigin-RevId: 226936778 Change-Id: I2a6dda157c55d39d81e1b543ab11a58a0bfe5c05
-rw-r--r--pkg/sentry/kernel/BUILD18
-rw-r--r--pkg/sentry/kernel/task_signals.go19
-rw-r--r--pkg/sentry/kernel/uncaught_signal.proto37
3 files changed, 74 insertions, 0 deletions
diff --git a/pkg/sentry/kernel/BUILD b/pkg/sentry/kernel/BUILD
index 10d7b97c2..490f674c0 100644
--- a/pkg/sentry/kernel/BUILD
+++ b/pkg/sentry/kernel/BUILD
@@ -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",
diff --git a/pkg/sentry/kernel/task_signals.go b/pkg/sentry/kernel/task_signals.go
index fe24f7542..583acddb1 100644
--- a/pkg/sentry/kernel/task_signals.go
+++ b/pkg/sentry/kernel/task_signals.go
@@ -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)
diff --git a/pkg/sentry/kernel/uncaught_signal.proto b/pkg/sentry/kernel/uncaught_signal.proto
new file mode 100644
index 000000000..c7f6a1978
--- /dev/null
+++ b/pkg/sentry/kernel/uncaught_signal.proto
@@ -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;
+}