Trying to better handle MMC violating replies of MODE SENSE (Block Descriptors)

This commit is contained in:
Thomas Schmitt 2014-02-05 12:49:41 +00:00
parent d7806a0b85
commit 7026313ed5
2 changed files with 28 additions and 6 deletions

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2014.02.04.112944" #define Cdrskin_timestamP "2014.02.05.124803"

View File

@ -409,7 +409,10 @@ void spc_allow(struct burn_drive *d)
/* /*
ts A70518 - A90603 : Do not call with *alloc_len < 10 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) static int spc_sense_caps_al(struct burn_drive *d, int *alloc_len, int flag)
{ {
struct buffer *buf = NULL; 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]; 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 */ /* Skip over Mode Data Header and block descriptors */
page = c->page->data + 8 + block_descr_len; 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 */ /* first command execution to learn Allocation Length */
alloc_len = start_len; alloc_len = start_len;
ret = spc_sense_caps_al(d, &alloc_len, 1); ret = spc_sense_caps_al(d, &alloc_len, 1);
/* if (ret == 2) {
fprintf(stderr,"LIBBURN_DEBUG: 5Ah alloc_len = %d , ret = %d\n", /* ts B40205: Unexpectedly found Block Descriptors.
alloc_len, ret); Repeat with new alloc_len.
*/ */
ret = spc_sense_caps_al(d, &alloc_len, 1);
if (ret == 2)
return;
}
/* ts B11103: /* ts B11103:
qemu ATAPI DVD-ROM delivers only 28. qemu ATAPI DVD-ROM delivers only 28.
SanDisk Cruzer U3 memory stick throws error on alloc_len < 30. SanDisk Cruzer U3 memory stick throws error on alloc_len < 30.