aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDouglas Gilbert <dgilbert@interlog.com>2017-10-31 02:18:16 +0000
committerDouglas Gilbert <dgilbert@interlog.com>2017-10-31 02:18:16 +0000
commitd0cecdd78328bc0e43786c418e9cb1fde563decf (patch)
tree9edeb3ef5148ae389932296b1c2ac8dbeb857a06 /src
parentc1f5e5decd313edf1615499de92f536cca0dfe80 (diff)
downloadsg3_utils-d0cecdd78328bc0e43786c418e9cb1fde563decf.tar.gz
sg_lib: add sg_msense_calc_length(); sg_pt: add dummy pt_device_is_nvme()
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@727 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'src')
-rw-r--r--src/sg_format.c31
-rw-r--r--src/sg_modes.c44
-rw-r--r--src/sg_rdac.c6
-rw-r--r--src/sg_senddiag.c14
-rw-r--r--src/sg_wr_mode.c25
5 files changed, 65 insertions, 55 deletions
diff --git a/src/sg_format.c b/src/sg_format.c
index 54506d3a..53aa2739 100644
--- a/src/sg_format.c
+++ b/src/sg_format.c
@@ -37,7 +37,7 @@
#include "sg_pr2serr.h"
#include "sg_pt.h"
-static const char * version_str = "1.39 20171021";
+static const char * version_str = "1.40 20171030";
#define RW_ERROR_RECOVERY_PAGE 1 /* can give alternate with --mode=MP */
@@ -1055,11 +1055,22 @@ again_with_long_lba:
pr2serr(" try '-v' for more information\n");
goto out;
}
+ rsp_len = (resid > 0) ? (MAX_BUFF_SZ - resid) : MAX_BUFF_SZ;
+ if (rsp_len < 0) {
+ pr2serr("%s: resid=%d implies negative response "
+ "length of %d\n", __func__, resid, rsp_len);
+ ret = SG_LIB_WILD_RESID;
+ goto out;
+ }
+ calc_len = sg_msense_calc_length(dbuff, rsp_len, op->mode6, &bd_len);
if (op->mode6) {
- calc_len = dbuff[0] + 1;
- rsp_len = calc_len;
+ if (rsp_len < 4) {
+ pr2serr("%s: MS(6) response length too short (%d)\n",
+ __func__, rsp_len);
+ ret = -1;
+ goto out;
+ }
dev_specific_param = dbuff[2];
- bd_len = dbuff[3];
op->long_lba = false;
offset = 4;
/* prepare for mode select */
@@ -1067,25 +1078,13 @@ again_with_long_lba:
dbuff[1] = 0;
dbuff[2] = 0;
} else { /* MODE SENSE(10) */
- if (resid > 0)
- rsp_len = MAX_BUFF_SZ - resid;
- else
- rsp_len = MAX_BUFF_SZ;
- if (rsp_len < 0) {
- pr2serr("%s: resid=%d implies negative response "
- "length of %d\n", __func__, resid, rsp_len);
- ret = SG_LIB_WILD_RESID;
- goto out;
- }
if (rsp_len < 8) {
pr2serr("%s: MS(10) response length too short (%d)\n",
__func__, rsp_len);
ret = -1;
goto out;
}
- calc_len = sg_get_unaligned_be16(dbuff + 0);
dev_specific_param = dbuff[3];
- bd_len = sg_get_unaligned_be16(dbuff + 6);
op->long_lba = !! (dbuff[4] & 1);
offset = 8;
/* prepare for mode select */
diff --git a/src/sg_modes.c b/src/sg_modes.c
index d86d26a3..a60d431b 100644
--- a/src/sg_modes.c
+++ b/src/sg_modes.c
@@ -29,7 +29,7 @@
#include "sg_unaligned.h"
#include "sg_pr2serr.h"
-static const char * version_str = "1.53 20171025";
+static const char * version_str = "1.54 20171030";
#define DEF_ALLOC_LEN (1024 * 4)
#define DEF_6_ALLOC_LEN 252
@@ -919,8 +919,7 @@ examine_pages(int sg_fd, int inq_pdt, bool encserv, bool mchngr,
}
}
if (0 == res) {
- len = op->do_six ? (rbuf[0] + 1) :
- (sg_get_unaligned_be16(rbuf + 0) + 2);
+ len = sg_msense_calc_length(rbuf, mresp_len, op->do_six, NULL);
if (resid > 0) {
mresp_len -= resid;
if (mresp_len < 0) {
@@ -986,6 +985,7 @@ main(int argc, char * argv[])
unsigned char * rsp_buff = NULL;
unsigned char * malloc_rsp_buff = NULL;
unsigned char * bp;
+ const char * cdbLenStr;
struct sg_simple_inquiry_resp inq_out;
struct opts_t opts;
char b[80];
@@ -1174,32 +1174,37 @@ main(int argc, char * argv[])
resp_mode6 = true;
}
}
+ cdbLenStr = resp_mode6 ? "6" : "10";
if (op->do_raw || (1 == op->do_hex) || (op->do_hex > 2))
;
else {
if (resp_mode6 == op->do_six)
printf("Mode parameter header from MODE SENSE(%s):\n",
- (op->do_six ? "6" : "10"));
+ cdbLenStr);
else
printf(" >>> Mode parameter header from MODE SENSE(%s),\n"
" decoded as %s byte response:\n",
- (op->do_six ? "6" : "10"), (resp_mode6 ? "6" : "10"));
+ cdbLenStr, (resp_mode6 ? "6" : "10"));
+ }
+ rsp_buff_size -= resid;
+ if (rsp_buff_size < 0) {
+ pr2serr("MS(%s) resid=%d implies negative response length "
+ "(%d)\n", cdbLenStr, resid, rsp_buff_size);
+ ret = SG_LIB_WILD_RESID;
+ goto finish;
}
if (resp_mode6) {
+ if (rsp_buff_size < 4) {
+ pr2serr("MS(6) resid=%d implies abridged header length "
+ "(%d)\n", resid, rsp_buff_size);
+ ret = SG_LIB_WILD_RESID;
+ goto finish;
+ }
headerlen = 4;
- md_len = rsp_buff[0] + 1;
- bd_len = rsp_buff[3];
medium_type = rsp_buff[1];
specific = rsp_buff[2];
longlba = false;
} else { /* MODE SENSE(10) with resid */
- rsp_buff_size -= resid;
- if (rsp_buff_size < 0) {
- pr2serr("MS(10) resid=%d implies negative response length "
- "(%d)\n", resid, rsp_buff_size);
- ret = SG_LIB_WILD_RESID;
- goto finish;
- }
if (rsp_buff_size < 8) {
pr2serr("MS(10) resid=%d implies abridged header length "
"(%d)\n", resid, rsp_buff_size);
@@ -1207,13 +1212,18 @@ main(int argc, char * argv[])
goto finish;
}
headerlen = 8;
- md_len = sg_get_unaligned_be16(rsp_buff + 0) + 2;
- md_len = (md_len < rsp_buff_size) ? md_len : rsp_buff_size;
- bd_len = sg_get_unaligned_be16(rsp_buff + 6);
medium_type = rsp_buff[2];
specific = rsp_buff[3];
longlba = !!(rsp_buff[4] & 1);
}
+ md_len = sg_msense_calc_length(rsp_buff, rsp_buff_size, resp_mode6,
+ &bd_len);
+ if (md_len < 0) {
+ pr2serr("MS(%s): sg_msense_calc_length() failed\n", cdbLenStr);
+ ret = SG_LIB_CAT_MALFORMED;
+ goto finish;
+ }
+ md_len = (md_len < rsp_buff_size) ? md_len : rsp_buff_size;
if ((bd_len + headerlen) > md_len) {
pr2serr("Invalid block descriptor length=%d, ignore\n", bd_len);
bd_len = 0;
diff --git a/src/sg_rdac.c b/src/sg_rdac.c
index 79a2831d..b7819278 100644
--- a/src/sg_rdac.c
+++ b/src/sg_rdac.c
@@ -29,7 +29,7 @@
#include "sg_pr2serr.h"
-static const char * version_str = "1.14 20171021";
+static const char * version_str = "1.15 20171030";
unsigned char mode6_hdr[] = {
0x75, /* Length */
@@ -464,8 +464,8 @@ int main(int argc, char * argv[])
true, do_verbose);
if (! res) {
- len = use_6_byte ? (rsp_buff[0] + 1) :
- (sg_get_unaligned_be16(rsp_buff + 0) + 2);
+ len = sg_msense_calc_length(rsp_buff, 308, use_6_byte,
+ NULL);
if (resid > 0) {
len = ((308 - resid) < len) ? (308 - resid) :
len;
diff --git a/src/sg_senddiag.c b/src/sg_senddiag.c
index 9ae3cbd7..321dc480 100644
--- a/src/sg_senddiag.c
+++ b/src/sg_senddiag.c
@@ -28,7 +28,7 @@
#include "sg_pr2serr.h"
-static const char * version_str = "0.53 20171021";
+static const char * version_str = "0.54 20171030";
#define ME "sg_senddiag: "
@@ -667,7 +667,7 @@ list_page_codes()
int
main(int argc, char * argv[])
{
- int sg_fd, k, num, rsp_len, res, rsp_buff_size, pg, resid;
+ int sg_fd, k, num, rsp_len, res, rsp_buff_size, pg, bd_len, resid;
int read_in_len = 0;
int ret = 0;
struct opts_t opts;
@@ -796,16 +796,18 @@ main(int argc, char * argv[])
ret = SG_LIB_CAT_OTHER;
goto close_fini;
}
- if (op->do_extdur) {
+ if (op->do_extdur) { /* fetch Extended self-test time from Control
+ * mode page with Mode Sense(10) command*/
res = do_modes_0a(sg_fd, rsp_buff, 32, false /* mode6 */,
true /* noisy */, op->do_verbose);
if (0 == res) {
- /* Assume mode sense(10) response without block descriptors */
- num = sg_get_unaligned_be16(rsp_buff) - 6;
+ /* Mode sense(10) response, step over any block descriptors */
+ num = sg_msense_calc_length(rsp_buff, 32, false, &bd_len);
+ num -= (8 /* MS(10) header length */ + bd_len);
if (num >= 0xc) {
int secs;
- secs = sg_get_unaligned_be16(rsp_buff + 18);
+ secs = sg_get_unaligned_be16(rsp_buff + 8 + bd_len + 10);
#ifdef SG_LIB_MINGW
printf("Expected extended self-test duration=%d seconds "
"(%g minutes)\n", secs, secs / 60.0);
diff --git a/src/sg_wr_mode.c b/src/sg_wr_mode.c
index 28f95954..6c8aea45 100644
--- a/src/sg_wr_mode.c
+++ b/src/sg_wr_mode.c
@@ -29,7 +29,7 @@
* mode page on the given device.
*/
-static const char * version_str = "1.19 20171010";
+static const char * version_str = "1.20 20171030";
#define ME "sg_wr_mode: "
@@ -322,6 +322,7 @@ int main(int argc, char * argv[])
unsigned char mask_in[MX_ALLOC_LEN];
unsigned char ref_md[MX_ALLOC_LEN];
char ebuff[EBUFF_SZ];
+ char errStr[128];
char b[80];
struct sg_simple_inquiry_resp inq_data;
int ret = 0;
@@ -450,6 +451,7 @@ int main(int argc, char * argv[])
/* do MODE SENSE to fetch current values */
memset(ref_md, 0, MX_ALLOC_LEN);
+ snprintf(errStr, sizeof(errStr), "MODE SENSE (%d): ", mode_6 ? 6 : 10);
alloc_len = mode_6 ? SHORT_ALLOC_LEN : MX_ALLOC_LEN;
if (mode_6)
res = sg_ll_mode_sense6(sg_fd, dbd, 0 /*current */, pg_code,
@@ -462,28 +464,25 @@ int main(int argc, char * argv[])
ret = res;
if (res) {
if (SG_LIB_CAT_INVALID_OP == res)
- pr2serr("MODE SENSE (%d) not supported, try '--len=%d'\n",
- (mode_6 ? 6 : 10), (mode_6 ? 10 : 6));
+ pr2serr("%snot supported, try '--len=%d'\n", errStr,
+ (mode_6 ? 10 : 6));
else {
sg_get_category_sense_str(res, sizeof(b), b, verbose);
- pr2serr("MODE SENSE (%d): %s\n", (mode_6 ? 6 : 10), b);
+ pr2serr("%s%s\n", errStr, b);
}
goto err_out;
}
off = sg_mode_page_offset(ref_md, alloc_len, mode_6, ebuff, EBUFF_SZ);
if (off < 0) {
- pr2serr("MODE SENSE (%d): %s\n", (mode_6 ? 6 : 10), ebuff);
+ pr2serr("%s%s\n", errStr, ebuff);
goto err_out;
}
- if (mode_6) {
- hdr_len = 4;
- md_len = ref_md[0] + 1;
- bd_len = ref_md[3];
- } else {
- hdr_len = 8;
- md_len = sg_get_unaligned_be16(ref_md + 0) + 2;
- bd_len = sg_get_unaligned_be16(ref_md + 6);
+ md_len = sg_msense_calc_length(ref_md, alloc_len, mode_6, &bd_len);
+ if (md_len < 0) {
+ pr2serr("%ssg_msense_calc_length() failed\n", errStr);
+ goto err_out;
}
+ hdr_len = mode_6 ? 4 : 8;
if (got_contents) {
if (read_in_len < 2) {
pr2serr("contents length=%d too short\n", read_in_len);