summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Nietsky <gregory@distrotech.co.za>2011-06-08 06:45:55 +0000
committerGregory Nietsky <gregory@distrotech.co.za>2011-06-08 06:45:55 +0000
commit4cd9bc43c26be2782a7b4490cfb4ddcf9c674be1 (patch)
tree4e0dcf49b33069f167ae4d29c5f32ed3159fd434
parentba625fa7d5a7afb2eca3b1790faf6e5ff1fd6540 (diff)
Merged revisions 322322 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.8 ........ r322322 | irroot | 2011-06-08 08:18:38 +0200 (Wed, 08 Jun 2011) | 18 lines Make handle_request_publish do dialog expiration and destruction. This patch fixes handle_request_publish so that it does dialog expiration and destruction. Without this patch the incoming PUBLISH requests will get stuck in the dialog list. Restarting asterisk is the only way to remove them. Personal observation on one system the server hung up while looping through the channels rendering asterisk unusable and all sip phones unregisterd when they try reregister more requests are added. (closes issue #18898) Reported by: gareth Tested by: loloski, Chainsaw, wimpy, se, kuj, irroot Jira: https://issues.asterisk.org/jira/browse/ASTERISK-17915 Review: https://reviewboard.asterisk.org/r/1253 ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@322323 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--channels/chan_sip.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 157e6cb88..bcb4ea73a 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -24092,11 +24092,13 @@ static int handle_request_publish(struct sip_pvt *p, struct sip_request *req, st
if (ast_strlen_zero(event)) {
transmit_response(p, "489 Bad Event", req);
+ pvt_set_needdestroy(p, "missing Event: header");
return -1;
}
if (!(esc = get_esc(event))) {
transmit_response(p, "489 Bad Event", req);
+ pvt_set_needdestroy(p, "unknown event package in publish");
return -1;
}
@@ -24122,6 +24124,15 @@ static int handle_request_publish(struct sip_pvt *p, struct sip_request *req, st
publish_type = determine_sip_publish_type(req, event, etag, expires_str, &expires_int);
+ if (expires_int > max_expiry) {
+ expires_int = max_expiry;
+ } else if (expires_int < min_expiry && expires_int > 0) {
+ transmit_response_with_minexpires(p, "423 Interval too small", req);
+ pvt_set_needdestroy(p, "Expires is less that the min expires allowed.");
+ return 0;
+ }
+ p->expiry = expires_int;
+
/* It is the responsibility of these handlers to formulate any response
* sent for a PUBLISH
*/
@@ -24145,6 +24156,11 @@ static int handle_request_publish(struct sip_pvt *p, struct sip_request *req, st
transmit_response(p, "400 Impossible Condition", req);
break;
}
+ if (!handler_result && p->expiry > 0) {
+ sip_scheddestroy(p, (p->expiry + 10) * 1000);
+ } else {
+ pvt_set_needdestroy(p, "forcing expiration");
+ }
return handler_result;
}
@@ -24527,8 +24543,7 @@ static int handle_request_subscribe(struct sip_pvt *p, struct sip_request *req,
ast_log(LOG_WARNING, "Received subscription for extension \"%s\" context \"%s\" "
"with Expire header less that 'minexpire' limit. Received \"Expire: %d\" min is %d\n",
p->exten, p->context, p->expiry, min_expiry);
- p->expiry = min_expiry;
- pvt_set_needdestroy(p, "Expires is less that the min expires allowed. ");
+ pvt_set_needdestroy(p, "Expires is less that the min expires allowed.");
return 0;
}