=== modified file 'io/xzio.c' --- io/xzio.c 2010-04-08 21:44:23 +0000 +++ io/xzio.c 2010-04-10 22:46:52 +0000 @@ -245,8 +245,6 @@ int offset_lock; grub_uint8_t current_offset; - xzio->buf.out_size = len >= XZBUFSIZ ? XZBUFSIZ : len; - /* If seek backward need to reset decoder and start from beginning of file. TODO Possible improvement by jumping blocks. */ if (file->offset < xzio->saved_offset) @@ -259,18 +257,19 @@ grub_file_seek (xzio->file, 0); } - offset_lock = (file->offset == xzio->saved_offset) ? 1 : 0; - current_offset = xzio->saved_offset; - - while (len >= xzio->buf.out_size) + while (len > 0) { + xzio->buf.out_size = len >= XZBUFSIZ ? XZBUFSIZ : len; + + offset_lock = (file->offset == xzio->saved_offset) ? 1 : 0; + current_offset = xzio->saved_offset; + /* Feed input. */ if (xzio->buf.in_pos == xzio->buf.in_size) { readret = grub_file_read (xzio->file, xzio->inbuf, XZBUFSIZ); if (readret < 0) return -1; - xzio->buf.in_size = readret; xzio->buf.in_pos = 0; } @@ -317,7 +316,7 @@ } xzio->buf.out_pos = 0; - if (xzret == XZ_STREAM_END) /* Stream end, EOF. */ + if (xzret == XZ_STREAM_END) /* Stream end, EOF. */ break; }