]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
conn: use CmsgSpace() for ancillary data buf sizing
authorJordan Whited <jordan@tailscale.com>
Wed, 15 Mar 2023 03:02:24 +0000 (20:02 -0700)
committerJason A. Donenfeld <Jason@zx2c4.com>
Thu, 16 Mar 2023 16:45:41 +0000 (17:45 +0100)
CmsgLen() does not account for data alignment.

Reviewed-by: Adrian Dewhurst <adrian@tailscale.com>
Signed-off-by: Jordan Whited <jordan@tailscale.com>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
conn/sticky_linux.go

index bf1783912a002bee553a5a176e1733b64105a6c3..342e7396d25d0fd4732b7b0b71aad7209b8bc377 100644 (file)
@@ -63,8 +63,9 @@ func pktInfoFromBuf[T unix.Inet4Pktinfo | unix.Inet6Pktinfo](buf []byte) (t T) {
        return t
 }
 
-// setSrcControl parses the control for PKTINFO and if found updates ep with
-// the source information found.
+// setSrcControl sets an IP{V6}_PKTINFO in control based on the source address
+// and source ifindex found in ep. control's len will be set to 0 in the event
+// that ep is a default value.
 func setSrcControl(control *[]byte, ep *StdNetEndpoint) {
        *control = (*control)[:cap(*control)]
        if len(*control) < int(unsafe.Sizeof(unix.Cmsghdr{})) {
@@ -93,19 +94,20 @@ func setSrcControl(control *[]byte, ep *StdNetEndpoint) {
                if ep.SrcIP().IsValid() {
                        info.Spec_dst = ep.SrcIP().As4()
                }
+               *control = (*control)[:unix.CmsgSpace(unix.SizeofInet4Pktinfo)]
        } else {
                hdr.Level = unix.IPPROTO_IPV6
                hdr.Type = unix.IPV6_PKTINFO
-               hdr.Len = unix.SizeofCmsghdr + unix.SizeofInet6Pktinfo
+               hdr.SetLen(unix.CmsgLen(unix.SizeofInet6Pktinfo))
 
                info := (*unix.Inet6Pktinfo)(unsafe.Pointer(&(*control)[unix.SizeofCmsghdr]))
                info.Ifindex = uint32(ep.src.ifidx)
                if ep.SrcIP().IsValid() {
                        info.Addr = ep.SrcIP().As16()
                }
+               *control = (*control)[:unix.CmsgSpace(unix.SizeofInet6Pktinfo)]
        }
 
-       *control = (*control)[:hdr.Len]
 }
 
-var srcControlSize = unix.CmsgLen(unix.SizeofInet6Pktinfo)
+var srcControlSize = unix.CmsgSpace(unix.SizeofInet6Pktinfo)