]> Sergey Matveev's repositories - btrtrc.git/commitdiff
bencode: Trailing bytes on Unmarshal is an error
authorMatt Joiner <anacrolix@gmail.com>
Sun, 23 Aug 2015 07:47:01 +0000 (17:47 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Sun, 23 Aug 2015 07:47:01 +0000 (17:47 +1000)
bencode/api.go

index b4ddcec983dd87a83e38f26bc4c50c552972f40b..a17d182037adccf4df013852b3af888283708d63 100644 (file)
@@ -3,6 +3,7 @@ package bencode
 import (
        "bufio"
        "bytes"
+       "errors"
        "fmt"
        "io"
        "reflect"
@@ -127,9 +128,23 @@ func Marshal(v interface{}) ([]byte, error) {
 
 // Unmarshal the bencode value in the 'data' to a value pointed by the 'v'
 // pointer, return a non-nil error if any.
-func Unmarshal(data []byte, v interface{}) error {
+func Unmarshal(data []byte, v interface{}) (err error) {
        e := decoder{Reader: bufio.NewReader(bytes.NewBuffer(data))}
-       return e.decode(v)
+       err = e.decode(v)
+       if err != nil {
+               return
+       }
+       _, err = e.Reader.ReadByte()
+       if err == io.EOF {
+               return nil
+       }
+       if err == nil {
+               err = &SyntaxError{
+                       Offset: e.offset,
+                       What:   errors.New("trailing bytes"),
+               }
+       }
+       return
 }
 
 //----------------------------------------------------------------------------