From: Matt Joiner Date: Fri, 7 Jan 2022 08:06:33 +0000 (+1100) Subject: bencode: Return ErrUnexpectedEOF instead of EOF in the middle of values X-Git-Tag: v1.41.0~29 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=071ade67ae490c4cc091c1af8ae64869b1d5c2b2;p=btrtrc.git bencode: Return ErrUnexpectedEOF instead of EOF in the middle of values --- diff --git a/bencode/decode.go b/bencode/decode.go index 67c25a33..1007db90 100644 --- a/bencode/decode.go +++ b/bencode/decode.go @@ -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++