aboutsummaryrefslogtreecommitdiff
path: root/src/sgp_dd.c
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 /src/sgp_dd.c
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 'src/sgp_dd.c')
-rw-r--r--src/sgp_dd.c51
1 files changed, 34 insertions, 17 deletions
diff --git a/src/sgp_dd.c b/src/sgp_dd.c
index b71bf7b4..a36d9d03 100644
--- a/src/sgp_dd.c
+++ b/src/sgp_dd.c
@@ -1,7 +1,7 @@
/* A utility program for copying files. Specialised for "files" that
* represent devices that understand the SCSI command set.
*
- * Copyright (C) 1999 - 2021 D. Gilbert and P. Allworth
+ * Copyright (C) 1999 - 2022 D. Gilbert and P. Allworth
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
@@ -85,13 +85,15 @@
#include "sg_pr2serr.h"
-static const char * version_str = "5.83 20211105";
+static const char * version_str = "5.84 20220118";
#define DEF_BLOCK_SIZE 512
#define DEF_BLOCKS_PER_TRANSFER 128
#define DEF_BLOCKS_PER_2048TRANSFER 32
#define DEF_SCSI_CDBSZ 10
#define MAX_SCSI_CDBSZ 16
+#define MAX_BPT_VALUE (1 << 24) /* used for maximum bs as well */
+#define MAX_COUNT_SKIP_SEEK (1LL << 48) /* coverity wants upper bound */
#define SENSE_BUFF_LEN 64 /* Arbitrary, could be larger */
@@ -370,13 +372,15 @@ thread_exit_handler(int sig)
static char *
tsafe_strerror(int code, char * ebp)
{
+ int status;
char * cp;
- pthread_mutex_lock(&strerr_mut);
+ status = pthread_mutex_lock(&strerr_mut);
+ if (0 != status) pr2serr("lock strerr_mut");
cp = safe_strerror(code);
strncpy(ebp, cp, STRERR_BUFF_LEN);
- pthread_mutex_unlock(&strerr_mut);
-
+ status = pthread_mutex_unlock(&strerr_mut);
+ if (0 != status) pr2serr("unlock strerr_mut");
ebp[STRERR_BUFF_LEN - 1] = '\0';
return ebp;
}
@@ -649,8 +653,10 @@ sg_in_open(const char * fnp, struct flags_t * flagp, int bs, int bpt)
perror(ebuff);
return -sg_convert_errno(err);
}
- if (sg_prepare(fd, bs, bpt))
+ if (sg_prepare(fd, bs, bpt)) {
+ close(fd);
return -SG_LIB_FILE_ERROR;
+ }
return fd;
}
@@ -675,8 +681,10 @@ sg_out_open(const char * fnp, struct flags_t * flagp, int bs, int bpt)
perror(ebuff);
return -sg_convert_errno(err);
}
- if (sg_prepare(fd, bs, bpt))
+ if (sg_prepare(fd, bs, bpt)) {
+ close(fd);
return -SG_LIB_FILE_ERROR;
+ }
return fd;
}
@@ -1424,19 +1432,23 @@ main(int argc, char * argv[])
keylen = strlen(key);
if (0 == strcmp(key,"bpt")) {
clp->bpt = sg_get_num(buf);
- if (-1 == clp->bpt) {
+ if ((clp->bpt < 0) || (clp->bpt > MAX_BPT_VALUE)) {
pr2serr("%sbad argument to 'bpt='\n", my_name);
return SG_LIB_SYNTAX_ERROR;
}
bpt_given = 1;
} else if (0 == strcmp(key,"bs")) {
clp->bs = sg_get_num(buf);
- if (-1 == clp->bs) {
+ if ((clp->bs < 0) || (clp->bs > MAX_BPT_VALUE)) {
pr2serr("%sbad argument to 'bs='\n", my_name);
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == strcmp(key,"cdbsz")) {
clp->cdbsz_in = sg_get_num(buf);
+ if ((clp->cdbsz_in < 6) || (clp->cdbsz_in > 32)) {
+ pr2serr("%s'cdbsz' expects 6, 10, 12, 16 or 32\n", my_name);
+ return SG_LIB_SYNTAX_ERROR;
+ }
clp->cdbsz_out = clp->cdbsz_in;
cdbsz_given = 1;
} else if (0 == strcmp(key,"coe")) {
@@ -1445,7 +1457,7 @@ main(int argc, char * argv[])
} else if (0 == strcmp(key,"count")) {
if (0 != strcmp("-1", buf)) {
dd_count = sg_get_llnum(buf);
- if (-1LL == dd_count) {
+ if ((dd_count < 0) || (dd_count > MAX_COUNT_SKIP_SEEK)) {
pr2serr("%sbad argument to 'count='\n", my_name);
return SG_LIB_SYNTAX_ERROR;
}
@@ -1464,7 +1476,7 @@ main(int argc, char * argv[])
clp->in_flags.fua = true;
} else if (0 == strcmp(key,"ibs")) {
ibs = sg_get_num(buf);
- if (-1 == ibs) {
+ if ((ibs < 0) || (ibs > MAX_BPT_VALUE)) {
pr2serr("%sbad argument to 'ibs='\n", my_name);
return SG_LIB_SYNTAX_ERROR;
}
@@ -1483,7 +1495,7 @@ main(int argc, char * argv[])
}
} else if (0 == strcmp(key,"obs")) {
obs = sg_get_num(buf);
- if (-1 == obs) {
+ if ((obs < 0) || (obs > MAX_BPT_VALUE)) {
pr2serr("%sbad argument to 'obs='\n", my_name);
return SG_LIB_SYNTAX_ERROR;
}
@@ -1502,13 +1514,13 @@ main(int argc, char * argv[])
}
} else if (0 == strcmp(key,"seek")) {
seek = sg_get_llnum(buf);
- if (-1LL == seek) {
+ if ((seek < 0) || (seek > MAX_COUNT_SKIP_SEEK)) {
pr2serr("%sbad argument to 'seek='\n", my_name);
return SG_LIB_SYNTAX_ERROR;
}
} else if (0 == strcmp(key,"skip")) {
skip = sg_get_llnum(buf);
- if (-1LL == skip) {
+ if ((skip < 0) || (skip > MAX_COUNT_SKIP_SEEK)) {
pr2serr("%sbad argument to 'skip='\n", my_name);
return SG_LIB_SYNTAX_ERROR;
}
@@ -1611,8 +1623,8 @@ main(int argc, char * argv[])
pr2serr("Can't use both append and seek switches\n");
return SG_LIB_SYNTAX_ERROR;
}
- if (clp->bpt < 1) {
- pr2serr("bpt must be greater than 0\n");
+ if ((clp->bpt < 1) || (clp->bpt > MAX_BPT_VALUE)) {
+ pr2serr("bpt must be > 0 and <= %d\n", MAX_BPT_VALUE);
return SG_LIB_SYNTAX_ERROR;
}
if (clp->in_flags.mmap && clp->out_flags.mmap) {
@@ -1851,9 +1863,14 @@ main(int argc, char * argv[])
clp->out_count = dd_count;
clp->out_rem_count = dd_count;
clp->seek = seek;
- clp->out_blk = seek;
status = pthread_mutex_init(&clp->inout_mutex, NULL);
if (0 != status) err_exit(status, "init inout_mutex");
+ status = pthread_mutex_lock(&clp->inout_mutex);
+ if (0 != status) err_exit(status, "lock inout_mutex");
+ clp->out_blk = seek;
+ status = pthread_mutex_unlock(&clp->inout_mutex);
+ if (0 != status) err_exit(status, "unlock inout_mutex");
+
status = pthread_cond_init(&clp->out_sync_cv, NULL);
if (0 != status) err_exit(status, "init out_sync_cv");