Skip to content

Commit a980535

Browse files
committed
packets: Allow terminating packets of length 0
Fixes #514
1 parent 8f6c67f commit a980535

File tree

1 file changed

+26
-20
lines changed

1 file changed

+26
-20
lines changed

packets.go

+26-20
Original file line numberDiff line numberDiff line change
@@ -25,26 +25,20 @@ import (
2525

2626
// Read packet to buffer 'data'
2727
func (mc *mysqlConn) readPacket() ([]byte, error) {
28-
var payload []byte
28+
var prevData []byte
2929
for {
30-
// Read packet header
30+
// read packet header
3131
data, err := mc.buf.readNext(4)
3232
if err != nil {
3333
errLog.Print(err)
3434
mc.Close()
3535
return nil, driver.ErrBadConn
3636
}
3737

38-
// Packet Length [24 bit]
38+
// packet length [24 bit]
3939
pktLen := int(uint32(data[0]) | uint32(data[1])<<8 | uint32(data[2])<<16)
4040

41-
if pktLen < 1 {
42-
errLog.Print(ErrMalformPkt)
43-
mc.Close()
44-
return nil, driver.ErrBadConn
45-
}
46-
47-
// Check Packet Sync [8 bit]
41+
// check packet sync [8 bit]
4842
if data[3] != mc.sequence {
4943
if data[3] > mc.sequence {
5044
return nil, ErrPktSyncMul
@@ -53,26 +47,38 @@ func (mc *mysqlConn) readPacket() ([]byte, error) {
5347
}
5448
mc.sequence++
5549

56-
// Read packet body [pktLen bytes]
50+
// packets with length 0 terminate a previous packet which is a
51+
// multiple of (2^24)−1 bytes long
52+
if pktLen == 0 {
53+
// there was no previous packet
54+
if prevData == nil {
55+
errLog.Print(ErrMalformPkt)
56+
mc.Close()
57+
return nil, driver.ErrBadConn
58+
}
59+
60+
return prevData, nil
61+
}
62+
63+
// read packet body [pktLen bytes]
5764
data, err = mc.buf.readNext(pktLen)
5865
if err != nil {
5966
errLog.Print(err)
6067
mc.Close()
6168
return nil, driver.ErrBadConn
6269
}
6370

64-
isLastPacket := (pktLen < maxPacketSize)
71+
// return data if this was the last packet
72+
if pktLen < maxPacketSize {
73+
// zero allocations for non-split packets
74+
if prevData == nil {
75+
return data, nil
76+
}
6577

66-
// Zero allocations for non-splitting packets
67-
if isLastPacket && payload == nil {
68-
return data, nil
78+
return append(prevData, data...), nil
6979
}
7080

71-
payload = append(payload, data...)
72-
73-
if isLastPacket {
74-
return payload, nil
75-
}
81+
prevData = append(prevData, data...)
7682
}
7783
}
7884

0 commit comments

Comments
 (0)