Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions dhcpv6/option_generic_parse_failure.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package dhcpv6

import (
"fmt"
)

// OptionGenericParseFailure represents an option that failed to be parsed correctly
type OptionGenericParseFailure struct {
OptionCode OptionCode
OptionData []byte
Option Option
Error error
}

// Code returns the option's code
func (og *OptionGenericParseFailure) Code() OptionCode {
return og.OptionCode
}

// ToBytes serializes the option and returns it as a sequence of bytes
func (og *OptionGenericParseFailure) ToBytes() []byte {
return og.OptionData
}

func (og *OptionGenericParseFailure) String() string {
return fmt.Sprintf("GenericParseFailure(%v): %v, Error=%v", og.OptionCode, og.Option, og.Error)
}
37 changes: 37 additions & 0 deletions dhcpv6/option_generic_parse_failure_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package dhcpv6

import (
"testing"

"github.com/stretchr/testify/require"
)

func TestOptGenericParseFailure(t *testing.T) {
buf := []byte{
0xaa, 0xbb, 0xcc, 0xdd, // EnterpriseNumber
12, 0, // length is little-endian - should be big-endian
'd', 's', 'l', 'f', 'o', 'r', 'u', 'm', '.', 'o', 'r', 'g',
}
opt, _ := ParseOption(OptionVendorClass, buf)
require.IsType(t, &OptionGenericParseFailure{}, opt)
failedOpt, ok := opt.(*OptionGenericParseFailure)
require.True(t, ok)
require.Contains(
t,
failedOpt.Error.Error(),
"buffer too short",
"Error() should return the original parser error",
)
require.Contains(
t,
failedOpt.String(),
"GenericParseFailure(Vendor Class)",
"String() should include the Option Code",
)
require.Contains(
t,
failedOpt.String(),
"enterprisenum=2864434397",
"String() should include the details of the failed option",
)
}
9 changes: 3 additions & 6 deletions dhcpv6/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,9 +107,9 @@ func ParseOption(code OptionCode, optData []byte) (Option, error) {
opt = &OptionGeneric{OptionCode: code, OptionData: optData}
}
if err != nil {
return nil, err
opt = &OptionGenericParseFailure{OptionCode: code, OptionData: optData, Option: opt, Error: err}
}
return opt, nil
return opt, err
}

// Options is a collection of options.
Expand Down Expand Up @@ -205,10 +205,7 @@ func (o *Options) FromBytesWithParser(data []byte, parser OptionParser) error {
// pertinent data.
optData := buf.Consume(length)

opt, err := parser(code, optData)
if err != nil {
return err
}
opt, _ := parser(code, optData)
*o = append(*o, opt)
}
return buf.FinError()
Expand Down