diff options
author | Kinsey Moore <kmoore@digium.com> | 2012-07-31 20:21:43 +0000 |
---|---|---|
committer | Kinsey Moore <kmoore@digium.com> | 2012-07-31 20:21:43 +0000 |
commit | 9b16c8b0f6c3b6310e303411421bfcb16b26c3c4 (patch) | |
tree | 273c31a834a21bd2239ec6b83cd35c602ea25d26 /pbx/pbx_realtime.c | |
parent | 6c23a60f802e7708389b1a6463a40dc0500512bd (diff) |
Clean up and ensure proper usage of alloca()
This replaces all calls to alloca() with ast_alloca() which calls gcc's
__builtin_alloca() to avoid BSD semantics and removes all NULL checks
on memory allocated via ast_alloca() and ast_strdupa().
(closes issue ASTERISK-20125)
Review: https://reviewboard.asterisk.org/r/2032/
Patch-by: Walter Doekes (wdoekes)
........
Merged revisions 370642 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........
Merged revisions 370643 from http://svn.asterisk.org/svn/asterisk/branches/10
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@370655 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'pbx/pbx_realtime.c')
-rw-r--r-- | pbx/pbx_realtime.c | 90 |
1 files changed, 44 insertions, 46 deletions
diff --git a/pbx/pbx_realtime.c b/pbx/pbx_realtime.c index fb2f41320..3808483ad 100644 --- a/pbx/pbx_realtime.c +++ b/pbx/pbx_realtime.c @@ -228,52 +228,50 @@ static struct ast_variable *realtime_common(const char *context, const char *ext char exten[AST_MAX_EXTENSION]; } cache_search = { { .priority = priority, .context = (char *) context }, }; char *buf = ast_strdupa(data); - if (buf) { - /* "Realtime" prefix is stripped off in the parent engine. The - * remaining string is: [[context@]table][/opts] */ - char *opts = strchr(buf, '/'); - if (opts) - *opts++ = '\0'; - table = strchr(buf, '@'); - if (table) { - *table++ = '\0'; - ctx = buf; - } - ctx = S_OR(ctx, context); - table = S_OR(table, "extensions"); - if (!ast_strlen_zero(opts)) { - ast_app_parse_options(switch_opts, &flags, NULL, opts); - } - ast_copy_string(cache_search.exten, exten, sizeof(cache_search.exten)); - if (mode == MODE_MATCH && (ce = ao2_find(cache, &cache_search, OBJ_POINTER))) { - var = dup_vars(ce->var); + /* "Realtime" prefix is stripped off in the parent engine. The + * remaining string is: [[context@]table][/opts] */ + char *opts = strchr(buf, '/'); + if (opts) + *opts++ = '\0'; + table = strchr(buf, '@'); + if (table) { + *table++ = '\0'; + ctx = buf; + } + ctx = S_OR(ctx, context); + table = S_OR(table, "extensions"); + if (!ast_strlen_zero(opts)) { + ast_app_parse_options(switch_opts, &flags, NULL, opts); + } + ast_copy_string(cache_search.exten, exten, sizeof(cache_search.exten)); + if (mode == MODE_MATCH && (ce = ao2_find(cache, &cache_search, OBJ_POINTER))) { + var = dup_vars(ce->var); + ao2_ref(ce, -1); + } else { + var = realtime_switch_common(table, ctx, exten, priority, mode, flags); + do { + struct ast_variable *new; + /* Only cache matches */ + if (mode != MODE_MATCH) { + break; + } + if (!(new = dup_vars(var))) { + break; + } + if (!(ce = ao2_alloc(sizeof(*ce) + strlen(exten) + strlen(context), free_entry))) { + ast_variables_destroy(new); + break; + } + ce->context = ce->exten + strlen(exten) + 1; + strcpy(ce->exten, exten); /* SAFE */ + strcpy(ce->context, context); /* SAFE */ + ce->priority = priority; + ce->var = new; + ce->when = ast_tvnow(); + ao2_link(cache, ce); + pthread_kill(cleanup_thread, SIGURG); ao2_ref(ce, -1); - } else { - var = realtime_switch_common(table, ctx, exten, priority, mode, flags); - do { - struct ast_variable *new; - /* Only cache matches */ - if (mode != MODE_MATCH) { - break; - } - if (!(new = dup_vars(var))) { - break; - } - if (!(ce = ao2_alloc(sizeof(*ce) + strlen(exten) + strlen(context), free_entry))) { - ast_variables_destroy(new); - break; - } - ce->context = ce->exten + strlen(exten) + 1; - strcpy(ce->exten, exten); /* SAFE */ - strcpy(ce->context, context); /* SAFE */ - ce->priority = priority; - ce->var = new; - ce->when = ast_tvnow(); - ao2_link(cache, ce); - pthread_kill(cleanup_thread, SIGURG); - ao2_ref(ce, -1); - } while (0); - } + } while (0); } return var; } @@ -315,7 +313,7 @@ static int realtime_exec(struct ast_channel *chan, const char *context, const ch if (ast_compat_pbx_realtime) { char *ptr; int in = 0; - tmp = alloca(strlen(v->value) * 2 + 1); + tmp = ast_alloca(strlen(v->value) * 2 + 1); for (ptr = tmp; *v->value; v->value++) { if (*v->value == ',') { *ptr++ = '\\'; |