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:
parent
c32865bfcf
commit
b0dfd29ab2
2 changed files with 26 additions and 8 deletions
12
ChangeLog
12
ChangeLog
|
@ -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
|
||||
|
|
22
fs/cpio.c
22
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)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue