Fix missing memory pool buffer returns. Fixes #1045

This commit is contained in:
Paul Lorenz
2022-06-08 10:29:18 -04:00
parent 0931f92d20
commit 596f67b718
4 changed files with 15 additions and 5 deletions
+3
View File
@@ -310,16 +310,19 @@ func (event *udpReadEvent) Handle(manager udp_vconn.Manager) error {
log := pfxlog.Logger()
origDest, err := getOriginalDest(event.oob)
if err != nil {
event.buf.Release()
return fmt.Errorf("error while getting original destination packet: %v", err)
}
log.Infof("received datagram from %v (original dest %v). Creating udp listen socket on original dest", event.srcAddr, origDest)
packetConn, err := listenConfig.ListenPacket(context.Background(), "udp", origDest.String())
if err != nil {
event.buf.Release()
return err
}
writeConn := packetConn.(*net.UDPConn)
writeQueue, err = manager.CreateWriteQueue(origDest, event.srcAddr, event.interceptor.service, writeConn)
if err != nil {
event.buf.Release()
return err
}
}
+1 -1
View File
@@ -77,7 +77,7 @@ func (u UnpooledBuffer) Release() {
func NewManager(provider tunnel.FabricProvider, newConnPolicy NewConnPolicy, expirationPolicy ConnExpirationPolicy) Manager {
manager := &manager{
eventC: make(chan Event),
eventC: make(chan Event, 4),
provider: provider,
connMap: make(map[string]*udpConn),
newConnPolicy: newConnPolicy,
+10 -3
View File
@@ -75,14 +75,17 @@ func (conn *udpConn) WriteTo(w io.Writer) (n int64, err error) {
var bytesWritten int64
for {
var buf mempool.PooledBuffer
var ok bool
select {
case buf, ok = <-conn.readC:
case buf = <-conn.readC:
case <-conn.closeNotify:
select {
case buf = <-conn.readC:
default:
}
}
if !ok {
if buf == nil {
return bytesWritten, io.EOF
}
@@ -123,6 +126,10 @@ func (conn *udpConn) Read(b []byte) (n int, err error) {
select {
case buf = <-conn.readC:
case <-conn.closeNotify:
select {
case buf = <-conn.readC:
default:
}
}
if buf == nil {
+1 -1
View File
@@ -89,7 +89,7 @@ func (manager *manager) CreateWriteQueue(targetAddr *net.UDPAddr, srcAddr net.Ad
return nil, errors.New("max connections exceeded")
}
conn := &udpConn{
readC: make(chan mempool.PooledBuffer),
readC: make(chan mempool.PooledBuffer, 4),
closeNotify: make(chan struct{}),
service: service.Name,
srcAddr: srcAddr,