From 2ed35ac44d08fb50259b1e2a97da23b2be02c6c0 Mon Sep 17 00:00:00 2001 From: xtaci Date: Thu, 7 Nov 2019 13:30:11 +0800 Subject: [PATCH] fix race and parityshard leaks --- fec.go | 2 +- sess.go | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/fec.go b/fec.go index ff81a7e2..97cd40b7 100644 --- a/fec.go +++ b/fec.go @@ -156,7 +156,7 @@ func (dec *fecDecoder) decode(in fecPacket) (recovered [][]byte) { dlen := len(shards[k]) shards[k] = shards[k][:maxlen] copy(shards[k][dlen:], dec.zeros) - } else { + } else if k < dec.dataShards { shards[k] = xmitBuf.Get().([]byte)[:0] } } diff --git a/sess.go b/sess.go index 07a5e600..13a1a5c4 100644 --- a/sess.go +++ b/sess.go @@ -663,9 +663,10 @@ func (s *UDPSession) kcpInput(data []byte) { if f.flag() == typeParity { fecParityShards++ } - recovers := s.fecDecoder.decode(f) + // lock s.mu.Lock() + recovers := s.fecDecoder.decode(f) if f.flag() == typeData { if ret := s.kcp.Input(data[fecHeaderSizePlus2:], true, s.ackNoDelay); ret != 0 { kcpInErrors++