+2008-02-06 Christian Franke <franke@computer.org>
+
+ * 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 <bean123ch@gmail.com>
* loader/i386/pc/multiboot.c (grub_multiboot_load_elf32): Get physical
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++;
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)
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))
{
struct grub_cpio_data *data;
grub_uint32_t ofs;
- char *prev, *name, *np;
+ char *prev, *name;
+ const char *np;
int len;
#ifndef GRUB_UTIL
goto fail;
if (!ofs)
- break;
+ {
+ grub_error (GRUB_ERR_FILE_NOT_FOUND, "file not found");
+ break;
+ }
if (grub_strcmp (name + 1, fn) == 0)
{