From 8c61d88404230f23a18dc950633f159bb6d2f25d Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Fri, 22 Mar 2024 22:32:58 +0100 Subject: [PATCH] Made Xorriso_update_iso_lba0() ready for long block adresses --- xorriso/opts_a_c.c | 2 +- xorriso/write_run.c | 66 +++++++++++++++++++++---------------- xorriso/xorriso_timestamp.h | 2 +- xorriso/xorrisoburn.h | 3 +- 4 files changed, 41 insertions(+), 32 deletions(-) diff --git a/xorriso/opts_a_c.c b/xorriso/opts_a_c.c index 496f3005..e3db0f55 100644 --- a/xorriso/opts_a_c.c +++ b/xorriso/opts_a_c.c @@ -1994,7 +1994,7 @@ int Xorriso_option_check_media(struct XorrisO *xorriso, if(ret <= 0) goto ex; if(ret == 1) { - ret= Xorriso_update_iso_lba0(xorriso, (int) job->patch_lba0_msc1, 0, + ret= Xorriso_update_iso_lba0(xorriso, job->patch_lba0_msc1, (off_t) 0, head_buffer, job, (8 * (job->patch_lba0 == 1)) | 4 | (job->patch_lba0_msc1 < 0)); diff --git a/xorriso/write_run.c b/xorriso/write_run.c index d461000e..1cb0a141 100644 --- a/xorriso/write_run.c +++ b/xorriso/write_run.c @@ -2542,7 +2542,7 @@ int Xorriso_burn_track(struct XorrisO *xorriso, off_t write_start_address, } if(flag & 1) { - ret= Xorriso_update_iso_lba0(xorriso, (int) nwa, (int) isosize, head_buffer, NULL, + ret= Xorriso_update_iso_lba0(xorriso, nwa, isosize, head_buffer, NULL, flag & 2); if(ret <= 0) goto ex; @@ -3171,11 +3171,13 @@ md5_comp_failed:; bit5= bit1 for Xorriso_find_sb_checksum: accept tag with ISO_MD5_AREA_CORRUPTED */ -int Xorriso_update_iso_lba0(struct XorrisO *xorriso, int iso_lba, int isosize, +int Xorriso_update_iso_lba0(struct XorrisO *xorriso, + off_t iso_lba, off_t isosize, char *head_buffer, struct CheckmediajoB *job, int flag) { - int ret, full_size, i, checksum_block= -1, vd_end; + int ret, i, checksum_block= -1, vd_end; + uint32_t full_size; char *headpt; struct burn_drive_info *dinfo; struct burn_drive *drive = NULL; @@ -3189,7 +3191,7 @@ int Xorriso_update_iso_lba0(struct XorrisO *xorriso, int iso_lba, int isosize, "on attempt to learn current session lba", 0); if(ret<=0) return(0); - ret= isoburn_disc_get_msc1(drive, &iso_lba); + ret= isoburn_disc_get_msc1_v2(drive, &iso_lba); if(ret<=0) return(0); drive= NULL; /* indev will not be used furtherly */ @@ -3211,19 +3213,18 @@ int Xorriso_update_iso_lba0(struct XorrisO *xorriso, int iso_lba, int isosize, if(job != NULL && job->data_to_fd >= 0) { if((flag & 8) && job->sector_map != NULL) { ret= Sectorbitmap_bytes_are_set(job->sector_map, - ((off_t) iso_lba) * (off_t) 2048, - ((off_t) (iso_lba + 32)) * ((off_t) 2048) - (off_t) 1, 0); + iso_lba * (off_t) 2048, + (iso_lba + 32) * ((off_t) 2048) - (off_t) 1, 0); if(ret <= 0) { sprintf(xorriso->info_text, - "ISO image head at lba %d is marked as invalid blocks in file copy", - iso_lba); + "ISO image head at lba %.f is marked as invalid blocks in file copy", + (double) iso_lba); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, errno, "FAILURE", 0); return(0); } } - seek_ret= lseek(job->data_to_fd, ((off_t) 2048) * (off_t) iso_lba, - SEEK_SET); + seek_ret= lseek(job->data_to_fd, ((off_t) 2048) * iso_lba, SEEK_SET); if(seek_ret == -1) ret= 0; else @@ -3235,7 +3236,8 @@ int Xorriso_update_iso_lba0(struct XorrisO *xorriso, int iso_lba, int isosize, Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, errno, "FAILURE",0); return(0); } - ret= isoburn_read_iso_head(NULL, 0, &isosize, head_buffer, 1 << 13); + ret= isoburn_read_iso_head_v2(NULL, (off_t) 0, &isosize, + head_buffer, 1 << 13); if(ret<=0) { Xorriso_process_msg_queues(xorriso,0); sprintf(xorriso->info_text, @@ -3246,7 +3248,7 @@ int Xorriso_update_iso_lba0(struct XorrisO *xorriso, int iso_lba, int isosize, } else { ret= 0; if(drive != NULL) - ret= isoburn_read_iso_head(drive, iso_lba, &isosize, head_buffer, 2); + ret= isoburn_read_iso_head_v2(drive, iso_lba, &isosize, head_buffer, 2); if(ret<=0) { Xorriso_process_msg_queues(xorriso,0); sprintf(xorriso->info_text, @@ -3258,6 +3260,12 @@ int Xorriso_update_iso_lba0(struct XorrisO *xorriso, int iso_lba, int isosize, } /* patch ISO header */ + if(iso_lba + isosize > (off_t) 0xffffffff) { + sprintf(xorriso->info_text, + "The total ISO filesystem size would exceed 8 TiB"); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); + return(0); + } full_size= iso_lba + isosize; headpt= head_buffer + 32*1024; for(i=0;i<4;i++) @@ -3312,7 +3320,7 @@ int Xorriso_update_iso_lba0(struct XorrisO *xorriso, int iso_lba, int isosize, } if(flag & 4) { sprintf(xorriso->info_text, - "Overwrote LBA 0 to 31 by 64 KiB from LBA %d", iso_lba); + "Overwrote LBA 0 to 31 by 64 KiB from LBA %.f", (double) iso_lba); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0); } return(1); @@ -3636,9 +3644,9 @@ ex: int Xorriso_truncate_overwritable(struct XorrisO *xorriso, char *adr_mode, char *adr_value, char *adjust, int flag) { - int ret, iso_lba= 0, iso_session, iso_track, iso_size= 0, image_start_mode= 0; - int old_size, new_size, blocks, was_indev= 0, checksum_block= 0, vd_end; - int readable_blocks, headless_mode= 0, i; + int ret, iso_session, iso_track, image_start_mode= 0; + int was_indev= 0, checksum_block= 0, vd_end, headless_mode= 0, i; + off_t iso_lba= 0, iso_size= 0, old_size, new_size, blocks, readable_blocks; char image_start_value[81], *head_buffer= NULL, iso_volid[33]; char *sb_buffer= NULL, *checksum_pt; struct burn_drive_info *dinfo; @@ -3680,14 +3688,14 @@ int Xorriso_truncate_overwritable(struct XorrisO *xorriso, char *adr_mode, {ret= 2; goto ex;} /* Learn old size */ - ret= isoburn_read_iso_head(drive, 0, &old_size, iso_volid, 0); + ret= isoburn_read_iso_head_v2(drive, 0, &old_size, iso_volid, 0); if(ret <= 0) { sprintf(xorriso->info_text, "-truncate_overwritable: Cannot read ISO 9660 Volume Descriptor from LBA 0"); if((strcmp(adr_mode, "lba") == 0 || strcmp(adr_mode, "sbsector") == 0) && strcmp(adjust, "new") == 0) { Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", 0); - ret= burn_get_read_capacity(drive, &old_size, 0); + ret= burn_get_read_capacity_v2(drive, &old_size, 0); if(ret <= 0) goto ex; headless_mode= 1; @@ -3699,8 +3707,8 @@ int Xorriso_truncate_overwritable(struct XorrisO *xorriso, char *adr_mode, if(headless_mode) { iso_lba= Scanf_io_size(adr_value, 0); - ret= isoburn_read_iso_head(drive, iso_lba, &new_size, head_buffer, - 2 | (1 << 12)); + ret= isoburn_read_iso_head_v2(drive, iso_lba, &new_size, head_buffer, + 2 | (1 << 12)); if(ret <= 0) goto not_iso_9660; } else { @@ -3710,9 +3718,9 @@ int Xorriso_truncate_overwritable(struct XorrisO *xorriso, char *adr_mode, image_start_value, 0); if(ret <= 0) goto ex; - ret= isoburn_get_mount_params(drive, image_start_mode, image_start_value, - &iso_lba, &iso_track, &iso_session, iso_volid, - 0); + ret= isoburn_get_mount_params_v2(drive, image_start_mode, image_start_value, + &iso_lba, &iso_track, &iso_session, + iso_volid, 0); if(ret <= 0) goto ex; if(ret != 1) { @@ -3728,7 +3736,7 @@ not_iso_9660:; Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); ret= 0; goto ex; } - ret= isoburn_read_iso_head(drive, iso_lba, &new_size, head_buffer, 2); + ret= isoburn_read_iso_head_v2(drive, iso_lba, &new_size, head_buffer, 2); if(ret <= 0) goto ex; } @@ -3761,7 +3769,7 @@ wrong_adjust:; iso_size= blocks - iso_lba; } - ret= burn_get_read_capacity(drive, &readable_blocks, 0); + ret= burn_get_read_capacity_v2(drive, &readable_blocks, 0); Xorriso_process_msg_queues(xorriso, 0); if(ret > 0) { if(iso_lba + iso_size > readable_blocks) { @@ -3784,8 +3792,8 @@ wrong_adjust:; if(iso_size != new_size) { ret=Xorriso_adjust_session_size(xorriso, drive, head_buffer, - iso_lba, iso_size, checksum_block, - new_size, 0); + (int) iso_lba, (int) iso_size, + checksum_block, (int) new_size, 0); if(ret <= 0) goto ex; } @@ -3805,8 +3813,8 @@ wrong_adjust:; "libisofs_rlsb32_checksum_tag_v1 pos=%d range_start=0 range_size=%d", i, i); sprintf(checksum_pt + strlen(checksum_pt), - " session_start=%d md5=0123456789abcdef0123456789abcdef self=0123456789abcdef0123456789abcdef\n", - iso_lba); + " session_start=%.f md5=0123456789abcdef0123456789abcdef self=0123456789abcdef0123456789abcdef\n", + (double) iso_lba); } } else { ret= Xorriso_adjust_relocated_sb(xorriso, drive, head_buffer, &sb_buffer, diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index c45e9671..62ecb3b4 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2024.03.22.165841" +#define Xorriso_timestamP "2024.03.22.204740" diff --git a/xorriso/xorrisoburn.h b/xorriso/xorrisoburn.h index 11f71fdb..a5b48638 100644 --- a/xorriso/xorrisoburn.h +++ b/xorriso/xorrisoburn.h @@ -337,7 +337,8 @@ int Xorriso_msinfo(struct XorrisO *xorriso, off_t *msc1, off_t *msc2, bit2= issue message about success bit3= check whether source blocks are banned by in_sector_map */ -int Xorriso_update_iso_lba0(struct XorrisO *xorriso, int iso_lba, int isosize, +int Xorriso_update_iso_lba0(struct XorrisO *xorriso, + off_t iso_lba, off_t isosize, char *head_buffer, struct CheckmediajoB *job, int flag);