Browse Source

fix segfault when running out of ports

cache-automerge/7c/ef0e3bd6646130fd6edf2d94e01b88c9e78770
Richard Fuchs 11 years ago
parent
commit
469677564b
1 changed files with 13 additions and 12 deletions
  1. +13
    -12
      daemon/call_interfaces.c

+ 13
- 12
daemon/call_interfaces.c View File

@ -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);


Loading…
Cancel
Save