Skip to content

Commit

Permalink
Improve dg.validate() readability
Browse files Browse the repository at this point in the history
  • Loading branch information
vcabbage committed Nov 11, 2016
1 parent 5995f8a commit f5699a1
Showing 1 changed file with 43 additions and 42 deletions.
85 changes: 43 additions & 42 deletions datagram.go
Original file line number Diff line number Diff line change
Expand Up @@ -304,53 +304,54 @@ func (d *datagram) writeOption(o string, v string) {

// VALIDATION

func (d *datagram) validate() (err error) {
func (d *datagram) validate() error {
switch {
case d.offset < 2:
err = errors.New("Datagram has no opcode")
return errors.New("Datagram has no opcode")
case d.opcode() > 6:
err = errors.New("Invalid opcode")
default:
switch d.opcode() {
case opCodeRRQ, opCodeWRQ:
switch {
case len(d.filename()) < 1:
err = errors.New("No filename provided")
case d.buf[d.offset-1] != 0x0: // End with NULL
err = fmt.Errorf("Corrupt %v datagram", d.opcode())
case bytes.Count(d.buf[2:d.offset], []byte{0x0})%2 != 0: // Number of NULL chars is not even
err = fmt.Errorf("Corrupt %v datagram", d.opcode())
return errors.New("Invalid opcode")
}

switch d.opcode() {
case opCodeRRQ, opCodeWRQ:
switch {
case len(d.filename()) < 1:
return errors.New("No filename provided")
case d.buf[d.offset-1] != 0x0: // End with NULL
return fmt.Errorf("Corrupt %v datagram", d.opcode())
case bytes.Count(d.buf[2:d.offset], []byte{0x0})%2 != 0: // Number of NULL chars is not even
return fmt.Errorf("Corrupt %v datagram", d.opcode())
default:
switch d.mode() {
case ModeNetASCII, ModeOctet:
break
case modeMail:
return errors.New("MAIL transfer mode is unsupported")
default:
switch d.mode() {
case ModeNetASCII, ModeOctet:
break
case modeMail:
err = errors.New("MAIL transfer mode is unsupported")
default:
err = errors.New("Invalid transfer mode")
}
}
case opCodeACK, opCodeDATA:
if d.offset < 4 {
err = errors.New("Corrupt block number")
}
case opCodeERROR:
switch {
case d.offset < 5:
err = errors.New("Corrupt ERROR datagram")
case d.buf[d.offset-1] != 0x0:
err = errors.New("Corrupt ERROR datagram")
case bytes.Count(d.buf[4:d.offset], []byte{0x0}) > 1:
err = errors.New("Corrupt ERROR datagram")
}
case opCodeOACK:
switch {
case d.buf[d.offset-1] != 0x0:
err = errors.New("Corrupt OACK datagram")
case bytes.Count(d.buf[2:d.offset], []byte{0x0})%2 != 0: // Number of NULL chars is not even
err = errors.New("Corrupt OACK datagram")
return errors.New("Invalid transfer mode")
}
}
case opCodeACK, opCodeDATA:
if d.offset < 4 {
return errors.New("Corrupt block number")
}
case opCodeERROR:
switch {
case d.offset < 5:
return errors.New("Corrupt ERROR datagram")
case d.buf[d.offset-1] != 0x0:
return errors.New("Corrupt ERROR datagram")
case bytes.Count(d.buf[4:d.offset], []byte{0x0}) > 1:
return errors.New("Corrupt ERROR datagram")
}
case opCodeOACK:
switch {
case d.buf[d.offset-1] != 0x0:
return errors.New("Corrupt OACK datagram")
case bytes.Count(d.buf[2:d.offset], []byte{0x0})%2 != 0: // Number of NULL chars is not even
return errors.New("Corrupt OACK datagram")
}
}
return

return nil
}

0 comments on commit f5699a1

Please sign in to comment.