bencode/decode.go | 13 ++++++++++--- diff --git a/bencode/decode.go b/bencode/decode.go index 67c25a33ab92af61f8cbd48ee6719b5cc99bfd1a..1007db906c58eeafd46b282c2348d1f509122ded 100644 --- a/bencode/decode.go +++ b/bencode/decode.go @@ -37,13 +37,20 @@ if err != nil { 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 } }() @@ -566,7 +573,7 @@ } b, err := d.r.ReadByte() if err != nil { - panic(err) + return false, err } d.Offset++