Merge upstream changes as of April 29th

This commit is contained in:
Michael Marineau 2015-07-31 15:41:48 -07:00
commit c7c750ecc2
267 changed files with 6019 additions and 1963 deletions

View file

@ -234,7 +234,8 @@ grub_bsd_add_meta_ptr (grub_uint32_t type, void **ptr, grub_uint32_t len)
{
struct bsd_tag *p;
for (p = tags;
p->type != (FREEBSD_MODINFO_METADATA | FREEBSD_MODINFOMD_KERNEND);
p && p->type != (FREEBSD_MODINFO_METADATA
| FREEBSD_MODINFOMD_KERNEND);
p = p->next);
if (p)

View file

@ -121,6 +121,24 @@ load_kernel (grub_file_t file, const char *filename,
return grub_multiboot_load_elf (file, filename, buffer);
}
static struct multiboot_header *
find_header (char *buffer, grub_ssize_t len)
{
struct multiboot_header *header;
/* Look for the multiboot header in the buffer. The header should
be at least 12 bytes and aligned on a 4-byte boundary. */
for (header = (struct multiboot_header *) buffer;
((char *) header <= buffer + len - 12);
header = (struct multiboot_header *) ((char *) header + MULTIBOOT_HEADER_ALIGN))
{
if (header->magic == MULTIBOOT_HEADER_MAGIC
&& !(header->magic + header->flags + header->checksum))
return header;
}
return NULL;
}
grub_err_t
grub_multiboot_load (grub_file_t file, const char *filename)
{
@ -143,16 +161,7 @@ grub_multiboot_load (grub_file_t file, const char *filename)
return grub_errno;
}
/* Look for the multiboot header in the buffer. The header should
be at least 12 bytes and aligned on a 4-byte boundary. */
for (header = (struct multiboot_header *) buffer;
((char *) header <= buffer + len - 12) || (header = 0);
header = (struct multiboot_header *) ((char *) header + MULTIBOOT_HEADER_ALIGN))
{
if (header->magic == MULTIBOOT_HEADER_MAGIC
&& !(header->magic + header->flags + header->checksum))
break;
}
header = find_header (buffer, len);
if (header == 0)
{

View file

@ -280,10 +280,13 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
{
case 'g':
shift += 10;
/* Fallthrough. */
case 'm':
shift += 10;
/* Fallthrough. */
case 'k':
shift += 10;
/* Fallthrough. */
default:
break;
}

View file

@ -342,6 +342,7 @@ fill_disk (const char *name, void *data)
if (!plan9name)
{
grub_print_error ();
grub_device_close (dev);
return 0;
}
if (grub_extend_alloc (fill_ctx->pmapptr + grub_strlen (plan9name)
@ -349,6 +350,7 @@ fill_disk (const char *name, void *data)
&fill_ctx->pmap))
{
grub_free (plan9name);
grub_device_close (dev);
return 1;
}
grub_strcpy (fill_ctx->pmap + fill_ctx->pmapptr, plan9name);
@ -366,12 +368,19 @@ fill_disk (const char *name, void *data)
fill_ctx->noslash = 1;
grub_memset (fill_ctx->prefixescnt, 0, sizeof (fill_ctx->prefixescnt));
if (grub_partition_iterate (dev->disk, fill_partition, fill_ctx))
return 1;
{
grub_device_close (dev);
return 1;
}
if (grub_extend_alloc (fill_ctx->pmapptr + 1, &fill_ctx->pmapalloc,
&fill_ctx->pmap))
return 1;
{
grub_device_close (dev);
return 1;
}
fill_ctx->pmap[fill_ctx->pmapptr++] = '\n';
grub_device_close (dev);
return 0;
}

View file

@ -521,7 +521,7 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
{
grub_size_t size = 0;
grub_err_t err;
struct grub_linux_initrd_context initrd_ctx;
struct grub_linux_initrd_context initrd_ctx = { 0, 0, 0 };
grub_relocator_chunk_t ch;
if (argc == 0)

View file

@ -311,14 +311,19 @@ grub_xen_get_infoXX (grub_elf_t elf, struct grub_xen_file_info *xi)
return grub_errno;
if (grub_file_seek (elf->file, elf->ehdr.ehdrXX.e_shoff) == (grub_off_t) -1)
return grub_errno;
{
err = grub_errno;
goto cleanup;
}
if (grub_file_read (elf->file, s0, shsize) != (grub_ssize_t) shsize)
{
if (grub_errno)
return grub_errno;
return grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
err = grub_errno;
else
err = grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
elf->file->name);
goto cleanup;
}
s = (Elf_Shdr *) ((char *) s0 + elf->ehdr.ehdrXX.e_shstrndx * shentsize);
@ -330,18 +335,29 @@ grub_xen_get_infoXX (grub_elf_t elf, struct grub_xen_file_info *xi)
char name[sizeof("__xen_guest")];
grub_memset (name, 0, sizeof (name));
if (grub_file_seek (elf->file, stroff + s->sh_name) == (grub_off_t) -1)
return grub_errno;
{
err = grub_errno;
goto cleanup;
}
if (grub_file_read (elf->file, name, sizeof (name)) != (grub_ssize_t) sizeof (name))
{
if (grub_errno)
return grub_errno;
{
err = grub_errno;
goto cleanup;
}
continue;
}
if (grub_memcmp (name, "__xen_guest",
sizeof("__xen_guest")) != 0)
continue;
return parse_xen_guest (elf, xi, s->sh_offset, s->sh_size);
err = parse_xen_guest (elf, xi, s->sh_offset, s->sh_size);
goto cleanup;
}
return grub_error (GRUB_ERR_BAD_OS, "no XEN note found");
err = grub_error (GRUB_ERR_BAD_OS, "no XEN note found");
cleanup:
grub_free (s0);
return err;
}

