Fix memory leak of sig_xxx private structures.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@217332 65c4cc65-6c06-0410-ace0-fbb531ad65f3
certified/1.8.6
Richard Mudgett 16 years ago
parent 8562029476
commit fd561e871f

@ -4683,6 +4683,16 @@ static void destroy_dahdi_pvt(struct dahdi_pvt **pvt)
p->prev->next = p->next;
if (p->next)
p->next->prev = p->prev;
if (p->sig_pvt) {
if (analog_lib_handles(p->sig, 0, 0)) {
analog_delete(p->sig_pvt);
}
#if defined(HAVE_PRI)
if (dahdi_sig_pri_lib_handles(p->sig)) {
sig_pri_chan_delete(p->sig_pvt);
}
#endif /* defined(HAVE_PRI) */
}
if (p->use_smdi)
ast_smdi_interface_unref(p->smdi_iface);
if (p->mwi_event_sub)
@ -10693,6 +10703,7 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf,
} else {
chan_sig = 0;
}
tmp->sig = chan_sig;
if (analog_lib_handles(chan_sig, tmp->radio, tmp->oprmode)) {
analog_p = analog_new(dahdisig_to_analogsig(chan_sig), &dahdi_analog_callbacks, tmp);
@ -11032,7 +11043,6 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf,
tmp->mwimonitor_neon = conf->chan.mwimonitor_neon;
tmp->mwimonitor_rpas = conf->chan.mwimonitor_rpas;
}
tmp->sig = chan_sig;
tmp->outsigmod = conf->chan.outsigmod;
tmp->ringt_base = ringt_base;
tmp->firstradio = 0;

@ -3394,12 +3394,11 @@ int analog_handle_init_event(struct analog_pvt *i, int event)
}
struct analog_pvt * analog_new(enum analog_sigtype signallingtype, struct analog_callback *c, void *private_data)
struct analog_pvt *analog_new(enum analog_sigtype signallingtype, struct analog_callback *c, void *private_data)
{
struct analog_pvt *p;
p = ast_calloc(1, sizeof(*p));
if (!p) {
return p;
}
@ -3418,6 +3417,19 @@ struct analog_pvt * analog_new(enum analog_sigtype signallingtype, struct analog
return p;
}
/*!
* \brief Delete the analog private structure.
* \since 1.6.3
*
* \param doomed Analog private structure to delete.
*
* \return Nothing
*/
void analog_delete(struct analog_pvt *doomed)
{
ast_free(doomed);
}
int analog_config_complete(struct analog_pvt *p)
{
/* No call waiting on non FXS channels */

@ -310,7 +310,8 @@ struct analog_pvt {
int ringt_base;
};
struct analog_pvt * analog_new(enum analog_sigtype signallingtype, struct analog_callback *c, void *private_data);
struct analog_pvt *analog_new(enum analog_sigtype signallingtype, struct analog_callback *c, void *private_data);
void analog_delete(struct analog_pvt *doomed);
void analog_free(struct analog_pvt *p);

@ -3060,6 +3060,19 @@ struct sig_pri_chan *sig_pri_chan_new(void *pvt_data, struct sig_pri_callback *c
return p;
}
/*!
* \brief Delete the sig_pri private channel structure.
* \since 1.6.3
*
* \param doomed sig_pri private channel structure to delete.
*
* \return Nothing
*/
void sig_pri_chan_delete(struct sig_pri_chan *doomed)
{
ast_free(doomed);
}
static void build_status(char *s, size_t len, int status, int active)
{
if (!s || len < 1) {

@ -251,6 +251,7 @@ void pri_event_noalarm(struct sig_pri_pri *pri, int index, int before_start_pri)
struct ast_channel *sig_pri_request(struct sig_pri_chan *p, enum sig_pri_law law, const struct ast_channel *requestor);
struct sig_pri_chan *sig_pri_chan_new(void *pvt_data, struct sig_pri_callback *callback, struct sig_pri_pri *pri, int logicalspan, int channo, int trunkgroup);
void sig_pri_chan_delete(struct sig_pri_chan *doomed);
int pri_is_up(struct sig_pri_pri *pri);

Loading…
Cancel
Save