Conditionally reject duplicate entries in applicationmap containers.
authorMark Michelson <mmichelson@digium.com>
Thu, 6 Jun 2013 23:32:13 +0000 (23:32 +0000)
committerMark Michelson <mmichelson@digium.com>
Thu, 6 Jun 2013 23:32:13 +0000 (23:32 +0000)
When reading from a config file, it's important to reject duplicates. Otherwise,
featuregroups will have ambiguity when pointing to applicationmap items. However,
when constructing the channel's current applicationmap, we don't care about duplicate
names since it's the DTMF that identifies a feature, not the name.

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

main/features_config.c

index f8bdb1c..ab4be93 100644 (file)
@@ -418,10 +418,11 @@ static struct features_global_config *global_config_alloc(void)
        return cfg;
 }
 
-static struct ao2_container *applicationmap_alloc(void)
+static struct ao2_container *applicationmap_alloc(int reject_duplicates)
 {
        return ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_NOLOCK,
-                       AO2_CONTAINER_ALLOC_OPT_DUPS_REJECT, applicationmap_sort, NULL);
+                       reject_duplicates ? AO2_CONTAINER_ALLOC_OPT_DUPS_REJECT : AO2_CONTAINER_ALLOC_OPT_DUPS_ALLOW,
+                       applicationmap_sort, NULL);
 }
 
 /*!
@@ -457,7 +458,7 @@ static struct features_config *__features_config_alloc(int allocate_applicationm
        }
 
        if (allocate_applicationmap) {
-               cfg->applicationmap = applicationmap_alloc();
+               cfg->applicationmap = applicationmap_alloc(1);
                if (!cfg->applicationmap) {
                        return NULL;
                }
@@ -999,7 +1000,7 @@ struct ao2_container *ast_get_chan_applicationmap(struct ast_channel *chan)
                return NULL;
        }
 
-       applicationmap = applicationmap_alloc();
+       applicationmap = applicationmap_alloc(0);
        if (!applicationmap) {
                return NULL;
        }