Skip to content

Commit 4196928

Browse files
authored
Handle truncated start login frame (#400)
1 parent 4ba55a9 commit 4196928

File tree

3 files changed

+24
-13
lines changed

3 files changed

+24
-13
lines changed

mcproto/decode.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,12 @@ func DecodeLoginStart(data interface{}) (*LoginStart, error) {
5555

5656
loginStart.Name, err = ReadString(buffer)
5757
if err != nil {
58-
return nil, errors.Wrap(err, "failed to read username")
58+
return loginStart, errors.Wrap(err, "failed to read username")
5959
}
6060

6161
loginStart.PlayerUuid, err = ReadUuid(buffer)
6262
if err != nil {
63-
return nil, errors.Wrap(err, "failed to read player uuid")
63+
return loginStart, errors.Wrap(err, "failed to read player uuid")
6464
}
6565

6666
return loginStart, nil

mcproto/read.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
// Package mcproto provides functions to read types and decode frames declared
2+
// at https://minecraft.wiki/w/Java_Edition_protocol
13
package mcproto
24

35
import (
@@ -27,7 +29,7 @@ const MaxFrameLength = 2097151
2729
func ReadPacket(reader *bufio.Reader, addr net.Addr, state State) (*Packet, error) {
2830
logrus.
2931
WithField("client", addr).
30-
Debug("Reading packet")
32+
Trace("Reading packet")
3133

3234
if state == StateHandshaking {
3335
data, err := reader.Peek(1)
@@ -158,7 +160,7 @@ func ReadUTF16BEString(reader io.Reader, symbolLen uint16) (string, error) {
158160
func ReadFrame(reader io.Reader, addr net.Addr) (*Frame, error) {
159161
logrus.
160162
WithField("client", addr).
161-
Debug("Reading frame")
163+
Trace("Reading frame")
162164

163165
var err error
164166
frame := &Frame{}

server/connector.go

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"bufio"
55
"bytes"
66
"context"
7+
"errors"
78
"fmt"
89
"github.com/google/uuid"
910
"io"
@@ -227,7 +228,7 @@ func (c *Connector) HandleConnection(ctx context.Context, frontendConn net.Conn)
227228

228229
logrus.
229230
WithField("client", clientAddr).
230-
Info("Got connection")
231+
Debug("Got connection")
231232
defer logrus.WithField("client", clientAddr).Debug("Closing frontend connection")
232233

233234
// Tee-off the inspected content to a buffer so that we can retransmit it to the backend connection
@@ -273,14 +274,22 @@ func (c *Connector) HandleConnection(ctx context.Context, frontendConn net.Conn)
273274

274275
var playerInfo *PlayerInfo = nil
275276
if handshake.NextState == mcproto.StateLogin {
276-
playerInfo, err = c.readUserInfo(bufferedReader, clientAddr, handshake.NextState)
277+
playerInfo, err = c.readPlayerInfo(bufferedReader, clientAddr, handshake.NextState)
277278
if err != nil {
278-
logrus.
279-
WithError(err).
280-
WithField("clientAddr", clientAddr).
281-
Error("Failed to read user info")
282-
c.metrics.Errors.With("type", "read").Add(1)
283-
return
279+
if errors.Is(err, io.EOF) {
280+
logrus.
281+
WithError(err).
282+
WithField("clientAddr", clientAddr).
283+
WithField("player", playerInfo).
284+
Warn("Truncated buffer while reading player info")
285+
} else {
286+
logrus.
287+
WithError(err).
288+
WithField("clientAddr", clientAddr).
289+
Error("Failed to read user info")
290+
c.metrics.Errors.With("type", "read").Add(1)
291+
return
292+
}
284293
}
285294
logrus.
286295
WithField("client", clientAddr).
@@ -319,7 +328,7 @@ func (c *Connector) HandleConnection(ctx context.Context, frontendConn net.Conn)
319328
}
320329
}
321330

322-
func (c *Connector) readUserInfo(bufferedReader *bufio.Reader, clientAddr net.Addr, state mcproto.State) (*PlayerInfo, error) {
331+
func (c *Connector) readPlayerInfo(bufferedReader *bufio.Reader, clientAddr net.Addr, state mcproto.State) (*PlayerInfo, error) {
323332
loginPacket, err := mcproto.ReadPacket(bufferedReader, clientAddr, state)
324333
if err != nil {
325334
return nil, fmt.Errorf("failed to read login packet: %w", err)

0 commit comments

Comments
 (0)