aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDouglas Gilbert <dgilbert@interlog.com>2022-01-19 19:12:36 +0000
committerDouglas Gilbert <dgilbert@interlog.com>2022-01-19 19:12:36 +0000
commit84c586f1f1d8bd102928f3ae95d1d1185a59de8f (patch)
tree4e078230ad1395e3524357e64abf506e35f5acb8 /lib
parent31de60f68ae11ed1ad16510e0e86b5603f93bda3 (diff)
downloadsg3_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.c29
-rw-r--r--lib/sg_cmds_extra.c21
-rw-r--r--lib/sg_lib.c43
-rw-r--r--lib/sg_lib_data.c6
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 */