Letting -check_media look for session checksum tags
This commit is contained in:
@ -9195,14 +9195,15 @@ int Xorriso_msinfo(struct XorrisO *xorriso, int *msc1, int *msc2, int flag)
|
||||
|
||||
/* @param flag bit0= this is a follow-up session (i.e. on CD: TAO)
|
||||
bit1= no pacifier messages
|
||||
bit2= compute stream MD5 and look out for checksum tag
|
||||
@return <=0 error, 1= done, 2= aborted due to limit
|
||||
*/
|
||||
int Xorriso_check_interval(struct XorrisO *xorriso, struct SpotlisT *spotlist,
|
||||
struct CheckmediajoB *job,
|
||||
int from_lba, int block_count, int read_chunk,
|
||||
int flag)
|
||||
int md5_start, int flag)
|
||||
{
|
||||
int i, j, ret, total_count= 0, sectors= -1, sector_size= -1, skip_reading;
|
||||
int i, j, k, ret, total_count= 0, sectors= -1, sector_size= -1, skip_reading;
|
||||
int prev_quality= -1, quality= -1, retry= 0, profile_no, is_cd= 0;
|
||||
int start_sec, end_sec, first_value, fret;
|
||||
char profile_name[80];
|
||||
@ -9214,6 +9215,9 @@ int Xorriso_check_interval(struct XorrisO *xorriso, struct SpotlisT *spotlist,
|
||||
double pre_read_time, post_read_time, time_diff, total_time_diff= 0;
|
||||
double last_abort_file_time= 0;
|
||||
struct stat stbuf;
|
||||
void *ctx= NULL;
|
||||
char md5[16], tag_md5[16];
|
||||
uint32_t pos, range_start, range_size;
|
||||
|
||||
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
|
||||
"on attempt to check media readability",
|
||||
@ -9235,6 +9239,14 @@ int Xorriso_check_interval(struct XorrisO *xorriso, struct SpotlisT *spotlist,
|
||||
else if(job->retry == 0 && is_cd)
|
||||
retry= 1;
|
||||
|
||||
if(flag & 4) {
|
||||
ret= iso_md5_start(&ctx);
|
||||
if(ret < 0) {
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0);
|
||||
ret= -1; goto ex;
|
||||
}
|
||||
}
|
||||
|
||||
start_lba= from_lba;
|
||||
to_read= read_chunk;
|
||||
post_read_time= Sfile_microtime(0);
|
||||
@ -9364,6 +9376,54 @@ abort_check:;
|
||||
quality= Xorriso_read_quality_sloW;
|
||||
}
|
||||
|
||||
if(ctx != NULL) {
|
||||
for(j= 0; j < to_read; j++) {
|
||||
ret= iso_util_decode_md5_tag(data + j * 2048, &pos, &range_start,
|
||||
&range_size, tag_md5, 0);
|
||||
if(ret == 1 && pos == i + j + from_lba) {
|
||||
if(range_start != md5_start) {
|
||||
sprintf(xorriso->info_text,
|
||||
"Found MD5 checksum tag which covers different data range");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE",0);
|
||||
sprintf(xorriso->info_text,
|
||||
" Expected: %u Found: %u",
|
||||
(unsigned int) md5_start, range_start);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE",0);
|
||||
} else {
|
||||
iso_md5_end(&ctx, md5);
|
||||
for(k= 0; k < 16; k++)
|
||||
if(tag_md5[k] != md5[k])
|
||||
break;
|
||||
if(k < 16 ) {
|
||||
ret= Spotlist_add_item(spotlist, md5_start,
|
||||
i + j + from_lba - md5_start,
|
||||
Xorriso_read_quality_md5_mismatcH, 0);
|
||||
sprintf(xorriso->info_text,
|
||||
"Found NON-MATCHING MD5 checksum tag: start=%d size=%d",
|
||||
md5_start, i + j + from_lba - md5_start);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
|
||||
"WARNING", 0);
|
||||
} else {
|
||||
ret= Spotlist_add_item(spotlist, md5_start,
|
||||
i + j + from_lba - md5_start,
|
||||
Xorriso_read_quality_md5_matcH, 0);
|
||||
sprintf(xorriso->info_text,
|
||||
"Found matching MD5 checksum tag: start=%d size=%d",
|
||||
md5_start, i + j + from_lba - md5_start);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "UPDATE",
|
||||
0);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
/* >>> ??? warn if ret == ISO_MD5_AREA_CORRUPTED */;
|
||||
|
||||
if(from_lba + i + j >= md5_start)
|
||||
iso_md5_compute(ctx, data + j * 2048, 2048);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
write_amount= data_count;
|
||||
if(data_count > 0) {
|
||||
read_count+= data_count;
|
||||
@ -9424,6 +9484,8 @@ failed_to_write:;
|
||||
|
||||
ret= 1;
|
||||
ex:
|
||||
if(ctx != NULL)
|
||||
iso_md5_end(&ctx, md5);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
@ -9433,7 +9495,7 @@ int Xorriso_check_media(struct XorrisO *xorriso, struct SpotlisT **spotlist,
|
||||
{
|
||||
int media_blocks= 0, read_chunk= 16, ret, mode, start_lba= 0;
|
||||
int blocks, os_errno, i, j, last_track_end= -1, track_blocks, track_lba;
|
||||
int num_sessions, num_tracks, declare_untested= 0;
|
||||
int num_sessions, num_tracks, declare_untested= 0, md5_start;
|
||||
char *toc_info= NULL;
|
||||
struct burn_drive *drive;
|
||||
struct burn_drive_info *dinfo;
|
||||
@ -9492,7 +9554,7 @@ int Xorriso_check_media(struct XorrisO *xorriso, struct SpotlisT **spotlist,
|
||||
blocks= job->max_lba + 1 - start_lba;
|
||||
xorriso->pacifier_total= blocks;
|
||||
ret= Xorriso_check_interval(xorriso, *spotlist, job, start_lba, blocks,
|
||||
read_chunk, 0);
|
||||
read_chunk, 0, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
|
||||
@ -9511,6 +9573,7 @@ int Xorriso_check_media(struct XorrisO *xorriso, struct SpotlisT **spotlist,
|
||||
continue;
|
||||
track_lba= isoburn_entry.start_lba;
|
||||
track_blocks= isoburn_entry.track_blocks;
|
||||
md5_start= track_lba;
|
||||
if(i == 0 && j == 0) {
|
||||
if(track_lba == 32) {
|
||||
ret= burn_disc_get_multi_caps(drive, BURN_WRITE_NONE, &caps, 0);
|
||||
@ -9547,7 +9610,8 @@ int Xorriso_check_media(struct XorrisO *xorriso, struct SpotlisT **spotlist,
|
||||
goto ex;
|
||||
} else {
|
||||
ret= Xorriso_check_interval(xorriso, *spotlist, job, track_lba,
|
||||
track_blocks, read_chunk, i > 0);
|
||||
track_blocks, read_chunk, md5_start,
|
||||
(i > 0) | (4 * (xorriso->do_md5 & 1)));
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
if(ret == 2)
|
||||
@ -9572,7 +9636,7 @@ no_content_visible:;
|
||||
goto no_content_visible;
|
||||
xorriso->pacifier_total= blocks;
|
||||
ret= Xorriso_check_interval(xorriso, *spotlist, job, start_lba, blocks,
|
||||
read_chunk, 0);
|
||||
read_chunk, 0, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
} else if(mode == 2) {
|
||||
@ -9701,7 +9765,7 @@ int Xorriso_read_file_data(struct XorrisO *xorriso, IsoNode *node,
|
||||
|
||||
file_processed_bytes+= ((off_t) count) * (off_t) 2048;
|
||||
ret= Xorriso_check_interval(xorriso, spotlist, job, lba, count, read_chunk,
|
||||
(flag & 2));
|
||||
0, (flag & 2));
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
if (ret == 2) {
|
||||
@ -12310,18 +12374,6 @@ int Xorriso_check_session_md5(struct XorrisO *xorriso, char *severity,
|
||||
Xorriso_result(xorriso,0);
|
||||
ret= Xorriso_check_md5_range(xorriso, (off_t) start_lba, (off_t) end_lba,
|
||||
md5, 0);
|
||||
if(ret <= 0) {
|
||||
sprintf(xorriso->result_line,
|
||||
"MD5 MISMATCH WITH DATA OF LOADED SESSION !\n");
|
||||
Xorriso_result(xorriso,0);
|
||||
if(strcmp(severity, "ALL") != 0) {
|
||||
sprintf(xorriso->info_text, "Event triggered by MD5 comparison mismatch");
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, severity, 0);
|
||||
}
|
||||
} else {
|
||||
sprintf(xorriso->result_line, "Ok, session data match recorded md5.\n");
|
||||
Xorriso_result(xorriso,0);
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user