From 4fe385baed936f3e381e56e46dbdaa0bbda6ce39 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Thu, 28 Mar 2024 15:51:52 +0100 Subject: [PATCH] Made struct xorriso_md5_state ready for long block addresses --- xorriso/drive_mgt.c | 59 ++++++++++++++++++++++--------------- xorriso/xorriso_timestamp.h | 2 +- 2 files changed, 36 insertions(+), 25 deletions(-) diff --git a/xorriso/drive_mgt.c b/xorriso/drive_mgt.c index f2dcf2de..6250610a 100644 --- a/xorriso/drive_mgt.c +++ b/xorriso/drive_mgt.c @@ -2547,13 +2547,13 @@ struct xorriso_md5_state { pthread_mutex_t spot_mutex; /* Checksum tag cursor */ - uint32_t md5_start; - uint32_t next_tag; + off_t md5_start; + off_t next_tag; int chain_broken; int in_track_gap; int was_sb_tag; int md5_spot_value; - uint32_t md5_spot_lba; + off_t md5_spot_lba; /* Asynchronous operation */ @@ -2572,7 +2572,7 @@ struct xorriso_md5_state { 3= end-of-processing (set by boss when done) */ int *chunk_fill; /* Actual number of valid bytes in chunk */ - uint32_t *chunk_lba; + off_t *chunk_lba; int chunk_w_idx; /* Write index. Operated by boss */ int chunk_r_idx; /* Read index. Operated by MD5 slave */ @@ -2604,16 +2604,25 @@ int Xorriso__add_spot(struct xorriso_md5_state *state, int Xorriso_chunk_md5(struct XorrisO *xorriso, char *data, int to_read, - uint32_t from_lba, struct xorriso_md5_state *state, int flag) + off_t from_lba, struct xorriso_md5_state *state, int flag) { int j, k, ret= 0, valid, tag_type, decode_ret= 0; - uint32_t lba, pos, range_start, range_size; + uint32_t pos, range_start, range_size, next_tag_uint32; + off_t lba; char md5[16], tag_md5[16], *tag_type_name= "", *comparison, *sev_text; char md5_text[33]; void *cloned_ctx= NULL; for(j= 0; j < to_read; j++) { lba= j + from_lba; + if(lba > (off_t) 0xffffffff) { + if(lba == (off_t) 0x100000000) { + printf(xorriso->info_text, + "Checkreading exceeds the 32-bit block address limit of libisofs MD5 tags"); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING",0); + } + break; + } if(lba < state->md5_start) continue; ret= decode_ret= 0; @@ -2621,8 +2630,10 @@ int Xorriso_chunk_md5(struct XorrisO *xorriso, char *data, int to_read, (state->next_tag == 0 || state->chain_broken || lba == state->next_tag)){ ret= iso_util_decode_md5_tag(data + j * 2048, &tag_type, &pos, &range_start, &range_size, - &(state->next_tag), tag_md5, + &next_tag_uint32, tag_md5, !!state->chain_broken); + if(ret > 0 && tag_type >= 2 && tag_type <= 4) + state->next_tag= next_tag_uint32; decode_ret= ret; } valid= (ret == 1 || ret == (int) ISO_MD5_AREA_CORRUPTED) && pos == lba; @@ -2643,7 +2654,7 @@ int Xorriso_chunk_md5(struct XorrisO *xorriso, char *data, int to_read, ret= -1; goto ex; } iso_md5_compute(&(state->ctx), data + (j - (lba - range_start)) * 2048, - (lba - range_start) * 2048); + (int) (lba - range_start) * 2048); state->md5_start= range_start; state->in_track_gap= 0; } @@ -2662,13 +2673,13 @@ int Xorriso_chunk_md5(struct XorrisO *xorriso, char *data, int to_read, sprintf(xorriso->info_text, "Found MD5 %s tag which covers different data range", tag_type_name); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE",0); - sprintf(xorriso->info_text, " Expected start: %u Found: %u", - (unsigned int) state->md5_start, range_start); + sprintf(xorriso->info_text, " Expected start: %.f Found: %lu", + (double) state->md5_start, (unsigned long int) range_start); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE",0); for(k= 0; k < 16; k++) sprintf(md5_text + 2 * k, "%2.2x", ((unsigned char *) tag_md5)[k]); - sprintf(xorriso->info_text, " Size: %u MD5: %s", - range_size, md5_text); + sprintf(xorriso->info_text, " Size: %lu MD5: %s", + (unsigned long int) range_size, md5_text); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE",0); state->chain_broken= 1; valid= 0; @@ -2697,16 +2708,16 @@ int Xorriso_chunk_md5(struct XorrisO *xorriso, char *data, int to_read, } state->md5_spot_lba= lba; sprintf(xorriso->info_text, - "Found %s MD5 %s tag: start=%d size=%d", - comparison, tag_type_name, state->md5_start, - lba - state->md5_start); + "Found %s MD5 %s tag: start=%.f size=%.f", + comparison, tag_type_name, (double) state->md5_start, + (double) (lba - state->md5_start)); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, sev_text, 0); } if(valid && (tag_type == 1 || (tag_type == 4 && pos == lba && lba < 32))){ if(state->md5_spot_value != Xorriso_read_quality_untesteD) { - ret= Xorriso__add_spot(state, (off_t) state->md5_start, - (off_t) state->md5_spot_lba - state->md5_start, - state->md5_spot_value, 0); + ret= Xorriso__add_spot(state, state->md5_start, + state->md5_spot_lba - state->md5_start, + state->md5_spot_value, 0); if(ret <= 0) goto ex; } @@ -2964,7 +2975,7 @@ int Xorriso_check_interval(struct XorrisO *xorriso, struct SpotlisT *spotlist, Xorriso_alloc_meM(state.chunk, char *, num_chunks); Xorriso_alloc_meM(state.chunk_state, int, num_chunks); Xorriso_alloc_meM(state.chunk_fill, int, num_chunks); - Xorriso_alloc_meM(state.chunk_lba, uint32_t, num_chunks); + Xorriso_alloc_meM(state.chunk_lba, off_t, num_chunks); for(i= 0; i < state.num_chunks; i++) { state.chunk[i]= data + read_chunk * i * 2048; state.chunk_state[i]= 0; @@ -3143,7 +3154,7 @@ abort_check:; state.chunk_w_idx= (state.chunk_w_idx + 1) % state.num_chunks; } else { ret= Xorriso_chunk_md5(xorriso, data_pt, to_read, - (uint32_t) (i + from_lba), &state, 0); + i + from_lba, &state, 0); if(ret <= 0) goto ex; } @@ -3232,15 +3243,15 @@ failed_to_write:; /* >>> ??? allow chain_broken to be a match ? */ if(state.next_tag > 0) { - sprintf(xorriso->info_text, "Missing announced MD5 tag: start=%d pos=%d", - state.md5_start, state.next_tag); + sprintf(xorriso->info_text, "Missing announced MD5 tag: start=%.f pos=%.f", + (double) state.md5_start, (double) state.next_tag); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", 0); state.md5_spot_value= Xorriso_read_quality_md5_mismatcH; state.md5_spot_lba= state.next_tag; } if(state.md5_spot_value != Xorriso_read_quality_untesteD) { - ret= Xorriso__add_spot(&state, (off_t) state.md5_start, - (off_t) (state.md5_spot_lba - state.md5_start), + ret= Xorriso__add_spot(&state, state.md5_start, + state.md5_spot_lba - state.md5_start, state.md5_spot_value, 0); if(ret <= 0) goto ex; diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index 035b9223..5fb1d589 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2024.03.24.085148" +#define Xorriso_timestamP "2024.03.28.144046"