diff options
author | Douglas Gilbert <dgilbert@interlog.com> | 2021-08-01 03:14:05 +0000 |
---|---|---|
committer | Douglas Gilbert <dgilbert@interlog.com> | 2021-08-01 03:14:05 +0000 |
commit | bfbefdf2d9aa12107d08d796d6fc78862ab85402 (patch) | |
tree | 76d31932b03f8a71a1432e0b053f1d5ee4ca78e9 /lib | |
parent | c2a103b26a80218c8c2ee9a8ddb7122e36a69331 (diff) | |
download | sg3_utils-bfbefdf2d9aa12107d08d796d6fc78862ab85402.tar.gz |
sg_ses: fix crash when 'm LEN' < 252
Cleanups suggested cppcheck
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@907 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'lib')
-rw-r--r-- | lib/sg_cmds_basic.c | 10 | ||||
-rw-r--r-- | lib/sg_cmds_extra.c | 13 | ||||
-rw-r--r-- | lib/sg_cmds_mmc.c | 18 | ||||
-rw-r--r-- | lib/sg_lib.c | 61 | ||||
-rw-r--r-- | lib/sg_pt_freebsd.c | 48 | ||||
-rw-r--r-- | lib/sg_pt_linux.c | 16 | ||||
-rw-r--r-- | lib/sg_pt_linux_nvme.c | 23 |
7 files changed, 113 insertions, 76 deletions
diff --git a/lib/sg_cmds_basic.c b/lib/sg_cmds_basic.c index d1a61168..899caae1 100644 --- a/lib/sg_cmds_basic.c +++ b/lib/sg_cmds_basic.c @@ -113,7 +113,6 @@ sg_cmds_process_helper(const char * leadin, int req_din_x, int act_din_x, int scat; bool n = false; bool check_data_in = false; - char b[512]; scat = sg_err_category_sense(sbp, slen); switch (scat) { @@ -145,6 +144,8 @@ sg_cmds_process_helper(const char * leadin, int req_din_x, int act_din_x, break; } if (verbose || n) { + char b[512]; + if (leadin && (strlen(leadin) > 0)) pr2ws("%s:\n", leadin); sg_get_sense_str(NULL, sbp, slen, (verbose > 1), @@ -192,7 +193,7 @@ sg_cmds_process_resp(struct sg_pt_base * ptvp, const char * leadin, int pt_res, bool noisy, int verbose, int * o_sense_cat) { bool favour_sense; - int cat, slen, resp_code, sstat, req_din_x, req_dout_x; + int cat, slen, sstat, req_din_x, req_dout_x; int act_din_x, act_dout_x; const uint8_t * sbp; char b[1024]; @@ -244,7 +245,8 @@ sg_cmds_process_resp(struct sg_pt_base * ptvp, const char * leadin, switch ((cat = get_scsi_pt_result_category(ptvp))) { case SCSI_PT_RESULT_GOOD: if (sbp && (slen > 7)) { - resp_code = sbp[0] & 0x7f; + int resp_code = sbp[0] & 0x7f; + /* SBC referrals can have status=GOOD and sense_key=COMPLETED */ if (resp_code >= 0x70) { if (resp_code < 0x72) { @@ -399,7 +401,7 @@ sg_ll_inquiry_com(struct sg_pt_base * ptvp, int sg_fd, bool cmddt, bool evpd, sg_get_command_str(inq_cdb, INQUIRY_CMDLEN, false, sizeof(b), b)); } - if (resp && (mx_resp_len > 0)) { + if (mx_resp_len > 0) { up = (uint8_t *)resp; up[0] = 0x7f; /* defensive prefill */ if (mx_resp_len > 4) diff --git a/lib/sg_cmds_extra.c b/lib/sg_cmds_extra.c index 7874dd16..e55e8075 100644 --- a/lib/sg_cmds_extra.c +++ b/lib/sg_cmds_extra.c @@ -1203,12 +1203,13 @@ static bool has_blk_ili(uint8_t * sensep, int sb_len) { int resp_code; - const uint8_t * cup; if (sb_len < 8) return false; resp_code = (0x7f & sensep[0]); if (resp_code >= 0x72) { /* descriptor format */ + const uint8_t * cup; + /* find block command descriptor */ if ((cup = sg_scsi_sense_desc_find(sensep, sb_len, 0x5))) return (cup[3] & 0x20); @@ -1567,7 +1568,7 @@ sg_ll_verify10(int sg_fd, int vrprotect, bool dpo, int bytchk, int vb) { static const char * const cdb_s = "verify(10)"; - int k, res, ret, s_cat, slen; + int res, ret, s_cat, slen; uint8_t v_cdb[VERIFY10_CMDLEN] = {VERIFY10_CMD, 0, 0, 0, 0, 0, 0, 0, 0, 0}; uint8_t sense_b[SENSE_BUFF_LEN]; @@ -1586,7 +1587,8 @@ sg_ll_verify10(int sg_fd, int vrprotect, bool dpo, int bytchk, sg_get_command_str(v_cdb, VERIFY10_CMDLEN, false, sizeof(b), b)); if ((vb > 3) && bytchk && data_out && (data_out_len > 0)) { - k = data_out_len > 4104 ? 4104 : data_out_len; + int k = data_out_len > 4104 ? 4104 : data_out_len; + pr2ws(" data_out buffer%s\n", (data_out_len > 4104 ? ", first 4104 bytes" : "")); hex2stderr((const uint8_t *)data_out, k, vb < 5); @@ -1644,7 +1646,7 @@ sg_ll_verify16(int sg_fd, int vrprotect, bool dpo, int bytchk, uint64_t llba, int data_out_len, uint64_t * infop, bool noisy, int vb) { static const char * const cdb_s = "verify(16)"; - int k, res, ret, s_cat, slen; + int res, ret, s_cat, slen; uint8_t v_cdb[VERIFY16_CMDLEN] = {VERIFY16_CMD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; uint8_t sense_b[SENSE_BUFF_LEN]; @@ -1664,7 +1666,8 @@ sg_ll_verify16(int sg_fd, int vrprotect, bool dpo, int bytchk, uint64_t llba, sg_get_command_str(v_cdb, VERIFY16_CMDLEN, false, sizeof(b), b)); if ((vb > 3) && bytchk && data_out && (data_out_len > 0)) { - k = data_out_len > 4104 ? 4104 : data_out_len; + int k = data_out_len > 4104 ? 4104 : data_out_len; + pr2ws(" data_out buffer%s\n", (data_out_len > 4104 ? ", first 4104 bytes" : "")); hex2stderr((const uint8_t *)data_out, k, vb < 5); diff --git a/lib/sg_cmds_mmc.c b/lib/sg_cmds_mmc.c index b80e988f..c1dabd74 100644 --- a/lib/sg_cmds_mmc.c +++ b/lib/sg_cmds_mmc.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2019 Douglas Gilbert. + * Copyright (c) 2008-2021 Douglas Gilbert. * All rights reserved. * Use of this source code is governed by a BSD-style * license that can be found in the BSD_LICENSE file. @@ -60,7 +60,7 @@ sg_ll_set_cd_speed(int sg_fd, int rot_control, int drv_read_speed, int drv_write_speed, bool noisy, int verbose) { static const char * const cdb_s = "set cd speed"; - int res, ret, k, sense_cat; + int res, ret, sense_cat; uint8_t scsCmdBlk[SET_CD_SPEED_CMDLEN] = {SET_CD_SPEED_CMD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0}; uint8_t sense_b[SENSE_BUFF_LEN]; @@ -71,6 +71,8 @@ sg_ll_set_cd_speed(int sg_fd, int rot_control, int drv_read_speed, sg_put_unaligned_be16((uint16_t)drv_write_speed, scsCmdBlk + 4); if (verbose) { + int k; + pr2ws(" %s cdb: ", cdb_s); for (k = 0; k < SET_CD_SPEED_CMDLEN; ++k) pr2ws("%02x ", scsCmdBlk[k]); @@ -117,7 +119,7 @@ sg_ll_get_config(int sg_fd, int rt, int starting, void * resp, int mx_resp_len, bool noisy, int verbose) { static const char * const cdb_s = "get configuration"; - int res, k, ret, sense_cat; + int res, ret, sense_cat; uint8_t gcCmdBlk[GET_CONFIG_CMD_LEN] = {GET_CONFIG_CMD, 0, 0, 0, 0, 0, 0, 0, 0, 0}; uint8_t sense_b[SENSE_BUFF_LEN]; @@ -140,6 +142,8 @@ sg_ll_get_config(int sg_fd, int rt, int starting, void * resp, sg_put_unaligned_be16((uint16_t)mx_resp_len, gcCmdBlk + 7); if (verbose) { + int k; + pr2ws(" %s cdb: ", cdb_s); for (k = 0; k < GET_CONFIG_CMD_LEN; ++k) pr2ws("%02x ", gcCmdBlk[k]); @@ -207,7 +211,7 @@ sg_ll_get_performance(int sg_fd, int data_type, unsigned int starting_lba, int mx_resp_len, bool noisy, int verbose) { static const char * const cdb_s = "get performance"; - int res, k, ret, sense_cat; + int res, ret, sense_cat; uint8_t gpCmdBlk[GET_PERFORMANCE_CMD_LEN] = {GET_PERFORMANCE_CMD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; uint8_t sense_b[SENSE_BUFF_LEN]; @@ -231,6 +235,8 @@ sg_ll_get_performance(int sg_fd, int data_type, unsigned int starting_lba, gpCmdBlk[10] = (uint8_t)ttype; if (verbose) { + int k; + pr2ws(" %s cdb: ", cdb_s); for (k = 0; k < GET_PERFORMANCE_CMD_LEN; ++k) pr2ws("%02x ", gpCmdBlk[k]); @@ -298,7 +304,7 @@ sg_ll_set_streaming(int sg_fd, int type, void * paramp, int param_len, bool noisy, int verbose) { static const char * const cdb_s = "set streaming"; - int k, res, ret, sense_cat; + int res, ret, sense_cat; uint8_t ssCmdBlk[SET_STREAMING_CMDLEN] = {SET_STREAMING_CMD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; uint8_t sense_b[SENSE_BUFF_LEN]; @@ -307,6 +313,8 @@ sg_ll_set_streaming(int sg_fd, int type, void * paramp, int param_len, ssCmdBlk[8] = type; sg_put_unaligned_be16((uint16_t)param_len, ssCmdBlk + 9); if (verbose) { + int k; + pr2ws(" %s cdb: ", cdb_s); for (k = 0; k < SET_STREAMING_CMDLEN; ++k) pr2ws("%02x ", ssCmdBlk[k]); diff --git a/lib/sg_lib.c b/lib/sg_lib.c index 1037c2c0..c5eeeddc 100644 --- a/lib/sg_lib.c +++ b/lib/sg_lib.c @@ -359,15 +359,14 @@ sg_get_asc_ascq_str(int asc, int ascq, int buff_len, char * buff) { int k, num, rlen; bool found = false; - struct sg_lib_asc_ascq_t * eip; - struct sg_lib_asc_ascq_range_t * ei2p; if (1 == buff_len) { buff[0] = '\0'; return buff; } for (k = 0; sg_lib_asc_ascq_range[k].text; ++k) { - ei2p = &sg_lib_asc_ascq_range[k]; + struct sg_lib_asc_ascq_range_t * ei2p = &sg_lib_asc_ascq_range[k]; + if ((ei2p->asc == asc) && (ascq >= ei2p->ascq_min) && (ascq <= ei2p->ascq_max)) { @@ -381,7 +380,8 @@ sg_get_asc_ascq_str(int asc, int ascq, int buff_len, char * buff) return buff; for (k = 0; sg_lib_asc_ascq[k].text; ++k) { - eip = &sg_lib_asc_ascq[k]; + struct sg_lib_asc_ascq_t * eip = &sg_lib_asc_ascq[k]; + if (eip->asc == asc && eip->ascq == ascq) { found = true; @@ -408,7 +408,7 @@ const uint8_t * sg_scsi_sense_desc_find(const uint8_t * sbp, int sb_len, int desc_type) { - int add_sb_len, add_d_len, desc_len, k; + int add_sb_len, desc_len, k; const uint8_t * descp; if ((sb_len < 8) || (0 == (add_sb_len = sbp[7]))) @@ -418,6 +418,8 @@ sg_scsi_sense_desc_find(const uint8_t * sbp, int sb_len, add_sb_len = (add_sb_len < (sb_len - 8)) ? add_sb_len : (sb_len - 8); descp = &sbp[8]; for (desc_len = 0, k = 0; k < add_sb_len; k += desc_len) { + int add_d_len; + descp += desc_len; add_d_len = (k < (add_sb_len - 1)) ? descp[1]: -1; desc_len = add_d_len + 2; @@ -437,7 +439,6 @@ sg_get_sense_info_fld(const uint8_t * sbp, int sb_len, uint64_t * info_outp) { const uint8_t * bp; - uint64_t ull; if (info_outp) *info_outp = 0; @@ -453,7 +454,8 @@ sg_get_sense_info_fld(const uint8_t * sbp, int sb_len, case 0x73: bp = sg_scsi_sense_desc_find(sbp, sb_len, 0 /* info desc */); if (bp && (0xa == bp[1])) { - ull = sg_get_unaligned_be64(bp + 4); + uint64_t ull = sg_get_unaligned_be64(bp + 4); + if (info_outp) *info_outp = ull; return !!(bp[2] & 0x80); /* since spc3r23 should be set */ @@ -631,7 +633,7 @@ char * sg_decode_transportid_str(const char * lip, uint8_t * bp, int bplen, bool only_one, int blen, char * b) { - int proto_id, num, k, n, normal_len, tpid_format; + int num, k, n; uint64_t ull; int bump; @@ -645,6 +647,8 @@ sg_decode_transportid_str(const char * lip, uint8_t * bp, int bplen, lip = ""; /* bump = TRANSPORT_ID_MIN_LEN; // some old compilers insisted on this */ for (k = 0, n = 0; bplen > 0; ++k, bp += bump, bplen -= bump) { + int proto_id, normal_len, tpid_format; + if ((k > 0) && only_one) break; if ((bplen < 24) || (0 != (bplen % 4))) @@ -941,7 +945,6 @@ sg_get_designation_descriptor_str(const char * lip, const uint8_t * ddp, int vsi, k, n, dlen; const uint8_t * ip; uint64_t vsei; - uint64_t id_ext; char e[64]; const char * cp; @@ -1036,8 +1039,9 @@ sg_get_designation_descriptor_str(const char * lip, const uint8_t * ddp, } ci_off = 0; if (16 == dlen) { /* first 8 bytes are 'Identifier Extension' */ + uint64_t id_ext = sg_get_unaligned_be64(ip); + ci_off = 8; - id_ext = sg_get_unaligned_be64(ip); n += sg_scnpr(b + n, blen - n, "%s Identifier extension: 0x%" PRIx64 "\n", lip, id_ext); } else if ((8 != dlen) && (12 != dlen)) { @@ -1402,9 +1406,8 @@ uds_referral_descriptor_str(char * b, int blen, const uint8_t * dp, { int n = 0; int dlen = alen - 2; - int k, j, g, f, tpgd; + int k, j, g, f; const uint8_t * tp; - uint64_t ull; char c[40]; if (NULL == lip) @@ -1413,7 +1416,9 @@ uds_referral_descriptor_str(char * b, int blen, const uint8_t * dp, !!(dp[2] & 0x1)); dp += 4; for (k = 0, f = 1; (k + 4) < dlen; k += g, dp += g, ++f) { - tpgd = dp[3]; + int tpgd = dp[3]; + uint64_t ull; + g = (tpgd * 4) + 20; n += sg_scnpr(b + n, blen - n, "%s Descriptor %d\n", lip, f); if ((k + g) > dlen) { @@ -1454,7 +1459,7 @@ int sg_get_sense_descriptors_str(const char * lip, const uint8_t * sbp, int sb_len, int blen, char * b) { - int add_sb_len, add_d_len, desc_len, k, j, sense_key; + int add_sb_len, desc_len, k, j, sense_key; int n, progress, pr, rem; uint16_t sct_sc; bool processed; @@ -1479,7 +1484,8 @@ sg_get_sense_descriptors_str(const char * lip, const uint8_t * sbp, for (descp = (sbp + 8), k = 0, n = 0; (k < add_sb_len) && (n < blen); k += desc_len, descp += desc_len) { - add_d_len = (k < (add_sb_len - 1)) ? descp[1] : -1; + int add_d_len = (k < (add_sb_len - 1)) ? descp[1] : -1; + if ((k + add_d_len + 2) > add_sb_len) add_d_len = add_sb_len - k - 2; desc_len = add_d_len + 2; @@ -2161,14 +2167,13 @@ static const char * const bad_sense_cat = "Bad sense category"; const char * sg_get_category_sense_str(int sense_cat, int b_len, char * b, int verbose) { - int n; - if (NULL == b) return bad_sense_cat; if (b_len <= 0) return b; if (! sg_exit2str(sense_cat, (verbose > 0), b_len, b)) { - n = sg_scnpr(b, b_len, "Sense category: %d", sense_cat); + int n = sg_scnpr(b, b_len, "Sense category: %d", sense_cat); + if ((0 == verbose) && (n < (b_len - 1))) sg_scnpr(b + n, b_len - n, ", try '-v' option for more " "information"); @@ -2620,7 +2625,6 @@ sg_get_sfs_str(uint16_t sfs_code, int peri_type, int buff_len, char * buff, bool sg_is_scsi_cdb(const uint8_t * cdbp, int clen) { - int ilen, sa; uint8_t opcode; uint8_t top3bits; @@ -2629,6 +2633,8 @@ sg_is_scsi_cdb(const uint8_t * cdbp, int clen) opcode = cdbp[0]; top3bits = opcode >> 5; if (0x3 == top3bits) { + int ilen, sa; + if ((clen < 12) || (clen % 4)) return false; /* must be modulo 4 and 12 or more bytes */ switch (opcode) { @@ -2801,14 +2807,14 @@ static char safe_errbuf[64] = {'u', 'n', 'k', 'n', 'o', 'w', 'n', ' ', char * safe_strerror(int errnum) { - size_t len; char * errstr; if (errnum < 0) errnum = -errnum; errstr = strerror(errnum); if (NULL == errstr) { - len = strlen(safe_errbuf); + size_t len = strlen(safe_errbuf); + sg_scnpr(safe_errbuf + len, sizeof(safe_errbuf) - len, "%i", errnum); return safe_errbuf; } @@ -2946,7 +2952,6 @@ int dStrHexStr(const char * str, int len, const char * leadin, int format, int b_len, char * b) { - uint8_t c; int bpstart, bpos, k, n, prior_ascii_len; bool want_ascii; char buff[DSHS_LINE_BLEN + 2]; @@ -2980,7 +2985,8 @@ dStrHexStr(const char * str, int len, const char * leadin, int format, if (bpstart > 0) memcpy(buff, leadin, bpstart); for (k = 0; k < len; k++) { - c = *p++; + uint8_t c = *p++; + if (bpos == (bpstart + ((DSHS_BPL / 2) * 3))) bpos++; /* for extra space in middle of each line's hex */ sg_scnpr(buff + bpos, (int)sizeof(buff) - bpos, "%.2x", @@ -3742,12 +3748,12 @@ sg_ata_get_chars(const uint16_t * word_arr, int start_word, int num_words, bool is_big_endian, char * ochars) { int k; - uint16_t s; - char a, b; char * op = ochars; for (k = start_word; k < (start_word + num_words); ++k) { - s = word_arr[k]; + char a, b; + uint16_t s = word_arr[k]; + if (is_big_endian) { a = s & 0xff; b = (s >> 8) & 0xff; @@ -3806,7 +3812,6 @@ sg_memalign(uint32_t num_bytes, uint32_t align_to, uint8_t ** buff_to_free, bool vb) { size_t psz; - uint8_t * res; if (buff_to_free) /* make sure buff_to_free is NULL if alloc fails */ *buff_to_free = NULL; @@ -3817,6 +3822,7 @@ sg_memalign(uint32_t num_bytes, uint32_t align_to, uint8_t ** buff_to_free, #ifdef HAVE_POSIX_MEMALIGN { int err; + uint8_t * res; void * wp = NULL; err = posix_memalign(&wp, psz, num_bytes); @@ -3840,6 +3846,7 @@ sg_memalign(uint32_t num_bytes, uint32_t align_to, uint8_t ** buff_to_free, #else { void * wrkBuff; + uint8_t * res; sg_uintptr_t align_1 = psz - 1; wrkBuff = (uint8_t *)calloc(num_bytes + psz, 1); diff --git a/lib/sg_pt_freebsd.c b/lib/sg_pt_freebsd.c index b6af6704..ad25e8ca 100644 --- a/lib/sg_pt_freebsd.c +++ b/lib/sg_pt_freebsd.c @@ -7,7 +7,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ -/* sg_pt_freebsd version 1.44 20210601 */ +/* sg_pt_freebsd version 1.45 20210731 */ #include <stdio.h> #include <stdlib.h> @@ -587,19 +587,18 @@ destruct_scsi_pt_obj(struct sg_pt_base * vp) void clear_scsi_pt_obj(struct sg_pt_base * vp) { - int dev_han; struct sg_pt_freebsd_scsi * ptp; - struct freebsd_dev_channel *fdc_p; if (NULL == vp) { pr2ws(">>>>> %s: NULL pointer given\n", __func__); return; } if ((ptp = &vp->impl)) { + int dev_han = ptp->dev_han; + struct freebsd_dev_channel *fdc_p = ptp->mchanp; + if (ptp->ccb) cam_freeccb(ptp->ccb); - dev_han = ptp->dev_han; - fdc_p = ptp->mchanp; memset(ptp, 0, sizeof(struct sg_pt_freebsd_scsi)); ptp->dxfer_dir = CAM_DIR_NONE; ptp->dev_han = dev_han; @@ -817,7 +816,6 @@ set_scsi_pt_flags(struct sg_pt_base * objp, int flags) int do_scsi_pt(struct sg_pt_base * vp, int dev_han, int time_secs, int vb) { - int len; struct sg_pt_freebsd_scsi * ptp = &vp->impl; struct freebsd_dev_channel *fdc_p; FILE * ferrp = sg_warnings_strm ? sg_warnings_strm : stderr; @@ -928,6 +926,8 @@ do_scsi_pt(struct sg_pt_base * vp, int dev_han, int time_secs, int vb) if ((SAM_STAT_CHECK_CONDITION == ptp->scsi_status) || (SAM_STAT_COMMAND_TERMINATED == ptp->scsi_status)) { + int len; + if (ptp->sense_resid > ptp->sense_len) len = ptp->sense_len; /* crazy; ignore sense_resid */ else @@ -1343,7 +1343,7 @@ mk_sense_invalid_fld(struct sg_pt_freebsd_scsi * ptp, bool in_cdb, int in_byte, int in_bit, int vb) { bool ds = ptp->mchanp ? ptp->mchanp->dev_stat.scsi_dsense : false; - int sl, asc, n; + int asc, n; uint8_t * sbp = (uint8_t *)ptp->sense; uint8_t sks[4]; @@ -1369,7 +1369,8 @@ mk_sense_invalid_fld(struct sg_pt_freebsd_scsi * ptp, bool in_cdb, } sg_put_unaligned_be16(in_byte, sks + 1); if (ds) { - sl = sbp[7] + 8; + int sl = sbp[7] + 8; + sbp[7] = sl; sbp[sl] = 0x2; sbp[sl + 1] = 0x6; @@ -1402,7 +1403,6 @@ nvme_pt_low(struct sg_pt_freebsd_scsi * ptp, void * dxferp, uint32_t len, uint16_t sct_sc; uint8_t opcode; struct freebsd_dev_channel *fdc_p = ptp->mchanp; - char b[80]; if (vb > 6) pr2ws("%s: is_read=%d, time_secs=%d, is_cam_nvme=%d, is_admin=%d\n", @@ -1480,6 +1480,7 @@ nvme_pt_low(struct sg_pt_freebsd_scsi * ptp, void * dxferp, uint32_t len, ptp->cq_dw0_3 + SG_NVME_PT_CQ_STATUS_P); if (sct_sc && (vb > 1)) { char nam[64]; + char b[80]; sg_get_nvme_opcode_name(opcode, is_admin, sizeof(nam), nam); pr2ws("%s: %s [0x%x], status: %s\n", __func__, nam, opcode, @@ -1577,6 +1578,7 @@ cam_nvme: ptp->cq_dw0_3 + SG_NVME_PT_CQ_STATUS_P); if (sct_sc && (vb > 1)) { char nam[64]; + char b[80]; sg_get_nvme_opcode_name(opcode, is_admin, sizeof(nam), nam); @@ -1603,7 +1605,7 @@ sntl_check_enclosure_override(struct freebsd_dev_channel * fdc_p, int vb) fdc_p->dev_stat.id_ctl253 = nvmsr; switch (fdc_p->dev_stat.enclosure_override) { case 0x0: /* no override */ - if (0x3 & nvmsr) { + if (0x3 == (0x3 & nvmsr)) { fdc_p->dev_stat.pdt = PDT_DISK; fdc_p->dev_stat.enc_serv = 1; } else if (0x2 & nvmsr) { @@ -1704,7 +1706,6 @@ sntl_inq(struct sg_pt_freebsd_scsi * ptp, const uint8_t * cdbp, int time_secs, int vb) { bool evpd; - bool cp_id_ctl = false; int res; uint16_t n, alloc_len, pg_cd; uint32_t pg_sz = sg_get_page_size(); @@ -1739,6 +1740,8 @@ sntl_inq(struct sg_pt_freebsd_scsi * ptp, const uint8_t * cdbp, int time_secs, evpd = !!(0x1 & cdbp[1]); pg_cd = cdbp[2]; if (evpd) { /* VPD page responses */ + bool cp_id_ctl = false; + switch (pg_cd) { case 0: /* Supported VPD pages VPD page */ /* inq_dout[0] = (PQ=0)<<5 | (PDT=0); prefer pdt=0xd --> SES */ @@ -1942,7 +1945,7 @@ sntl_rluns(struct sg_pt_freebsd_scsi * ptp, const uint8_t * cdbp, static int sntl_tur(struct sg_pt_freebsd_scsi * ptp, int time_secs, int vb) { - int res, err; + int err; uint32_t pow_state; struct nvme_pt_command npc; uint8_t * npc_up = (uint8_t *)&npc; @@ -1957,7 +1960,8 @@ sntl_tur(struct sg_pt_freebsd_scsi * ptp, int time_secs, int vb) return -EINVAL; } if (NULL == fdc_p->nvme_id_ctlp) { - res = sntl_cache_identity(ptp, time_secs, vb); + int res = sntl_cache_identity(ptp, time_secs, vb); + if (SG_LIB_NVME_STATUS == res) { mk_sense_from_nvme_status(ptp, ptp->nvme_status, vb); return 0; @@ -1998,7 +2002,7 @@ sntl_req_sense(struct sg_pt_freebsd_scsi * ptp, const uint8_t * cdbp, int time_secs, int vb) { bool desc; - int res, err; + int err; uint32_t pow_state, alloc_len, n; struct nvme_pt_command npc; uint8_t * npc_up = (uint8_t *)&npc; @@ -2014,7 +2018,8 @@ sntl_req_sense(struct sg_pt_freebsd_scsi * ptp, const uint8_t * cdbp, return -EINVAL; } if (NULL == fdc_p->nvme_id_ctlp) { - res = sntl_cache_identity(ptp, time_secs, vb); + int res = sntl_cache_identity(ptp, time_secs, vb); + if (SG_LIB_NVME_STATUS == res) { mk_sense_from_nvme_status(ptp, ptp->nvme_status, vb); return 0; @@ -2065,7 +2070,7 @@ sntl_mode_ss(struct sg_pt_freebsd_scsi * ptp, const uint8_t * cdbp, int time_secs, int vb) { bool is_msense = (SCSI_MODE_SENSE10_OPC == cdbp[0]); - int res, n, len; + int n, len; uint8_t * bp; struct freebsd_dev_channel * fdc_p; struct sg_sntl_result_t sntl_result; @@ -2079,7 +2084,8 @@ sntl_mode_ss(struct sg_pt_freebsd_scsi * ptp, const uint8_t * cdbp, return -EINVAL; } if (NULL == fdc_p->nvme_id_ctlp) { - res = sntl_cache_identity(ptp, time_secs, vb); + int res = sntl_cache_identity(ptp, time_secs, vb); + if (SG_LIB_NVME_STATUS == res) { mk_sense_from_nvme_status(ptp, ptp->nvme_status, vb); return 0; @@ -2365,10 +2371,10 @@ sntl_rep_opcodes(struct sg_pt_freebsd_scsi * ptp, const uint8_t * cdbp, { bool rctd; uint8_t reporting_opts, req_opcode, supp; - uint16_t req_sa, u; + uint16_t req_sa; uint32_t alloc_len, offset, a_len; uint32_t pg_sz = sg_get_page_size(); - int k, len, count, bump; + int len, count, bump; const struct sg_opcode_info_t *oip; uint8_t *arr; uint8_t *free_arr; @@ -2445,7 +2451,9 @@ sntl_rep_opcodes(struct sg_pt_freebsd_scsi * ptp, const uint8_t * cdbp, else supp = 3; if (3 == supp) { - u = oip->len_mask[0]; + uint16_t u = oip->len_mask[0]; + int k; + sg_put_unaligned_be16(u, arr + 2); arr[4] = oip->opcode; for (k = 1; k < u; ++k) diff --git a/lib/sg_pt_linux.c b/lib/sg_pt_linux.c index 9da8bab6..cd9083d0 100644 --- a/lib/sg_pt_linux.c +++ b/lib/sg_pt_linux.c @@ -385,12 +385,13 @@ static bool ev_dsense = false; struct sg_pt_base * construct_scsi_pt_obj_with_fd(int dev_fd, int verbose) { - int err; struct sg_pt_linux_scsi * ptp; ptp = (struct sg_pt_linux_scsi *) calloc(1, sizeof(struct sg_pt_linux_scsi)); if (ptp) { + int err; + #if (HAVE_NVME && (! IGNORE_NVME)) sntl_init_dev_stat(&ptp->dev_stat); if (! checked_ev_dsense) { @@ -444,13 +445,14 @@ destruct_scsi_pt_obj(struct sg_pt_base * vp) void clear_scsi_pt_obj(struct sg_pt_base * vp) { - bool is_sg, is_bsg, is_nvme; - int fd; - uint32_t nvme_nsid; - struct sg_sntl_dev_state_t dev_stat; struct sg_pt_linux_scsi * ptp = &vp->impl; if (ptp) { + bool is_sg, is_bsg, is_nvme; + int fd; + uint32_t nvme_nsid; + struct sg_sntl_dev_state_t dev_stat; + fd = ptp->dev_fd; is_sg = ptp->is_sg; is_bsg = ptp->is_bsg; @@ -1119,7 +1121,6 @@ do_scsi_pt_v4(struct sg_pt_linux_scsi * ptp, int fd, int time_secs, int do_scsi_pt(struct sg_pt_base * vp, int fd, int time_secs, int verbose) { - int err; struct sg_pt_linux_scsi * ptp = &vp->impl; bool have_checked_for_type = (ptp->dev_fd >= 0); @@ -1147,7 +1148,8 @@ do_scsi_pt(struct sg_pt_base * vp, int fd, int time_secs, int verbose) } else fd = ptp->dev_fd; if (! have_checked_for_type) { - err = set_pt_file_handle(vp, ptp->dev_fd, verbose); + int err = set_pt_file_handle(vp, ptp->dev_fd, verbose); + if (err) return -ptp->os_err; } diff --git a/lib/sg_pt_linux_nvme.c b/lib/sg_pt_linux_nvme.c index 3dbd182e..5a710f9d 100644 --- a/lib/sg_pt_linux_nvme.c +++ b/lib/sg_pt_linux_nvme.c @@ -251,7 +251,7 @@ mk_sense_invalid_fld(struct sg_pt_linux_scsi * ptp, bool in_cdb, int in_byte, int in_bit, int vb) { bool dsense = !! ptp->dev_stat.scsi_dsense; - int sl, asc, n; + int asc, n; uint8_t * sbp = (uint8_t *)(sg_uintptr_t)ptp->io_hdr.response; uint8_t sks[4]; @@ -278,7 +278,8 @@ mk_sense_invalid_fld(struct sg_pt_linux_scsi * ptp, bool in_cdb, int in_byte, } sg_put_unaligned_be16(in_byte, sks + 1); if (dsense) { - sl = sbp[7] + 8; + int sl = sbp[7] + 8; + sbp[7] = sl; sbp[sl] = 0x2; sbp[sl + 1] = 0x6; @@ -408,7 +409,7 @@ sntl_check_enclosure_override(struct sg_pt_linux_scsi * ptp, int vb) ptp->dev_stat.id_ctl253 = nvmsr; switch (ptp->dev_stat.enclosure_override) { case 0x0: /* no override */ - if (0x3 & nvmsr) { + if (0x3 == (0x3 & nvmsr)) { ptp->dev_stat.pdt = PDT_DISK; ptp->dev_stat.enc_serv = 1; } else if (0x2 & nvmsr) { @@ -521,7 +522,6 @@ sntl_inq(struct sg_pt_linux_scsi * ptp, const uint8_t * cdbp, int time_secs, int vb) { bool evpd; - bool cp_id_ctl = false; int res; uint16_t n, alloc_len, pg_cd; uint32_t pg_sz = sg_get_page_size(); @@ -549,6 +549,8 @@ sntl_inq(struct sg_pt_linux_scsi * ptp, const uint8_t * cdbp, int time_secs, evpd = !!(0x1 & cdbp[1]); pg_cd = cdbp[2]; if (evpd) { /* VPD page responses */ + bool cp_id_ctl = false; + switch (pg_cd) { case 0: /* inq_dout[0] = (PQ=0)<<5 | (PDT=0); prefer pdt=0xd --> SES */ @@ -885,7 +887,7 @@ sntl_mode_ss(struct sg_pt_linux_scsi * ptp, const uint8_t * cdbp, cmdp->nsid = nsid ? nsid : SG_NVME_BROADCAST_NSID; cmdp->cdw10 = 0x6; /* "Volatile write cache" feature id */ if (sp) - cmdp->cdw10 |= (1 << 31); + cmdp->cdw10 |= (1U << 31); cmdp->cdw11 = (uint32_t)ptp->dev_stat.wce; cmdp->timeout_ms = (time_secs < 0) ? 0 : (1000 * time_secs); res = sg_nvme_admin_cmd(ptp, cmdp, NULL, false, time_secs, vb); @@ -934,7 +936,7 @@ sntl_senddiag(struct sg_pt_linux_scsi * ptp, const uint8_t * cdbp, bool pf, self_test; int res; uint8_t st_cd, dpg_cd; - uint32_t alloc_len, n, dout_len, dpg_len, nvme_dst; + uint32_t alloc_len, n, dout_len, dpg_len; const uint32_t pg_sz = sg_get_page_size(); uint8_t * dop; struct sg_nvme_passthru_cmd cmd; @@ -947,6 +949,8 @@ sntl_senddiag(struct sg_pt_linux_scsi * ptp, const uint8_t * cdbp, pr2ws("%s: pf=%d, self_test=%d (st_code=%d)\n", __func__, (int)pf, (int)self_test, (int)st_cd); if (self_test || st_cd) { + uint32_t nvme_dst; + memset(cmd_up, 0, sizeof(cmd)); cmd_up[SG_NVME_PT_OPCODE] = SG_NVME_AD_DEV_SELT_TEST; /* just this namespace (if there is one) and controller */ @@ -1107,10 +1111,10 @@ sntl_rep_opcodes(struct sg_pt_linux_scsi * ptp, const uint8_t * cdbp, { bool rctd; uint8_t reporting_opts, req_opcode, supp; - uint16_t req_sa, u; + uint16_t req_sa; uint32_t alloc_len, offset, a_len; uint32_t pg_sz = sg_get_page_size(); - int k, len, count, bump; + int len, count, bump; const struct sg_opcode_info_t *oip; uint8_t *arr; uint8_t *free_arr; @@ -1186,6 +1190,9 @@ sntl_rep_opcodes(struct sg_pt_linux_scsi * ptp, const uint8_t * cdbp, else supp = 3; if (3 == supp) { + uint16_t u; + int k; + u = oip->len_mask[0]; sg_put_unaligned_be16(u, arr + 2); arr[4] = oip->opcode; |