diff options
author | Douglas Gilbert <dgilbert@interlog.com> | 2022-01-19 19:12:36 +0000 |
---|---|---|
committer | Douglas Gilbert <dgilbert@interlog.com> | 2022-01-19 19:12:36 +0000 |
commit | 84c586f1f1d8bd102928f3ae95d1d1185a59de8f (patch) | |
tree | 4e078230ad1395e3524357e64abf506e35f5acb8 /lib | |
parent | 31de60f68ae11ed1ad16510e0e86b5603f93bda3 (diff) | |
download | sg3_utils-84c586f1f1d8bd102928f3ae95d1d1185a59de8f.tar.gz |
round of coverity identified issue fixes (and non-issues)
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@931 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'lib')
-rw-r--r-- | lib/sg_cmds_basic.c | 29 | ||||
-rw-r--r-- | lib/sg_cmds_extra.c | 21 | ||||
-rw-r--r-- | lib/sg_lib.c | 43 | ||||
-rw-r--r-- | lib/sg_lib_data.c | 6 |
4 files changed, 58 insertions, 41 deletions
diff --git a/lib/sg_cmds_basic.c b/lib/sg_cmds_basic.c index e1773542..92dd102d 100644 --- a/lib/sg_cmds_basic.c +++ b/lib/sg_cmds_basic.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999-2021 Douglas Gilbert. + * Copyright (c) 1999-2022 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. @@ -42,7 +42,7 @@ #endif -static const char * const version_str = "1.99 20210830"; +static const char * const version_str = "2.00 20220118"; #define SENSE_BUFF_LEN 64 /* Arbitrary, could be larger */ @@ -192,7 +192,6 @@ int 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, sstat, req_din_x, req_dout_x; int act_din_x, act_dout_x; const uint8_t * sbp; @@ -323,19 +322,23 @@ sg_cmds_process_resp(struct sg_pt_base * ptvp, const char * leadin, get_scsi_pt_transport_err_str(ptvp, sizeof(b), b); pr2ws("%s: transport: %s\n", leadin, b); } - /* Shall we favour sense data over a transport error (given both) */ #ifdef SG_LIB_LINUX - favour_sense = false; /* DRIVER_SENSE is not passed through */ + return -1; /* DRIVER_SENSE is not passed through */ #else - favour_sense = ((SAM_STAT_CHECK_CONDITION == - get_scsi_pt_status_response(ptvp)) && (slen > 0)); + /* Shall we favour sense data over a transport error (given both) */ + { + bool favour_sense = ((SAM_STAT_CHECK_CONDITION == + get_scsi_pt_status_response(ptvp)) && (slen > 0)); + + if (favour_sense) + return sg_cmds_process_helper(leadin, req_din_x, act_din_x, + req_dout_x, act_dout_x, sbp, + slen, noisy, verbose, + o_sense_cat); + else + return -1; + } #endif - if (favour_sense) - return sg_cmds_process_helper(leadin, req_din_x, act_din_x, - req_dout_x, act_dout_x, sbp, slen, - noisy, verbose, o_sense_cat); - else - return -1; case SCSI_PT_RESULT_OS_ERR: if (verbose || noisy) { get_scsi_pt_os_err_str(ptvp, sizeof(b), b); diff --git a/lib/sg_cmds_extra.c b/lib/sg_cmds_extra.c index 7d4f4533..bacb0338 100644 --- a/lib/sg_cmds_extra.c +++ b/lib/sg_cmds_extra.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999-2021 Douglas Gilbert. + * Copyright (c) 1999-2022 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. @@ -1807,6 +1807,7 @@ sg_ll_ata_pt(int sg_fd, const uint8_t * cdbp, int cdb_len, int k, res, slen, duration; int ret = -1; uint8_t apt_cdb[ATA_PT_32_CMDLEN]; + uint8_t incoming_apt_cdb[ATA_PT_32_CMDLEN]; uint8_t sense_b[SENSE_BUFF_LEN] = {0}; uint8_t * sp; const uint8_t * bp; @@ -1815,18 +1816,25 @@ sg_ll_ata_pt(int sg_fd, const uint8_t * cdbp, int cdb_len, char b[256]; memset(apt_cdb, 0, sizeof(apt_cdb)); + memset(incoming_apt_cdb, 0, sizeof(incoming_apt_cdb)); + if (NULL == cdbp) { + if (vb) + pr2ws("NULL cdb pointer\n"); + return -1; + } + memcpy(incoming_apt_cdb, cdbp, cdb_len); b[0] = '\0'; switch (cdb_len) { case 12: cnamep = "ATA pass-through(12)"; apt_cdb[0] = ATA_PT_12_CMD; - memcpy(apt_cdb + 1, cdbp + 1, 10); + memcpy(apt_cdb + 1, incoming_apt_cdb + 1, 10); /* control byte at cdb[11] left at zero */ break; case 16: cnamep = "ATA pass-through(16)"; apt_cdb[0] = ATA_PT_16_CMD; - memcpy(apt_cdb + 1, cdbp + 1, 14); + memcpy(apt_cdb + 1, incoming_apt_cdb + 1, 14); /* control byte at cdb[15] left at zero */ break; case 32: @@ -1835,17 +1843,12 @@ sg_ll_ata_pt(int sg_fd, const uint8_t * cdbp, int cdb_len, /* control byte at cdb[1] left at zero */ apt_cdb[7] = 0x18; /* length starting at next byte */ sg_put_unaligned_be16(ATA_PT_32_SA, apt_cdb + 8); - memcpy(apt_cdb + 10, cdbp + 10, 32 - 10); + memcpy(apt_cdb + 10, incoming_apt_cdb + 10, 32 - 10); break; default: pr2ws("cdb_len must be 12, 16 or 32\n"); return -1; } - if (NULL == cdbp) { - if (vb) - pr2ws("%s NULL cdb pointer\n", cnamep); - return -1; - } if (sensep && (max_sense_len >= (int)sizeof(sense_b))) { sp = sensep; slen = max_sense_len; diff --git a/lib/sg_lib.c b/lib/sg_lib.c index 35f0fbdd..1b267e44 100644 --- a/lib/sg_lib.c +++ b/lib/sg_lib.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999-2021 Douglas Gilbert. + * Copyright (c) 1999-2022 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. @@ -3556,16 +3556,15 @@ sg_f2hex_arr(const char * fname, bool as_binary, bool no_space, k = read(fd, mp_arr, max_arr_len); if (k <= 0) { if (0 == k) { - ret = SG_LIB_SYNTAX_ERROR; + ret = SG_LIB_FILE_ERROR; pr2ws("read 0 bytes from binary file %s\n", fname); } else { ret = sg_convert_errno(errno); pr2ws("read from binary file %s: %s\n", fname, safe_strerror(errno)); } - goto bin_fini; - } - if ((0 == fstat(fd, &a_stat)) && S_ISFIFO(a_stat.st_mode)) { + } else if ((k < max_arr_len) && (0 == fstat(fd, &a_stat)) && + S_ISFIFO(a_stat.st_mode)) { /* pipe; keep reading till error or 0 read */ while (k < max_arr_len) { m = read(fd, mp_arr + k, max_arr_len - k); @@ -3576,13 +3575,13 @@ sg_f2hex_arr(const char * fname, bool as_binary, bool no_space, pr2ws("read from binary pipe %s: %s\n", fname, safe_strerror(err)); ret = sg_convert_errno(err); - goto bin_fini; + break; } k += m; } } - *mp_arr_len = k; -bin_fini: + if (k >= 0) + *mp_arr_len = k; if ((fd >= 0) && (! has_stdin)) close(fd); return ret; @@ -3623,9 +3622,17 @@ bin_fini: if (isxdigit(line[0])) { carry_over[1] = line[0]; carry_over[2] = '\0'; - if (1 == sscanf(carry_over, "%4x", &h)) - mp_arr[off - 1] = h; /* back up and overwrite */ - else { + if (1 == sscanf(carry_over, "%4x", &h)) { + if (off > 0) { + if (off > max_arr_len) { + pr2ws("%s: array length exceeded\n", __func__); + ret = SG_LIB_LBA_OUT_OF_RANGE; + *mp_arr_len = max_arr_len; + goto fini; + } else + mp_arr[off - 1] = h; /* back up and overwrite */ + } + } else { pr2ws("%s: carry_over error ['%s'] around line %d\n", __func__, carry_over, j + 1); ret = SG_LIB_SYNTAX_ERROR; @@ -3667,8 +3674,8 @@ bin_fini: *mp_arr_len = max_arr_len; ret = SG_LIB_LBA_OUT_OF_RANGE; goto fini; - } - mp_arr[off + k] = h; + } else + mp_arr[off + k] = h; } if (isxdigit(*lcp) && (! isxdigit(*(lcp + 1)))) carry_over[0] = *lcp; @@ -3692,8 +3699,8 @@ bin_fini: ret = SG_LIB_LBA_OUT_OF_RANGE; *mp_arr_len = max_arr_len; goto fini; - } - mp_arr[off + k] = h; + } else + mp_arr[off + k] = h; lcp = strpbrk(lcp, " ,\t"); if (NULL == lcp) break; @@ -3766,7 +3773,11 @@ uint32_t sg_get_page_size(void) { #if defined(HAVE_SYSCONF) && defined(_SC_PAGESIZE) - return (uint32_t)sysconf(_SC_PAGESIZE); /* POSIX.1 (was getpagesize()) */ + { + long res = sysconf(_SC_PAGESIZE); /* POSIX.1 (was getpagesize()) */ + + return (res <= 0) ? 4096 : res; + } #elif defined(SG_LIB_WIN32) static bool got_page_size = false; static uint32_t win_page_size; diff --git a/lib/sg_lib_data.c b/lib/sg_lib_data.c index 559e0efd..382457b0 100644 --- a/lib/sg_lib_data.c +++ b/lib/sg_lib_data.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007-2021 Douglas Gilbert. + * Copyright (c) 2007-2022 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. @@ -19,8 +19,8 @@ #include "sg_lib_data.h" -const char * sg_lib_version_str = "2.83 20211007"; -/* spc6r05, sbc5r01, zbc2r10 */ +const char * sg_lib_version_str = "2.84 20220118"; +/* spc6r06, sbc5r01, zbc2r12 */ /* indexed by pdt; those that map to own index do not decay */ |