Skip to content

Commit b583842

Browse files
committed
🐖 conn: support pktinfo on dragonfly, netbsd, solaris, zos
Turns out we messed up alignment on supported BSDs. Hopefully this commit fixes it once and for all.
1 parent a04f96a commit b583842

23 files changed

+307
-192
lines changed

conn/cmsg_align_16.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
//go:build netbsd && arm64
2+
3+
package conn
4+
5+
const cmsgAlignTo = 16

conn/cmsg_align_4.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
//go:build darwin || solaris || zos
2+
3+
package conn
4+
5+
const cmsgAlignTo = 4

conn/cmsg_align_8.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
//go:build (netbsd && arm) || (openbsd && arm)
2+
3+
package conn
4+
5+
const cmsgAlignTo = 8

conn/cmsg_align_generic.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
//go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || windows || zos
2+
3+
package conn
4+
5+
func cmsgAlign(n int) int {
6+
return (n + cmsgAlignTo - 1) & ^(cmsgAlignTo - 1)
7+
}

conn/cmsg_align_ptr.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
//go:build dragonfly || freebsd || linux || (netbsd && !arm && !arm64) || (openbsd && !arm)
2+
3+
package conn
4+
5+
import "golang.org/x/sys/unix"
6+
7+
const cmsgAlignTo = unix.SizeofPtr

conn/cmsg_align_unix_generic.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
//go:build darwin || dragonfly || freebsd || netbsd || openbsd || solaris || zos
2+
3+
package conn
4+
5+
import "golang.org/x/sys/unix"
6+
7+
const alignedSizeofCmsghdr = (unix.SizeofCmsghdr + cmsgAlignTo - 1) & ^(cmsgAlignTo - 1)
Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
//go:build darwin || solaris || zos
2+
13
package conn
24

