From fd561e871f70d3c28cbc8f4ef08c4ae0221932d0 Mon Sep 17 00:00:00 2001 From: Richard Mudgett Date: Tue, 8 Sep 2009 23:37:57 +0000 Subject: Fix memory leak of sig_xxx private structures. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@217332 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_dahdi.c | 12 +++++++++++- channels/sig_analog.c | 16 ++++++++++++++-- channels/sig_analog.h | 3 ++- channels/sig_pri.c | 13 +++++++++++++ channels/sig_pri.h | 1 + 5 files changed, 41 insertions(+), 4 deletions(-) diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index 44a170be4..ea8e113e3 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -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; diff --git a/channels/sig_analog.c b/channels/sig_analog.c index 2b4119fb7..398b5f170 100644 --- a/channels/sig_analog.c +++ b/channels/sig_analog.c @@ -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 */ diff --git a/channels/sig_analog.h b/channels/sig_analog.h index b937ec665..ce41ccc70 100644 --- a/channels/sig_analog.h +++ b/channels/sig_analog.h @@ -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); diff --git a/channels/sig_pri.c b/channels/sig_pri.c index e3753c07d..779d7f69c 100644 --- a/channels/sig_pri.c +++ b/channels/sig_pri.c @@ -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) { diff --git a/channels/sig_pri.h b/channels/sig_pri.h index 40dad9d86..eb6bd02bd 100644 --- a/channels/sig_pri.h +++ b/channels/sig_pri.h @@ -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); -- cgit v1.2.3