parse: add return value to app_parse callback

Need to check user input and return status of parsing
to prevent app or target from crashing.
Input checking function will be added in the future.

Change-Id: I8167ac13306ae4f81e2cacb80edd9dcf9382c374
Signed-off-by: Chunyang Hui <chunyang.hui@intel.com>
Reviewed-on: https://review.gerrithub.io/c/439479
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: GangCao <gang.cao@intel.com>
Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
This commit is contained in:
Chunyang Hui 2019-01-08 14:40:06 -05:00 committed by Darek Stojaczyk
parent 2d272954ac
commit 01e5610da8
14 changed files with 35 additions and 15 deletions

View File

@ -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

View File

@ -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

View File

@ -41,9 +41,10 @@ nvmf_usage(void)
{
}
static void
static int
nvmf_parse_arg(int ch, char *arg)
{
return 0;
}
static void

View File

@ -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

View File

@ -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

View File

@ -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;
}
/*

View File

@ -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

View File

@ -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));
/**

View File

@ -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;
}
}
}

View File

@ -44,9 +44,10 @@ bdev_svc_usage(void)
{
}
static void
static int
bdev_svc_parse_arg(int ch, char *arg)
{
return 0;
}
static void

View File

@ -944,9 +944,10 @@ bdevio_usage(void)
{
}
static void
static int
bdevio_parse_arg(int ch, char *arg)
{
return 0;
}
int

View File

@ -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

View File

@ -103,7 +103,7 @@ mkfs_usage(void)
printf(" -C <size> 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)

View File

@ -56,9 +56,10 @@ unittest_usage(void)
{
}
static void
static int
unittest_parse_args(int ch, char *arg)
{
return 0;
}
static void