summaryrefslogtreecommitdiff
path: root/rrdformat/rrdbinary/unmarshal.go
diff options
context:
space:
mode:
Diffstat (limited to 'rrdformat/rrdbinary/unmarshal.go')
-rw-r--r--rrdformat/rrdbinary/unmarshal.go21
1 files changed, 17 insertions, 4 deletions
diff --git a/rrdformat/rrdbinary/unmarshal.go b/rrdformat/rrdbinary/unmarshal.go
index 1cfee34..142ee9f 100644
--- a/rrdformat/rrdbinary/unmarshal.go
+++ b/rrdformat/rrdbinary/unmarshal.go
@@ -50,12 +50,14 @@ func (d *unmarshaler) unmarshal(v reflect.Value, tag string) error {
return d.unmarshalUnival(v, tag)
case reflect.TypeOf(Time(0)):
return d.unmarshalTime(v, tag)
+ case reflect.TypeOf(EOF{}):
+ return d.unmarshalEOF(v, tag)
default:
switch v.Type().Kind() {
case reflect.Struct:
return d.unmarshalStruct(v, tag)
- case reflect.Array:
- return d.unmarshalArray(v, tag)
+ case reflect.Array, reflect.Slice:
+ return d.unmarshalList(v, tag)
default:
return typeErrorf("invalid type for rrdbinary.Unmarshal: %v", v.Type())
}
@@ -83,8 +85,8 @@ func (d *unmarshaler) unmarshalStruct(v reflect.Value, tag string) error {
return nil
}
-func (d *unmarshaler) unmarshalArray(v reflect.Value, tag string) error {
- panicUnless(v.Kind() == reflect.Array)
+func (d *unmarshaler) unmarshalList(v reflect.Value, tag string) error {
+ panicUnless(v.Kind() == reflect.Array || v.Kind() == reflect.Slice)
panicUnless(v.CanSet())
for i := 0; i < v.Len(); i++ {
@@ -314,3 +316,14 @@ func (d *unmarshaler) unmarshalTime(v reflect.Value, tag string) error {
d.pos += padding + d.arch.TimeWidth
return nil
}
+
+func (d *unmarshaler) unmarshalEOF(v reflect.Value, tag string) error {
+ panicUnless(v.Type() == reflect.TypeOf(EOF{}))
+
+ data := d.data[d.pos:]
+ if len(data) > 0 {
+ return d.binErrorf(16, "extra %d bytes of data after expected end-of-file", len(data))
+ }
+
+ return nil
+}