Skip to content

Commit 487fb2b

Browse files
committed
Fix string decoding
1 parent 2ddf265 commit 487fb2b

File tree

2 files changed

+17
-10
lines changed

2 files changed

+17
-10
lines changed

filter.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -425,9 +425,15 @@ func compileFilter(filter string, pos int) (*ber.Packet, int, error) {
425425
// Convert from "ABC\xx\xx\xx" form to literal bytes for transport
426426
func escapedStringToEncodedBytes(escapedString string) (string, error) {
427427
var buffer bytes.Buffer
428-
for i := 0; i < len(escapedString); i++ {
428+
i := 0
429+
for i < len(escapedString) {
430+
currentRune, currentWidth := utf8.DecodeRuneInString(escapedString[i:])
431+
if currentRune == utf8.RuneError {
432+
return "", NewError(ErrorFilterCompile, fmt.Errorf("ldap: error reading rune at position %d", i))
433+
}
434+
429435
// Check for escaped hex characters and convert them to their literal value for transport.
430-
if escapedString[i] == '\\' {
436+
if currentRune == '\\' {
431437
// http://tools.ietf.org/search/rfc4515
432438
// \ (%x5C) is not a valid character unless it is followed by two HEX characters due to not
433439
// being a member of UTF1SUBSET.
@@ -441,9 +447,10 @@ func escapedStringToEncodedBytes(escapedString string) (string, error) {
441447
i += 2 // +1 from end of loop, so 3 total for \xx.
442448
}
443449
} else {
444-
buffer.WriteString(string(escapedString[i]))
450+
buffer.WriteRune(currentRune)
445451
}
446-
}
447452

453+
i += currentWidth
454+
}
448455
return buffer.String(), nil
449456
}

filter_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,13 @@ var testFilters = []compileTest{
6565
// substring filters escape properly
6666
compileTest{
6767
filterStr: `(sn=Mi*함*r)`,
68-
expectedFilter: `(sn=Mi*\c3\ad\c2\95\c2\a8*r)`,
68+
expectedFilter: `(sn=Mi*\ed\95\a8*r)`,
6969
expectedType: ldap.FilterSubstrings,
7070
},
7171
// already escaped substring filters don't get double-escaped
7272
compileTest{
73-
filterStr: `(sn=Mi*\c3\ad\c2\95\c2\a8*r)`,
74-
expectedFilter: `(sn=Mi*\c3\ad\c2\95\c2\a8*r)`,
73+
filterStr: `(sn=Mi*\ed\95\a8*r)`,
74+
expectedFilter: `(sn=Mi*\ed\95\a8*r)`,
7575
expectedType: ldap.FilterSubstrings,
7676
},
7777
compileTest{
@@ -111,12 +111,12 @@ var testFilters = []compileTest{
111111
},
112112
compileTest{
113113
filterStr: `(objectGUID=абвгдеёжзийклмнопрстуфхцчшщъыьэюя)`,
114-
expectedFilter: `(objectGUID=\c3\90\c2\b0\c3\90\c2\b1\c3\90\c2\b2\c3\90\c2\b3\c3\90\c2\b4\c3\90\c2\b5\c3\91\c2\91\c3\90\c2\b6\c3\90\c2\b7\c3\90\c2\b8\c3\90\c2\b9\c3\90\c2\ba\c3\90\c2\bb\c3\90\c2\bc\c3\90\c2\bd\c3\90\c2\be\c3\90\c2\bf\c3\91\c2\80\c3\91\c2\81\c3\91\c2\82\c3\91\c2\83\c3\91\c2\84\c3\91\c2\85\c3\91\c2\86\c3\91\c2\87\c3\91\c2\88\c3\91\c2\89\c3\91\c2\8a\c3\91\c2\8b\c3\91\c2\8c\c3\91\c2\8d\c3\91\c2\8e\c3\91\c2\8f)`,
114+
expectedFilter: `(objectGUID=\d0\b0\d0\b1\d0\b2\d0\b3\d0\b4\d0\b5\d1\91\d0\b6\d0\b7\d0\b8\d0\b9\d0\ba\d0\bb\d0\bc\d0\bd\d0\be\d0\bf\d1\80\d1\81\d1\82\d1\83\d1\84\d1\85\d1\86\d1\87\d1\88\d1\89\d1\8a\d1\8b\d1\8c\d1\8d\d1\8e\d1\8f)`,
115115
expectedType: ldap.FilterEqualityMatch,
116116
},
117117
compileTest{
118118
filterStr: `(objectGUID=함수목록)`,
119-
expectedFilter: `(objectGUID=\c3\ad\c2\95\c2\a8\c3\ac\c2\88\c2\98\c3\ab\c2\aa\c2\a9\c3\ab\c2\a1\c2\9d)`,
119+
expectedFilter: `(objectGUID=\ed\95\a8\ec\88\98\eb\aa\a9\eb\a1\9d)`,
120120
expectedType: ldap.FilterEqualityMatch,
121121
},
122122
compileTest{
@@ -133,7 +133,7 @@ var testFilters = []compileTest{
133133
},
134134
compileTest{
135135
filterStr: `(&(objectclass=inetorgperson)(cn=中文))`,
136-
expectedFilter: `(&(objectclass=inetorgperson)(cn=\c3\a4\c2\b8\c2\ad\c3\a6\c2\96\c2\87))`,
136+
expectedFilter: `(&(objectclass=inetorgperson)(cn=\e4\b8\ad\e6\96\87))`,
137137
expectedType: 0,
138138
},
139139
// attr extension

0 commit comments

Comments
 (0)