Update of /usr/cvsroot/asterisk/pbx
In directory mongoose.digium.com:/tmp/cvs-serv889/pbx

Modified Files:
        pbx_spool.c 
Log Message:
Fix memory leak in outbound calls (bug #5406, with mods)


Index: pbx_spool.c
===================================================================
RCS file: /usr/cvsroot/asterisk/pbx/pbx_spool.c,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -d -r1.28 -r1.29
--- pbx_spool.c 14 Sep 2005 20:46:50 -0000      1.28
+++ pbx_spool.c 11 Oct 2005 20:44:23 -0000      1.29
@@ -91,7 +91,6 @@
        
        /* Maximum length of call */
        int maxlen;
-       
 };
 
 static void init_outgoing(struct outgoing *o)
@@ -102,6 +101,17 @@
        o->waittime = 45;
 }
 
+static void free_outgoing(struct outgoing *o)
+{
+       struct ast_variable *last;
+       while(o->vars) {
+               last = o->vars;
+               o->vars = o->vars->next;
+               free(last);
+       }
+       free(o);
+}
+
 static int apply_outgoing(struct outgoing *o, char *fn, FILE *f)
 {
        char buf[256];
@@ -265,7 +275,7 @@
                ast_log(LOG_EVENT, "Queued call to %s/%s completed\n", o->tech, 
o->dest);
                unlink(o->fn);
        }
-       free(o);
+       free_outgoing(o);
        return NULL;
 }
 
@@ -277,7 +287,7 @@
        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
        if (ast_pthread_create(&t,&attr,attempt_thread, o) == -1) {
                ast_log(LOG_WARNING, "Unable to create thread :(\n");
-               free(o);
+               free_outgoing(o);
        }
 }
 
@@ -314,18 +324,18 @@
                                        return now;
                                } else {
                                        ast_log(LOG_EVENT, "Queued call to 
%s/%s expired without completion after %d attempt%s\n", o->tech, o->dest, 
o->retries - 1, ((o->retries - 1) != 1) ? "s" : "");
-                                       free(o);
+                                       free_outgoing(o);
                                        unlink(fn);
                                        return 0;
                                }
                        } else {
-                               free(o);
+                               free_outgoing(o);
                                ast_log(LOG_WARNING, "Invalid file contents in 
%s, deleting\n", fn);
                                fclose(f);
                                unlink(fn);
                        }
                } else {
-                       free(o);
+                       free_outgoing(o);
                        ast_log(LOG_WARNING, "Unable to open %s: %s, 
deleting\n", fn, strerror(errno));
                        unlink(fn);
                }

_______________________________________________
Asterisk-Cvs mailing list
[email protected]
http://lists.digium.com/mailman/listinfo/asterisk-cvs

Reply via email to