From 469677564b11162cdd9efa225e18e8f595a7ec97 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Mon, 29 Sep 2014 08:36:15 -0400 Subject: [PATCH] fix segfault when running out of ports --- daemon/call_interfaces.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index ec62ddfc0..44e742316 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -126,6 +126,7 @@ static str *call_update_lookup_udp(char **out, struct callmaster *m, enum call_o GQueue q = G_QUEUE_INIT; struct stream_params sp; str *ret, callid, viabranch, fromtag, totag = STR_NULL; + int i; str_init(&callid, out[RE_UDP_UL_CALLID]); str_init(&viabranch, out[RE_UDP_UL_VIABRANCH]); @@ -147,10 +148,11 @@ static str *call_update_lookup_udp(char **out, struct callmaster *m, enum call_o goto addr_fail; g_queue_push_tail(&q, &sp); - /* XXX return value */ - monologue_offer_answer(monologue, &q, NULL); + i = monologue_offer_answer(monologue, &q, NULL); g_queue_clear(&q); + if (i) + goto unlock_fail; ret = streams_print(&monologue->medias, sp.index, sp.index, out[RE_UDP_COOKIE], SAF_UDP); rwlock_unlock_w(&c->master_lock); @@ -160,16 +162,15 @@ static str *call_update_lookup_udp(char **out, struct callmaster *m, enum call_o goto out; ml_fail: - rwlock_unlock_w(&c->master_lock); ilog(LOG_WARNING, "Invalid dialogue association"); - goto fail_out; + goto unlock_fail; addr_fail: - rwlock_unlock_w(&c->master_lock); ilog(LOG_WARNING, "Failed to parse a media stream: %s/%s:%s", out[RE_UDP_UL_ADDR4], out[RE_UDP_UL_ADDR6], out[RE_UDP_UL_PORT]); - goto fail_out; + goto unlock_fail; -fail_out: +unlock_fail: + rwlock_unlock_w(&c->master_lock); ret = str_sprintf("%s E8\n", out[RE_UDP_COOKIE]); out: obj_put(c); @@ -283,8 +284,8 @@ static str *call_request_lookup_tcp(char **out, struct callmaster *m, enum call_ ilog(LOG_WARNING, "Invalid dialogue association"); goto out2; } - /* XXX return value */ - monologue_offer_answer(monologue, &s, NULL); + if (monologue_offer_answer(monologue, &s, NULL)) + goto out2; ret = streams_print(&monologue->medias, 1, s.length, NULL, SAF_TCP); @@ -598,9 +599,9 @@ static const char *call_offer_answer_ng(bencode_item_t *input, struct callmaster chopper = sdp_chopper_new(&sdp); bencode_buffer_destroy_add(output->buffer, (free_func_t) sdp_chopper_destroy, chopper); - /* XXX return value */ - monologue_offer_answer(monologue, &streams, &flags); - ret = sdp_replace(chopper, &parsed, monologue, &flags); + ret = monologue_offer_answer(monologue, &streams, &flags); + if (!ret) + ret = sdp_replace(chopper, &parsed, monologue, &flags); rwlock_unlock_w(&call->master_lock); redis_update(call, m->conf.redis);