Skip to content

Commit 65633fe

Browse files
rscFiloSottile
authored andcommitted
[release-branch.go1.17] syscall: avoid writing to p when Pipe(p) fails
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 <[email protected]> Reviewed-on: https://go-review.googlesource.com/c/go/+/370535 Trust: Filippo Valsorda <[email protected]> Run-TryBot: Filippo Valsorda <[email protected]> Reviewed-by: Alex Rakoczy <[email protected]>
1 parent e46abcb commit 65633fe

17 files changed

+109
-52
lines changed

src/syscall/syscall_aix.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,10 @@ func Pipe(p []int) (err error) {
6464
}
6565
var pp [2]_C_int
6666
err = pipe(&pp)
67-
p[0] = int(pp[0])
68-
p[1] = int(pp[1])
67+
if err == nil {
68+
p[0] = int(pp[0])
69+
p[1] = int(pp[1])
70+
}
6971
return
7072
}
7173

src/syscall/syscall_darwin.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,10 @@ func Pipe(p []int) (err error) {
9696
}
9797
var q [2]int32
9898
err = pipe(&q)
99-
p[0] = int(q[0])
100-
p[1] = int(q[1])
99+
if err == nil {
100+
p[0] = int(q[0])
101+
p[1] = int(q[1])
102+
}
101103
return
102104
}
103105

src/syscall/syscall_dragonfly.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,11 @@ func Pipe(p []int) (err error) {
9696
if len(p) != 2 {
9797
return EINVAL
9898
}
99-
p[0], p[1], err = pipe()
100-
return
99+
r, w, err := pipe()
100+
if err == nil {
101+
p[0], p[1] = r, w
102+
}
103+
return err
101104
}
102105

103106
//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) {
109112
var pp [2]_C_int
110113
// pipe2 on dragonfly takes an fds array as an argument, but still
111114
// returns the file descriptors.
112-
p[0], p[1], err = pipe2(&pp, flags)
115+
r, w, err := pipe2(&pp, flags)
116+
if err == nil {
117+
p[0], p[1] = r, w
118+
}
113119
return err
114120
}
115121

src/syscall/syscall_freebsd.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,10 @@ func Pipe2(p []int, flags int) error {
105105
}
106106
var pp [2]_C_int
107107
err := pipe2(&pp, flags)
108-
p[0] = int(pp[0])
109-
p[1] = int(pp[1])
108+
if err == nil {
109+
p[0] = int(pp[0])
110+
p[1] = int(pp[1])
111+
}
110112
return err
111113
}
112114

src/syscall/syscall_linux_386.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,10 @@ func Pipe(p []int) (err error) {
3030
}
3131
var pp [2]_C_int
3232
err = pipe(&pp)
33-
p[0] = int(pp[0])
34-
p[1] = int(pp[1])
33+
if err == nil {
34+
p[0] = int(pp[0])
35+
p[1] = int(pp[1])
36+
}
3537
return
3638
}
3739

@@ -43,8 +45,10 @@ func Pipe2(p []int, flags int) (err error) {
4345
}
4446
var pp [2]_C_int
4547
err = pipe2(&pp, flags)
46-
p[0] = int(pp[0])
47-
p[1] = int(pp[1])
48+
if err == nil {
49+
p[0] = int(pp[0])
50+
p[1] = int(pp[1])
51+
}
4852
return
4953
}
5054

src/syscall/syscall_linux_amd64.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,10 @@ func Pipe(p []int) (err error) {
118118
}
119119
var pp [2]_C_int
120120
err = pipe(&pp)
121-
p[0] = int(pp[0])
122-
p[1] = int(pp[1])
121+
if err == nil {
122+
p[0] = int(pp[0])
123+
p[1] = int(pp[1])
124+
}
123125
return
124126
}
125127

