Skip to content

Commit b693143

Browse files
authored
fix DirSync flags encoding (#571)
1 parent 97082cc commit b693143

File tree

1 file changed

+11
-1
lines changed

1 file changed

+11
-1
lines changed

v3/control.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ldap
22

33
import (
4+
"encoding/binary"
45
"fmt"
56
"strconv"
67

@@ -880,7 +881,16 @@ func (c *ControlDirSync) Encode() *ber.Packet {
880881

881882
val := ber.Encode(ber.ClassUniversal, ber.TypePrimitive, ber.TagOctetString, nil, "Control Value (DirSync)")
882883
seq := ber.Encode(ber.ClassUniversal, ber.TypeConstructed, ber.TagSequence, nil, "DirSync Control Value")
883-
seq.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, int64(c.Flags), "Flags"))
884+
885+
// Note: Active Directory expects a 4-byte unsigned integer for flags, but ASN.1 uses signed integers by default.
886+
// As a result, the BER encoder may encode flags as a 5-byte signed integer; we force 4-byte encoding here.
887+
flagsPacket := ber.Encode(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, nil, "Flags")
888+
flagsPacket.Value = int64(c.Flags)
889+
flagsBytes := make([]byte, 4)
890+
binary.BigEndian.PutUint32(flagsBytes, uint32(c.Flags))
891+
flagsPacket.Data.Write(flagsBytes)
892+
seq.AppendChild(flagsPacket)
893+
884894
seq.AppendChild(ber.NewInteger(ber.ClassUniversal, ber.TypePrimitive, ber.TagInteger, int64(c.MaxAttrCount), "MaxAttrCount"))
885895
seq.AppendChild(cookie)
886896
val.AppendChild(seq)

0 commit comments

Comments
 (0)