Skip to content

Commit ef3d74d

Browse files
committed
x/net/ipv4: add missing ancillary data socket options check
Fixes crashes on various platforms. LGTM=iant R=iant CC=golang-codereviews https://golang.org/cl/167880044
1 parent 586296a commit ef3d74d

File tree

1 file changed

+15
-17
lines changed

1 file changed

+15
-17
lines changed

ipv4/control_unix.go

+15-17
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import (
1717
func setControlMessage(fd int, opt *rawOpt, cf ControlFlags, on bool) error {
1818
opt.Lock()
1919
defer opt.Unlock()
20-
if cf&FlagTTL != 0 {
20+
if cf&FlagTTL != 0 && sockOpts[ssoReceiveTTL].name > 0 {
2121
if err := setInt(fd, &sockOpts[ssoReceiveTTL], boolint(on)); err != nil {
2222
return err
2323
}
@@ -39,7 +39,7 @@ func setControlMessage(fd int, opt *rawOpt, cf ControlFlags, on bool) error {
3939
}
4040
}
4141
} else {
42-
if cf&FlagDst != 0 {
42+
if cf&FlagDst != 0 && sockOpts[ssoReceiveDst].name > 0 {
4343
if err := setInt(fd, &sockOpts[ssoReceiveDst], boolint(on)); err != nil {
4444
return err
4545
}
@@ -49,7 +49,7 @@ func setControlMessage(fd int, opt *rawOpt, cf ControlFlags, on bool) error {
4949
opt.clear(FlagDst)
5050
}
5151
}
52-
if cf&FlagInterface != 0 {
52+
if cf&FlagInterface != 0 && sockOpts[ssoReceiveInterface].name > 0 {
5353
if err := setInt(fd, &sockOpts[ssoReceiveInterface], boolint(on)); err != nil {
5454
return err
5555
}
@@ -66,36 +66,36 @@ func setControlMessage(fd int, opt *rawOpt, cf ControlFlags, on bool) error {
6666
func newControlMessage(opt *rawOpt) (oob []byte) {
6767
opt.RLock()
6868
var l int
69-
if opt.isset(FlagTTL) {
69+
if opt.isset(FlagTTL) && ctlOpts[ctlTTL].name > 0 {
7070
l += syscall.CmsgSpace(ctlOpts[ctlTTL].length)
7171
}
7272
if ctlOpts[ctlPacketInfo].name > 0 {
7373
if opt.isset(FlagSrc | FlagDst | FlagInterface) {
7474
l += syscall.CmsgSpace(ctlOpts[ctlPacketInfo].length)
7575
}
7676
} else {
77-
if opt.isset(FlagDst) {
77+
if opt.isset(FlagDst) && ctlOpts[ctlDst].name > 0 {
7878
l += syscall.CmsgSpace(ctlOpts[ctlDst].length)
7979
}
80-
if opt.isset(FlagInterface) {
80+
if opt.isset(FlagInterface) && ctlOpts[ctlInterface].name > 0 {
8181
l += syscall.CmsgSpace(ctlOpts[ctlInterface].length)
8282
}
8383
}
8484
if l > 0 {
8585
oob = make([]byte, l)
8686
b := oob
87-
if opt.isset(FlagTTL) {
87+
if opt.isset(FlagTTL) && ctlOpts[ctlTTL].name > 0 {
8888
b = ctlOpts[ctlTTL].marshal(b, nil)
8989
}
9090
if ctlOpts[ctlPacketInfo].name > 0 {
9191
if opt.isset(FlagSrc | FlagDst | FlagInterface) {
9292
b = ctlOpts[ctlPacketInfo].marshal(b, nil)
9393
}
9494
} else {
95-
if opt.isset(FlagDst) {
95+
if opt.isset(FlagDst) && ctlOpts[ctlDst].name > 0 {
9696
b = ctlOpts[ctlDst].marshal(b, nil)
9797
}
98-
if opt.isset(FlagInterface) {
98+
if opt.isset(FlagInterface) && ctlOpts[ctlInterface].name > 0 {
9999
b = ctlOpts[ctlInterface].marshal(b, nil)
100100
}
101101
}
@@ -136,18 +136,16 @@ func marshalControlMessage(cm *ControlMessage) (oob []byte) {
136136
return nil
137137
}
138138
var l int
139-
if ctlOpts[ctlPacketInfo].name > 0 {
140-
if cm.Src.To4() != nil || cm.IfIndex > 0 {
141-
l += syscall.CmsgSpace(ctlOpts[ctlPacketInfo].length)
142-
}
139+
pktinfo := false
140+
if ctlOpts[ctlPacketInfo].name > 0 && (cm.Src.To4() != nil || cm.IfIndex > 0) {
141+
pktinfo = true
142+
l += syscall.CmsgSpace(ctlOpts[ctlPacketInfo].length)
143143
}
144144
if l > 0 {
145145
oob = make([]byte, l)
146146
b := oob
147-
if ctlOpts[ctlPacketInfo].name > 0 {
148-
if cm.Src.To4() != nil || cm.IfIndex > 0 {
149-
b = ctlOpts[ctlPacketInfo].marshal(b, cm)
150-
}
147+
if pktinfo {
148+
b = ctlOpts[ctlPacketInfo].marshal(b, cm)
151149
}
152150
}
153151
return

0 commit comments

Comments
 (0)