From fff53afca779078061128a5a10c31e67a7919d35 Mon Sep 17 00:00:00 2001 From: Jordan Whited Date: Tue, 14 Mar 2023 20:02:24 -0700 Subject: conn: use CmsgSpace() for ancillary data buf sizing CmsgLen() does not account for data alignment. Reviewed-by: Adrian Dewhurst Signed-off-by: Jordan Whited Signed-off-by: Jason A. Donenfeld --- conn/sticky_linux.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/conn/sticky_linux.go b/conn/sticky_linux.go index bf17839..342e739 100644 --- a/conn/sticky_linux.go +++ b/conn/sticky_linux.go @@ -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) -- cgit v1.2.3-54-g00ecf