mirror of
https://github.com/golang/net.git
synced 2026-03-31 18:37:08 +09:00
internal/socket: properly reset Iov and Control on the msghdr
A sync.Pool is used to reduce allocations of the msghdr struct. When using a struct obtained from the pool, the fields need to be cleared. Fixes golang/go#54693. Change-Id: Ie693979abf3aa6bc3c834b9558c5029b376326e6 Reviewed-on: https://go-review.googlesource.com/c/net/+/425915 Run-TryBot: Ian Lance Taylor <iant@google.com> Reviewed-by: Ian Lance Taylor <iant@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Damien Neil <dneil@google.com> Auto-Submit: Ian Lance Taylor <iant@google.com>
This commit is contained in:
committed by
Gopher Robot
parent
8be639271d
commit
02166a9802
@@ -172,7 +172,23 @@ type mmsgTmpsPool struct {
|
||||
}
|
||||
|
||||
func (p *mmsgTmpsPool) Get() *mmsgTmps {
|
||||
return p.p.Get().(*mmsgTmps)
|
||||
m := p.p.Get().(*mmsgTmps)
|
||||
// Clear fields up to the len (not the cap) of the slice,
|
||||
// assuming that the previous caller only used that many elements.
|
||||
for i := range m.packer.sockaddrs {
|
||||
m.packer.sockaddrs[i] = 0
|
||||
}
|
||||
m.packer.sockaddrs = m.packer.sockaddrs[:0]
|
||||
for i := range m.packer.vs {
|
||||
m.packer.vs[i] = iovec{}
|
||||
}
|
||||
m.packer.vs = m.packer.vs[:0]
|
||||
for i := range m.packer.hs {
|
||||
m.packer.hs[i].Len = 0
|
||||
m.packer.hs[i].Hdr = msghdr{}
|
||||
}
|
||||
m.packer.hs = m.packer.hs[:0]
|
||||
return m
|
||||
}
|
||||
|
||||
func (p *mmsgTmpsPool) Put(tmps *mmsgTmps) {
|
||||
|
||||
@@ -17,9 +17,6 @@ func (h *msghdr) pack(vs []iovec, bs [][]byte, oob []byte, sa []byte) {
|
||||
if sa != nil {
|
||||
h.Name = (*byte)(unsafe.Pointer(&sa[0]))
|
||||
h.Namelen = uint32(len(sa))
|
||||
} else {
|
||||
h.Name = nil
|
||||
h.Namelen = 0
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user