diff options
author | Yaniv Kaul <ykaul@redhat.com> | 2018-08-21 20:39:16 +0300 |
---|---|---|
committer | Amar Tumballi <amarts@redhat.com> | 2018-09-07 03:39:50 +0000 |
commit | ce17a3a66dd15f09d1bf5404f7f3dee860ca6f8c (patch) | |
tree | 41b7b2baafd869b611f4c741df7cd262e17a3bb0 | |
parent | 21e78061a24a094067fb267b77c4ffaae7e762f3 (diff) |
multiple xlators: strncpy()->sprintf(), reduce strlen()'s
xlators/cluster/afr/src/afr-common.c
xlators/cluster/dht/src/dht-common.c
xlators/cluster/dht/src/dht-rebalance.c
xlators/cluster/stripe/src/stripe-helpers.c
strncpy may not be very efficient for short strings copied into
a large buffer: If the length of src is less than n,
strncpy() writes additional null bytes to dest to ensure
that a total of n bytes are written.
Instead, use snprintf().
Also:
- save the result of strlen() and re-use it when possible.
- move from strlen to SLEN (sizeof() ) for const strings.
Compile-tested only!
Change-Id: Icdf79dd3d9f9ff120e4720ff2b8bd016df575c38
updates: bz#1193929
Signed-off-by: Yaniv Kaul <ykaul@redhat.com>
-rw-r--r-- | xlators/cluster/afr/src/afr-common.c | 25 | ||||
-rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 22 | ||||
-rw-r--r-- | xlators/cluster/dht/src/dht-rebalance.c | 6 | ||||
-rw-r--r-- | xlators/cluster/stripe/src/stripe-helpers.c | 10 |
4 files changed, 30 insertions, 33 deletions
diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c index 641485b1ed0..3a32ebc31a4 100644 --- a/xlators/cluster/afr/src/afr-common.c +++ b/xlators/cluster/afr/src/afr-common.c @@ -2178,7 +2178,7 @@ afr_is_xattr_ignorable (char *key) { int i = 0; - if (!strncmp (key, AFR_XATTR_PREFIX, strlen(AFR_XATTR_PREFIX))) + if (!strncmp (key, AFR_XATTR_PREFIX, SLEN (AFR_XATTR_PREFIX))) return _gf_true; for (i = 0; afr_ignore_xattrs[i]; i++) { if (!strcmp (key, afr_ignore_xattrs[i])) @@ -6212,7 +6212,6 @@ afr_get_heal_info (call_frame_t *frame, xlator_t *this, loc_t *loc) dict_t *dict = NULL; int ret = -1; int op_errno = 0; - int size = 0; inode_t *inode = NULL; char *substr = NULL; char *status = NULL; @@ -6229,21 +6228,18 @@ afr_get_heal_info (call_frame_t *frame, xlator_t *this, loc_t *loc) } if (pending) { - size = strlen ("-pending") + 1; gf_asprintf (&substr, "-pending"); if (!substr) goto out; } if (ret == -EIO) { - size += strlen ("split-brain") + 1; ret = gf_asprintf (&status, "split-brain%s", substr? substr : ""); if (ret < 0) goto out; dict = afr_set_heal_info (status); } else if (ret == -EAGAIN) { - size += strlen ("possibly-healing") + 1; ret = gf_asprintf (&status, "possibly-healing%s", substr? substr : ""); if (ret < 0) @@ -6258,7 +6254,6 @@ afr_get_heal_info (call_frame_t *frame, xlator_t *this, loc_t *loc) !metadata_selfheal) { dict = afr_set_heal_info ("no-heal"); } else { - size += strlen ("heal") + 1; ret = gf_asprintf (&status, "heal%s", substr? substr : ""); if (ret < 0) @@ -6275,7 +6270,6 @@ afr_get_heal_info (call_frame_t *frame, xlator_t *this, loc_t *loc) */ if (data_selfheal || entry_selfheal || metadata_selfheal) { - size += strlen ("heal") + 1; ret = gf_asprintf (&status, "heal%s", substr? substr : ""); if (ret < 0) @@ -6409,13 +6403,13 @@ afr_get_split_brain_status (void *opaque) } /* Calculation for string length : - * (child_count X length of child-name) + strlen (" Choices :") + * (child_count X length of child-name) + SLEN (" Choices :") * child-name consists of : * a) 251 = max characters for volname according to GD_VOLUME_NAME_MAX * b) strlen ("-client-00,") assuming 16 replicas */ - choices = alloca0 (priv->child_count * (251 + sizeof("-client-00,")) + - sizeof(" Choices:")); + choices = alloca0 (priv->child_count * (256 + SLEN ("-client-00,")) + + SLEN (" Choices:")); ret = afr_is_split_brain (frame, this, inode, loc->gfid, &d_spb, &m_spb); @@ -6717,6 +6711,7 @@ afr_serialize_xattrs_with_delimiter (call_frame_t *frame, xlator_t *this, char *xattr = NULL; int i = 0; int len = 0; + size_t str_len = 0; int ret = -1; priv = this->private; @@ -6724,8 +6719,9 @@ afr_serialize_xattrs_with_delimiter (call_frame_t *frame, xlator_t *this, for (i = 0; i < priv->child_count; i++) { if (!local->replies[i].valid || local->replies[i].op_ret) { - buf = strncat (buf, default_str, strlen (default_str)); - len += strlen (default_str); + str_len = strlen (default_str); + buf = strncat (buf, default_str, str_len); + len += str_len; buf[len++] = delimiter; buf[len] = '\0'; } else { @@ -6738,8 +6734,9 @@ afr_serialize_xattrs_with_delimiter (call_frame_t *frame, xlator_t *this, "%d", i); goto out; } - buf = strncat (buf, xattr, strlen (xattr)); - len += strlen (xattr); + str_len = strlen (xattr); + buf = strncat (buf, xattr, str_len); + len += str_len; buf[len++] = delimiter; buf[len] = '\0'; } diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index c7c7fbf22ba..69555a22e5e 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -428,7 +428,7 @@ dht_aggregate (dict_t *this, char *key, data_t *value, void *data) goto out; } else { /* compare user xattrs only */ - if (!strncmp (key, "user.", strlen ("user."))) { + if (!strncmp (key, "user.", SLEN ("user."))) { ret = dict_lookup (dst, key, &dict_data); if (!ret && dict_data && value) { ret = is_data_equal (dict_data, value); @@ -4379,7 +4379,7 @@ dht_vgetxattr_alloc_and_fill (dht_local_t *local, dict_t *xattr, xlator_t *this, local->alloc_len += strlen(value); if (!local->xattr_val) { - local->alloc_len += sizeof (DHT_PATHINFO_HEADER) + 10; + local->alloc_len += (SLEN (DHT_PATHINFO_HEADER) + 10); local->xattr_val = GF_MALLOC (local->alloc_len, gf_common_mt_char); if (!local->xattr_val) { @@ -5189,8 +5189,9 @@ dht_getxattr (call_frame_t *frame, xlator_t *this, if (!DHT_IS_DIR(layout)) goto no_dht_is_dir; - if (strncmp (key, GF_XATTR_GET_REAL_FILENAME_KEY, - strlen (GF_XATTR_GET_REAL_FILENAME_KEY)) == 0) { + if ((strncmp (key, GF_XATTR_GET_REAL_FILENAME_KEY, + SLEN (GF_XATTR_GET_REAL_FILENAME_KEY)) == 0) + && DHT_IS_DIR(layout)) { dht_getxattr_get_real_filename (frame, this, loc, key, xdata); return 0; } @@ -5442,7 +5443,7 @@ dht_fgetxattr (call_frame_t *frame, xlator_t *this, if ((fd->inode->ia_type == IA_IFDIR) && key && (strncmp (key, GF_XATTR_LOCKINFO_KEY, - strlen (GF_XATTR_LOCKINFO_KEY)) != 0)) { + SLEN (GF_XATTR_LOCKINFO_KEY)) != 0)) { local->call_cnt = conf->subvolume_cnt; cnt = conf->subvolume_cnt; ret = dht_inode_ctx_mdsvol_get (fd->inode, this, &mds_subvol); @@ -6165,7 +6166,7 @@ dht_setxattr (call_frame_t *frame, xlator_t *this, goto err; } - memcpy (value, tmp->data, ((tmp->len < 4095) ? tmp->len : 4095)); + memcpy (value, tmp->data, min (tmp->len, 4095)); local->key = gf_strdup (value); local->call_cnt = conf->subvolume_cnt; @@ -6214,7 +6215,7 @@ dht_setxattr (call_frame_t *frame, xlator_t *this, tmp = dict_get (xattr, "distribute.directory-spread-count"); if (tmp) { /* Setxattr value is packed as 'binary', not string */ - memcpy (value, tmp->data, ((tmp->len < 4095)?tmp->len:4095)); + memcpy (value, tmp->data, min (tmp->len, 4095)); ret = gf_string2uint32 (value, &dir_spread); if (!ret && ((dir_spread <= conf->subvolume_cnt) && (dir_spread > 0))) { @@ -11422,7 +11423,6 @@ dht_log_new_layout_for_dir_selfheal (xlator_t *this, loc_t *loc, int i = 0; gf_loglevel_t log_level = gf_log_get_loglevel(); int ret = 0; - int max_string_len = 0; if (log_level < GF_LOG_INFO) return; @@ -11439,9 +11439,7 @@ dht_log_new_layout_for_dir_selfheal (xlator_t *this, loc_t *loc, if (!loc->path) return; - max_string_len = sizeof (string); - - ret = snprintf (string, max_string_len, "Setting layout of %s with ", + ret = snprintf (string, sizeof (string), "Setting layout of %s with ", loc->path); if (ret < 0) @@ -11461,7 +11459,7 @@ dht_log_new_layout_for_dir_selfheal (xlator_t *this, loc_t *loc, for (i = 0; i < layout->cnt; i++) { - ret = snprintf (string, max_string_len, + ret = snprintf (string, sizeof (string), "[Subvol_name: %s, Err: %d , Start: " "%"PRIu32 " , Stop: %"PRIu32 " , Hash: %" PRIu32 " ], ", diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c index ed61880c8e4..9983429acec 100644 --- a/xlators/cluster/dht/src/dht-rebalance.c +++ b/xlators/cluster/dht/src/dht-rebalance.c @@ -147,12 +147,12 @@ dht_send_rebalance_event (xlator_t *this, int cmd, gf_defrag_status_t status) volname = defrag->tier_conf.volname; } else { /* DHT volume */ - len = strlen (this->name); + len = strlen (this->name) - strlen (suffix); tmpstr = gf_strdup (this->name); if (tmpstr) { - ptr = tmpstr + (len - strlen (suffix)); + ptr = tmpstr + len; if (!strcmp (ptr, suffix)) { - tmpstr[len - strlen (suffix)] = '\0'; + tmpstr[len] = '\0'; volname = tmpstr; } } diff --git a/xlators/cluster/stripe/src/stripe-helpers.c b/xlators/cluster/stripe/src/stripe-helpers.c index 71ab608118f..59dfdfad979 100644 --- a/xlators/cluster/stripe/src/stripe-helpers.c +++ b/xlators/cluster/stripe/src/stripe-helpers.c @@ -253,6 +253,7 @@ stripe_fill_pathinfo_xattr (xlator_t *this, stripe_local_t *local, int ret = -1; int32_t padding = 0; int32_t tlen = 0; + int len = 0; char stripe_size_str[20] = {0,}; char *pathinfo_serz = NULL; @@ -261,12 +262,13 @@ stripe_fill_pathinfo_xattr (xlator_t *this, stripe_local_t *local, goto out; } - (void) snprintf (stripe_size_str, sizeof (stripe_size_str), "%"PRId64, + len = snprintf (stripe_size_str, sizeof (stripe_size_str), "%"PRId64, (long long) (local->fctx) ? local->fctx->stripe_size : 0); - + if (len < 0 || len >= sizeof (stripe_size_str)) + goto out; /* extra bytes for decorations (brackets and <>'s) */ - padding = strlen (this->name) + strlen (STRIPE_PATHINFO_HEADER) - + strlen (stripe_size_str) + 7; + padding = strlen (this->name) + SLEN (STRIPE_PATHINFO_HEADER) + + len + 7; local->xattr_total_len += (padding + 2); pathinfo_serz = GF_MALLOC (local->xattr_total_len, |