Skip to content

Commit ea1c565

Browse files
dvilaverdedvilaverde
and
dvilaverde
authored
fix 'invalid compressed sequence' error, issue #871 (#872)
Co-authored-by: dvilaverde <dvilaverde@adobe.com>
1 parent 8d4de0f commit ea1c565

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

client/client_test.go

+11
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,17 @@ func (s *clientTestSuite) TestConn_Ping() {
8989
require.NoError(s.T(), err)
9090
}
9191

92+
func (s *clientTestSuite) TestConn_Compress() {
93+
addr := fmt.Sprintf("%s:%s", *test_util.MysqlHost, s.port)
94+
conn, err := Connect(addr, *testUser, *testPassword, "", func(conn *Conn) {
95+
conn.SetCapability(mysql.CLIENT_COMPRESS)
96+
})
97+
require.NoError(s.T(), err)
98+
99+
_, err = conn.Execute("SELECT VERSION()")
100+
require.NoError(s.T(), err)
101+
}
102+
92103
func (s *clientTestSuite) TestConn_SetCapability() {
93104
caps := []uint32{
94105
mysql.CLIENT_LONG_PASSWORD,

packet/conn.go

+11-1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ type Conn struct {
6767
compressedHeader [7]byte
6868

6969
compressedReader io.Reader
70+
71+
compressedReaderActive bool
7072
}
7173

7274
func NewConn(conn net.Conn) *Conn {
@@ -106,12 +108,19 @@ func (c *Conn) ReadPacketReuseMem(dst []byte) ([]byte, error) {
106108
}()
107109

108110
if c.Compression != MYSQL_COMPRESS_NONE {
109-
if c.compressedReader == nil {
111+
// it's possible that we're using compression but the server response with a compressed
112+
// packet with uncompressed length of 0. In this case we leave compressedReader nil. The
113+
// compressedReaderActive flag is important to track the state of the reader, allowing
114+
// for the compressedReader to be reset after a packet write. Without this flag, when a
115+
// compressed packet with uncompressed length of 0 is read, the compressedReader would
116+
// be nil, and we'd incorrectly attempt to read the next packet as compressed.
117+
if !c.compressedReaderActive {
110118
var err error
111119
c.compressedReader, err = c.newCompressedPacketReader()
112120
if err != nil {
113121
return nil, err
114122
}
123+
c.compressedReaderActive = true
115124
}
116125
}
117126

@@ -312,6 +321,7 @@ func (c *Conn) WritePacket(data []byte) error {
312321
return errors.Wrapf(ErrBadConn, "Write failed. only %v bytes written, while %v expected", n, len(data))
313322
}
314323
c.compressedReader = nil
324+
c.compressedReaderActive = false
315325
default:
316326
return errors.Wrapf(ErrBadConn, "Write failed. Unsuppored compression algorithm set")
317327
}

0 commit comments

Comments
 (0)