Skip to content

Commit

Permalink
[release-branch.go1.16] syscall: avoid writing to p when Pipe(p) fails
Browse files Browse the repository at this point in the history
Generally speaking Go functions make no guarantees
about what has happened to result parameters on error,
and Pipe is no exception: callers should avoid looking at
p if Pipe returns an error.

However, we had a bug in which ForkExec was using the
content of p after a failed Pipe, and others may too.
As a robustness fix, make Pipe avoid writing to p on failure.

Updates #50057

Change-Id: Ie8955025dbd20702fabadc9bbe1d1a5ac0f36305
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1291271
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-on: https://go-review.googlesource.com/c/go/+/370515
Trust: Filippo Valsorda <filippo@golang.org>
Run-TryBot: Filippo Valsorda <filippo@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Alex Rakoczy <alex@golang.org>
  • Loading branch information
rsc authored and FiloSottile committed Dec 9, 2021
1 parent 44a3fb4 commit 9995027
Show file tree
Hide file tree
Showing 17 changed files with 105 additions and 51 deletions.
6 changes: 4 additions & 2 deletions src/syscall/syscall_aix.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,10 @@ func Pipe(p []int) (err error) {
}
var pp [2]_C_int
err = pipe(&pp)
p[0] = int(pp[0])
p[1] = int(pp[1])
if err == nil {
p[0] = int(pp[0])
p[1] = int(pp[1])
}
return
}

Expand Down
6 changes: 4 additions & 2 deletions src/syscall/syscall_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,10 @@ func Pipe(p []int) (err error) {
}
var q [2]int32
err = pipe(&q)
p[0] = int(q[0])
p[1] = int(q[1])
if err == nil {
p[0] = int(q[0])
p[1] = int(q[1])
}
return
}

Expand Down
7 changes: 5 additions & 2 deletions src/syscall/syscall_dragonfly.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,11 @@ func Pipe(p []int) (err error) {
if len(p) != 2 {
return EINVAL
}
p[0], p[1], err = pipe()
return
r, w, err := pipe()
if err == nil {
p[0], p[1] = r, w
}
return err
}

//sys extpread(fd int, p []byte, flags int, offset int64) (n int, err error)
Expand Down
6 changes: 4 additions & 2 deletions src/syscall/syscall_freebsd.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,10 @@ func Pipe2(p []int, flags int) error {
}
var pp [2]_C_int
err := pipe2(&pp, flags)
p[0] = int(pp[0])
p[1] = int(pp[1])
if err == nil {
p[0] = int(pp[0])
p[1] = int(pp[1])
}
return err
}

Expand Down
12 changes: 8 additions & 4 deletions src/syscall/syscall_linux_386.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,10 @@ func Pipe(p []int) (err error) {
}
var pp [2]_C_int
err = pipe(&pp)
p[0] = int(pp[0])
p[1] = int(pp[1])
if err == nil {
p[0] = int(pp[0])
p[1] = int(pp[1])
}
return
}

Expand All @@ -43,8 +45,10 @@ func Pipe2(p []int, flags int) (err error) {
}
var pp [2]_C_int
err = pipe2(&pp, flags)
p[0] = int(pp[0])
p[1] = int(pp[1])
if err == nil {
p[0] = int(pp[0])
p[1] = int(pp[1])
}
return
}

Expand Down
12 changes: 8 additions & 4 deletions src/syscall/syscall_linux_amd64.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,8 +118,10 @@ func Pipe(p []int) (err error) {
}
var pp [2]_C_int
err = pipe(&pp)
p[0] = int(pp[0])
p[1] = int(pp[1])
if err == nil {
p[0] = int(pp[0])
p[1] = int(pp[1])
}
return
}

Expand All @@ -131,8 +133,10 @@ func Pipe2(p []int, flags int) (err error) {
}
var pp [2]_C_int
err = pipe2(&pp, flags)
p[0] = int(pp[0])
p[1] = int(pp[1])
if err == nil {
p[0] = int(pp[0])
p[1] = int(pp[1])
}
return
}

Expand Down
12 changes: 8 additions & 4 deletions src/syscall/syscall_linux_arm.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,10 @@ func Pipe(p []int) (err error) {
if err == ENOSYS {
err = pipe(&pp)
}
p[0] = int(pp[0])
p[1] = int(pp[1])
if err == nil {
p[0] = int(pp[0])
p[1] = int(pp[1])
}
return
}

Expand All @@ -47,8 +49,10 @@ func Pipe2(p []int, flags int) (err error) {
}
var pp [2]_C_int
err = pipe2(&pp, flags)
p[0] = int(pp[0])
p[1] = int(pp[1])
if err == nil {
p[0] = int(pp[0])
p[1] = int(pp[1])
}
return
}

Expand Down
12 changes: 8 additions & 4 deletions src/syscall/syscall_linux_arm64.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,8 +152,10 @@ func Pipe(p []int) (err error) {
}
var pp [2]_C_int
err = pipe2(&pp, 0)
p[0] = int(pp[0])
p[1] = int(pp[1])
if err == nil {
p[0] = int(pp[0])
p[1] = int(pp[1])
}
return
}

Expand All @@ -165,8 +167,10 @@ func Pipe2(p []int, flags int) (err error) {
}
var pp [2]_C_int
err = pipe2(&pp, flags)
p[0] = int(pp[0])
p[1] = int(pp[1])
if err == nil {
p[0] = int(pp[0])
p[1] = int(pp[1])
}
return
}

