diff options
author | Dimitri John Ledkov <xnox@ubuntu.com> | 2017-05-12 12:32:07 +0100 |
---|---|---|
committer | Dimitri John Ledkov <xnox@ubuntu.com> | 2017-05-12 12:32:07 +0100 |
commit | 77b19ed5f259bc62680acf2b1a3454baa2472bc5 (patch) | |
tree | 7441d8d057c09e54c8ea23c984f2ccdf22c98649 /super-gpt.c | |
parent | ca114f3c76374493f0fd64f8ea0a9b96ae9b1dc5 (diff) |
New upstream release.
Diffstat (limited to 'super-gpt.c')
-rw-r--r-- | super-gpt.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/super-gpt.c b/super-gpt.c index 1a2adce0..8b080a05 100644 --- a/super-gpt.c +++ b/super-gpt.c @@ -73,6 +73,7 @@ static int load_gpt(struct supertype *st, int fd, char *devname) struct MBR *super; struct GPT *gpt_head; int to_read; + unsigned int sector_size; free_gpt(st); @@ -81,6 +82,11 @@ static int load_gpt(struct supertype *st, int fd, char *devname) return 1; } + if (!get_dev_sector_size(fd, devname, §or_size)) { + free(super); + return 1; + } + lseek(fd, 0, 0); if (read(fd, super, sizeof(*super)) != sizeof(*super)) { no_read: @@ -100,6 +106,8 @@ static int load_gpt(struct supertype *st, int fd, char *devname) free(super); return 1; } + /* Set offset to second block (GPT header) */ + lseek(fd, sector_size, SEEK_SET); /* Seem to have GPT, load the header */ gpt_head = (struct GPT*)(super+1); if (read(fd, gpt_head, sizeof(*gpt_head)) != sizeof(*gpt_head)) @@ -111,6 +119,8 @@ static int load_gpt(struct supertype *st, int fd, char *devname) to_read = __le32_to_cpu(gpt_head->part_cnt) * sizeof(struct GPT_part_entry); to_read = ((to_read+511)/512) * 512; + /* Set offset to third block (GPT entries) */ + lseek(fd, sector_size*2, SEEK_SET); if (read(fd, gpt_head+1, to_read) != to_read) goto no_read; |