diff --git a/mediachanger/castorrmc/rmc/rmc_smcsubr.c b/mediachanger/castorrmc/rmc/rmc_smcsubr.c index c35d8a6bb90b55955804116ac5f16e4ad136e48e..4b9d696715726c30f972231abf39c5d037b3adcb 100644 --- a/mediachanger/castorrmc/rmc/rmc_smcsubr.c +++ b/mediachanger/castorrmc/rmc/rmc_smcsubr.c @@ -148,6 +148,8 @@ static int get_element_info( char sense[MAXSENSE]; int pause_mode = 1; int nretries = 0; + int nbReportBytesRemaining = 0; + int nbElementsInReport = 0; strncpy (func, "get_elem_info", sizeof(func)); func[sizeof(func) - 1] = '\0'; @@ -207,15 +209,19 @@ static int get_element_info( return (-1); } avail_elem = *(data+2) * 256 + *(data+3); + nbReportBytesRemaining = *(data+5) * 256 * 256 + *(data+6) * 256 + *(data+7); i = 0; p = data + 8; /* point after data header */ - while (i < avail_elem) { + while (i < avail_elem && 0 < nbReportBytesRemaining) { + nbReportBytesRemaining -= 8; edl = *(p+2) * 256 + *(p+3); page_start = p + 8; /* point after page header */ page_end = page_start + (((*(p+5) * 256 + *(p+6)) * 256) + *(p+7)); if (page_end > (data + len)) page_end = data + len; for (p = page_start; p < page_end && i < avail_elem; p += edl, i++) { + nbElementsInReport++; + nbReportBytesRemaining -= edl; element_info[i].element_address = *p * 256 + *(p+1); element_info[i].element_type = *(page_start-8); element_info[i].state = *(p+2); @@ -239,7 +245,7 @@ static int get_element_info( } } free (data); - return (avail_elem); + return (nbElementsInReport); } int smc_get_geometry(