aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_vpb.cc
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2008-02-28 14:42:32 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2008-02-28 14:42:32 +0000
commit92f2e9730554b7762f91b835d26c91cdf900090d (patch)
treeef47bb11f479dfb628034501daee9f5eb1f88dde /channels/chan_vpb.cc
parentdf0cb8c007929621e649a102c97bcbbd4d7c00b3 (diff)
Fix crash when configuration does not match hardware detection.
(closes issue #12096) Reported by: mmickan Patches: chan_vpb.cc.diff uploaded by mmickan (license 400) git-svn-id: http://svn.digium.com/svn/asterisk/trunk@104974 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_vpb.cc')
-rw-r--r--channels/chan_vpb.cc17
1 files changed, 17 insertions, 0 deletions
diff --git a/channels/chan_vpb.cc b/channels/chan_vpb.cc
index 6458444ba..d943c542e 100644
--- a/channels/chan_vpb.cc
+++ b/channels/chan_vpb.cc
@@ -2706,6 +2706,18 @@ static enum ast_module_load_result load_module()
int bal3 = -1;
char * callerid = NULL;
+ int num_cards = 0;
+ try {
+ num_cards = vpb_get_num_cards();
+ } catch (VpbException e) {
+ ast_log(LOG_ERROR, "No Voicetronix cards detected\n");
+ return AST_MODULE_LOAD_DECLINE;
+ }
+
+ int ports_per_card[num_cards];
+ for (int i = 0; i < num_cards; ++i)
+ ports_per_card[i] = vpb_get_ports_per_card(i);
+
cfg = ast_config_load(config, config_flags);
/* We *must* have a config file otherwise stop immediately */
@@ -2768,6 +2780,11 @@ static enum ast_module_load_result load_module()
UseNativeBridge = atoi(v->value);
} else if (strcasecmp(v->name, "channel") == 0) {
int channel = atoi(v->value);
+ if (board >= num_cards || board < 0 || channel < 0 || channel >= ports_per_card[board]) {
+ ast_log(LOG_ERROR, "Invalid board/channel (%d/%d) for channel '%s'\n", board, channel, v->value);
+ error = AST_MODULE_LOAD_FAILURE;
+ goto done;
+ }
tmp = mkif(board, channel, mode, got_gain, txgain, rxgain, txswgain, rxswgain, bal1, bal2, bal3, callerid, echo_cancel,group,callgroup,pickupgroup);
if (tmp) {
if (first_channel) {