mirror of
https://git.savannah.gnu.org/git/grub.git
synced 2026-10-25 08:39:28 +00:00
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:
1 parent
c32865bfcf
commit
b0dfd29ab2
2 files changed
+26
-8
No files matched your search
@@ -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)
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user