diff options
author | Matt Jordan <mjordan@digium.com> | 2015-06-09 06:57:53 -0500 |
---|---|---|
committer | Gerrit Code Review <gerrit2@gerrit.digium.api> | 2015-06-09 06:57:53 -0500 |
commit | bbeb753e5ed21f6a21242a24092b0d71d9d6c75c (patch) | |
tree | ab76f427f421f3eab6b3b9f977217fee532d5e18 /main | |
parent | 53c1126090733d8d4e6ee06e2ef92dc98bb0f374 (diff) | |
parent | 80621ce3c5da5062f7e3efb42d6e8fcdd9caa3f6 (diff) |
Merge "Fix unsafe uses of ast_context pointers."
Diffstat (limited to 'main')
-rw-r--r-- | main/pbx.c | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/main/pbx.c b/main/pbx.c index 45909f5d9..0da0fef1e 100644 --- a/main/pbx.c +++ b/main/pbx.c @@ -8739,9 +8739,9 @@ struct ast_context *ast_context_find_or_create(struct ast_context **extcontexts, ast_rdlock_contexts(); local_contexts = &contexts; tmp = ast_hashtab_lookup(contexts_table, &search); - ast_unlock_contexts(); if (tmp) { tmp->refcount++; + ast_unlock_contexts(); return tmp; } } else { /* local contexts just in a linked list; search there for the new context; slow, linear search, but not frequent */ @@ -8765,11 +8765,13 @@ struct ast_context *ast_context_find_or_create(struct ast_context **extcontexts, tmp->refcount = 1; } else { ast_log(LOG_ERROR, "Danger! We failed to allocate a context for %s!\n", name); + if (!extcontexts) { + ast_unlock_contexts(); + } return NULL; } if (!extcontexts) { - ast_wrlock_contexts(); tmp->next = *local_contexts; *local_contexts = tmp; ast_hashtab_insert_safe(contexts_table, tmp); /*put this context into the tree */ @@ -9668,18 +9670,24 @@ int ast_context_add_ignorepat2(struct ast_context *con, const char *value, const int ast_ignore_pattern(const char *context, const char *pattern) { - struct ast_context *con = ast_context_find(context); + int ret = 0; + struct ast_context *con; + ast_rdlock_contexts(); + con = ast_context_find(context); if (con) { struct ast_ignorepat *pat; for (pat = con->ignorepats; pat; pat = pat->next) { - if (ast_extension_match(pat->pattern, pattern)) - return 1; + if (ast_extension_match(pat->pattern, pattern)) { + ret = 1; + break; + } } } + ast_unlock_contexts(); - return 0; + return ret; } /* @@ -10887,6 +10895,22 @@ void __ast_context_destroy(struct ast_context *list, struct ast_hashtab *context } } +int ast_context_destroy_by_name(const char *context, const char *registrar) +{ + struct ast_context *con; + int ret = -1; + + ast_wrlock_contexts(); + con = ast_context_find(context); + if (con) { + ast_context_destroy(con, registrar); + ret = 0; + } + ast_unlock_contexts(); + + return ret; +} + void ast_context_destroy(struct ast_context *con, const char *registrar) { ast_wrlock_contexts(); |