aboutsummaryrefslogtreecommitdiff
path: root/lib/sg_cmds_basic.c
diff options
context:
space:
mode:
authorDouglas Gilbert <dgilbert@interlog.com>2014-10-07 04:38:02 +0000
committerDouglas Gilbert <dgilbert@interlog.com>2014-10-07 04:38:02 +0000
commit64f8f0d1f6171b12cfe23f774ee831d320772f00 (patch)
tree9e31a5c7fca3c057aaa1763cc8d12c76cd9438dc /lib/sg_cmds_basic.c
parentfc92e18bc64fc037a85f2fe0d38cd7eb7ebc3cd2 (diff)
downloadsg3_utils-64f8f0d1f6171b12cfe23f774ee831d320772f00.tar.gz
sg_ll_inquiry(), sg_ll_mode_sense*(), sg_ll_log_sense(): use resid to clear unfilled data-in buffer; sg_format, sg_sanitize: output unit serial number and LU name prior to
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@613 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'lib/sg_cmds_basic.c')
-rw-r--r--lib/sg_cmds_basic.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/lib/sg_cmds_basic.c b/lib/sg_cmds_basic.c
index 27649275..b42d8969 100644
--- a/lib/sg_cmds_basic.c
+++ b/lib/sg_cmds_basic.c
@@ -27,7 +27,7 @@
#endif
-static const char * version_str = "1.68 20140604";
+static const char * version_str = "1.69 20141006";
#define SENSE_BUFF_LEN 64 /* Arbitrary, could be larger */
@@ -46,7 +46,7 @@ static const char * version_str = "1.68 20140604";
#define TUR_CMD 0x0
#define TUR_CMDLEN 6
-#define INQUIRY_RESP_INITIAL_LEN 36
+#define SAFE_STD_INQ_RESP_LEN 36 /* other lengths lock up some devices */
const char *
@@ -235,7 +235,7 @@ int
sg_ll_inquiry(int sg_fd, int cmddt, int evpd, int pg_op, void * resp,
int mx_resp_len, int noisy, int verbose)
{
- int res, ret, k, sense_cat;
+ int res, ret, k, sense_cat, resid;
unsigned char inqCmdBlk[INQUIRY_CMDLEN] = {INQUIRY_CMD, 0, 0, 0, 0, 0};
unsigned char sense_b[SENSE_BUFF_LEN];
unsigned char * up;
@@ -274,6 +274,7 @@ sg_ll_inquiry(int sg_fd, int cmddt, int evpd, int pg_op, void * resp,
res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose);
ret = sg_cmds_process_resp(ptvp, "inquiry", res, mx_resp_len, sense_b,
noisy, verbose, &sense_cat);
+ resid = get_scsi_pt_resid(ptvp);
destruct_scsi_pt_obj(ptvp);
if (-1 == ret)
;
@@ -295,6 +296,15 @@ sg_ll_inquiry(int sg_fd, int cmddt, int evpd, int pg_op, void * resp,
} else
ret = 0;
+ if (resid > 0) {
+ if (resid > mx_resp_len) {
+ fprintf(sg_warnings_strm, "inquiry: resid (%d) should never "
+ "exceed requested len=%d\n", resid, mx_resp_len);
+ return ret ? ret : SG_LIB_CAT_MALFORMED;
+ }
+ /* zero unfilled section of response buffer */
+ memset((unsigned char *)resp + (mx_resp_len - resid), 0, resid);
+ }
return ret;
}
@@ -308,7 +318,7 @@ sg_simple_inquiry(int sg_fd, struct sg_simple_inquiry_resp * inq_data,
int res, ret, k, sense_cat;
unsigned char inqCmdBlk[INQUIRY_CMDLEN] = {INQUIRY_CMD, 0, 0, 0, 0, 0};
unsigned char sense_b[SENSE_BUFF_LEN];
- unsigned char inq_resp[INQUIRY_RESP_INITIAL_LEN];
+ unsigned char inq_resp[SAFE_STD_INQ_RESP_LEN];
struct sg_pt_base * ptvp;
if (inq_data) {