=== modified file 'ChangeLog' --- ChangeLog 2011-01-14 23:53:37 +0000 +++ ChangeLog 2011-01-15 00:03:32 +0000 @@ -1,5 +1,13 @@ 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 + known. + (grub_gzio_read): Handle NULL buffer pointer. + +2011-01-15 Szymon Janc + * grub-core/kern/file.c (grub_file_read): Handle unknown file size. (grub_file_seek): Likewise. === modified file 'grub-core/io/gzio.c' --- grub-core/io/gzio.c 2010-12-26 20:15:31 +0000 +++ grub-core/io/gzio.c 2011-01-15 00:03:32 +0000 @@ -212,7 +212,7 @@ test_header (grub_file_t file) gzio->data_offset = grub_file_tell (gzio->file); - /* FIXME: don't do this on not easily seekable files. */ + if(grub_file_seekable(gzio->file)) { grub_file_seek (gzio->file, grub_file_size (gzio->file) - 4); if (grub_file_read (gzio->file, &orig_len, 4) != 4) @@ -224,6 +224,8 @@ test_header (grub_file_t file) But how can we know the real original size? */ file->size = grub_le_to_cpu32 (orig_len); } + else + file->size = GRUB_FILE_SIZE_UNKNOWN; initialize_tables (file); @@ -1034,7 +1036,11 @@ inflate_window (grub_file_t file) if (! gzio->block_len) { if (gzio->last_block) - break; + { + if (file->size == GRUB_FILE_SIZE_UNKNOWN) + file->size = file->offset + gzio->wp; + break; + } get_new_block (file); } @@ -1186,9 +1192,11 @@ grub_gzio_read (grub_file_t file, char * if (size > len) size = len; - grub_memmove (buf, srcaddr, size); - - buf += size; + if (buf) + { + grub_memmove (buf, srcaddr, size); + buf += size; + } len -= size; ret += size; offset += size;