2019-09-19 18:35:27 +00:00
|
|
|
// Copyright 2018 The gVisor Authors.
|
|
|
|
//
|
|
|
|
// 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.
|
|
|
|
|
|
|
|
package kernel
|
|
|
|
|
2020-01-10 06:00:42 +00:00
|
|
|
import "gvisor.dev/gvisor/pkg/sync"
|
2019-09-19 18:35:27 +00:00
|
|
|
|
|
|
|
// TTY defines the relationship between a thread group and its controlling
|
|
|
|
// terminal.
|
|
|
|
//
|
|
|
|
// +stateify savable
|
|
|
|
type TTY struct {
|
2019-12-06 22:32:53 +00:00
|
|
|
// Index is the terminal index. It is immutable.
|
|
|
|
Index uint32
|
|
|
|
|
2019-09-19 18:35:27 +00:00
|
|
|
mu sync.Mutex `state:"nosave"`
|
|
|
|
|
|
|
|
// tg is protected by mu.
|
|
|
|
tg *ThreadGroup
|
|
|
|
}
|
2019-12-06 22:32:53 +00:00
|
|
|
|
|
|
|
// TTY returns the thread group's controlling terminal. If nil, there is no
|
|
|
|
// controlling terminal.
|
|
|
|
func (tg *ThreadGroup) TTY() *TTY {
|
Fix "unlock of unlocked mutex" crash when getting tty
This patch holds taskset.mu when getting tty. If we don't
do this, it may cause a "unlock of unlocked mutex" problem,
since signalHandlers may be replaced by CopyForExec() in
runSyscallAfterExecStop after the signalHandlers.mu has
been holded in TTY().
The problem is easy to reproduce with keeping to do "runsc ps".
The crash log is :
fatal error: sync: unlock of unlocked mutex
goroutine 5801304 [running]:
runtime.throw(0xfd019c, 0x1e)
GOROOT/src/runtime/panic.go:774 +0x72 fp=0xc001ba47b0 sp=0xc001ba4780 pc=0x431702
sync.throw(0xfd019c, 0x1e)
GOROOT/src/runtime/panic.go:760 +0x35 fp=0xc001ba47d0 sp=0xc001ba47b0 pc=0x431685
sync.(*Mutex).unlockSlow(0xc00cf94a30, 0xc0ffffffff)
GOROOT/src/sync/mutex.go:196 +0xd6 fp=0xc001ba47f8 sp=0xc001ba47d0 pc=0x4707d6
sync.(*Mutex).Unlock(0xc00cf94a30)
GOROOT/src/sync/mutex.go:190 +0x48 fp=0xc001ba4818 sp=0xc001ba47f8 pc=0x4706e8
gvisor.dev/gvisor/pkg/sentry/kernel.(*ThreadGroup).TTY(0xc011a9e800, 0x0)
pkg/sentry/kernel/tty.go:38 +0x88 fp=0xc001ba4868 sp=0xc001ba4818 pc=0x835fa8
gvisor.dev/gvisor/pkg/sentry/control.Processes(0xc00025ae00, 0xc013e397c0, 0x40, 0xc0137b9800, 0x1, 0x7f292e9a4cc0)
pkg/sentry/control/proc.go:366 +0x355 fp=0xc001ba49a0 sp=0xc001ba4868 pc=0x9ac4a5
gvisor.dev/gvisor/runsc/boot.(*containerManager).Processes(0xc0003b62c0, 0xc0051423d0, 0xc0137b9800, 0x0, 0x0)
runsc/boot/controller.go:228 +0xdf fp=0xc001ba49e8 sp=0xc001ba49a0 pc=0xaf06cf
Signed-off-by: chris.zn <chris.zn@antfin.com>
2020-01-14 10:59:33 +00:00
|
|
|
tg.pidns.owner.mu.RLock()
|
|
|
|
defer tg.pidns.owner.mu.RUnlock()
|
2019-12-06 22:32:53 +00:00
|
|
|
tg.signalHandlers.mu.Lock()
|
|
|
|
defer tg.signalHandlers.mu.Unlock()
|
|
|
|
return tg.tty
|
|
|
|
}
|