* grub-core/fs/zfs/zfs.c (nvlist_find_value): Check that we don't go
pastthe end.
This commit is contained in:
parent
692dabca8c
commit
28ea58cf69
2 changed files with 23 additions and 2 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2012-01-27 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* grub-core/fs/zfs/zfs.c (nvlist_find_value): Check that we don't go
|
||||||
|
pastthe end.
|
||||||
|
|
||||||
2012-01-27 Vladimir Serbinenko <phcoder@gmail.com>
|
2012-01-27 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
* util/grub-install.in: Add missing \.
|
* util/grub-install.in: Add missing \.
|
||||||
|
|
|
@ -3039,12 +3039,12 @@ dnode_get_fullpath (const char *fullpath, struct subvolume *subvol,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int
|
static int
|
||||||
nvlist_find_value (const char *nvlist, const char *name,
|
nvlist_find_value (const char *nvlist_in, const char *name,
|
||||||
int valtype, char **val,
|
int valtype, char **val,
|
||||||
grub_size_t *size_out, grub_size_t *nelm_out)
|
grub_size_t *size_out, grub_size_t *nelm_out)
|
||||||
{
|
{
|
||||||
int name_len, type, encode_size;
|
int name_len, type, encode_size;
|
||||||
const char *nvpair, *nvp_name;
|
const char *nvpair, *nvp_name, *nvlist = nvlist_in;
|
||||||
|
|
||||||
/* Verify if the 1st and 2nd byte in the nvlist are valid. */
|
/* Verify if the 1st and 2nd byte in the nvlist are valid. */
|
||||||
/* NOTE: independently of what endianness header announces all
|
/* NOTE: independently of what endianness header announces all
|
||||||
|
@ -3067,6 +3067,13 @@ nvlist_find_value (const char *nvlist, const char *name,
|
||||||
{
|
{
|
||||||
int nelm;
|
int nelm;
|
||||||
|
|
||||||
|
if (nvlist + 4 * 4 >= nvlist_in + VDEV_PHYS_SIZE)
|
||||||
|
{
|
||||||
|
grub_dprintf ("zfs", "nvlist overflow\n");
|
||||||
|
grub_error (GRUB_ERR_BAD_FS, "incorrect nvlist");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
nvpair = nvlist + 4 * 2; /* skip the encode/decode size */
|
nvpair = nvlist + 4 * 2; /* skip the encode/decode size */
|
||||||
|
|
||||||
name_len = grub_be_to_cpu32 (grub_get_unaligned32 (nvpair));
|
name_len = grub_be_to_cpu32 (grub_get_unaligned32 (nvpair));
|
||||||
|
@ -3075,6 +3082,15 @@ nvlist_find_value (const char *nvlist, const char *name,
|
||||||
nvp_name = nvpair;
|
nvp_name = nvpair;
|
||||||
nvpair = nvpair + ((name_len + 3) & ~3); /* align */
|
nvpair = nvpair + ((name_len + 3) & ~3); /* align */
|
||||||
|
|
||||||
|
if (nvpair + 8 >= nvlist_in + VDEV_PHYS_SIZE
|
||||||
|
|| encode_size < 0
|
||||||
|
|| nvpair + 8 + encode_size > nvlist_in + VDEV_PHYS_SIZE)
|
||||||
|
{
|
||||||
|
grub_dprintf ("zfs", "nvlist overflow\n");
|
||||||
|
grub_error (GRUB_ERR_BAD_FS, "incorrect nvlist");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
type = grub_be_to_cpu32 (grub_get_unaligned32 (nvpair));
|
type = grub_be_to_cpu32 (grub_get_unaligned32 (nvpair));
|
||||||
nvpair += 4;
|
nvpair += 4;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue