Merged revisions 176029 via svnmerge from
authorJoshua Colp <jcolp@digium.com>
Mon, 16 Feb 2009 15:36:19 +0000 (15:36 +0000)
committerJoshua Colp <jcolp@digium.com>
Mon, 16 Feb 2009 15:36:19 +0000 (15:36 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
  r176029 | file | 2009-02-16 11:33:53 -0400 (Mon, 16 Feb 2009) | 9 lines

  Don't have the Via header stored as a stringfield as it can change often during the lifetime of a dialog.

  This issue crept up with subscriptions on the AA50. When an outgoing NOTIFY is sent a new branch value
  is created and the Via header is changed to reflect it. Since this was a stringfield a new spot in the
  pool was used for the value while the old was left untouched/unused. If the current pool was full a new
  pool was created. This would cause memory usage to increase steadily.

  (issue #AA50-2332)
........

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@176030 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c

index b4dee74..add73cb 100644 (file)
@@ -1602,7 +1602,6 @@ struct sip_pvt {
                AST_STRING_FIELD(peermd5secret);
                AST_STRING_FIELD(cid_num);      /*!< Caller*ID number */
                AST_STRING_FIELD(cid_name);     /*!< Caller*ID name */
-               AST_STRING_FIELD(via);          /*!< Via: header */
                AST_STRING_FIELD(fullcontact);  /*!< The Contact: that the UA registers with us */
                        /* we only store the part in <brackets> in this field. */
                AST_STRING_FIELD(our_contact);  /*!< Our contact header */
@@ -1611,6 +1610,7 @@ struct sip_pvt {
                AST_STRING_FIELD(url);          /*!< URL to be sent with next message to peer */
                AST_STRING_FIELD(parkinglot);           /*!< Parkinglot */
        );
+       char via[128];                          /*!< Via: header */
        struct sip_socket socket;               /*!< The socket used for this dialog */
        unsigned int ocseq;                     /*!< Current outgoing seqno */
        unsigned int icseq;                     /*!< Current incoming seqno */
@@ -3290,10 +3290,10 @@ static void build_via(struct sip_pvt *p)
        const char *rport = ast_test_flag(&p->flags[0], SIP_NAT) & SIP_NAT_RFC3581 ? ";rport" : "";
 
        /* z9hG4bK is a magic cookie.  See RFC 3261 section 8.1.1.7 */
-       ast_string_field_build(p, via, "SIP/2.0/%s %s:%d;branch=z9hG4bK%08x%s",
-                              get_transport_pvt(p),
-                              ast_inet_ntoa(p->ourip.sin_addr),
-                              ntohs(p->ourip.sin_port), (int) p->branch, rport);
+       snprintf(p->via, sizeof(p->via), "SIP/2.0/%s %s:%d;branch=z9hG4bK%08x%s",
+                get_transport_pvt(p),
+                ast_inet_ntoa(p->ourip.sin_addr),
+                ntohs(p->ourip.sin_port), (int) p->branch, rport);
 }
 
 /*! \brief NAT fix - decide which IP address to use for Asterisk server?