From 7f31c9e985e3a252c2aed304d5290a1406bc367f Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Wed, 5 Feb 2014 12:49:41 +0000 Subject: [PATCH] Trying to better handle MMC violating replies of MODE SENSE (Block Descriptors) --- cdrskin/cdrskin_timestamp.h | 2 +- libburn/spc.c | 32 +++++++++++++++++++++++++++----- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/cdrskin/cdrskin_timestamp.h b/cdrskin/cdrskin_timestamp.h index e2e25d5..b88ca90 100644 --- a/cdrskin/cdrskin_timestamp.h +++ b/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2014.02.04.112944" +#define Cdrskin_timestamP "2014.02.05.124803" diff --git a/libburn/spc.c b/libburn/spc.c index 0ebc826..ec9bc67 100644 --- a/libburn/spc.c +++ b/libburn/spc.c @@ -409,7 +409,10 @@ void spc_allow(struct burn_drive *d) /* ts A70518 - A90603 : Do not call with *alloc_len < 10 */ -/** flag&1= do only inquire alloc_len */ +/** @param flag bit0= do only inquire alloc_len + @return 1=ok , <=0 error , + 2=Block Descriptor Length > 0, retry with flag bit1 +*/ static int spc_sense_caps_al(struct burn_drive *d, int *alloc_len, int flag) { struct buffer *buf = NULL; @@ -460,6 +463,21 @@ static int spc_sense_caps_al(struct burn_drive *d, int *alloc_len, int flag) */ block_descr_len = c->page->data[6] * 256 + c->page->data[7]; + if (block_descr_len + 8 + 2 > *alloc_len) { + if (block_descr_len + 8 + 2 > BUFFER_SIZE || !(flag & 1)) { + m->valid = -1; + sprintf(msg, + "MODE SENSE page 2A with oversized Block Descriptors: %s : %d", + d->devname, block_descr_len); + libdax_msgs_submit(libdax_messenger, d->global_index, + 0x0002016e, LIBDAX_MSGS_SEV_DEBUG, + LIBDAX_MSGS_PRIO_LOW, msg, 0, 0); + {ret = 0; goto ex;} + } + *alloc_len = block_descr_len + 10; + {ret = 2; goto ex;} + } + /* Skip over Mode Data Header and block descriptors */ page = c->page->data + 8 + block_descr_len; @@ -629,10 +647,14 @@ void spc_sense_caps(struct burn_drive *d) /* first command execution to learn Allocation Length */ alloc_len = start_len; ret = spc_sense_caps_al(d, &alloc_len, 1); -/* - fprintf(stderr,"LIBBURN_DEBUG: 5Ah alloc_len = %d , ret = %d\n", - alloc_len, ret); -*/ + if (ret == 2) { + /* ts B40205: Unexpectedly found Block Descriptors. + Repeat with new alloc_len. + */ + ret = spc_sense_caps_al(d, &alloc_len, 1); + if (ret == 2) + return; + } /* ts B11103: qemu ATAPI DVD-ROM delivers only 28. SanDisk Cruzer U3 memory stick throws error on alloc_len < 30.