diff --git a/libisofs/ecma119.c b/libisofs/ecma119.c index b275ba7..4ab02ec 100644 --- a/libisofs/ecma119.c +++ b/libisofs/ecma119.c @@ -1374,6 +1374,8 @@ ex: /* @param flag bit0= initialize system area by target->opts_overwrite bit1= fifo is not yet draining. Inquire write_count from fifo. + bit2= target->opts->ms_block is not counted in + target->total_size */ static 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) */ if ((flag & 1) && target->opts_overwrite != NULL) 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) goto write_error; 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; /* System area and volume descriptors */ - res = write_head_part1(target, &write_count, 0); + res = write_head_part1(target, &write_count, 4); if (res < 0) return res; diff --git a/libisofs/system_area.c b/libisofs/system_area.c index c843430..55890cc 100644 --- a/libisofs/system_area.c +++ b/libisofs/system_area.c @@ -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 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) - 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 gpt_blocks = img_blocks; ret = iso_write_gpt(t, gpt_blocks, buf); @@ -2146,7 +2150,8 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf) #endif 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 */ } else { mbrp1_blocks = img_blocks; diff --git a/libisofs/system_area.h b/libisofs/system_area.h index 382b396..a91edbb 100644 --- a/libisofs/system_area.h +++ b/libisofs/system_area.h @@ -42,10 +42,12 @@ int make_isohybrid_mbr(int bin_lba, int *img_blocks, char *mbr, int flag); * * @param buf * A buffer with at least 32 K allocated + * @param flag + * bit0= t->opts->ms_block is not counted in t->total_size * @return * 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.