35
import (
@@ -9,38 +11,37 @@ import (
911
"golang.org/x/sys/unix"
1012
)
1113

12-
const socketControlMessageBufferSize = unix.SizeofCmsghdr + max(alignedSizeofInet4Pktinfo, alignedSizeofInet6Pktinfo)
13-
14-
const cmsgAlignTo = 4
14+
const (
15+
socketControlMessageBufferSize = alignedSizeofCmsghdr + max(alignedSizeofInet4Pktinfo, alignedSizeofInet6Pktinfo)
1516

16-
func cmsgAlign(n uint32) uint32 {
17-
return (n + cmsgAlignTo - 1) & ^uint32(cmsgAlignTo-1)
18-
}
17+
alignedSizeofInet4Pktinfo = (unix.SizeofInet4Pktinfo + cmsgAlignTo - 1) & ^(cmsgAlignTo - 1)
18+
alignedSizeofInet6Pktinfo = (unix.SizeofInet6Pktinfo + cmsgAlignTo - 1) & ^(cmsgAlignTo - 1)
19+
)
1920

2021
func parseSocketControlMessage(cmsg []byte) (m SocketControlMessage, err error) {
2122
for len(cmsg) >= unix.SizeofCmsghdr {
2223
cmsghdr := (*unix.Cmsghdr)(unsafe.Pointer(unsafe.SliceData(cmsg)))
23-
msgSize := cmsgAlign(cmsghdr.Len)
24-
if cmsghdr.Len < unix.SizeofCmsghdr || int(msgSize) > len(cmsg) {
24+
msgSize := cmsgAlign(int(cmsghdr.Len))
25+
if cmsghdr.Len < unix.SizeofCmsghdr || msgSize > len(cmsg) {
2526
return m, fmt.Errorf("invalid control message length %d", cmsghdr.Len)
2627
}
2728

2829
switch {
2930
case cmsghdr.Level == unix.IPPROTO_IP && cmsghdr.Type == unix.IP_PKTINFO:
30-
if len(cmsg) < unix.SizeofCmsghdr+unix.SizeofInet4Pktinfo {
31+
if len(cmsg) < alignedSizeofCmsghdr+unix.SizeofInet4Pktinfo {
3132
return m, fmt.Errorf("invalid IP_PKTINFO control message length %d", cmsghdr.Len)
3233
}
3334
var pktinfo unix.Inet4Pktinfo
34-
_ = copy(unsafe.Slice((*byte)(unsafe.Pointer(&pktinfo)), unix.SizeofInet4Pktinfo), cmsg[unix.SizeofCmsghdr:])
35+
_ = copy(unsafe.Slice((*byte)(unsafe.Pointer(&pktinfo)), unix.SizeofInet4Pktinfo), cmsg[alignedSizeofCmsghdr:])
3536
m.PktinfoAddr = netip.AddrFrom4(pktinfo.Spec_dst)
3637
m.PktinfoIfindex = pktinfo.Ifindex
3738

3839
case cmsghdr.Level == unix.IPPROTO_IPV6 && cmsghdr.Type == unix.IPV6_PKTINFO:
39-
if len(cmsg) < unix.SizeofCmsghdr+unix.SizeofInet6Pktinfo {
40+
if len(cmsg) < alignedSizeofCmsghdr+unix.SizeofInet6Pktinfo {
4041
return m, fmt.Errorf("invalid IPV6_PKTINFO control message length %d", cmsghdr.Len)
4142
}
4243
var pktinfo unix.Inet6Pktinfo
43-
_ = copy(unsafe.Slice((*byte)(unsafe.Pointer(&pktinfo)), unix.SizeofInet6Pktinfo), cmsg[unix.SizeofCmsghdr:])
44+
_ = copy(unsafe.Slice((*byte)(unsafe.Pointer(&pktinfo)), unix.SizeofInet6Pktinfo), cmsg[alignedSizeofCmsghdr:])
4445
m.PktinfoAddr = netip.AddrFrom16(pktinfo.Addr)
4546
m.PktinfoIfindex = pktinfo.Ifindex
4647
}
@@ -51,44 +52,39 @@ func parseSocketControlMessage(cmsg []byte) (m SocketControlMessage, err error)
5152
return m, nil
5253
}
5354

54-
const (
55-
alignedSizeofInet4Pktinfo = (unix.SizeofInet4Pktinfo + unix.SizeofPtr - 1) & ^(unix.SizeofPtr - 1)
56-
alignedSizeofInet6Pktinfo = (unix.SizeofInet6Pktinfo + unix.SizeofPtr - 1) & ^(unix.SizeofPtr - 1)
57-
)
58-
5955
func (m SocketControlMessage) appendTo(b []byte) []byte {
6056
switch {
6157
case m.PktinfoAddr.Is4():
6258
bLen := len(b)
63-
b = slices.Grow(b, unix.SizeofCmsghdr+alignedSizeofInet4Pktinfo)[:bLen+unix.SizeofCmsghdr+alignedSizeofInet4Pktinfo]
59+
b = slices.Grow(b, alignedSizeofCmsghdr+alignedSizeofInet4Pktinfo)[:bLen+alignedSizeofCmsghdr+alignedSizeofInet4Pktinfo]
6460
msgBuf := b[bLen:]
6561
cmsghdr := (*unix.Cmsghdr)(unsafe.Pointer(unsafe.SliceData(msgBuf)))
6662
*cmsghdr = unix.Cmsghdr{
67-
Len: unix.SizeofCmsghdr + unix.SizeofInet4Pktinfo,
63+
Len: alignedSizeofCmsghdr + unix.SizeofInet4Pktinfo,
6864
Level: unix.IPPROTO_IP,
6965
Type: unix.IP_PKTINFO,
7066
}
7167
pktinfo := unix.Inet4Pktinfo{
7268
Ifindex: m.PktinfoIfindex,
7369
Spec_dst: m.PktinfoAddr.As4(),
7470
}
75-
_ = copy(msgBuf[unix.SizeofCmsghdr:], unsafe.Slice((*byte)(unsafe.Pointer(&pktinfo)), unix.SizeofInet4Pktinfo))
71+
_ = copy(msgBuf[alignedSizeofCmsghdr:], unsafe.Slice((*byte)(unsafe.Pointer(&pktinfo)), unix.SizeofInet4Pktinfo))
7672

7773
case m.PktinfoAddr.Is6():
7874
bLen := len(b)
79-
b = slices.Grow(b, unix.SizeofCmsghdr+alignedSizeofInet6Pktinfo)[:bLen+unix.SizeofCmsghdr+alignedSizeofInet6Pktinfo]
75+
b = slices.Grow(b, alignedSizeofCmsghdr+alignedSizeofInet6Pktinfo)[:bLen+alignedSizeofCmsghdr+alignedSizeofInet6Pktinfo]
8076
msgBuf := b[bLen:]
8177
cmsghdr := (*unix.Cmsghdr)(unsafe.Pointer(unsafe.SliceData(msgBuf)))
8278
*cmsghdr = unix.Cmsghdr{
83-
Len: unix.SizeofCmsghdr + unix.SizeofInet6Pktinfo,
79+
Len: alignedSizeofCmsghdr + unix.SizeofInet6Pktinfo,
8480
Level: unix.IPPROTO_IPV6,
8581
Type: unix.IPV6_PKTINFO,
8682
}
8783
pktinfo := unix.Inet6Pktinfo{
8884
Addr: m.PktinfoAddr.As16(),
8985
Ifindex: m.PktinfoIfindex,
9086
}
91-
_ = copy(msgBuf[unix.SizeofCmsghdr:], unsafe.Slice((*byte)(unsafe.Pointer(&pktinfo)), unix.SizeofInet6Pktinfo))
87+
_ = copy(msgBuf[alignedSizeofCmsghdr:], unsafe.Slice((*byte)(unsafe.Pointer(&pktinfo)), unix.SizeofInet6Pktinfo))
9288
}
9389

9490
return b

conn/cmsg_dragonflynetbsd.go

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
//go:build dragonfly || netbsd
2+
3+
package conn
4+
5+
import (
6+
"fmt"
7+
"net/netip"
8+
"slices"
9+
"unsafe"
10+
11+
"golang.org/x/sys/unix"
12+
)
13+
14+
// aix has IPV6_PKTINFO, but x/sys/unix does not provide support for it.
15+
16+
// NetBSD has both IP_BINDANY and IP_PKTINFO, but x/sys/unix does not provide support for them.
17+
18+
const (
19+
socketControlMessageBufferSize = alignedSizeofCmsghdr + max(alignedSizeofInet4Addr, alignedSizeofInet6Pktinfo)
20+
21+
alignedSizeofInet4Addr = (sizeofInet4Addr + cmsgAlignTo - 1) & ^(cmsgAlignTo - 1)
22+
alignedSizeofInet6Pktinfo = (unix.SizeofInet6Pktinfo + cmsgAlignTo - 1) & ^(cmsgAlignTo - 1)
23+
24+
sizeofInet4Addr = 4 // sizeof(struct in_addr)
25+
)
26+
27+
func parseSocketControlMessage(cmsg []byte) (m SocketControlMessage, err error) {
28+
for len(cmsg) >= unix.SizeofCmsghdr {
29+
cmsghdr := (*unix.Cmsghdr)(unsafe.Pointer(unsafe.SliceData(cmsg)))
30+
msgSize := cmsgAlign(int(cmsghdr.Len))
31+
if cmsghdr.Len < unix.SizeofCmsghdr || msgSize > len(cmsg) {
32+
return m, fmt.Errorf("invalid control message length %d", cmsghdr.Len)
33+
}
34+
35+
switch {
36+
case cmsghdr.Level == unix.IPPROTO_IP && cmsghdr.Type == unix.IP_RECVDSTADDR:
37+
if len(cmsg) < alignedSizeofCmsghdr+sizeofInet4Addr {
38+
return m, fmt.Errorf("invalid IP_RECVDSTADDR control message length %d", cmsghdr.Len)
39+
}
40+
addr := [sizeofInet4Addr]byte(cmsg[alignedSizeofCmsghdr:])
41+
m.PktinfoAddr = netip.AddrFrom4(addr)
42+
43+
case cmsghdr.Level == unix.IPPROTO_IPV6 && cmsghdr.Type == unix.IPV6_PKTINFO:
44+
if len(cmsg) < alignedSizeofCmsghdr+unix.SizeofInet6Pktinfo {
45+
return m, fmt.Errorf("invalid IPV6_PKTINFO control message length %d", cmsghdr.Len)
46+
}
47+
var pktinfo unix.Inet6Pktinfo
48+
_ = copy(unsafe.Slice((*byte)(unsafe.Pointer(&pktinfo)), unix.SizeofInet6Pktinfo), cmsg[alignedSizeofCmsghdr:])
49+
m.PktinfoAddr = netip.AddrFrom16(pktinfo.Addr)
50+
m.PktinfoIfindex = pktinfo.Ifindex
51+
}
52+
53+
cmsg = cmsg[msgSize:]
54+
}
55+
56+
return m, nil
57+
}
58+
59+
func (m SocketControlMessage) appendTo(b []byte) []byte {
60+
switch {
61+
case m.PktinfoAddr.Is4():
62+
bLen := len(b)
63+
b = slices.Grow(b, alignedSizeofCmsghdr+alignedSizeofInet4Addr)[:bLen+alignedSizeofCmsghdr+alignedSizeofInet4Addr]
64+
msgBuf := b[bLen:]
65+
cmsghdr := (*unix.Cmsghdr)(unsafe.Pointer(unsafe.SliceData(msgBuf)))
66+
*cmsghdr = unix.Cmsghdr{
67+
Len: alignedSizeofCmsghdr + sizeofInet4Addr,
68+
Level: unix.IPPROTO_IP,
69+
Type: unix.IP_RECVDSTADDR,
70+
}
71+
addr := m.PktinfoAddr.As4()
72+
_ = copy(msgBuf[alignedSizeofCmsghdr:], addr[:])
73+
74+
case m.PktinfoAddr.Is6():
75+
bLen := len(b)
76+
b = slices.Grow(b, alignedSizeofCmsghdr+alignedSizeofInet6Pktinfo)[:bLen+alignedSizeofCmsghdr+alignedSizeofInet6Pktinfo]
77+
msgBuf := b[bLen:]
78+
cmsghdr := (*unix.Cmsghdr)(unsafe.Pointer(unsafe.SliceData(msgBuf)))
79+
*cmsghdr = unix.Cmsghdr{
80+
Len: alignedSizeofCmsghdr + unix.SizeofInet6Pktinfo,
81+
Level: unix.IPPROTO_IPV6,
82+
Type: unix.IPV6_PKTINFO,
83+
}
84+
pktinfo := unix.Inet6Pktinfo{
85+
Addr: m.PktinfoAddr.As16(),
86+
Ifindex: m.PktinfoIfindex,
87+
}
88+
_ = copy(msgBuf[alignedSizeofCmsghdr:], unsafe.Slice((*byte)(unsafe.Pointer(&pktinfo)), unix.SizeofInet6Pktinfo))
89+
}
90+
91+
return b
92+
}

conn/cmsg_freebsd.go

Lines changed: 23 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,17 @@ import (
99
"golang.org/x/sys/unix"
1010
)
1111

12-
const socketControlMessageBufferSize = unix.SizeofCmsghdr + max(alignedSizeofInet4Addr, alignedSizeofInet6Pktinfo) +
13-
unix.SizeofCmsghdr + max(alignedSizeofSockaddrInet4, alignedSizeofSockaddrInet6)
12+
const (
13+
socketControlMessageBufferSize = alignedSizeofCmsghdr + max(alignedSizeofInet4Addr, alignedSizeofInet6Pktinfo) +
14+
alignedSizeofCmsghdr + max(alignedSizeofSockaddrInet4, alignedSizeofSockaddrInet6)
1415

15-
const sizeofInet4Addr = 4 // sizeof(struct in_addr)
16+
alignedSizeofInet4Addr = (sizeofInet4Addr + cmsgAlignTo - 1) & ^(cmsgAlignTo - 1)
17+
alignedSizeofInet6Pktinfo = (unix.SizeofInet6Pktinfo + cmsgAlignTo - 1) & ^(cmsgAlignTo - 1)
18+
alignedSizeofSockaddrInet4 = (unix.SizeofSockaddrInet4 + cmsgAlignTo - 1) & ^(cmsgAlignTo - 1)
19+
alignedSizeofSockaddrInet6 = (unix.SizeofSockaddrInet6 + cmsgAlignTo - 1) & ^(cmsgAlignTo - 1)
1620

17-
func cmsgAlign(n int) int {
18-
return (n + unix.SizeofPtr - 1) & ^(unix.SizeofPtr - 1)
19-
}
21+
sizeofInet4Addr = 4 // sizeof(struct in_addr)
22+
)
2023

2124
func parseSocketControlMessage(cmsg []byte) (m SocketControlMessage, err error) {
2225
for len(cmsg) >= unix.SizeofCmsghdr {
@@ -30,38 +33,38 @@ func parseSocketControlMessage(cmsg []byte) (m SocketControlMessage, err error)
3033
case unix.IPPROTO_IP:
3134
switch cmsghdr.Type {
3235
case unix.IP_RECVDSTADDR:
33-
if len(cmsg) < unix.SizeofCmsghdr+sizeofInet4Addr {
36+
if len(cmsg) < alignedSizeofCmsghdr+sizeofInet4Addr {
3437
return m, fmt.Errorf("invalid IP_RECVDSTADDR control message length %d", cmsghdr.Len)
3538
}
36-
addr := [sizeofInet4Addr]byte(cmsg[unix.SizeofCmsghdr:])
39+
addr := [sizeofInet4Addr]byte(cmsg[alignedSizeofCmsghdr:])
3740
m.PktinfoAddr = netip.AddrFrom4(addr)
3841

3942
case unix.IP_ORIGDSTADDR:
40-
if len(cmsg) < unix.SizeofCmsghdr+unix.SizeofSockaddrInet4 {
43+
if len(cmsg) < alignedSizeofCmsghdr+unix.SizeofSockaddrInet4 {
4144
return m, fmt.Errorf("invalid IP_ORIGDSTADDR control message length %d", cmsghdr.Len)
4245
}
4346
var rsa4 unix.RawSockaddrInet4
44-
_ = copy(unsafe.Slice((*byte)(unsafe.Pointer(&rsa4)), unix.SizeofSockaddrInet4), cmsg[unix.SizeofCmsghdr:])
47+
_ = copy(unsafe.Slice((*byte)(unsafe.Pointer(&rsa4)), unix.SizeofSockaddrInet4), cmsg[alignedSizeofCmsghdr:])
4548
m.OriginalDestinationAddrPort = netip.AddrPortFrom(netip.AddrFrom4(rsa4.Addr), rsa4.Port)
4649
}
4750

4851
case unix.IPPROTO_IPV6:
4952
switch cmsghdr.Type {
5053
case unix.IPV6_PKTINFO:
51-
if len(cmsg) < unix.SizeofCmsghdr+unix.SizeofInet6Pktinfo {
54+
if len(cmsg) < alignedSizeofCmsghdr+unix.SizeofInet6Pktinfo {
5255
return m, fmt.Errorf("invalid IPV6_PKTINFO control message length %d", cmsghdr.Len)
5356
}
5457
var pktinfo unix.Inet6Pktinfo
55-
_ = copy(unsafe.Slice((*byte)(unsafe.Pointer(&pktinfo)), unix.SizeofInet6Pktinfo), cmsg[unix.SizeofCmsghdr:])
58+
_ = copy(unsafe.Slice((*byte)(unsafe.Pointer(&pktinfo)), unix.SizeofInet6Pktinfo), cmsg[alignedSizeofCmsghdr:])
5659
m.PktinfoAddr = netip.AddrFrom16(pktinfo.Addr)
5760
m.PktinfoIfindex = pktinfo.Ifindex
5861

5962
case unix.IPV6_ORIGDSTADDR:
60-
if len(cmsg) < unix.SizeofCmsghdr+unix.SizeofSockaddrInet6 {
63+
if len(cmsg) < alignedSizeofCmsghdr+unix.SizeofSockaddrInet6 {
6164
return m, fmt.Errorf("invalid IPV6_ORIGDSTADDR control message length %d", cmsghdr.Len)
6265
}
6366
var rsa6 unix.RawSockaddrInet6
64-
_ = copy(unsafe.Slice((*byte)(unsafe.Pointer(&rsa6)), unix.SizeofSockaddrInet6), cmsg[unix.SizeofCmsghdr:])
67+
_ = copy(unsafe.Slice((*byte)(unsafe.Pointer(&rsa6)), unix.SizeofSockaddrInet6), cmsg[alignedSizeofCmsghdr:])
6568
m.OriginalDestinationAddrPort = netip.AddrPortFrom(netip.AddrFrom16(rsa6.Addr), rsa6.Port)
6669
}
6770
}
@@ -72,43 +75,36 @@ func parseSocketControlMessage(cmsg []byte) (m SocketControlMessage, err error)
7275
return m, nil
7376
}
7477

75-
const (
76-
alignedSizeofInet4Addr = (sizeofInet4Addr + unix.SizeofPtr - 1) & ^(unix.SizeofPtr - 1)
77-
alignedSizeofInet6Pktinfo = (unix.SizeofInet6Pktinfo + unix.SizeofPtr - 1) & ^(unix.SizeofPtr - 1)
78-
alignedSizeofSockaddrInet4 = (unix.SizeofSockaddrInet4 + unix.SizeofPtr - 1) & ^(unix.SizeofPtr - 1)
79-
alignedSizeofSockaddrInet6 = (unix.SizeofSockaddrInet6 + unix.SizeofPtr - 1) & ^(unix.SizeofPtr - 1)
80-
)
81-
8278
func (m SocketControlMessage) appendTo(b []byte) []byte {
8379
switch {
8480
case m.PktinfoAddr.Is4():
8581
bLen := len(b)
86-
b = slices.Grow(b, unix.SizeofCmsghdr+alignedSizeofInet4Addr)[:bLen+unix.SizeofCmsghdr+alignedSizeofInet4Addr]
82+
b = slices.Grow(b, alignedSizeofCmsghdr+alignedSizeofInet4Addr)[:bLen+alignedSizeofCmsghdr+alignedSizeofInet4Addr]
8783
msgBuf := b[bLen:]
8884
cmsghdr := (*unix.Cmsghdr)(unsafe.Pointer(unsafe.SliceData(msgBuf)))
8985
*cmsghdr = unix.Cmsghdr{
90-
Len: unix.SizeofCmsghdr + sizeofInet4Addr,
86+
Len: alignedSizeofCmsghdr + sizeofInet4Addr,
9187
Level: unix.IPPROTO_IP,
9288
Type: unix.IP_SENDSRCADDR,
9389
}
9490
addr := m.PktinfoAddr.As4()
95-
_ = copy(msgBuf[unix.SizeofCmsghdr:], addr[:])
91+
_ = copy(msgBuf[alignedSizeofCmsghdr:], addr[:])
9692

9793
case m.PktinfoAddr.Is6():
9894
bLen := len(b)
99-
b = slices.Grow(b, unix.SizeofCmsghdr+alignedSizeofInet6Pktinfo)[:bLen+unix.SizeofCmsghdr+alignedSizeofInet6Pktinfo]
95+
b = slices.Grow(b, alignedSizeofCmsghdr+alignedSizeofInet6Pktinfo)[:bLen+alignedSizeofCmsghdr+alignedSizeofInet6Pktinfo]
10096
msgBuf := b[bLen:]
10197
cmsghdr := (*unix.Cmsghdr)(unsafe.Pointer(unsafe.SliceData(msgBuf)))
10298
*cmsghdr = unix.Cmsghdr{
103-
Len: unix.SizeofCmsghdr + unix.SizeofInet6Pktinfo,
99+
Len: alignedSizeofCmsghdr + unix.SizeofInet6Pktinfo,
104100
Level: unix.IPPROTO_IPV6,
105101
Type: unix.IPV6_PKTINFO,
106102
}
107103
pktinfo := unix.Inet6Pktinfo{
108104
Addr: m.PktinfoAddr.As16(),
109105
Ifindex: m.PktinfoIfindex,
110106
}
111-
_ = copy(msgBuf[unix.SizeofCmsghdr:], unsafe.Slice((*byte)(unsafe.Pointer(&pktinfo)), unix.SizeofInet6Pktinfo))
107+
_ = copy(msgBuf[alignedSizeofCmsghdr:], unsafe.Slice((*byte)(unsafe.Pointer(&pktinfo)), unix.SizeofInet6Pktinfo))
112108
}
113109

114110
return b

0 commit comments

Comments
 (0)