From 74da5ee25732497b2e051cc53b9e7a773f5ac2e0 Mon Sep 17 00:00:00 2001 From: Jun Wen Date: Thu, 27 Oct 2022 13:47:48 +0800 Subject: [PATCH] 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 Change-Id: I301012931a4f618edd84f3ee6f371c187755012e Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15160 Tested-by: SPDK CI Jenkins Reviewed-by: wanghailiang Reviewed-by: Reviewed-by: Jim Harris Reviewed-by: Reviewed-by: Changpeng Liu --- test/app/fuzz/llvm_nvme_fuzz/llvm_nvme_fuzz.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/test/app/fuzz/llvm_nvme_fuzz/llvm_nvme_fuzz.c b/test/app/fuzz/llvm_nvme_fuzz/llvm_nvme_fuzz.c index 2859dbdc5..10c6db5e5 100644 --- a/test/app/fuzz/llvm_nvme_fuzz/llvm_nvme_fuzz.c +++ b/test/app/fuzz/llvm_nvme_fuzz/llvm_nvme_fuzz.c @@ -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; }