Corrected size of GPT protective MBR partition with multi-session emulation

This commit is contained in:
Thomas Schmitt 2020-11-26 11:49:58 +01:00
parent c068a19a8c
commit 8f3ff65c04
3 changed files with 15 additions and 6 deletions

View File

@ -1374,6 +1374,8 @@ ex:
/* @param flag bit0= initialize system area by target->opts_overwrite /* @param flag bit0= initialize system area by target->opts_overwrite
bit1= fifo is not yet draining. Inquire write_count from fifo. bit1= fifo is not yet draining. Inquire write_count from fifo.
bit2= target->opts->ms_block is not counted in
target->total_size
*/ */
static static
int write_head_part1(Ecma119Image *target, int *write_count, int flag) int write_head_part1(Ecma119Image *target, int *write_count, int flag)
@ -1396,7 +1398,7 @@ int write_head_part1(Ecma119Image *target, int *write_count, int flag)
/* Write System Area (ECMA-119, 6.2.1) */ /* Write System Area (ECMA-119, 6.2.1) */
if ((flag & 1) && target->opts_overwrite != NULL) if ((flag & 1) && target->opts_overwrite != NULL)
memcpy(sa, target->opts_overwrite, 16 * BLOCK_SIZE); memcpy(sa, target->opts_overwrite, 16 * BLOCK_SIZE);
res = iso_write_system_area(target, sa); res = iso_write_system_area(target, sa, (flag & 4) >> 2);
if (res < 0) if (res < 0)
goto write_error; goto write_error;
res = iso_write(target, sa, 16 * BLOCK_SIZE); res = iso_write(target, sa, 16 * BLOCK_SIZE);
@ -1500,7 +1502,7 @@ int write_head_part(Ecma119Image *target, int flag)
int res, write_count = 0; int res, write_count = 0;
/* System area and volume descriptors */ /* System area and volume descriptors */
res = write_head_part1(target, &write_count, 0); res = write_head_part1(target, &write_count, 4);
if (res < 0) if (res < 0)
return res; return res;

View File

@ -1875,7 +1875,10 @@ static void iso_dummy_mbr_partition(uint8_t *buf, int mode)
} }
int iso_write_system_area(Ecma119Image *t, uint8_t *buf) /* @param flag
bit0= t->opts->ms_block is not counted in t->total_size
*/
int iso_write_system_area(Ecma119Image *t, uint8_t *buf, int flag)
{ {
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;
@ -1984,7 +1987,8 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
} }
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 +
(flag & 1) * t->opts->ms_block;
else else
gpt_blocks = img_blocks; gpt_blocks = img_blocks;
ret = iso_write_gpt(t, gpt_blocks, buf); ret = iso_write_gpt(t, gpt_blocks, buf);
@ -2146,7 +2150,8 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
#endif #endif
if (part_type == 0xee && t->gpt_req_count > 0) { 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 +
(flag & 1) * t->opts->ms_block;
offset_flag |= 2 | 1; /* protective MBR, no other partitions */ offset_flag |= 2 | 1; /* protective MBR, no other partitions */
} else { } else {
mbrp1_blocks = img_blocks; mbrp1_blocks = img_blocks;

View File

@ -42,10 +42,12 @@ int make_isohybrid_mbr(int bin_lba, int *img_blocks, char *mbr, int flag);
* *
* @param buf * @param buf
* A buffer with at least 32 K allocated * A buffer with at least 32 K allocated
* @param flag
* bit0= t->opts->ms_block is not counted in t->total_size
* @return * @return
* 1 if success, < 0 on error * 1 if success, < 0 on error
*/ */
int iso_write_system_area(Ecma119Image *t, uint8_t *buf); int iso_write_system_area(Ecma119Image *t, uint8_t *buf, int flag);
/** /**
* Adjust t->tail_blocks to the eventual alignment needs of isohybrid booting. * Adjust t->tail_blocks to the eventual alignment needs of isohybrid booting.