]> Sergey Matveev's repositories - btrtrc.git/commitdiff
bencode: Return ErrUnexpectedEOF instead of EOF in the middle of values
authorMatt Joiner <anacrolix@gmail.com>
Fri, 7 Jan 2022 08:06:33 +0000 (19:06 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Fri, 7 Jan 2022 08:11:41 +0000 (19:11 +1100)
bencode/decode.go

index 67c25a33ab92af61f8cbd48ee6719b5cc99bfd1a..1007db906c58eeafd46b282c2348d1f509122ded 100644 (file)
@@ -37,14 +37,21 @@ func (d *Decoder) Decode(v interface{}) (err error) {
                        return
                }
                r := recover()
+               if r == nil {
+                       return
+               }
                _, ok := r.(runtime.Error)
                if ok {
                        panic(r)
                }
-               err, ok = r.(error)
-               if !ok && r != nil {
+               if err, ok = r.(error); !ok {
                        panic(r)
                }
+               // Errors thrown from deeper in parsing are unexpected. At value boundaries, errors should
+               // be returned directly (at least until all the panic nonsense is removed entirely).
+               if err == io.EOF {
+                       err = io.ErrUnexpectedEOF
+               }
        }()
 
        pv := reflect.ValueOf(v)
@@ -566,7 +573,7 @@ func (d *Decoder) parseValue(v reflect.Value) (bool, error) {
 
        b, err := d.r.ReadByte()
        if err != nil {
-               panic(err)
+               return false, err
        }
        d.Offset++