Browse Source

TT#111150 fix mem leaks in test-transcode

Change-Id: I3a796184e64b1fc1f760b53fe7d1855997ab8b72
pull/1252/head
Richard Fuchs 5 years ago
parent
commit
87e5efc7d4
3 changed files with 66 additions and 24 deletions
  1. +21
    -16
      daemon/call.c
  2. +1
    -0
      include/call.h
  3. +44
    -8
      t/test-transcode.c

+ 21
- 16
daemon/call.c View File

@ -2683,6 +2683,26 @@ int call_stream_address46(char *o, struct packet_stream *ps, enum stream_address
}
void call_media_free(struct call_media **mdp) {
struct call_media *md = *mdp;
crypto_params_sdes_queue_clear(&md->sdes_in);
crypto_params_sdes_queue_clear(&md->sdes_out);
g_queue_clear(&md->streams);
g_queue_clear(&md->endpoint_maps);
g_hash_table_destroy(md->codecs_recv);
g_hash_table_destroy(md->codecs_send);
g_hash_table_destroy(md->codec_names_recv);
g_hash_table_destroy(md->codec_names_send);
g_queue_clear_full(&md->codecs_prefs_recv, (GDestroyNotify) payload_type_free);
g_queue_clear_full(&md->codecs_prefs_send, (GDestroyNotify) payload_type_free);
codec_handlers_free(md);
codec_handler_free(&md->t38_handler);
t38_gateway_put(&md->t38_gateway);
g_queue_clear_full(&md->sdp_attributes, free);
g_slice_free1(sizeof(*md), md);
*mdp = NULL;
}
static void __call_free(void *p) {
struct call *c = p;
struct call_monologue *m;
@ -2708,22 +2728,7 @@ static void __call_free(void *p) {
while (c->medias.head) {
md = g_queue_pop_head(&c->medias);
crypto_params_sdes_queue_clear(&md->sdes_in);
crypto_params_sdes_queue_clear(&md->sdes_out);
g_queue_clear(&md->streams);
g_queue_clear(&md->endpoint_maps);
g_hash_table_destroy(md->codecs_recv);
g_hash_table_destroy(md->codecs_send);
g_hash_table_destroy(md->codec_names_recv);
g_hash_table_destroy(md->codec_names_send);
g_queue_clear_full(&md->codecs_prefs_recv, (GDestroyNotify) payload_type_free);
g_queue_clear_full(&md->codecs_prefs_send, (GDestroyNotify) payload_type_free);
codec_handlers_free(md);
codec_handler_free(&md->t38_handler);
t38_gateway_put(&md->t38_gateway);
g_queue_clear_full(&md->sdp_attributes, free);
g_slice_free1(sizeof(*md), md);
call_media_free(&md);
}
while (c->endpoint_maps.head) {


+ 1
- 0
include/call.h View File

@ -470,6 +470,7 @@ int call_delete_branch(const str *callid, const str *branch,
const str *fromtag, const str *totag, bencode_item_t *output, int delete_delay);
void call_destroy(struct call *);
struct call_media *call_media_new(struct call *call);
void call_media_free(struct call_media **mdp);
enum call_stream_state call_stream_state_machine(struct packet_stream *);
void call_media_state_machine(struct call_media *m);
void call_media_unkernelize(struct call_media *media);


+ 44
- 8
t/test-transcode.c View File

@ -44,9 +44,28 @@ static GQueue rtp_types = G_QUEUE_INIT;
#define start() __start(__FILE__, __LINE__)
static void __init(void) {
g_queue_clear(&rtp_types);
static void __pt_slice_free(void *p) {
g_slice_free1(sizeof(struct rtp_payload_type), p);
}
static void __cleanup(void) {
if (flags.codec_strip)
g_hash_table_destroy(flags.codec_strip);
if (flags.codec_mask)
g_hash_table_destroy(flags.codec_mask);
if (flags.codec_except)
g_hash_table_destroy(flags.codec_except);
if (flags.codec_set)
g_hash_table_destroy(flags.codec_set);
if (flags.codec_consume)
g_hash_table_destroy(flags.codec_consume);
if (flags.codec_accept)
g_hash_table_destroy(flags.codec_accept);
g_queue_clear_full(&flags.codec_transcode, free);
g_queue_clear_full(&rtp_types, __pt_slice_free);
memset(&flags, 0, sizeof(flags));
}
static void __init(void) {
__cleanup();
flags.codec_strip = g_hash_table_new_full(str_case_hash, str_case_equal, free, NULL);
flags.codec_mask = g_hash_table_new_full(str_case_hash, str_case_equal, free, NULL);
flags.codec_except = g_hash_table_new_full(str_case_hash, str_case_equal, free, NULL);
@ -245,7 +264,8 @@ static void __packet_seq_ts(const char *file, int line, struct call_media *media
abort();
}
struct codec_packet *cp = g_queue_pop_head(&mp.packets_out);
rtp = (void *) cp->s.s;
str cp_s = cp->s;
rtp = (void *) cp_s.s;
if (rtp->m_pt != (unsigned char) pt_out) {
printf("test failed: %s:%i\n", file, line);
printf("expected: %lli\n", pt_out);
@ -253,8 +273,8 @@ static void __packet_seq_ts(const char *file, int line, struct call_media *media
abort();
}
printf("recv packet contents: ");
for (int i = sizeof(struct rtp_header); i < cp->s.len; i++) {
unsigned char cc = cp->s.s[i];
for (int i = sizeof(struct rtp_header); i < cp_s.len; i++) {
unsigned char cc = cp_s.s[i];
printf("\\x%02x", cc);
}
printf("\n");
@ -282,15 +302,18 @@ static void __packet_seq_ts(const char *file, int line, struct call_media *media
assert(diff == seq_diff_exp);
}
g_hash_table_insert(rtp_seq_ht, GUINT_TO_POINTER(ssrc_pt), GUINT_TO_POINTER(seq));
if (str_shift(&cp->s, sizeof(struct rtp_header)))
if (str_shift(&cp_s, sizeof(struct rtp_header)))
abort();
if (pl_exp.len != cp->s.len)
if (pl_exp.len != cp_s.len)
abort();
if (fatal && memcmp(pl_exp.s, cp->s.s, pl_exp.len))
if (fatal && memcmp(pl_exp.s, cp_s.s, pl_exp.len))
abort();
codec_packet_free(cp);
}
printf("test ok: %s:%i\n\n", file, line);
free(packet);
ssrc_ctx_put(&mp.ssrc_in);
ssrc_ctx_put(&mp.ssrc_out);
}
#define packet(side, pt_in, pload, pt_out, pload_exp) \
@ -305,6 +328,13 @@ static void __packet_seq_ts(const char *file, int line, struct call_media *media
static void end(void) {
g_hash_table_destroy(rtp_ts_ht);
g_hash_table_destroy(rtp_seq_ht);
call_media_free(&media_A);
call_media_free(&media_B);
bencode_buffer_free(&call.buffer);
g_hash_table_destroy(call.tags);
free_ssrc_hash(&call.ssrc_hash);
g_queue_clear(&call.medias);
__cleanup();
printf("\n");
}
@ -1622,6 +1652,7 @@ int main(void) {
sdp_pt(101, telephone-event, 8000);
answer();
expect(A, recv, "120/opus/48000 8/PCMA/8000 0/PCMU/8000 101/telephone-event/8000 96/telephone-event/48000/0-15");
end();
// gh 664 codec masking accept=all
start();
sdp_pt(120, opus, 48000);
@ -1638,6 +1669,7 @@ int main(void) {
sdp_pt(101, telephone-event, 8000);
answer();
expect(A, recv, "120/opus/48000 8/PCMA/8000 0/PCMU/8000 101/telephone-event/8000 96/telephone-event/48000/0-15");
end();
// CN transcoding
rtpe_config.silence_detect_int = 10 << 16;
@ -1658,6 +1690,7 @@ int main(void) {
packet_seq(B, 8, PCMA_payload, 160, 1, 8, PCMA_payload);
packet_seq(B, 13, "\x20", 320, 2, 8, "\xf5\x5c\x4b\xc2\xde\xf4\x5e\xd4\x47\x70\x5d\x77\x45\x51\xc5\xcd\xd7\x77\x5a\xf5\xcf\x4a\x4c\x40\xc3\x47\x74\x49\x59\xc4\x76\x57\x71\x57\x40\xc5\xf4\x5a\x47\xd6\xc4\xf6\xc7\xf3\x40\x58\x74\x54\x4b\xd7\x5c\xc7\x41\x49\xf5\x5b\x53\xd9\x70\x44\xcd\xc4\xce\xcb\xc7\x58\xcd\x45\xc6\x71\xf5\x70\x43\xca\x43\xd5\x52\x5c\x75\x74\xc6\xc3\x4f\xda\x56\xc3\x46\xf5\x49\xdf\x56\x4f\x71\x5b\x52\xc6\x4e\xd0\x43\xc2\xcd\xd5\xdf\x40\x43\x4a\xf7\xf6\xd9\xdf\xde\x45\xc9\xd9\xc2\xf0\xc1\x4a\x40\x52\xd1\x5b\xd0\x54\xc9\x5e\xde\xd5\x74\x5c\x5d\x59\x71\xc1\xc1\x71\xd2\xcb\x50\x50\x54\x53\x75\xdc\x4b\xcf\xc2\xd7\x4a\xcc\x58\xc7\xdb\xd8\x48\x4a\xd6\x58\xf0\x46");
packet_seq(A, 8, PCMA_silence, 320, 2, 13, "\x40");
end();
// CN transcoding - reverse 1
start();
sdp_pt(8, PCMA, 8000);
@ -1674,6 +1707,7 @@ int main(void) {
packet_seq(B, 8, PCMA_payload, 160, 1, 8, PCMA_payload);
packet_seq(A, 13, "\x20", 320, 2, 8, "\xf5\x5c\x4b\xc2\xde\xf4\x5e\xd4\x47\x70\x5d\x77\x45\x51\xc5\xcd\xd7\x77\x5a\xf5\xcf\x4a\x4c\x40\xc3\x47\x74\x49\x59\xc4\x76\x57\x71\x57\x40\xc5\xf4\x5a\x47\xd6\xc4\xf6\xc7\xf3\x40\x58\x74\x54\x4b\xd7\x5c\xc7\x41\x49\xf5\x5b\x53\xd9\x70\x44\xcd\xc4\xce\xcb\xc7\x58\xcd\x45\xc6\x71\xf5\x70\x43\xca\x43\xd5\x52\x5c\x75\x74\xc6\xc3\x4f\xda\x56\xc3\x46\xf5\x49\xdf\x56\x4f\x71\x5b\x52\xc6\x4e\xd0\x43\xc2\xcd\xd5\xdf\x40\x43\x4a\xf7\xf6\xd9\xdf\xde\x45\xc9\xd9\xc2\xf0\xc1\x4a\x40\x52\xd1\x5b\xd0\x54\xc9\x5e\xde\xd5\x74\x5c\x5d\x59\x71\xc1\xc1\x71\xd2\xcb\x50\x50\x54\x53\x75\xdc\x4b\xcf\xc2\xd7\x4a\xcc\x58\xc7\xdb\xd8\x48\x4a\xd6\x58\xf0\x46");
packet_seq(B, 8, PCMA_silence, 320, 2, 13, "\x40");
end();
// CN transcoding - reverse 2
start();
sdp_pt(8, PCMA, 8000);
@ -1690,6 +1724,7 @@ int main(void) {
packet_seq(B, 8, PCMA_payload, 160, 1, 8, PCMA_payload);
packet_seq(A, 13, "\x20", 320, 2, 8, "\xf5\x5c\x4b\xc2\xde\xf4\x5e\xd4\x47\x70\x5d\x77\x45\x51\xc5\xcd\xd7\x77\x5a\xf5\xcf\x4a\x4c\x40\xc3\x47\x74\x49\x59\xc4\x76\x57\x71\x57\x40\xc5\xf4\x5a\x47\xd6\xc4\xf6\xc7\xf3\x40\x58\x74\x54\x4b\xd7\x5c\xc7\x41\x49\xf5\x5b\x53\xd9\x70\x44\xcd\xc4\xce\xcb\xc7\x58\xcd\x45\xc6\x71\xf5\x70\x43\xca\x43\xd5\x52\x5c\x75\x74\xc6\xc3\x4f\xda\x56\xc3\x46\xf5\x49\xdf\x56\x4f\x71\x5b\x52\xc6\x4e\xd0\x43\xc2\xcd\xd5\xdf\x40\x43\x4a\xf7\xf6\xd9\xdf\xde\x45\xc9\xd9\xc2\xf0\xc1\x4a\x40\x52\xd1\x5b\xd0\x54\xc9\x5e\xde\xd5\x74\x5c\x5d\x59\x71\xc1\xc1\x71\xd2\xcb\x50\x50\x54\x53\x75\xdc\x4b\xcf\xc2\xd7\x4a\xcc\x58\xc7\xdb\xd8\x48\x4a\xd6\x58\xf0\x46");
packet_seq(B, 8, PCMA_silence, 320, 2, 13, "\x40");
end();
// DTMF PT TC
start();
sdp_pt(9, G722, 8000);
@ -1708,6 +1743,7 @@ int main(void) {
expect(A, recv, "9/G722/8000 101/telephone-event/8000");
packet_seq(A, 101, "\x05\x07\x01\x40", 4000, 10, 97, "\x05\x07\x07\x80");
packet_seq(B, 97, "\x05\x07\x07\x80", 4000, 10, 101, "\x05\x07\x01\x40");
end();
// DTMF PT TC w eq PT
start();
sdp_pt(96, opus, 48000);


Loading…
Cancel
Save