Skip to content

Commit 5937e97

Browse files
authored
Fix panic on malformed LDAP responses (#586)
Six operations (Add, Del, Compare, Modify, ModifyDN, PasswordModify) access packet.Children[1] without bounds checking. A malformed BER response with fewer than 2 children causes a panic (index out of range). Add len(packet.Children) < 2 guard in all affected functions, returning a descriptive error instead of panicking. Fixes #585 Co-authored-by: bahtya <bahtyar153@qq.com>
1 parent 9edc530 commit 5937e97

6 files changed

Lines changed: 22 additions & 0 deletions

File tree

v3/add.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ func (l *Conn) Add(addRequest *AddRequest) error {
8383
return err
8484
}
8585

86+
if len(packet.Children) < 2 {
87+
return fmt.Errorf("ldap: malformed response: expected at least 2 children, got %d", len(packet.Children))
88+
}
8689
if packet.Children[1].Tag == ApplicationAddResponse {
8790
err := GetLDAPError(packet)
8891
if err != nil {

v3/compare.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ func (l *Conn) Compare(dn, attribute, value string) (bool, error) {
4646
return false, err
4747
}
4848

49+
if len(packet.Children) < 2 {
50+
return false, fmt.Errorf("ldap: malformed response: expected at least 2 children, got %d", len(packet.Children))
51+
}
4952
if packet.Children[1].Tag == ApplicationCompareResponse {
5053
err := GetLDAPError(packet)
5154

v3/del.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ func (l *Conn) Del(delRequest *DelRequest) error {
5252
return err
5353
}
5454

55+
if len(packet.Children) < 2 {
56+
return fmt.Errorf("ldap: malformed response: expected at least 2 children, got %d", len(packet.Children))
57+
}
5558
if packet.Children[1].Tag == ApplicationDelResponse {
5659
err := GetLDAPError(packet)
5760
if err != nil {

v3/moddn.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ func (l *Conn) ModifyDN(m *ModifyDNRequest) error {
8989
return err
9090
}
9191

92+
if len(packet.Children) < 2 {
93+
return fmt.Errorf("ldap: malformed response: expected at least 2 children, got %d", len(packet.Children))
94+
}
9295
if packet.Children[1].Tag == ApplicationModifyDNResponse {
9396
err := GetLDAPError(packet)
9497
if err != nil {

v3/modify.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,9 @@ func (l *Conn) Modify(modifyRequest *ModifyRequest) error {
121121
return err
122122
}
123123

124+
if len(packet.Children) < 2 {
125+
return fmt.Errorf("ldap: malformed response: expected at least 2 children, got %d", len(packet.Children))
126+
}
124127
if packet.Children[1].Tag == ApplicationModifyResponse {
125128
err := GetLDAPError(packet)
126129
if err != nil {
@@ -159,6 +162,10 @@ func (l *Conn) ModifyWithResult(modifyRequest *ModifyRequest) (*ModifyResult, er
159162
return nil, err
160163
}
161164

165+
if len(packet.Children) < 2 {
166+
return nil, fmt.Errorf("ldap: malformed response: expected at least 2 children, got %d", len(packet.Children))
167+
}
168+
162169
switch packet.Children[1].Tag {
163170
case ApplicationModifyResponse:
164171
if err = GetLDAPError(packet); err != nil {

v3/passwdmodify.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,9 @@ func (l *Conn) PasswordModify(passwordModifyRequest *PasswordModifyRequest) (*Pa
9393

9494
result := &PasswordModifyResult{}
9595

96+
if len(packet.Children) < 2 {
97+
return nil, fmt.Errorf("ldap: malformed response: expected at least 2 children, got %d", len(packet.Children))
98+
}
9699
if packet.Children[1].Tag == ApplicationExtendedResponse {
97100
if err = GetLDAPError(packet); err != nil {
98101
result.Referral = getReferral(err, packet)

0 commit comments

Comments
 (0)