]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Make handle_request_publish do dialog expiration and destruction.
authorGregory Nietsky <gregory@distrotech.co.za>
Wed, 8 Jun 2011 06:18:38 +0000 (06:18 +0000)
committerGregory Nietsky <gregory@distrotech.co.za>
Wed, 8 Jun 2011 06:18:38 +0000 (06:18 +0000)
  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/branches/1.8@322322 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c

index 600bb34fccab2774fe2322e4d85ae7371c803352..457b088d4d73609c90d710313387bb236b244596 100644 (file)
@@ -23495,11 +23495,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;
        }
 
@@ -23525,6 +23527,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
         */
@@ -23548,6 +23559,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;
 }
@@ -23930,8 +23946,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;
                }