mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Add EventChannel messages for uncaught signals.
PiperOrigin-RevId: 226936778 Change-Id: I2a6dda157c55d39d81e1b543ab11a58a0bfe5c05
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user