From 44738d95e8214507fcc4f920c6dd3a912b23238b Mon Sep 17 00:00:00 2001 From: rmudgett Date: Wed, 14 Jan 2009 21:54:31 +0000 Subject: Merged revisions 168623 via svnmerge from https://origsvn.digium.com/svn/asterisk/trunk ................ r168623 | rmudgett | 2009-01-14 15:51:06 -0600 (Wed, 14 Jan 2009) | 11 lines Merged revisions 168622 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r168622 | rmudgett | 2009-01-14 15:48:22 -0600 (Wed, 14 Jan 2009) | 4 lines * Fixed create_process() allocation of process ID values. The allocated process IDs could overflow their respective NT and TE fields. Affects outgoing calls. ........ ................ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@168624 f38db490-d61c-443f-a65b-d21fe96a405b --- channels/misdn/isdn_lib.c | 84 ++++++++++++++++++++++------------------------- 1 file changed, 40 insertions(+), 44 deletions(-) (limited to 'channels') diff --git a/channels/misdn/isdn_lib.c b/channels/misdn/isdn_lib.c index 1158b6ef3..2b75786a9 100644 --- a/channels/misdn/isdn_lib.c +++ b/channels/misdn/isdn_lib.c @@ -779,7 +779,7 @@ static void clear_l3(struct misdn_stack *stack) } } -static int newteid=0; +static int new_te_id = 0; #define MAXPROCS 0x100 @@ -895,68 +895,64 @@ static int misdn_lib_get_short_status(struct misdn_stack *stack) -static int create_process (int midev, struct misdn_bchannel *bc) { +static int create_process(int midev, struct misdn_bchannel *bc) +{ iframe_t ncr; int l3_id; - int i; - struct misdn_stack *stack=get_stack_by_bc(bc); - + int proc_id; + struct misdn_stack *stack; + + stack = get_stack_by_bc(bc); if (stack->nt) { - if (find_free_chan_in_stack(stack, bc, bc->channel_preselected?bc->channel:0, 0)<0) return -1; - cb_log(4,stack->port, " --> found channel: %d\n",bc->channel); - - for (i=0; i <= MAXPROCS; i++) - if (stack->procids[i]==0) break; - - if (i== MAXPROCS) { - cb_log(0, stack->port, "Couldnt Create New ProcId.\n"); + if (find_free_chan_in_stack(stack, bc, bc->channel_preselected ? bc->channel : 0, 0) < 0) { return -1; } - stack->procids[i]=1; + cb_log(4, stack->port, " --> found channel: %d\n", bc->channel); - l3_id = 0xff00 | i; - - ncr.prim = CC_NEW_CR | REQUEST; - - ncr.addr = (stack->upper_id | FLG_MSG_DOWN) ; + for (proc_id = 0; proc_id < MAXPROCS; ++proc_id) { + if (stack->procids[proc_id] == 0) { + break; + } + } /* end for */ + if (proc_id == MAXPROCS) { + cb_log(0, stack->port, "Couldnt Create New ProcId.\n"); + return -1; + } - ncr.dinfo = l3_id; - ncr.len = 0; + stack->procids[proc_id] = 1; + l3_id = 0xff00 | proc_id; bc->l3_id = l3_id; - cb_log(3, stack->port, " --> new_l3id %x\n",l3_id); - - } else { + cb_log(3, stack->port, " --> new_l3id %x\n", l3_id); + } else { if (stack->ptp || bc->te_choose_channel) { /* we know exactly which channels are in use */ - if (find_free_chan_in_stack(stack, bc, bc->channel_preselected?bc->channel:0, bc->dec)<0) return -1; - cb_log(2,stack->port, " --> found channel: %d\n",bc->channel); + if (find_free_chan_in_stack(stack, bc, bc->channel_preselected ? bc->channel : 0, bc->dec) < 0) { + return -1; + } + cb_log(2, stack->port, " --> found channel: %d\n", bc->channel); } else { /* other phones could have made a call also on this port (ptmp) */ - bc->channel=0xff; + bc->channel = 0xff; } - - + /* if we are in te-mode, we need to create a process first */ - if (newteid++ > 0xffff) - newteid = 0x0001; - - l3_id = (entity<<16) | newteid; - /* preparing message */ - ncr.prim = CC_NEW_CR | REQUEST; + if (++new_te_id > 0xffff) { + new_te_id = 0x0001; + } - ncr.addr = (stack->upper_id | FLG_MSG_DOWN) ; + l3_id = (entity << 16) | new_te_id; + bc->l3_id = l3_id; + cb_log(3, stack->port, "--> new_l3id %x\n", l3_id); - ncr.dinfo =l3_id; - ncr.len = 0; /* send message */ - - bc->l3_id = l3_id; - cb_log(3, stack->port, "--> new_l3id %x\n",l3_id); - - mISDN_write(midev, &ncr, mISDN_HEADER_LEN+ncr.len, TIMEOUT_1SEC); + ncr.prim = CC_NEW_CR | REQUEST; + ncr.addr = (stack->upper_id | FLG_MSG_DOWN); + ncr.dinfo = l3_id; + ncr.len = 0; + mISDN_write(midev, &ncr, mISDN_HEADER_LEN + ncr.len, TIMEOUT_1SEC); } - + return l3_id; } -- cgit v1.2.3