From af4d9131c8d09907853ee2f6e30b2a9bd80f3c84 Mon Sep 17 00:00:00 2001 From: Kotresh HR Date: Tue, 23 Apr 2019 12:41:32 +0530 Subject: cli: Validate invalid slave url This patch validates the invalid slave url in cli itself and throws appropriate error. fixes: bz#1098991 Change-Id: I278e2a04a4d619d2c2d1db0dd56ab5bdf7e7f469 Signed-off-by: Kotresh HR --- cli/src/cli-cmd-parser.c | 19 +++++++++++++++++-- cli/src/cli-cmd-volume.c | 10 ++++++++-- cli/src/cli.h | 3 ++- tests/00-geo-rep/00-georep-verify-setup.t | 4 ++++ 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c index ccae1ada981..6539b622dc0 100644 --- a/cli/src/cli-cmd-parser.c +++ b/cli/src/cli-cmd-parser.c @@ -2485,6 +2485,17 @@ gsyncd_url_check(const char *w) return !!strpbrk(w, ":/"); } +static gf_boolean_t +valid_slave_gsyncd_url(const char *w) +{ + if (strstr(w, ":::")) + return _gf_false; + else if (strstr(w, "::")) + return _gf_true; + else + return _gf_false; +} + static gf_boolean_t gsyncd_glob_check(const char *w) { @@ -2708,7 +2719,8 @@ out: } int32_t -cli_cmd_gsync_set_parse(const char **words, int wordcount, dict_t **options) +cli_cmd_gsync_set_parse(const char **words, int wordcount, dict_t **options, + char **errstr) { int32_t ret = -1; dict_t *dict = NULL; @@ -2797,8 +2809,11 @@ cli_cmd_gsync_set_parse(const char **words, int wordcount, dict_t **options) if (masteri && gsyncd_url_check(words[masteri])) goto out; - if (slavei && !glob && !gsyncd_url_check(words[slavei])) + + if (slavei && !glob && !valid_slave_gsyncd_url(words[slavei])) { + gf_asprintf(errstr, "Invalid slave url: %s", words[slavei]); goto out; + } w = str_getunamb(words[cmdi], opwords); if (!w) diff --git a/cli/src/cli-cmd-volume.c b/cli/src/cli-cmd-volume.c index e711608ed80..ab2f18bd679 100644 --- a/cli/src/cli-cmd-volume.c +++ b/cli/src/cli-cmd-volume.c @@ -2138,6 +2138,7 @@ cli_cmd_volume_gsync_set_cbk(struct cli_state *state, struct cli_cmd_word *word, rpc_clnt_procedure_t *proc = NULL; call_frame_t *frame = NULL; cli_local_t *local = NULL; + char *errstr = NULL; #if (USE_EVENTS) int ret1 = -1; int cmd_type = -1; @@ -2155,9 +2156,14 @@ cli_cmd_volume_gsync_set_cbk(struct cli_state *state, struct cli_cmd_word *word, goto out; } - ret = cli_cmd_gsync_set_parse(words, wordcount, &options); + ret = cli_cmd_gsync_set_parse(words, wordcount, &options, &errstr); if (ret) { - cli_usage_out(word->pattern); + if (errstr) { + cli_err("%s", errstr); + GF_FREE(errstr); + } else { + cli_usage_out(word->pattern); + } parse_err = 1; goto out; } diff --git a/cli/src/cli.h b/cli/src/cli.h index 542aedd66f7..7166991a7ff 100644 --- a/cli/src/cli.h +++ b/cli/src/cli.h @@ -266,7 +266,8 @@ int32_t cli_cmd_volume_reset_parse(const char **words, int wordcount, dict_t **opt); int32_t -cli_cmd_gsync_set_parse(const char **words, int wordcount, dict_t **opt); +cli_cmd_gsync_set_parse(const char **words, int wordcount, dict_t **opt, + char **errstr); int32_t cli_cmd_quota_parse(const char **words, int wordcount, dict_t **opt); diff --git a/tests/00-geo-rep/00-georep-verify-setup.t b/tests/00-geo-rep/00-georep-verify-setup.t index 267d9336f89..cfe912120c0 100644 --- a/tests/00-geo-rep/00-georep-verify-setup.t +++ b/tests/00-geo-rep/00-georep-verify-setup.t @@ -51,6 +51,10 @@ TEST glusterfs -s $H0 --volfile-id $GSV0 $M1 #BASIC GEO-REPLICATION TESTS ############################################################ +#Test invalid slave url +TEST ! $GEOREP_CLI $master ${SH0}:${GSV0} create push-pem +TEST ! $GEOREP_CLI $master ${SH0}:::${GSV0} create push-pem + #Create geo-rep session TEST create_georep_session $master $slave -- cgit