]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fix memory leak of sig_xxx private structures.
authorRichard Mudgett <rmudgett@digium.com>
Tue, 8 Sep 2009 23:37:57 +0000 (23:37 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Tue, 8 Sep 2009 23:37:57 +0000 (23:37 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@217332 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_dahdi.c
channels/sig_analog.c
channels/sig_analog.h
channels/sig_pri.c
channels/sig_pri.h

index 44a170be4577d331a2cd13ca7d58c4e481151fef..ea8e113e30ddf3bd72304e29a1555553c967b27b 100644 (file)
@@ -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;
index 2b4119fb7fce30377a64537c1dd22bd0d31a3f9e..398b5f1709e63a9829f5bd3f611109e15dce6423 100644 (file)
@@ -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 */
index b937ec665a6cfce898a03b06601f28f22a51a81a..ce41ccc70d0724dd71734659afd0dee3efa5446c 100644 (file)
@@ -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);
 
index e3753c07d71485cc0983295e4f02e578f8373ecc..779d7f69c0db91026b4299c36ae4c3ee915d6fae 100644 (file)
@@ -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) {
index 40dad9d86c12fb43694f3a8d0f57f99461988934..eb6bd02bd8cea05ea4633d193047ff78a3a3a59c 100644 (file)
@@ -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);