Merged revisions 331265 via svnmerge from
authorRichard Mudgett <rmudgett@digium.com>
Tue, 9 Aug 2011 23:17:13 +0000 (23:17 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Tue, 9 Aug 2011 23:17:13 +0000 (23:17 +0000)
https://origsvn.digium.com/svn/asterisk/branches/10

................
  r331265 | rmudgett | 2011-08-09 18:12:49 -0500 (Tue, 09 Aug 2011) | 22 lines

  Merged revisions 331248 via svnmerge from
  https://origsvn.digium.com/svn/asterisk/branches/1.8

  ........
    r331248 | rmudgett | 2011-08-09 17:12:59 -0500 (Tue, 09 Aug 2011) | 15 lines

    Misc minor items found in code.

    * Add some reentrancy protection in pbx.c when creating the contexts_table
    hash table.

    * Fix inverted test in chan_sip.c conditional code.

    * Fix uninitialized variable and use of the wrong variable in chan_iax2.c.

    * Fix test of return value in app_parkandannounce.c.  Explicitly testing
    for -1 is bad if the function does not actually return that value when it
    fails.

    * Fixup some comments and add some curly braces in features.c.
  ........
................

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

apps/app_parkandannounce.c
channels/chan_iax2.c
channels/chan_sip.c
main/features.c
main/pbx.c

index 7063374..7338efb 100644 (file)
@@ -152,7 +152,9 @@ static int parkandannounce_exec(struct ast_channel *chan, const char *data)
        before we are done announcing and the channel is messed with, Kablooeee.  So we use Masq to prevent this.  */
 
        res = ast_masq_park_call(chan, NULL, timeout, &lot);
-       if (res == -1) {
+       if (res) {
+               /* Parking failed. */
+               res = -1;
                goto parkcleanup;
        }
 
index a5765d0..62efe31 100644 (file)
@@ -9349,7 +9349,8 @@ static void *iax_park_thread(void *stuff)
        struct ast_channel *chan1, *chan2;
        struct iax_dual *d;
        struct ast_frame *f;
-       int ext;
+       int ext = 0;
+
        d = stuff;
        chan1 = d->chan1;
        chan2 = d->chan2;
@@ -10794,7 +10795,7 @@ static int socket_process(struct iax2_thread *thread)
                                        pbx_builtin_setvar_helper(owner, "BLINDTRANSFER", bridged_chan->name);
                                        pbx_builtin_setvar_helper(bridged_chan, "BLINDTRANSFER", owner->name);
 
-                                       if (ast_parking_ext_valid(ies.called_number, c, iaxs[fr->callno]->context)) {
+                                       if (ast_parking_ext_valid(ies.called_number, owner, iaxs[fr->callno]->context)) {
                                                ast_debug(1, "Parking call '%s'\n", bridged_chan->name);
                                                if (iax_park(bridged_chan, owner, ies.called_number)) {
                                                        ast_log(LOG_WARNING, "Failed to park call '%s'\n",
index 2df2713..ed0e3bb 100644 (file)
@@ -21319,7 +21319,7 @@ static void *sip_park_thread(void *stuff)
        res = ast_park_call(transferee, transferer, 0, d->parkexten, &ext);
 
 #ifdef WHEN_WE_KNOW_THAT_THE_CLIENT_SUPPORTS_MESSAGE
-       if (!res) {
+       if (res) {
                transmit_message_with_text(transferer->tech_pvt, "Unable to park call.\n", 0, 0);
        } else {
                /* Then tell the transferer what happened */
index 60f8667..29ba564 100644 (file)
@@ -669,7 +669,8 @@ static int parkinglot_hash_cb(const void *obj, const int flags)
 
 static int parkinglot_cmp_cb(void *obj, void *arg, int flags)
 {
-       struct ast_parkinglot *parkinglot = obj, *parkinglot2 = arg;
+       struct ast_parkinglot *parkinglot = obj;
+       struct ast_parkinglot *parkinglot2 = arg;
 
        return !strcasecmp(parkinglot->name, parkinglot2->name) ? CMP_MATCH | CMP_STOP : 0;
 }
@@ -994,14 +995,14 @@ static struct parkeduser *park_space_reserve(struct ast_channel *chan, struct as
                 * limitation here.  If extout was not numeric, we could permit
                 * arbitrary non-numeric extensions.
                 */
-       if (sscanf(parkingexten, "%30d", &parking_space) != 1 || parking_space < 0) {
+        if (sscanf(parkingexten, "%30d", &parking_space) != 1 || parking_space < 0) {
                        AST_LIST_UNLOCK(&parkinglot->parkings);
                        parkinglot_unref(parkinglot);
-           free(pu);
-           ast_log(LOG_WARNING, "PARKINGEXTEN does not indicate a valid parking slot: '%s'.\n", parkingexten);
-           return NULL;
-       }
-       snprintf(pu->parkingexten, sizeof(pu->parkingexten), "%d", parking_space);
+            free(pu);
+            ast_log(LOG_WARNING, "PARKINGEXTEN does not indicate a valid parking slot: '%s'.\n", parkingexten);
+            return NULL;
+        }
+        snprintf(pu->parkingexten, sizeof(pu->parkingexten), "%d", parking_space);
 
                if (ast_exists_extension(NULL, parkinglot->parking_con, pu->parkingexten, 1, NULL)) {
                        ast_log(LOG_WARNING, "Requested parking extension already exists: %s@%s\n", parkingexten, parkinglot->parking_con);
@@ -1323,7 +1324,7 @@ static struct ast_channel *create_test_channel(const struct ast_channel_tech *fa
        struct ast_channel *test_channel1;
        struct ast_format tmp_fmt;
        if (!(test_channel1 = ast_channel_alloc(0, AST_STATE_DOWN, NULL, NULL, NULL,
-       NULL, NULL, 0, 0, "TestChannel1"))) {
+               NULL, NULL, 0, 0, "TestChannel1"))) {
                return NULL;
        }
 
@@ -2260,6 +2261,7 @@ static int builtin_atxfer(struct ast_channel *chan, struct ast_channel *peer, st
                                if (newchan || ast_check_hangup(transferee)) {
                                        break;
                                }
+
                                ++tries;
                                if (atxfercallbackretries <= tries) {
                                        /* No more callback tries remaining. */
@@ -3155,6 +3157,7 @@ static struct ast_channel *feature_request_and_dial(struct ast_channel *caller,
                        }
                } else if (chan == active_channel) {
                        if (!ast_strlen_zero(chan->call_forward)) {
+                               state = 0;
                                chan = ast_call_forward(caller, chan, NULL, tmp_cap, NULL, &state);
                                if (!chan) {
                                        break;
@@ -3438,14 +3441,17 @@ static void clear_dialed_interfaces(struct ast_channel *chan)
 
 /*!
  * \brief bridge the call and set CDR
- * \param chan,peer,config
- * 
+ *
+ * \param chan The bridge considers this channel the caller.
+ * \param peer The bridge considers this channel the callee.
+ * \param config Configuration for this bridge.
+ *
  * Set start time, check for two channels,check if monitor on
  * check for feature activation, create new CDR
  * \retval res on success.
  * \retval -1 on failure to bridge.
  */
-int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast_bridge_config *config)
+int ast_bridge_call(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config)
 {
        /* Copy voice back and forth between the two channels.  Give the peer
           the ability to transfer calls with '#<extension' syntax. */
@@ -4357,8 +4363,8 @@ static void *do_parking_thread(void *ignore)
                struct ao2_iterator iter;
                struct ast_parkinglot *curlot;
                int ms = -1;    /* poll2 timeout, uninitialized */
-               iter = ao2_iterator_init(parkinglots, 0);
 
+               iter = ao2_iterator_init(parkinglots, 0);
                while ((curlot = ao2_iterator_next(&iter))) {
                        manage_parkinglot(curlot, pfds, nfds, &new_pfds, &new_nfds, &ms);
                        ao2_ref(curlot, -1);
@@ -5078,8 +5084,9 @@ static int load_config(void)
                        if ((sscanf(var->value, "%30d", &transferdigittimeout) != 1) || (transferdigittimeout < 1)) {
                                ast_log(LOG_WARNING, "%s is not a valid transferdigittimeout\n", var->value);
                                transferdigittimeout = DEFAULT_TRANSFER_DIGIT_TIMEOUT;
-                       } else
+                       } else {
                                transferdigittimeout = transferdigittimeout * 1000;
+                       }
                } else if (!strcasecmp(var->name, "featuredigittimeout")) {
                        if ((sscanf(var->value, "%30d", &featuredigittimeout) != 1) || (featuredigittimeout < 1)) {
                                ast_log(LOG_WARNING, "%s is not a valid featuredigittimeout\n", var->value);
@@ -5089,14 +5096,16 @@ static int load_config(void)
                        if ((sscanf(var->value, "%30d", &atxfernoanswertimeout) != 1) || (atxfernoanswertimeout < 1)) {
                                ast_log(LOG_WARNING, "%s is not a valid atxfernoanswertimeout\n", var->value);
                                atxfernoanswertimeout = DEFAULT_NOANSWER_TIMEOUT_ATTENDED_TRANSFER;
-                       } else
+                       } else {
                                atxfernoanswertimeout = atxfernoanswertimeout * 1000;
+                       }
                } else if (!strcasecmp(var->name, "atxferloopdelay")) {
                        if ((sscanf(var->value, "%30u", &atxferloopdelay) != 1)) {
                                ast_log(LOG_WARNING, "%s is not a valid atxferloopdelay\n", var->value);
                                atxferloopdelay = DEFAULT_ATXFER_LOOP_DELAY;
-                       } else 
+                       } else {
                                atxferloopdelay *= 1000;
+                       }
                } else if (!strcasecmp(var->name, "atxferdropcall")) {
                        atxferdropcall = ast_true(var->value);
                } else if (!strcasecmp(var->name, "atxfercallbackretries")) {
@@ -5107,12 +5116,13 @@ static int load_config(void)
                } else if (!strcasecmp(var->name, "courtesytone")) {
                        ast_copy_string(courtesytone, var->value, sizeof(courtesytone));
                }  else if (!strcasecmp(var->name, "parkedplay")) {
-                       if (!strcasecmp(var->value, "both"))
+                       if (!strcasecmp(var->value, "both")) {
                                parkedplay = 2;
-                       else if (!strcasecmp(var->value, "parked"))
+                       } else if (!strcasecmp(var->value, "parked")) {
                                parkedplay = 1;
-                       else
+                       } else {
                                parkedplay = 0;
+                       }
                } else if (!strcasecmp(var->name, "xfersound")) {
                        ast_copy_string(xfersound, var->value, sizeof(xfersound));
                } else if (!strcasecmp(var->name, "xferfailsound")) {
@@ -5132,11 +5142,12 @@ static int load_config(void)
 
        unmap_features();
        for (var = ast_variable_browse(cfg, "featuremap"); var; var = var->next) {
-               if (remap_feature(var->name, var->value))
+               if (remap_feature(var->name, var->value)) {
                        ast_log(LOG_NOTICE, "Unknown feature '%s'\n", var->name);
+               }
        }
 
-       /* Map a key combination to an application*/
+       /* Map a key combination to an application */
        ast_unregister_features();
        for (var = ast_variable_browse(cfg, "applicationmap"); var; var = var->next) {
                char *tmp_val = ast_strdupa(var->value);
@@ -5236,23 +5247,27 @@ static int load_config(void)
                /* Is this a parkinglot definition ? */
                if (!strncasecmp(ctg, "parkinglot_", strlen("parkinglot_"))) {
                        ast_debug(2, "Found configuration section %s, assume parking context\n", ctg);
-                       if(!build_parkinglot(ctg, ast_variable_browse(cfg, ctg)))
+                       if (!build_parkinglot(ctg, ast_variable_browse(cfg, ctg))) {
                                ast_log(LOG_ERROR, "Could not build parking lot %s. Configuration error.\n", ctg);
-                       else
+                       } else {
                                ast_debug(1, "Configured parking context %s\n", ctg);
+                       }
                        continue;
                }
+
                /* No, check if it's a group */
                for (i = 0; i < ARRAY_LEN(categories); i++) {
-                       if (!strcasecmp(categories[i], ctg))
+                       if (!strcasecmp(categories[i], ctg)) {
                                break;
+                       }
                }
-
-               if (i < ARRAY_LEN(categories))
+               if (i < ARRAY_LEN(categories)) {
                        continue;
+               }
 
-               if (!(fg = register_group(ctg)))
+               if (!(fg = register_group(ctg))) {
                        continue;
+               }
 
                for (var = ast_variable_browse(cfg, ctg); var; var = var->next) {
                        struct ast_call_feature *feature;
@@ -5993,18 +6008,20 @@ int ast_bridge_timelimit(struct ast_channel *chan, struct ast_bridge_config *con
        } else if ( (delta = config->play_warning - config->timelimit) > 0) {
                int w = config->warning_freq;
 
-               /* If the first warning is requested _after_ the entire call would end,
-                  and no warning frequency is requested, then turn off the warning. If
-                  a warning frequency is requested, reduce the 'first warning' time by
-                  that frequency until it falls within the call's total time limit.
-                  Graphically:
-                                 timelim->|    delta        |<-playwarning
-                       0__________________|_________________|
-                                        | w  |    |    |    |
-
-                  so the number of intervals to cut is 1+(delta-1)/w
-               */
-
+               /*
+                * If the first warning is requested _after_ the entire call
+                * would end, and no warning frequency is requested, then turn
+                * off the warning. If a warning frequency is requested, reduce
+                * the 'first warning' time by that frequency until it falls
+                * within the call's total time limit.
+                *
+                * Graphically:
+                *                timelim->|    delta        |<-playwarning
+                *      0__________________|_________________|
+                *                       | w  |    |    |    |
+                *
+                * so the number of intervals to cut is 1+(delta-1)/w
+                */
                if (w == 0) {
                        config->play_warning = 0;
                } else {
@@ -6261,9 +6278,9 @@ int ast_features_init(void)
        }
 
        res |= ast_devstate_prov_add("Park", metermaidstate);
-#ifdef TEST_FRAMEWORK
+#if defined(TEST_FRAMEWORK)
        res |= AST_TEST_REGISTER(features_test);
-#endif
+#endif /* defined(TEST_FRAMEWORK) */
 
        return res;
 }
index a205464..74179f9 100644 (file)
@@ -7177,12 +7177,17 @@ struct ast_context *ast_context_find_or_create(struct ast_context **extcontexts,
        int length = sizeof(struct ast_context) + strlen(name) + 1;
 
        if (!contexts_table) {
-               contexts_table = ast_hashtab_create(17,
-                                                                                  ast_hashtab_compare_contexts,
-                                                                                  ast_hashtab_resize_java,
-                                                                                  ast_hashtab_newsize_java,
-                                                                                  ast_hashtab_hash_contexts,
-                                                                                  0);
+               /* Protect creation of contexts_table from reentrancy. */
+               ast_wrlock_contexts();
+               if (!contexts_table) {
+                       contexts_table = ast_hashtab_create(17,
+                               ast_hashtab_compare_contexts,
+                               ast_hashtab_resize_java,
+                               ast_hashtab_newsize_java,
+                               ast_hashtab_hash_contexts,
+                               0);
+               }
+               ast_unlock_contexts();
        }
 
        ast_copy_string(search.name, name, sizeof(search.name));
@@ -7402,7 +7407,7 @@ void ast_merge_contexts_and_delete(struct ast_context **extcontexts, struct ast_
 
        begintime = ast_tvnow();
        ast_mutex_lock(&context_merge_lock);/* Serialize ast_merge_contexts_and_delete */
-       ast_rdlock_contexts();
+       ast_wrlock_contexts();
        iter = ast_hashtab_start_traversal(contexts_table);
        while ((tmp = ast_hashtab_next(iter))) {
                context_merge(extcontexts, exttable, tmp, registrar);