X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=dev_areca.cpp;h=91edb03f1949356c4a16df7f71e8f0d731d82635;hb=bcade6c14a06cfc842b41df91fdc5b9577cd68f1;hp=9ee8be7b8a54bc0ef61eb484350b0899bfa58351;hpb=ee38a438aafef7a04b7df628ca5ad38810a1d63e;p=mirror_smartmontools-debian.git diff --git a/dev_areca.cpp b/dev_areca.cpp index 9ee8be7..91edb03 100644 --- a/dev_areca.cpp +++ b/dev_areca.cpp @@ -1,7 +1,7 @@ /* * dev_areca.cpp * - * Home page of code is: http://smartmontools.sourceforge.net + * Home page of code is: http://www.smartmontools.org * * Copyright (C) 2012 Hank Wu * @@ -21,7 +21,7 @@ #include "dev_interface.h" #include "dev_areca.h" -const char * dev_areca_cpp_cvsid = "$Id: dev_areca.cpp 3803 2013-03-24 18:52:54Z chrfranke $" +const char * dev_areca_cpp_cvsid = "$Id: dev_areca.cpp 4209 2016-01-22 20:49:44Z chrfranke $" DEV_ARECA_H_CVSID; #include "atacmds.h" @@ -114,7 +114,10 @@ generic_areca_device::~generic_areca_device() throw() // 1 if the command succeeded and disk SMART status is "FAILING" int generic_areca_device::arcmsr_command_handler(unsigned long arcmsr_cmd, unsigned char *data, int data_len) { - unsigned int cmds[] = + if (arcmsr_cmd >= ARCMSR_CMD_TOTAL) + return -1; + + static const unsigned int cmds[ARCMSR_CMD_TOTAL] = { ARCMSR_IOCTL_READ_RQBUFFER, ARCMSR_IOCTL_WRITE_WQBUFFER, @@ -145,11 +148,6 @@ int generic_areca_device::arcmsr_command_handler(unsigned long arcmsr_cmd, unsig sBuf.srbioctl.Timeout = 10000; sBuf.srbioctl.ControlCode = cmds[arcmsr_cmd]; - if(arcmsr_cmd >= ARCMSR_CMD_TOTAL) - { - return -1; - } - switch ( arcmsr_cmd ) { // command for writing data to driver @@ -299,14 +297,14 @@ int generic_areca_device::arcmsr_ui_handler(unsigned char *areca_packet, int are if (expected==-3) { return set_err(EIO); } - expected = arcmsr_command_handler(ARCMSR_CLEAR_WQBUFFER, NULL, 0); + arcmsr_command_handler(ARCMSR_CLEAR_WQBUFFER, NULL, 0); expected = arcmsr_command_handler(ARCMSR_WRITE_WQBUFFER, areca_packet, areca_packet_len); if ( expected > 0 ) { expected = arcmsr_command_handler(ARCMSR_READ_RQBUFFER, return_buff, sizeof(return_buff)); } - if ( expected < 0 ) + if ( expected < 3 + 1 ) // Prefix + Checksum { return -1; } @@ -613,10 +611,11 @@ bool generic_areca_device::arcmsr_scsi_pass_through(struct scsi_cmnd_io * iop) // ----- 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;