Bug fix: HFS+ production could cause MBR partition of type 0xEE without GPT.

This commit is contained in:
Thomas Schmitt 2015-12-20 18:46:44 +01:00
parent 4c9cb6b96b
commit cd0f57dd1a
1 changed files with 24 additions and 4 deletions

View File

@ -1676,7 +1676,7 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
int ret, int_img_blocks, sa_type, i, will_append = 0, do_isohybrid = 0; int ret, int_img_blocks, sa_type, i, will_append = 0, do_isohybrid = 0;
int first_partition = 1, last_partition = 4, apm_flag, part_type = 0; int first_partition = 1, last_partition = 4, apm_flag, part_type = 0;
int gpt_count = 0, gpt_idx[128], apm_count = 0, no_boot_mbr = 0; int gpt_count = 0, gpt_idx[128], apm_count = 0, no_boot_mbr = 0;
int offset_flag = 0; int offset_flag = 0, risk_of_ee = 0;
uint32_t img_blocks, gpt_blocks, mbrp1_blocks, pml_blocks; uint32_t img_blocks, gpt_blocks, mbrp1_blocks, pml_blocks;
uint64_t blk; uint64_t blk;
uint8_t *wpt; uint8_t *wpt;
@ -1767,8 +1767,11 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
"Cannot set up MBR partition table"); "Cannot set up MBR partition table");
return ret; return ret;
} }
if (t->mbr_req_count > 0 && sa_type != 0) if (t->mbr_req_count > 0) {
if (sa_type != 0)
return ISO_NON_MBR_SYS_AREA; return ISO_NON_MBR_SYS_AREA;
risk_of_ee = 1;
}
if (t->gpt_backup_outside) if (t->gpt_backup_outside)
gpt_blocks = t->total_size / BLOCK_SIZE + t->opts->ms_block; gpt_blocks = t->total_size / BLOCK_SIZE + t->opts->ms_block;
@ -1796,6 +1799,7 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
(uint8_t) part_type, buf, 0); (uint8_t) part_type, buf, 0);
if (ret != ISO_SUCCESS) /* error should never happen */ if (ret != ISO_SUCCESS) /* error should never happen */
return ISO_ASSERT_FAILURE; return ISO_ASSERT_FAILURE;
risk_of_ee = 1;
} }
} else if (do_isohybrid) { } else if (do_isohybrid) {
/* Patch externally provided system area as isohybrid MBR */ /* Patch externally provided system area as isohybrid MBR */
@ -1813,6 +1817,7 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
if (t->opts->appended_as_gpt && t->have_appended_partitions) { if (t->opts->appended_as_gpt && t->have_appended_partitions) {
part_type = 0xee; part_type = 0xee;
risk_of_ee = 1;
img_blocks = gpt_blocks; img_blocks = gpt_blocks;
no_boot_mbr = 2; no_boot_mbr = 2;
} }
@ -1855,9 +1860,11 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
(uint8_t) 0xcd, buf, 2); (uint8_t) 0xcd, buf, 2);
if (ret != ISO_SUCCESS) /* error should never happen */ if (ret != ISO_SUCCESS) /* error should never happen */
return ISO_ASSERT_FAILURE; return ISO_ASSERT_FAILURE;
risk_of_ee = 1;
if (t->opts->appended_as_gpt && t->have_appended_partitions) { if (t->opts->appended_as_gpt && t->have_appended_partitions) {
/* Re-write partion entry 1 : protective MBR for GPT */ /* Re-write partion entry 1 : protective MBR for GPT */
part_type = 0xee; part_type = 0xee;
risk_of_ee = 1;
ret = write_mbr_partition_entry(1, part_type, ret = write_mbr_partition_entry(1, part_type,
(uint64_t) 1, ((uint64_t) gpt_blocks) * 4 - 1, (uint64_t) 1, ((uint64_t) gpt_blocks) * 4 - 1,
t->partition_secs_per_head, t->partition_heads_per_cyl, t->partition_secs_per_head, t->partition_heads_per_cyl,
@ -1881,7 +1888,7 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
With t->mbr_req_count > 0 this has already been done, With t->mbr_req_count > 0 this has already been done,
*/ */
img_blocks = t->curblock; /* value might be altered */ img_blocks = t->curblock; /* value might be altered */
if (part_type == 0xee) { if (part_type == 0xee && t->gpt_req_count > 0) {
mbrp1_blocks = t->total_size / BLOCK_SIZE + t->opts->ms_block; mbrp1_blocks = t->total_size / BLOCK_SIZE + t->opts->ms_block;
offset_flag |= 2 | 1; /* protective MBR, no other partitions */ offset_flag |= 2 | 1; /* protective MBR, no other partitions */
} else { } else {
@ -1933,6 +1940,19 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
wpt[i] = blk >> (i * 8); wpt[i] = blk >> (i * 8);
} }
/* Prevent partition type 0xee if no GPT emerged */
if (sa_type == 0 && ((t->system_area_options & 3) || risk_of_ee) &&
t->gpt_req_count == 0) {
for (i = 0; i < 4; i++) {
if (buf[446 + 16 * i + 4] == 0xee) {
iso_msgs_submit(0,
"Prevented partition type 0xEE in MBR without GPT",
0, "WARNING", 0);
buf[446 + 16 * i + 4] = 0xcd;
}
}
}
return ISO_SUCCESS; return ISO_SUCCESS;
} }