@@ -17,6 +17,7 @@ import (
17
17
"fmt"
18
18
"io"
19
19
"math"
20
+ "os"
20
21
"strconv"
21
22
"time"
22
23
)
@@ -62,26 +63,20 @@ func (mc *mysqlConn) readPacket() ([]byte, error) {
62
63
pktLen := getUint24 (data [:3 ])
63
64
seq := data [3 ]
64
65
65
- if mc .compress {
66
+ // check packet sync [8 bit]
67
+ if seq != mc .sequence {
68
+ mc .log (fmt .Sprintf ("[warn] unexpected sequence nr: expected %v, got %v" , mc .sequence , seq ))
66
69
// MySQL and MariaDB doesn't check packet nr in compressed packet.
67
- if debug && seq != mc .compressSequence {
68
- fmt .Printf ("[debug] mismatched compression sequence nr: expected: %v, got %v" ,
69
- mc .compressSequence , seq )
70
- }
71
- mc .compressSequence = seq + 1
72
- } else {
73
- // check packet sync [8 bit]
74
- if seq != mc .sequence {
75
- mc .log (fmt .Sprintf ("[warn] unexpected seq nr: expected %v, got %v" , mc .sequence , seq ))
70
+ if ! mc .compress {
76
71
// For large packets, we stop reading as soon as sync error.
77
72
if len (prevData ) > 0 {
78
73
mc .close ()
79
74
return nil , ErrPktSyncMul
80
75
}
81
76
invalidSequence = true
82
77
}
83
- mc .sequence ++
84
78
}
79
+ mc .sequence = seq + 1
85
80
86
81
// packets with length 0 terminate a previous packet which is a
87
82
// multiple of (2^24)-1 bytes long
@@ -146,7 +141,7 @@ func (mc *mysqlConn) writePacket(data []byte) error {
146
141
147
142
// Write packet
148
143
if debug {
149
- fmt .Printf ( "writePacket: size=%v seq=%v" , size , mc .sequence )
144
+ fmt .Fprintf ( os . Stderr , "writePacket: size=%v seq=%v\n " , size , mc .sequence )
150
145
}
151
146
152
147
n , err := writeFunc (data [:4 + size ])
@@ -450,7 +445,9 @@ func (mc *mysqlConn) writeCommandPacket(command byte) error {
450
445
data [4 ] = command
451
446
452
447
// Send CMD packet
453
- return mc .writePacket (data )
448
+ err = mc .writePacket (data )
449
+ mc .syncSequence ()
450
+ return err
454
451
}
455
452
456
453
func (mc * mysqlConn ) writeCommandPacketStr (command byte , arg string ) error {
@@ -491,7 +488,9 @@ func (mc *mysqlConn) writeCommandPacketUint32(command byte, arg uint32) error {
491
488
binary .LittleEndian .PutUint32 (data [5 :], arg )
492
489
493
490
// Send CMD packet
494
- return mc .writePacket (data )
491
+ err = mc .writePacket (data )
492
+ mc .syncSequence ()
493
+ return err
495
494
}
496
495
497
496
/******************************************************************************
@@ -1018,7 +1017,6 @@ func (stmt *mysqlStmt) writeCommandLongData(paramID int, arg []byte) error {
1018
1017
pktLen = dataOffset + argLen
1019
1018
}
1020
1019
1021
- stmt .mc .resetSequence ()
1022
1020
// Add command byte [1 byte]
1023
1021
data [4 ] = comStmtSendLongData
1024
1022
@@ -1030,15 +1028,15 @@ func (stmt *mysqlStmt) writeCommandLongData(paramID int, arg []byte) error {
1030
1028
1031
1029
// Send CMD packet
1032
1030
err := stmt .mc .writePacket (data [:4 + pktLen ])
1031
+ // Every COM_LONG_DATA packet reset Packet Sequence
1032
+ stmt .mc .resetSequence ()
1033
1033
if err == nil {
1034
1034
data = data [pktLen - dataOffset :]
1035
1035
continue
1036
1036
}
1037
1037
return err
1038
1038
}
1039
1039
1040
- // Reset Packet Sequence
1041
- stmt .mc .resetSequence ()
1042
1040
return nil
1043
1041
}
1044
1042
0 commit comments