diff --git a/ChangeLog b/ChangeLog index a6ff8faf0..e69d6332d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2008-02-06 Christian Franke + + * fs/cpio.c (grub_cpio_find_file): Return GRUB_ERR_NONE + (and set *ofs = 0) instead of GRUB_ERR_FILE_NOT_FOUND on + last block of a cpio or tar stream. + Check for "TRAILER!!!" instead of any empty data + block to detect last block of a cpio stream. + (grub_cpio_dir): Fix constness of variable np. + (grub_cpio_open): Return GRUB_ERR_FILE_NOT_FOUND if + cpio or tar trailer is detected. This fixes a crash + on open of a non existing file. + 2008-02-05 Bean * loader/i386/pc/multiboot.c (grub_multiboot_load_elf32): Get physical diff --git a/fs/cpio.c b/fs/cpio.c index fcf614a41..ad9f2a85e 100644 --- a/fs/cpio.c +++ b/fs/cpio.c @@ -98,11 +98,6 @@ grub_cpio_find_file (struct grub_cpio_data *data, char **name, 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_data *data, char **name, 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_data *data, char **name, 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, const char *path, { 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 char *name) goto fail; if (!ofs) - break; + { + grub_error (GRUB_ERR_FILE_NOT_FOUND, "file not found"); + break; + } if (grub_strcmp (name + 1, fn) == 0) {