Skip to content

Commit 22cee6a

Browse files
committed
fix PING on compressed connections
1 parent af56fba commit 22cee6a

File tree

2 files changed

+19
-22
lines changed

2 files changed

+19
-22
lines changed

compress.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,12 +113,11 @@ func (c *compIO) readCompressedPacket() error {
113113
// Server may return error packet (e.g. 1153 Got a packet bigger than 'max_allowed_packet' bytes)
114114
// before receiving all packets from client. In this case, seqnr is younger than expected.
115115
// NOTE: Both of mariadbclient and mysqlclient do not check seqnr. Only server checks it.
116-
if debug && compressionSequence != c.mc.sequence {
116+
if debug && compressionSequence != c.mc.compressSequence {
117117
fmt.Printf("WARN: unexpected cmpress seq nr: expected %v, got %v",
118-
c.mc.sequence, compressionSequence)
118+
c.mc.compressSequence, compressionSequence)
119119
}
120-
c.mc.sequence = compressionSequence + 1
121-
c.mc.compressSequence = c.mc.sequence
120+
c.mc.compressSequence = compressionSequence + 1
122121

123122
comprData, err := c.mc.readNext(comprLength)
124123
if err != nil {
@@ -200,7 +199,7 @@ func (c *compIO) writeCompressedPacket(data []byte, uncompressedLen int) (int, e
200199
comprLength := len(data) - 7
201200
if debug {
202201
fmt.Printf(
203-
"writeCompressedPacket: comprLength=%v, uncompressedLen=%v, seq=%v",
202+
"writeCompressedPacket: comprLength=%v, uncompressedLen=%v, seq=%v\n",
204203
comprLength, uncompressedLen, mc.compressSequence)
205204
}
206205

packets.go

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

456453
func (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

Comments
 (0)