From 20c96a7ddcd913e7fe627a30c91bcc73b655944c Mon Sep 17 00:00:00 2001 From: Heschi Kreinick Date: Wed, 8 Mar 2023 16:48:06 -0500 Subject: [PATCH] [release-branch.go1.19] os/signal/internal/pty: fix error handling When calling a c library function, you discover that an error has occurred, typically by looking at the return value of the function. Only after that can you use errno to figure out the cause of the error. Nothing about cgo changes that story -- you still have to look at the result before checking the error that represents errno. If not you can get false errors if the function happens to leak a non-zero errno. Fix testpty to check errors correctly. Fixes #58941 Change-Id: I4009e10b344e43fec291b941a63bcf4548937d44 Reviewed-on: https://go-review.googlesource.com/c/go/+/474619 Run-TryBot: Heschi Kreinick Reviewed-by: Carlos Amedee Auto-Submit: Heschi Kreinick TryBot-Result: Gopher Robot --- src/os/signal/internal/pty/pty.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/os/signal/internal/pty/pty.go b/src/os/signal/internal/pty/pty.go index 537febba553c6..92f738ddb9c8e 100644 --- a/src/os/signal/internal/pty/pty.go +++ b/src/os/signal/internal/pty/pty.go @@ -42,14 +42,14 @@ func (e *PtyError) Unwrap() error { return e.Errno } // Open returns a control pty and the name of the linked process tty. func Open() (pty *os.File, processTTY string, err error) { m, err := C.posix_openpt(C.O_RDWR) - if err != nil { + if m < 0 { return nil, "", ptyError("posix_openpt", err) } - if _, err := C.grantpt(m); err != nil { + if res, err := C.grantpt(m); res < 0 { C.close(m) return nil, "", ptyError("grantpt", err) } - if _, err := C.unlockpt(m); err != nil { + if res, err := C.unlockpt(m); res < 0 { C.close(m) return nil, "", ptyError("unlockpt", err) }