Skip to content

Commit 3768aa5

Browse files
author
Phil Bayfield
committed
all reads and writes should return ClientError struct for any errors
1 parent ebb3476 commit 3768aa5

File tree

3 files changed

+61
-23
lines changed

3 files changed

+61
-23
lines changed

packet.go

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ package mysql
77

88
import (
99
"bytes"
10-
"fmt"
1110
"os"
1211
)
1312

@@ -160,7 +159,7 @@ func (p *packetInit) read(data []byte) (err os.Error) {
160159
// Recover errors
161160
defer func() {
162161
if e := recover(); e != nil {
163-
err = os.NewError(fmt.Sprintf("%s", e))
162+
err = &ClientError{CR_MALFORMED_PACKET, CR_MALFORMED_PACKET_STR}
164163
}
165164
}()
166165
// Position
@@ -211,6 +210,12 @@ type packetAuth struct {
211210

212211
// Auth packet writer
213212
func (p *packetAuth) write() (data []byte, err os.Error) {
213+
// Recover errors
214+
defer func() {
215+
if e := recover(); e != nil {
216+
err = &ClientError{CR_MALFORMED_PACKET, CR_MALFORMED_PACKET_STR}
217+
}
218+
}()
214219
// For MySQL 4.1+
215220
if p.protocol == PROTOCOL_41 {
216221
// Client flags
@@ -277,7 +282,7 @@ func (p *packetOK) read(data []byte) (err os.Error) {
277282
// Recover errors
278283
defer func() {
279284
if e := recover(); e != nil {
280-
err = os.NewError(fmt.Sprintf("%s", e))
285+
err = &ClientError{CR_MALFORMED_PACKET, CR_MALFORMED_PACKET_STR}
281286
}
282287
}()
283288
// Position (skip first byte/field count)
@@ -324,7 +329,7 @@ func (p *packetError) read(data []byte) (err os.Error) {
324329
// Recover errors
325330
defer func() {
326331
if e := recover(); e != nil {
327-
err = os.NewError(fmt.Sprintf("%s", e))
332+
err = &ClientError{CR_MALFORMED_PACKET, CR_MALFORMED_PACKET_STR}
328333
}
329334
}()
330335
// Position
@@ -357,7 +362,7 @@ func (p *packetEOF) read(data []byte) (err os.Error) {
357362
// Recover errors
358363
defer func() {
359364
if e := recover(); e != nil {
360-
err = os.NewError(fmt.Sprintf("%s", e))
365+
err = &ClientError{CR_MALFORMED_PACKET, CR_MALFORMED_PACKET_STR}
361366
}
362367
}()
363368
// Check for 4.1 protocol AND 2 available bytes
@@ -383,6 +388,12 @@ type packetPassword struct {
383388

384389
// Password packet writer
385390
func (p *packetPassword) write() (data []byte, err os.Error) {
391+
// Recover errors
392+
defer func() {
393+
if e := recover(); e != nil {
394+
err = &ClientError{CR_MALFORMED_PACKET, CR_MALFORMED_PACKET_STR}
395+
}
396+
}()
386397
// Set scramble
387398
data = p.scrambleBuff
388399
// Add terminator
@@ -401,10 +412,10 @@ type packetCommand struct {
401412

402413
// Command packet writer
403414
func (p *packetCommand) write() (data []byte, err os.Error) {
404-
// Recover errors (if wrong param type supplied)
415+
// Recover errors
405416
defer func() {
406417
if e := recover(); e != nil {
407-
err = os.NewError(fmt.Sprintf("%s", e))
418+
err = &ClientError{CR_MALFORMED_PACKET, CR_MALFORMED_PACKET_STR}
408419
}
409420
}()
410421
// Make slice from command byte
@@ -483,7 +494,7 @@ func (p *packetResultSet) read(data []byte) (err os.Error) {
483494
// Recover errors
484495
defer func() {
485496
if e := recover(); e != nil {
486-
err = os.NewError(fmt.Sprintf("%s", e))
497+
err = &ClientError{CR_MALFORMED_PACKET, CR_MALFORMED_PACKET_STR}
487498
}
488499
}()
489500
// Position and bytes read
@@ -526,7 +537,7 @@ func (p *packetField) read(data []byte) (err os.Error) {
526537
// Recover errors
527538
defer func() {
528539
if e := recover(); e != nil {
529-
err = os.NewError(fmt.Sprintf("%s", e))
540+
err = &ClientError{CR_MALFORMED_PACKET, CR_MALFORMED_PACKET_STR}
530541
}
531542
}()
532543
// Position and bytes read
@@ -632,7 +643,7 @@ func (p *packetRowData) read(data []byte) (err os.Error) {
632643
// Recover errors
633644
defer func() {
634645
if e := recover(); e != nil {
635-
err = os.NewError(fmt.Sprintf("%s", e))
646+
err = &ClientError{CR_MALFORMED_PACKET, CR_MALFORMED_PACKET_STR}
636647
}
637648
}()
638649
// Position

reader.go

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package mysql
77

88
import (
99
"io"
10+
"net"
1011
"os"
1112
)
1213

@@ -26,6 +27,23 @@ func newReader(conn io.ReadWriteCloser) *reader {
2627

2728
// Read the next packet
2829
func (r *reader) readPacket(types packetType) (p packetReadable, err os.Error) {
30+
// Deferred error processing
31+
defer func() {
32+
if err != nil {
33+
// EOF errors
34+
if err == os.EOF || err == io.ErrUnexpectedEOF {
35+
err = &ClientError{CR_SERVER_LOST, CR_SERVER_LOST_STR}
36+
}
37+
// OpError
38+
if _, ok := err.(*net.OpError); ok {
39+
err = &ClientError{CR_SERVER_LOST, CR_SERVER_LOST_STR}
40+
}
41+
// Not ClientError, unknown error
42+
if _, ok := err.(*ClientError); !ok {
43+
err = &ClientError{CR_UNKNOWN_ERROR, CR_UNKNOWN_ERROR_STR}
44+
}
45+
}
46+
}()
2947
// Read packet length
3048
pktLen, err := r.readNumber(3)
3149
if err != nil {
@@ -43,13 +61,13 @@ func (r *reader) readPacket(types packetType) (p packetReadable, err os.Error) {
4361
return
4462
}
4563
if nr != int(pktLen) {
46-
err = os.NewError("Number of bytes read does not match packet length")
64+
err = &ClientError{CR_DATA_TRUNCATED, CR_DATA_TRUNCATED_STR}
4765
}
4866
// Work out packet type
4967
switch {
5068
// Unknown packet
5169
default:
52-
err = os.NewError("Unknown or unexpected packet or packet type")
70+
err = &ClientError{CR_UNKNOWN_ERROR, CR_UNKNOWN_ERROR_STR}
5371
// Initialisation / handshake packet, server > client
5472
case types&PACKET_INIT != 0:
5573
pk := new(packetInit)
@@ -95,19 +113,10 @@ func (r *reader) readPacket(types packetType) (p packetReadable, err os.Error) {
95113

96114
// Read n bytes long number
97115
func (r *reader) readNumber(n uint8) (num uint64, err os.Error) {
98-
// Check max length
99-
if n > 8 {
100-
err = os.NewError("Cannot read a number greater than 8 bytes long")
101-
return
102-
}
103116
// Read bytes into array
104117
buf := make([]byte, n)
105118
nr, err := io.ReadFull(r.conn, buf)
106-
if err != nil {
107-
return
108-
}
109-
if nr != int(n) {
110-
err = os.NewError("Number of bytes read does not match number of bytes requested")
119+
if err != nil || nr != int(n) {
111120
return
112121
}
113122
// Convert to uint64

writer.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package mysql
77

88
import (
99
"io"
10+
"net"
1011
"os"
1112
)
1213

@@ -24,6 +25,23 @@ func newWriter(conn io.ReadWriteCloser) *writer {
2425

2526
// Write packet to the server
2627
func (w *writer) writePacket(p packetWritable) (err os.Error) {
28+
// Deferred error processing
29+
defer func() {
30+
if err != nil {
31+
// EOF errors
32+
if err == os.EOF || err == io.ErrUnexpectedEOF {
33+
err = &ClientError{CR_SERVER_LOST, CR_SERVER_LOST_STR}
34+
}
35+
// OpError
36+
if _, ok := err.(*net.OpError); ok {
37+
err = &ClientError{CR_SERVER_LOST, CR_SERVER_LOST_STR}
38+
}
39+
// Not ClientError, unknown error
40+
if _, ok := err.(*ClientError); !ok {
41+
err = &ClientError{CR_UNKNOWN_ERROR, CR_UNKNOWN_ERROR_STR}
42+
}
43+
}
44+
}()
2745
// Get data in binary format
2846
pktData, err := p.write()
2947
if err != nil {
@@ -35,7 +53,7 @@ func (w *writer) writePacket(p packetWritable) (err os.Error) {
3553
return
3654
}
3755
if nw != len(pktData) {
38-
err = os.NewError("Number of bytes written does not match packet length")
56+
err = &ClientError{CR_DATA_TRUNCATED, CR_DATA_TRUNCATED_STR}
3957
}
4058
return
4159
}

0 commit comments

Comments
 (0)