From: Richard Mudgett Date: Tue, 9 Aug 2011 23:12:49 +0000 (+0000) Subject: Merged revisions 331248 via svnmerge from X-Git-Tag: 10.0.0-beta2~145 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9bd1af5e422bfcfbbc59fc023e1c16a92cdd7a1e;p=thirdparty%2Fasterisk.git 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/branches/10@331265 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/apps/app_parkandannounce.c b/apps/app_parkandannounce.c index 70633745bc..7338efb98d 100644 --- a/apps/app_parkandannounce.c +++ b/apps/app_parkandannounce.c @@ -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; } diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 9b3b4cf372..7d0ee9bae7 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -9360,7 +9360,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; @@ -10805,7 +10806,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", diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 2df2713a2f..ed0e3bb651 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -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 */ diff --git a/main/features.c b/main/features.c index 60f8667d83..29ba5643d4 100644 --- a/main/features.c +++ b/main/features.c @@ -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 '#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; } diff --git a/main/pbx.c b/main/pbx.c index a2054646db..74179f957a 100644 --- a/main/pbx.c +++ b/main/pbx.c @@ -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);