@@ -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 ])
@@ -445,7 +440,9 @@ func (mc *mysqlConn) writeCommandPacket(command byte) error {
445
440
data [4 ] = command
446
441
447
442
// Send CMD packet
448
- return mc .writePacket (data )
443
+ err = mc .writePacket (data )
444
+ mc .syncSequence ()
445
+ return err
449
446
}
450
447
451
448
func (mc * mysqlConn ) writeCommandPacketStr (command byte , arg string ) error {
@@ -486,7 +483,9 @@ func (mc *mysqlConn) writeCommandPacketUint32(command byte, arg uint32) error {
486
483
binary .LittleEndian .PutUint32 (data [5 :], arg )
487
484
488
485
// Send CMD packet
489
- return mc .writePacket (data )
486
+ err = mc .writePacket (data )
487
+ mc .syncSequence ()
488
+ return err
490
489
}
491
490
492
491
/******************************************************************************
@@ -956,7 +955,6 @@ func (stmt *mysqlStmt) writeCommandLongData(paramID int, arg []byte) error {
956
955
pktLen = dataOffset + argLen
957
956
}
958
957
959
- stmt .mc .resetSequence ()
960
958
// Add command byte [1 byte]
961
959
data [4 ] = comStmtSendLongData
962
960
@@ -968,15 +966,15 @@ func (stmt *mysqlStmt) writeCommandLongData(paramID int, arg []byte) error {
968
966
969
967
// Send CMD packet
970
968
err := stmt .mc .writePacket (data [:4 + pktLen ])
969
+ // Every COM_LONG_DATA packet reset Packet Sequence
970
+ stmt .mc .resetSequence ()
971
971
if err == nil {
972
972
data = data [pktLen - dataOffset :]
973
973
continue
974
974
}
975
975
return err
976
976
}
977
977
978
- // Reset Packet Sequence
979
- stmt .mc .resetSequence ()
980
978
return nil
981
979
}
982
980
0 commit comments