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>
|
2008-02-05 Bean <bean123ch@gmail.com>
|
||||||
|
|
||||||
* loader/i386/pc/multiboot.c (grub_multiboot_load_elf32): Get physical
|
* 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");
|
return grub_error (GRUB_ERR_BAD_FS, "Invalid cpio archive");
|
||||||
|
|
||||||
data->size = (((grub_uint32_t) hd.filesize_1) << 16) + hd.filesize_2;
|
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)
|
if (hd.namesize & 1)
|
||||||
hd.namesize++;
|
hd.namesize++;
|
||||||
|
@ -117,6 +112,13 @@ grub_cpio_find_file (struct grub_cpio_data *data, char **name,
|
||||||
return grub_errno;
|
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;
|
data->dofs = data->hofs + sizeof (hd) + hd.namesize;
|
||||||
*ofs = data->dofs + data->size;
|
*ofs = data->dofs + data->size;
|
||||||
if (data->size & 1)
|
if (data->size & 1)
|
||||||
|
@ -133,7 +135,7 @@ grub_cpio_find_file (struct grub_cpio_data *data, char **name,
|
||||||
if (!hd.name[0])
|
if (!hd.name[0])
|
||||||
{
|
{
|
||||||
*ofs = 0;
|
*ofs = 0;
|
||||||
return GRUB_ERR_FILE_NOT_FOUND;
|
return GRUB_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (grub_memcmp (hd.magic, MAGIC_USTAR, sizeof (MAGIC_USTAR) - 1))
|
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;
|
struct grub_cpio_data *data;
|
||||||
grub_uint32_t ofs;
|
grub_uint32_t ofs;
|
||||||
char *prev, *name, *np;
|
char *prev, *name;
|
||||||
|
const char *np;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
#ifndef GRUB_UTIL
|
#ifndef GRUB_UTIL
|
||||||
|
@ -275,7 +278,10 @@ grub_cpio_open (grub_file_t file, const char *name)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
if (!ofs)
|
if (!ofs)
|
||||||
break;
|
{
|
||||||
|
grub_error (GRUB_ERR_FILE_NOT_FOUND, "file not found");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (grub_strcmp (name + 1, fn) == 0)
|
if (grub_strcmp (name + 1, fn) == 0)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue