From 72f88e50dbf1f492db7bcc70b074bc64e6b994cb Mon Sep 17 00:00:00 2001 From: Csaba Henk Date: Wed, 13 Apr 2011 01:46:08 +0000 Subject: glusterd: sanitize gsyncd config option validation - rely on --config-check functionality of gsyncd to find out if option exists - maintain a list of those options with which we don't want the user to fiddle with (glusterd internals imply these so it' just the proper component for it) - fail if user does a set/del on these Signed-off-by: Csaba Henk Signed-off-by: Anand Avati BUG: 2659 (gsync config-del option is not working properly) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2659 --- xlators/mgmt/glusterd/src/glusterd-op-sm.c | 59 +++++++++++++++++++----------- 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c index b9d63605a..4017dd91c 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c @@ -95,17 +95,11 @@ static char *glusterd_op_sm_event_names[] = { "GD_OP_EVENT_INVALID" }; -static char *gsync_opname[] = { +static char *gsync_reserved_opts[] = { "gluster-command", - "gluster-log-file", - "gluster-log-level", + "pid-file", "log-file", - "log-level", - "remote-gsyncd", - "ssh-command", - "rsync-command", - "timeout", - "sync-jobs", + "state-file", NULL }; @@ -1829,9 +1823,12 @@ int gsync_validate_config_option (dict_t *dict, int32_t config_type, char **op_errstr) { + char cmd[PATH_MAX] = {0,}; int ret = -1; + char **resopt = NULL; int i = 0; - char *op_name = NULL; + char *op_name = NULL; + gf_boolean_t banned = _gf_true; if (config_type == GF_GSYNC_OPTION_TYPE_CONFIG_GET_ALL) return 0; @@ -1840,24 +1837,42 @@ gsync_validate_config_option (dict_t *dict, int32_t config_type, if (ret < 0) { gf_log ("", GF_LOG_WARNING, "option not specified"); *op_errstr = gf_strdup ("Please specify the option"); - goto out; + return -1; } - i = 0; - while (gsync_opname[i] != NULL) { - if (strcmp (gsync_opname[i], op_name) == 0) { - ret = 0; - goto out; - } - i++; + snprintf (cmd, PATH_MAX, GSYNCD_PREFIX"/gsyncd --config-check %s", op_name); + ret = system (cmd); + if (ret) { + gf_log ("", GF_LOG_WARNING, "Invalid option %s", op_name); + *op_errstr = gf_strdup ("Invalid option"); + + ret = -1; } - gf_log ("", GF_LOG_WARNING, "Invalid option"); - *op_errstr = gf_strdup ("Invalid option"); + if (ret != -1 && + (config_type == GF_GSYNC_OPTION_TYPE_CONFIG_SET || + config_type == GF_GSYNC_OPTION_TYPE_CONFIG_DEL)) { + /* match option name against reserved options, modulo -/- + * difference + */ + for (resopt = gsync_reserved_opts; *resopt; resopt++) { + banned = _gf_true; + for (i = 0; (*resopt)[i] && op_name[i]; i++) { + if ((*resopt)[i] == op_name[i] || + ((*resopt)[i] == '-' && op_name[i] == '_')) + continue; + banned = _gf_false; + } + if (banned) { + gf_log ("", GF_LOG_WARNING, "Reserved option %s", op_name); + *op_errstr = gf_strdup ("Reserved option"); - ret = -1; + ret = -1; + break; + } + } + } -out: return ret; } -- cgit