Skip to content

Commit 87265c0

Browse files
gleonidsiddontang
authored andcommitted
surface original network errors and create error stacks (#425)
1 parent 27c6aef commit 87265c0

File tree

1 file changed

+19
-17
lines changed

1 file changed

+19
-17
lines changed

packet/conn.go

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ func (c *Conn) ReadPacketTo(w io.Writer) error {
9494
header := []byte{0, 0, 0, 0}
9595

9696
if _, err := io.ReadFull(c.reader, header); err != nil {
97-
return ErrBadConn
97+
return errors.Wrapf(ErrBadConn, "io.ReadFull(header) failed. err %v", err)
9898
}
9999

100100
length := int(uint32(header[0]) | uint32(header[1])<<8 | uint32(header[2])<<16)
@@ -112,16 +112,16 @@ func (c *Conn) ReadPacketTo(w io.Writer) error {
112112
}
113113

114114
if n, err := io.CopyN(w, c.reader, int64(length)); err != nil {
115-
return ErrBadConn
115+
return errors.Wrapf(ErrBadConn, "io.CopyN failed. err %v, copied %v, expected %v", err, n, length)
116116
} else if n != int64(length) {
117-
return ErrBadConn
117+
return errors.Wrapf(ErrBadConn, "io.CopyN failed(n != int64(length)). %v bytes copied, while %v expected", n, length)
118118
} else {
119119
if length < MaxPayloadLen {
120120
return nil
121121
}
122122

123123
if err := c.ReadPacketTo(w); err != nil {
124-
return err
124+
return errors.Wrap(err, "ReadPacketTo failed")
125125
}
126126
}
127127

@@ -141,9 +141,9 @@ func (c *Conn) WritePacket(data []byte) error {
141141
data[3] = c.Sequence
142142

143143
if n, err := c.Write(data[:4+MaxPayloadLen]); err != nil {
144-
return ErrBadConn
144+
return errors.Wrapf(ErrBadConn, "Write(payload portion) failed. err %v", err)
145145
} else if n != (4 + MaxPayloadLen) {
146-
return ErrBadConn
146+
return errors.Wrapf(ErrBadConn, "Write(payload portion) failed. only %v bytes written, while %v expected", n, 4+MaxPayloadLen)
147147
} else {
148148
c.Sequence++
149149
length -= MaxPayloadLen
@@ -157,9 +157,9 @@ func (c *Conn) WritePacket(data []byte) error {
157157
data[3] = c.Sequence
158158

159159
if n, err := c.Write(data); err != nil {
160-
return ErrBadConn
160+
return errors.Wrapf(ErrBadConn, "Write failed. err %v", err)
161161
} else if n != len(data) {
162-
return ErrBadConn
162+
return errors.Wrapf(ErrBadConn, "Write failed. only %v bytes written, while %v expected", n, len(data))
163163
} else {
164164
c.Sequence++
165165
return nil
@@ -177,7 +177,7 @@ func (c *Conn) WriteClearAuthPacket(password string) error {
177177
copy(data[4:], password)
178178
data[4+pktLen-1] = 0x00
179179

180-
return c.WritePacket(data)
180+
return errors.Wrap(c.WritePacket(data), "WritePacket failed")
181181
}
182182

183183
// WritePublicKeyAuthPacket: Caching sha2 authentication. Public key request and send encrypted password
@@ -186,17 +186,19 @@ func (c *Conn) WritePublicKeyAuthPacket(password string, cipher []byte) error {
186186
// request public key
187187
data := make([]byte, 4+1)
188188
data[4] = 2 // cachingSha2PasswordRequestPublicKey
189-
c.WritePacket(data)
189+
if err := c.WritePacket(data); err != nil {
190+
return errors.Wrap(err, "WritePacket(single byte) failed")
191+
}
190192

191193
data, err := c.ReadPacket()
192194
if err != nil {
193-
return err
195+
return errors.Wrap(err, "ReadPacket failed")
194196
}
195197

196198
block, _ := pem.Decode(data[1:])
197199
pub, err := x509.ParsePKIXPublicKey(block.Bytes)
198200
if err != nil {
199-
return err
201+
return errors.Wrap(err, "x509.ParsePKIXPublicKey failed")
200202
}
201203

202204
plain := make([]byte, len(password)+1)
@@ -209,15 +211,15 @@ func (c *Conn) WritePublicKeyAuthPacket(password string, cipher []byte) error {
209211
enc, _ := rsa.EncryptOAEP(sha1v, rand.Reader, pub.(*rsa.PublicKey), plain, nil)
210212
data = make([]byte, 4+len(enc))
211213
copy(data[4:], enc)
212-
return c.WritePacket(data)
214+
return errors.Wrap(c.WritePacket(data), "WritePacket failed")
213215
}
214216

215217
func (c *Conn) WriteEncryptedPassword(password string, seed []byte, pub *rsa.PublicKey) error {
216218
enc, err := EncryptPassword(password, seed, pub)
217219
if err != nil {
218-
return err
220+
return errors.Wrap(err, "EncryptPassword failed")
219221
}
220-
return c.WriteAuthSwitchPacket(enc, false)
222+
return errors.Wrap(c.WriteAuthSwitchPacket(enc, false), "WriteAuthSwitchPacket failed")
221223
}
222224

223225
// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchResponse
@@ -234,7 +236,7 @@ func (c *Conn) WriteAuthSwitchPacket(authData []byte, addNUL bool) error {
234236
data[pktLen-1] = 0x00
235237
}
236238

237-
return c.WritePacket(data)
239+
return errors.Wrap(c.WritePacket(data), "WritePacket failed")
238240
}
239241

240242
func (c *Conn) ResetSequence() {
@@ -244,7 +246,7 @@ func (c *Conn) ResetSequence() {
244246
func (c *Conn) Close() error {
245247
c.Sequence = 0
246248
if c.Conn != nil {
247-
return c.Conn.Close()
249+
return errors.Wrap(c.Conn.Close(), "Conn.Close failed")
248250
}
249251
return nil
250252
}

0 commit comments

Comments
 (0)