Bug fix: Division by zero if HFS+ was combined with TOC emulation for overwritable media.

This commit is contained in:
Thomas Schmitt 2013-12-28 16:45:29 +01:00
parent 1be57e34ec
commit 9b4e0b611a
1 changed files with 19 additions and 5 deletions

View File

@ -957,8 +957,11 @@ static int fill_apm_gaps(Ecma119Image *t, uint32_t img_blocks)
uint32_t part_end, goal, block_fac = 1; uint32_t part_end, goal, block_fac = 1;
char gap_name[33]; char gap_name[33];
if (t->apm_req_flags & 4) if (t->apm_req_flags & 4) {
if (t->opts->apm_block_size == 0)
t->opts->apm_block_size = 2048;
block_fac = 2048 / t->opts->apm_block_size; block_fac = 2048 / t->opts->apm_block_size;
}
/* Find out whether an entry with start_block <= 1 is requested */ /* Find out whether an entry with start_block <= 1 is requested */
for (i = 0; i < t->apm_req_count; i++) { for (i = 0; i < t->apm_req_count; i++) {
@ -1077,12 +1080,20 @@ static int iso_write_apm(Ecma119Image *t, uint32_t img_blocks, uint8_t *buf,
0x45, 0x52, 0x02, 0x00, 0xeb, 0x02, 0xff, 0xff 0x45, 0x52, 0x02, 0x00, 0xeb, 0x02, 0xff, 0xff
}; };
if (t->apm_req_flags & 4)
block_fac = 2048 / t->opts->apm_block_size;
if (t->apm_req_count <= 0) if (t->apm_req_count <= 0)
return 2; return 2;
if (t->opts->apm_block_size == 0) {
/* One cannot be sure that all GPT partitions are registered
already. So it is necessary to choose the block size which is
combinable with GPT but not mountable on Linux.
*/
t->opts->apm_block_size = 2048;
}
if (t->apm_req_flags & 4)
block_fac = 2048 / t->opts->apm_block_size;
if (!(t->apm_req_flags & 2)) { if (!(t->apm_req_flags & 2)) {
/* Gaps have been filled. Care for the final one */ /* Gaps have been filled. Care for the final one */
/* Adjust last partition to img_size. This size was not known when the /* Adjust last partition to img_size. This size was not known when the
@ -2062,9 +2073,12 @@ static int precompute_gpt(Ecma119Image *t)
/* Determine GPT partition start in System Area, */ /* Determine GPT partition start in System Area, */
gpt_part_start = 0; gpt_part_start = 0;
if (t->apm_req_count > 0) if (t->apm_req_count > 0) {
if (t->opts->apm_block_size == 0)
t->opts->apm_block_size = 2048;
gpt_part_start = (t->apm_req_count + 1) * gpt_part_start = (t->apm_req_count + 1) *
(t->opts->apm_block_size / 512); (t->opts->apm_block_size / 512);
}
if (gpt_part_start < 2) if (gpt_part_start < 2)
gpt_part_start = 2; gpt_part_start = 2;
else if (gpt_part_start >= 64) else if (gpt_part_start >= 64)