2011-03-14 Colin Watson <cjwatson@ubuntu.com>
+ * include/grub/partition.h (grub_partition_map): Change prototype of
+ embed to take a maximum value for nsectors.
* grub-core/partmap/msdos.c (embed_signatures): New array.
(pc_partition_map_embed): Check for and avoid sectors matching any
- of the signatures in embed_signatures.
+ of the signatures in embed_signatures, up to max_nsectors.
+ * grub-core/partmap/gpt.c (gpt_partition_map_embed): Restrict
+ returned sector map to max_nsectors.
* util/grub-setup.c (setup): Allow for the embedding area being
- split into multiple blocklists.
+ split into multiple blocklists. Tell dest_partmap->embed the
+ maximum number of sectors we care about.
#ifdef GRUB_UTIL
static grub_err_t
gpt_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
+ unsigned int max_nsectors,
grub_embed_type_t embed_type,
grub_disk_addr_t **sectors)
{
" embedding won't be possible!");
*nsectors = len;
+ if (*nsectors > max_nsectors)
+ *nsectors = max_nsectors;
*sectors = grub_malloc (*nsectors * sizeof (**sectors));
if (!*sectors)
return grub_errno;
#ifdef GRUB_UTIL
static grub_err_t
pc_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
+ unsigned int max_nsectors,
grub_embed_type_t embed_type,
grub_disk_addr_t **sectors)
{
{
unsigned i, j;
char *embed_signature_check;
- unsigned int orig_nsectors;
+ unsigned int orig_nsectors, avail_nsectors;
orig_nsectors = *nsectors;
*nsectors = end - 2;
+ avail_nsectors = *nsectors;
+ if (*nsectors > max_nsectors)
+ *nsectors = max_nsectors;
*sectors = grub_malloc (*nsectors * sizeof (**sectors));
if (!*sectors)
return grub_errno;
"future. Please ask its authors not to store data "
"in the boot track",
(*sectors)[i], embed_signatures[j].name);
- (*nsectors)--;
+ avail_nsectors--;
+ if (avail_nsectors < *nsectors)
+ *nsectors = avail_nsectors;
/* Avoid this sector. */
for (j = i; j < *nsectors; j++)
(*sectors)[j]++;
+
+ /* Have we run out of space? */
+ if (avail_nsectors < orig_nsectors)
+ break;
+
+ /* Make sure to check the next sector. */
+ i--;
}
grub_free (embed_signature_check);
#ifdef GRUB_UTIL
/* Determine sectors available for embedding. */
grub_err_t (*embed) (struct grub_disk *disk, unsigned int *nsectors,
+ unsigned int max_nsectors,
grub_embed_type_t embed_type,
grub_disk_addr_t **sectors);
#endif
}
nsec = core_sectors;
- err = dest_partmap->embed (dest_dev->disk, &nsec,
+ err = dest_partmap->embed (dest_dev->disk, &nsec, 2 * core_sectors,
GRUB_EMBED_PCBIOS, §ors);
- if (nsec > 2 * core_sectors)
- nsec = 2 * core_sectors;
if (err)
{