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>
This commit is contained in:
Yaniv Kaul 2018-08-21 20:39:16 +03:00 committed by Amar Tumballi
parent 21e78061a2
commit ce17a3a66d
4 changed files with 30 additions and 33 deletions

View File

@ -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';
}

View File

@ -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 " ], ",

View File

@ -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;
}
}

View File

@ -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,