From 7026313ed5b11b2473d5cea421f43736cfbf9b20 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) --- libburn/trunk/cdrskin/cdrskin_timestamp.h | 2 +- libburn/trunk/libburn/spc.c | 32 +++++++++++++++++++---- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/libburn/trunk/cdrskin/cdrskin_timestamp.h b/libburn/trunk/cdrskin/cdrskin_timestamp.h index e2e25d59..b88ca901 100644 --- a/libburn/trunk/cdrskin/cdrskin_timestamp.h +++ b/libburn/trunk/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2014.02.04.112944" +#define Cdrskin_timestamP "2014.02.05.124803" diff --git a/libburn/trunk/libburn/spc.c b/libburn/trunk/libburn/spc.c index 0ebc826f..ec9bc67d 100644 --- a/libburn/trunk/libburn/spc.c +++ b/libburn/trunk/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.