Merge pull request #305 from bvanassche/master

Use dynamic memory allocation instead of variable-length arrays
This commit is contained in:
Ronnie Sahlberg
2019-11-12 18:46:46 +10:00
committed by GitHub
9 changed files with 70 additions and 17 deletions

View File

@@ -28,7 +28,7 @@ AC_ARG_ENABLE([werror], [AS_HELP_STRING([--disable-werror],
[Disables building with -Werror by default])]) [Disables building with -Werror by default])])
if test "$ac_cv_prog_gcc" = yes; then if test "$ac_cv_prog_gcc" = yes; then
WARN_CFLAGS="-Wall -W -Wshadow -Wstrict-prototypes -Wpointer-arith -Wcast-align -Wno-strict-aliasing" WARN_CFLAGS="-Wall -W -Wshadow -Wstrict-prototypes -Wpointer-arith -Wcast-align -Wno-strict-aliasing -Wvla"
WARN_CFLAGS="$WARN_CFLAGS -Wno-unknown-warning-option -Wno-stringop-truncation" WARN_CFLAGS="$WARN_CFLAGS -Wno-unknown-warning-option -Wno-stringop-truncation"
if test "x$enable_werror" != "xno"; then if test "x$enable_werror" != "xno"; then
WARN_CFLAGS="$WARN_CFLAGS -Werror" WARN_CFLAGS="$WARN_CFLAGS -Werror"

View File

@@ -329,8 +329,8 @@ static struct scsi_task *send_scsi_command(struct scsi_device *sdev, struct scsi
#ifdef HAVE_SG_IO #ifdef HAVE_SG_IO
if (sdev->sgio_dev) { if (sdev->sgio_dev) {
sg_io_hdr_t io_hdr; sg_io_hdr_t io_hdr;
unsigned int sense_len=32; unsigned char sense[32];
unsigned char sense[sense_len]; const unsigned int sense_len = sizeof(sense);
char buf[1024]; char buf[1024];
memset(sense, 0, sizeof(sense)); memset(sense, 0, sizeof(sense));

View File

@@ -94,7 +94,7 @@ test_async_abort_simple(void)
struct tests_async_abort_state state = { NULL, 0, 0, 0, 0 }; struct tests_async_abort_state state = { NULL, 0, 0, 0, 0 };
int blocksize = 512; int blocksize = 512;
int blocks_per_io = 8; int blocks_per_io = 8;
unsigned char buf[blocksize * blocks_per_io]; unsigned char *buf;
uint64_t timeout_sec; uint64_t timeout_sec;
CHECK_FOR_DATALOSS; CHECK_FOR_DATALOSS;
@@ -107,7 +107,10 @@ test_async_abort_simple(void)
return; return;
} }
memset(buf, 0, blocksize * blocks_per_io); buf = calloc(blocksize, blocks_per_io);
CU_ASSERT(buf != NULL);
if (!buf)
return;
/* queue and dispatch write before the abort */ /* queue and dispatch write before the abort */
state.wtask = scsi_cdb_write10(0, blocks_per_io * blocksize, state.wtask = scsi_cdb_write10(0, blocks_per_io * blocksize,
@@ -204,4 +207,6 @@ test_async_abort_simple(void)
iscsi_destroy_context(sd->iscsi_ctx); iscsi_destroy_context(sd->iscsi_ctx);
scsi_free_scsi_task(state.wtask); scsi_free_scsi_task(state.wtask);
sd->iscsi_ctx = NULL; sd->iscsi_ctx = NULL;
free(buf);
} }

View File

@@ -93,7 +93,7 @@ test_async_lu_reset_simple(void)
struct tests_async_reset_state state = { NULL, 0, 0, 0, }; struct tests_async_reset_state state = { NULL, 0, 0, 0, };
int blocksize = 512; int blocksize = 512;
int blocks_per_io = 8; int blocks_per_io = 8;
unsigned char buf[blocksize * blocks_per_io]; unsigned char *buf;
uint64_t timeout_sec; uint64_t timeout_sec;
CHECK_FOR_DATALOSS; CHECK_FOR_DATALOSS;
@@ -106,7 +106,10 @@ test_async_lu_reset_simple(void)
return; return;
} }
memset(buf, 0, blocksize * blocks_per_io); buf = calloc(blocksize, blocks_per_io);
CU_ASSERT(buf != NULL);
if (!buf)
return;
/* queue and dispatch write before the reset */ /* queue and dispatch write before the reset */
state.wtask = scsi_cdb_write10(0, blocks_per_io * blocksize, state.wtask = scsi_cdb_write10(0, blocks_per_io * blocksize,
@@ -202,4 +205,6 @@ out:
iscsi_destroy_context(sd->iscsi_ctx); iscsi_destroy_context(sd->iscsi_ctx);
scsi_free_scsi_task(state.wtask); scsi_free_scsi_task(state.wtask);
sd->iscsi_ctx = NULL; sd->iscsi_ctx = NULL;
free(buf);
} }

