--- grub2.orig/fs/cpio.c 2008-02-03 20:29:51.718750000 +0100 +++ grub2/fs/cpio.c 2008-02-05 22:59:50.031250000 +0100 @@ -98,11 +98,6 @@ grub_cpio_find_file (struct grub_cpio_da return grub_error (GRUB_ERR_BAD_FS, "Invalid cpio archive"); data->size = (((grub_uint32_t) hd.filesize_1) << 16) + hd.filesize_2; - if (data->size == 0) - { - *ofs = 0; - return GRUB_ERR_FILE_NOT_FOUND; - } if (hd.namesize & 1) hd.namesize++; @@ -117,6 +112,13 @@ grub_cpio_find_file (struct grub_cpio_da return grub_errno; } + if (data->size == 0 && hd.mode == 0 && hd.namesize == 11 + 1 + && ! grub_memcmp(*name, "TRAILER!!!", 11)) + { + *ofs = 0; + return GRUB_ERR_NONE; + } + data->dofs = data->hofs + sizeof (hd) + hd.namesize; *ofs = data->dofs + data->size; if (data->size & 1) @@ -133,7 +135,7 @@ grub_cpio_find_file (struct grub_cpio_da if (!hd.name[0]) { *ofs = 0; - return GRUB_ERR_FILE_NOT_FOUND; + return GRUB_ERR_NONE; } if (grub_memcmp (hd.magic, MAGIC_USTAR, sizeof (MAGIC_USTAR) - 1)) @@ -188,7 +190,8 @@ grub_cpio_dir (grub_device_t device, con { struct grub_cpio_data *data; grub_uint32_t ofs; - char *prev, *name, *np; + char *prev, *name; + const char *np; int len; #ifndef GRUB_UTIL @@ -275,7 +278,10 @@ grub_cpio_open (grub_file_t file, const goto fail; if (!ofs) - break; + { + grub_error (GRUB_ERR_FILE_NOT_FOUND, "file not found"); + break; + } if (grub_strcmp (name + 1, fn) == 0) {