diff options
Diffstat (limited to 'xlators/mgmt/glusterd')
26 files changed, 1187 insertions, 509 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-brick-ops.c b/xlators/mgmt/glusterd/src/glusterd-brick-ops.c index c82bc3158e1..3362f7323c9 100644 --- a/xlators/mgmt/glusterd/src/glusterd-brick-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-brick-ops.c @@ -783,6 +783,7 @@ glusterd_set_detach_bricks(dict_t *dict, glusterd_volinfo_t *volinfo) int hot_brick_num = 0; glusterd_brickinfo_t *brickinfo; int ret = 0; + int32_t len = 0; /* cold tier bricks at tail of list so use reverse iteration */ cds_list_for_each_entry_reverse (brickinfo, &volinfo->bricks, @@ -791,9 +792,12 @@ glusterd_set_detach_bricks(dict_t *dict, glusterd_volinfo_t *volinfo) if (brick_num > volinfo->tier_info.cold_brick_count) { hot_brick_num++; sprintf (key, "brick%d", hot_brick_num); - snprintf (value, 256, "%s:%s", - brickinfo->hostname, - brickinfo->path); + len = snprintf (value, sizeof(value), "%s:%s", + brickinfo->hostname, + brickinfo->path); + if ((len < 0) || (len >= sizeof(value))) { + return -1; + } ret = dict_set_str (dict, key, strdup(value)); if (ret) @@ -1677,6 +1681,7 @@ glusterd_op_stage_add_brick (dict_t *dict, char **op_errstr, dict_t *rsp_dict) char *str_ret = NULL; gf_boolean_t is_force = _gf_false; glusterd_conf_t *conf = NULL; + uint32_t len = 0; this = THIS; GF_ASSERT (this); @@ -1778,10 +1783,14 @@ glusterd_op_stage_add_brick (dict_t *dict, char **op_errstr, dict_t *rsp_dict) continue; if (brickinfo->status == GF_BRICK_STOPPED) { ret = -1; - snprintf (msg, sizeof (msg), "Brick %s is down," - " changing replica count needs all " - "the bricks to be up to avoid data " - "loss", brickinfo->path); + len = snprintf (msg, sizeof (msg), "Brick %s " + "is down, changing replica " + "count needs all the bricks " + "to be up to avoid data loss", + brickinfo->path); + if (len < 0) { + strcpy(msg, "<error>"); + } gf_msg (THIS->name, GF_LOG_ERROR, 0, GD_MSG_BRICK_ADD_FAIL, "%s", msg); *op_errstr = gf_strdup (msg); diff --git a/xlators/mgmt/glusterd/src/glusterd-geo-rep.c b/xlators/mgmt/glusterd/src/glusterd-geo-rep.c index fa40674510f..5a5d4ec2540 100644 --- a/xlators/mgmt/glusterd/src/glusterd-geo-rep.c +++ b/xlators/mgmt/glusterd/src/glusterd-geo-rep.c @@ -941,6 +941,7 @@ gsyncd_getpidfile (char *master, char *slave, char *pidfile, int ret = -1; struct stat stbuf = {0,}; xlator_t *this = NULL; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -953,8 +954,11 @@ gsyncd_getpidfile (char *master, char *slave, char *pidfile, GF_VALIDATE_OR_GOTO ("gsync", master, out); GF_VALIDATE_OR_GOTO ("gsync", slave, out); - snprintf (temp_conf_path, sizeof(temp_conf_path) - 1, - "%s/"GSYNC_CONF_TEMPLATE, priv->workdir); + len = snprintf (temp_conf_path, sizeof(temp_conf_path), + "%s/"GSYNC_CONF_TEMPLATE, priv->workdir); + if ((len < 0) || (len >= sizeof(temp_conf_path))) { + goto out; + } ret = sys_lstat (conf_path, &stbuf); if (!ret) { @@ -2417,6 +2421,7 @@ glusterd_op_stage_copy_file (dict_t *dict, char **op_errstr) char workdir[PATH_MAX] = {0,}; char realpath_filename[PATH_MAX] = {0,}; char realpath_workdir[PATH_MAX] = {0,}; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -2458,13 +2463,20 @@ glusterd_op_stage_copy_file (dict_t *dict, char **op_errstr) *op_errstr = gf_strdup ("command unsuccessful"); goto out; } - snprintf (abs_filename, sizeof(abs_filename), - "%s/%s", priv->workdir, filename); + len = snprintf (abs_filename, sizeof(abs_filename), + "%s/%s", priv->workdir, filename); + if ((len < 0) || (len >= sizeof(abs_filename))) { + ret = -1; + goto out; + } if (!realpath (priv->workdir, realpath_workdir)) { - snprintf (errmsg, sizeof (errmsg), "Failed to get " - "realpath of %s: %s", priv->workdir, - strerror (errno)); + len = snprintf (errmsg, sizeof (errmsg), "Failed to " + "get realpath of %s: %s", + priv->workdir, strerror (errno)); + if (len < 0) { + strcpy(errmsg, "<error>"); + } *op_errstr = gf_strdup (errmsg); ret = -1; goto out; @@ -2481,12 +2493,21 @@ glusterd_op_stage_copy_file (dict_t *dict, char **op_errstr) /* Add Trailing slash to workdir, without slash strncmp will succeed for /var/lib/glusterd_bad */ - snprintf (workdir, sizeof(workdir), "%s/", realpath_workdir); + len = snprintf (workdir, sizeof(workdir), "%s/", + realpath_workdir); + if ((len < 0) || (len >= sizeof(workdir))) { + ret = -1; + goto out; + } /* Protect against file copy outside $workdir */ if (strncmp (workdir, realpath_filename, strlen (workdir))) { - snprintf (errmsg, sizeof (errmsg), "Source file" - " is outside of %s directory", priv->workdir); + len = snprintf (errmsg, sizeof (errmsg), "Source file" + " is outside of %s directory", + priv->workdir); + if (len < 0) { + strcpy(errmsg, "<error>"); + } *op_errstr = gf_strdup (errmsg); ret = -1; goto out; @@ -2494,8 +2515,12 @@ glusterd_op_stage_copy_file (dict_t *dict, char **op_errstr) ret = sys_lstat (abs_filename, &stbuf); if (ret) { - snprintf (errmsg, sizeof (errmsg), "Source file" - " does not exist in %s", priv->workdir); + len = snprintf (errmsg, sizeof (errmsg), "Source file" + " does not exist in %s", + priv->workdir); + if (len < 0) { + strcpy(errmsg, "<error>"); + } *op_errstr = gf_strdup (errmsg); goto out; } @@ -2532,6 +2557,7 @@ glusterd_get_statefile_name (glusterd_volinfo_t *volinfo, char *slave, int ret = -1; struct stat stbuf = {0,}; xlator_t *this = NULL; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -2552,8 +2578,11 @@ glusterd_get_statefile_name (glusterd_volinfo_t *volinfo, char *slave, priv = THIS->private; - snprintf (temp_conf_path, sizeof(temp_conf_path) - 1, - "%s/"GSYNC_CONF_TEMPLATE, priv->workdir); + len = snprintf (temp_conf_path, sizeof(temp_conf_path), + "%s/"GSYNC_CONF_TEMPLATE, priv->workdir); + if ((len < 0) || (len >= sizeof(temp_conf_path))) { + goto out; + } ret = sys_lstat (conf_path, &stbuf); if (!ret) { @@ -3028,6 +3057,7 @@ glusterd_op_stage_gsync_create (dict_t *dict, char **op_errstr) char *slave_user = NULL; char *save_ptr = NULL; char *slave_url_buf = NULL; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -3157,23 +3187,33 @@ glusterd_op_stage_gsync_create (dict_t *dict, char **op_errstr) ret = dict_get_int32 (dict, "push_pem", &is_pem_push); if (!ret && is_pem_push) { ret = snprintf (common_pem_file, - sizeof(common_pem_file) - 1, + sizeof(common_pem_file), "%s"GLUSTERD_COMMON_PEM_PUB_FILE, conf->workdir); - common_pem_file[ret] = '\0'; + if ((ret < 0) || (ret >= sizeof(common_pem_file))) { + ret = -1; + goto out; + } - ret = snprintf (hook_script, sizeof(hook_script) - 1, + ret = snprintf (hook_script, sizeof(hook_script), "%s"GLUSTERD_CREATE_HOOK_SCRIPT, conf->workdir); - hook_script[ret] = '\0'; + if ((ret < 0) || (ret >= sizeof(hook_script))) { + ret = -1; + goto out; + } ret = sys_lstat (common_pem_file, &stbuf); if (ret) { - snprintf (errmsg, sizeof (errmsg), "%s" - " required for push-pem is" - " not present. Please run" - " \"gluster system:: execute" - " gsec_create\"", common_pem_file); + len = snprintf (errmsg, sizeof (errmsg), "%s" + " required for push-pem is" + " not present. Please run" + " \"gluster system:: execute" + " gsec_create\"", + common_pem_file); + if (len < 0) { + strcpy(errmsg, "<error>"); + } gf_msg (this->name, GF_LOG_ERROR, ENOENT, GD_MSG_FILE_OP_FAILED, "%s", errmsg); @@ -3184,11 +3224,15 @@ glusterd_op_stage_gsync_create (dict_t *dict, char **op_errstr) ret = sys_lstat (hook_script, &stbuf); if (ret) { - snprintf (errmsg, sizeof (errmsg), - "The hook-script (%s) required " - "for push-pem is not present. " - "Please install the hook-script " - "and retry", hook_script); + len = snprintf (errmsg, sizeof (errmsg), + "The hook-script (%s) " + "required for push-pem is not " + "present. Please install the " + "hook-script and retry", + hook_script); + if (len < 0) { + strcpy(errmsg, "<error>"); + } gf_msg (this->name, GF_LOG_ERROR, ENOENT, GD_MSG_FILE_OP_FAILED, "%s", errmsg); *op_errstr = gf_strdup (errmsg); @@ -3197,11 +3241,15 @@ glusterd_op_stage_gsync_create (dict_t *dict, char **op_errstr) } if (!S_ISREG(stbuf.st_mode)) { - snprintf (errmsg, sizeof (errmsg), "%s" - " required for push-pem is" - " not a regular file. Please run" - " \"gluster system:: execute" - " gsec_create\"", common_pem_file); + len = snprintf (errmsg, sizeof (errmsg), "%s" + " required for push-pem is" + " not a regular file. Please" + " run \"gluster system:: " + "execute gsec_create\"", + common_pem_file); + if (len < 0) { + strcpy(errmsg, "<error>"); + } gf_msg (this->name, GF_LOG_ERROR, 0, GD_MSG_REG_FILE_MISSING, "%s", errmsg); ret = -1; @@ -3314,16 +3362,23 @@ glusterd_op_stage_gsync_create (dict_t *dict, char **op_errstr) /* Do the check, only if different slave host/slave user */ if (is_different_slavehost || is_different_username) { - (void) snprintf (old_confpath, sizeof(old_confpath) - 1, - "%s/"GEOREP"/%s_%s_%s/gsyncd.conf", - conf->workdir, volinfo->volname, - slave1.old_slvhost, slave_vol); + len = snprintf (old_confpath, sizeof(old_confpath), + "%s/"GEOREP"/%s_%s_%s/gsyncd.conf", + conf->workdir, volinfo->volname, + slave1.old_slvhost, slave_vol); + if ((len < 0) || (len >= sizeof(old_confpath))) { + ret = -1; + goto out; + } /* construct old slave url with (old) slave host */ - (void) snprintf (old_slave_url, - sizeof(old_slave_url) - 1, - "%s::%s", slave1.old_slvhost, - slave_vol); + len = snprintf (old_slave_url, sizeof(old_slave_url), + "%s::%s", slave1.old_slvhost, + slave_vol); + if ((len < 0) || (len >= sizeof(old_slave_url))) { + ret = -1; + goto out; + } ret = glusterd_check_gsync_running_local (volinfo->volname, old_slave_url, old_confpath, &is_running); @@ -4450,6 +4505,7 @@ glusterd_read_status_file (glusterd_volinfo_t *volinfo, char *slave, glusterd_conf_t *priv = NULL; struct stat stbuf = {0,}; xlator_t *this = NULL; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -4469,8 +4525,11 @@ glusterd_read_status_file (glusterd_volinfo_t *volinfo, char *slave, priv = THIS->private; - snprintf (temp_conf_path, sizeof(temp_conf_path) - 1, - "%s/"GSYNC_CONF_TEMPLATE, priv->workdir); + len = snprintf (temp_conf_path, sizeof(temp_conf_path), + "%s/"GSYNC_CONF_TEMPLATE, priv->workdir); + if ((len < 0) || (len >= sizeof(temp_conf_path))) { + return -1; + } ret = sys_lstat (conf_path, &stbuf); if (!ret) { @@ -5296,6 +5355,7 @@ glusterd_op_copy_file (dict_t *dict, char **op_errstr) struct stat stbuf = {0,}; gf_boolean_t free_contents = _gf_true; xlator_t *this = NULL; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -5321,15 +5381,22 @@ glusterd_op_copy_file (dict_t *dict, char **op_errstr) *op_errstr = gf_strdup ("command unsuccessful"); goto out; } - snprintf (abs_filename, sizeof(abs_filename), - "%s/%s", priv->workdir, filename); + len = snprintf (abs_filename, sizeof(abs_filename), + "%s/%s", priv->workdir, filename); + if ((len < 0) || (len >= sizeof(abs_filename))) { + ret = -1; + goto out; + } uuid_utoa_r (MY_UUID, uuid_str); if (!strcmp (uuid_str, host_uuid)) { ret = sys_lstat (abs_filename, &stbuf); if (ret) { - snprintf (errmsg, sizeof (errmsg), "Source file" - " does not exist in %s", priv->workdir); + len = snprintf (errmsg, sizeof (errmsg), "Source file " + "does not exist in %s", priv->workdir); + if (len < 0) { + strcpy(errmsg, "<error>"); + } *op_errstr = gf_strdup (errmsg); gf_msg (this->name, GF_LOG_ERROR, ENOENT, GD_MSG_FILE_OP_FAILED, "%s", errmsg); @@ -5350,8 +5417,11 @@ glusterd_op_copy_file (dict_t *dict, char **op_errstr) fd = open (abs_filename, O_RDONLY); if (fd < 0) { - snprintf (errmsg, sizeof (errmsg), "Unable to open %s", - abs_filename); + len = snprintf (errmsg, sizeof (errmsg), + "Unable to open %s", abs_filename); + if (len < 0) { + strcpy(errmsg, "<error>"); + } *op_errstr = gf_strdup (errmsg); gf_msg (this->name, GF_LOG_ERROR, 0, GD_MSG_FILE_OP_FAILED, @@ -5370,8 +5440,12 @@ glusterd_op_copy_file (dict_t *dict, char **op_errstr) } while (ret > 0); if (bytes_read != stbuf.st_size) { - snprintf (errmsg, sizeof (errmsg), "Unable to read all " - "the data from %s", abs_filename); + len = snprintf (errmsg, sizeof (errmsg), + "Unable to read all the data from %s", + abs_filename); + if (len < 0) { + strcpy(errmsg, "<error>"); + } *op_errstr = gf_strdup (errmsg); gf_msg (this->name, GF_LOG_ERROR, 0, GD_MSG_READ_ERROR, "%s", errmsg); @@ -5446,8 +5520,11 @@ glusterd_op_copy_file (dict_t *dict, char **op_errstr) fd = open (abs_filename, O_WRONLY | O_TRUNC | O_CREAT, 0600); if (fd < 0) { - snprintf (errmsg, sizeof (errmsg), "Unable to open %s", - abs_filename); + len = snprintf (errmsg, sizeof (errmsg), + "Unable to open %s", abs_filename); + if (len < 0) { + strcpy(errmsg, "<error>"); + } *op_errstr = gf_strdup (errmsg); gf_msg (this->name, GF_LOG_ERROR, 0, GD_MSG_FILE_OP_FAILED, "%s", errmsg); @@ -5458,8 +5535,11 @@ glusterd_op_copy_file (dict_t *dict, char **op_errstr) bytes_writen = sys_write (fd, contents, contents_size); if (bytes_writen != contents_size) { - snprintf (errmsg, sizeof (errmsg), "Failed to write" - " to %s", abs_filename); + len = snprintf (errmsg, sizeof (errmsg), + "Failed to write to %s", abs_filename); + if (len < 0) { + strcpy(errmsg, "<error>"); + } *op_errstr = gf_strdup (errmsg); gf_msg (this->name, GF_LOG_ERROR, 0, GD_MSG_FILE_OP_FAILED, "%s", errmsg); @@ -6174,6 +6254,7 @@ glusterd_create_essential_dir_files (glusterd_volinfo_t *volinfo, dict_t *dict, glusterd_conf_t *conf = NULL; struct stat stbuf = {0,}; xlator_t *this = NULL; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -6198,13 +6279,19 @@ glusterd_create_essential_dir_files (glusterd_volinfo_t *volinfo, dict_t *dict, goto out; } - ret = snprintf (buf, sizeof(buf) - 1, "%s/"GEOREP"/%s_%s_%s", + ret = snprintf (buf, sizeof(buf), "%s/"GEOREP"/%s_%s_%s", conf->workdir, volinfo->volname, slave_host, slave_vol); - buf[ret] = '\0'; + if ((ret < 0) || (ret >= sizeof(buf))) { + ret = -1; + goto out; + } ret = mkdir_p (buf, 0777, _gf_true); if (ret) { - snprintf (errmsg, sizeof (errmsg), "Unable to create %s" - ". Error : %s", buf, strerror (errno)); + len = snprintf (errmsg, sizeof (errmsg), "Unable to create %s" + ". Error : %s", buf, strerror (errno)); + if (len < 0) { + strcpy(errmsg, "<error>"); + } *op_errstr = gf_strdup (errmsg); gf_msg (this->name, GF_LOG_ERROR, errno, GD_MSG_DIR_OP_FAILED, "%s", errmsg); @@ -6213,11 +6300,17 @@ glusterd_create_essential_dir_files (glusterd_volinfo_t *volinfo, dict_t *dict, ret = snprintf (buf, PATH_MAX, DEFAULT_LOG_FILE_DIRECTORY"/"GEOREP"/%s", volinfo->volname); - buf[ret] = '\0'; + if ((ret < 0) || (ret >= PATH_MAX)) { + ret = -1; + goto out; + } ret = mkdir_p (buf, 0777, _gf_true); if (ret) { - snprintf (errmsg, sizeof (errmsg), "Unable to create %s" - ". Error : %s", buf, strerror (errno)); + len = snprintf (errmsg, sizeof (errmsg), "Unable to create %s" + ". Error : %s", buf, strerror (errno)); + if (len < 0) { + strcpy(errmsg, "<error>"); + } *op_errstr = gf_strdup (errmsg); gf_msg (this->name, GF_LOG_ERROR, errno, GD_MSG_DIR_OP_FAILED, "%s", errmsg); @@ -6294,6 +6387,7 @@ glusterd_op_gsync_create (dict_t *dict, char **op_errstr, dict_t *rsp_dict) char *slave_voluuid = NULL; char *old_slavehost = NULL; gf_boolean_t is_existing_session = _gf_false; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -6307,8 +6401,12 @@ glusterd_op_gsync_create (dict_t *dict, char **op_errstr, dict_t *rsp_dict) if (ret) goto out; - snprintf (common_pem_file, sizeof(common_pem_file), - "%s"GLUSTERD_COMMON_PEM_PUB_FILE, conf->workdir); + len = snprintf (common_pem_file, sizeof(common_pem_file), + "%s"GLUSTERD_COMMON_PEM_PUB_FILE, conf->workdir); + if ((len < 0) || (len >= sizeof(common_pem_file))) { + ret = -1; + goto out; + } ret = glusterd_volinfo_find (volname, &volinfo); if (ret) { @@ -6390,11 +6488,15 @@ glusterd_op_gsync_create (dict_t *dict, char **op_errstr, dict_t *rsp_dict) } else is_pem_push = 0; - snprintf(hooks_args, sizeof(hooks_args), - "is_push_pem=%d,pub_file=%s,slave_user=%s,slave_ip=%s," - "slave_vol=%s,ssh_port=%d", is_pem_push, - common_pem_file, slave_user, slave_ip, slave_vol, - ssh_port); + len = snprintf(hooks_args, sizeof(hooks_args), + "is_push_pem=%d,pub_file=%s,slave_user=%s," + "slave_ip=%s,slave_vol=%s,ssh_port=%d", + is_pem_push, common_pem_file, slave_user, + slave_ip, slave_vol, ssh_port); + if ((len < 0) || (len >= sizeof(hooks_args))) { + ret = -1; + goto out; + } } else snprintf(hooks_args, sizeof(hooks_args), "This argument will stop the hooks script"); @@ -6477,11 +6579,16 @@ create_essentials: "not present.", old_working_dir); } else { - snprintf (errmsg, sizeof (errmsg), - "rename of old working dir %s to " - "new working dir %s failed! Error: %s", - old_working_dir, new_working_dir, - strerror (errno)); + len = snprintf (errmsg, sizeof (errmsg), + "rename of old working dir %s " + "to new working dir %s " + "failed! Error: %s", + old_working_dir, + new_working_dir, + strerror (errno)); + if (len < 0) { + strcpy(errmsg, "<error>"); + } gf_msg (this->name, GF_LOG_INFO, 0, GD_MSG_FORCE_CREATE_SESSION, "rename of old working dir %s to " diff --git a/xlators/mgmt/glusterd/src/glusterd-gfproxyd-svc-helper.c b/xlators/mgmt/glusterd/src/glusterd-gfproxyd-svc-helper.c index 2949297788f..7098ae27eaf 100644 --- a/xlators/mgmt/glusterd/src/glusterd-gfproxyd-svc-helper.c +++ b/xlators/mgmt/glusterd/src/glusterd-gfproxyd-svc-helper.c @@ -33,10 +33,14 @@ glusterd_svc_build_gfproxyd_socket_filepath (glusterd_volinfo_t *volinfo, { char sockfilepath[PATH_MAX] = {0,}; char rundir[PATH_MAX] = {0,}; + int32_t len = 0; glusterd_svc_build_gfproxyd_rundir (volinfo, rundir, sizeof (rundir)); - snprintf (sockfilepath, sizeof (sockfilepath), "%s/run-%s", - rundir, uuid_utoa (MY_UUID)); + len = snprintf (sockfilepath, sizeof (sockfilepath), "%s/run-%s", + rundir, uuid_utoa (MY_UUID)); + if ((len < 0) || (len >= sizeof(sockfilepath))) { + sockfilepath[0] = 0; + } glusterd_set_socket_filepath (sockfilepath, path, path_len); } diff --git a/xlators/mgmt/glusterd/src/glusterd-gfproxyd-svc.c b/xlators/mgmt/glusterd/src/glusterd-gfproxyd-svc.c index c0b96b10995..9ac649db60d 100644 --- a/xlators/mgmt/glusterd/src/glusterd-gfproxyd-svc.c +++ b/xlators/mgmt/glusterd/src/glusterd-gfproxyd-svc.c @@ -62,6 +62,7 @@ int glusterd_gfproxydsvc_init (glusterd_volinfo_t *volinfo) glusterd_conn_notify_t notify = NULL; xlator_t *this = NULL; char *volfileserver = NULL; + int32_t len = 0; this = THIS; GF_VALIDATE_OR_GOTO ("glusterd", this, out); @@ -101,7 +102,12 @@ int glusterd_gfproxydsvc_init (glusterd_volinfo_t *volinfo) goto out; } glusterd_svc_build_gfproxyd_logfile (logfile, logdir, sizeof (logfile)); - snprintf (volfileid, sizeof (volfileid), "gfproxyd/%s", volinfo->volname); + len = snprintf (volfileid, sizeof (volfileid), "gfproxyd/%s", + volinfo->volname); + if ((len < 0) || (len >= sizeof(volfileid))) { + ret = -1; + goto out; + } if (dict_get_str (this->options, "transport.socket.bind-address", &volfileserver) != 0) { @@ -264,6 +270,7 @@ glusterd_gfproxydsvc_start (glusterd_svc_t *svc, int flags) char gfproxyd_id[PATH_MAX] = {0,}; glusterd_volinfo_t *volinfo = NULL; char *localtime_logging = NULL; + int32_t len = 0; this = THIS; GF_VALIDATE_OR_GOTO ("glusterd", this, out); @@ -292,8 +299,12 @@ glusterd_gfproxydsvc_start (glusterd_svc_t *svc, int flags) runinit (&runner); if (this->ctx->cmd_args.valgrind) { - snprintf (valgrind_logfile, PATH_MAX, "%s/valgrind-%s", - svc->proc.logdir, svc->proc.logfile); + len = snprintf (valgrind_logfile, PATH_MAX, "%s/valgrind-%s", + svc->proc.logdir, svc->proc.logfile); + if ((len < 0) || (len >= PATH_MAX)) { + ret = -1; + goto out; + } runner_add_args (&runner, "valgrind", "--leak-check=full", "--trace-children=yes", "--track-origins=yes", diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index dd81887ed1f..b59d3819d95 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -471,6 +471,7 @@ glusterd_add_volume_detail_to_dict (glusterd_volinfo_t *volinfo, struct args_pack pack = {0,}; xlator_t *this = NULL; GF_UNUSED int caps = 0; + int32_t len = 0; GF_ASSERT (volinfo); GF_ASSERT (volumes); @@ -654,8 +655,12 @@ glusterd_add_volume_detail_to_dict (glusterd_volinfo_t *volinfo, char brick[1024] = {0,}; char brick_uuid[64] = {0,}; snprintf (key, 256, "volume%d.brick%d", count, i); - snprintf (brick, 1024, "%s:%s", brickinfo->hostname, - brickinfo->path); + len = snprintf (brick, 1024, "%s:%s", brickinfo->hostname, + brickinfo->path); + if ((len < 0) || (len >= 1024)) { + ret = -1; + goto out; + } buf = gf_strdup (brick); ret = dict_set_dynstr (volumes, key, buf); if (ret) diff --git a/xlators/mgmt/glusterd/src/glusterd-handshake.c b/xlators/mgmt/glusterd/src/glusterd-handshake.c index 84dd077af73..35b6bed409e 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handshake.c +++ b/xlators/mgmt/glusterd/src/glusterd-handshake.c @@ -196,6 +196,7 @@ build_volfile_path (char *volume_id, char *path, xlator_t *this = NULL; glusterd_volinfo_t *volinfo = NULL; glusterd_conf_t *priv = NULL; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -321,13 +322,18 @@ build_volfile_path (char *volume_id, char *path, goto out; } - snprintf (path_prefix, sizeof (path_prefix), "%s/snaps/%s", - priv->workdir, volinfo->snapshot->snapname); - + len = snprintf (path_prefix, sizeof (path_prefix), + "%s/snaps/%s", priv->workdir, + volinfo->snapshot->snapname); volid_ptr = volname; /* this is to ensure that volname recvd from get_snap_volname_and_volinfo is free'd */ free_ptr = volname; + if ((len < 0) || (len >= sizeof(path_prefix))) { + ret = -1; + goto out; + } + goto gotvolinfo; } @@ -408,8 +414,12 @@ build_volfile_path (char *volume_id, char *path, volid_ptr = volume_id; } - snprintf (path_prefix, sizeof (path_prefix), "%s/vols", - priv->workdir); + len = snprintf (path_prefix, sizeof (path_prefix), "%s/vols", + priv->workdir); + if ((len < 0) || (len >= sizeof(path_prefix))) { + ret = -1; + goto out; + } ret = glusterd_volinfo_find (volid_ptr, &volinfo); diff --git a/xlators/mgmt/glusterd/src/glusterd-hooks.c b/xlators/mgmt/glusterd/src/glusterd-hooks.c index b310bc2a109..914d029ed39 100644 --- a/xlators/mgmt/glusterd/src/glusterd-hooks.c +++ b/xlators/mgmt/glusterd/src/glusterd-hooks.c @@ -80,6 +80,7 @@ glusterd_hooks_create_hooks_directory (char *basedir) "pre", "post"}; glusterd_conf_t *priv = NULL; + int32_t len = 0; priv = THIS->private; @@ -106,8 +107,12 @@ glusterd_hooks_create_hooks_directory (char *basedir) if (strlen (cmd_subdir) == 0) continue; - snprintf (path, sizeof (path), "%s/%s", version_dir, - cmd_subdir); + len = snprintf (path, sizeof (path), "%s/%s", version_dir, + cmd_subdir); + if ((len < 0) || (len >= sizeof(path))) { + ret = -1; + goto out; + } ret = mkdir_p (path, 0777, _gf_true); if (ret) { gf_msg (THIS->name, GF_LOG_CRITICAL, errno, @@ -119,8 +124,13 @@ glusterd_hooks_create_hooks_directory (char *basedir) for (type = GD_COMMIT_HOOK_PRE; type < GD_COMMIT_HOOK_MAX; type++) { - snprintf (path, sizeof (path), "%s/%s/%s", - version_dir, cmd_subdir, type_subdir[type]); + len = snprintf (path, sizeof (path), "%s/%s/%s", + version_dir, cmd_subdir, + type_subdir[type]); + if ((len < 0) || (len >= sizeof(path))) { + ret = -1; + goto out; + } ret = mkdir_p (path, 0777, _gf_true); if (ret) { gf_msg (THIS->name, GF_LOG_CRITICAL, errno, diff --git a/xlators/mgmt/glusterd/src/glusterd-hooks.h b/xlators/mgmt/glusterd/src/glusterd-hooks.h index 7bab6adb626..752e459f89c 100644 --- a/xlators/mgmt/glusterd/src/glusterd-hooks.h +++ b/xlators/mgmt/glusterd/src/glusterd-hooks.h @@ -13,8 +13,14 @@ #include <fnmatch.h> #define GLUSTERD_GET_HOOKS_DIR(path, version, priv) \ - snprintf (path, PATH_MAX, "%s/hooks/%d", priv->workdir,\ - version); + do { \ + int32_t len; \ + len = snprintf (path, PATH_MAX, "%s/hooks/%d", priv->workdir,\ + version); \ + if (len < 0) { \ + path[0] = 0; \ + } \ + } while (0) #define GLUSTERD_HOOK_VER 1 diff --git a/xlators/mgmt/glusterd/src/glusterd-mgmt.c b/xlators/mgmt/glusterd/src/glusterd-mgmt.c index 33d5de45cd5..5b7d782a1e6 100644 --- a/xlators/mgmt/glusterd/src/glusterd-mgmt.c +++ b/xlators/mgmt/glusterd/src/glusterd-mgmt.c @@ -41,6 +41,7 @@ gd_mgmt_v3_collate_errors (struct syncargs *args, int op_ret, int op_errno, int is_operrstr_blk = 0; char *err_string = NULL; glusterd_peerinfo_t *peerinfo = NULL; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -113,8 +114,11 @@ gd_mgmt_v3_collate_errors (struct syncargs *args, int op_ret, int op_errno, } if (args->errstr) { - snprintf (err_str, sizeof(err_str), - "%s\n%s", args->errstr, op_err); + len = snprintf (err_str, sizeof(err_str), + "%s\n%s", args->errstr, op_err); + if (len < 0) { + strcpy(err_str, "<error>"); + } GF_FREE (args->errstr); args->errstr = NULL; } else diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c index e49b9c720e5..a19d98a51c2 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c @@ -790,6 +790,7 @@ glusterd_validate_shared_storage (char *key, char *value, char *errstr) char hook_script[PATH_MAX] = ""; xlator_t *this = NULL; glusterd_conf_t *conf = NULL; + int32_t len = 0; this = THIS; GF_VALIDATE_OR_GOTO ("glusterd", this, out); @@ -818,16 +819,23 @@ glusterd_validate_shared_storage (char *key, char *value, char *errstr) goto out; } - snprintf (hook_script, sizeof(hook_script), - "%s"GLUSTERD_SHRD_STRG_HOOK_SCRIPT, conf->workdir); + len = snprintf (hook_script, sizeof(hook_script), + "%s"GLUSTERD_SHRD_STRG_HOOK_SCRIPT, conf->workdir); + if ((len < 0) || (len >= sizeof(hook_script))) { + ret = -1; + goto out; + } ret = sys_access (hook_script, R_OK|X_OK); if (ret) { - snprintf (errstr, PATH_MAX, - "The hook-script (%s) required " - "for this operation is not present. " - "Please install the hook-script " - "and retry", hook_script); + len = snprintf (errstr, PATH_MAX, + "The hook-script (%s) required " + "for this operation is not present. " + "Please install the hook-script " + "and retry", hook_script); + if (len < 0) { + strncpy(errstr, "<error>", PATH_MAX); + } gf_msg (this->name, GF_LOG_ERROR, ENOENT, GD_MSG_FILE_OP_FAILED, "%s", errstr); goto out; @@ -2806,6 +2814,7 @@ glusterd_set_shared_storage (dict_t *dict, char *key, char *value, char hooks_args[PATH_MAX] = {0, }; char errstr[PATH_MAX] = {0, }; xlator_t *this = NULL; + int32_t len = 0; this = THIS; GF_VALIDATE_OR_GOTO ("glusterd", this, out); @@ -2849,13 +2858,17 @@ glusterd_set_shared_storage (dict_t *dict, char *key, char *value, } if (is_origin_glusterd (dict)) { - snprintf(hooks_args, sizeof(hooks_args), - "is_originator=1,local_node_hostname=%s", - local_node_hostname); + len = snprintf(hooks_args, sizeof(hooks_args), + "is_originator=1,local_node_hostname=%s", + local_node_hostname); } else { - snprintf(hooks_args, sizeof(hooks_args), - "is_originator=0,local_node_hostname=%s", - local_node_hostname); + len = snprintf(hooks_args, sizeof(hooks_args), + "is_originator=0,local_node_hostname=%s", + local_node_hostname); + } + if ((len < 0) || (len >= sizeof(hooks_args))) { + ret = -1; + goto out; } ret = dict_set_dynstr_with_alloc (dict, "hooks_args", hooks_args); @@ -3402,6 +3415,7 @@ _add_remove_bricks_to_dict (dict_t *dict, glusterd_volinfo_t *volinfo, char dict_key[1024] ={0,}; char *brick = NULL; xlator_t *this = NULL; + int32_t len = 0; GF_ASSERT (dict); GF_ASSERT (volinfo); @@ -3440,8 +3454,12 @@ _add_remove_bricks_to_dict (dict_t *dict, glusterd_volinfo_t *volinfo, } memset (dict_key, 0, sizeof (dict_key)); - snprintf (dict_key, sizeof (dict_key), "%s.%s", prefix, - brick_key); + len = snprintf (dict_key, sizeof (dict_key), "%s.%s", prefix, + brick_key); + if ((len < 0) || (len >= sizeof(dict_key))) { + ret = -1; + goto out; + } ret = dict_set_str (dict, dict_key, brick); if (ret) { gf_msg (this->name, GF_LOG_ERROR, 0, @@ -5300,9 +5318,10 @@ glusterd_op_commit_hook (glusterd_op_t op, dict_t *op_ctx, glusterd_conf_t *priv = NULL; char hookdir[PATH_MAX] = {0, }; char scriptdir[PATH_MAX] = {0, }; - char type_subdir[256] = {0, }; + char *type_subdir = ""; char *cmd_subdir = NULL; int ret = -1; + int32_t len = 0; priv = THIS->private; switch (type) { @@ -5312,10 +5331,10 @@ glusterd_op_commit_hook (glusterd_op_t op, dict_t *op_ctx, break; case GD_COMMIT_HOOK_PRE: - strcpy (type_subdir, "pre"); + type_subdir = "pre"; break; case GD_COMMIT_HOOK_POST: - strcpy (type_subdir, "post"); + type_subdir = "post"; break; } @@ -5324,8 +5343,11 @@ glusterd_op_commit_hook (glusterd_op_t op, dict_t *op_ctx, return -1; GLUSTERD_GET_HOOKS_DIR (hookdir, GLUSTERD_HOOK_VER, priv); - snprintf (scriptdir, sizeof (scriptdir), "%s/%s/%s", - hookdir, cmd_subdir, type_subdir); + len = snprintf (scriptdir, sizeof (scriptdir), "%s/%s/%s", + hookdir, cmd_subdir, type_subdir); + if ((len < 0) || (len >= sizeof(scriptdir))) { + return -1; + } switch (type) { case GD_COMMIT_HOOK_NONE: @@ -6981,7 +7003,7 @@ fill_shd_status_for_local_bricks (dict_t *dict, glusterd_volinfo_t *volinfo, dict_t *req_dict) { glusterd_brickinfo_t *brickinfo = NULL; - char msg[1024] = {0,}; + char *msg = "self-heal-daemon is not running on"; char key[1024] = {0,}; char value[1024] = {0,}; int ret = 0; @@ -6989,7 +7011,6 @@ fill_shd_status_for_local_bricks (dict_t *dict, glusterd_volinfo_t *volinfo, int cmd_replica_index = -1; this = THIS; - snprintf (msg, sizeof (msg), "self-heal-daemon is not running on"); if (type == PER_HEAL_XL) { cmd_replica_index = get_replica_index_for_per_replica_cmd diff --git a/xlators/mgmt/glusterd/src/glusterd-quota.c b/xlators/mgmt/glusterd/src/glusterd-quota.c index 6231fe3a7f4..847c1a721d0 100644 --- a/xlators/mgmt/glusterd/src/glusterd-quota.c +++ b/xlators/mgmt/glusterd/src/glusterd-quota.c @@ -249,6 +249,7 @@ _glusterd_quota_initiate_fs_crawl (glusterd_conf_t *priv, runner_t runner = {0}; char *volfileserver = NULL; FILE *pidfp = NULL; + int32_t len = 0; GF_VALIDATE_OR_GOTO ("glusterd", THIS, out); @@ -272,16 +273,25 @@ _glusterd_quota_initiate_fs_crawl (glusterd_conf_t *priv, } GLUSTERD_REMOVE_SLASH_FROM_PATH (brick->path, brickpath); - snprintf (logfile, sizeof (logfile), - DEFAULT_QUOTA_CRAWL_LOG_DIRECTORY"/%s.log", - brickpath); + len = snprintf (logfile, sizeof (logfile), + DEFAULT_QUOTA_CRAWL_LOG_DIRECTORY"/%s.log", + brickpath); + if ((len < 0) || (len >= sizeof(vol_id))) { + ret = -1; + goto out; + } if (dict_get_str (THIS->options, "transport.socket.bind-address", &volfileserver) != 0) volfileserver = "localhost"; - snprintf (vol_id, sizeof (vol_id), "client_per_brick/%s.%s.%s.%s.vol", - volinfo->volname, "client", brick->hostname, brickpath); + len = snprintf (vol_id, sizeof (vol_id), + "client_per_brick/%s.%s.%s.%s.vol", volinfo->volname, + "client", brick->hostname, brickpath); + if ((len < 0) || (len >= sizeof(vol_id))) { + ret = -1; + goto out; + } runinit (&runner); @@ -370,13 +380,15 @@ _glusterd_quota_initiate_fs_crawl (glusterd_conf_t *priv, _exit (EXIT_FAILURE); } - snprintf (pidfile, sizeof (pidfile), "%s/%s.pid", pid_dir, - brickpath); - pidfp = fopen (pidfile, "w"); - if (pidfp) { - fprintf (pidfp, "%d\n", runner.chpid); - fflush (pidfp); - fclose (pidfp); + len = snprintf (pidfile, sizeof (pidfile), "%s/%s.pid", + pid_dir, brickpath); + if ((len >= 0) && (len < sizeof(pidfile))) { + pidfp = fopen (pidfile, "w"); + if (pidfp >= 0) { + fprintf (pidfp, "%d\n", runner.chpid); + fflush (pidfp); + fclose (pidfp); + } } #ifndef GF_LINUX_HOST_OS @@ -402,6 +414,7 @@ glusterd_stop_all_quota_crawl_service (glusterd_conf_t *priv, struct dirent scratch[2] = {{0,},}; char pid_dir[PATH_MAX] = {0,}; char pidfile[PATH_MAX] = {0,}; + int32_t len = 0; GLUSTERD_GET_QUOTA_CRAWL_PIDDIR (pid_dir, volinfo, type); @@ -411,12 +424,13 @@ glusterd_stop_all_quota_crawl_service (glusterd_conf_t *priv, GF_SKIP_IRRELEVANT_ENTRIES (entry, dir, scratch); while (entry) { - snprintf (pidfile, sizeof (pidfile), "%s/%s", - pid_dir, entry->d_name); - - glusterd_service_stop_nolock ("quota_crawl", pidfile, SIGKILL, - _gf_true); - sys_unlink (pidfile); + len = snprintf (pidfile, sizeof (pidfile), "%s/%s", + pid_dir, entry->d_name); + if ((len >= 0) && (len < sizeof(pidfile))) { + glusterd_service_stop_nolock ("quota_crawl", pidfile, + SIGKILL, _gf_true); + sys_unlink (pidfile); + } GF_SKIP_IRRELEVANT_ENTRIES (entry, dir, scratch); } diff --git a/xlators/mgmt/glusterd/src/glusterd-snapd-svc-helper.c b/xlators/mgmt/glusterd/src/glusterd-snapd-svc-helper.c index b2e06825c32..8f1630f1871 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapd-svc-helper.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapd-svc-helper.c @@ -29,10 +29,14 @@ glusterd_svc_build_snapd_socket_filepath (glusterd_volinfo_t *volinfo, { char sockfilepath[PATH_MAX] = {0,}; char rundir[PATH_MAX] = {0,}; + int32_t len = 0; glusterd_svc_build_snapd_rundir (volinfo, rundir, sizeof (rundir)); - snprintf (sockfilepath, sizeof (sockfilepath), "%s/run-%s", - rundir, uuid_utoa (MY_UUID)); + len = snprintf (sockfilepath, sizeof (sockfilepath), "%s/run-%s", + rundir, uuid_utoa (MY_UUID)); + if ((len < 0) || (len >= sizeof(sockfilepath))) { + sockfilepath[0] = 0; + } glusterd_set_socket_filepath (sockfilepath, path, path_len); } diff --git a/xlators/mgmt/glusterd/src/glusterd-snapd-svc.c b/xlators/mgmt/glusterd/src/glusterd-snapd-svc.c index c32a081156e..3c713291f91 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapd-svc.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapd-svc.c @@ -62,6 +62,7 @@ glusterd_snapdsvc_init (void *data) glusterd_conn_notify_t notify = NULL; xlator_t *this = NULL; char *volfileserver = NULL; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -102,7 +103,12 @@ glusterd_snapdsvc_init (void *data) goto out; } glusterd_svc_build_snapd_logfile (logfile, logdir, sizeof (logfile)); - snprintf (volfileid, sizeof (volfileid), "snapd/%s", volinfo->volname); + len = snprintf (volfileid, sizeof (volfileid), "snapd/%s", + volinfo->volname); + if ((len < 0) || (len >= sizeof(volfileid))) { + ret = -1; + goto out; + } if (dict_get_str (this->options, "transport.socket.bind-address", &volfileserver) != 0) { @@ -227,6 +233,7 @@ glusterd_snapdsvc_start (glusterd_svc_t *svc, int flags) glusterd_volinfo_t *volinfo = NULL; glusterd_snapdsvc_t *snapd = NULL; char *localtime_logging = NULL; + int32_t len = 0; this = THIS; GF_ASSERT(this); @@ -282,8 +289,12 @@ glusterd_snapdsvc_start (glusterd_svc_t *svc, int flags) runinit (&runner); if (this->ctx->cmd_args.valgrind) { - snprintf (valgrind_logfile, PATH_MAX, "%s/valgrind-snapd.log", - svc->proc.logdir); + len = snprintf (valgrind_logfile, PATH_MAX, + "%s/valgrind-snapd.log", svc->proc.logdir); + if ((len < 0) || (len >= PATH_MAX)) { + ret = -1; + goto out; + } runner_add_args (&runner, "valgrind", "--leak-check=full", "--trace-children=yes", "--track-origins=yes", diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c index 340289f74e8..249d99ea3dd 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c @@ -669,8 +669,8 @@ int32_t glusterd_add_snap_to_dict (glusterd_snap_t *snap, dict_t *peer_data, int32_t snap_count) { - char buf[NAME_MAX] = ""; - char prefix[NAME_MAX] = ""; + char buf[64] = ""; + char prefix[32] = ""; int32_t ret = -1; int32_t volcount = 0; glusterd_volinfo_t *volinfo = NULL; @@ -1551,8 +1551,8 @@ int32_t glusterd_import_friend_snap (dict_t *peer_data, int32_t snap_count, char *peer_snap_name, char *peer_snap_id) { - char buf[NAME_MAX] = ""; - char prefix[NAME_MAX] = ""; + char buf[64] = ""; + char prefix[32] = ""; dict_t *dict = NULL; glusterd_snap_t *snap = NULL; glusterd_volinfo_t *snap_vol = NULL; @@ -1792,8 +1792,8 @@ int32_t glusterd_compare_snap (dict_t *peer_data, int32_t snap_count, char *peername, uuid_t peerid) { - char buf[NAME_MAX] = ""; - char prefix[NAME_MAX] = ""; + char buf[64] = ""; + char prefix[32] = ""; char *peer_snap_name = NULL; char *peer_snap_id = NULL; glusterd_snap_t *snap = NULL; @@ -1994,8 +1994,8 @@ glusterd_update_snaps_synctask (void *opaque) int i = 1; xlator_t *this = NULL; dict_t *peer_data = NULL; - char buf[NAME_MAX] = ""; - char prefix[NAME_MAX] = ""; + char buf[64] = ""; + char prefix[32] = ""; char *peer_snap_name = NULL; char *peer_snap_id = NULL; char *peername = NULL; @@ -2205,8 +2205,8 @@ glusterd_add_snapd_to_dict (glusterd_volinfo_t *volinfo, int ret = -1; int32_t pid = -1; int32_t brick_online = -1; - char key[1024] = {0}; - char base_key[1024] = {0}; + char key[64] = {0}; + char base_key[32] = {0}; char pidfile[PATH_MAX] = {0}; xlator_t *this = NULL; @@ -2433,8 +2433,8 @@ glusterd_merge_brick_status (dict_t *dst, dict_t *src) int64_t j = 0; int64_t brick_count = 0; int64_t brick_order = 0; - char key[PATH_MAX] = {0, }; - char key_prefix[PATH_MAX] = {0, }; + char key[64] = {0, }; + char key_prefix[16] = {0, }; char snapbrckcnt[PATH_MAX] = {0, }; char snapbrckord[PATH_MAX] = {0, }; char *clonename = NULL; @@ -2510,7 +2510,7 @@ glusterd_merge_brick_status (dict_t *dst, dict_t *src) goto out; } - snprintf (key, sizeof (key) - 1, + snprintf (key, sizeof (key), "%s%"PRId64".brick%"PRId64".status", key_prefix, index+1, brick_order); ret = dict_get_int32 (src, key, &brick_online); @@ -2852,6 +2852,7 @@ glusterd_mount_lvm_snapshot (glusterd_brickinfo_t *brickinfo, int32_t ret = -1; runner_t runner = {0, }; xlator_t *this = NULL; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -2860,8 +2861,11 @@ glusterd_mount_lvm_snapshot (glusterd_brickinfo_t *brickinfo, runinit (&runner); - snprintf (msg, sizeof (msg), "mount %s %s", - brickinfo->device_path, brick_mount_path); + len = snprintf (msg, sizeof (msg), "mount %s %s", + brickinfo->device_path, brick_mount_path); + if (len < 0) { + strcpy(msg, "<error>"); + } gf_strncpy (mnt_opts, brickinfo->mnt_opts, sizeof(mnt_opts)); diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c index 4a4c379cd86..4be89779465 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c @@ -280,8 +280,11 @@ snap_max_limits_display_commit (dict_t *rsp_dict, char *volname, count); ret = dict_set_str (rsp_dict, buf, volinfo->volname); if (ret) { - snprintf (err_str, PATH_MAX, - "Failed to set %s", buf); + len = snprintf (err_str, PATH_MAX, + "Failed to set %s", buf); + if (len < 0) { + strcpy(err_str, "<error>"); + } goto out; } @@ -289,8 +292,11 @@ snap_max_limits_display_commit (dict_t *rsp_dict, char *volname, "volume%"PRId64"-snap-max-hard-limit", count); ret = dict_set_uint64 (rsp_dict, buf, snap_max_limit); if (ret) { - snprintf (err_str, PATH_MAX, - "Failed to set %s", buf); + len = snprintf (err_str, PATH_MAX, + "Failed to set %s", buf); + if (len < 0) { + strcpy(err_str, "<error>"); + } goto out; } @@ -299,8 +305,11 @@ snap_max_limits_display_commit (dict_t *rsp_dict, char *volname, ret = dict_set_uint64 (rsp_dict, buf, active_hard_limit); if (ret) { - snprintf (err_str, PATH_MAX, - "Failed to set %s", buf); + len = snprintf (err_str, PATH_MAX, + "Failed to set %s", buf); + if (len < 0) { + strcpy(err_str, "<error>"); + } goto out; } @@ -308,8 +317,11 @@ snap_max_limits_display_commit (dict_t *rsp_dict, char *volname, "volume%"PRId64"-snap-max-soft-limit", count); ret = dict_set_uint64 (rsp_dict, buf, soft_limit_value); if (ret) { - snprintf (err_str, PATH_MAX, - "Failed to set %s", buf); + len = snprintf (err_str, PATH_MAX, + "Failed to set %s", buf); + if (len < 0) { + strcpy(err_str, "<error>"); + } goto out; } count++; @@ -342,8 +354,11 @@ snap_max_limits_display_commit (dict_t *rsp_dict, char *volname, snprintf (buf, sizeof(buf), "volume%"PRId64"-volname", count); ret = dict_set_str (rsp_dict, buf, volinfo->volname); if (ret) { - snprintf (err_str, PATH_MAX, - "Failed to set %s", buf); + len = snprintf (err_str, PATH_MAX, + "Failed to set %s", buf); + if (len < 0) { + strcpy(err_str, "<error>"); + } goto out; } @@ -351,8 +366,11 @@ snap_max_limits_display_commit (dict_t *rsp_dict, char *volname, "volume%"PRId64"-snap-max-hard-limit", count); ret = dict_set_uint64 (rsp_dict, buf, snap_max_limit); if (ret) { - snprintf (err_str, PATH_MAX, - "Failed to set %s", buf); + len = snprintf (err_str, PATH_MAX, + "Failed to set %s", buf); + if (len < 0) { + strcpy(err_str, "<error>"); + } goto out; } @@ -360,8 +378,11 @@ snap_max_limits_display_commit (dict_t *rsp_dict, char *volname, "volume%"PRId64"-active-hard-limit", count); ret = dict_set_uint64 (rsp_dict, buf, active_hard_limit); if (ret) { - snprintf (err_str, PATH_MAX, - "Failed to set %s", buf); + len = snprintf (err_str, PATH_MAX, + "Failed to set %s", buf); + if (len < 0) { + strcpy(err_str, "<error>"); + } goto out; } @@ -369,8 +390,11 @@ snap_max_limits_display_commit (dict_t *rsp_dict, char *volname, "volume%"PRId64"-snap-max-soft-limit", count); ret = dict_set_uint64 (rsp_dict, buf, soft_limit_value); if (ret) { - snprintf (err_str, PATH_MAX, - "Failed to set %s", buf); + len = snprintf (err_str, PATH_MAX, + "Failed to set %s", buf); + if (len < 0) { + strcpy(err_str, "<error>"); + } goto out; } @@ -605,6 +629,7 @@ glusterd_snapshot_backup_vol (glusterd_volinfo_t *volinfo) char trashdir[PATH_MAX] = {0,}; glusterd_conf_t *priv = NULL; xlator_t *this = NULL; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -614,12 +639,18 @@ glusterd_snapshot_backup_vol (glusterd_volinfo_t *volinfo) GLUSTERD_GET_VOLUME_DIR (pathname, volinfo, priv); - snprintf (delete_path, sizeof (delete_path), - "%s/"GLUSTERD_TRASH"/vols-%s.deleted", priv->workdir, - volinfo->volname); + len = snprintf (delete_path, sizeof (delete_path), + "%s/"GLUSTERD_TRASH"/vols-%s.deleted", priv->workdir, + volinfo->volname); + if ((len < 0) || (len >= sizeof(delete_path))) { + goto out; + } - snprintf (trashdir, sizeof (trashdir), "%s/"GLUSTERD_TRASH, - priv->workdir); + len = snprintf (trashdir, sizeof (trashdir), "%s/"GLUSTERD_TRASH, + priv->workdir); + if ((len < 0) || (len >= sizeof(delete_path))) { + goto out; + } /* Create trash folder if it is not there */ ret = sys_mkdir (trashdir, 0777); @@ -2110,6 +2141,7 @@ glusterd_snap_create_clone_common_prevalidate (dict_t *rsp_dict, int flags, xlator_t *this = NULL; glusterd_conf_t *conf = NULL; glusterd_brickinfo_t *brickinfo = NULL; + int32_t len = 0; this = THIS; conf = this->private; @@ -2170,10 +2202,13 @@ glusterd_snap_create_clone_common_prevalidate (dict_t *rsp_dict, int flags, orig_device = glusterd_get_brick_mount_device (brickinfo->path); if (!orig_device) { - snprintf (err_str, PATH_MAX, - "getting device name for the brick " - "%s:%s failed", brickinfo->hostname, - brickinfo->path); + len = snprintf (err_str, PATH_MAX, + "getting device name for the brick " + "%s:%s failed", brickinfo->hostname, + brickinfo->path); + if (len < 0) { + strcpy(err_str, "<error>"); + } ret = -1; goto out; } @@ -2746,6 +2781,7 @@ glusterd_do_lvm_snapshot_remove (glusterd_volinfo_t *snap_vol, int retry_count = 0; char *mnt_pt = NULL; gf_boolean_t unmount = _gf_true; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -2834,9 +2870,12 @@ glusterd_do_lvm_snapshot_remove (glusterd_volinfo_t *snap_vol, } runinit (&runner); - snprintf (msg, sizeof(msg), "remove snapshot of the brick %s:%s, " - "device: %s", brickinfo->hostname, brickinfo->path, - snap_device); + len = snprintf (msg, sizeof(msg), "remove snapshot of the brick %s:%s, " + "device: %s", brickinfo->hostname, brickinfo->path, + snap_device); + if (len < 0) { + strcpy(msg, "<error>"); + } runner_add_args (&runner, LVM_REMOVE, "-f", snap_device, NULL); runner_log (&runner, "", GF_LOG_DEBUG, msg); @@ -4612,6 +4651,7 @@ glusterd_add_missed_snaps_to_dict (dict_t *rsp_dict, int32_t missed_snap_count = -1; int32_t ret = -1; xlator_t *this = NULL; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -4625,10 +4665,13 @@ glusterd_add_missed_snaps_to_dict (dict_t *rsp_dict, goto out; } - snprintf (missed_snap_entry, sizeof(missed_snap_entry), - "%s:%s=%s:%d:%s:%d:%d", uuid_utoa(brickinfo->uuid), - snap_uuid, snap_vol->volname, brick_number, brickinfo->path, - op, GD_MISSED_SNAP_PENDING); + len = snprintf (missed_snap_entry, sizeof(missed_snap_entry), + "%s:%s=%s:%d:%s:%d:%d", uuid_utoa(brickinfo->uuid), + snap_uuid, snap_vol->volname, brick_number, + brickinfo->path, op, GD_MISSED_SNAP_PENDING); + if ((len < 0) || (len >= sizeof(missed_snap_entry))) { + goto out; + } /* Fetch the missed_snap_count from the dict */ ret = dict_get_int32 (rsp_dict, "missed_snap_count", @@ -4767,6 +4810,7 @@ glusterd_snap_brick_create (glusterd_volinfo_t *snap_volinfo, char snap_brick_mount_path[PATH_MAX] = ""; char clone_uuid[64] = ""; struct stat statbuf = {0, }; + int32_t len = 0; this = THIS; @@ -4775,13 +4819,18 @@ glusterd_snap_brick_create (glusterd_volinfo_t *snap_volinfo, if (clone) { GLUSTERD_GET_UUID_NOHYPHEN(clone_uuid, snap_volinfo->volume_id); - snprintf (snap_brick_mount_path, sizeof (snap_brick_mount_path), - "%s/%s/brick%d", snap_mount_dir, - clone_uuid, brick_count + 1); + len = snprintf (snap_brick_mount_path, + sizeof (snap_brick_mount_path), + "%s/%s/brick%d", snap_mount_dir, clone_uuid, + brick_count + 1); } else { - snprintf (snap_brick_mount_path, sizeof (snap_brick_mount_path), - "%s/%s/brick%d", snap_mount_dir, - snap_volinfo->volname, brick_count + 1); + len = snprintf (snap_brick_mount_path, + sizeof (snap_brick_mount_path), + "%s/%s/brick%d", snap_mount_dir, + snap_volinfo->volname, brick_count + 1); + } + if ((len < 0) || (len >= sizeof(snap_brick_mount_path))) { + goto out; } ret = mkdir_p (snap_brick_mount_path, 0777, _gf_true); @@ -4864,6 +4913,7 @@ glusterd_add_brick_to_snap_volume (dict_t *dict, dict_t *rsp_dict, int32_t ret = -1; xlator_t *this = NULL; char abspath[PATH_MAX] = {0}; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -4978,15 +5028,19 @@ glusterd_add_brick_to_snap_volume (dict_t *dict, dict_t *rsp_dict, */ if (clone) { GLUSTERD_GET_UUID_NOHYPHEN(clone_uuid, snap_vol->volume_id); - snprintf (snap_brick_path, sizeof(snap_brick_path), - "%s/%s/brick%d%s", snap_mount_dir, - clone_uuid, brick_count+1, - snap_brick_dir); + len = snprintf (snap_brick_path, sizeof(snap_brick_path), + "%s/%s/brick%d%s", snap_mount_dir, + clone_uuid, brick_count+1, + snap_brick_dir); } else { - snprintf (snap_brick_path, sizeof(snap_brick_path), - "%s/%s/brick%d%s", snap_mount_dir, - snap_vol->volname, brick_count+1, - snap_brick_dir); + len = snprintf (snap_brick_path, sizeof(snap_brick_path), + "%s/%s/brick%d%s", snap_mount_dir, + snap_vol->volname, brick_count+1, + snap_brick_dir); + } + if ((len < 0) || (len >= sizeof(snap_brick_path))) { + ret = -1; + goto out; } snprintf (key, sizeof(key), "vol%"PRId64".brick_snapdevice%d", @@ -5070,6 +5124,7 @@ glusterd_update_fs_label (glusterd_brickinfo_t *brickinfo) uuid_t uuid = {0,}; runner_t runner = {0,}; xlator_t *this = NULL; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -5090,8 +5145,11 @@ glusterd_update_fs_label (glusterd_brickinfo_t *brickinfo) /* XFS label is of size 12. Therefore we should truncate the * label to 12 bytes*/ label [12] = '\0'; - snprintf (msg, sizeof (msg), "Changing filesystem label of " - "%s brick to %s", brickinfo->path, label); + len = snprintf (msg, sizeof (msg), "Changing filesystem label " + "of %s brick to %s", brickinfo->path, label); + if (len < 0) { + strcpy(msg, "<error>"); + } /* Run the run xfs_admin tool to change the label * of the file-system */ runner_add_args (&runner, "xfs_admin", "-L", label, @@ -5102,8 +5160,11 @@ glusterd_update_fs_label (glusterd_brickinfo_t *brickinfo) /* Ext2/Ext3/Ext4 label is of size 16. Therefore we should * truncate the label to 16 bytes*/ label [16] = '\0'; - snprintf (msg, sizeof (msg), "Changing filesystem label of " - "%s brick to %s", brickinfo->path, label); + len = snprintf (msg, sizeof (msg), "Changing filesystem label " + "of %s brick to %s", brickinfo->path, label); + if (len < 0) { + strcpy(msg, "<error>"); + } /* For ext2/ext3/ext4 run tune2fs to change the * file-system label */ runner_add_args (&runner, "tune2fs", "-L", label, @@ -8818,6 +8879,7 @@ glusterd_remove_trashpath (char *volname) xlator_t *this = NULL; glusterd_conf_t *priv = NULL; struct stat stbuf = {0, }; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -8825,9 +8887,12 @@ glusterd_remove_trashpath (char *volname) GF_ASSERT (volname); - snprintf (delete_path, sizeof (delete_path), - "%s/"GLUSTERD_TRASH"/vols-%s.deleted", priv->workdir, - volname); + len = snprintf (delete_path, sizeof (delete_path), + "%s/"GLUSTERD_TRASH"/vols-%s.deleted", priv->workdir, + volname); + if ((len < 0) || (len >= sizeof(delete_path))) { + goto out; + } ret = sys_lstat (delete_path, &stbuf); if (ret) { @@ -8927,6 +8992,7 @@ glusterd_snapshot_revert_partial_restored_vol (glusterd_volinfo_t *volinfo) glusterd_volinfo_t *tmp_vol = NULL; glusterd_conf_t *priv = NULL; xlator_t *this = NULL; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -8936,9 +9002,13 @@ glusterd_snapshot_revert_partial_restored_vol (glusterd_volinfo_t *volinfo) GLUSTERD_GET_VOLUME_DIR (pathname, volinfo, priv); - snprintf (trash_path, sizeof (trash_path), - "%s/"GLUSTERD_TRASH"/vols-%s.deleted", priv->workdir, - volinfo->volname); + len = snprintf (trash_path, sizeof (trash_path), + "%s/"GLUSTERD_TRASH"/vols-%s.deleted", priv->workdir, + volinfo->volname); + if ((len < 0) || (len >= sizeof(trash_path))) { + ret = -1; + goto out; + } /* Since snapshot restore failed we cannot rely on the volume * data stored under vols folder. Therefore delete the origin diff --git a/xlators/mgmt/glusterd/src/glusterd-statedump.c b/xlators/mgmt/glusterd/src/glusterd-statedump.c index d0a97053485..02b6ddc9662 100644 --- a/xlators/mgmt/glusterd/src/glusterd-statedump.c +++ b/xlators/mgmt/glusterd/src/glusterd-statedump.c @@ -20,10 +20,10 @@ static void glusterd_dump_peer (glusterd_peerinfo_t *peerinfo, char *input_key, int index, gf_boolean_t xpeers) { - char subkey[50] = {0,}; - char key[GF_DUMP_MAX_BUF_LEN] = {0,}; + char subkey[144] = {0,}; + char key[128] = {0,}; - strncpy (key, input_key, (GF_DUMP_MAX_BUF_LEN - 1)); + strncpy (key, input_key, sizeof(key) - 1); snprintf (subkey, sizeof (subkey), "%s%d", key, index); @@ -64,10 +64,10 @@ glusterd_dump_peer_rpcstat (glusterd_peerinfo_t *peerinfo, char *input_key, int ret = -1; rpc_clnt_t *rpc = NULL; char rpcsvc_peername[RPCSVC_PEER_STRLEN] = {0,}; - char subkey[50] = {0,}; - char key[GF_DUMP_MAX_BUF_LEN] = {0,}; + char subkey[144] = {0,}; + char key[128] = {0,}; - strncpy (key, input_key, (GF_DUMP_MAX_BUF_LEN - 1)); + strncpy (key, input_key, sizeof(key) - 1); /* Dump the rpc connection statistics */ rpc = peerinfo->rpc; diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c index b6efac5a51a..c42c5ea613e 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.c +++ b/xlators/mgmt/glusterd/src/glusterd-store.c @@ -291,7 +291,7 @@ gd_store_brick_snap_details_write (int fd, glusterd_brickinfo_t *brickinfo) int ret = -1; xlator_t *this = NULL; glusterd_conf_t *conf = NULL; - char value[256] = {0,}; + char value[PATH_MAX] = {0,}; this = THIS; GF_ASSERT (this != NULL); @@ -640,6 +640,7 @@ glusterd_store_remove_bricks (glusterd_volinfo_t *volinfo, char *delete_path) struct dirent scratch[2] = {{0,},}; char path[PATH_MAX] = {0,}; char brickdir[PATH_MAX] = {0,}; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -655,20 +656,26 @@ glusterd_store_remove_bricks (glusterd_volinfo_t *volinfo, char *delete_path) priv = this->private; GF_ASSERT (priv); - snprintf (brickdir, sizeof (brickdir), "%s/%s", delete_path, - GLUSTERD_BRICK_INFO_DIR); + len = snprintf (brickdir, sizeof (brickdir), "%s/%s", delete_path, + GLUSTERD_BRICK_INFO_DIR); + if ((len < 0) || (len >= sizeof(brickdir))) { + ret = -1; + goto out; + } dir = sys_opendir (brickdir); GF_SKIP_IRRELEVANT_ENTRIES (entry, dir, scratch); while (entry) { - snprintf (path, sizeof (path), "%s/%s", - brickdir, entry->d_name); - ret = sys_unlink (path); - if (ret && errno != ENOENT) { - gf_msg_debug (this->name, 0, "Unable to unlink %s", - path); + len = snprintf (path, sizeof (path), "%s/%s", + brickdir, entry->d_name); + if ((len >= 0) && (len < sizeof(path))) { + ret = sys_unlink (path); + if (ret && errno != ENOENT) { + gf_msg_debug (this->name, 0, + "Unable to unlink %s", path); + } } GF_SKIP_IRRELEVANT_ENTRIES (entry, dir, scratch); } @@ -1846,6 +1853,7 @@ glusterd_store_delete_volume (glusterd_volinfo_t *volinfo) char trashdir[PATH_MAX] = {0,}; xlator_t *this = NULL; gf_boolean_t rename_fail = _gf_false; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -1857,12 +1865,20 @@ glusterd_store_delete_volume (glusterd_volinfo_t *volinfo) GLUSTERD_GET_VOLUME_DIR (pathname, volinfo, priv); - snprintf (delete_path, sizeof (delete_path), - "%s/"GLUSTERD_TRASH"/%s.deleted", priv->workdir, - uuid_utoa (volinfo->volume_id)); + len = snprintf (delete_path, sizeof (delete_path), + "%s/"GLUSTERD_TRASH"/%s.deleted", priv->workdir, + uuid_utoa (volinfo->volume_id)); + if ((len < 0) || (len >= sizeof(delete_path))) { + ret = -1; + goto out; + } - snprintf (trashdir, sizeof (trashdir), "%s/"GLUSTERD_TRASH, - priv->workdir); + len = snprintf (trashdir, sizeof (trashdir), "%s/"GLUSTERD_TRASH, + priv->workdir); + if ((len < 0) || (len >= sizeof(trashdir))) { + ret = -1; + goto out; + } ret = sys_mkdir (trashdir, 0777); if (ret && errno != EEXIST) { @@ -1916,6 +1932,7 @@ glusterd_store_delete_snap (glusterd_snap_t *snap) struct stat st = {0, }; xlator_t *this = NULL; gf_boolean_t rename_fail = _gf_false; + int32_t len = 0; this = THIS; priv = this->private; @@ -1924,12 +1941,20 @@ glusterd_store_delete_snap (glusterd_snap_t *snap) GF_ASSERT (snap); GLUSTERD_GET_SNAP_DIR (pathname, snap, priv); - snprintf (delete_path, sizeof (delete_path), - "%s/"GLUSTERD_TRASH"/snap-%s.deleted", priv->workdir, - uuid_utoa (snap->snap_id)); + len = snprintf (delete_path, sizeof (delete_path), + "%s/"GLUSTERD_TRASH"/snap-%s.deleted", priv->workdir, + uuid_utoa (snap->snap_id)); + if ((len < 0) || (len >= sizeof(delete_path))) { + ret = -1; + goto out; + } - snprintf (trashdir, sizeof (trashdir), "%s/"GLUSTERD_TRASH, - priv->workdir); + len = snprintf (trashdir, sizeof (trashdir), "%s/"GLUSTERD_TRASH, + priv->workdir); + if ((len < 0) || (len >= sizeof(trashdir))) { + ret = -1; + goto out; + } ret = sys_mkdir (trashdir, 0777); if (ret && errno != EEXIST) { @@ -1959,7 +1984,12 @@ glusterd_store_delete_snap (glusterd_snap_t *snap) GF_SKIP_IRRELEVANT_ENTRIES (entry, dir, scratch); while (entry) { - snprintf (path, PATH_MAX, "%s/%s", delete_path, entry->d_name); + len = snprintf (path, PATH_MAX, "%s/%s", delete_path, + entry->d_name); + if ((len < 0) || (len >= PATH_MAX)) { + ret = -1; + goto stat_failed; + } ret = sys_stat (path, &st); if (ret == -1) { gf_msg_debug (this->name, 0, "Failed to stat " @@ -2022,6 +2052,7 @@ glusterd_store_global_info (xlator_t *this) char path[PATH_MAX] = {0,}; gf_store_handle_t *handle = NULL; char *uuid_str = NULL; + int32_t len = 0; conf = this->private; @@ -2030,8 +2061,11 @@ glusterd_store_global_info (xlator_t *this) goto out; if (!conf->handle) { - snprintf (path, PATH_MAX, "%s/%s", conf->workdir, - GLUSTERD_INFO_FILE); + len = snprintf (path, PATH_MAX, "%s/%s", conf->workdir, + GLUSTERD_INFO_FILE); + if ((len < 0) || (len >= PATH_MAX)) { + goto out; + } ret = gf_store_handle_new (path, &handle); if (ret) { gf_msg (this->name, GF_LOG_ERROR, 0, @@ -2114,12 +2148,16 @@ glusterd_retrieve_op_version (xlator_t *this, int *op_version) char *tmp = NULL; char path[PATH_MAX] = {0,}; gf_store_handle_t *handle = NULL; + int32_t len = 0; priv = this->private; if (!priv->handle) { - snprintf (path, PATH_MAX, "%s/%s", priv->workdir, - GLUSTERD_INFO_FILE); + len = snprintf (path, PATH_MAX, "%s/%s", priv->workdir, + GLUSTERD_INFO_FILE); + if ((len < 0) || (len >= PATH_MAX)) { + goto out; + } ret = gf_store_handle_retrieve (path, &handle); if (ret) { @@ -2167,6 +2205,7 @@ glusterd_retrieve_sys_snap_max_limit (xlator_t *this, uint64_t *limit, char *tmp = NULL; char path[PATH_MAX] = {0,}; gf_store_handle_t *handle = NULL; + int32_t len = 0; GF_ASSERT (this); priv = this->private; @@ -2176,8 +2215,11 @@ glusterd_retrieve_sys_snap_max_limit (xlator_t *this, uint64_t *limit, GF_ASSERT (key); if (!priv->handle) { - snprintf (path, PATH_MAX, "%s/%s", priv->workdir, - GLUSTERD_INFO_FILE); + len = snprintf (path, PATH_MAX, "%s/%s", priv->workdir, + GLUSTERD_INFO_FILE); + if ((len < 0) || (len >= PATH_MAX)) { + goto out; + } ret = gf_store_handle_retrieve (path, &handle); if (ret) { @@ -2282,13 +2324,17 @@ glusterd_retrieve_uuid () glusterd_conf_t *priv = NULL; xlator_t *this = NULL; char path[PATH_MAX] = {0,}; + int32_t len = 0; this = THIS; priv = this->private; if (!priv->handle) { - snprintf (path, PATH_MAX, "%s/%s", priv->workdir, - GLUSTERD_INFO_FILE); + len = snprintf (path, PATH_MAX, "%s/%s", priv->workdir, + GLUSTERD_INFO_FILE); + if ((len < 0) || (len >= PATH_MAX)) { + goto out; + } ret = gf_store_handle_retrieve (path, &handle); if (ret) { @@ -2332,6 +2378,7 @@ glusterd_store_retrieve_snapd (glusterd_volinfo_t *volinfo) glusterd_conf_t *conf = NULL; gf_store_iter_t *iter = NULL; gf_store_op_errno_t op_errno = GD_STORE_SUCCESS; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -2364,8 +2411,11 @@ glusterd_store_retrieve_snapd (glusterd_volinfo_t *volinfo) GLUSTERD_GET_VOLUME_DIR(volpath, volinfo, conf); - snprintf (path, sizeof (path), "%s/%s", volpath, - GLUSTERD_VOLUME_SNAPD_INFO_FILE); + len = snprintf (path, sizeof (path), "%s/%s", volpath, + GLUSTERD_VOLUME_SNAPD_INFO_FILE); + if ((len < 0) || (len >= sizeof(path))) { + goto out; + } ret = gf_store_handle_retrieve (path, &volinfo->snapd.handle); if (ret) { @@ -2438,6 +2488,7 @@ glusterd_store_retrieve_bricks (glusterd_volinfo_t *volinfo) xlator_t *this = NULL; int brickid = 0; gf_store_op_errno_t op_errno = GD_STORE_SUCCESS; + int32_t len = 0; GF_ASSERT (volinfo); GF_ASSERT (volinfo->volname); @@ -2460,11 +2511,14 @@ glusterd_store_retrieve_bricks (glusterd_volinfo_t *volinfo) snprintf (tmpkey, sizeof (tmpkey), "%s-%d", GLUSTERD_STORE_KEY_VOL_BRICK,brick_count); ret = gf_store_iter_get_matching (tmpiter, tmpkey, &tmpvalue); - snprintf (path, sizeof (path), "%s/%s", brickdir, tmpvalue); - + len = snprintf (path, sizeof (path), "%s/%s", brickdir, + tmpvalue); GF_FREE (tmpvalue); - tmpvalue = NULL; + if ((len < 0) || (len >= sizeof(path))) { + ret = -1; + goto out; + } ret = gf_store_handle_retrieve (path, &brickinfo->shandle); @@ -2674,6 +2728,7 @@ glusterd_store_retrieve_node_state (glusterd_volinfo_t *volinfo) gf_store_op_errno_t op_errno = GD_STORE_SUCCESS; dict_t *tmp_dict = NULL; xlator_t *this = NULL; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -2682,8 +2737,11 @@ glusterd_store_retrieve_node_state (glusterd_volinfo_t *volinfo) GF_ASSERT (volinfo); GLUSTERD_GET_VOLUME_DIR(volpath, volinfo, priv); - snprintf (path, sizeof (path), "%s/%s", volpath, - GLUSTERD_NODE_STATE_FILE); + len = snprintf (path, sizeof (path), "%s/%s", volpath, + GLUSTERD_NODE_STATE_FILE); + if ((len < 0) || (len >= PATH_MAX)) { + goto out; + } ret = gf_store_handle_retrieve (path, &volinfo->node_state_shandle); if (ret) @@ -2846,6 +2904,7 @@ glusterd_store_update_volinfo (glusterd_volinfo_t *volinfo) glusterd_conf_t *conf = NULL; gf_store_iter_t *iter = NULL; gf_store_op_errno_t op_errno = GD_STORE_SUCCESS; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -2854,8 +2913,11 @@ glusterd_store_update_volinfo (glusterd_volinfo_t *volinfo) GLUSTERD_GET_VOLUME_DIR(volpath, volinfo, conf); - snprintf (path, sizeof (path), "%s/%s", volpath, - GLUSTERD_VOLUME_INFO_FILE); + len = snprintf (path, sizeof (path), "%s/%s", volpath, + GLUSTERD_VOLUME_INFO_FILE); + if ((len < 0) || (len >= sizeof(path))) { + goto out; + } ret = gf_store_handle_retrieve (path, &volinfo->shandle); if (ret) { @@ -3332,6 +3394,7 @@ glusterd_store_retrieve_volumes (xlator_t *this, glusterd_snap_t *snap) glusterd_volinfo_t *volinfo = NULL; struct stat st = {0,}; char entry_path[PATH_MAX] = {0,}; + int32_t len = 0; GF_ASSERT (this); priv = this->private; @@ -3339,11 +3402,14 @@ glusterd_store_retrieve_volumes (xlator_t *this, glusterd_snap_t *snap) GF_ASSERT (priv); if (snap) - snprintf (path, PATH_MAX, "%s/snaps/%s", priv->workdir, - snap->snapname); + len = snprintf (path, PATH_MAX, "%s/snaps/%s", priv->workdir, + snap->snapname); else - snprintf (path, PATH_MAX, "%s/%s", priv->workdir, - GLUSTERD_VOLUME_DIR_PREFIX); + len = snprintf (path, PATH_MAX, "%s/%s", priv->workdir, + GLUSTERD_VOLUME_DIR_PREFIX); + if ((len < 0) || (len >= PATH_MAX)) { + goto out; + } dir = sys_opendir (path); @@ -3360,7 +3426,12 @@ glusterd_store_retrieve_volumes (xlator_t *this, glusterd_snap_t *snap) (!strcmp (entry->d_name, "info")))) goto next; - snprintf (entry_path, PATH_MAX, "%s/%s", path, entry->d_name); + len = snprintf (entry_path, PATH_MAX, "%s/%s", path, + entry->d_name); + if ((len < 0) || (len >= PATH_MAX)) { + ret = -1; + goto next; + } ret = sys_lstat (entry_path, &st); if (ret == -1) { gf_msg (this->name, GF_LOG_ERROR, 0, @@ -3678,6 +3749,7 @@ glusterd_store_update_snap (glusterd_snap_t *snap) glusterd_conf_t *conf = NULL; gf_store_iter_t *iter = NULL; gf_store_op_errno_t op_errno = GD_STORE_SUCCESS; + int32_t len = 0; this = THIS; conf = this->private; @@ -3685,8 +3757,11 @@ glusterd_store_update_snap (glusterd_snap_t *snap) GLUSTERD_GET_SNAP_DIR (snappath, snap, conf); - snprintf (path, sizeof (path), "%s/%s", snappath, - GLUSTERD_SNAP_INFO_FILE); + len = snprintf (path, sizeof (path), "%s/%s", snappath, + GLUSTERD_SNAP_INFO_FILE); + if ((len < 0) || (len >= sizeof(path))) { + goto out; + } ret = gf_store_handle_retrieve (path, &snap->shandle); if (ret) { @@ -3918,13 +3993,18 @@ glusterd_store_retrieve_snaps (xlator_t *this) DIR *dir = NULL; struct dirent *entry = NULL; struct dirent scratch[2] = {{0,},}; + int32_t len = 0; GF_ASSERT (this); priv = this->private; GF_ASSERT (priv); - snprintf (path, PATH_MAX, "%s/snaps", priv->workdir); + len = snprintf (path, PATH_MAX, "%s/snaps", priv->workdir); + if ((len < 0) || (len >= PATH_MAX)) { + ret = -1; + goto out; + } dir = sys_opendir (path); @@ -4093,6 +4173,7 @@ glusterd_store_delete_peerinfo (glusterd_peerinfo_t *peerinfo) char peerdir[PATH_MAX] = {0,}; char filepath[PATH_MAX] = {0,}; char hostname_path[PATH_MAX] = {0,}; + int32_t len = 0; if (!peerinfo) { @@ -4103,24 +4184,34 @@ glusterd_store_delete_peerinfo (glusterd_peerinfo_t *peerinfo) this = THIS; priv = this->private; - snprintf (peerdir, PATH_MAX, "%s/peers", priv->workdir); - + len = snprintf (peerdir, PATH_MAX, "%s/peers", priv->workdir); + if ((len < 0) || (len >= PATH_MAX)) { + goto out; + } if (gf_uuid_is_null (peerinfo->uuid)) { if (peerinfo->hostname) { - snprintf (filepath, PATH_MAX, "%s/%s", peerdir, - peerinfo->hostname); + len = snprintf (filepath, PATH_MAX, "%s/%s", peerdir, + peerinfo->hostname); + if ((len < 0) || (len >= PATH_MAX)) { + goto out; + } } else { ret = 0; goto out; } } else { - - snprintf (filepath, PATH_MAX, "%s/%s", peerdir, - uuid_utoa (peerinfo->uuid)); - snprintf (hostname_path, PATH_MAX, "%s/%s", - peerdir, peerinfo->hostname); + len = snprintf (filepath, PATH_MAX, "%s/%s", peerdir, + uuid_utoa (peerinfo->uuid)); + if ((len < 0) || (len >= PATH_MAX)) { + goto out; + } + len = snprintf (hostname_path, PATH_MAX, "%s/%s", + peerdir, peerinfo->hostname); + if ((len < 0) || (len >= PATH_MAX)) { + goto out; + } ret = sys_unlink (hostname_path); @@ -4362,14 +4453,19 @@ glusterd_store_retrieve_peers (xlator_t *this) glusterd_peer_hostname_t *address = NULL; uuid_t tmp_uuid; gf_boolean_t is_ok; + int32_t len; GF_ASSERT (this); priv = this->private; GF_ASSERT (priv); - snprintf (path, PATH_MAX, "%s/%s", priv->workdir, - GLUSTERD_PEER_DIR_PREFIX); + len = snprintf (path, PATH_MAX, "%s/%s", priv->workdir, + GLUSTERD_PEER_DIR_PREFIX); + if ((len < 0) || (len >= PATH_MAX)) { + ret = -1; + goto out; + } dir = sys_opendir (path); @@ -4392,7 +4488,11 @@ glusterd_store_retrieve_peers (xlator_t *this) continue; } is_ok = _gf_false; - snprintf (filepath, PATH_MAX, "%s/%s", path, entry->d_name); + len = snprintf (filepath, PATH_MAX, "%s/%s", path, + entry->d_name); + if ((len < 0) || (len >= PATH_MAX)) { + goto next; + } ret = gf_store_handle_retrieve (filepath, &shandle); if (ret) goto next; @@ -4751,6 +4851,7 @@ glusterd_store_retrieve_quota_version (glusterd_volinfo_t *volinfo) xlator_t *this = NULL; glusterd_conf_t *conf = NULL; gf_store_handle_t *handle = NULL; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -4758,8 +4859,11 @@ glusterd_store_retrieve_quota_version (glusterd_volinfo_t *volinfo) GF_ASSERT (conf); GLUSTERD_GET_VOLUME_DIR (path, volinfo, conf); - snprintf (cksum_path, sizeof (cksum_path), "%s/%s", path, - GLUSTERD_VOL_QUOTA_CKSUM_FILE); + len = snprintf (cksum_path, sizeof (cksum_path), "%s/%s", path, + GLUSTERD_VOL_QUOTA_CKSUM_FILE); + if ((len < 0) || (len >= sizeof(cksum_path))) { + goto out; + } ret = gf_store_handle_new (cksum_path, &handle); if (ret) { @@ -4803,13 +4907,17 @@ glusterd_store_save_quota_version_and_cksum (glusterd_volinfo_t *volinfo) char buf[256] = {0}; int fd = -1; int32_t ret = -1; + int32_t len = 0; this = THIS; conf = this->private; GLUSTERD_GET_VOLUME_DIR (path, volinfo, conf); - snprintf (cksum_path, sizeof (cksum_path), "%s/%s", path, - GLUSTERD_VOL_QUOTA_CKSUM_FILE); + len = snprintf (cksum_path, sizeof (cksum_path), "%s/%s", path, + GLUSTERD_VOL_QUOTA_CKSUM_FILE); + if ((len < 0) || (len >= sizeof(cksum_path))) { + goto out; + } ret = gf_store_handle_new (cksum_path, &shandle); if (ret) diff --git a/xlators/mgmt/glusterd/src/glusterd-svc-mgmt.c b/xlators/mgmt/glusterd/src/glusterd-svc-mgmt.c index ebb288c7191..fcf8e666d3e 100644 --- a/xlators/mgmt/glusterd/src/glusterd-svc-mgmt.c +++ b/xlators/mgmt/glusterd/src/glusterd-svc-mgmt.c @@ -153,6 +153,7 @@ glusterd_svc_start (glusterd_svc_t *svc, int flags, dict_t *cmdline) char *localtime_logging = NULL; char *log_level = NULL; char daemon_log_level[30] = {0}; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -176,8 +177,13 @@ glusterd_svc_start (glusterd_svc_t *svc, int flags, dict_t *cmdline) runinit (&runner); if (this->ctx->cmd_args.valgrind) { - snprintf (valgrind_logfile, PATH_MAX, "%s/valgrind-%s.log", - svc->proc.logfile, svc->name); + len = snprintf (valgrind_logfile, PATH_MAX, + "%s/valgrind-%s.log", svc->proc.logfile, + svc->name); + if ((len < 0) || (len >= PATH_MAX)) { + ret = -1; + goto out; + } runner_add_args (&runner, "valgrind", "--leak-check=full", "--trace-children=yes", "--track-origins=yes", diff --git a/xlators/mgmt/glusterd/src/glusterd-tier.c b/xlators/mgmt/glusterd/src/glusterd-tier.c index 264e36295a8..446cb33ff11 100644 --- a/xlators/mgmt/glusterd/src/glusterd-tier.c +++ b/xlators/mgmt/glusterd/src/glusterd-tier.c @@ -1113,7 +1113,7 @@ glusterd_add_tierd_to_dict (glusterd_volinfo_t *volinfo, int32_t pid = -1; int32_t brick_online = -1; char key[1024] = {0}; - char base_key[1024] = {0}; + char base_key[32] = {0}; char pidfile[PATH_MAX] = {0}; xlator_t *this = NULL; diff --git a/xlators/mgmt/glusterd/src/glusterd-tierd-svc-helper.c b/xlators/mgmt/glusterd/src/glusterd-tierd-svc-helper.c index b555a1a9ccb..42cf8968429 100644 --- a/xlators/mgmt/glusterd/src/glusterd-tierd-svc-helper.c +++ b/xlators/mgmt/glusterd/src/glusterd-tierd-svc-helper.c @@ -34,10 +34,14 @@ glusterd_svc_build_tierd_socket_filepath (glusterd_volinfo_t *volinfo, { char sockfilepath[PATH_MAX] = {0,}; char rundir[PATH_MAX] = {0,}; + int32_t len = 0; glusterd_svc_build_tierd_rundir (volinfo, rundir, sizeof (rundir)); - snprintf (sockfilepath, sizeof (sockfilepath), "%s/run-%s", - rundir, uuid_utoa (MY_UUID)); + len = snprintf (sockfilepath, sizeof (sockfilepath), "%s/run-%s", + rundir, uuid_utoa (MY_UUID)); + if ((len < 0) || (len >= sizeof(sockfilepath))) { + sockfilepath[0] = 0; + } glusterd_set_socket_filepath (sockfilepath, path, path_len); } diff --git a/xlators/mgmt/glusterd/src/glusterd-tierd-svc.c b/xlators/mgmt/glusterd/src/glusterd-tierd-svc.c index 9adb8462cdb..9ea6f16a74c 100644 --- a/xlators/mgmt/glusterd/src/glusterd-tierd-svc.c +++ b/xlators/mgmt/glusterd/src/glusterd-tierd-svc.c @@ -53,6 +53,7 @@ glusterd_tierdsvc_init (void *data) glusterd_conn_notify_t notify = NULL; xlator_t *this = NULL; char *volfileserver = NULL; + int32_t len = 0; this = THIS; GF_VALIDATE_OR_GOTO (THIS->name, this, out); @@ -98,7 +99,12 @@ glusterd_tierdsvc_init (void *data) goto out; } glusterd_svc_build_tierd_logfile (logfile, logdir, sizeof (logfile)); - snprintf (volfileid, sizeof (volfileid), "tierd/%s", volinfo->volname); + len = snprintf (volfileid, sizeof (volfileid), "tierd/%s", + volinfo->volname); + if ((len < 0) || (len >= sizeof(volfileid))) { + ret = -1; + goto out; + } if (dict_get_str (this->options, "transport.socket.bind-address", &volfileserver) != 0) { @@ -260,6 +266,7 @@ glusterd_tierdsvc_start (glusterd_svc_t *svc, int flags) glusterd_tierdsvc_t *tierd = NULL; int cmd = GF_DEFRAG_CMD_START_TIER; char *localtime_logging = NULL; + int32_t len = 0; this = THIS; GF_VALIDATE_OR_GOTO (THIS->name, this, out); @@ -315,8 +322,12 @@ glusterd_tierdsvc_start (glusterd_svc_t *svc, int flags) runinit (&runner); if (this->ctx->cmd_args.valgrind) { - snprintf (valgrind_logfile, PATH_MAX, "%s/valgrind-tierd.log", - svc->proc.logdir); + len = snprintf (valgrind_logfile, PATH_MAX, + "%s/valgrind-tierd.log", svc->proc.logdir); + if ((len < 0) || (len >= PATH_MAX)) { + ret = -1; + goto out; + } runner_add_args (&runner, "valgrind", "--leak-check=full", "--trace-children=yes", "--track-origins=yes", diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 7d039a23f1a..385df1ea01b 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -1449,14 +1449,15 @@ glusterd_validate_and_create_brickpath (glusterd_brickinfo_t *brickinfo, char msg[2048] = {0,}; gf_boolean_t is_created = _gf_false; char glusterfs_dir_path[PATH_MAX] = {0}; + int32_t len = 0; ret = sys_mkdir (brickinfo->path, 0777); if (ret) { if (errno != EEXIST) { - snprintf (msg, sizeof (msg), "Failed to create brick " - "directory for brick %s:%s. Reason : %s ", - brickinfo->hostname, brickinfo->path, - strerror (errno)); + len = snprintf (msg, sizeof (msg), "Failed to create " + "brick directory for brick %s:%s. " + "Reason : %s ", brickinfo->hostname, + brickinfo->path, strerror (errno)); goto out; } } else { @@ -1465,60 +1466,70 @@ glusterd_validate_and_create_brickpath (glusterd_brickinfo_t *brickinfo, ret = sys_lstat (brickinfo->path, &brick_st); if (ret) { - snprintf (msg, sizeof (msg), "lstat failed on %s. Reason : %s", - brickinfo->path, strerror (errno)); + len = snprintf (msg, sizeof (msg), "lstat failed on %s. " + "Reason : %s", brickinfo->path, + strerror (errno)); goto out; } if ((!is_created) && (!S_ISDIR (brick_st.st_mode))) { - snprintf (msg, sizeof (msg), "The provided path %s which is " - "already present, is not a directory", - brickinfo->path); + len = snprintf (msg, sizeof (msg), "The provided path %s " + "which is already present, is not a directory", + brickinfo->path); ret = -1; goto out; } - snprintf (parentdir, sizeof (parentdir), "%s/..", brickinfo->path); + len = snprintf (parentdir, sizeof (parentdir), "%s/..", + brickinfo->path); + if ((len < 0) || (len >= sizeof(parentdir))) { + ret = -1; + goto out; + } ret = sys_lstat ("/", &root_st); if (ret) { - snprintf (msg, sizeof (msg), "lstat failed on /. Reason : %s", - strerror (errno)); + len = snprintf (msg, sizeof (msg), "lstat failed on /. " + "Reason : %s", strerror (errno)); goto out; } ret = sys_lstat (parentdir, &parent_st); if (ret) { - snprintf (msg, sizeof (msg), "lstat failed on %s. Reason : %s", - parentdir, strerror (errno)); + len = snprintf (msg, sizeof (msg), "lstat failed on %s. " + "Reason : %s", parentdir, strerror (errno)); goto out; } if (!is_force) { if (brick_st.st_dev != parent_st.st_dev) { - snprintf (msg, sizeof (msg), "The brick %s:%s is a " - "mount point. Please create a sub-directory " - "under the mount point and use that as the " - "brick directory. Or use 'force' at the end " - "of the command if you want to override this " - "behavior.", brickinfo->hostname, - brickinfo->path); + len = snprintf (msg, sizeof (msg), "The brick %s:%s " + "is a mount point. Please create a " + "sub-directory under the mount point " + "and use that as the brick directory. " + "Or use 'force' at the end of the " + "command if you want to override this " + "behavior.", brickinfo->hostname, + brickinfo->path); ret = -1; goto out; } else if (parent_st.st_dev == root_st.st_dev) { - snprintf (msg, sizeof (msg), "The brick %s:%s " - "is being created in the root partition. It " - "is recommended that you don't use the " - "system's root partition for storage backend." - " Or use 'force' at the end of the command if" - " you want to override this behavior.", - brickinfo->hostname, brickinfo->path); + len = snprintf (msg, sizeof (msg), "The brick %s:%s " + "is being created in the root " + "partition. It is recommended that " + "you don't use the system's root " + "partition for storage backend. Or " + "use 'force' at the end of the " + "command if you want to override this " + "behavior.", brickinfo->hostname, + brickinfo->path); /* If --wignore-partition flag is used, ignore warnings * related to bricks being on root partition when 'force' * is not used */ - if (!ignore_partition) { + if ((len < 0) || (len >= sizeof(msg)) || + !ignore_partition) { ret = -1; goto out; } @@ -1540,20 +1551,28 @@ glusterd_validate_and_create_brickpath (glusterd_brickinfo_t *brickinfo, goto out; /* create .glusterfs directory */ - snprintf (glusterfs_dir_path, sizeof (glusterfs_dir_path), "%s/%s", - brickinfo->path, ".glusterfs"); + len = snprintf (glusterfs_dir_path, sizeof (glusterfs_dir_path), + "%s/%s", brickinfo->path, ".glusterfs"); + if ((len < 0) || (len >= sizeof(glusterfs_dir_path))) { + ret = -1; + goto out; + } + ret = sys_mkdir (glusterfs_dir_path, 0600); if (ret && (errno != EEXIST)) { - snprintf (msg, sizeof (msg), "Failed to create .glusterfs " - "directory for brick %s:%s. Reason : %s ", - brickinfo->hostname, brickinfo->path, - strerror (errno)); + len = snprintf (msg, sizeof (msg), "Failed to create " + ".glusterfs directory for brick %s:%s. " + "Reason : %s ", brickinfo->hostname, + brickinfo->path, strerror (errno)); goto out; } ret = 0; out: + if (len < 0) { + ret = -1; + } if (ret && is_created) { (void)recursive_rmdir (brickinfo->path); } @@ -1859,6 +1878,7 @@ glusterd_set_brick_socket_filepath (glusterd_volinfo_t *volinfo, int expected_file_len = 0; char export_path[PATH_MAX] = {0,}; char sock_filepath[PATH_MAX] = {0,}; + int32_t slen = 0; expected_file_len = strlen (GLUSTERD_SOCK_DIR) + strlen ("/") + SHA256_DIGEST_LENGTH*2 + strlen (".socket") + 1; @@ -1870,8 +1890,11 @@ glusterd_set_brick_socket_filepath (glusterd_volinfo_t *volinfo, GLUSTERD_GET_VOLUME_PID_DIR (volume_dir, volinfo, priv); GLUSTERD_REMOVE_SLASH_FROM_PATH (brickinfo->path, export_path); - snprintf (sock_filepath, PATH_MAX, "%s/run/%s-%s", - volume_dir, brickinfo->hostname, export_path); + slen = snprintf (sock_filepath, PATH_MAX, "%s/run/%s-%s", + volume_dir, brickinfo->hostname, export_path); + if (slen < 0) { + sock_filepath[0] = 0; + } glusterd_set_socket_filepath (sock_filepath, sockpath, len); } @@ -1966,6 +1989,7 @@ glusterd_volume_start_glusterfs (glusterd_volinfo_t *volinfo, struct rpc_clnt *rpc = NULL; rpc_clnt_connection_t *conn = NULL; int pid = -1; + int32_t len = 0; GF_ASSERT (volinfo); GF_ASSERT (brickinfo); @@ -2038,15 +2062,19 @@ retry: if (this->ctx->cmd_args.valgrind) { /* Run bricks with valgrind */ if (volinfo->logdir) { - snprintf (valgrind_logfile, PATH_MAX, - "%s/valgrind-%s-%s.log", - volinfo->logdir, - volinfo->volname, exp_path); + len = snprintf (valgrind_logfile, PATH_MAX, + "%s/valgrind-%s-%s.log", + volinfo->logdir, + volinfo->volname, exp_path); } else { - snprintf (valgrind_logfile, PATH_MAX, - "%s/bricks/valgrind-%s-%s.log", - DEFAULT_LOG_FILE_DIRECTORY, - volinfo->volname, exp_path); + len = snprintf (valgrind_logfile, PATH_MAX, + "%s/bricks/valgrind-%s-%s.log", + DEFAULT_LOG_FILE_DIRECTORY, + volinfo->volname, exp_path); + } + if ((len < 0) || (len >= PATH_MAX)) { + ret = -1; + goto out; } runner_add_args (&runner, "valgrind", "--leak-check=full", @@ -2056,22 +2084,32 @@ retry: } if (volinfo->is_snap_volume) { - snprintf (volfile, PATH_MAX,"/%s/%s/%s.%s.%s", - GLUSTERD_VOL_SNAP_DIR_PREFIX, - volinfo->snapshot->snapname, volinfo->volname, - brickinfo->hostname, exp_path); + len = snprintf (volfile, PATH_MAX, "/%s/%s/%s.%s.%s", + GLUSTERD_VOL_SNAP_DIR_PREFIX, + volinfo->snapshot->snapname, volinfo->volname, + brickinfo->hostname, exp_path); } else { - snprintf (volfile, PATH_MAX, "%s.%s.%s", volinfo->volname, - brickinfo->hostname, exp_path); + len = snprintf (volfile, PATH_MAX, "%s.%s.%s", + volinfo->volname, brickinfo->hostname, + exp_path); + } + if ((len < 0) || (len >= PATH_MAX)) { + ret = -1; + goto out; } if (volinfo->logdir) { - snprintf (logfile, PATH_MAX, "%s/%s.log", - volinfo->logdir, exp_path); + len = snprintf (logfile, PATH_MAX, "%s/%s.log", + volinfo->logdir, exp_path); } else { - snprintf (logfile, PATH_MAX, "%s/bricks/%s.log", - DEFAULT_LOG_FILE_DIRECTORY, exp_path); + len = snprintf (logfile, PATH_MAX, "%s/bricks/%s.log", + DEFAULT_LOG_FILE_DIRECTORY, exp_path); + } + if ((len < 0) || (len >= PATH_MAX)) { + ret = -1; + goto out; } + if (!brickinfo->logfile) brickinfo->logfile = gf_strdup (logfile); @@ -2096,8 +2134,12 @@ retry: if (volinfo->transport_type != GF_TRANSPORT_BOTH_TCP_RDMA) { runner_argprintf (&runner, "%d", port); } else { - snprintf (rdma_brick_path, sizeof(rdma_brick_path), "%s.rdma", - brickinfo->path); + len = snprintf (rdma_brick_path, sizeof(rdma_brick_path), + "%s.rdma", brickinfo->path); + if ((len < 0) || (len >= sizeof(rdma_brick_path))) { + ret = -1; + goto out; + } rdma_port = pmap_assign_port (THIS, brickinfo->rdma_port, rdma_brick_path); if (!rdma_port) { @@ -2752,6 +2794,8 @@ int glusterd_compute_cksum (glusterd_volinfo_t *volinfo, char filepath[PATH_MAX] = {0,}; glusterd_conf_t *conf = NULL; xlator_t *this = NULL; + int32_t len1 = 0; + int32_t len2 = 0; this = THIS; GF_ASSERT (this); @@ -2761,15 +2805,19 @@ int glusterd_compute_cksum (glusterd_volinfo_t *volinfo, GLUSTERD_GET_VOLUME_DIR (path, volinfo, conf); if (is_quota_conf) { - snprintf (cksum_path, sizeof (cksum_path), "%s/%s", path, - GLUSTERD_VOL_QUOTA_CKSUM_FILE); - snprintf (filepath, sizeof (filepath), "%s/%s", path, - GLUSTERD_VOLUME_QUOTA_CONFIG); + len1 = snprintf (cksum_path, sizeof (cksum_path), "%s/%s", + path, GLUSTERD_VOL_QUOTA_CKSUM_FILE); + len2 = snprintf (filepath, sizeof (filepath), "%s/%s", path, + GLUSTERD_VOLUME_QUOTA_CONFIG); } else { - snprintf (cksum_path, sizeof (cksum_path), "%s/%s", path, - GLUSTERD_CKSUM_FILE); - snprintf (filepath, sizeof (filepath), "%s/%s", path, - GLUSTERD_VOLUME_INFO_FILE); + len1 = snprintf (cksum_path, sizeof (cksum_path), "%s/%s", + path, GLUSTERD_CKSUM_FILE); + len2 = snprintf (filepath, sizeof (filepath), "%s/%s", path, + GLUSTERD_VOLUME_INFO_FILE); + } + if ((len1 < 0) || (len2 < 0) || + (len1 >= sizeof(cksum_path)) || (len2 >= sizeof(filepath))) { + goto out; } ret = glusterd_volume_compute_cksum (volinfo, cksum_path, filepath, @@ -5568,6 +5616,7 @@ attach_brick (xlator_t *this, int ret = -1; int tries; rpc_clnt_t *rpc; + int32_t len; gf_log (this->name, GF_LOG_INFO, "add brick %s to existing process for %s", @@ -5579,14 +5628,20 @@ attach_brick (xlator_t *this, GLUSTERD_GET_BRICK_PIDFILE (pidfile2, volinfo, brickinfo, conf); if (volinfo->is_snap_volume) { - snprintf (full_id, sizeof(full_id), "/%s/%s/%s.%s.%s", - GLUSTERD_VOL_SNAP_DIR_PREFIX, - volinfo->snapshot->snapname, - volinfo->volname, brickinfo->hostname, unslashed); + len = snprintf (full_id, sizeof(full_id), "/%s/%s/%s.%s.%s", + GLUSTERD_VOL_SNAP_DIR_PREFIX, + volinfo->snapshot->snapname, + volinfo->volname, brickinfo->hostname, + unslashed); } else { - snprintf (full_id, sizeof(full_id), "%s.%s.%s", - volinfo->volname, brickinfo->hostname, unslashed); + len = snprintf (full_id, sizeof(full_id), "%s.%s.%s", + volinfo->volname, brickinfo->hostname, + unslashed); } + if ((len < 0) || (len >= sizeof(full_id))) { + goto out; + } + (void) build_volfile_path (full_id, path, sizeof(path), NULL); @@ -5646,6 +5701,7 @@ attach_brick (xlator_t *this, synclock_lock (&conf->big_lock); } +out: gf_log (this->name, GF_LOG_WARNING, "attach failed for %s", brickinfo->path); return ret; @@ -6876,7 +6932,7 @@ glusterd_add_brick_mount_details (glusterd_brickinfo_t *brickinfo, int ret = -1; char key[1024] = {0}; char buff [PATH_MAX] = {0}; - char base_key[1024] = {0}; + char base_key[32] = {0}; struct mntent save_entry = {0}; char *mnt_pt = NULL; struct mntent *entry = NULL; @@ -6978,7 +7034,7 @@ glusterd_add_brick_detail_to_dict (glusterd_volinfo_t *volinfo, uint64_t inodes_total = 0; uint64_t inodes_free = 0; uint64_t block_size = 0; - char key[1024] = {0}; + char key[1024 + 16] = {0}; char base_key[1024] = {0}; struct statvfs brickstat = {0}; xlator_t *this = NULL; @@ -7061,7 +7117,7 @@ glusterd_add_brick_to_dict (glusterd_volinfo_t *volinfo, int ret = -1; int32_t pid = -1; - char key[1024] = {0}; + char key[1024 + 16] = {0}; char base_key[1024] = {0}; char pidfile[PATH_MAX] = {0}; xlator_t *this = NULL; @@ -8653,13 +8709,17 @@ glusterd_get_bitd_filepath (char *filepath, glusterd_volinfo_t *volinfo) int ret = 0; char path[PATH_MAX] = {0,}; glusterd_conf_t *priv = NULL; + int32_t len = 0; priv = THIS->private; GLUSTERD_GET_VOLUME_DIR (path, volinfo, priv); - snprintf (filepath, PATH_MAX, - "%s/%s-bitd.vol", path, volinfo->volname); + len = snprintf (filepath, PATH_MAX, + "%s/%s-bitd.vol", path, volinfo->volname); + if ((len < 0) || (len >= PATH_MAX)) { + ret = -1; + } return ret; } @@ -8671,6 +8731,7 @@ glusterd_get_client_filepath (char *filepath, glusterd_volinfo_t *volinfo, int ret = 0; char path[PATH_MAX] = {0,}; glusterd_conf_t *priv = NULL; + int32_t len = 0; priv = THIS->private; @@ -8678,18 +8739,21 @@ glusterd_get_client_filepath (char *filepath, glusterd_volinfo_t *volinfo, switch (type) { case GF_TRANSPORT_TCP: - snprintf (filepath, PATH_MAX, - "%s/%s.tcp-fuse.vol", path, volinfo->volname); + len = snprintf (filepath, PATH_MAX, + "%s/%s.tcp-fuse.vol", path, volinfo->volname); break; case GF_TRANSPORT_RDMA: - snprintf (filepath, PATH_MAX, - "%s/%s.rdma-fuse.vol", path, volinfo->volname); + len = snprintf (filepath, PATH_MAX, + "%s/%s.rdma-fuse.vol", path, volinfo->volname); break; default: ret = -1; break; } + if ((len < 0) || (len >= PATH_MAX)) { + ret = -1; + } return ret; } @@ -8702,6 +8766,7 @@ glusterd_get_trusted_client_filepath (char *filepath, int ret = 0; char path[PATH_MAX] = {0,}; glusterd_conf_t *priv = NULL; + int32_t len = 0; priv = THIS->private; @@ -8709,18 +8774,23 @@ glusterd_get_trusted_client_filepath (char *filepath, switch (type) { case GF_TRANSPORT_TCP: - snprintf (filepath, PATH_MAX, "%s/trusted-%s.tcp-fuse.vol", - path, volinfo->volname); + len = snprintf (filepath, PATH_MAX, + "%s/trusted-%s.tcp-fuse.vol", path, + volinfo->volname); break; case GF_TRANSPORT_RDMA: - snprintf (filepath, PATH_MAX, "%s/trusted-%s.rdma-fuse.vol", - path, volinfo->volname); + len = snprintf (filepath, PATH_MAX, + "%s/trusted-%s.rdma-fuse.vol", path, + volinfo->volname); break; default: ret = -1; break; } + if ((len < 0) || (len >= PATH_MAX)) { + ret = -1; + } return ret; } @@ -9686,7 +9756,7 @@ static int _profile_volume_add_friend_rsp (dict_t *this, char *key, data_t *value, void *data) { - char new_key[256] = {0}; + char new_key[264] = {0}; glusterd_pr_brick_rsp_conv_t *rsp_ctx = NULL; data_t *new_value = NULL; int brick_count = 0; @@ -9753,7 +9823,8 @@ glusterd_volume_status_add_peer_rsp (dict_t *this, char *key, data_t *value, char brick_key[1024] = {0,}; char new_key[1024] = {0,}; int32_t index = 0; - int32_t ret = 0; + int32_t ret = -1; + int32_t len = 0; /* Skip the following keys, they are already present in the ctx_dict */ /* Also, skip all the task related pairs. They will be added to the @@ -9771,19 +9842,25 @@ glusterd_volume_status_add_peer_rsp (dict_t *this, char *key, data_t *value, sscanf (key, "brick%d.%s", &index, brick_key); if (index > rsp_ctx->brick_index_max) { - snprintf (new_key, sizeof (new_key), "brick%d.%s", - index + rsp_ctx->other_count, brick_key); + len = snprintf (new_key, sizeof (new_key), "brick%d.%s", + index + rsp_ctx->other_count, brick_key); + if ((len < 0) || (len >= sizeof(new_key))) { + goto out; + } } else { strncpy (new_key, key, sizeof (new_key)); new_key[sizeof (new_key) - 1] = 0; } ret = dict_set (rsp_ctx->dict, new_key, new_value); - if (ret) +out: + if (ret) { + data_unref(new_value); gf_msg ("glusterd", GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, "Unable to set key: %s in dict", key); + } return 0; } @@ -12538,6 +12615,7 @@ glusterd_clean_up_quota_store (glusterd_volinfo_t *volinfo) char cksum_path[PATH_MAX] = {0,}; xlator_t *this = NULL; glusterd_conf_t *conf = NULL; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -12546,10 +12624,16 @@ glusterd_clean_up_quota_store (glusterd_volinfo_t *volinfo) GLUSTERD_GET_VOLUME_DIR (voldir, volinfo, conf); - snprintf (quota_confpath, sizeof (quota_confpath), "%s/%s", voldir, - GLUSTERD_VOLUME_QUOTA_CONFIG); - snprintf (cksum_path, sizeof (cksum_path), "%s/%s", voldir, - GLUSTERD_VOL_QUOTA_CKSUM_FILE); + len = snprintf (quota_confpath, sizeof (quota_confpath), "%s/%s", + voldir, GLUSTERD_VOLUME_QUOTA_CONFIG); + if ((len < 0) || (len >= sizeof(quota_confpath))) { + quota_confpath[0] = 0; + } + len = snprintf (cksum_path, sizeof (cksum_path), "%s/%s", voldir, + GLUSTERD_VOL_QUOTA_CKSUM_FILE); + if ((len < 0) || (len >= sizeof(cksum_path))) { + cksum_path[0] = 0; + } sys_unlink (quota_confpath); sys_unlink (cksum_path); @@ -13375,7 +13459,7 @@ cont: "Libxml not present"); #endif - if (xml_out) + if (xml_out) { #if (HAVE_LIB_XML) output = gf_strdup ((char *)buf->content); if (NULL == output) { @@ -13387,6 +13471,7 @@ cont: GD_MSG_MODULE_NOT_INSTALLED, "Libxml not present"); #endif + } ret = dict_set_dynstr (ctx, "help-str", output); if (ret >= 0) { diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c index fbb8013931b..76266e1e194 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volgen.c +++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c @@ -1830,6 +1830,7 @@ brick_graph_add_changelog (volgen_graph_t *graph, glusterd_volinfo_t *volinfo, xlator_t *xl = NULL; char changelog_basepath[PATH_MAX] = {0,}; int ret = -1; + int32_t len = 0; if (!graph || !volinfo || !set_dict || !brickinfo) goto out; @@ -1842,8 +1843,12 @@ brick_graph_add_changelog (volgen_graph_t *graph, glusterd_volinfo_t *volinfo, if (ret) goto out; - snprintf (changelog_basepath, sizeof (changelog_basepath), - "%s/%s", brickinfo->path, ".glusterfs/changelogs"); + len = snprintf (changelog_basepath, sizeof (changelog_basepath), + "%s/%s", brickinfo->path, ".glusterfs/changelogs"); + if ((len < 0) || (len >= sizeof(changelog_basepath))) { + ret = -1; + goto out; + } ret = xlator_set_option (xl, "changelog-dir", changelog_basepath); if (ret) goto out; @@ -2187,6 +2192,7 @@ brick_graph_add_index (volgen_graph_t *graph, glusterd_volinfo_t *volinfo, char *pending_xattr = NULL; char index_basepath[PATH_MAX] = {0}; int ret = -1; + int32_t len = 0; if (!graph || !volinfo || !brickinfo || !set_dict) goto out; @@ -2200,8 +2206,11 @@ brick_graph_add_index (volgen_graph_t *graph, glusterd_volinfo_t *volinfo, if (!xl) goto out; - snprintf (index_basepath, sizeof (index_basepath), "%s/%s", - brickinfo->path, ".glusterfs/indices"); + len = snprintf (index_basepath, sizeof (index_basepath), "%s/%s", + brickinfo->path, ".glusterfs/indices"); + if ((len < 0) || (len >= sizeof(index_basepath))) { + goto out; + } ret = xlator_set_option (xl, "index-base", index_basepath); if (ret) @@ -2474,6 +2483,7 @@ brick_graph_add_server (volgen_graph_t *graph, glusterd_volinfo_t *volinfo, char *ssl_user = NULL; char *volname = NULL; char *address_family_data = NULL; + int32_t len = 0; if (!graph || !volinfo || !set_dict || !brickinfo) goto out; @@ -2523,8 +2533,11 @@ brick_graph_add_server (volgen_graph_t *graph, glusterd_volinfo_t *volinfo, if (username) { memset (key, 0, sizeof (key)); - snprintf (key, sizeof (key), "auth.login.%s.allow", - brickinfo->path); + len = snprintf (key, sizeof (key), "auth.login.%s.allow", + brickinfo->path); + if ((len < 0) || (len >= sizeof(key))) { + return -1; + } ret = xlator_set_option (xl, key, username); if (ret) @@ -2563,8 +2576,11 @@ brick_graph_add_server (volgen_graph_t *graph, glusterd_volinfo_t *volinfo, if (dict_get_str (volinfo->dict, "auth.ssl-allow", &ssl_user) == 0) { memset (key, 0, sizeof (key)); - snprintf (key, sizeof (key), "auth.login.%s.ssl-allow", - brickinfo->path); + len = snprintf (key, sizeof (key), "auth.login.%s.ssl-allow", + brickinfo->path); + if ((len < 0) || (len >= sizeof(key))) { + return -1; + } ret = xlator_set_option (xl, key, ssl_user); if (ret) @@ -5638,6 +5654,7 @@ get_brick_filepath (char *filename, glusterd_volinfo_t *volinfo, char path[PATH_MAX] = {0,}; char brick[PATH_MAX] = {0,}; glusterd_conf_t *priv = NULL; + int32_t len = 0; priv = THIS->private; @@ -5645,13 +5662,16 @@ get_brick_filepath (char *filename, glusterd_volinfo_t *volinfo, GLUSTERD_GET_VOLUME_DIR (path, volinfo, priv); if (prefix) - snprintf (filename, PATH_MAX, "%s/%s.%s.%s.%s.vol", - path, volinfo->volname, prefix, - brickinfo->hostname, brick); + len = snprintf (filename, PATH_MAX, "%s/%s.%s.%s.%s.vol", + path, volinfo->volname, prefix, + brickinfo->hostname, brick); else - snprintf (filename, PATH_MAX, "%s/%s.%s.%s.vol", - path, volinfo->volname, - brickinfo->hostname, brick); + len = snprintf (filename, PATH_MAX, "%s/%s.%s.%s.vol", + path, volinfo->volname, + brickinfo->hostname, brick); + if ((len < 0) || (len >= PATH_MAX)) { + filename[0] = 0; + } } @@ -5877,16 +5897,18 @@ get_parent_vol_tstamp_file (char *filename, glusterd_volinfo_t *volinfo) { glusterd_conf_t *priv = NULL; xlator_t *this = NULL; + int32_t len = 0; this = THIS; GF_ASSERT (this); priv = this->private; GF_ASSERT (priv); - snprintf (filename, PATH_MAX, "%s/vols/%s", priv->workdir, - volinfo->parent_volname); - strncat (filename, "/marker.tstamp", - PATH_MAX - strlen(filename) - 1); + len = snprintf (filename, PATH_MAX, "%s/vols/%s/marker.tstamp", + priv->workdir, volinfo->parent_volname); + if ((len < 0) || (len >= PATH_MAX)) { + filename[0] = 0; + } } void @@ -6438,7 +6460,7 @@ build_bitd_volume_graph (volgen_graph_t *graph, get_transport_type (volinfo, set_dict, transt, _gf_false); if (!strncmp (transt, "tcp,rdma", strlen ("tcp,rdma"))) - strncpy (transt, "tcp", strlen ("tcp")); + strncpy (transt, "tcp", sizeof(transt)); cds_list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) { if (!glusterd_is_local_brick (this, volinfo, brickinfo)) @@ -6600,7 +6622,7 @@ build_scrub_volume_graph (volgen_graph_t *graph, glusterd_volinfo_t *volinfo, get_transport_type (volinfo, set_dict, transt, _gf_false); if (!strncmp (transt, "tcp,rdma", strlen ("tcp,rdma"))) - strncpy (transt, "tcp", strlen ("tcp")); + strncpy (transt, "tcp", sizeof(transt)); cds_list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) { if (!glusterd_is_local_brick (this, volinfo, brickinfo)) diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c index e46ef57e441..3973a0da78a 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c @@ -1507,6 +1507,7 @@ glusterd_op_stage_start_volume (dict_t *dict, char **op_errstr, char volid[50] = {0,}; char xattr_volid[50] = {0,}; int caps = 0; + int32_t len = 0; this = THIS; GF_ASSERT (this); @@ -1585,19 +1586,25 @@ glusterd_op_stage_start_volume (dict_t *dict, char **op_errstr, if (ret && (flags & GF_CLI_FLAG_OP_FORCE)) { continue; } else if (ret) { - snprintf (msg, sizeof (msg), "Failed to find " - "brick directory %s for volume %s. " - "Reason : %s", brickinfo->path, - volname, strerror (errno)); + len = snprintf (msg, sizeof (msg), "Failed to find " + "brick directory %s for volume %s. " + "Reason : %s", brickinfo->path, + volname, strerror (errno)); + if (len < 0) { + strcpy(msg, "<error>"); + } goto out; } ret = sys_lgetxattr (brickinfo->path, GF_XATTR_VOL_ID_KEY, volume_id, 16); if (ret < 0 && (!(flags & GF_CLI_FLAG_OP_FORCE))) { - snprintf (msg, sizeof (msg), "Failed to get " - "extended attribute %s for brick dir %s. " - "Reason : %s", GF_XATTR_VOL_ID_KEY, - brickinfo->path, strerror (errno)); + len = snprintf (msg, sizeof (msg), "Failed to get " + "extended attribute %s for brick dir " + "%s. Reason : %s", GF_XATTR_VOL_ID_KEY, + brickinfo->path, strerror (errno)); + if (len < 0) { + strcpy(msg, "<error>"); + } ret = -1; goto out; } else if (ret < 0) { @@ -1606,22 +1613,30 @@ glusterd_op_stage_start_volume (dict_t *dict, char **op_errstr, volinfo->volume_id, 16, XATTR_CREATE); if (ret == -1) { - snprintf (msg, sizeof (msg), "Failed to set " - "extended attribute %s on %s. Reason: " - "%s", GF_XATTR_VOL_ID_KEY, - brickinfo->path, strerror (errno)); + len = snprintf (msg, sizeof (msg), "Failed to " + "set extended attribute %s on " + "%s. Reason: %s", + GF_XATTR_VOL_ID_KEY, + brickinfo->path, + strerror (errno)); + if (len < 0) { + strcpy(msg, "<error>"); + } goto out; } else { continue; } } if (gf_uuid_compare (volinfo->volume_id, volume_id)) { - snprintf (msg, sizeof (msg), "Volume id mismatch for " - "brick %s:%s. Expected volume id %s, " - "volume id %s found", brickinfo->hostname, - brickinfo->path, - uuid_utoa_r (volinfo->volume_id, volid), - uuid_utoa_r (volume_id, xattr_volid)); + len = snprintf (msg, sizeof (msg), "Volume id " + "mismatch for brick %s:%s. Expected " + "volume id %s, volume id %s found", + brickinfo->hostname, brickinfo->path, + uuid_utoa_r (volinfo->volume_id, volid), + uuid_utoa_r (volume_id, xattr_volid)); + if (len < 0) { + strcpy(msg, "<error>"); + } ret = -1; goto out; } @@ -3070,6 +3085,7 @@ glusterd_clearlocks_get_local_client_ports (glusterd_volinfo_t *volinfo, int ret = -1; int i = 0; int port = 0; + int32_t len = 0; GF_ASSERT (xl_opts); if (!xl_opts) { @@ -3085,11 +3101,15 @@ glusterd_clearlocks_get_local_client_ports (glusterd_volinfo_t *volinfo, continue; if (volinfo->transport_type == GF_TRANSPORT_RDMA) { - snprintf (brickname, sizeof(brickname), "%s.rdma", - brickinfo->path); + len = snprintf (brickname, sizeof(brickname), + "%s.rdma", brickinfo->path); } else - snprintf (brickname, sizeof(brickname), "%s", - brickinfo->path); + len = snprintf (brickname, sizeof(brickname), "%s", + brickinfo->path); + if ((len < 0) || (len >= sizeof(brickname))) { + ret = -1; + goto out; + } port = pmap_registry_search (THIS, brickname, GF_PMAP_PORT_BRICKSERVER, diff --git a/xlators/mgmt/glusterd/src/glusterd.c b/xlators/mgmt/glusterd/src/glusterd.c index 316cae4243b..7dc45129312 100644 --- a/xlators/mgmt/glusterd/src/glusterd.c +++ b/xlators/mgmt/glusterd/src/glusterd.c @@ -569,6 +569,7 @@ glusterd_crt_georep_folders (char *georepdir, glusterd_conf_t *conf) char *greplg_s = NULL; struct group *gr = NULL; int ret = 0; + int32_t len = 0; GF_ASSERT (georepdir); GF_ASSERT (conf); @@ -582,7 +583,11 @@ glusterd_crt_georep_folders (char *georepdir, glusterd_conf_t *conf) goto out; } - snprintf (georepdir, PATH_MAX, "%s/"GEOREP, conf->workdir); + len = snprintf (georepdir, PATH_MAX, "%s/"GEOREP, conf->workdir); + if ((len < 0) || (len >= PATH_MAX)) { + ret = -1; + goto out; + } ret = mkdir_p (georepdir, 0777, _gf_true); if (-1 == ret) { gf_msg ("glusterd", GF_LOG_CRITICAL, errno, @@ -1404,6 +1409,7 @@ init (xlator_t *this) gf_boolean_t upgrade = _gf_false; gf_boolean_t downgrade = _gf_false; char *localtime_logging = NULL; + int32_t len = 0; #ifndef GF_DARWIN_HOST_OS { @@ -1503,8 +1509,13 @@ init (xlator_t *this) exit (1); } - snprintf (snap_mount_dir, sizeof(snap_mount_dir), "%s%s", - var_run_dir, GLUSTERD_DEFAULT_SNAPS_BRICK_DIR); + len = snprintf (snap_mount_dir, sizeof(snap_mount_dir), "%s%s", + var_run_dir, GLUSTERD_DEFAULT_SNAPS_BRICK_DIR); + if ((len < 0) || (len >= sizeof(snap_mount_dir))) { + gf_msg (this->name, GF_LOG_CRITICAL, 0, + GD_MSG_DIR_OP_FAILED, "Snap mount dir too long"); + exit(1); + } ret = mkdir_p (GLUSTER_SHARED_STORAGE_BRICK_DIR, 0777, _gf_true); @@ -1571,7 +1582,10 @@ init (xlator_t *this) exit (1); } - snprintf (storedir, PATH_MAX, "%s/vols", workdir); + len = snprintf (storedir, sizeof(storedir), "%s/vols", workdir); + if ((len < 0) || (len >= sizeof(storedir))) { + exit(1); + } ret = sys_mkdir (storedir, 0777); @@ -1584,7 +1598,10 @@ init (xlator_t *this) } /*keeping individual volume pid file information in /var/run/gluster* */ - snprintf (storedir, PATH_MAX, "%s/vols", rundir); + len = snprintf (storedir, sizeof(storedir), "%s/vols", rundir); + if ((len < 0) || (len >= sizeof(storedir))) { + exit(1); + } ret = sys_mkdir (storedir, 0777); @@ -1596,7 +1613,10 @@ init (xlator_t *this) exit (1); } - snprintf (storedir, PATH_MAX, "%s/snaps", workdir); + len = snprintf (storedir, sizeof(storedir), "%s/snaps", workdir); + if ((len < 0) || (len >= sizeof(storedir))) { + exit(1); + } ret = sys_mkdir (storedir, 0777); @@ -1608,7 +1628,10 @@ init (xlator_t *this) exit (1); } - snprintf (storedir, PATH_MAX, "%s/peers", workdir); + len = snprintf (storedir, sizeof(storedir), "%s/peers", workdir); + if ((len < 0) || (len >= sizeof(storedir))) { + exit(1); + } ret = sys_mkdir (storedir, 0777); @@ -1620,7 +1643,12 @@ init (xlator_t *this) exit (1); } - snprintf (storedir, PATH_MAX, "%s/bricks", DEFAULT_LOG_FILE_DIRECTORY); + len = snprintf (storedir, sizeof(storedir), "%s/bricks", + DEFAULT_LOG_FILE_DIRECTORY); + if ((len < 0) || (len >= sizeof(storedir))) { + exit(1); + } + ret = sys_mkdir (storedir, 0777); if ((-1 == ret) && (errno != EEXIST)) { gf_msg (this->name, GF_LOG_CRITICAL, errno, @@ -1630,7 +1658,10 @@ init (xlator_t *this) exit (1); } - snprintf (storedir, PATH_MAX, "%s/nfs", workdir); + len = snprintf (storedir, sizeof(storedir), "%s/nfs", workdir); + if ((len < 0) || (len >= sizeof(storedir))) { + exit(1); + } ret = sys_mkdir (storedir, 0777); if ((-1 == ret) && (errno != EEXIST)) { gf_msg (this->name, GF_LOG_CRITICAL, errno, @@ -1640,7 +1671,10 @@ init (xlator_t *this) exit (1); } - snprintf (storedir, PATH_MAX, "%s/bitd", workdir); + len = snprintf (storedir, sizeof(storedir), "%s/bitd", workdir); + if ((len < 0) || (len >= sizeof(storedir))) { + exit(1); + } ret = sys_mkdir (storedir, 0777); if ((-1 == ret) && (errno != EEXIST)) { gf_msg (this->name, GF_LOG_CRITICAL, errno, @@ -1650,7 +1684,10 @@ init (xlator_t *this) exit (1); } - snprintf (storedir, PATH_MAX, "%s/scrub", workdir); + len = snprintf (storedir, sizeof(storedir), "%s/scrub", workdir); + if ((len < 0) || (len >= sizeof(storedir))) { + exit(1); + } ret = sys_mkdir (storedir, 0777); if ((-1 == ret) && (errno != EEXIST)) { gf_msg (this->name, GF_LOG_CRITICAL, errno, @@ -1660,7 +1697,10 @@ init (xlator_t *this) exit (1); } - snprintf (storedir, PATH_MAX, "%s/glustershd", workdir); + len = snprintf (storedir, sizeof(storedir), "%s/glustershd", workdir); + if ((len < 0) || (len >= sizeof(storedir))) { + exit(1); + } ret = sys_mkdir (storedir, 0777); if ((-1 == ret) && (errno != EEXIST)) { gf_msg (this->name, GF_LOG_CRITICAL, errno, @@ -1670,7 +1710,10 @@ init (xlator_t *this) exit (1); } - snprintf (storedir, PATH_MAX, "%s/quotad", workdir); + len = snprintf (storedir, sizeof(storedir), "%s/quotad", workdir); + if ((len < 0) || (len >= sizeof(storedir))) { + exit(1); + } ret = sys_mkdir (storedir, 0777); if ((-1 == ret) && (errno != EEXIST)) { gf_msg (this->name, GF_LOG_CRITICAL, errno, @@ -1680,7 +1723,10 @@ init (xlator_t *this) exit (1); } - snprintf (storedir, PATH_MAX, "%s/groups", workdir); + len = snprintf (storedir, sizeof(storedir), "%s/groups", workdir); + if ((len < 0) || (len >= sizeof(storedir))) { + exit(1); + } ret = sys_mkdir (storedir, 0777); if ((-1 == ret) && (errno != EEXIST)) { gf_msg (this->name, GF_LOG_CRITICAL, errno, diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h index 33413976e6d..fa053e0c170 100644 --- a/xlators/mgmt/glusterd/src/glusterd.h +++ b/xlators/mgmt/glusterd/src/glusterd.h @@ -612,63 +612,119 @@ typedef enum { typedef ssize_t (*gd_serialize_t) (struct iovec outmsg, void *args); -#define GLUSTERD_GET_VOLUME_DIR(path, volinfo, priv) \ - if (volinfo->is_snap_volume) { \ - snprintf (path, PATH_MAX, "%s/snaps/%s/%s", priv->workdir, \ - volinfo->snapshot->snapname, volinfo->volname); \ - } else { \ - snprintf (path, PATH_MAX, "%s/vols/%s", priv->workdir, \ - volinfo->volname); \ - } +#define GLUSTERD_GET_VOLUME_DIR(path, volinfo, priv) \ + do { \ + int32_t len; \ + if (volinfo->is_snap_volume) { \ + len = snprintf (path, PATH_MAX, "%s/snaps/%s/%s", \ + priv->workdir, \ + volinfo->snapshot->snapname, \ + volinfo->volname); \ + } else { \ + len = snprintf (path, PATH_MAX, "%s/vols/%s", \ + priv->workdir, volinfo->volname); \ + } \ + if ((len < 0) || (len >= PATH_MAX)) { \ + path[0] = 0; \ + } \ + } while (0) + #define GLUSTERD_GET_TIER_DIR(path, volinfo, priv) do { \ - snprintf (path, PATH_MAX, "%s/tier/%s", priv->workdir, \ - volinfo->volname); \ + int32_t len; \ + len = snprintf (path, PATH_MAX, "%s/tier/%s", \ + priv->workdir, volinfo->volname); \ + if ((len < 0) || (len >= PATH_MAX)) { \ + path[0] = 0; \ + } \ } while (0) #define GLUSTERD_GET_TIER_PID_FILE(path, volinfo, priv) do { \ char tier_path[PATH_MAX]; \ + int32_t len; \ GLUSTERD_GET_TIER_DIR(tier_path, volinfo, priv); \ - snprintf (path, PATH_MAX, "%s/run/%s-tierd.pid", tier_path,\ - volinfo->volname); \ + len = snprintf (path, PATH_MAX, "%s/run/%s-tierd.pid", \ + tier_path, volinfo->volname); \ + if ((len < 0) || (len >= PATH_MAX)) { \ + path[0] = 0; \ + } \ } while (0) #define GLUSTERD_GET_VOLUME_PID_DIR(path, volinfo, priv) \ do { \ + int32_t len; \ if (volinfo->is_snap_volume) { \ - snprintf (path, PATH_MAX, "%s/snaps/%s/%s", \ - priv->rundir, \ - volinfo->snapshot->snapname, volinfo->volname); \ + len = snprintf (path, PATH_MAX, "%s/snaps/%s/%s", \ + priv->rundir, \ + volinfo->snapshot->snapname, \ + volinfo->volname); \ } else { \ - snprintf (path, PATH_MAX, "%s/vols/%s", \ - priv->rundir, \ - volinfo->volname); \ + len = snprintf (path, PATH_MAX, "%s/vols/%s", \ + priv->rundir, \ + volinfo->volname); \ + } \ + if ((len < 0) || (len >= PATH_MAX)) { \ + path[0] = 0; \ } \ } while (0) -#define GLUSTERD_GET_SNAP_DIR(path, snap, priv) \ - snprintf (path, PATH_MAX, "%s/snaps/%s", priv->workdir, \ - snap->snapname); +#define GLUSTERD_GET_SNAP_DIR(path, snap, priv) \ + do { \ + int32_t len; \ + len = snprintf (path, PATH_MAX, "%s/snaps/%s", priv->workdir, \ + snap->snapname); \ + if ((len < 0) || (len >= PATH_MAX)) { \ + path[0] = 0; \ + } \ + } while (0) #define GLUSTERD_GET_SNAP_GEO_REP_DIR(path, snap, priv) \ - snprintf (path, PATH_MAX, "%s/snaps/%s/%s", priv->workdir, \ - snap->snapname, GEOREP); + do { \ + int32_t len; \ + len = snprintf (path, PATH_MAX, "%s/snaps/%s/%s", \ + priv->workdir, snap->snapname, GEOREP); \ + if ((len < 0) || (len >= PATH_MAX)) { \ + path[0] = 0; \ + } \ + } while (0) #define GLUSTERD_GET_BRICK_DIR(path, volinfo, priv) \ - if (volinfo->is_snap_volume) { \ - snprintf (path, PATH_MAX, "%s/snaps/%s/%s/%s", priv->workdir, \ - volinfo->snapshot->snapname, volinfo->volname, \ - GLUSTERD_BRICK_INFO_DIR); \ - } else { \ - snprintf (path, PATH_MAX, "%s/%s/%s/%s", priv->workdir, \ - GLUSTERD_VOLUME_DIR_PREFIX, volinfo->volname, \ - GLUSTERD_BRICK_INFO_DIR); \ - } + do { \ + int32_t len; \ + if (volinfo->is_snap_volume) { \ + len = snprintf (path, PATH_MAX, "%s/snaps/%s/%s/%s", \ + priv->workdir, \ + volinfo->snapshot->snapname, \ + volinfo->volname, \ + GLUSTERD_BRICK_INFO_DIR); \ + } else { \ + len = snprintf (path, PATH_MAX, "%s/%s/%s/%s", \ + priv->workdir, \ + GLUSTERD_VOLUME_DIR_PREFIX, \ + volinfo->volname, \ + GLUSTERD_BRICK_INFO_DIR); \ + } \ + if ((len < 0) || (len >= PATH_MAX)) { \ + path[0] = 0; \ + } \ + } while (0) #define GLUSTERD_GET_NFS_DIR(path, priv) \ - snprintf (path, PATH_MAX, "%s/nfs", priv->workdir); + do { \ + int32_t len; \ + len = snprintf (path, PATH_MAX, "%s/nfs", priv->workdir); \ + if ((len < 0) || (len >= PATH_MAX)) { \ + path[0] = 0; \ + } \ + } while (0) #define GLUSTERD_GET_QUOTAD_DIR(path, priv) \ - snprintf (path, PATH_MAX, "%s/quotad", priv->workdir); + do { \ + int32_t len; \ + len = snprintf (path, PATH_MAX, "%s/quotad", priv->workdir); \ + if ((len < 0) || (len >= PATH_MAX)) { \ + path[0] = 0; \ + } \ + } while (0) #define GLUSTERD_GET_QUOTA_LIMIT_MOUNT_PATH(abspath, volname, path) do { \ snprintf (abspath, sizeof (abspath)-1, \ @@ -697,32 +753,48 @@ do { \ #define GLUSTERD_GET_BRICK_PIDFILE(pidfile,volinfo,brickinfo, priv) do { \ char exp_path[PATH_MAX] = {0,}; \ char volpath[PATH_MAX] = {0,}; \ + int32_t len = 0; \ GLUSTERD_GET_VOLUME_PID_DIR (volpath, volinfo, priv); \ GLUSTERD_REMOVE_SLASH_FROM_PATH (brickinfo->path, exp_path); \ - snprintf (pidfile, PATH_MAX, "%s/%s-%s.pid", \ - volpath, brickinfo->hostname, exp_path); \ + len = snprintf (pidfile, PATH_MAX, "%s/%s-%s.pid", \ + volpath, brickinfo->hostname, exp_path); \ + if ((len < 0) || (len >= PATH_MAX)) { \ + pidfile[0] = 0; \ + } \ } while (0) -#define GLUSTERD_GET_NFS_PIDFILE(pidfile, nfspath, priv) { \ - snprintf (pidfile, PATH_MAX, "%s/nfs/nfs.pid", \ - priv->rundir); \ - } +#define GLUSTERD_GET_NFS_PIDFILE(pidfile, nfspath, priv) do { \ + int32_t len; \ + len = snprintf (pidfile, PATH_MAX, "%s/nfs/nfs.pid", \ + priv->rundir); \ + if ((len < 0) || (len >= PATH_MAX)) { \ + pidfile[0] = 0; \ + } \ + } while (0) -#define GLUSTERD_GET_QUOTAD_PIDFILE(pidfile, quotadpath, priv) { \ - snprintf (pidfile, PATH_MAX, "%s/quotad/quotad.pid", \ - priv->rundir); \ - } +#define GLUSTERD_GET_QUOTAD_PIDFILE(pidfile, quotadpath, priv) do { \ + int32_t len; \ + len = snprintf (pidfile, PATH_MAX, "%s/quotad/quotad.pid", \ + priv->rundir); \ + if ((len < 0) || (len >= PATH_MAX)) { \ + pidfile[0] = 0; \ + } \ + } while (0) #define GLUSTERD_GET_QUOTA_CRAWL_PIDDIR(piddir, volinfo, type) do { \ char _volpath[PATH_MAX] = {0,}; \ + int32_t len; \ GLUSTERD_GET_VOLUME_DIR (_volpath, volinfo, priv); \ if (type == GF_QUOTA_OPTION_TYPE_ENABLE || \ type == GF_QUOTA_OPTION_TYPE_ENABLE_OBJECTS) \ - snprintf (piddir, PATH_MAX, "%s/run/quota/enable", \ - _volpath); \ + len = snprintf (piddir, PATH_MAX, \ + "%s/run/quota/enable", _volpath); \ else \ - snprintf (piddir, PATH_MAX, "%s/run/quota/disable", \ - _volpath); \ + len = snprintf (piddir, PATH_MAX, \ + "%s/run/quota/disable", _volpath); \ + if ((len < 0) || (len >= PATH_MAX)) { \ + piddir[0] = 0; \ + } \ } while (0) #define GLUSTERD_STACK_DESTROY(frame) do {\ @@ -740,31 +812,49 @@ do { \ #define GLUSTERD_GET_DEFRAG_DIR(path, volinfo, priv) do { \ char vol_path[PATH_MAX]; \ char operation[NAME_MAX]; \ + int32_t len; \ GLUSTERD_GET_VOLUME_DIR(vol_path, volinfo, priv); \ GLUSTERD_GET_DEFRAG_PROCESS(operation, volinfo); \ - snprintf (path, PATH_MAX, "%s/%s", vol_path, operation);\ + len = snprintf (path, PATH_MAX, "%s/%s", vol_path, \ + operation); \ + if ((len < 0) || (len >= PATH_MAX)) { \ + path[0] = 0; \ + } \ } while (0) #define GLUSTERD_GET_DEFRAG_SOCK_FILE_OLD(path, volinfo, priv) do { \ char defrag_path[PATH_MAX]; \ + int32_t len; \ GLUSTERD_GET_DEFRAG_DIR(defrag_path, volinfo, priv); \ - snprintf (path, PATH_MAX, "%s/%s.sock", defrag_path, \ - uuid_utoa(MY_UUID)); \ + len = snprintf (path, PATH_MAX, "%s/%s.sock", \ + defrag_path, uuid_utoa(MY_UUID)); \ + if ((len < 0) || (len >= PATH_MAX)) { \ + path[0] = 0; \ + } \ } while (0) -#define GLUSTERD_GET_DEFRAG_SOCK_FILE(path, volinfo) do { \ - char operation[NAME_MAX]; \ - GLUSTERD_GET_DEFRAG_PROCESS(operation, volinfo); \ - snprintf (path, UNIX_PATH_MAX, DEFAULT_VAR_RUN_DIRECTORY \ - "/gluster-%s-%s.sock", operation, \ - uuid_utoa(volinfo->volume_id)); \ +#define GLUSTERD_GET_DEFRAG_SOCK_FILE(path, volinfo) do { \ + char operation[NAME_MAX]; \ + int32_t len; \ + GLUSTERD_GET_DEFRAG_PROCESS(operation, volinfo); \ + len = snprintf (path, UNIX_PATH_MAX, \ + DEFAULT_VAR_RUN_DIRECTORY \ + "/gluster-%s-%s.sock", operation, \ + uuid_utoa(volinfo->volume_id)); \ + if ((len < 0) || (len >= PATH_MAX)) { \ + path[0] = 0; \ + } \ } while (0) #define GLUSTERD_GET_DEFRAG_PID_FILE(path, volinfo, priv) do { \ char defrag_path[PATH_MAX]; \ + int32_t len; \ GLUSTERD_GET_DEFRAG_DIR(defrag_path, volinfo, priv); \ - snprintf (path, PATH_MAX, "%s/%s.pid", defrag_path, \ - uuid_utoa(MY_UUID)); \ + len = snprintf (path, PATH_MAX, "%s/%s.pid", \ + defrag_path, uuid_utoa(MY_UUID)); \ + if ((len < 0) || (len >= PATH_MAX)) { \ + path[0] = 0; \ + } \ } while (0) #define GLUSTERFS_GET_QUOTA_LIMIT_MOUNT_PIDFILE(pidfile, volname) { \ @@ -796,15 +886,11 @@ do { \ } while (0) #define GLUSTERD_DUMP_PEERS(head, member, xpeers) do { \ - glusterd_peerinfo_t *_peerinfo = NULL; \ - int index = 1; \ - char key[GF_DUMP_MAX_BUF_LEN] = {0,}; \ + glusterd_peerinfo_t *_peerinfo = NULL; \ + int index = 1; \ + char *key = NULL; \ \ - if (!xpeers) \ - snprintf (key, sizeof (key), "glusterd.peer"); \ - else \ - snprintf (key, sizeof (key), \ - "glusterd.xaction_peer"); \ + key = xpeers ? "glusterd.xaction_peer" : "glusterd.peer"; \ \ rcu_read_lock (); \ cds_list_for_each_entry_rcu (_peerinfo, head, member) { \ |