Fix segfault in sig_analog when using callwaiting, respect callwaiting options
authorJeff Peeler <jpeeler@digium.com>
Fri, 17 Jul 2009 17:02:44 +0000 (17:02 +0000)
committerJeff Peeler <jpeeler@digium.com>
Fri, 17 Jul 2009 17:02:44 +0000 (17:02 +0000)
Sig_analog handles allocating the sub channel for callwaiting, so no longer try
to do it in chan_dahdi. Modified analog_alloc_sub to only mark the sub as
allocated upon success of the alloc_sub callback, which was responsible for the
segfault. Also, the callwaiting and callwaitingcallerid options were being
unconditionally set to true. Now, the options are properly set from
chan_dahdi.conf.

(closes issue #15508)
Reported by: elguero
Tested by: elguero

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

channels/chan_dahdi.c
channels/sig_analog.c

index 1890bbb..9bfddae 100644 (file)
@@ -10999,7 +10999,7 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf,
                                analog_p->polarityonanswerdelay = conf->chan.polarityonanswerdelay;
                                analog_p->answeronpolarityswitch = conf->chan.answeronpolarityswitch;
                                analog_p->hanguponpolarityswitch = conf->chan.hanguponpolarityswitch;
                                analog_p->polarityonanswerdelay = conf->chan.polarityonanswerdelay;
                                analog_p->answeronpolarityswitch = conf->chan.answeronpolarityswitch;
                                analog_p->hanguponpolarityswitch = conf->chan.hanguponpolarityswitch;
-                               analog_p->permcallwaiting = 1;
+                               analog_p->permcallwaiting = conf->chan.callwaiting; /* permcallwaiting possibly modified in analog_config_complete */
                                analog_p->callreturn = conf->chan.callreturn;
                                analog_p->cancallforward = conf->chan.cancallforward;
                                analog_p->canpark = conf->chan.canpark;
                                analog_p->callreturn = conf->chan.callreturn;
                                analog_p->cancallforward = conf->chan.cancallforward;
                                analog_p->canpark = conf->chan.canpark;
@@ -11016,7 +11016,7 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf,
                                analog_p->cid_signalling = conf->chan.cid_signalling;
                                analog_p->stripmsd = conf->chan.stripmsd;
                                analog_p->cid_start = ANALOG_CID_START_RING;
                                analog_p->cid_signalling = conf->chan.cid_signalling;
                                analog_p->stripmsd = conf->chan.stripmsd;
                                analog_p->cid_start = ANALOG_CID_START_RING;
-                               tmp->callwaitingcallerid = analog_p->callwaitingcallerid = 1;
+                               analog_p->callwaitingcallerid = conf->chan.callwaitingcallerid;
                                analog_p->usedistinctiveringdetection = conf->chan.usedistinctiveringdetection;
                                analog_p->ringt = conf->chan.ringt;
                                analog_p->ringt_base = ringt_base;
                                analog_p->usedistinctiveringdetection = conf->chan.usedistinctiveringdetection;
                                analog_p->ringt = conf->chan.ringt;
                                analog_p->ringt_base = ringt_base;
@@ -11322,12 +11322,6 @@ static struct ast_channel *dahdi_request(const char *type, int format, const str
                                        break;
                                }
                        }
                                        break;
                                }
                        }
-                       if (p->owner) {
-                               if (alloc_sub(p, SUB_CALLWAIT)) {
-                                       p = NULL;
-                                       break;
-                               }
-                       }
                        p->outgoing = 1;
                        if (analog_lib_handles(p->sig, p->radio, p->oprmode)) {
                                tmp = analog_request(p->sig_pvt, &callwait, requestor);
                        p->outgoing = 1;
                        if (analog_lib_handles(p->sig, p->radio, p->oprmode)) {
                                tmp = analog_request(p->sig_pvt, &callwait, requestor);
index 3488c7f..49b9c6b 100644 (file)
@@ -289,9 +289,13 @@ static void analog_swap_subs(struct analog_pvt *p, enum analog_sub a, enum analo
 
 static int analog_alloc_sub(struct analog_pvt *p, enum analog_sub x)
 {
 
 static int analog_alloc_sub(struct analog_pvt *p, enum analog_sub x)
 {
-       p->subs[x].allocd = 1;
-       if (p->calls->allocate_sub)
-               return p->calls->allocate_sub(p->chan_pvt, x);
+       if (p->calls->allocate_sub) {
+               int res;
+               res = p->calls->allocate_sub(p->chan_pvt, x);
+               if (!res)
+                       p->subs[x].allocd = 1;
+               return res;
+       }
 
        return 0;
 }
 
        return 0;
 }