From 552be0335ba2d8a70595520e5ea97ee256a3261f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Fri, 21 Feb 2025 21:44:39 +0900 Subject: [PATCH] fix(recv): panic on short data len --- gold/link/listen.go | 6 ++++++ gold/link/recv.go | 11 +++++++++++ gold/p2p/tcp/pdu.go | 3 +++ gold/p2p/tcp/tcp.go | 5 ++++- 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/gold/link/listen.go b/gold/link/listen.go index 3008f37..7b4f21e 100644 --- a/gold/link/listen.go +++ b/gold/link/listen.go @@ -130,6 +130,12 @@ func (m *Me) listen() (conn p2p.Conn, err error) { } continue } + if n <= 0 { + if config.ShowDebugLog { + logrus.Debugln("[listen] unexpected read n =", n) + } + continue + } lq := lstnq{ index: -1, addr: addr, diff --git a/gold/link/recv.go b/gold/link/recv.go index fd42525..fedacbb 100644 --- a/gold/link/recv.go +++ b/gold/link/recv.go @@ -32,8 +32,19 @@ func (m *Me) wait(data []byte) *head.Packet { } if m.base14 { data = base14.Decode(data) + if len(data) < bound { + bound = len(data) + endl = "." + } + if config.ShowDebugLog { + logrus.Debugln("[recv] data b14ed", hex.EncodeToString(data[:bound]), endl) + } } seq, data := m.xordec(data) + if len(data) < bound { + bound = len(data) + endl = "." + } if config.ShowDebugLog { logrus.Debugln("[recv] data xored", hex.EncodeToString(data[:bound]), endl) } diff --git a/gold/p2p/tcp/pdu.go b/gold/p2p/tcp/pdu.go index c2ecdac..61b0450 100644 --- a/gold/p2p/tcp/pdu.go +++ b/gold/p2p/tcp/pdu.go @@ -63,6 +63,9 @@ func (p *packet) ReadFrom(r io.Reader) (n int64, err error) { } if binary.LittleEndian.Uint32(buf[:]) != magic { err = ErrInvalidMagic + if config.ShowDebugLog { + logrus.Debugf("[tcp] expect magic %08x but got %08x", magic, binary.LittleEndian.Uint32(buf[:])) + } return } cnt, err = io.ReadFull(r, buf[:3]) diff --git a/gold/p2p/tcp/tcp.go b/gold/p2p/tcp/tcp.go index 8a0ba47..5900d8c 100644 --- a/gold/p2p/tcp/tcp.go +++ b/gold/p2p/tcp/tcp.go @@ -258,7 +258,10 @@ func (conn *Conn) receive(tcpconn *net.TCPConn, hasvalidated bool) { if config.ShowDebugLog { logrus.Debugln("[tcp] recv from", ep, "err:", err) } - if errors.Is(err, net.ErrClosed) || errors.Is(err, io.ErrClosedPipe) || errors.Is(err, io.EOF) { + if errors.Is(err, net.ErrClosed) || + errors.Is(err, io.ErrClosedPipe) || + errors.Is(err, io.EOF) || + errors.Is(err, ErrInvalidMagic) { _ = tcpconn.CloseRead() return }