Skip to content

Commit e8ec4d0

Browse files
authored
fix: prevent data corruption in multiPacketListener by avoiding buffer resizing (#213)
* Add regression test that covers the issue. * Fix the test. * Use consistent comments.
1 parent 8ee3b79 commit e8ec4d0

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

service/listeners.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,10 +288,10 @@ func (m *multiPacketListener) Acquire() (net.PacketConn, error) {
288288
buffer := make([]byte, serverUDPBufferSize)
289289
for {
290290
n, addr, err := m.pc.ReadFrom(buffer)
291-
buffer = buffer[:n]
291+
pkt := buffer[:n]
292292
select {
293293
case req := <-m.readCh:
294-
n := copy(req.buffer, buffer)
294+
n := copy(req.buffer, pkt)
295295
req.respCh <- struct {
296296
n int
297297
addr net.Addr

service/listeners_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,33 @@ func TestListenerManagerPacketListenerCreatesListenerOnDemand(t *testing.T) {
142142
<-done
143143
}
144144

145+
func TestMultiPacketListener_SequentialReads(t *testing.T) {
146+
m := NewListenerManager()
147+
conn, err := m.ListenPacket("127.0.0.1:0")
148+
require.NoError(t, err)
149+
udpConn, err := net.Dial("udp", conn.LocalAddr().String())
150+
require.NoError(t, err)
151+
152+
// Send and receive the first packet.
153+
data1 := []byte("hello")
154+
_, err = udpConn.Write(data1)
155+
require.NoError(t, err)
156+
received1 := make([]byte, serverUDPBufferSize)
157+
n1, _, err := conn.ReadFrom(received1)
158+
require.NoError(t, err)
159+
160+
// Send and receive a second larger packet.
161+
data2 := []byte("a longer message than the first one")
162+
_, err = udpConn.Write(data2)
163+
require.NoError(t, err)
164+
received2 := make([]byte, serverUDPBufferSize)
165+
n2, _, err := conn.ReadFrom(received2)
166+
require.NoError(t, err)
167+
168+
require.Equal(t, string(data1), string(received1[:n1]))
169+
require.Equal(t, string(data2), string(received2[:n2]))
170+
}
171+
145172
func BenchmarkMultiStreamListener_Acquire(b *testing.B) {
146173
lm := NewListenerManager()
147174

0 commit comments

Comments
 (0)