Skip to content

Commit 7468b85

Browse files
Merge pull request #3 from imsodin/fix-nil-deref
Lock while iterating conns
2 parents c55ef61 + 6aea870 commit 7468b85

File tree

1 file changed

+22
-17
lines changed

1 file changed

+22
-17
lines changed

filter.go

+22-17
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@ func (d *PacketFilter) Start() {
9393

9494
func (d *PacketFilter) loop() {
9595
var buf []byte
96-
next:
9796
for {
9897
buf = bufPool.Get().([]byte)
9998
n, addr, err := d.conn.ReadFrom(buf)
@@ -104,33 +103,39 @@ next:
104103
buf: buf[:n],
105104
}
106105

107-
d.mut.Lock()
108-
conns := d.conns
109-
d.mut.Unlock()
110-
111106
if err != nil {
112-
for _, conn := range conns {
107+
d.mut.Lock()
108+
for _, conn := range d.conns {
113109
select {
114110
case conn.recvBuffer <- pkt:
115111
default:
116112
atomic.AddUint64(&d.overflow, 1)
117113
}
118114
}
115+
d.mut.Unlock()
119116
return
120117
}
121118

122-
for _, conn := range conns {
123-
if conn.filter == nil || conn.filter.ClaimIncoming(pkt.buf, pkt.addr) {
124-
select {
125-
case conn.recvBuffer <- pkt:
126-
default:
127-
bufPool.Put(pkt.buf[:maxPacketSize])
128-
atomic.AddUint64(&d.overflow, 1)
129-
}
130-
goto next
131-
}
119+
d.mut.Lock()
120+
sent := d.sendPacketLocked(pkt)
121+
d.mut.Unlock()
122+
if !sent {
123+
atomic.AddUint64(&d.dropped, 1)
132124
}
133125
bufPool.Put(pkt.buf[:maxPacketSize])
134-
atomic.AddUint64(&d.dropped, 1)
135126
}
136127
}
128+
129+
func (d *PacketFilter) sendPacketLocked(pkt packet) bool {
130+
for _, conn := range d.conns {
131+
if conn.filter == nil || conn.filter.ClaimIncoming(pkt.buf, pkt.addr) {
132+
select {
133+
case conn.recvBuffer <- pkt:
134+
default:
135+
atomic.AddUint64(&d.overflow, 1)
136+
}
137+
return true
138+
}
139+
}
140+
return false
141+
}

0 commit comments

Comments
 (0)