]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.17] syscall: avoid writing to p when Pipe(p) fails
authorRuss Cox <rsc@golang.org>
Wed, 8 Dec 2021 23:06:41 +0000 (18:06 -0500)
committerFilippo Valsorda <filippo@golang.org>
Thu, 9 Dec 2021 12:28:48 +0000 (12:28 +0000)
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/+/370535
Trust: Filippo Valsorda <filippo@golang.org>
Run-TryBot: Filippo Valsorda <filippo@golang.org>
Reviewed-by: Alex Rakoczy <alex@golang.org>
17 files changed:
src/syscall/syscall_aix.go
src/syscall/syscall_darwin.go
src/syscall/syscall_dragonfly.go
src/syscall/syscall_freebsd.go
src/syscall/syscall_linux_386.go
src/syscall/syscall_linux_amd64.go
src/syscall/syscall_linux_arm.go
src/syscall/syscall_linux_arm64.go
src/syscall/syscall_linux_mips64x.go
src/syscall/syscall_linux_mipsx.go
src/syscall/syscall_linux_ppc64x.go
src/syscall/syscall_linux_riscv64.go
src/syscall/syscall_linux_s390x.go
src/syscall/syscall_netbsd.go
src/syscall/syscall_openbsd.go
src/syscall/syscall_plan9.go
src/syscall/syscall_solaris.go

index 9c6afba442e2f2adf2227fb05845af8aeee9ddc4..db289fd39c12ac6c1ec3ba6fa4ee67ad973a0e23 100644 (file)
@@ -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
 }
 
index a4fe4f1962bb7e096ff2c17461f775150dbf2455..ce69464f5f4cbba292a08506ee4ba9244b64d57f 100644 (file)
@@ -96,8 +96,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
 }
 
index b01a4ada67525e356195c6a1314a70bdeff50098..5ff7f99d5279afcde3a9ddd008e9f69798f3b256 100644 (file)
@@ -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
 }
 
 //sysnb        pipe2(p *[2]_C_int, flags int) (r int, w int, err error)
@@ -109,7 +112,10 @@ func Pipe2(p []int, flags int) (err error) {
        var pp [2]_C_int
        // pipe2 on dragonfly takes an fds array as an argument, but still
        // returns the file descriptors.
-       p[0], p[1], err = pipe2(&pp, flags)
+       r, w, err := pipe2(&pp, flags)
+       if err == nil {
+               p[0], p[1] = r, w
+       }
        return err
 }
 
index 7c7b89aab9030aa91683b372267d96bb49166217..ad904d69817120639867dc3ca7fb8914d0d38efd 100644 (file)
@@ -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
 }
 
index 0db037470d438761c4c290d27384aafe43c7eda2..26bdb9b78bd2f024c94d6b6b64d050690e3464f5 100644 (file)
@@ -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
 }
 
@@ -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
 }
 
index 5df3f796d1677785114bad853ae8479e8fee83b6..896117adc847534782d9870b09c02fd2abc40cbb 100644 (file)
@@ -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
 }
 
@@ -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
 }
 
index e887cf788f3ae20cab1ee83a502ff054f1383d97..79c201a20f34d85b4527724db76481834c2cb34a 100644 (file)
@@ -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
 }
 
@@ -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
 }
 
index f575c84c930c2d0a884893289a285a939a0b4b07..bfa7be96aa30914529502b823609ebea575b38c1 100644 (file)
@@ -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
 }
 
@@ -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
 }
 
index 5feb03e915adf0021f5060b2fa6e5b88d9b973b7..43f94111cd1b084c1c6e3e534f7f8c04ed3163d3 100644 (file)
@@ -109,8 +109,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
 }
 
@@ -122,8 +124,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
 }
 
index 39104d71d84520f8fe6dd3bb17d8944635354318..1ab452e1233d3b56ba67a42d46501d76c8478b04 100644 (file)
@@ -120,8 +120,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
 }
 
@@ -131,8 +133,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)
index 495ae29757cac649b2a3b9cb754a0be19d1ff1e2..8a69eb57b0a6c3b8e3b43be573ce9c7cbdac5ed9 100644 (file)
@@ -88,8 +88,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
 }
 
@@ -101,8 +103,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
 }
 
index 2a0fe64d258617a8dc147d17d55cc8d205e0905b..dd48f7c8db74f63b2c558922d8fd685c44c54982 100644 (file)
@@ -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
 }
 
@@ -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
 }
 
index 0f6f6277bbfda2b02aab58268b77ce9b796c2097..08e66136b8188c65e20c31234327ba0203af2655 100644 (file)
@@ -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
 }
 
@@ -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
 }
 
index fc13b706b5da3c621f87177263e62984d433ea53..0754bad5ac1fac02d1ed9c4101322cdcd136ac82 100644 (file)
@@ -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
 }
 
index 5a5ba5a51b07b7d7f908b74a2831c2ab57c338c7..18eafe3521d590ce076a4ccc095b43506e40e665 100644 (file)
@@ -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
 }
 
index d16cad45d851da0de4cb30a954f98f3c3c349dbe..6a8ab97dc6cc9238d5d8af1073005156c94343d0 100644 (file)
@@ -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
 }
 
index daa4b88a71d6fcb6d9d03c3048006d52fd9c135f..7640aac25b3aaaddcb4094794f5c9a26e453bed8 100644 (file)
@@ -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
 }