From d27e8870c1882b1abfffefaf7b40bc7f2a1ec05f Mon Sep 17 00:00:00 2001 From: Yaniv Kaul Date: Fri, 24 Aug 2018 17:24:15 +0300 Subject: libglusterfs/src/dict.c: allocate memory accurately. I suspect we've allocated and then set to '\0' an additional byte for no reason: gf_asprintf() allocates enough inc. the terminating null; data->len took that additional byte into account; memcpy() it back took care of that terminating null byte as well. Also, unrelated, implemented str_to_data() via strn_to_data(). Compile-tested only! updates: bz#1193929 Signed-off-by: Yaniv Kaul Change-Id: I32c90e12974f51a0fbc0cfaebf9bd0fd722adc11 --- libglusterfs/src/dict.c | 31 ++++++++----------------------- 1 file changed, 8 insertions(+), 23 deletions(-) (limited to 'libglusterfs') diff --git a/libglusterfs/src/dict.c b/libglusterfs/src/dict.c index 57be4e76d63..b69f0e79a47 100644 --- a/libglusterfs/src/dict.c +++ b/libglusterfs/src/dict.c @@ -1018,18 +1018,8 @@ str_to_data (char *value) LG_MSG_INVALID_ARG, "value is NULL"); return NULL; } - data_t *data = get_new_data (); - - if (!data) { - return NULL; - } - data->len = strlen (value) + 1; - data->data_type = GF_DATA_TYPE_STR; - - data->data = value; - data->is_static = 1; - return data; + return strn_to_data(value, strlen (value)); } data_t * @@ -1127,12 +1117,12 @@ data_to_int64 (data_t *data) { VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_INT, "null", -1); - char *str = alloca (data->len + 1); + char *str = alloca (data->len); if (!str) return -1; memcpy (str, data->data, data->len); - str[data->len] = '\0'; + return (int64_t) strtoull (str, NULL, 0); } @@ -1141,12 +1131,11 @@ data_to_int32 (data_t *data) { VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_INT, "null", -1); - char *str = alloca (data->len + 1); + char *str = alloca (data->len); if (!str) return -1; memcpy (str, data->data, data->len); - str[data->len] = '\0'; return strtoul (str, NULL, 0); } @@ -1157,12 +1146,11 @@ data_to_int16 (data_t *data) VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_INT, "null", -1); int16_t value = 0; - char *str = alloca (data->len + 1); + char *str = alloca (data->len); if (!str) return -1; memcpy (str, data->data, data->len); - str[data->len] = '\0'; errno = 0; value = strtol (str, NULL, 0); @@ -1212,12 +1200,11 @@ data_to_uint64 (data_t *data) { VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_UINT, "null", -1); - char *str = alloca (data->len + 1); + char *str = alloca (data->len); if (!str) return -1; memcpy (str, data->data, data->len); - str[data->len] = '\0'; return strtoll (str, NULL, 0); } @@ -1227,12 +1214,11 @@ data_to_uint32 (data_t *data) { VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_UINT, "null", -1); - char *str = alloca (data->len + 1); + char *str = alloca (data->len); if (!str) return -1; memcpy (str, data->data, data->len); - str[data->len] = '\0'; return strtol (str, NULL, 0); } @@ -1243,12 +1229,11 @@ data_to_uint16 (data_t *data) VALIDATE_DATA_AND_LOG(data, GF_DATA_TYPE_UINT, "null", -1); uint16_t value = 0; - char *str = alloca (data->len + 1); + char *str = alloca (data->len); if (!str) return -1; memcpy (str, data->data, data->len); - str[data->len] = '\0'; errno = 0; value = strtol (str, NULL, 0); -- cgit