diff options
| author | chenzizhan <[email protected]> | 2023-10-18 17:21:08 +0800 |
|---|---|---|
| committer | chenzizhan <[email protected]> | 2023-10-18 17:26:15 +0800 |
| commit | 1424397232edc426b33c870a85ebcf97cf3fb166 (patch) | |
| tree | 48fd1baf24154353088bd44ffef52a0a2609a0da | |
| parent | 9c07e4db631a44c9c6c230baf16acd65bc6c4b8c (diff) | |
fix a bug when tagstring value very longv4.3.2
| -rw-r--r-- | src/tags/my_ut_hash.c | 28 |
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 { |
