diff options
Diffstat (limited to 'xlators/features')
-rw-r--r-- | xlators/features/bit-rot/src/bitd/bit-rot-scrub.c | 8 | ||||
-rw-r--r-- | xlators/features/changelog/src/changelog-helpers.c | 39 | ||||
-rw-r--r-- | xlators/features/index/src/index.c | 19 |
3 files changed, 52 insertions, 14 deletions
diff --git a/xlators/features/bit-rot/src/bitd/bit-rot-scrub.c b/xlators/features/bit-rot/src/bitd/bit-rot-scrub.c index ee996525f76..e393ae0f64e 100644 --- a/xlators/features/bit-rot/src/bitd/bit-rot-scrub.c +++ b/xlators/features/bit-rot/src/bitd/bit-rot-scrub.c @@ -1750,6 +1750,7 @@ br_collect_bad_objects_of_child (xlator_t *this, br_child_t *child, char *entry = NULL; char tmp[PATH_MAX] = {0, }; char *path = NULL; + int32_t len = 0; ret = dict_get_int32 (child_dict, "count", &count); if (ret) @@ -1764,8 +1765,11 @@ br_collect_bad_objects_of_child (xlator_t *this, br_child_t *child, continue; ret = dict_get_str (child_dict, entry, &path); - snprintf (tmp, PATH_MAX, "%s ==> BRICK: %s\n path: %s", - entry, child->brick_path, path); + len = snprintf (tmp, PATH_MAX, "%s ==> BRICK: %s\n path: %s", + entry, child->brick_path, path); + if ((len < 0) || (len >= PATH_MAX)) { + continue; + } snprintf (main_key, PATH_MAX, "quarantine-%d", tmp_count); diff --git a/xlators/features/changelog/src/changelog-helpers.c b/xlators/features/changelog/src/changelog-helpers.c index 306287ecd11..8bc994fa417 100644 --- a/xlators/features/changelog/src/changelog-helpers.c +++ b/xlators/features/changelog/src/changelog-helpers.c @@ -629,6 +629,7 @@ htime_open (xlator_t *this, ssize_t size = 0; struct stat stat_buf = {0,}; unsigned long record_len = 0; + int32_t len = 0; CHANGELOG_FILL_HTIME_DIR(priv->changelog_dir, ht_dir_path); @@ -672,8 +673,12 @@ htime_open (xlator_t *this, gf_smsg (this->name, GF_LOG_INFO, 0, CHANGELOG_MSG_HTIME_INFO, "HTIME_CURRENT", "path=%s", ht_file_bname, NULL); - (void) snprintf (ht_file_path, PATH_MAX, "%s/%s", - ht_dir_path, ht_file_bname); + len = snprintf (ht_file_path, PATH_MAX, "%s/%s", ht_dir_path, + ht_file_bname); + if ((len < 0) || (len >= PATH_MAX)) { + ret = -1; + goto out; + } /* Open in append mode as existing htime file is used */ flags |= (O_RDWR | O_SYNC | O_APPEND); @@ -763,6 +768,7 @@ htime_create (xlator_t *this, char ht_file_path[PATH_MAX] = {0,}; char ht_file_bname[NAME_MAX + 1] = {0,}; int flags = 0; + int32_t len = 0; gf_smsg (this->name, GF_LOG_INFO, 0, CHANGELOG_MSG_HTIME_INFO, "Changelog enable: Creating new " @@ -773,8 +779,12 @@ htime_create (xlator_t *this, CHANGELOG_FILL_HTIME_DIR(priv->changelog_dir, ht_dir_path); /* get the htime file name in ht_file_path */ - (void) snprintf (ht_file_path,PATH_MAX,"%s/%s.%lu",ht_dir_path, + len = snprintf (ht_file_path, PATH_MAX, "%s/%s.%lu", ht_dir_path, HTIME_FILE_NAME, ts); + if ((len < 0) || (len >= PATH_MAX)) { + ret = -1; + goto out; + } flags |= (O_CREAT | O_RDWR | O_SYNC); ht_file_fd = open (ht_file_path, flags, @@ -865,12 +875,16 @@ changelog_snap_open (xlator_t *this, char buffer[1024] = {0,}; char c_snap_path[PATH_MAX] = {0,}; char csnap_dir_path[PATH_MAX] = {0,}; + int32_t len = 0; CHANGELOG_FILL_CSNAP_DIR(priv->changelog_dir, csnap_dir_path); - (void) snprintf (c_snap_path, PATH_MAX, - "%s/"CSNAP_FILE_NAME, + len = snprintf (c_snap_path, PATH_MAX, "%s/"CSNAP_FILE_NAME, csnap_dir_path); + if ((len < 0) || (len >= PATH_MAX)) { + ret = -1; + goto out; + } flags |= (O_CREAT | O_RDWR | O_TRUNC); @@ -2002,8 +2016,12 @@ resolve_pargfid_to_path (xlator_t *this, const uuid_t pgfid, priv->changelog_brick); while (!(__is_root_gfid (pargfid))) { - snprintf (dir_handle, PATH_MAX, "%s/%02x/%02x/%s", gpath, - pargfid[0], pargfid[1], uuid_utoa (pargfid)); + len = snprintf (dir_handle, PATH_MAX, "%s/%02x/%02x/%s", gpath, + pargfid[0], pargfid[1], uuid_utoa (pargfid)); + if ((len < 0) || (len >= PATH_MAX)) { + ret = -1; + goto out; + } len = sys_readlink (dir_handle, linkname, PATH_MAX); if (len < 0) { @@ -2023,7 +2041,12 @@ resolve_pargfid_to_path (xlator_t *this, const uuid_t pgfid, &saveptr); dir_name = strtok_r (NULL, "/", &saveptr); - snprintf (result, PATH_MAX, "%s/%s", dir_name, pre_dir_name); + len = snprintf (result, PATH_MAX, "%s/%s", dir_name, + pre_dir_name); + if ((len < 0) || (len >= PATH_MAX)) { + ret = -1; + goto out; + } strncpy (pre_dir_name, result, sizeof(pre_dir_name)); gf_uuid_parse (pgfidstr, tmp_gfid); diff --git a/xlators/features/index/src/index.c b/xlators/features/index/src/index.c index f39d901d624..86c21e9aa83 100644 --- a/xlators/features/index/src/index.c +++ b/xlators/features/index/src/index.c @@ -810,6 +810,7 @@ index_entry_create (xlator_t *this, inode_t *inode, char *filename) char entry_path[PATH_MAX] = {0}; index_priv_t *priv = NULL; index_inode_ctx_t *ctx = NULL; + int32_t len = 0; priv = this->private; @@ -841,10 +842,15 @@ index_entry_create (xlator_t *this, inode_t *inode, char *filename) ctx->state[ENTRY_CHANGES] = IN; } + len = snprintf (entry_path, sizeof(entry_path), "%s/%s", pgfid_path, + filename); + if ((len < 0) || (len >= sizeof(entry_path))) { + op_errno = EINVAL; + goto out; + } + op_errno = 0; - snprintf (entry_path, sizeof(entry_path), "%s/%s", pgfid_path, - filename); ret = index_link_to_base (this, entry_path, ENTRY_CHANGES_SUBDIR); out: if (op_errno) @@ -860,6 +866,7 @@ index_entry_delete (xlator_t *this, uuid_t pgfid, char *filename) char pgfid_path[PATH_MAX] = {0}; char entry_path[PATH_MAX] = {0}; index_priv_t *priv = NULL; + int32_t len = 0; priv = this->private; @@ -870,8 +877,12 @@ index_entry_delete (xlator_t *this, uuid_t pgfid, char *filename) make_gfid_path (priv->index_basepath, ENTRY_CHANGES_SUBDIR, pgfid, pgfid_path, sizeof (pgfid_path)); - snprintf (entry_path, sizeof(entry_path), "%s/%s", pgfid_path, - filename); + len = snprintf (entry_path, sizeof(entry_path), "%s/%s", pgfid_path, + filename); + if ((len < 0) || (len >= sizeof(entry_path))) { + op_errno = EINVAL; + goto out; + } ret = sys_unlink (entry_path); if (ret && (errno != ENOENT)) { |