Skip to content
Open
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
21 changes: 21 additions & 0 deletions v3/control.go
Original file line number Diff line number Diff line change
Expand Up @@ -605,6 +605,9 @@ func DecodeControl(packet *ber.Packet) (Control, error) {
case ControlTypeManageDsaIT:
return NewControlManageDsaIT(Criticality), nil
case ControlTypePaging:
if value == nil {
return nil, fmt.Errorf("nil value for Control Type ControlTypePaging")
}
value.Description += " (Paging)"
c := new(ControlPaging)
if value.Value != nil {
Expand All @@ -625,6 +628,9 @@ func DecodeControl(packet *ber.Packet) (Control, error) {
value.Children[1].Value = c.Cookie
return c, nil
case ControlTypeBeheraPasswordPolicy:
if value == nil {
return nil, fmt.Errorf("nil value for Control Type ControlTypeBeheraPasswordPolicy")
}
value.Description += " (Password Policy - Behera)"
c := NewControlBeheraPasswordPolicy()
if value.Value != nil {
Expand Down Expand Up @@ -700,23 +706,35 @@ func DecodeControl(packet *ber.Packet) (Control, error) {
case ControlTypeServerSideSortingResult:
return NewControlServerSideSortingResult(value)
case ControlTypeDirSync:
if value == nil {
return nil, fmt.Errorf("nil value for Control Type ControlTypeDirSync")
}
value.Description += " (DirSync)"
return NewResponseControlDirSync(value)
case ControlTypeSyncState:
if value == nil {
return nil, fmt.Errorf("nil value for Control Type ControlTypeSyncState")
}
value.Description += " (Sync State)"
valueChildren, err := ber.DecodePacketErr(value.Data.Bytes())
if err != nil {
return nil, fmt.Errorf("failed to decode data bytes: %s", err)
}
return NewControlSyncState(valueChildren)
case ControlTypeSyncDone:
if value == nil {
return nil, fmt.Errorf("nil value for Control Type ControlTypeSyncDone")
}
value.Description += " (Sync Done)"
valueChildren, err := ber.DecodePacketErr(value.Data.Bytes())
if err != nil {
return nil, fmt.Errorf("failed to decode data bytes: %s", err)
}
return NewControlSyncDone(valueChildren)
case ControlTypeSyncInfo:
if value == nil {
return nil, fmt.Errorf("nil value for Control Type ControlTypeSyncInfo")
}
value.Description += " (Sync Info)"
valueChildren, err := ber.DecodePacketErr(value.Data.Bytes())
if err != nil {
Expand Down Expand Up @@ -911,6 +929,9 @@ func (c *ControlServerSideSorting) GetControlType() string {
}

func NewControlServerSideSorting(value *ber.Packet) (*ControlServerSideSorting, error) {
if value == nil || len(value.Children) < 2 {
return new(ControlServerSideSorting), nil
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This would satisfy your scanner, but would result in a faulty message due to the controlValue not having the necesarry fields for encoding the message.

ldap/v3/control.go

Lines 948 to 979 in 82fef14

func (c *ControlServerSideSorting) Encode() *ber.Packet {
packet := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "Control")
control := ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, c.GetControlType(), "Control Type")
value := ber.Encode(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, nil, "Control Value")
seqs := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "SortKeyList")
for _, f := range c.SortKeys {
seq := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "")
seq.AppendChild(
ber.NewString(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, f.AttributeType, "attributeType"),
)
seq.AppendChild(
ber.NewString(ber.ClassContext, ber.TypePrimitive, 0, f.MatchingRule, "orderingRule"),
)
if f.Reverse {
seq.AppendChild(
ber.NewBoolean(ber.ClassContext, ber.TypePrimitive, 1, f.Reverse, "reverseOrder"),
)
}
seqs.AppendChild(seq)
}
value.AppendChild(seqs)
packet.AppendChild(control)
packet.AppendChild(value)
return packet
}

I suggest to disregard this particular change. The function is never called from a message processor but only by a developer.

Copy link
Contributor Author

@artemseleznev artemseleznev Sep 22, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@cpuschma thank you for your feedback!
Yes, I fix this because the scanner marked this code, but I also prefer not to get panics in my project:-)

Please let me know if my fixes are excess, or some of them (not only in NewControlServerSideSorting)

}
sortKeys := []*SortKey{}

val := value.Children[1].Children
Expand Down
Loading