Expand Down
12 changes: 8 additions & 4 deletions src/syscall/syscall_linux_mips64x.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,8 +108,10 @@ func Pipe(p []int) (err error) {
}
var pp [2]_C_int
err = pipe2(&pp, 0)
p[0] = int(pp[0])
p[1] = int(pp[1])
if err == nil {
p[0] = int(pp[0])
p[1] = int(pp[1])
}
return
}

Expand All @@ -121,8 +123,10 @@ func Pipe2(p []int, flags int) (err error) {
}
var pp [2]_C_int
err = pipe2(&pp, flags)
p[0] = int(pp[0])
p[1] = int(pp[1])
if err == nil {
p[0] = int(pp[0])
p[1] = int(pp[1])
}
return
}

Expand Down
13 changes: 9 additions & 4 deletions src/syscall/syscall_linux_mipsx.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,10 @@ func Pipe2(p []int, flags int) (err error) {
}
var pp [2]_C_int
err = pipe2(&pp, flags)
p[0] = int(pp[0])
p[1] = int(pp[1])
if err == nil {
p[0] = int(pp[0])
p[1] = int(pp[1])
}
return
}

Expand All @@ -130,8 +132,11 @@ func Pipe(p []int) (err error) {
if len(p) != 2 {
return EINVAL
}
p[0], p[1], err = pipe()
return
r, w, err := pipe()
if err == nil {
p[0], p[1] = r, w
}
return err
}

//sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error)
Expand Down
12 changes: 8 additions & 4 deletions src/syscall/syscall_linux_ppc64x.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,10 @@ func Pipe(p []int) (err error) {
}
var pp [2]_C_int
err = pipe2(&pp, 0)
p[0] = int(pp[0])
p[1] = int(pp[1])
if err == nil {
p[0] = int(pp[0])
p[1] = int(pp[1])
}
return
}

Expand All @@ -100,8 +102,10 @@ func Pipe2(p []int, flags int) (err error) {
}
var pp [2]_C_int
err = pipe2(&pp, flags)
p[0] = int(pp[0])
p[1] = int(pp[1])
if err == nil {
p[0] = int(pp[0])
p[1] = int(pp[1])
}
return
}

Expand Down
12 changes: 8 additions & 4 deletions src/syscall/syscall_linux_riscv64.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,8 +155,10 @@ func Pipe(p []int) (err error) {
}
var pp [2]_C_int
err = pipe2(&pp, 0)
p[0] = int(pp[0])
p[1] = int(pp[1])
if err == nil {
p[0] = int(pp[0])
p[1] = int(pp[1])
}
return
}

Expand All @@ -168,8 +170,10 @@ func Pipe2(p []int, flags int) (err error) {
}
var pp [2]_C_int
err = pipe2(&pp, flags)
p[0] = int(pp[0])
p[1] = int(pp[1])
if err == nil {
p[0] = int(pp[0])
p[1] = int(pp[1])
}
return
}

Expand Down
12 changes: 8 additions & 4 deletions src/syscall/syscall_linux_s390x.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,10 @@ func Pipe(p []int) (err error) {
}
var pp [2]_C_int
err = pipe2(&pp, 0)
p[0] = int(pp[0])
p[1] = int(pp[1])
if err == nil {
p[0] = int(pp[0])
p[1] = int(pp[1])
}
return
}

Expand All @@ -93,8 +95,10 @@ func Pipe2(p []int, flags int) (err error) {
}
var pp [2]_C_int
err = pipe2(&pp, flags)
p[0] = int(pp[0])
p[1] = int(pp[1])
if err == nil {
p[0] = int(pp[0])
p[1] = int(pp[1])
}
return
}

Expand Down
6 changes: 4 additions & 2 deletions src/syscall/syscall_netbsd.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,8 +112,10 @@ func Pipe2(p []int, flags int) error {
}
var pp [2]_C_int
err := pipe2(&pp, flags)
p[0] = int(pp[0])
p[1] = int(pp[1])
if err == nil {
p[0] = int(pp[0])
p[1] = int(pp[1])
}
return err
}

Expand Down
6 changes: 4 additions & 2 deletions src/syscall/syscall_openbsd.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,10 @@ func Pipe2(p []int, flags int) error {
}
var pp [2]_C_int
err := pipe2(&pp, flags)
p[0] = int(pp[0])
p[1] = int(pp[1])
if err == nil {
p[0] = int(pp[0])
p[1] = int(pp[1])
}
return err
}

Expand Down
6 changes: 4 additions & 2 deletions src/syscall/syscall_plan9.go
Original file line number Diff line number Diff line change
Expand Up @@ -198,8 +198,10 @@ func Pipe(p []int) (err error) {
}
var pp [2]int32
err = pipe(&pp)
p[0] = int(pp[0])
p[1] = int(pp[1])
if err == nil {
p[0] = int(pp[0])
p[1] = int(pp[1])
}
return
}

Expand Down
4 changes: 3 additions & 1 deletion src/syscall/syscall_solaris.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,9 @@ func Pipe(p []int) (err error) {
if e1 != 0 {
err = Errno(e1)
}
p[0], p[1] = int(r0), int(w0)
if err == nil {
p[0], p[1] = int(r0), int(w0)
}
return
}

Expand Down

0 comments on commit 9995027

Please sign in to comment.