@@ -131,8 +133,10 @@ func Pipe2(p []int, flags int) (err error) {
131133
}
132134
var pp [2]_C_int
133135
err = pipe2(&pp, flags)
134-
p[0] = int(pp[0])
135-
p[1] = int(pp[1])
136+
if err == nil {
137+
p[0] = int(pp[0])
138+
p[1] = int(pp[1])
139+
}
136140
return
137141
}
138142

src/syscall/syscall_linux_arm.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,10 @@ func Pipe(p []int) (err error) {
3434
if err == ENOSYS {
3535
err = pipe(&pp)
3636
}
37-
p[0] = int(pp[0])
38-
p[1] = int(pp[1])
37+
if err == nil {
38+
p[0] = int(pp[0])
39+
p[1] = int(pp[1])
40+
}
3941
return
4042
}
4143

@@ -47,8 +49,10 @@ func Pipe2(p []int, flags int) (err error) {
4749
}
4850
var pp [2]_C_int
4951
err = pipe2(&pp, flags)
50-
p[0] = int(pp[0])
51-
p[1] = int(pp[1])
52+
if err == nil {
53+
p[0] = int(pp[0])
54+
p[1] = int(pp[1])
55+
}
5256
return
5357
}
5458

src/syscall/syscall_linux_arm64.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,10 @@ func Pipe(p []int) (err error) {
152152
}
153153
var pp [2]_C_int
154154
err = pipe2(&pp, 0)
155-
p[0] = int(pp[0])
156-
p[1] = int(pp[1])
155+
if err == nil {
156+
p[0] = int(pp[0])
157+
p[1] = int(pp[1])
158+
}
157159
return
158160
}
159161

@@ -165,8 +167,10 @@ func Pipe2(p []int, flags int) (err error) {
165167
}
166168
var pp [2]_C_int
167169
err = pipe2(&pp, flags)
168-
p[0] = int(pp[0])
169-
p[1] = int(pp[1])
170+
if err == nil {
171+
p[0] = int(pp[0])
172+
p[1] = int(pp[1])
173+
}
170174
return
171175
}
172176

src/syscall/syscall_linux_mips64x.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,10 @@ func Pipe(p []int) (err error) {
109109
}
110110
var pp [2]_C_int
111111
err = pipe2(&pp, 0)
112-
p[0] = int(pp[0])
113-
p[1] = int(pp[1])
112+
if err == nil {
113+
p[0] = int(pp[0])
114+
p[1] = int(pp[1])
115+
}
114116
return
115117
}
116118

@@ -122,8 +124,10 @@ func Pipe2(p []int, flags int) (err error) {
122124
}
123125
var pp [2]_C_int
124126
err = pipe2(&pp, flags)
125-
p[0] = int(pp[0])
126-
p[1] = int(pp[1])
127+
if err == nil {
128+
p[0] = int(pp[0])
129+
p[1] = int(pp[1])
130+
}
127131
return
128132
}
129133

src/syscall/syscall_linux_mipsx.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,10 @@ func Pipe2(p []int, flags int) (err error) {
120120
}
121121
var pp [2]_C_int
122122
err = pipe2(&pp, flags)
123-
p[0] = int(pp[0])
124-
p[1] = int(pp[1])
123+
if err == nil {
124+
p[0] = int(pp[0])
125+
p[1] = int(pp[1])
126+
}
125127
return
126128
}
127129

@@ -131,8 +133,11 @@ func Pipe(p []int) (err error) {
131133
if len(p) != 2 {
132134
return EINVAL
133135
}
134-
p[0], p[1], err = pipe()
135-
return
136+
r, w, err := pipe()
137+
if err == nil {
138+
p[0], p[1] = r, w
139+
}
140+
return err
136141
}
137142

138143
//sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error)

src/syscall/syscall_linux_ppc64x.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,10 @@ func Pipe(p []int) (err error) {
8888
}
8989
var pp [2]_C_int
9090
err = pipe2(&pp, 0)
91-
p[0] = int(pp[0])
92-
p[1] = int(pp[1])
91+
if err == nil {
92+
p[0] = int(pp[0])
93+
p[1] = int(pp[1])
94+
}
9395
return
9496
}
9597