View file

@ -126,7 +126,7 @@ guessfsb (void)
{
const grub_uint64_t sane_value = 100000000;
grub_uint32_t manufacturer[3], max_cpuid, capabilities, msrlow;
grub_uint32_t a, b, d;
grub_uint32_t a, b, d, divisor;
if (! grub_cpu_is_cpuid_supported ())
return sane_value;
@ -166,8 +166,10 @@ guessfsb (void)
r = (2000ULL << 32) - v * grub_tsc_rate;
v += r / grub_tsc_rate;
return grub_divmod64 (v, ((msrlow >> 7) & 0x3e) | ((msrlow >> 14) & 1),
0);
divisor = ((msrlow >> 7) & 0x3e) | ((msrlow >> 14) & 1);
if (divisor == 0)
return sane_value;
return grub_divmod64 (v, divisor, 0);
}
struct property_descriptor
@ -741,10 +743,10 @@ grub_cpu_xnu_fill_devicetree (grub_uint64_t *fsbfreq_out)
*((grub_uint64_t *) curval->data) = (grub_addr_t) ptr;
/* Create alias. */
for (j = 0; j < sizeof (table_aliases) / sizeof (table_aliases[0]); j++)
for (j = 0; j < ARRAY_SIZE(table_aliases); j++)
if (grub_memcmp (&table_aliases[j].guid, &guid, sizeof (guid)) == 0)
break;
if (j != sizeof (table_aliases) / sizeof (table_aliases[0]))
if (j != ARRAY_SIZE(table_aliases))
{
curval = grub_xnu_create_value (&(curkey->first_child), "alias");
if (!curval)

View file

@ -79,6 +79,25 @@ grub_multiboot_add_elfsyms (grub_size_t num, grub_size_t entsize,
elf_sections = data;
}
static struct multiboot_header *
find_header (grub_properly_aligned_t *buffer, grub_ssize_t len)
{
struct multiboot_header *header;
/* Look for the multiboot header in the buffer. The header should
be at least 12 bytes and aligned on a 4-byte boundary. */
for (header = (struct multiboot_header *) buffer;
((char *) header <= (char *) buffer + len - 12);
header = (struct multiboot_header *) ((grub_uint32_t *) header + MULTIBOOT_HEADER_ALIGN / 4))
{
if (header->magic == MULTIBOOT_HEADER_MAGIC
&& !(header->magic + header->architecture
+ header->header_length + header->checksum)
&& header->architecture == MULTIBOOT_ARCHITECTURE_CURRENT)
return header;
}
return NULL;
}
grub_err_t
grub_multiboot_load (grub_file_t file, const char *filename)
{
@ -107,18 +126,7 @@ grub_multiboot_load (grub_file_t file, const char *filename)
COMPILE_TIME_ASSERT (MULTIBOOT_HEADER_ALIGN % 4 == 0);
/* Look for the multiboot header in the buffer. The header should
be at least 12 bytes and aligned on a 4-byte boundary. */
for (header = (struct multiboot_header *) buffer;
((char *) header <= (char *) buffer + len - 12) || (header = 0);
header = (struct multiboot_header *) ((grub_uint32_t *) header + MULTIBOOT_HEADER_ALIGN / 4))
{
if (header->magic == MULTIBOOT_HEADER_MAGIC
&& !(header->magic + header->architecture
+ header->header_length + header->checksum)
&& header->architecture == MULTIBOOT_ARCHITECTURE_CURRENT)
break;
}
header = find_header (buffer, len);
if (header == 0)
{
@ -142,7 +150,7 @@ grub_multiboot_load (grub_file_t file, const char *filename)
= (struct multiboot_header_tag_information_request *) tag;
if (request_tag->flags & MULTIBOOT_HEADER_TAG_OPTIONAL)
break;
for (i = 0; i < (request_tag->size - sizeof (request_tag))
for (i = 0; i < (request_tag->size - sizeof (*request_tag))
/ sizeof (request_tag->requests[0]); i++)
switch (request_tag->requests[i])
{

View file

@ -110,7 +110,7 @@ grub_linux_boot (void)
int len = grub_strlen (linux_args) + 1;
if (bp->len < len)
len = bp->len;
memcpy(bp->buf, linux_args, len);
grub_memcpy(bp->buf, linux_args, len);
bp->buf[len-1] = '\0';
bp->valid = 1;
}

View file

@ -689,10 +689,10 @@ grub_xnu_load_driver (char *infoplistname, grub_file_t binaryfile,
/* Allocate the space. */
err = grub_xnu_align_heap (GRUB_XNU_PAGESIZE);
if (err)
return err;
goto fail;
err = grub_xnu_heap_malloc (neededspace, &buf0, &buf_target);
if (err)
return err;
goto fail;
buf = buf0;
exthead = (struct grub_xnu_extheader *) buf;
@ -709,10 +709,7 @@ grub_xnu_load_driver (char *infoplistname, grub_file_t binaryfile,
else
err = grub_macho_readfile32 (macho, filename, buf);
if (err)
{
grub_macho_close (macho);
return err;
}
goto fail;
grub_macho_close (macho);
buf += machosize;
}
@ -747,6 +744,10 @@ grub_xnu_load_driver (char *infoplistname, grub_file_t binaryfile,
/* Announce to kernel */
return grub_xnu_register_memory ("Driver-", &driversnum, buf_target,
neededspace);
fail:
if (macho)
grub_macho_close (macho);
return err;
}
/* Load mkext. */
@ -1378,6 +1379,8 @@ grub_xnu_fill_devicetree (void)
name[len] = 0;
curvalue = grub_xnu_create_value (curkey, name);
if (!curvalue)
return grub_errno;
grub_free (name);
data = grub_malloc (grub_strlen (var->value) + 1);