Merge pull request #863 from tanjianfeng:fix-862

PiperOrigin-RevId: 271168948
This commit is contained in:
gVisor bot 2019-09-25 11:36:06 -07:00
commit 99c86b8dbd
1 changed files with 12 additions and 3 deletions

View File

@ -43,12 +43,15 @@ type TTYFileOperations struct {
// fgProcessGroup is the foreground process group that is currently // fgProcessGroup is the foreground process group that is currently
// connected to this TTY. // connected to this TTY.
fgProcessGroup *kernel.ProcessGroup fgProcessGroup *kernel.ProcessGroup
termios linux.KernelTermios
} }
// newTTYFile returns a new fs.File that wraps a TTY FD. // newTTYFile returns a new fs.File that wraps a TTY FD.
func newTTYFile(ctx context.Context, dirent *fs.Dirent, flags fs.FileFlags, iops *inodeOperations) *fs.File { func newTTYFile(ctx context.Context, dirent *fs.Dirent, flags fs.FileFlags, iops *inodeOperations) *fs.File {
return fs.NewFile(ctx, dirent, flags, &TTYFileOperations{ return fs.NewFile(ctx, dirent, flags, &TTYFileOperations{
fileOperations: fileOperations{iops: iops}, fileOperations: fileOperations{iops: iops},
termios: linux.DefaultSlaveTermios,
}) })
} }
@ -97,9 +100,12 @@ func (t *TTYFileOperations) Write(ctx context.Context, file *fs.File, src userme
t.mu.Lock() t.mu.Lock()
defer t.mu.Unlock() defer t.mu.Unlock()
// Are we allowed to do the write? // Check whether TOSTOP is enabled. This corresponds to the check in
if err := t.checkChange(ctx, linux.SIGTTOU); err != nil { // drivers/tty/n_tty.c:n_tty_write().
return 0, err if t.termios.LEnabled(linux.TOSTOP) {
if err := t.checkChange(ctx, linux.SIGTTOU); err != nil {
return 0, err
}
} }
return t.fileOperations.Write(ctx, file, src, offset) return t.fileOperations.Write(ctx, file, src, offset)
} }
@ -144,6 +150,9 @@ func (t *TTYFileOperations) Ioctl(ctx context.Context, _ *fs.File, io usermem.IO
return 0, err return 0, err
} }
err := ioctlSetTermios(fd, ioctl, &termios) err := ioctlSetTermios(fd, ioctl, &termios)
if err == nil {
t.termios.FromTermios(termios)
}
return 0, err return 0, err
case linux.TIOCGPGRP: case linux.TIOCGPGRP: