diff --git a/cpio/cpio.go b/cpio/cpio.go index 8e4bba1..a8b1964 100644 --- a/cpio/cpio.go +++ b/cpio/cpio.go @@ -146,12 +146,34 @@ func (cr *countingReader) Seek(offset int64, whence int) (int64, error) { if offset == 0 { return cr.curPos, nil } - b := make([]byte, offset) - n, err := io.ReadFull(cr, b) - if err != nil && err != io.EOF { - return 0, err + totalRead := int64(0) + const chunkSize = int64(1024 * 1024) + buf := make([]byte, chunkSize) + + remaining := offset + for remaining > 0 { + // Define chunk size to read + toRead := chunkSize + if remaining < chunkSize { + toRead = remaining + } + + n, err := cr.Read(buf[:toRead]) + totalRead += int64(n) + remaining -= int64(n) + if err != nil && err != io.EOF { + // If all was read, skip error + if totalRead >= offset { + err = nil + } + return 0, err + } + + if err == io.EOF { + break + } } - return int64(n), nil + return totalRead, nil } func pad(num int) int {