pbx: Fix leak of timezone for time based includes.
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:56 +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 df9cad3..f065b1a 100644 (file)
@@ -4755,6 +4755,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
@@ -4802,8 +4809,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;
                }
@@ -6613,8 +6619,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;
@@ -7838,7 +7843,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;
@@ -7932,12 +7937,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 */
                                        }
                                }