summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchenzizhan <[email protected]>2023-10-18 17:21:08 +0800
committerchenzizhan <[email protected]>2023-10-18 17:26:15 +0800
commit1424397232edc426b33c870a85ebcf97cf3fb166 (patch)
tree48fd1baf24154353088bd44ffef52a0a2609a0da
parent9c07e4db631a44c9c6c230baf16acd65bc6c4b8c (diff)
fix a bug when tagstring value very longv4.3.2
-rw-r--r--src/tags/my_ut_hash.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/src/tags/my_ut_hash.c b/src/tags/my_ut_hash.c
index 8e6eeb3..ffb8de0 100644
--- a/src/tags/my_ut_hash.c
+++ b/src/tags/my_ut_hash.c
@@ -24,10 +24,11 @@ void build_dynamic_cell_key(const struct fieldstat_tag tags[], size_t n_tags, ch
int used_len = 0;
struct fieldstat_tag *tag = NULL;
- char one_time_key[1024] = {0};
- size_t tmp_key_size = sizeof(one_time_key);
- size_t remain_key_size = tmp_key_size;
- size_t total_key_size = tmp_key_size;
+ const size_t init_key_size = 1024;
+ size_t one_time_key_size = init_key_size;
+ char *one_time_key = (char *)malloc(init_key_size);
+ size_t remain_key_size = init_key_size;
+ size_t total_key_size = init_key_size;
char *dynamic_mem = (char *)malloc(remain_key_size);
size_t key_len;
size_t val_len;
@@ -41,6 +42,10 @@ void build_dynamic_cell_key(const struct fieldstat_tag tags[], size_t n_tags, ch
key_len = strlen(tag->key);
val_len = sizeof(long long);
used_len = key_len + val_len;
+ while (used_len >= one_time_key_size) {
+ one_time_key_size += init_key_size;
+ one_time_key = (char *)realloc(one_time_key, one_time_key_size);
+ }
memcpy(one_time_key, tag->key, key_len);
memcpy(one_time_key + key_len, &tag->value_longlong, val_len);
break;
@@ -48,6 +53,10 @@ void build_dynamic_cell_key(const struct fieldstat_tag tags[], size_t n_tags, ch
key_len = strlen(tag->key);
val_len = sizeof(double);
used_len = key_len + val_len;
+ while (used_len >= one_time_key_size) {
+ one_time_key_size += init_key_size;
+ one_time_key = (char *)realloc(one_time_key, one_time_key_size);
+ }
memcpy(one_time_key, tag->key, key_len);
memcpy(one_time_key + key_len, &tag->value_double, val_len);
break;
@@ -55,6 +64,10 @@ void build_dynamic_cell_key(const struct fieldstat_tag tags[], size_t n_tags, ch
key_len = strlen(tag->key);
val_len = strlen(tag->value_str);
used_len = key_len + val_len;
+ while (used_len >= one_time_key_size) {
+ one_time_key_size += init_key_size;
+ one_time_key = (char *)realloc(one_time_key, one_time_key_size);
+ }
memcpy(one_time_key, tag->key, key_len);
memcpy(one_time_key + key_len, tag->value_str, val_len);
break;
@@ -63,10 +76,10 @@ void build_dynamic_cell_key(const struct fieldstat_tag tags[], size_t n_tags, ch
break;
}
- if (used_len >= remain_key_size) {
- total_key_size += tmp_key_size;
+ while (used_len >= remain_key_size) {
+ total_key_size += init_key_size;
dynamic_mem = (char *)realloc(dynamic_mem, total_key_size);
- remain_key_size += tmp_key_size;
+ remain_key_size += init_key_size;
}
memcpy(dynamic_mem + total_key_size - remain_key_size, one_time_key, used_len);
@@ -79,6 +92,7 @@ void build_dynamic_cell_key(const struct fieldstat_tag tags[], size_t n_tags, ch
*out_key_size = total_key_size - remain_key_size; // not include '\0'
free(dynamic_mem);
+ free(one_time_key);
}
struct tag_hash_key {