Trying to better handle MMC violating replies of MODE SENSE (Block Descriptors)
This commit is contained in:
parent
d7806a0b85
commit
7026313ed5
@ -1 +1 @@
|
|||||||
#define Cdrskin_timestamP "2014.02.04.112944"
|
#define Cdrskin_timestamP "2014.02.05.124803"
|
||||||
|
@ -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.
|
||||||
|
Loading…
Reference in New Issue
Block a user