@@ -25,26 +25,20 @@ import (
25
25
26
26
// Read packet to buffer 'data'
27
27
func (mc * mysqlConn ) readPacket () ([]byte , error ) {
28
- var payload []byte
28
+ var prevData []byte
29
29
for {
30
- // Read packet header
30
+ // read packet header
31
31
data , err := mc .buf .readNext (4 )
32
32
if err != nil {
33
33
errLog .Print (err )
34
34
mc .Close ()
35
35
return nil , driver .ErrBadConn
36
36
}
37
37
38
- // Packet Length [24 bit]
38
+ // packet length [24 bit]
39
39
pktLen := int (uint32 (data [0 ]) | uint32 (data [1 ])<< 8 | uint32 (data [2 ])<< 16 )
40
40
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]
48
42
if data [3 ] != mc .sequence {
49
43
if data [3 ] > mc .sequence {
50
44
return nil , ErrPktSyncMul
@@ -53,26 +47,38 @@ func (mc *mysqlConn) readPacket() ([]byte, error) {
53
47
}
54
48
mc .sequence ++
55
49
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]
57
64
data , err = mc .buf .readNext (pktLen )
58
65
if err != nil {
59
66
errLog .Print (err )
60
67
mc .Close ()
61
68
return nil , driver .ErrBadConn
62
69
}
63
70
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
+ }
65
77
66
- // Zero allocations for non-splitting packets
67
- if isLastPacket && payload == nil {
68
- return data , nil
78
+ return append (prevData , data ... ), nil
69
79
}
70
80
71
- payload = append (payload , data ... )
72
-
73
- if isLastPacket {
74
- return payload , nil
75
- }
81
+ prevData = append (prevData , data ... )
76
82
}
77
83
}
78
84
0 commit comments