diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index 299a060c5..c3164cb8f 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -2511,9 +2511,9 @@ static void ng_stats_monologue(const ng_parser_t *parser, bencode_item_t *dict, if (ml->tag.len) sub = parser->dict_add_dict(dict, ml->tag.s); else { - char *buf = bencode_buffer_alloc(dict->buffer, 32); - snprintf(buf, 32, "", ml->unique_id); - sub = parser->dict_add_dict(dict, buf); + char buf[32]; + snprintf(buf, sizeof(buf), "", ml->unique_id); + sub = parser->dict_add_dict_dup(dict, buf); } parser->dict_add_str(sub, "tag", &ml->tag); @@ -2625,14 +2625,14 @@ static void ng_stats_ssrc(const ng_parser_t *parser, bencode_item_t *dict, struc for (GList *l = ll; l; l = l->next) { struct ssrc_entry_call *se = l->data; - char *tmp = bencode_buffer_alloc(dict->buffer, 12); - snprintf(tmp, 12, "%" PRIu32, se->h.ssrc); + char tmp[12]; + snprintf(tmp, sizeof(tmp), "%" PRIu32, se->h.ssrc); if (parser->dict_contains(dict, tmp)) continue; if (!se->stats_blocks.length || !se->lowest_mos || !se->highest_mos) continue; - bencode_item_t *ent = parser->dict_add_dict(dict, tmp); + bencode_item_t *ent = parser->dict_add_dict_dup(dict, tmp); parser->dict_add_int(ent, "cumulative loss", se->packets_lost); diff --git a/daemon/control_ng.c b/daemon/control_ng.c index adbc09d41..1c9826bd5 100644 --- a/daemon/control_ng.c +++ b/daemon/control_ng.c @@ -145,6 +145,12 @@ static parser_arg __bencode_dictionary_get_expect(bencode_item_t *arg, const cha static bool __bencode_dictionary_contains(bencode_item_t *d, const char *ele) { return bencode_dictionary_get(d, ele) != NULL; } +static bencode_item_t *__bencode_dictionary_add_dictionary_dup(bencode_item_t *n, const char *e) { + size_t len = strlen(e) + 1; + char *s = bencode_buffer_alloc(n->buffer, len); + memcpy(s, e, len); + return bencode_dictionary_add_dictionary(n, s); +} static bool json_is_dict(JsonNode *n) { return json_node_get_node_type(n) == JSON_NODE_OBJECT; @@ -341,6 +347,7 @@ const ng_parser_t ng_parser_native = { .dict_add_str_dup = bencode_dictionary_add_str_dup, .dict_add_int = bencode_dictionary_add_integer, .dict_add_dict = bencode_dictionary_add_dictionary, + .dict_add_dict_dup = __bencode_dictionary_add_dictionary_dup, .dict_add_list = bencode_dictionary_add_list, .list = __bencode_list, .list_add = bencode_list_add, @@ -371,6 +378,7 @@ const ng_parser_t ng_parser_json = { .dict_add_str_dup = bencode_dictionary_add_str_dup, .dict_add_int = bencode_dictionary_add_integer, .dict_add_dict = bencode_dictionary_add_dictionary, + .dict_add_dict_dup = __bencode_dictionary_add_dictionary_dup, .dict_add_list = bencode_dictionary_add_list, .list = __bencode_list, .list_add = bencode_list_add, diff --git a/include/control_ng.h b/include/control_ng.h index c08932bc8..2661b8192 100644 --- a/include/control_ng.h +++ b/include/control_ng.h @@ -140,6 +140,7 @@ struct ng_parser { void (*dict_add_str_dup)(parser_arg, const char *, const str *); void (*dict_add_int)(parser_arg, const char *, long long); bencode_item_t *(*dict_add_dict)(parser_arg, const char *); + bencode_item_t *(*dict_add_dict_dup)(parser_arg, const char *); bencode_item_t *(*dict_add_list)(parser_arg, const char *); parser_arg (*list)(ng_parser_ctx_t *); bencode_item_t *(*list_add)(parser_arg, parser_arg);