@@ -17,6 +17,7 @@ import (
1717 "fmt"
1818 "io"
1919 "math"
20+ "os"
2021 "strconv"
2122 "time"
2223)
@@ -62,26 +63,20 @@ func (mc *mysqlConn) readPacket() ([]byte, error) {
6263 pktLen := getUint24 (data [:3 ])
6364 seq := data [3 ]
6465
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 ))
6669 // 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 {
7671 // For large packets, we stop reading as soon as sync error.
7772 if len (prevData ) > 0 {
7873 mc .close ()
7974 return nil , ErrPktSyncMul
8075 }
8176 invalidSequence = true
8277 }
83- mc .sequence ++
8478 }
79+ mc .sequence = seq + 1
8580
8681 // packets with length 0 terminate a previous packet which is a
8782 // multiple of (2^24)-1 bytes long
@@ -146,7 +141,7 @@ func (mc *mysqlConn) writePacket(data []byte) error {
146141
147142 // Write packet
148143 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 )
150145 }
151146
152147 n , err := writeFunc (data [:4 + size ])
@@ -450,7 +445,9 @@ func (mc *mysqlConn) writeCommandPacket(command byte) error {
450445 data [4 ] = command
451446
452447 // Send CMD packet
453- return mc .writePacket (data )
448+ err = mc .writePacket (data )
449+ mc .syncSequence ()
450+ return err
454451}
455452
456453func (mc * mysqlConn ) writeCommandPacketStr (command byte , arg string ) error {
@@ -491,7 +488,9 @@ func (mc *mysqlConn) writeCommandPacketUint32(command byte, arg uint32) error {
491488 binary .LittleEndian .PutUint32 (data [5 :], arg )
492489
493490 // Send CMD packet
494- return mc .writePacket (data )
491+ err = mc .writePacket (data )
492+ mc .syncSequence ()
493+ return err
495494}
496495
497496/******************************************************************************
@@ -1018,7 +1017,6 @@ func (stmt *mysqlStmt) writeCommandLongData(paramID int, arg []byte) error {
10181017 pktLen = dataOffset + argLen
10191018 }
10201019
1021- stmt .mc .resetSequence ()
10221020 // Add command byte [1 byte]
10231021 data [4 ] = comStmtSendLongData
10241022
@@ -1030,15 +1028,15 @@ func (stmt *mysqlStmt) writeCommandLongData(paramID int, arg []byte) error {
10301028
10311029 // Send CMD packet
10321030 err := stmt .mc .writePacket (data [:4 + pktLen ])
1031+ // Every COM_LONG_DATA packet reset Packet Sequence
1032+ stmt .mc .resetSequence ()
10331033 if err == nil {
10341034 data = data [pktLen - dataOffset :]
10351035 continue
10361036 }
10371037 return err
10381038 }
10391039
1040- // Reset Packet Sequence
1041- stmt .mc .resetSequence ()
10421040 return nil
10431041}
10441042
0 commit comments