diff options
author | Douglas Gilbert <dgilbert@interlog.com> | 2017-10-31 02:18:16 +0000 |
---|---|---|
committer | Douglas Gilbert <dgilbert@interlog.com> | 2017-10-31 02:18:16 +0000 |
commit | d0cecdd78328bc0e43786c418e9cb1fde563decf (patch) | |
tree | 9edeb3ef5148ae389932296b1c2ac8dbeb857a06 /src | |
parent | c1f5e5decd313edf1615499de92f536cca0dfe80 (diff) | |
download | sg3_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.c | 31 | ||||
-rw-r--r-- | src/sg_modes.c | 44 | ||||
-rw-r--r-- | src/sg_rdac.c | 6 | ||||
-rw-r--r-- | src/sg_senddiag.c | 14 | ||||
-rw-r--r-- | src/sg_wr_mode.c | 25 |
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); |