View File

@@ -62,7 +62,7 @@ test_async_write(void)
int blocks_per_io = 8; int blocks_per_io = 8;
int num_ios = 1000; int num_ios = 1000;
/* IOs in flight concurrently, but all using the same src buffer */ /* IOs in flight concurrently, but all using the same src buffer */
unsigned char buf[block_size * blocks_per_io]; unsigned char *buf;
CHECK_FOR_DATALOSS; CHECK_FOR_DATALOSS;
CHECK_FOR_SBC; CHECK_FOR_SBC;
@@ -74,7 +74,10 @@ test_async_write(void)
return; return;
} }
memset(buf, 0, block_size * blocks_per_io); buf = calloc(block_size, blocks_per_io);
CU_ASSERT(buf != NULL);
if (!buf)
return;
for (i = 0; i < num_ios; i++) { for (i = 0; i < num_ios; i++) {
uint32_t lba = i * blocks_per_io; uint32_t lba = i * blocks_per_io;
@@ -111,4 +114,6 @@ test_async_write(void)
ret = iscsi_service(sd->iscsi_ctx, pfd.revents); ret = iscsi_service(sd->iscsi_ctx, pfd.revents);
CU_ASSERT_EQUAL(ret, 0); CU_ASSERT_EQUAL(ret, 0);
} }
free(buf);
} }

View File

@@ -31,6 +31,7 @@
void void
test_compareandwrite_unwritten(void) test_compareandwrite_unwritten(void)
{ {
unsigned char *read_buf;
int i, n; int i, n;
CHECK_FOR_DATALOSS; CHECK_FOR_DATALOSS;
@@ -39,13 +40,17 @@ test_compareandwrite_unwritten(void)
n = 256; n = 256;
if (n + 0U > num_blocks) if (n + 0U > num_blocks)
n = num_blocks; n = num_blocks;
read_buf = malloc(block_size);
CU_ASSERT(read_buf != NULL);
if (!read_buf)
return;
logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, LOG_BLANK_LINE);
logging(LOG_VERBOSE, "Test COMPARE_AND_WRITE of 1-%d blocks at the " logging(LOG_VERBOSE, "Test COMPARE_AND_WRITE of 1-%d blocks at the "
"start of the LUN, 1 block at a time", n); "start of the LUN, 1 block at a time", n);
for (i = 1; i <= n; i++) { for (i = 1; i <= n; i++) {
int caw_ret; int caw_ret;
unsigned char read_buf[block_size];
/* semi-unique 'compare' buffer to trigger miscompare */ /* semi-unique 'compare' buffer to trigger miscompare */
memset(scratch, '%', block_size); memset(scratch, '%', block_size);
@@ -78,4 +83,6 @@ test_compareandwrite_unwritten(void)
block_size), 0); block_size), 0);
} }
} }
free(read_buf);
} }

View File

