]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
pbx: Fix leak of timezone for time based includes. 02/3202/1
authorCorey Farrell <git@cfware.com>
Thu, 14 Jul 2016 07:40:26 +0000 (03:40 -0400)
committerCorey Farrell <git@cfware.com>
Thu, 14 Jul 2016 07:59:45 +0000 (02:59 -0500)
Create include_free to run ast_destroy_timing and ast_free, use that in
all places that freed an ast_include structure.  This fixes a couple of
paths that previously did not run ast_destroy_timing.

ASTERISK-26196 #close

Change-Id: I1671bd111bef0dc113e8bf8f77f89fcfc395d838

main/pbx.c

index 6b0069c06add7f68ae60d886592c2a9d15816b25..5bafee337d1a12c11d503e8130055d0fa1a45bb5 100644 (file)
@@ -4682,6 +4682,13 @@ static struct ast_context *find_context_locked(const char *context)
        return c;
 }
 
+/*! \brief Free an ast_include and associated data. */
+static void include_free(struct ast_include *include)
+{
+       ast_destroy_timing(&(include->timing));
+       ast_free(include);
+}
+
 /*!
  * \brief Remove included contexts.
  * This function locks contexts list by &conlist, search for the right context
@@ -4729,8 +4736,7 @@ int ast_context_remove_include2(struct ast_context *con, const char *include, co
                        else
                                con->includes = i->next;
                        /* free include and return */
-                       ast_destroy_timing(&(i->timing));
-                       ast_free(i);
+                       include_free(i);
                        ret = 0;
                        break;
                }
@@ -6481,8 +6487,7 @@ int ast_context_add_include2(struct ast_context *con, const char *value,
        /* ... go to last include and check if context is already included too... */
        for (i = con->includes; i; i = i->next) {
                if (!strcasecmp(i->name, new_include->name)) {
-                       ast_destroy_timing(&(new_include->timing));
-                       ast_free(new_include);
+                       include_free(new_include);
                        ast_unlock_context(con);
                        errno = EEXIST;
                        return -1;
@@ -7706,7 +7711,7 @@ static void __ast_internal_context_destroy( struct ast_context *con)
        for (tmpi = tmp->includes; tmpi; ) { /* Free includes */
                struct ast_include *tmpil = tmpi;
                tmpi = tmpi->next;
-               ast_free(tmpil);
+               include_free(tmpil);
        }
        for (ipi = tmp->ignorepats; ipi; ) { /* Free ignorepats */
                struct ast_ignorepat *ipl = ipi;
@@ -7800,12 +7805,12 @@ void __ast_context_destroy(struct ast_context *list, struct ast_hashtab *context
                                        if (pi) {
                                                pi->next = i->next;
                                                /* free include */
-                                               ast_free(i);
+                                               include_free(i);
                                                continue; /* don't change pi */
                                        } else {
                                                tmp->includes = i->next;
                                                /* free include */
-                                               ast_free(i);
+                                               include_free(i);
                                                continue; /* don't change pi */
                                        }
                                }