2073b1
From 84c586f1f1d8bd102928f3ae95d1d1185a59de8f Mon Sep 17 00:00:00 2001
2073b1
From: Douglas Gilbert <dgilbert@interlog.com>
2073b1
Date: Wed, 19 Jan 2022 19:12:36 +0000
2073b1
Subject: [PATCH] round of coverity identified issue fixes (and non-issues)
2073b1
2073b1
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@931 6180dd3e-e324-4e3e-922d-17de1ae2f315
2073b1
2073b1
diff --git a/lib/sg_cmds_basic.c b/lib/sg_cmds_basic.c
2073b1
index e177354..92dd102 100644
2073b1
--- a/lib/sg_cmds_basic.c
2073b1
+++ b/lib/sg_cmds_basic.c
2073b1
@@ -192,7 +192,6 @@ int
2073b1
 sg_cmds_process_resp(struct sg_pt_base * ptvp, const char * leadin,
2073b1
                      int pt_res, bool noisy, int verbose, int * o_sense_cat)
2073b1
 {
2073b1
-    bool favour_sense;
2073b1
     int cat, slen, sstat, req_din_x, req_dout_x;
2073b1
     int act_din_x, act_dout_x;
2073b1
     const uint8_t * sbp;
2073b1
@@ -323,19 +322,23 @@ sg_cmds_process_resp(struct sg_pt_base * ptvp, const char * leadin,
2073b1
             get_scsi_pt_transport_err_str(ptvp, sizeof(b), b);
2073b1
             pr2ws("%s: transport: %s\n", leadin, b);
2073b1
         }
2073b1
-        /* Shall we favour sense data over a transport error (given both) */
2073b1
 #ifdef SG_LIB_LINUX
2073b1
-        favour_sense = false; /* DRIVER_SENSE is not passed through */
2073b1
+        return -1;      /* DRIVER_SENSE is not passed through */
2073b1
 #else
2073b1
-        favour_sense = ((SAM_STAT_CHECK_CONDITION ==
2073b1
-                            get_scsi_pt_status_response(ptvp)) && (slen > 0));
2073b1
+        /* Shall we favour sense data over a transport error (given both) */
2073b1
+        {
2073b1
+            bool favour_sense = ((SAM_STAT_CHECK_CONDITION ==
2073b1
+                    get_scsi_pt_status_response(ptvp)) && (slen > 0));
2073b1
+
2073b1
+            if (favour_sense)
2073b1
+                return sg_cmds_process_helper(leadin, req_din_x, act_din_x,
2073b1
+                                              req_dout_x, act_dout_x, sbp,
2073b1
+                                              slen, noisy, verbose,
2073b1
+                                              o_sense_cat);
2073b1
+            else
2073b1
+                return -1;
2073b1
+        }
2073b1
 #endif
2073b1
-        if (favour_sense)
2073b1
-            return sg_cmds_process_helper(leadin, req_din_x, act_din_x,
2073b1
-                                          req_dout_x, act_dout_x, sbp, slen,
2073b1
-                                          noisy, verbose, o_sense_cat);
2073b1
-        else
2073b1
-            return -1;
2073b1
     case SCSI_PT_RESULT_OS_ERR:
2073b1
         if (verbose || noisy) {
2073b1
             get_scsi_pt_os_err_str(ptvp, sizeof(b), b);
2073b1
diff --git a/lib/sg_cmds_extra.c b/lib/sg_cmds_extra.c
2073b1
index 7d4f453..bacb033 100644
2073b1
--- a/lib/sg_cmds_extra.c
2073b1
+++ b/lib/sg_cmds_extra.c
2073b1
@@ -1807,6 +1807,7 @@ sg_ll_ata_pt(int sg_fd, const uint8_t * cdbp, int cdb_len,
2073b1
     int k, res, slen, duration;
2073b1
     int ret = -1;
2073b1
     uint8_t apt_cdb[ATA_PT_32_CMDLEN];
2073b1
+    uint8_t incoming_apt_cdb[ATA_PT_32_CMDLEN];
2073b1
     uint8_t sense_b[SENSE_BUFF_LEN] = {0};
2073b1
     uint8_t * sp;
2073b1
     const uint8_t * bp;
2073b1
@@ -1815,18 +1816,25 @@ sg_ll_ata_pt(int sg_fd, const uint8_t * cdbp, int cdb_len,
2073b1
     char b[256];
2073b1
 
2073b1
     memset(apt_cdb, 0, sizeof(apt_cdb));
2073b1
+    memset(incoming_apt_cdb, 0, sizeof(incoming_apt_cdb));
2073b1
+    if (NULL == cdbp) {
2073b1
+        if (vb)
2073b1
+            pr2ws("NULL cdb pointer\n");
2073b1
+        return -1;
2073b1
+    }
2073b1
+    memcpy(incoming_apt_cdb, cdbp, cdb_len);
2073b1
     b[0] = '\0';
2073b1
     switch (cdb_len) {
2073b1
     case 12:
2073b1
         cnamep = "ATA pass-through(12)";
2073b1
         apt_cdb[0] = ATA_PT_12_CMD;
2073b1
-        memcpy(apt_cdb + 1, cdbp + 1,  10);
2073b1
+        memcpy(apt_cdb + 1, incoming_apt_cdb + 1,  10);
2073b1
         /* control byte at cdb[11] left at zero */
2073b1
         break;
2073b1
     case 16:
2073b1
         cnamep = "ATA pass-through(16)";
2073b1
         apt_cdb[0] = ATA_PT_16_CMD;
2073b1
-        memcpy(apt_cdb + 1, cdbp + 1,  14);
2073b1
+        memcpy(apt_cdb + 1, incoming_apt_cdb + 1,  14);
2073b1
         /* control byte at cdb[15] left at zero */
2073b1
         break;
2073b1
     case 32:
2073b1
@@ -1835,17 +1843,12 @@ sg_ll_ata_pt(int sg_fd, const uint8_t * cdbp, int cdb_len,
2073b1
         /* control byte at cdb[1] left at zero */
2073b1
         apt_cdb[7] = 0x18;    /* length starting at next byte */
2073b1
         sg_put_unaligned_be16(ATA_PT_32_SA, apt_cdb + 8);
2073b1
-        memcpy(apt_cdb + 10, cdbp + 10,  32 - 10);
2073b1
+        memcpy(apt_cdb + 10, incoming_apt_cdb + 10,  32 - 10);
2073b1
         break;
2073b1
     default:
2073b1
         pr2ws("cdb_len must be 12, 16 or 32\n");
2073b1
         return -1;
2073b1
     }
2073b1
-    if (NULL == cdbp) {
2073b1
-        if (vb)
2073b1
-            pr2ws("%s NULL cdb pointer\n", cnamep);
2073b1
-        return -1;
2073b1
-    }
2073b1
     if (sensep && (max_sense_len >= (int)sizeof(sense_b))) {
2073b1
         sp = sensep;
2073b1
         slen = max_sense_len;
2073b1
diff --git a/lib/sg_lib.c b/lib/sg_lib.c
2073b1
index 35f0fbd..1b267e4 100644
2073b1
--- a/lib/sg_lib.c
2073b1
+++ b/lib/sg_lib.c
2073b1
@@ -3556,16 +3556,15 @@ sg_f2hex_arr(const char * fname, bool as_binary, bool no_space,
2073b1
         k = read(fd, mp_arr, max_arr_len);
2073b1
         if (k <= 0) {
2073b1
             if (0 == k) {
2073b1
-                ret = SG_LIB_SYNTAX_ERROR;
2073b1
+                ret = SG_LIB_FILE_ERROR;
2073b1
                 pr2ws("read 0 bytes from binary file %s\n", fname);
2073b1
             } else {
2073b1
                 ret = sg_convert_errno(errno);
2073b1
                 pr2ws("read from binary file %s: %s\n", fname,
2073b1
                         safe_strerror(errno));
2073b1
             }
2073b1
-            goto bin_fini;
2073b1
-        }
2073b1
-        if ((0 == fstat(fd, &a_stat)) && S_ISFIFO(a_stat.st_mode)) {
2073b1
+        } else if ((k < max_arr_len) && (0 == fstat(fd, &a_stat)) &&
2073b1
+                   S_ISFIFO(a_stat.st_mode)) {
2073b1
             /* pipe; keep reading till error or 0 read */
2073b1
             while (k < max_arr_len) {
2073b1
                 m = read(fd, mp_arr + k, max_arr_len - k);
2073b1
@@ -3576,13 +3575,13 @@ sg_f2hex_arr(const char * fname, bool as_binary, bool no_space,
2073b1
                     pr2ws("read from binary pipe %s: %s\n", fname,
2073b1
                             safe_strerror(err));
2073b1
                     ret = sg_convert_errno(err);
2073b1
-                    goto bin_fini;
2073b1
+                    break;
2073b1
                 }
2073b1
                 k += m;
2073b1
             }
2073b1
         }
2073b1
-        *mp_arr_len = k;
2073b1
-bin_fini:
2073b1
+        if (k >= 0)
2073b1
+            *mp_arr_len = k;
2073b1
         if ((fd >= 0) && (! has_stdin))
2073b1
             close(fd);
2073b1
         return ret;
2073b1
@@ -3623,9 +3622,17 @@ sg_f2hex_arr(const char * fname, bool as_binary, bool no_space,
2073b1
             if (isxdigit(line[0])) {
2073b1
                 carry_over[1] = line[0];
2073b1
                 carry_over[2] = '\0';
2073b1
-                if (1 == sscanf(carry_over, "%4x", &h))
2073b1
-                    mp_arr[off - 1] = h;       /* back up and overwrite */
2073b1
-                else {
2073b1
+                if (1 == sscanf(carry_over, "%4x", &h)) {
2073b1
+                    if (off > 0) {
2073b1
+                        if (off > max_arr_len) {
2073b1
+                            pr2ws("%s: array length exceeded\n", __func__);
2073b1
+                            ret = SG_LIB_LBA_OUT_OF_RANGE;
2073b1
+                            *mp_arr_len = max_arr_len;
2073b1
+                            goto fini;
2073b1
+                        } else
2073b1
+                            mp_arr[off - 1] = h; /* back up and overwrite */
2073b1
+                    }
2073b1
+                } else {
2073b1
                     pr2ws("%s: carry_over error ['%s'] around line %d\n",
2073b1
                             __func__, carry_over, j + 1);
2073b1
                     ret = SG_LIB_SYNTAX_ERROR;
2073b1
@@ -3667,8 +3674,8 @@ sg_f2hex_arr(const char * fname, bool as_binary, bool no_space,
2073b1
                     *mp_arr_len = max_arr_len;
2073b1
                     ret = SG_LIB_LBA_OUT_OF_RANGE;
2073b1
                     goto fini;
2073b1
-                }
2073b1
-                mp_arr[off + k] = h;
2073b1
+                } else
2073b1
+                    mp_arr[off + k] = h;
2073b1
             }
2073b1
             if (isxdigit(*lcp) && (! isxdigit(*(lcp + 1))))
2073b1
                 carry_over[0] = *lcp;
2073b1
@@ -3692,8 +3699,8 @@ sg_f2hex_arr(const char * fname, bool as_binary, bool no_space,
2073b1
                         ret = SG_LIB_LBA_OUT_OF_RANGE;
2073b1
                         *mp_arr_len = max_arr_len;
2073b1
                         goto fini;
2073b1
-                    }
2073b1
-                    mp_arr[off + k] = h;
2073b1
+                    } else
2073b1
+                        mp_arr[off + k] = h;
2073b1
                     lcp = strpbrk(lcp, " ,\t");
2073b1
                     if (NULL == lcp)
2073b1
                         break;
2073b1
@@ -3766,7 +3773,11 @@ uint32_t
2073b1
 sg_get_page_size(void)
2073b1
 {
2073b1
 #if defined(HAVE_SYSCONF) && defined(_SC_PAGESIZE)
2073b1
-    return (uint32_t)sysconf(_SC_PAGESIZE); /* POSIX.1 (was getpagesize()) */
2073b1
+    {
2073b1
+        long res = sysconf(_SC_PAGESIZE);   /* POSIX.1 (was getpagesize()) */
2073b1
+
2073b1
+        return (res <= 0) ? 4096 : res;
2073b1
+    }
2073b1
 #elif defined(SG_LIB_WIN32)
2073b1
     static bool got_page_size = false;
2073b1
     static uint32_t win_page_size;
2073b1
diff --git a/src/sg_dd.c b/src/sg_dd.c
2073b1
index 2fa3750..65f7698 100644
2073b1
--- a/src/sg_dd.c
2073b1
+++ b/src/sg_dd.c
2073b1
@@ -85,6 +85,8 @@ static const char * version_str = "6.31 20211114";
2073b1
 #define DEF_BLOCKS_PER_2048TRANSFER 32
2073b1
 #define DEF_SCSI_CDBSZ 10
2073b1
 #define MAX_SCSI_CDBSZ 16
2073b1
+#define MAX_BPT_VALUE (1 << 24)         /* used for maximum bs as well */
2073b1
+#define MAX_COUNT_SKIP_SEEK (1LL << 48) /* coverity wants upper bound */
2073b1
 
2073b1
 #define DEF_MODE_CDB_SZ 10
2073b1
 #define DEF_MODE_RESP_LEN 252
2073b1
@@ -1848,15 +1850,16 @@ main(int argc, char * argv[])
2073b1
             bpt_given = true;
2073b1
         } else if (0 == strcmp(key, "bs")) {
2073b1
             blk_sz = sg_get_num(buf);
2073b1
-            bpt_given = true;
2073b1
-        } else if (0 == strcmp(key, "bs")) {
2073b1
-            blk_sz = sg_get_num(buf);
2073b1
-            if (-1 == blk_sz) {
2073b1
+            if ((blk_sz < 0) || (blk_sz > MAX_BPT_VALUE)) {
2073b1
                 pr2serr(ME "bad argument to 'bs='\n");
2073b1
                 return SG_LIB_SYNTAX_ERROR;
2073b1
             }
2073b1
         } else if (0 == strcmp(key, "cdbsz")) {
2073b1
             iflag.cdbsz = sg_get_num(buf);
2073b1
+            if ((iflag.cdbsz < 6) || (iflag.cdbsz > 32)) {
2073b1
+                pr2serr(ME "'cdbsz' expects 6, 10, 12, 16 or 32\n");
2073b1
+                return SG_LIB_SYNTAX_ERROR;
2073b1
+            }
2073b1
             oflag.cdbsz = iflag.cdbsz;
2073b1
             cdbsz_given = true;
2073b1
         } else if (0 == strcmp(key, "cdl")) {
2073b1
@@ -1894,7 +1897,7 @@ main(int argc, char * argv[])
2073b1
         } else if (0 == strcmp(key, "count")) {
2073b1
             if (0 != strcmp("-1", buf)) {
2073b1
                 dd_count = sg_get_llnum(buf);
2073b1
-                if (-1LL == dd_count) {
2073b1
+                if ((dd_count < 0) || (dd_count > MAX_COUNT_SKIP_SEEK)) {
2073b1
                     pr2serr(ME "bad argument to 'count='\n");
2073b1
                     return SG_LIB_SYNTAX_ERROR;
2073b1
                 }
2073b1
@@ -1906,9 +1909,13 @@ main(int argc, char * argv[])
2073b1
             t = sg_get_num(buf);
2073b1
             oflag.fua = !! (t & 1);
2073b1
             iflag.fua = !! (t & 2);
2073b1
-        } else if (0 == strcmp(key, "ibs"))
2073b1
+        } else if (0 == strcmp(key, "ibs")) {
2073b1
             ibs = sg_get_num(buf);
2073b1
-        else if (strcmp(key, "if") == 0) {
2073b1
+            if ((ibs < 0) || (ibs > MAX_BPT_VALUE)) {
2073b1
+                pr2serr(ME "bad argument to 'ibs='\n");
2073b1
+                return SG_LIB_SYNTAX_ERROR;
2073b1
+            }
2073b1
+        } else if (strcmp(key, "if") == 0) {
2073b1
             if ('\0' != inf[0]) {
2073b1
                 pr2serr("Second IFILE argument??\n");
2073b1
                 return SG_LIB_SYNTAX_ERROR;
2073b1
@@ -1921,9 +1928,13 @@ main(int argc, char * argv[])
2073b1
                 pr2serr(ME "bad argument to 'iflag='\n");
2073b1
                 return SG_LIB_SYNTAX_ERROR;
2073b1
             }
2073b1
-        } else if (0 == strcmp(key, "obs"))
2073b1
+        } else if (0 == strcmp(key, "obs")) {
2073b1
             obs = sg_get_num(buf);
2073b1
-        else if (0 == strcmp(key, "odir")) {
2073b1
+            if ((obs < 0) || (obs > MAX_BPT_VALUE)) {
2073b1
+                pr2serr(ME "bad argument to 'obs='\n");
2073b1
+                return SG_LIB_SYNTAX_ERROR;
2073b1
+            }
2073b1
+        } else if (0 == strcmp(key, "odir")) {
2073b1
             iflag.direct = !! sg_get_num(buf);
2073b1
             oflag.direct = iflag.direct;
2073b1
         } else if (strcmp(key, "of") == 0) {
2073b1
@@ -1956,13 +1967,13 @@ main(int argc, char * argv[])
2073b1
             }
2073b1
         } else if (0 == strcmp(key, "seek")) {
2073b1
             seek = sg_get_llnum(buf);
2073b1
-            if (-1LL == seek) {
2073b1
+            if ((seek < 0) || (seek > MAX_COUNT_SKIP_SEEK)) {
2073b1
                 pr2serr(ME "bad argument to 'seek='\n");
2073b1
                 return SG_LIB_SYNTAX_ERROR;
2073b1
             }
2073b1
         } else if (0 == strcmp(key, "skip")) {
2073b1
             skip = sg_get_llnum(buf);
2073b1
-            if (-1LL == skip) {
2073b1
+            if ((skip < 0) || (skip > MAX_COUNT_SKIP_SEEK)) {
2073b1
                 pr2serr(ME "bad argument to 'skip='\n");
2073b1
                 return SG_LIB_SYNTAX_ERROR;
2073b1
             }
2073b1
@@ -2080,8 +2091,8 @@ main(int argc, char * argv[])
2073b1
         pr2serr("Can't use both append and seek switches\n");
2073b1
         return SG_LIB_CONTRADICT;
2073b1
     }
2073b1
-    if (bpt < 1) {
2073b1
-        pr2serr("bpt must be greater than 0\n");
2073b1
+    if ((bpt < 1) || (bpt > MAX_BPT_VALUE)) {
2073b1
+        pr2serr("bpt must be > 0 and <= %d\n", MAX_BPT_VALUE);
2073b1
         return SG_LIB_SYNTAX_ERROR;
2073b1
     }
2073b1
     if (iflag.sparse)
2073b1
diff --git a/src/sg_logs.c b/src/sg_logs.c
2073b1
index 694ee6e..de5d339 100644
2073b1
--- a/src/sg_logs.c
2073b1
+++ b/src/sg_logs.c
2073b1
@@ -669,8 +673,8 @@ get_vp_mask(int vpn)
2073b1
     if (vpn < 0)
2073b1
         return 0;
2073b1
     else
2073b1
-        return (vpn > (32 - MVP_OFFSET)) ?  OVP_ALL :
2073b1
-                                            (1 << (vpn + MVP_OFFSET));
2073b1
+        return (vpn >= (32 - MVP_OFFSET)) ?  OVP_ALL :
2073b1
+                                             (1 << (vpn + MVP_OFFSET));
2073b1
 }
2073b1
 
2073b1
 static int
2073b1
diff --git a/src/sg_map26.c b/src/sg_map26.c
2073b1
index 3fca019..2ea8d69 100644
2073b1
--- a/src/sg_map26.c
2073b1
+++ b/src/sg_map26.c
2073b1
@@ -396,7 +396,7 @@ list_matching_nodes(const char * dir_name, int file_type, int majj, int minn,
2073b1
 }
2073b1
 
2073b1
 struct sg_item_t {
2073b1
-        char name[NAME_LEN_MAX];
2073b1
+        char name[NAME_LEN_MAX + 2];
2073b1
         int ft;
2073b1
         int nt;
2073b1
         int d_type;
2073b1
diff --git a/src/sg_modes.c b/src/sg_modes.c
2073b1
index 47062b1..c0fc87f 100644
2073b1
--- a/src/sg_modes.c
2073b1
+++ b/src/sg_modes.c
2073b1
@@ -790,6 +790,9 @@ dStrRaw(const uint8_t * str, int len)
2073b1
         printf("%c", str[k]);
2073b1
 }
2073b1
 
2073b1
+/* Note to coverity: this function is safe as long as the page_code_desc
2073b1
+ * objects pointed to by pcdp have a sentinel object at the end of each
2073b1
+ * array. And they do by design.*/
2073b1
 static int
2073b1
 count_desc_elems(const struct page_code_desc * pcdp)
2073b1
 {
2073b1
diff --git a/src/sg_persist.c b/src/sg_persist.c
2073b1
index e779fe4..872f16e 100644
2073b1
--- a/src/sg_persist.c
2073b1
+++ b/src/sg_persist.c
2073b1
@@ -1279,7 +1279,9 @@ main(int argc, char * argv[])
2073b1
             flagged = true;
2073b1
             goto fini;
2073b1
         }
2073b1
-        sg_cmds_close_device(sg_fd);
2073b1
+        res = sg_cmds_close_device(sg_fd);
2073b1
+        if (res < 0)
2073b1
+            pr2serr("%s: sg_cmds_close_device() failed res=%d\n", ME, res);
2073b1
     }
2073b1
 
2073b1
     if (! op->readwrite_force) {
2073b1
diff --git a/src/sg_raw.c b/src/sg_raw.c
2073b1
index 9cfa19c..453a85a 100644
2073b1
--- a/src/sg_raw.c
2073b1
+++ b/src/sg_raw.c
2073b1
@@ -323,7 +323,7 @@ parse_cmd_line(struct opts_t * op, int argc, char *argv[])
2073b1
             return SG_LIB_SYNTAX_ERROR;
2073b1
         }
2073b1
 
2073b1
-        if (op->cdb_length > MAX_SCSI_CDBSZ) {
2073b1
+        if (op->cdb_length >= MAX_SCSI_CDBSZ) {
2073b1
             pr2serr("CDB too long (max. %d bytes)\n", MAX_SCSI_CDBSZ);
2073b1
             return SG_LIB_SYNTAX_ERROR;
2073b1
         }
2073b1
diff --git a/src/sg_read.c b/src/sg_read.c
2073b1
index 628e0d8..a4f7cee 100644
2073b1
--- a/src/sg_read.c
2073b1
+++ b/src/sg_read.c
2073b1
@@ -58,12 +58,14 @@
2073b1
 #include "sg_pr2serr.h"
2073b1
 
2073b1
 
2073b1
-static const char * version_str = "1.36 20191220";
2073b1
+static const char * version_str = "1.38 20220118";
2073b1
 
2073b1
 #define DEF_BLOCK_SIZE 512
2073b1
 #define DEF_BLOCKS_PER_TRANSFER 128
2073b1
 #define DEF_SCSI_CDBSZ 10
2073b1
 #define MAX_SCSI_CDBSZ 16
2073b1
+#define MAX_BPT_VALUE (1 << 24)         /* used for maximum bs as well */
2073b1
+#define MAX_COUNT_SKIP_SEEK (1LL << 48) /* coverity wants upper bound */
2073b1
 
2073b1
 #define ME "sg_read: "
2073b1
 
2073b1
@@ -456,30 +458,35 @@ main(int argc, char * argv[])
2073b1
             do_blk_sgio = !! sg_get_num(buf);
2073b1
         else if (0 == strcmp(key,"bpt")) {
2073b1
             bpt = sg_get_num(buf);
2073b1
-            if (-1 == bpt) {
2073b1
+            if ((bpt < 0) || (bpt > MAX_BPT_VALUE)) {
2073b1
                 pr2serr( ME "bad argument to 'bpt'\n");
2073b1
                 return SG_LIB_SYNTAX_ERROR;
2073b1
             }
2073b1
         } else if (0 == strcmp(key,"bs")) {
2073b1
             bs = sg_get_num(buf);
2073b1
-            if (-1 == bs) {
2073b1
+            if ((bs < 0) || (bs > MAX_BPT_VALUE)) {
2073b1
                 pr2serr( ME "bad argument to 'bs'\n");
2073b1
                 return SG_LIB_SYNTAX_ERROR;
2073b1
             }
2073b1
-        } else if (0 == strcmp(key,"cdbsz"))
2073b1
+        } else if (0 == strcmp(key,"cdbsz")) {
2073b1
             scsi_cdbsz = sg_get_num(buf);
2073b1
-        else if (0 == strcmp(key,"count")) {
2073b1
+            if ((scsi_cdbsz < 0) || (scsi_cdbsz > 32)) {
2073b1
+                pr2serr( ME "bad argument to 'cdbsz', expect 6, 10, 12, 16 "
2073b1
+                        "or 32\n");
2073b1
+                return SG_LIB_SYNTAX_ERROR;
2073b1
+            }
2073b1
+        } else if (0 == strcmp(key,"count")) {
2073b1
             count_given = true;
2073b1
             if ('-' == *buf) {
2073b1
                 dd_count = sg_get_llnum(buf + 1);
2073b1
-                if (-1 == dd_count) {
2073b1
+                if ((dd_count < 0) || (dd_count > MAX_COUNT_SKIP_SEEK)) {
2073b1
                     pr2serr( ME "bad argument to 'count'\n");
2073b1
                     return SG_LIB_SYNTAX_ERROR;
2073b1
                 }
2073b1
                 dd_count = - dd_count;
2073b1
             } else {
2073b1
                 dd_count = sg_get_llnum(buf);
2073b1
-                if (-1 == dd_count) {
2073b1
+                if ((dd_count < 0) || (dd_count > MAX_COUNT_SKIP_SEEK)) {
2073b1
                     pr2serr( ME "bad argument to 'count'\n");
2073b1
                     return SG_LIB_SYNTAX_ERROR;
2073b1
                 }
2073b1
@@ -504,7 +511,7 @@ main(int argc, char * argv[])
2073b1
             outf[INF_SZ - 1] = '\0';
2073b1
         } else if (0 == strcmp(key,"skip")) {
2073b1
             skip = sg_get_llnum(buf);
2073b1
-            if (-1 == skip) {
2073b1
+            if ((skip < 0) || (skip > MAX_COUNT_SKIP_SEEK)) {
2073b1
                 pr2serr( ME "bad argument to 'skip'\n");
2073b1
                 return SG_LIB_SYNTAX_ERROR;
2073b1
             }
2073b1
diff --git a/src/sg_read_buffer.c b/src/sg_read_buffer.c
2073b1
index 93c32a5..01a79c3 100644
2073b1
--- a/src/sg_read_buffer.c
2073b1
+++ b/src/sg_read_buffer.c
2073b1
@@ -483,7 +483,10 @@ main(int argc, char * argv[])
2073b1
             do_long = true;
2073b1
             break;
2073b1
         case 'm':
2073b1
-            if (isdigit((uint8_t)*optarg)) {
2073b1
+            if (NULL == optarg) {
2073b1
+                pr2serr("bad argument to '--mode'\n");
2073b1
+                return SG_LIB_SYNTAX_ERROR;
2073b1
+            } else if (isdigit((uint8_t)*optarg)) {
2073b1
                 rb_mode = sg_get_num(optarg);
2073b1
                 if ((rb_mode < 0) || (rb_mode > 31)) {
2073b1
                     pr2serr("argument to '--mode' should be in the range 0 "
2073b1
diff --git a/src/sg_sat_phy_event.c b/src/sg_sat_phy_event.c
2073b1
index 9b1f588..090ecf7 100644
2073b1
--- a/src/sg_sat_phy_event.c
2073b1
+++ b/src/sg_sat_phy_event.c
2073b1
@@ -154,15 +154,17 @@ dStrRaw(const uint8_t * str, int len)
2073b1
 }
2073b1
 
2073b1
 /* ATA READ LOG EXT command [2Fh, PIO data-in] */
2073b1
-/* N.B. "log_addr" is the log page number, "page_in_log" is usually false */
2073b1
+/* N.B. "log_addr" is the log page number, "page_in_log" is usually 0 */
2073b1
 static int
2073b1
-do_read_log_ext(int sg_fd, int log_addr, bool page_in_log, int feature,
2073b1
+do_read_log_ext(int sg_fd, int log_addr, int page_in_log, int feature,
2073b1
                 int blk_count, void * resp, int mx_resp_len, int cdb_len,
2073b1
                 bool ck_cond, bool extend, int do_hex, bool do_raw,
2073b1
                 int verbose)
2073b1
 {
2073b1
     /* Following for ATA READ/WRITE MULTIPLE (EXT) cmds, normally 0 */
2073b1
+#if 0
2073b1
     bool t_type = false;/* false -> 512 byte LBs, true -> device's LB size */
2073b1
+#endif
2073b1
     bool t_dir = true;  /* false -> to device, 1 -> from device */
2073b1
     bool byte_block = true; /* false -> bytes, true -> 512 byte blocks (if
2073b1
                                t_type=false) */
2073b1
@@ -205,8 +207,10 @@ do_read_log_ext(int sg_fd, int log_addr, bool page_in_log, int feature,
2073b1
         apt_cdb[2] = t_length;
2073b1
         if (ck_cond)
2073b1
             apt_cdb[2] |= 0x20;
2073b1
+#if 0
2073b1
         if (t_type)
2073b1
             apt_cdb[2] |= 0x10;
2073b1
+#endif
2073b1
         if (t_dir)
2073b1
             apt_cdb[2] |= 0x8;
2073b1
         if (byte_block)
2073b1
@@ -226,8 +230,10 @@ do_read_log_ext(int sg_fd, int log_addr, bool page_in_log, int feature,
2073b1
         apt12_cdb[2] = t_length;
2073b1
         if (ck_cond)
2073b1
             apt12_cdb[2] |= 0x20;
2073b1
+#if 0
2073b1
         if (t_type)
2073b1
             apt12_cdb[2] |= 0x10;
2073b1
+#endif
2073b1
         if (t_dir)
2073b1
             apt12_cdb[2] |= 0x8;
2073b1
         if (byte_block)
2073b1
@@ -487,7 +493,7 @@ int main(int argc, char * argv[])
2073b1
         return sg_convert_errno(err);
2073b1
     }
2073b1
     ret = do_read_log_ext(sg_fd, SATA_PHY_EVENT_LPAGE,
2073b1
-                          false /* page_in_log */,
2073b1
+                          0 /* page_in_log */,
2073b1
                           (reset ? 1 : 0) /* feature */,
2073b1
                           1 /* blk_count */, inBuff,
2073b1
                           READ_LOG_EXT_RESPONSE_LEN, cdb_len, ck_cond,
2073b1
diff --git a/src/sg_scan_linux.c b/src/sg_scan_linux.c
2073b1
index 7354ad4..c04206a 100644
2073b1
--- a/src/sg_scan_linux.c
2073b1
+++ b/src/sg_scan_linux.c
2073b1
@@ -203,6 +203,7 @@ int main(int argc, char * argv[])
2073b1
         printf(ME "Out of memory\n");
2073b1
         return SG_LIB_CAT_OTHER;
2073b1
     }
2073b1
+    strcpy(fname, "<null>");
2073b1
 
2073b1
     for (k = 1, j = 0; k < argc; ++k) {
2073b1
         cp = argv[k];
2073b1
diff --git a/src/sg_stpg.c b/src/sg_stpg.c
2073b1
index e57b13c..a12b5ca 100644
2073b1
--- a/src/sg_stpg.c
2073b1
+++ b/src/sg_stpg.c
2073b1
@@ -142,15 +142,14 @@ dStrRaw(const uint8_t * str, int len)
2073b1
 static int
2073b1
 decode_target_port(uint8_t * buff, int len, int *d_id, int *d_tpg)
2073b1
 {
2073b1
-    int c_set, assoc, desig_type, i_len;
2073b1
-    int off, u;
2073b1
+    int c_set, assoc, desig_type, i_len, off;
2073b1
     const uint8_t * bp;
2073b1
     const uint8_t * ip;
2073b1
 
2073b1
     *d_id = -1;
2073b1
     *d_tpg = -1;
2073b1
     off = -1;
2073b1
-    while ((u = sg_vpd_dev_id_iter(buff, len, &off, -1, -1, -1)) == 0) {
2073b1
+    while (sg_vpd_dev_id_iter(buff, len, &off, -1, -1, -1) == 0) {
2073b1
         bp = buff + off;
2073b1
         i_len = bp[3];
2073b1
         if ((off + i_len + 4) > len) {
2073b1
diff --git a/src/sg_vpd.c b/src/sg_vpd.c
2073b1
index 0ca6303..1a74af5 100644
2073b1
--- a/src/sg_vpd.c
2073b1
+++ b/src/sg_vpd.c
2073b1
@@ -755,6 +755,7 @@ decode_dev_ids_quiet(uint8_t * buff, int len, int m_assoc,
2073b1
     uint8_t sas_tport_addr[8];
2073b1
 
2073b1
     rtp = 0;
2073b1
+    u = 0;
2073b1
     memset(sas_tport_addr, 0, sizeof(sas_tport_addr));
2073b1
     for (k = 0, off = -1; true; ++k) {
2073b1
         if ((0 == k) && (0 != buff[2])) {
2073b1
diff --git a/src/sg_xcopy.c b/src/sg_xcopy.c
2073b1
index 4307668..39ad83c 100644
2073b1
--- a/src/sg_xcopy.c
2073b1
+++ b/src/sg_xcopy.c
2073b1
@@ -306,7 +306,7 @@ open_sg(struct xcopy_fp_t * fp, int vb)
2073b1
     int devmajor, devminor, offset;
2073b1
     struct sg_simple_inquiry_resp sir;
2073b1
     char ebuff[EBUFF_SZ];
2073b1
-    int len;
2073b1
+    int len, res;
2073b1
 
2073b1
     devmajor = major(fp->devno);
2073b1
     devminor = minor(fp->devno);
2073b1
@@ -344,7 +344,9 @@ open_sg(struct xcopy_fp_t * fp, int vb)
2073b1
     }
2073b1
     if (sg_simple_inquiry(fp->sg_fd, &sir, false, vb)) {
2073b1
         pr2serr("INQUIRY failed on %s\n", ebuff);
2073b1
-        sg_cmds_close_device(fp->sg_fd);
2073b1
+        res = sg_cmds_close_device(fp->sg_fd);
2073b1
+        if (res < 0)
2073b1
+            pr2serr("sg_cmds_close_device() failed as well\n");
2073b1
         fp->sg_fd = -1;
2073b1
         return -1;
2073b1
     }
2073b1
@@ -1024,7 +1026,7 @@ desc_from_vpd_id(int sg_fd, uint8_t *desc, int desc_len,
2073b1
     int res, verb;
2073b1
     uint8_t rcBuff[256], *bp, *best = NULL;
2073b1
     unsigned int len = 254;
2073b1
-    int off = -1, u, i_len, best_len = 0, assoc, desig, f_desig = 0;
2073b1
+    int off = -1, i_len, best_len = 0, assoc, desig, f_desig = 0;
2073b1
     char b[80];
2073b1
 
2073b1
     verb = (verbose ? verbose - 1: 0);
2073b1
@@ -1060,8 +1062,7 @@ desc_from_vpd_id(int sg_fd, uint8_t *desc, int desc_len,
2073b1
         hex2stderr(rcBuff, len, 1);
2073b1
     }
2073b1
 
2073b1
-    while ((u = sg_vpd_dev_id_iter(rcBuff + 4, len - 4, &off, 0, -1, -1)) ==
2073b1
-           0) {
2073b1
+    while (sg_vpd_dev_id_iter(rcBuff + 4, len - 4, &off, 0, -1, -1) == 0) {
2073b1
         bp = rcBuff + 4 + off;
2073b1
         i_len = bp[3];
2073b1
         if (((unsigned int)off + i_len + 4) > len) {
2073b1
diff --git a/src/sgm_dd.c b/src/sgm_dd.c
2073b1
index e95fca9..aa656b3 100644
2073b1
--- a/src/sgm_dd.c
2073b1
+++ b/src/sgm_dd.c
2073b1
@@ -69,13 +69,15 @@
2073b1
 #include "sg_pr2serr.h"
2073b1
 
2073b1
 
2073b1
-static const char * version_str = "1.17 20211024";
2073b1
+static const char * version_str = "1.19 20220118";
2073b1
 
2073b1
 #define DEF_BLOCK_SIZE 512
2073b1
 #define DEF_BLOCKS_PER_TRANSFER 128
2073b1
 #define DEF_BLOCKS_PER_2048TRANSFER 32
2073b1
 #define DEF_SCSI_CDBSZ 10
2073b1
 #define MAX_SCSI_CDBSZ 16
2073b1
+#define MAX_BPT_VALUE (1 << 24)         /* used for maximum bs as well */
2073b1
+#define MAX_COUNT_SKIP_SEEK (1LL << 48) /* coverity wants upper bound */
2073b1
 
2073b1
 #define ME "sgm_dd: "
2073b1
 
2073b1
@@ -795,6 +797,10 @@ main(int argc, char * argv[])
2073b1
             }
2073b1
         } else if (0 == strcmp(key,"cdbsz")) {
2073b1
             scsi_cdbsz_in = sg_get_num(buf);
2073b1
+            if ((scsi_cdbsz_in < 6) || (scsi_cdbsz_in > 32)) {
2073b1
+                pr2serr(ME "'cdbsz' expects 6, 10, 12, 16 or 32\n");
2073b1
+                return SG_LIB_SYNTAX_ERROR;
2073b1
+            }
2073b1
             scsi_cdbsz_out = scsi_cdbsz_in;
2073b1
             cdbsz_given = true;
2073b1
         } else if (0 == strcmp(key,"coe")) {
2073b1
@@ -803,7 +809,7 @@ main(int argc, char * argv[])
2073b1
         } else if (0 == strcmp(key,"count")) {
2073b1
             if (0 != strcmp("-1", buf)) {
2073b1
                 dd_count = sg_get_llnum(buf);
2073b1
-                if (-1LL == dd_count) {
2073b1
+                if ((dd_count < 0) || (dd_count > MAX_COUNT_SKIP_SEEK)) {
2073b1
                     pr2serr(ME "bad argument to 'count'\n");
2073b1
                     return SG_LIB_SYNTAX_ERROR;
2073b1
                 }
2073b1
@@ -818,7 +824,7 @@ main(int argc, char * argv[])
2073b1
                 in_flags.fua = true;
2073b1
         } else if (0 == strcmp(key,"ibs")) {
2073b1
             ibs = sg_get_num(buf);
2073b1
-            if (-1 == ibs) {
2073b1
+            if ((ibs < 0) || (ibs > MAX_BPT_VALUE)) {
2073b1
                 pr2serr(ME "bad argument to 'ibs'\n");
2073b1
                 return SG_LIB_SYNTAX_ERROR;
2073b1
             }
2073b1
@@ -850,19 +856,19 @@ main(int argc, char * argv[])
2073b1
             }
2073b1
         } else if (0 == strcmp(key,"obs")) {
2073b1
             obs = sg_get_num(buf);
2073b1
-            if (-1 == obs) {
2073b1
+            if ((obs < 0) || (obs > MAX_BPT_VALUE)) {
2073b1
                 pr2serr(ME "bad argument to 'obs'\n");
2073b1
                 return SG_LIB_SYNTAX_ERROR;
2073b1
             }
2073b1
         } else if (0 == strcmp(key,"seek")) {
2073b1
             seek = sg_get_llnum(buf);
2073b1
-            if (-1LL == seek) {
2073b1
+            if ((seek < 0) || (seek > MAX_COUNT_SKIP_SEEK)) {
2073b1
                 pr2serr(ME "bad argument to 'seek'\n");
2073b1
                 return SG_LIB_SYNTAX_ERROR;
2073b1
             }
2073b1
         } else if (0 == strcmp(key,"skip")) {
2073b1
             skip = sg_get_llnum(buf);
2073b1
-            if (-1LL == skip) {
2073b1
+            if ((skip < 0) || (skip > MAX_COUNT_SKIP_SEEK)) {
2073b1
                 pr2serr(ME "bad argument to 'skip'\n");
2073b1
                 return SG_LIB_SYNTAX_ERROR;
2073b1
             }
2073b1
@@ -955,8 +961,8 @@ main(int argc, char * argv[])
2073b1
         pr2serr("Can't use both append and seek switches\n");
2073b1
         return SG_LIB_CONTRADICT;
2073b1
     }
2073b1
-    if (bpt < 1) {
2073b1
-        pr2serr("bpt must be greater than 0\n");
2073b1
+    if ((bpt < 1) || (bpt > MAX_BPT_VALUE)) {
2073b1
+        pr2serr("bpt must be > 0 and <= %d\n", MAX_BPT_VALUE);
2073b1
         return SG_LIB_SYNTAX_ERROR;
2073b1
     }
2073b1
     /* defaulting transfer size to 128*2048 for CD/DVDs is too large
2073b1
diff --git a/src/sgp_dd.c b/src/sgp_dd.c
2073b1
index b71bf7b..a36d9d0 100644
2073b1
--- a/src/sgp_dd.c
2073b1
+++ b/src/sgp_dd.c
2073b1
@@ -85,13 +85,15 @@
2073b1
 #include "sg_pr2serr.h"
2073b1
 
2073b1
 
2073b1
-static const char * version_str = "5.83 20211105";
2073b1
+static const char * version_str = "5.84 20220118";
2073b1
 
2073b1
 #define DEF_BLOCK_SIZE 512
2073b1
 #define DEF_BLOCKS_PER_TRANSFER 128
2073b1
 #define DEF_BLOCKS_PER_2048TRANSFER 32
2073b1
 #define DEF_SCSI_CDBSZ 10
2073b1
 #define MAX_SCSI_CDBSZ 16
2073b1
+#define MAX_BPT_VALUE (1 << 24)         /* used for maximum bs as well */
2073b1
+#define MAX_COUNT_SKIP_SEEK (1LL << 48) /* coverity wants upper bound */
2073b1
 
2073b1
 
2073b1
 #define SENSE_BUFF_LEN 64       /* Arbitrary, could be larger */
2073b1
@@ -370,13 +372,15 @@ thread_exit_handler(int sig)
2073b1
 static char *
2073b1
 tsafe_strerror(int code, char * ebp)
2073b1
 {
2073b1
+    int status;
2073b1
     char * cp;
2073b1
 
2073b1
-    pthread_mutex_lock(&strerr_mut);
2073b1
+    status = pthread_mutex_lock(&strerr_mut);
2073b1
+    if (0 != status) pr2serr("lock strerr_mut");
2073b1
     cp = safe_strerror(code);
2073b1
     strncpy(ebp, cp, STRERR_BUFF_LEN);
2073b1
-    pthread_mutex_unlock(&strerr_mut);
2073b1
-
2073b1
+    status = pthread_mutex_unlock(&strerr_mut);
2073b1
+    if (0 != status) pr2serr("unlock strerr_mut");
2073b1
     ebp[STRERR_BUFF_LEN - 1] = '\0';
2073b1
     return ebp;
2073b1
 }
2073b1
@@ -649,8 +653,10 @@ sg_in_open(const char * fnp, struct flags_t * flagp, int bs, int bpt)
2073b1
         perror(ebuff);
2073b1
         return -sg_convert_errno(err);
2073b1
     }
2073b1
-    if (sg_prepare(fd, bs, bpt))
2073b1
+    if (sg_prepare(fd, bs, bpt)) {
2073b1
+        close(fd);
2073b1
         return -SG_LIB_FILE_ERROR;
2073b1
+    }
2073b1
     return fd;
2073b1
 }
2073b1
 
2073b1
@@ -675,8 +681,10 @@ sg_out_open(const char * fnp, struct flags_t * flagp, int bs, int bpt)
2073b1
         perror(ebuff);
2073b1
         return -sg_convert_errno(err);
2073b1
     }
2073b1
-    if (sg_prepare(fd, bs, bpt))
2073b1
+    if (sg_prepare(fd, bs, bpt)) {
2073b1
+        close(fd);
2073b1
         return -SG_LIB_FILE_ERROR;
2073b1
+    }
2073b1
     return fd;
2073b1
 }
2073b1
 
2073b1
@@ -1424,19 +1432,23 @@ main(int argc, char * argv[])
2073b1
         keylen = strlen(key);
2073b1
         if (0 == strcmp(key,"bpt")) {
2073b1
             clp->bpt = sg_get_num(buf);
2073b1
-            if (-1 == clp->bpt) {
2073b1
+            if ((clp->bpt < 0) || (clp->bpt > MAX_BPT_VALUE)) {
2073b1
                 pr2serr("%sbad argument to 'bpt='\n", my_name);
2073b1
                 return SG_LIB_SYNTAX_ERROR;
2073b1
             }
2073b1
             bpt_given = 1;
2073b1
         } else if (0 == strcmp(key,"bs")) {
2073b1
             clp->bs = sg_get_num(buf);
2073b1
-            if (-1 == clp->bs) {
2073b1
+            if ((clp->bs < 0) || (clp->bs > MAX_BPT_VALUE)) {
2073b1
                 pr2serr("%sbad argument to 'bs='\n", my_name);
2073b1
                 return SG_LIB_SYNTAX_ERROR;
2073b1
             }
2073b1
         } else if (0 == strcmp(key,"cdbsz")) {
2073b1
             clp->cdbsz_in = sg_get_num(buf);
2073b1
+            if ((clp->cdbsz_in < 6) || (clp->cdbsz_in > 32)) {
2073b1
+                pr2serr("%s'cdbsz' expects 6, 10, 12, 16 or 32\n", my_name);
2073b1
+                return SG_LIB_SYNTAX_ERROR;
2073b1
+            }
2073b1
             clp->cdbsz_out = clp->cdbsz_in;
2073b1
             cdbsz_given = 1;
2073b1
         } else if (0 == strcmp(key,"coe")) {
2073b1
@@ -1445,7 +1457,7 @@ main(int argc, char * argv[])
2073b1
         } else if (0 == strcmp(key,"count")) {
2073b1
             if (0 != strcmp("-1", buf)) {
2073b1
                 dd_count = sg_get_llnum(buf);
2073b1
-                if (-1LL == dd_count) {
2073b1
+                if ((dd_count < 0) || (dd_count > MAX_COUNT_SKIP_SEEK)) {
2073b1
                     pr2serr("%sbad argument to 'count='\n", my_name);
2073b1
                     return SG_LIB_SYNTAX_ERROR;
2073b1
                 }
2073b1
@@ -1464,7 +1476,7 @@ main(int argc, char * argv[])
2073b1
                 clp->in_flags.fua = true;
2073b1
         } else if (0 == strcmp(key,"ibs")) {
2073b1
             ibs = sg_get_num(buf);
2073b1
-            if (-1 == ibs) {
2073b1
+            if ((ibs < 0) || (ibs > MAX_BPT_VALUE)) {
2073b1
                 pr2serr("%sbad argument to 'ibs='\n", my_name);
2073b1
                 return SG_LIB_SYNTAX_ERROR;
2073b1
             }
2073b1
@@ -1483,7 +1495,7 @@ main(int argc, char * argv[])
2073b1
             }
2073b1
         } else if (0 == strcmp(key,"obs")) {
2073b1
             obs = sg_get_num(buf);
2073b1
-            if (-1 == obs) {
2073b1
+            if ((obs < 0) || (obs > MAX_BPT_VALUE)) {
2073b1
                 pr2serr("%sbad argument to 'obs='\n", my_name);
2073b1
                 return SG_LIB_SYNTAX_ERROR;
2073b1
             }
2073b1
@@ -1502,13 +1514,13 @@ main(int argc, char * argv[])
2073b1
             }
2073b1
         } else if (0 == strcmp(key,"seek")) {
2073b1
             seek = sg_get_llnum(buf);
2073b1
-            if (-1LL == seek) {
2073b1
+            if ((seek < 0) || (seek > MAX_COUNT_SKIP_SEEK)) {
2073b1
                 pr2serr("%sbad argument to 'seek='\n", my_name);
2073b1
                 return SG_LIB_SYNTAX_ERROR;
2073b1
             }
2073b1
         } else if (0 == strcmp(key,"skip")) {
2073b1
             skip = sg_get_llnum(buf);
2073b1
-            if (-1LL == skip) {
2073b1
+            if ((skip < 0) || (skip > MAX_COUNT_SKIP_SEEK)) {
2073b1
                 pr2serr("%sbad argument to 'skip='\n", my_name);
2073b1
                 return SG_LIB_SYNTAX_ERROR;
2073b1
             }
2073b1
@@ -1611,8 +1623,8 @@ main(int argc, char * argv[])
2073b1
         pr2serr("Can't use both append and seek switches\n");
2073b1
         return SG_LIB_SYNTAX_ERROR;
2073b1
     }
2073b1
-    if (clp->bpt < 1) {
2073b1
-        pr2serr("bpt must be greater than 0\n");
2073b1
+    if ((clp->bpt < 1) || (clp->bpt > MAX_BPT_VALUE)) {
2073b1
+        pr2serr("bpt must be > 0 and <= %d\n", MAX_BPT_VALUE);
2073b1
         return SG_LIB_SYNTAX_ERROR;
2073b1
     }
2073b1
     if (clp->in_flags.mmap && clp->out_flags.mmap) {
2073b1
@@ -1851,9 +1863,14 @@ main(int argc, char * argv[])
2073b1
     clp->out_count = dd_count;
2073b1
     clp->out_rem_count = dd_count;
2073b1
     clp->seek = seek;
2073b1
-    clp->out_blk = seek;
2073b1
     status = pthread_mutex_init(&clp->inout_mutex, NULL);
2073b1
     if (0 != status) err_exit(status, "init inout_mutex");
2073b1
+    status = pthread_mutex_lock(&clp->inout_mutex);
2073b1
+    if (0 != status) err_exit(status, "lock inout_mutex");
2073b1
+    clp->out_blk = seek;
2073b1
+    status = pthread_mutex_unlock(&clp->inout_mutex);
2073b1
+    if (0 != status) err_exit(status, "unlock inout_mutex");
2073b1
+
2073b1
     status = pthread_cond_init(&clp->out_sync_cv, NULL);
2073b1
     if (0 != status) err_exit(status, "init out_sync_cv");
2073b1
 
2073b1
diff --git a/testing/sg_mrq_dd.cpp b/testing/sg_mrq_dd.cpp
2073b1
index a97aa9b..7b81a63 100644
2073b1
--- a/testing/sg_mrq_dd.cpp
2073b1
+++ b/testing/sg_mrq_dd.cpp
2073b1
@@ -141,6 +141,8 @@ using namespace std;
2073b1
 #define MAX_SCSI_CDB_SZ 16      /* could be 32 */
2073b1
 #define PACK_ID_TID_MULTIPLIER (0x1000000)      /* 16,777,216 */
2073b1
 #define MAX_SLICES 16           /* number of IFILE,OFILE pairs */
2073b1
+#define MAX_BPT_VALUE (1 << 24)         /* used for maximum bs as well */
2073b1
+#define MAX_COUNT_SKIP_SEEK (1LL << 48) /* coverity wants upper bound */
2073b1
 
2073b1
 #define SENSE_BUFF_LEN 64       /* Arbitrary, could be larger */
2073b1
 #define READ_CAP_REPLY_LEN 8
2073b1
@@ -3361,7 +3363,7 @@ skip_seek(struct global_collection *clp, const char * key, const char * buf,
2073b1
         }
2073b1
     } else {    /* single number on command line (e.g. skip=1234) */
2073b1
         ll = sg_get_llnum(buf);
2073b1
-        if (-1LL == ll) {
2073b1
+        if ((ll < 0) || (ll > MAX_COUNT_SKIP_SEEK)) {
2073b1
             pr2serr("bad argument to '%s='\n", key);
2073b1
             return SG_LIB_SYNTAX_ERROR;
2073b1
         }
2073b1
@@ -3544,14 +3546,14 @@ parse_cmdline_sanity(int argc, char * argv[], struct global_collection * clp,
2073b1
         keylen = strlen(key);
2073b1
         if (0 == strcmp(key, "bpt")) {
2073b1
             clp->bpt = sg_get_num(buf);
2073b1
-            if (-1 == clp->bpt) {
2073b1
+            if ((clp->bpt < 0) || (clp->bpt > MAX_BPT_VALUE)) {
2073b1
                 pr2serr("%sbad argument to 'bpt='\n", my_name);
2073b1
                 goto syn_err;
2073b1
             }
2073b1
             bpt_given = true;
2073b1
         } else if (0 == strcmp(key, "bs")) {
2073b1
             clp->bs = sg_get_num(buf);
2073b1
-            if (-1 == clp->bs) {
2073b1
+            if ((clp->bs < 0) || (clp->bs > MAX_BPT_VALUE)) {
2073b1
                 pr2serr("%sbad argument to 'bs='\n", my_name);
2073b1
                 goto syn_err;
2073b1
             }
2073b1
@@ -3611,7 +3613,8 @@ parse_cmdline_sanity(int argc, char * argv[], struct global_collection * clp,
2073b1
             }
2073b1
             if (0 != strcmp("-1", buf)) {
2073b1
                 clp->dd_count = sg_get_llnum(buf);
2073b1
-                if (-1LL == clp->dd_count) {
2073b1
+                if ((clp->dd_count < 0) ||
2073b1
+                    (clp->dd_count > MAX_COUNT_SKIP_SEEK)) {
2073b1
                     pr2serr("%sbad argument to 'count='\n", my_name);
2073b1
                     goto syn_err;
2073b1
                 }
2073b1
@@ -3622,7 +3625,7 @@ parse_cmdline_sanity(int argc, char * argv[], struct global_collection * clp,
2073b1
             clp->out_flags.dio = clp->in_flags.dio;
2073b1
         } else if (0 == strcmp(key, "elemsz_kb")) {
2073b1
             n = sg_get_num(buf);
2073b1
-            if (n < 1) {
2073b1
+            if ((n < 1) || (n > (MAX_BPT_VALUE / 1024))) {
2073b1
                 pr2serr("elemsz_kb=EKB wants an integer > 0\n");
2073b1
                 goto syn_err;
2073b1
             }
2073b1
@@ -3646,7 +3649,7 @@ parse_cmdline_sanity(int argc, char * argv[], struct global_collection * clp,
2073b1
                 clp->in_flags.fua = true;
2073b1
         } else if (0 == strcmp(key, "ibs")) {
2073b1
             ibs = sg_get_num(buf);
2073b1
-            if (-1 == ibs) {
2073b1
+            if ((ibs < 0) || (ibs > MAX_BPT_VALUE)) {
2073b1
                 pr2serr("%sbad argument to 'ibs='\n", my_name);
2073b1
                 goto syn_err;
2073b1
             }
2073b1
@@ -3700,7 +3703,7 @@ parse_cmdline_sanity(int argc, char * argv[], struct global_collection * clp,
2073b1
             clp->out_flags.no_waitq = true;
2073b1
         } else if (0 == strcmp(key, "obs")) {
2073b1
             obs = sg_get_num(buf);
2073b1
-            if (-1 == obs) {
2073b1
+            if ((obs < 0) || (obs > MAX_BPT_VALUE)) {
2073b1
                 pr2serr("%sbad argument to 'obs='\n", my_name);
2073b1
                 goto syn_err;
2073b1
             }
2073b1
@@ -3769,9 +3772,13 @@ parse_cmdline_sanity(int argc, char * argv[], struct global_collection * clp,
2073b1
             memcpy(skip_buf, buf, n + 1);
2073b1
         } else if (0 == strcmp(key, "sync"))
2073b1
             do_sync = !! sg_get_num(buf);
2073b1
-        else if (0 == strcmp(key, "thr"))
2073b1
+        else if (0 == strcmp(key, "thr")) {
2073b1
             num_threads = sg_get_num(buf);
2073b1
-        else if (0 == strcmp(key, "time")) {
2073b1
+            if ((num_threads < 0) || (num_threads > MAX_BPT_VALUE)) {
2073b1
+                pr2serr("%sneed argument to 'skip='\n", my_name);
2073b1
+                goto syn_err;
2073b1
+            }
2073b1
+        } else if (0 == strcmp(key, "time")) {
2073b1
             ccp = strchr(buf, ',');
2073b1
             do_time = sg_get_num(buf);
2073b1
             if (do_time < 0) {
2073b1
@@ -3780,7 +3787,7 @@ parse_cmdline_sanity(int argc, char * argv[], struct global_collection * clp,
2073b1
             }
2073b1
             if (ccp) {
2073b1
                 n = sg_get_num(ccp + 1);
2073b1
-                if (n < 0) {
2073b1
+                if ((n < 0) || (n > (MAX_BPT_VALUE / 1000))) {
2073b1
                     pr2serr("%sbad argument to 'time=0|1|2,TO'\n", my_name);
2073b1
                     goto syn_err;
2073b1
                 }
2073b1
diff --git a/testing/sgh_dd.cpp b/testing/sgh_dd.cpp
2073b1
index 38ee1d5..2c1f243 100644
2073b1
--- a/testing/sgh_dd.cpp
2073b1
+++ b/testing/sgh_dd.cpp
2073b1
@@ -134,6 +134,8 @@ using namespace std;
2073b1
 #define DEF_SDT_CRT_SEC 3
2073b1
 #define DEF_SCSI_CDBSZ 10
2073b1
 #define MAX_SCSI_CDBSZ 16
2073b1
+#define MAX_BPT_VALUE (1 << 24)         /* used for maximum bs as well */
2073b1
+#define MAX_COUNT_SKIP_SEEK (1LL << 48) /* coverity wants upper bound */
2073b1
 
2073b1
 #define SENSE_BUFF_LEN 64       /* Arbitrary, could be larger */
2073b1
 #define READ_CAP_REPLY_LEN 8
2073b1
@@ -4043,19 +4045,23 @@ parse_cmdline_sanity(int argc, char * argv[], struct global_collection * clp,
2073b1
             clp->aen_given = true;
2073b1
         } else if (0 == strcmp(key, "bpt")) {
2073b1
             clp->bpt = sg_get_num(buf);
2073b1
-            if (-1 == clp->bpt) {
2073b1
+            if ((clp->bpt < 0) || (clp->bpt > MAX_BPT_VALUE)) {
2073b1
                 pr2serr("%sbad argument to 'bpt='\n", my_name);
2073b1
                 return SG_LIB_SYNTAX_ERROR;
2073b1
             }
2073b1
             bpt_given = true;
2073b1
         } else if (0 == strcmp(key, "bs")) {
2073b1
             clp->bs = sg_get_num(buf);
2073b1
-            if (-1 == clp->bs) {
2073b1
+            if ((clp->bs < 0) || (clp->bs > MAX_BPT_VALUE)) {
2073b1
                 pr2serr("%sbad argument to 'bs='\n", my_name);
2073b1
                 return SG_LIB_SYNTAX_ERROR;
2073b1
             }
2073b1
         } else if (0 == strcmp(key, "cdbsz")) {
2073b1
             clp->cdbsz_in = sg_get_num(buf);
2073b1
+            if ((clp->cdbsz_in < 6) || (clp->cdbsz_in > 32)) {
2073b1
+                pr2serr("%s'cdbsz' expects 6, 10, 12, 16 or 32\n", my_name);
2073b1
+                return SG_LIB_SYNTAX_ERROR;
2073b1
+            }
2073b1
             clp->cdbsz_out = clp->cdbsz_in;
2073b1
             clp->cdbsz_given = true;
2073b1
         } else if (0 == strcmp(key, "coe")) {
2073b1
@@ -4069,7 +4075,7 @@ parse_cmdline_sanity(int argc, char * argv[], struct global_collection * clp,
2073b1
         } else if (0 == strcmp(key, "count")) {
2073b1
             if (0 != strcmp("-1", buf)) {
2073b1
                 dd_count = sg_get_llnum(buf);
2073b1
-                if (-1LL == dd_count) {
2073b1
+                if ((dd_count < 0) || (dd_count > MAX_COUNT_SKIP_SEEK)) {
2073b1
                     pr2serr("%sbad argument to 'count='\n", my_name);
2073b1
                     return SG_LIB_SYNTAX_ERROR;
2073b1
                 }
2073b1
@@ -4103,7 +4109,7 @@ parse_cmdline_sanity(int argc, char * argv[], struct global_collection * clp,
2073b1
                 clp->in_flags.fua = true;
2073b1
         } else if (0 == strcmp(key, "ibs")) {
2073b1
             ibs = sg_get_num(buf);
2073b1
-            if (-1 == ibs) {
2073b1
+            if ((ibs < 0) || (ibs > MAX_BPT_VALUE)) {
2073b1
                 pr2serr("%sbad argument to 'ibs='\n", my_name);
2073b1
                 return SG_LIB_SYNTAX_ERROR;
2073b1
             }
2073b1
@@ -4148,7 +4154,7 @@ parse_cmdline_sanity(int argc, char * argv[], struct global_collection * clp,
2073b1
             clp->noshare = !! sg_get_num(buf);
2073b1
         } else if (0 == strcmp(key, "obs")) {
2073b1
             obs = sg_get_num(buf);
2073b1
-            if (-1 == obs) {
2073b1
+            if ((obs < 0) || (obs > MAX_BPT_VALUE)) {
2073b1
                 pr2serr("%sbad argument to 'obs='\n", my_name);
2073b1
                 return SG_LIB_SYNTAX_ERROR;
2073b1
             }
2073b1
@@ -4206,13 +4212,13 @@ parse_cmdline_sanity(int argc, char * argv[], struct global_collection * clp,
2073b1
             }
2073b1
         } else if (0 == strcmp(key, "seek")) {
2073b1
             clp->seek = sg_get_llnum(buf);
2073b1
-            if (-1LL == clp->seek) {
2073b1
+            if (clp->seek < 0) {
2073b1
                 pr2serr("%sbad argument to 'seek='\n", my_name);
2073b1
                 return SG_LIB_SYNTAX_ERROR;
2073b1
             }
2073b1
         } else if (0 == strcmp(key, "skip")) {
2073b1
             clp->skip = sg_get_llnum(buf);
2073b1
-            if (-1LL == clp->skip) {
2073b1
+            if (clp->skip < 0) {
2073b1
                 pr2serr("%sbad argument to 'skip='\n", my_name);
2073b1
                 return SG_LIB_SYNTAX_ERROR;
2073b1
             }
2073b1
diff --git a/testing/sgs_dd.c b/testing/sgs_dd.c
2073b1
index 65b2c06..60d25aa 100644
2073b1
--- a/testing/sgs_dd.c
2073b1
+++ b/testing/sgs_dd.c
2073b1
@@ -100,6 +100,8 @@ static const char * my_name = "sgs_dd";
2073b1
 #define SGQ_MAX_RD_AHEAD 32
2073b1
 #define SGQ_MAX_WR_AHEAD 32
2073b1
 #define SGQ_NUM_ELEMS (SGQ_MAX_RD_AHEAD + SGQ_MAX_WR_AHEAD + 1)
2073b1
+#define MAX_BPT_VALUE (1 << 24)         /* used for maximum bs as well */
2073b1
+#define MAX_COUNT_SKIP_SEEK (1LL << 48) /* coverity wants upper bound */
2073b1
 
2073b1
 #define SGQ_FREE 0
2073b1
 #define SGQ_IO_STARTED 1
2073b1
@@ -1274,17 +1276,33 @@ main(int argc, char * argv[])
2073b1
             buf++;
2073b1
         if (*buf)
2073b1
             *buf++ = '\0';
2073b1
-        if (0 == strcmp(key,"bpt"))
2073b1
+        if (0 == strcmp(key,"bpt")) {
2073b1
             clp->bpt = sg_get_num(buf);
2073b1
-        else if (0 == strcmp(key,"bs"))
2073b1
+            if ((clp->bpt < 0) || (clp->bpt > MAX_BPT_VALUE)) {
2073b1
+                pr2serr("%s: bad argument to 'bpt='\n", my_name);
2073b1
+                return SG_LIB_SYNTAX_ERROR;
2073b1
+            }
2073b1
+        } else if (0 == strcmp(key,"bs")) {
2073b1
             clp->bs = sg_get_num(buf);
2073b1
-        else if (0 == strcmp(key,"count"))
2073b1
+            if ((clp->bs < 0) || (clp->bs > MAX_BPT_VALUE)) {
2073b1
+                pr2serr("%s: bad argument to 'bs='\n", my_name);
2073b1
+                return SG_LIB_SYNTAX_ERROR;
2073b1
+            }
2073b1
+        } else if (0 == strcmp(key,"count")) {
2073b1
             count = sg_get_num(buf);
2073b1
-        else if (0 == strcmp(key,"deb"))
2073b1
+            if (count < 0) {
2073b1
+                pr2serr("%s: bad argument to 'count='\n", my_name);
2073b1
+                return SG_LIB_SYNTAX_ERROR;
2073b1
+            }
2073b1
+        } else if (0 == strcmp(key,"deb"))
2073b1
             clp->debug += sg_get_num(buf);
2073b1
-        else if (0 == strcmp(key,"ibs"))
2073b1
+        else if (0 == strcmp(key,"ibs")) {
2073b1
             ibs = sg_get_num(buf);
2073b1
-        else if (strcmp(key,"if") == 0) {
2073b1
+            if ((ibs < 0) || (ibs > MAX_BPT_VALUE)) {
2073b1
+                pr2serr("%s: bad argument to 'ibs='\n", my_name);
2073b1
+                return SG_LIB_SYNTAX_ERROR;
2073b1
+            }
2073b1
+        } else if (strcmp(key,"if") == 0) {
2073b1
             memcpy(inf, buf, INOUTF_SZ);
2073b1
             inf[INOUTF_SZ - 1] = '\0';
2073b1
         } else if (0 == strcmp(key, "iflag")) {
2073b1
@@ -1297,9 +1315,13 @@ main(int argc, char * argv[])
2073b1
         else if (0 == strcmp(key,"no_sig")) { /* default changes */
2073b1
             clp->no_sig = !!sg_get_num(buf);
2073b1
             no_sig_given = true;
2073b1
-        } else if (0 == strcmp(key,"obs"))
2073b1
+        } else if (0 == strcmp(key,"obs")) {
2073b1
             obs = sg_get_num(buf);
2073b1
-        else if (strcmp(key,"of") == 0) {
2073b1
+            if ((obs < 0) || (obs > MAX_BPT_VALUE)) {
2073b1
+                pr2serr("%s: bad argument to 'obs='\n", my_name);
2073b1
+                return SG_LIB_SYNTAX_ERROR;
2073b1
+            }
2073b1
+        } else if (strcmp(key,"of") == 0) {
2073b1
             memcpy(outf, buf, INOUTF_SZ);
2073b1
             outf[INOUTF_SZ - 1] = '\0';
2073b1
         } else if (0 == strcmp(key, "oflag")) {
2073b1
@@ -1311,11 +1333,19 @@ main(int argc, char * argv[])
2073b1
             clp->poll_ms = sg_get_num(buf);
2073b1
         else if (0 == strcmp(key,"rt_sig"))
2073b1
             clp->use_rt_sig = !!sg_get_num(buf);
2073b1
-        else if (0 == strcmp(key,"seek"))
2073b1
+        else if (0 == strcmp(key,"seek")) {
2073b1
             seek = sg_get_num(buf);
2073b1
-        else if (0 == strcmp(key,"skip"))
2073b1
+            if (seek < 0) {
2073b1
+                pr2serr("%s: bad argument to 'seek='\n", my_name);
2073b1
+                return SG_LIB_SYNTAX_ERROR;
2073b1
+            }
2073b1
+        } else if (0 == strcmp(key,"skip")) {
2073b1
             skip = sg_get_num(buf);
2073b1
-        else if (0 == strcmp(key,"time"))
2073b1
+            if (skip < 0) {
2073b1
+                pr2serr("%s: bad argument to 'skip='\n", my_name);
2073b1
+                return SG_LIB_SYNTAX_ERROR;
2073b1
+            }
2073b1
+        } else if (0 == strcmp(key,"time"))
2073b1
             ;           /* do nothing */
2073b1
         else if ((0 == strcmp(key,"-V")) || (0 == strcmp(key,"--version"))) {
2073b1
             pr2serr("%s: version: %s\n", my_name, version_str);