diff --git a/CHANGELOG.md b/CHANGELOG.md index 25016941c..49b44fbe7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ ## v19.01: (Upcoming Release) +### event framework + +For `spdk_app_parse_args`, add return value to the callback which parses application +specific command line parameters to protect SPDK applications from crashing by invalid +values from user input. + ### environment A new public header file env_dpdk.h has been introduced, and function spdk_env_dpdk_post_init diff --git a/app/iscsi_tgt/iscsi_tgt.c b/app/iscsi_tgt/iscsi_tgt.c index 9f23437ef..b81e91895 100644 --- a/app/iscsi_tgt/iscsi_tgt.c +++ b/app/iscsi_tgt/iscsi_tgt.c @@ -71,7 +71,7 @@ spdk_startup(void *arg1, void *arg2) } } -static void +static int iscsi_parse_arg(int ch, char *arg) { switch (ch) { @@ -82,6 +82,7 @@ iscsi_parse_arg(int ch, char *arg) assert(false); break; } + return 0; } int diff --git a/app/nvmf_tgt/nvmf_main.c b/app/nvmf_tgt/nvmf_main.c index cc057f9cc..62b6df2d9 100644 --- a/app/nvmf_tgt/nvmf_main.c +++ b/app/nvmf_tgt/nvmf_main.c @@ -41,9 +41,10 @@ nvmf_usage(void) { } -static void +static int nvmf_parse_arg(int ch, char *arg) { + return 0; } static void diff --git a/app/spdk_tgt/spdk_tgt.c b/app/spdk_tgt/spdk_tgt.c index 1c93f58a8..515c7f8cf 100644 --- a/app/spdk_tgt/spdk_tgt.c +++ b/app/spdk_tgt/spdk_tgt.c @@ -77,7 +77,7 @@ spdk_tgt_save_pid(const char *pid_path) } -static void +static int spdk_tgt_parse_arg(int ch, char *arg) { switch (ch) { @@ -90,6 +90,7 @@ spdk_tgt_parse_arg(int ch, char *arg) break; #endif } + return 0; } static void diff --git a/app/vhost/vhost.c b/app/vhost/vhost.c index 838211b08..1271e5682 100644 --- a/app/vhost/vhost.c +++ b/app/vhost/vhost.c @@ -62,7 +62,7 @@ save_pid(const char *pid_path) fclose(pid_file); } -static void +static int vhost_parse_arg(int ch, char *arg) { switch (ch) { @@ -73,6 +73,7 @@ vhost_parse_arg(int ch, char *arg) spdk_vhost_set_socket_path(arg); break; } + return 0; } static void diff --git a/examples/bdev/hello_world/hello_bdev.c b/examples/bdev/hello_world/hello_bdev.c index cc65b0514..7278226d4 100644 --- a/examples/bdev/hello_world/hello_bdev.c +++ b/examples/bdev/hello_world/hello_bdev.c @@ -67,13 +67,14 @@ hello_bdev_usage(void) /* * This function is called to parse the parameters that are specific to this application */ -static void hello_bdev_parse_arg(int ch, char *arg) +static int hello_bdev_parse_arg(int ch, char *arg) { switch (ch) { case 'b': g_bdev_name = arg; break; } + return 0; } /* diff --git a/examples/sock/hello_world/hello_sock.c b/examples/sock/hello_world/hello_sock.c index f2e6ec6aa..246cb7e96 100644 --- a/examples/sock/hello_world/hello_sock.c +++ b/examples/sock/hello_world/hello_sock.c @@ -91,7 +91,7 @@ hello_sock_usage(void) /* * This function is called to parse the parameters that are specific to this application */ -static void hello_sock_parse_arg(int ch, char *arg) +static int hello_sock_parse_arg(int ch, char *arg) { switch (ch) { case 'H': @@ -106,6 +106,7 @@ static void hello_sock_parse_arg(int ch, char *arg) case 'V': g_verbose = true; } + return 0; } static void diff --git a/include/spdk/event.h b/include/spdk/event.h index e65f4485c..88caefc30 100644 --- a/include/spdk/event.h +++ b/include/spdk/event.h @@ -247,7 +247,7 @@ typedef enum spdk_app_parse_args_rvals spdk_app_parse_args_rvals_t; */ spdk_app_parse_args_rvals_t spdk_app_parse_args(int argc, char **argv, struct spdk_app_opts *opts, const char *getopt_str, - struct option *app_long_opts, void (*parse)(int ch, char *arg), + struct option *app_long_opts, int (*parse)(int ch, char *arg), void (*usage)(void)); /** diff --git a/lib/event/app.c b/lib/event/app.c index 9817eb7b8..e68cb6389 100644 --- a/lib/event/app.c +++ b/lib/event/app.c @@ -775,7 +775,7 @@ usage(void (*app_usage)(void)) spdk_app_parse_args_rvals_t spdk_app_parse_args(int argc, char **argv, struct spdk_app_opts *opts, const char *app_getopt_str, struct option *app_long_opts, - void (*app_parse)(int ch, char *arg), + int (*app_parse)(int ch, char *arg), void (*app_usage)(void)) { int ch, rc, opt_idx, global_long_opts_len, app_long_opts_len; @@ -992,7 +992,11 @@ spdk_app_parse_args(int argc, char **argv, struct spdk_app_opts *opts, usage(app_usage); goto out; default: - app_parse(ch, optarg); + rc = app_parse(ch, optarg); + if (rc) { + fprintf(stderr, "Parsing application specific arguments failed: %d\n", rc); + goto out; + } } } diff --git a/test/app/bdev_svc/bdev_svc.c b/test/app/bdev_svc/bdev_svc.c index 2db96d6b3..8844f03f8 100644 --- a/test/app/bdev_svc/bdev_svc.c +++ b/test/app/bdev_svc/bdev_svc.c @@ -44,9 +44,10 @@ bdev_svc_usage(void) { } -static void +static int bdev_svc_parse_arg(int ch, char *arg) { + return 0; } static void diff --git a/test/bdev/bdevio/bdevio.c b/test/bdev/bdevio/bdevio.c index c139b6f29..8cb959a2f 100644 --- a/test/bdev/bdevio/bdevio.c +++ b/test/bdev/bdevio/bdevio.c @@ -944,9 +944,10 @@ bdevio_usage(void) { } -static void +static int bdevio_parse_arg(int ch, char *arg) { + return 0; } int diff --git a/test/bdev/bdevperf/bdevperf.c b/test/bdev/bdevperf/bdevperf.c index f6523afa4..3c31eac9c 100644 --- a/test/bdev/bdevperf/bdevperf.c +++ b/test/bdev/bdevperf/bdevperf.c @@ -823,7 +823,7 @@ spdk_bdevperf_shutdown_cb(void) } } -static void +static int bdevperf_parse_arg(int ch, char *arg) { switch (ch) { @@ -853,6 +853,7 @@ bdevperf_parse_arg(int ch, char *arg) g_show_performance_period_in_usec); break; } + return 0; } int diff --git a/test/blobfs/mkfs/mkfs.c b/test/blobfs/mkfs/mkfs.c index e618ef0d3..7d65ad393 100644 --- a/test/blobfs/mkfs/mkfs.c +++ b/test/blobfs/mkfs/mkfs.c @@ -103,7 +103,7 @@ mkfs_usage(void) printf(" -C cluster size\n"); } -static void +static int mkfs_parse_arg(int ch, char *arg) { bool has_prefix; @@ -115,7 +115,7 @@ mkfs_parse_arg(int ch, char *arg) default: break; } - + return 0; } int main(int argc, char **argv) diff --git a/test/unit/lib/event/app.c/app_ut.c b/test/unit/lib/event/app.c/app_ut.c index c745c2e26..5b420aedd 100644 --- a/test/unit/lib/event/app.c/app_ut.c +++ b/test/unit/lib/event/app.c/app_ut.c @@ -56,9 +56,10 @@ unittest_usage(void) { } -static void +static int unittest_parse_args(int ch, char *arg) { + return 0; } static void