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 41a5fa2

Browse files
Check if MySQL supports CLIENT_CONNECT_ATTRS before sending client attributes. (#1640)
1 parent f62f523 commit 41a5fa2

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

‎packets.go

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -210,10 +210,13 @@ func (mc *mysqlConn) readHandshakePacket() (data []byte, plugin string, err erro
210210
if len(data) > pos {
211211
// character set [1 byte]
212212
// status flags [2 bytes]
213+
pos += 3
213214
// capability flags (upper 2 bytes) [2 bytes]
215+
mc.flags |= clientFlag(binary.LittleEndian.Uint16(data[pos:pos+2])) << 16
216+
pos += 2
214217
// length of auth-plugin-data [1 byte]
215218
// reserved (all [00]) [10 bytes]
216-
pos += 1+2+2+1+10
219+
pos += 11
217220

218221
// second part of the password cipher [minimum 13 bytes],
219222
// where len=MAX(13, length of auth-plugin-data - 8)
@@ -261,9 +264,11 @@ func (mc *mysqlConn) writeHandshakeResponsePacket(authResp []byte, plugin string
261264
clientLocalFiles |
262265
clientPluginAuth |
263266
clientMultiResults |
264-
clientConnectAttrs |
267+
mc.flags&clientConnectAttrs |
265268
mc.flags&clientLongFlag
266269

270+
sendConnectAttrs := mc.flags&clientConnectAttrs != 0
271+
267272
if mc.cfg.ClientFoundRows {
268273
clientFlags |= clientFoundRows
269274
}
@@ -296,10 +301,13 @@ func (mc *mysqlConn) writeHandshakeResponsePacket(authResp []byte, plugin string
296301
}
297302

298303
// encode length of the connection attributes
299-
var connAttrsLEIBuf [9]byte
300-
connAttrsLen := len(mc.connector.encodedAttributes)
301-
connAttrsLEI := appendLengthEncodedInteger(connAttrsLEIBuf[:0], uint64(connAttrsLen))
302-
pktLen += len(connAttrsLEI) + len(mc.connector.encodedAttributes)
304+
var connAttrsLEI []byte
305+
if sendConnectAttrs {
306+
var connAttrsLEIBuf [9]byte
307+
connAttrsLen := len(mc.connector.encodedAttributes)
308+
connAttrsLEI = appendLengthEncodedInteger(connAttrsLEIBuf[:0], uint64(connAttrsLen))
309+
pktLen += len(connAttrsLEI) + len(mc.connector.encodedAttributes)
310+
}
303311

304312
// Calculate packet length and get buffer with that size
305313
data, err := mc.buf.takeBuffer(pktLen + 4)
@@ -382,8 +390,10 @@ func (mc *mysqlConn) writeHandshakeResponsePacket(authResp []byte, plugin string
382390
pos++
383391

384392
// Connection Attributes
385-
pos += copy(data[pos:], connAttrsLEI)
386-
pos += copy(data[pos:], []byte(mc.connector.encodedAttributes))
393+
if sendConnectAttrs {
394+
pos += copy(data[pos:], connAttrsLEI)
395+
pos += copy(data[pos:], []byte(mc.connector.encodedAttributes))
396+
}
387397

388398
// Send Auth packet
389399
return mc.writePacket(data[:pos])

0 commit comments

Comments
(0)

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