diff --git a/lzma/bytereader.go b/lzma/bytereader.go new file mode 100644 index 0000000..d74840b --- /dev/null +++ b/lzma/bytereader.go @@ -0,0 +1,28 @@ +package lzma + +import ( + "io" +) + +func limitByteReader(br io.ByteReader, n int64) *limitedByteReader { + return &limitedByteReader{ + BR: br, + N: n, + } +} + +type limitedByteReader struct { + BR io.ByteReader + N int64 +} + +func (r *limitedByteReader) ReadByte() (b byte, err error) { + if r.N <= 0 { + return 0, io.EOF + } + b, err = r.BR.ReadByte() + if err == nil { + r.N -= 1 + } + return +} diff --git a/lzma/reader2.go b/lzma/reader2.go index f36e265..0c47adc 100644 --- a/lzma/reader2.go +++ b/lzma/reader2.go @@ -107,7 +107,7 @@ func (r *Reader2) startChunk() error { r.chunkReader = r.ur return nil } - br := ByteReader(io.LimitReader(r.r, int64(header.compressed)+1)) + br := limitByteReader(ByteReader(r.r), int64(header.compressed)+1) if r.decoder == nil { state := newState(header.props) r.decoder, err = newDecoder(br, state, r.dict, size)