@@ -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){
6263pktLen := getUint24 (data [:3 ])
6364seq := 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.
7772if len (prevData ) > 0 {
7873mc .close ()
7974return nil , ErrPktSyncMul
8075 }
8176invalidSequence = 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
148143if 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
152147n , err := writeFunc (data [:4 + size ])
@@ -450,7 +445,9 @@ func (mc *mysqlConn) writeCommandPacket(command byte) error{
450445data [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{
491488binary .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{
10181017pktLen = dataOffset + argLen
10191018 }
10201019
1021- stmt .mc .resetSequence ()
10221020// Add command byte [1 byte]
10231021data [4 ] = comStmtSendLongData
10241022
@@ -1030,15 +1028,15 @@ func (stmt *mysqlStmt) writeCommandLongData(paramID int, arg []byte) error{
10301028
10311029// Send CMD packet
10321030err := stmt .mc .writePacket (data [:4 + pktLen ])
1031+ // Every COM_LONG_DATA packet reset Packet Sequence
1032+ stmt .mc .resetSequence ()
10331033if err == nil {
10341034data = data [pktLen - dataOffset :]
10351035continue
10361036 }
10371037return err
10381038 }
10391039
1040- // Reset Packet Sequence
1041- stmt .mc .resetSequence ()
10421040return nil
10431041}
10441042
0 commit comments