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.
This commit is contained in:
bean 2008-02-06 19:57:40 +00:00
parent c32865bfcf
commit b0dfd29ab2
2 changed files with 26 additions and 8 deletions

View file

@ -1,3 +1,15 @@
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

View file

@ -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)
{