--- embedaddon/smartmontools/dev_areca.cpp 2013/07/22 01:17:35 1.1.1.1 +++ embedaddon/smartmontools/dev_areca.cpp 2013/10/14 07:54:03 1.1.1.2 @@ -21,7 +21,7 @@ #include "dev_interface.h" #include "dev_areca.h" -const char * dev_areca_cpp_cvsid = "$Id: dev_areca.cpp,v 1.1.1.1 2013/07/22 01:17:35 misho Exp $" +const char * dev_areca_cpp_cvsid = "$Id: dev_areca.cpp,v 1.1.1.2 2013/10/14 07:54:03 misho Exp $" DEV_ARECA_H_CVSID; #include "atacmds.h" @@ -356,7 +356,8 @@ int generic_areca_device::arcmsr_get_dev_type() int ctlr_type = -1; int encnum = get_encnum(); int disknum = get_disknum(); - unsigned char areca_packet[] = {0x5E, 0x01, 0x61, 0x03, 0x00, 0x22, disknum - 1, encnum - 1, 0x00}; + unsigned char areca_packet[] = {0x5E, 0x01, 0x61, 0x03, 0x00, 0x22, + (unsigned char)(disknum - 1), (unsigned char)(encnum - 1), 0x00}; memset(return_buff, 0, sizeof(return_buff)); expected = arcmsr_ui_handler(areca_packet, sizeof(areca_packet), return_buff); @@ -612,10 +613,11 @@ bool generic_areca_device::arcmsr_scsi_pass_through(st // ----- BEGIN TO SEND TO ARECA DRIVER ------ expected = arcmsr_ui_handler(areca_packet, areca_packet_len, return_buff); - if ( expected < 0 ) - { - return set_err(EIO); - } + + if (expected < 0) + return set_err(EIO, "arcmsr_scsi_pass_through: I/O error"); + if (expected < 15) // 7 bytes if port is empty + return set_err(EIO, "arcmsr_scsi_pass_through: missing data (%d bytes, expected %d)", expected, 15); int scsi_status = return_buff[5]; int in_data_len = return_buff[11] | return_buff[12] << 8 | return_buff[13] << 16 | return_buff[14] << 24;