=== modified file 'ChangeLog' --- ChangeLog 2011-01-15 00:03:32 +0000 +++ ChangeLog 2011-01-15 00:08:24 +0000 @@ -1,5 +1,12 @@ 2011-01-15 Szymon Janc + * grub-core/io/xzio.c (test_footer): Return true for not seekable file. + (grub_xzio_open): FIXME comment removed. + (grub_xzio_read): Set real size for unknown size file when it is known. + Handle NULL buffer pointer. + +2011-01-15 Szymon Janc + * grub-core/io/gzio.c (test_header): For not seekable files: don't check footer and set size to unknown. (inflate_window): Set real size for unknown size file when it is === modified file 'grub-core/io/xzio.c' --- grub-core/io/xzio.c 2010-12-26 20:15:31 +0000 +++ grub-core/io/xzio.c 2011-01-15 00:08:24 +0000 @@ -129,6 +129,10 @@ test_footer (grub_file_t file) grub_uint64_t uncompressed_size; grub_uint64_t records; + /* Don't test footer on not easily seekable files. */ + if (! grub_file_seekable(xzio->file)) + return 1; + grub_file_seek (xzio->file, xzio->file->size - FOOTER_MAGIC_SIZE); if (grub_file_read (xzio->file, footer, FOOTER_MAGIC_SIZE) != FOOTER_MAGIC_SIZE @@ -222,7 +226,6 @@ grub_xzio_open (grub_file_t io) xzio->buf.out_pos = 0; xzio->buf.out_size = XZBUFSIZ; - /* FIXME: don't test footer on not easily seekable files. */ if (!test_header (file) || !test_footer (file)) { grub_errno = GRUB_ERR_NONE; @@ -297,10 +300,14 @@ grub_xzio_read (grub_file_t file, char * /* Store first chunk of data in buffer. */ { grub_size_t delta = new_offset - (file->offset + ret); - grub_memmove (buf, xzio->buf.out + (xzio->buf.out_pos - delta), + + if (buf) + { + grub_memmove (buf, xzio->buf.out + (xzio->buf.out_pos - delta), delta); + buf += delta; + } len -= delta; - buf += delta; ret += delta; } current_offset = new_offset; @@ -308,7 +315,11 @@ grub_xzio_read (grub_file_t file, char * xzio->buf.out_pos = 0; if (xzret == XZ_STREAM_END) /* Stream end, EOF. */ - break; + { + if(file->size == GRUB_FILE_SIZE_UNKNOWN) + file->size = file->offset + ret; + break; + } } if (ret >= 0)