@@ -101,8 +103,10 @@ func Pipe2(p []int, flags int) (err error) {
101103
}
102104
var pp [2]_C_int
103105
err = pipe2(&pp, flags)
104-
p[0] = int(pp[0])
105-
p[1] = int(pp[1])
106+
if err == nil {
107+
p[0] = int(pp[0])
108+
p[1] = int(pp[1])
109+
}
106110
return
107111
}
108112

src/syscall/syscall_linux_riscv64.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,10 @@ func Pipe(p []int) (err error) {
155155
}
156156
var pp [2]_C_int
157157
err = pipe2(&pp, 0)
158-
p[0] = int(pp[0])
159-
p[1] = int(pp[1])
158+
if err == nil {
159+
p[0] = int(pp[0])
160+
p[1] = int(pp[1])
161+
}
160162
return
161163
}
162164

@@ -168,8 +170,10 @@ func Pipe2(p []int, flags int) (err error) {
168170
}
169171
var pp [2]_C_int
170172
err = pipe2(&pp, flags)
171-
p[0] = int(pp[0])
172-
p[1] = int(pp[1])
173+
if err == nil {
174+
p[0] = int(pp[0])
175+
p[1] = int(pp[1])
176+
}
173177
return
174178
}
175179

src/syscall/syscall_linux_s390x.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,10 @@ func Pipe(p []int) (err error) {
8080
}
8181
var pp [2]_C_int
8282
err = pipe2(&pp, 0)
83-
p[0] = int(pp[0])
84-
p[1] = int(pp[1])
83+
if err == nil {
84+
p[0] = int(pp[0])
85+
p[1] = int(pp[1])
86+
}
8587
return
8688
}
8789

@@ -93,8 +95,10 @@ func Pipe2(p []int, flags int) (err error) {
9395
}
9496
var pp [2]_C_int
9597
err = pipe2(&pp, flags)
96-
p[0] = int(pp[0])
97-
p[1] = int(pp[1])
98+
if err == nil {
99+
p[0] = int(pp[0])
100+
p[1] = int(pp[1])
101+
}
98102
return
99103
}
100104

src/syscall/syscall_netbsd.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,10 @@ func Pipe2(p []int, flags int) error {
112112
}
113113
var pp [2]_C_int
114114
err := pipe2(&pp, flags)
115-
p[0] = int(pp[0])
116-
p[1] = int(pp[1])
115+
if err == nil {
116+
p[0] = int(pp[0])
117+
p[1] = int(pp[1])
118+
}
117119
return err
118120
}
119121

src/syscall/syscall_openbsd.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,10 @@ func Pipe2(p []int, flags int) error {
7272
}
7373
var pp [2]_C_int
7474
err := pipe2(&pp, flags)
75-
p[0] = int(pp[0])
76-
p[1] = int(pp[1])
75+
if err == nil {
76+
p[0] = int(pp[0])
77+
p[1] = int(pp[1])
78+
}
7779
return err
7880
}
7981

src/syscall/syscall_plan9.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,10 @@ func Pipe(p []int) (err error) {
198198
}
199199
var pp [2]int32
200200
err = pipe(&pp)
201-
p[0] = int(pp[0])
202-
p[1] = int(pp[1])
201+
if err == nil {
202+
p[0] = int(pp[0])
203+
p[1] = int(pp[1])
204+
}
203205
return
204206
}
205207

src/syscall/syscall_solaris.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ func Pipe(p []int) (err error) {
5555
if e1 != 0 {
5656
err = Errno(e1)
5757
}
58-
p[0], p[1] = int(r0), int(w0)
58+
if err == nil {
59+
p[0], p[1] = int(r0), int(w0)
60+
}
5961
return
6062
}
6163

0 commit comments

Comments
 (0)