From 071ade67ae490c4cc091c1af8ae64869b1d5c2b2 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Fri, 7 Jan 2022 19:06:33 +1100 Subject: [PATCH] bencode: Return ErrUnexpectedEOF instead of EOF in the middle of values --- bencode/decode.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) 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++ -- 2.44.0