aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_sip.c
diff options
context:
space:
mode:
authoroej <oej@f38db490-d61c-443f-a65b-d21fe96a405b>2006-11-15 15:25:50 +0000
committeroej <oej@f38db490-d61c-443f-a65b-d21fe96a405b>2006-11-15 15:25:50 +0000
commita1dee5b64d32fa4e758abf22466fe5613d56561f (patch)
treed7a85f44f137d043de82c16baee9667e010d2e4a /channels/chan_sip.c
parent2f89569a50040451c0901fbf6412aa9411bf7a21 (diff)
Send error message when we can't allocate SIP dialog, possibly due to limitation of file descriptors.
(imported from 1.2) git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@47656 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_sip.c')
-rw-r--r--channels/chan_sip.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index a8b8353fa..6b1265d3f 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -4306,9 +4306,22 @@ static struct sip_pvt *find_call(struct sip_request *req, struct sockaddr_in *si
transmit_response_using_temp(callid, sin, 1, intended_method, req, "489 Bad event");
} else {
/* Ok, time to create a new SIP dialog object, a pvt */
- if ((p = sip_alloc(callid, sin, 1, intended_method)))
+ if ((p = sip_alloc(callid, sin, 1, intended_method))) {
/* Ok, we've created a dialog, let's go and process it */
ast_mutex_lock(&p->lock);
+ } else {
+ /* We have a memory or file/socket error (can't allocate RTP sockets or something) so we're not
+ getting a dialog from sip_alloc.
+
+ Without a dialog we can't retransmit and handle ACKs and all that, but at least
+ send an error message.
+
+ Sorry, we apologize for the inconvienience
+ */
+ transmit_response_using_temp(callid, sin, 1, intended_method, req, "500 Server internal error");
+ if (option_debug > 3)
+ ast_log(LOG_DEBUG, "Failed allocating SIP dialog, sending 500 Server internal error and giving up\n");
+ }
}
return p;
} else if( sip_methods[intended_method].can_create == CAN_CREATE_DIALOG_UNSUPPORTED_METHOD) {