The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/7343
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
From 539b6bb5fe7cd2e2f48b4f9dabfa78f5fb7e2424 Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Sun, 10 May 2020 11:11:16 +0200 Subject: [PATCH 1/4] openpty: use O_CLOEXEC directly Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- shared/util_linux.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/util_linux.go b/shared/util_linux.go index c739b42058..364364e7a9 100644 --- a/shared/util_linux.go +++ b/shared/util_linux.go @@ -397,7 +397,7 @@ func OpenPty(uid, gid int64) (*os.File, *os.File, error) { revert := true // Create a PTS pair. - master, err := os.OpenFile("/dev/ptmx", os.O_RDWR, 0) + master, err := os.OpenFile("/dev/ptmx", os.O_RDWR|unix.O_CLOEXEC, 0) if err != nil { return nil, nil, err } From c11dc379f3b1a6d668ff0a84a2f81d56d2823073 Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Sun, 10 May 2020 11:11:32 +0200 Subject: [PATCH 2/4] openpty: use fchown() no need to do all of the path lookup again since we already have a valid fd. Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- shared/util_linux.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/util_linux.go b/shared/util_linux.go index 364364e7a9..107330c066 100644 --- a/shared/util_linux.go +++ b/shared/util_linux.go @@ -472,7 +472,7 @@ func OpenPty(uid, gid int64) (*os.File, *os.File, error) { } // Fix the ownership of the slave side. - err = os.Chown(slave.Name(), int(uid), int(gid)) + err = unix.Fchown(int(slave.Fd()), int(uid), int(gid)) if err != nil { return nil, nil, err } From 5b0b96f67ae4597b24aab6f68c9b75c44857185b Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Sun, 10 May 2020 11:16:35 +0200 Subject: [PATCH 3/4] openpty: first unlock the master, then get a slave fd Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- shared/util_linux.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/shared/util_linux.go b/shared/util_linux.go index 107330c066..97f1a9cf24 100644 --- a/shared/util_linux.go +++ b/shared/util_linux.go @@ -407,16 +407,16 @@ func OpenPty(uid, gid int64) (*os.File, *os.File, error) { } }() - // Get the slave side. - id := 0 - _, _, errno := unix.Syscall(unix.SYS_IOCTL, uintptr(master.Fd()), unix.TIOCGPTN, uintptr(unsafe.Pointer(&id))) + // Unlock the master and slave. + val := 0 + _, _, errno = unix.Syscall(unix.SYS_IOCTL, uintptr(master.Fd()), unix.TIOCSPTLCK, uintptr(unsafe.Pointer(&val))) if errno != 0 { return nil, nil, unix.Errno(errno) } - // Unlock the slave side. - val := 0 - _, _, errno = unix.Syscall(unix.SYS_IOCTL, uintptr(master.Fd()), unix.TIOCSPTLCK, uintptr(unsafe.Pointer(&val))) + // Get the slave side. + id := 0 + _, _, errno := unix.Syscall(unix.SYS_IOCTL, uintptr(master.Fd()), unix.TIOCGPTN, uintptr(unsafe.Pointer(&id))) if errno != 0 { return nil, nil, unix.Errno(errno) } From 117e1b9d6d22c78ea16616559c9f0f184d40a222 Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Sun, 10 May 2020 11:32:26 +0200 Subject: [PATCH 4/4] openpty: use TIOCGPTPEER if available Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- shared/util_linux.go | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/shared/util_linux.go b/shared/util_linux.go index 97f1a9cf24..4957a312bb 100644 --- a/shared/util_linux.go +++ b/shared/util_linux.go @@ -409,22 +409,28 @@ func OpenPty(uid, gid int64) (*os.File, *os.File, error) { // Unlock the master and slave. val := 0 - _, _, errno = unix.Syscall(unix.SYS_IOCTL, uintptr(master.Fd()), unix.TIOCSPTLCK, uintptr(unsafe.Pointer(&val))) + _, _, errno := unix.Syscall(unix.SYS_IOCTL, uintptr(master.Fd()), unix.TIOCSPTLCK, uintptr(unsafe.Pointer(&val))) if errno != 0 { return nil, nil, unix.Errno(errno) } - // Get the slave side. - id := 0 - _, _, errno := unix.Syscall(unix.SYS_IOCTL, uintptr(master.Fd()), unix.TIOCGPTN, uintptr(unsafe.Pointer(&id))) - if errno != 0 { - return nil, nil, unix.Errno(errno) - } + var slave *os.File + slaveFd, err := unix.IoctlRetInt(int(master.Fd()), unix.TIOCGPTPEER) + if err == nil { + slave = os.NewFile(uintptr(slaveFd), fmt.Sprintf("%d", slaveFd)) + } else { + // Get the slave side. + id := 0 + _, _, errno = unix.Syscall(unix.SYS_IOCTL, uintptr(master.Fd()), unix.TIOCGPTN, uintptr(unsafe.Pointer(&id))) + if errno != 0 { + return nil, nil, unix.Errno(errno) + } - // Open the slave. - slave, err := os.OpenFile(fmt.Sprintf("/dev/pts/%d", id), os.O_RDWR|unix.O_NOCTTY, 0) - if err != nil { - return nil, nil, err + // Open the slave. + slave, err = os.OpenFile(fmt.Sprintf("/dev/pts/%d", id), os.O_RDWR|unix.O_NOCTTY, 0) + if err != nil { + return nil, nil, err + } } defer func() { if revert {
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel