~ubuntu-branches/ubuntu/trusty/grub2/trusty-updates

« back to all changes in this revision

Viewing changes to kern/partition.c

  • Committer: Bazaar Package Importer
  • Author(s): Colin Watson
  • Date: 2010-07-21 10:10:21 UTC
  • mto: (17.6.16 experimental) (1.26.4 upstream)
  • mto: This revision was merged to the branch mainline in revision 76.
  • Revision ID: james.westby@ubuntu.com-20100721101021-49cpjklxtr2us40d
Tags: upstream-1.98+20100720
ImportĀ upstreamĀ versionĀ 1.98+20100720

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
#include <grub/partition.h>
22
22
#include <grub/disk.h>
23
23
 
 
24
#ifdef GRUB_UTIL
 
25
#include <grub/util/misc.h>
 
26
#endif
 
27
 
24
28
grub_partition_map_t grub_partition_map_list;
25
29
 
 
30
/*
 
31
 * Checks that disk->partition contains part.  This function assumes that the
 
32
 * start of part is relative to the start of disk->partition.  Returns 1 if
 
33
 * disk->partition is null.
 
34
 */
 
35
static int
 
36
grub_partition_check_containment (const grub_disk_t disk,
 
37
                                  const grub_partition_t part)
 
38
{
 
39
  if (disk->partition == NULL)
 
40
    return 1;
 
41
 
 
42
  if (part->start + part->len > disk->partition->len)
 
43
    {
 
44
      char *partname;
 
45
 
 
46
      partname = grub_partition_get_name (disk->partition);
 
47
      grub_dprintf ("partition", "sub-partition %s%d of (%s,%s) ends after parent.\n",
 
48
                    part->partmap->name, part->number + 1, disk->name, partname);
 
49
#ifdef GRUB_UTIL
 
50
      grub_util_warn ("Discarding improperly nested partition (%s,%s,%s%d)",
 
51
                      disk->name, partname, part->partmap->name, part->number + 1);
 
52
#endif
 
53
      grub_free (partname);
 
54
 
 
55
      return 0;
 
56
    }
 
57
 
 
58
  return 1;
 
59
}
 
60
 
26
61
static grub_partition_t
27
62
grub_partition_map_probe (const grub_partition_map_t partmap,
28
63
                          grub_disk_t disk, int partnum)
31
66
 
32
67
  auto int find_func (grub_disk_t d, const grub_partition_t partition);
33
68
 
34
 
  int find_func (grub_disk_t d __attribute__ ((unused)),
 
69
  int find_func (grub_disk_t dsk,
35
70
                 const grub_partition_t partition)
36
71
    {
37
 
      if (partnum == partition->number)
38
 
        {
39
 
          p = (grub_partition_t) grub_malloc (sizeof (*p));
40
 
          if (! p)
41
 
            return 1;
42
 
 
43
 
          grub_memcpy (p, partition, sizeof (*p));
44
 
          return 1;
45
 
        }
46
 
 
47
 
      return 0;
 
72
      if (partnum != partition->number)
 
73
        return 0;
 
74
 
 
75
      if (!(grub_partition_check_containment (dsk, partition)))
 
76
        return 0;
 
77
 
 
78
      p = (grub_partition_t) grub_malloc (sizeof (*p));
 
79
      if (! p)
 
80
        return 1;
 
81
 
 
82
      grub_memcpy (p, partition, sizeof (*p));
 
83
      return 1;
48
84
    }
49
85
 
50
86
  partmap->iterate (disk, find_func);
138
174
                    const grub_partition_t partition)
139
175
    {
140
176
      struct grub_partition p = *partition;
 
177
 
 
178
      if (!(grub_partition_check_containment (dsk, partition)))
 
179
        return 0;
 
180
 
141
181
      p.parent = dsk->partition;
142
182
      dsk->partition = 0;
143
183
      if (hook (dsk, &p))