Skip to content

Commit af8a39f

Browse files
committed
Correctly decode empty arrays and maps
Fixes #42.
1 parent d7f0cd8 commit af8a39f

File tree

2 files changed

+6
-0
lines changed

2 files changed

+6
-0
lines changed

dbus.go

+2
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,8 @@ func alignment(t reflect.Type) int {
177177
return 4
178178
case signatureType:
179179
return 1
180+
case interfacesType: // sometimes used for structs
181+
return 8
180182
}
181183
switch t.Kind() {
182184
case reflect.Uint8:

decoder.go

+4
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,8 @@ func (dec *decoder) decode(s string, depth int) interface{} {
171171
panic(FormatError("input exceeds container depth limit"))
172172
}
173173
length := dec.decode("u", depth).(uint32)
174+
// Even for empty maps, the correct padding must be included
175+
dec.align(8)
174176
spos := dec.pos
175177
for dec.pos < spos+int(length) {
176178
dec.align(8)
@@ -188,6 +190,8 @@ func (dec *decoder) decode(s string, depth int) interface{} {
188190
}
189191
length := dec.decode("u", depth).(uint32)
190192
v := reflect.MakeSlice(reflect.SliceOf(typeFor(s[1:])), 0, int(length))
193+
// Even for empty arrays, the correct padding must be included
194+
dec.align(alignment(typeFor(s[1:])))
191195
spos := dec.pos
192196
for dec.pos < spos+int(length) {
193197
ev := dec.decode(s[1:], depth+1)

0 commit comments

Comments
 (0)