Skip to content

Commit a882567

Browse files
committed
Support microsoft-conform user class option in DHCPv6
Signed-off-by: Damyan Yordanov <[email protected]>
1 parent 8abf581 commit a882567

File tree

2 files changed

+31
-5
lines changed

2 files changed

+31
-5
lines changed

dhcpv6/option_userclass.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,26 @@ func (op *OptUserClass) String() string {
3838
return fmt.Sprintf("%s: [%s]", op.Code(), strings.Join(ucStrings, ", "))
3939
}
4040

41-
// FromBytes builds an OptUserClass structure from a sequence of bytes. The
42-
// input data does not include option code and length bytes.
41+
// FromBytes builds an OptUserClass structure from a sequence of bytes.
42+
// The input data does not include option code and length bytes.
4343
func (op *OptUserClass) FromBytes(data []byte) error {
4444
if len(data) == 0 {
4545
return fmt.Errorf("%w: user class option must not be empty", uio.ErrBufferTooShort)
4646
}
4747
buf := uio.NewBigEndianBuffer(data)
48+
var userClasses [][]byte
4849
for buf.Has(2) {
49-
len := buf.Read16()
50-
op.UserClasses = append(op.UserClasses, buf.CopyN(int(len)))
50+
length := buf.Read16()
51+
if int(length) > buf.Len() {
52+
break
53+
}
54+
uc := buf.CopyN(int(length))
55+
userClasses = append(userClasses, uc)
5156
}
52-
return buf.FinError()
57+
if len(userClasses) > 0 {
58+
op.UserClasses = userClasses
59+
} else {
60+
op.UserClasses = [][]byte{data}
61+
}
62+
return nil
5363
}

dhcpv6/option_userclass_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,19 @@ func TestOptUserClassString(t *testing.T) {
7777
"String() should contain the list of user classes",
7878
)
7979
}
80+
81+
func TestOptUserClassBroken(t *testing.T) {
82+
data := []byte{
83+
'l', 'i', 'n', 'u', 'x', 'b', 'o', 'o', 't',
84+
}
85+
var opt OptUserClass
86+
err := opt.FromBytes(data)
87+
require.NoError(t, err)
88+
89+
require.Contains(
90+
t,
91+
opt.String(),
92+
"User Class: [linuxboot]",
93+
"String() should contain the list of user classes",
94+
)
95+
}

0 commit comments

Comments
 (0)