@@ -105,14 +105,28 @@ test_mpio_async_caw(void)
struct test_mpio_async_caw_state state = { 0, 0, 0 }; struct test_mpio_async_caw_state state = { 0, 0, 0 };
int num_ios = 1000; int num_ios = 1000;
uint32_t lba = 0; uint32_t lba = 0;
unsigned char cmp_buf[block_size * mp_num_sds]; unsigned char *cmp_buf;
unsigned char wr_buf[block_size * mp_num_sds]; unsigned char *wr_buf;
struct pollfd *pfd;
CHECK_FOR_DATALOSS; CHECK_FOR_DATALOSS;
CHECK_FOR_SBC; CHECK_FOR_SBC;
MPATH_SKIP_IF_UNAVAILABLE(mp_sds, mp_num_sds); MPATH_SKIP_IF_UNAVAILABLE(mp_sds, mp_num_sds);
MPATH_SKIP_UNLESS_ISCSI(mp_sds, mp_num_sds); MPATH_SKIP_UNLESS_ISCSI(mp_sds, mp_num_sds);
cmp_buf = malloc(block_size * mp_num_sds);
CU_ASSERT(cmp_buf != NULL);
if (!cmp_buf)
return;
wr_buf = malloc(block_size * mp_num_sds);
CU_ASSERT(wr_buf != NULL);
if (!wr_buf)
goto free_cmp_buf;
pfd = malloc(mp_num_sds * sizeof(struct pollfd));
CU_ASSERT(pfd != NULL);
if (!pfd)
goto free_wr_buf;
/* synchronously initialise zeros for first CAW */ /* synchronously initialise zeros for first CAW */
memset(wr_buf, 0, block_size); memset(wr_buf, 0, block_size);
WRITESAME10(mp_sds[0], 0, block_size, 1, 0, 0, 0, 0, wr_buf, WRITESAME10(mp_sds[0], 0, block_size, 1, 0, 0, 0, 0, wr_buf,
@@ -157,8 +171,6 @@ test_mpio_async_caw(void)
} }
while (state.completed < state.dispatched) { while (state.completed < state.dispatched) {
struct pollfd pfd[mp_num_sds];
for (sd_i = 0; sd_i < mp_num_sds; sd_i++) { for (sd_i = 0; sd_i < mp_num_sds; sd_i++) {
pfd[sd_i].fd = iscsi_get_fd(mp_sds[sd_i]->iscsi_ctx); pfd[sd_i].fd = iscsi_get_fd(mp_sds[sd_i]->iscsi_ctx);
pfd[sd_i].events pfd[sd_i].events
@@ -180,4 +192,9 @@ test_mpio_async_caw(void)
logging(LOG_VERBOSE, "[OK] All %d COMPARE_AND_WRITE IOs complete, with " logging(LOG_VERBOSE, "[OK] All %d COMPARE_AND_WRITE IOs complete, with "
"%d mismatch(es)", state.completed, state.mismatches); "%d mismatch(es)", state.completed, state.mismatches);
free_wr_buf:
free(wr_buf);
free_cmp_buf:
free(cmp_buf);
} }

View File

@@ -32,7 +32,7 @@ test_writesame10_check(void)
{ {
int i; int i;
int ws_max_blocks = 256; int ws_max_blocks = 256;
unsigned char read_buf[ws_max_blocks * block_size]; unsigned char *read_buf;
CHECK_FOR_DATALOSS; CHECK_FOR_DATALOSS;
CHECK_FOR_SBC; CHECK_FOR_SBC;
@@ -40,6 +40,11 @@ test_writesame10_check(void)
logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, LOG_BLANK_LINE);
logging(LOG_VERBOSE, "Test WRITESAME10 of 1-256 blocks at the start of the LUN"); logging(LOG_VERBOSE, "Test WRITESAME10 of 1-256 blocks at the start of the LUN");
read_buf = malloc(ws_max_blocks * block_size);
CU_ASSERT(read_buf != NULL);
if (!read_buf)
return;
for (i = 1; i <= ws_max_blocks; i++) { for (i = 1; i <= ws_max_blocks; i++) {
/* /*
* fill the full buffer so that memcmp is straightforward, * fill the full buffer so that memcmp is straightforward,
@@ -71,4 +76,6 @@ test_writesame10_check(void)
CU_ASSERT_EQUAL(0, memcmp(read_buf, scratch, i)); CU_ASSERT_EQUAL(0, memcmp(read_buf, scratch, i));
} }
free(read_buf);
} }

View File

@@ -32,7 +32,7 @@ test_writesame16_check(void)
{ {
int i; int i;
int ws_max_blocks = 256; int ws_max_blocks = 256;
unsigned char read_buf[ws_max_blocks * block_size]; unsigned char *read_buf;
CHECK_FOR_DATALOSS; CHECK_FOR_DATALOSS;
CHECK_FOR_SBC; CHECK_FOR_SBC;
@@ -40,6 +40,11 @@ test_writesame16_check(void)
logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, LOG_BLANK_LINE);
logging(LOG_VERBOSE, "Test WRITESAME16 of 1-256 blocks at the start of the LUN"); logging(LOG_VERBOSE, "Test WRITESAME16 of 1-256 blocks at the start of the LUN");
read_buf = malloc(ws_max_blocks * block_size);
CU_ASSERT(read_buf != NULL);
if (!read_buf)
return;
for (i = 1; i <= ws_max_blocks; i++) { for (i = 1; i <= ws_max_blocks; i++) {
/* /*
* fill the full buffer so that memcmp is straightforward, * fill the full buffer so that memcmp is straightforward,
@@ -71,4 +76,6 @@ test_writesame16_check(void)
CU_ASSERT_EQUAL(0, memcmp(read_buf, scratch, i)); CU_ASSERT_EQUAL(0, memcmp(read_buf, scratch, i));
} }
free(read_buf);
} }