@@ -33,15 +33,15 @@ func (mc *mysqlConn) readPacket() (data []byte, err error) {
33
33
return nil , driver .ErrBadConn
34
34
}
35
35
36
- // Packet Length
36
+ // Packet Length [24 bit]
37
37
pktLen := uint32 (data [0 ]) | uint32 (data [1 ])<< 8 | uint32 (data [2 ])<< 16
38
38
39
- if pktLen == 0 {
39
+ if pktLen < 1 {
40
40
errLog .Print (errMalformPkt .Error ())
41
41
return nil , driver .ErrBadConn
42
42
}
43
43
44
- // Check Packet Sync
44
+ // Check Packet Sync [8 bit]
45
45
if data [3 ] != mc .sequence {
46
46
if data [3 ] > mc .sequence {
47
47
return nil , errPktSyncMul
@@ -51,7 +51,7 @@ func (mc *mysqlConn) readPacket() (data []byte, err error) {
51
51
}
52
52
mc .sequence ++
53
53
54
- // Read packet body
54
+ // Read packet body [pktLen bytes]
55
55
data = make ([]byte , pktLen )
56
56
err = mc .buf .read (data )
57
57
if err == nil {
@@ -103,8 +103,8 @@ func (mc *mysqlConn) readInitPacket() (err error) {
103
103
// connection id [4 bytes]
104
104
pos := 1 + bytes .IndexByte (data [1 :], 0x00 ) + 1 + 4
105
105
106
- // first part of scramble buffer [8 bytes]
107
- mc .scrambleBuff = data [pos : pos + 8 ]
106
+ // first part of the password cipher [8 bytes]
107
+ mc .cipher = append ( mc . cipher , data [pos : pos + 8 ]... )
108
108
109
109
// (filler) always 0x00 [1 byte]
110
110
pos += 8 + 1
@@ -126,7 +126,11 @@ func (mc *mysqlConn) readInitPacket() (err error) {
126
126
// reserved (all [00]) [10 byte]
127
127
pos += 1 + 2 + 2 + 1 + 10
128
128
129
- mc .scrambleBuff = append (mc .scrambleBuff , data [pos :len (data )- 1 ]... )
129
+ // second part of the password cipher [12? bytes]
130
+ // The documentation is ambiguous about the length.
131
+ // The official Python library uses the fixed length 12
132
+ // which is not documented but seems to work.
133
+ mc .cipher = append (mc .cipher , data [pos :pos + 12 ]... )
130
134
131
135
if data [len (data )- 1 ] == 0 {
132
136
return
@@ -152,8 +156,8 @@ func (mc *mysqlConn) writeAuthPacket() error {
152
156
}
153
157
154
158
// User Password
155
- scrambleBuff := scramblePassword (mc .scrambleBuff , []byte (mc .cfg .passwd ))
156
- mc .scrambleBuff = nil
159
+ scrambleBuff := scramblePassword (mc .cipher , []byte (mc .cfg .passwd ))
160
+ mc .cipher = nil
157
161
158
162
pktLen := 4 + 4 + 1 + 23 + len (mc .cfg .user ) + 1 + 1 + len (scrambleBuff )
159
163
0 commit comments