Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit bf7afb7

Browse files
authored
fix PING on compressed connections (#1721)
Add missing mc.syncSequence() Fix #1718
1 parent af56fba commit bf7afb7

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)

AltStyle によって変換されたページ (->オリジナル) /