test/lvm_nvme_fuzz: return error code in TestOneInput

When get `spdk_nvme_connect() fail` error, need to stop fuzz, so return -1 here.
Call `spdk_app_stop()` in `start_fuzzer`

Fix #2744

Signed-off-by: Jun Wen <junx.wen@intel.com>
Change-Id: I301012931a4f618edd84f3ee6f371c187755012e
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15160
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: wanghailiang <hailiangx.e.wang@intel.com>
Reviewed-by: <qun.wan@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: <yifan.bian@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
This commit is contained in:
Jun Wen 2022-10-27 13:47:48 +08:00 committed by Tomasz Zawadzki
parent 1473d3b8c2
commit 74da5ee257

View File

@ -777,32 +777,35 @@ run_cmds(uint32_t queue_depth)
static int
TestOneInput(const uint8_t *data, size_t size)
{
int ret = 0;
struct spdk_nvme_detach_ctx *detach_ctx = NULL;
g_ctrlr = spdk_nvme_connect(&g_trid, NULL, 0);
if (g_ctrlr == NULL) {
fprintf(stderr, "spdk_nvme_connect() failed for transport address '%s'\n",
g_trid.traddr);
spdk_app_stop(-1);
return -1;
}
g_io_qpair = spdk_nvme_ctrlr_alloc_io_qpair(g_ctrlr, NULL, 0);
if (g_io_qpair == NULL) {
fprintf(stderr, "spdk_nvme_ctrlr_alloc_io_qpair failed\n");
spdk_app_stop(-1);
ret = -1;
goto detach_ctrlr;
}
g_data = data;
run_cmds(size / g_fuzzer->bytes_per_cmd);
spdk_nvme_ctrlr_free_io_qpair(g_io_qpair);
detach_ctrlr:
spdk_nvme_detach_async(g_ctrlr, &detach_ctx);
if (detach_ctx) {
spdk_nvme_detach_poll(detach_ctx);
}
return 0;
return ret;
}
int LLVMFuzzerRunDriver(int *argc, char ***argv, int (*UserCb)(const uint8_t *Data, size_t Size));
@ -832,6 +835,7 @@ start_fuzzer(void *ctx)
char **argv = _argv;
int argc = SPDK_COUNTOF(_argv);
uint32_t len;
int rc;
spdk_unaffinitize_thread();
len = MAX_COMMANDS * g_fuzzer->bytes_per_cmd;
@ -845,10 +849,10 @@ start_fuzzer(void *ctx)
atexit(exit_handler);
if (g_repro_data) {
printf("Running single test based on reproduction data file.\n");
TestOneInput(g_repro_data, g_repro_size);
rc = TestOneInput(g_repro_data, g_repro_size);
printf("Done.\n");
} else {
LLVMFuzzerRunDriver(&argc, &argv, TestOneInput);
rc = LLVMFuzzerRunDriver(&argc, &argv, TestOneInput);
/* TODO: in the normal case, LLVMFuzzerRunDriver never returns - it calls exit()
* directly and we never get here. But this behavior isn't really documented
* anywhere by LLVM, so call spdk_app_stop(0) if it does return, which will
@ -857,7 +861,7 @@ start_fuzzer(void *ctx)
*/
}
g_in_fuzzer = false;
spdk_app_stop(0);
spdk_app_stop(rc);
return NULL;
}