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