Index: main/manager.c =================================================================== --- main/manager.c (revision 314015) +++ main/manager.c (working copy) @@ -77,6 +77,7 @@ #include "asterisk/features.h" #include "asterisk/security_events.h" #include "asterisk/aoc.h" +#include "asterisk/stringfields.h" /*** DOCUMENTATION @@ -3531,14 +3532,16 @@ char data[512]; int timeout; format_t format; /*!< Codecs used for a call */ - char app[AST_MAX_APP]; - char appdata[AST_MAX_EXTENSION]; - char cid_name[AST_MAX_EXTENSION]; - char cid_num[AST_MAX_EXTENSION]; - char context[AST_MAX_CONTEXT]; - char exten[AST_MAX_EXTENSION]; - char idtext[AST_MAX_EXTENSION]; - char account[AST_MAX_ACCOUNT_CODE]; + AST_DECLARE_STRING_FIELDS ( + AST_STRING_FIELD(app); + AST_STRING_FIELD(appdata); + AST_STRING_FIELD(cid_name); + AST_STRING_FIELD(cid_num); + AST_STRING_FIELD(context); + AST_STRING_FIELD(exten); + AST_STRING_FIELD(idtext); + AST_STRING_FIELD(account); + ); int priority; struct ast_variable *vars; }; @@ -3589,6 +3592,7 @@ if (chan) { ast_channel_unlock(chan); } + ast_string_field_free_memory(in); ast_free(in); return NULL; } @@ -3893,30 +3897,31 @@ if (ast_true(async)) { struct fast_originate_helper *fast = ast_calloc(1, sizeof(*fast)); - if (!fast) { + if (!fast || ast_string_field_init(fast, 256)) { + if (fast) { + ast_free(fast); + } res = -1; } else { - if (!ast_strlen_zero(id)) - snprintf(fast->idtext, sizeof(fast->idtext), "ActionID: %s", id); - ast_copy_string(fast->tech, tech, sizeof(fast->tech)); - ast_copy_string(fast->data, data, sizeof(fast->data)); - ast_copy_string(fast->app, app, sizeof(fast->app)); - ast_copy_string(fast->appdata, appdata, sizeof(fast->appdata)); - if (l) { - ast_copy_string(fast->cid_num, l, sizeof(fast->cid_num)); + if (!ast_strlen_zero(id)) { + ast_string_field_build(fast, idtext, "ActionID: %s", id); } - if (n) { - ast_copy_string(fast->cid_name, n, sizeof(fast->cid_name)); - } + ast_string_field_set(fast, tech, tech); + ast_string_field_set(fast, data, data); + ast_string_field_set(fast, app, app); + ast_string_field_set(fast, appdata, appdata); + ast_string_field_set(fast, cid_num, l); + ast_string_field_set(fast, cid_name, n); + ast_string_field_set(fast, context, context); + ast_string_field_set(fast, exten, exten); + ast_string_field_set(fast, account, account); fast->vars = vars; - ast_copy_string(fast->context, context, sizeof(fast->context)); - ast_copy_string(fast->exten, exten, sizeof(fast->exten)); - ast_copy_string(fast->account, account, sizeof(fast->account)); fast->format = format; fast->timeout = to; fast->priority = pi; if (ast_pthread_create_detached(&th, NULL, fast_originate, fast)) { ast_free(fast); + ast_string_field_free_memory(fast); res = -1; } else { res = 0; Index: main/pbx.c =================================================================== --- main/pbx.c (revision 314015) +++ main/pbx.c (working copy) @@ -8519,10 +8519,10 @@ } struct app_tmp { - char app[256]; - char data[256]; struct ast_channel *chan; pthread_t t; + char *data; + char app[0]; }; /*! \brief run the application and free the descriptor once done */ @@ -8567,13 +8567,15 @@ if (chan->_state == AST_STATE_UP) { res = 0; ast_verb(4, "Channel %s was answered.\n", chan->name); - tmp = ast_calloc(1, sizeof(*tmp)); + tmp = ast_calloc(1, sizeof(*tmp) + strlen(app) + strlen(appdata) + 2); if (!tmp) res = -1; else { - ast_copy_string(tmp->app, app, sizeof(tmp->app)); - if (appdata) - ast_copy_string(tmp->data, appdata, sizeof(tmp->data)); + tmp->data = tmp->app + strlen(app) + 1; + strcpy(tmp->app, app); /* SAFE */ + if (appdata) { + strcpy(tmp->data, appdata); /* SAFE */ + } tmp->chan = chan; if (synchronous > 1) { if (locked_channel)