]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 268817 via svnmerge from
authorTilghman Lesher <tilghman@meg.abyt.es>
Mon, 7 Jun 2010 22:59:52 +0000 (22:59 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Mon, 7 Jun 2010 22:59:52 +0000 (22:59 +0000)
https://origsvn.digium.com/svn/asterisk/trunk

........
  r268817 | tilghman | 2010-06-07 17:47:13 -0500 (Mon, 07 Jun 2010) | 9 lines

  Mailbox list would previously grow at each reload, containing duplicates.

  Also, optimize the allocation of mailboxes to avoid additional memory structures.

  (closes issue #16320)
   Reported by: Marquis
   Patches:
         20100525__issue16320.diff.txt uploaded by tilghman (license 14)
........

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

channels/chan_sip.c

index fd0e47dbbadb6a6a74ab17d6d916b1b498682044..eafeca6528b195127618dd89408c4d1262cd9c2a 100644 (file)
@@ -1808,6 +1808,7 @@ struct sip_pkt {
 struct sip_mailbox {
        char *mailbox;
        char *context;
+       unsigned int delme:1;
        /*! Associated MWI subscription */
        struct ast_event_sub *event_sub;
        AST_LIST_ENTRY(sip_mailbox) entry;
@@ -23788,15 +23789,30 @@ static void add_peer_mailboxes(struct sip_peer *peer, const char *value)
 
        while ((mbox = context = strsep(&next, ","))) {
                struct sip_mailbox *mailbox;
-
-               if (!(mailbox = ast_calloc(1, sizeof(*mailbox))))
-                       continue;
+               int duplicate = 0;
 
                strsep(&context, "@");
+
                if (ast_strlen_zero(mbox)) {
-                       ast_free(mailbox);
                        continue;
                }
+
+               /* Check whether the mailbox is already in the list */
+               AST_LIST_TRAVERSE(&peer->mailboxes, mailbox, entry) {
+                       if (!strcmp(mailbox->mailbox, mbox) && !strcmp(S_OR(mailbox->context, ""), S_OR(context, ""))) {
+                               duplicate = 1;
+                               mailbox->delme = 1;
+                               break;
+                       }
+               }
+               if (duplicate) {
+                       continue;
+               }
+
+               if (!(mailbox = ast_calloc(1, sizeof(*mailbox)))) {
+                       continue;
+               }
+
                mailbox->mailbox = ast_strdup(mbox);
                mailbox->context = ast_strdup(context);
 
@@ -23881,6 +23897,13 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
        peer->default_outbound_transport = 0;
        peer->transports = 0;
 
+       if (!devstate_only) {
+               struct sip_mailbox *mailbox;
+               AST_LIST_TRAVERSE(&peer->mailboxes, mailbox, entry) {
+                       mailbox->delme = 1;
+               }
+       }
+
        for (; v || ((v = alt) && !(alt=NULL)); v = v->next) {
                if (!devstate_only) {
                        if (handle_common_options(&peerflags[0], &mask[0], v)) {
@@ -24230,6 +24253,17 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
                }
        }
 
+       if (!devstate_only) {
+               struct sip_mailbox *mailbox;
+               AST_LIST_TRAVERSE_SAFE_BEGIN(&peer->mailboxes, mailbox, entry) {
+                       if (mailbox->delme) {
+                               AST_LIST_REMOVE_CURRENT(entry);
+                               destroy_mailbox(mailbox);
+                       }
+               }
+               AST_LIST_TRAVERSE_SAFE_END;
+       }
+
        if (!peer->default_outbound_transport) {
                /* Set default set of transports */
                peer->transports = default_transports;