various files - fix some alerts raised by lgtm code analysis

This patch fixes several issues reported by the lgtm code analysis tool:

https://lgtm.com/projects/g/asterisk/asterisk

Not all reported issues were addressed in this patch. This patch mostly fixes
confirmed reported errors, potential problematic code points, and a few other
"low hanging" warnings or recommendations found in core supported modules.
These include, but are not limited to the following:

* innapropriate stack allocation in loops
* buffer overflows
* variable declaration "hiding" another variable declaration
* comparisons results that are always the same
* ambiguously signed bit-field members
* missing header guards

Change-Id: Id4a881686605d26c94ab5409bc70fcc21efacc25
This commit is contained in:
Kevin Harwell 2019-10-23 12:36:17 -05:00 committed by George Joseph
parent 990a91b44a
commit bdd785d31c
49 changed files with 324 additions and 203 deletions

View File

@ -119,13 +119,13 @@ struct app_cdr_message_payload {
/*! The name of the channel to be manipulated */ /*! The name of the channel to be manipulated */
const char *channel_name; const char *channel_name;
/*! Disable the CDR for this channel */ /*! Disable the CDR for this channel */
int disable:1; unsigned int disable:1;
/*! Re-enable the CDR for this channel */ /*! Re-enable the CDR for this channel */
int reenable:1; unsigned int reenable:1;
/*! Reset the CDR */ /*! Reset the CDR */
int reset:1; unsigned int reset:1;
/*! If reseting the CDR, keep the variables */ /*! If reseting the CDR, keep the variables */
int keep_variables:1; unsigned int keep_variables:1;
}; };
static void appcdr_callback(void *data, struct stasis_subscription *sub, struct stasis_message *message) static void appcdr_callback(void *data, struct stasis_subscription *sub, struct stasis_message *message)

View File

@ -149,7 +149,8 @@ static int dictate_exec(struct ast_channel *chan, const char *data)
ast_mkdir(base, 0755); ast_mkdir(base, 0755);
len = strlen(base) + strlen(filein) + 2; len = strlen(base) + strlen(filein) + 2;
if (!path || len > maxlen) { if (!path || len > maxlen) {
path = ast_alloca(len); ast_free(path);
path = ast_malloc(len);
memset(path, 0, len); memset(path, 0, len);
maxlen = len; maxlen = len;
} else { } else {
@ -334,6 +335,7 @@ static int dictate_exec(struct ast_channel *chan, const char *data)
ast_frfree(f); ast_frfree(f);
} }
} }
ast_free(path);
if (oldr) { if (oldr) {
ast_set_read_format(chan, oldr); ast_set_read_format(chan, oldr);
ao2_ref(oldr, -1); ao2_ref(oldr, -1);

View File

@ -408,7 +408,6 @@ static int reload_followme(int reload)
char *cat = NULL, *tmp; char *cat = NULL, *tmp;
struct ast_variable *var; struct ast_variable *var;
struct number *cur, *nm; struct number *cur, *nm;
char *numberstr;
int timeout; int timeout;
int numorder; int numorder;
const char* enable_callee_prompt_str; const char* enable_callee_prompt_str;
@ -536,9 +535,12 @@ static int reload_followme(int reload)
while (var) { while (var) {
if (!strcasecmp(var->name, "number")) { if (!strcasecmp(var->name, "number")) {
int idx = 0; int idx = 0;
char copy[strlen(var->value) + 1];
char *numberstr;
/* Add a new number */ /* Add a new number */
numberstr = ast_strdupa(var->value); strcpy(copy, var->value); /* safe */
numberstr = copy;
if ((tmp = strchr(numberstr, ','))) { if ((tmp = strchr(numberstr, ','))) {
*tmp++ = '\0'; *tmp++ = '\0';
timeout = atoi(tmp); timeout = atoi(tmp);
@ -762,10 +764,6 @@ static struct ast_channel *wait_for_winner(struct findme_user_listptr *findme_us
} }
tmpto = to; tmpto = to;
if (to < 0) {
to = 1000;
tmpto = 1000;
}
towas = to; towas = to;
winner = ast_waitfor_n(watchers, pos, &to); winner = ast_waitfor_n(watchers, pos, &to);
tmpto -= to; tmpto -= to;

View File

@ -2652,9 +2652,10 @@ static int create_vmaccount(char *name, struct ast_variable *var, int realtime)
ast_copy_string(vmu->fullname, var->value, sizeof(vmu->fullname)); ast_copy_string(vmu->fullname, var->value, sizeof(vmu->fullname));
} else if (!strcasecmp(var->name, "setvar")) { } else if (!strcasecmp(var->name, "setvar")) {
char *varval; char *varval;
char *varname = ast_strdupa(var->value); char varname[strlen(var->value) + 1];
struct ast_variable *tmpvar; struct ast_variable *tmpvar;
strcpy(varname, var->value); /* safe */
if ((varval = strchr(varname, '='))) { if ((varval = strchr(varname, '='))) {
*varval = '\0'; *varval = '\0';
varval++; varval++;

View File

@ -173,7 +173,10 @@ static int s_streamwait3(const say_args_t *a, const char *fn)
static int do_say(say_args_t *a, const char *s, const char *options, int depth) static int do_say(say_args_t *a, const char *s, const char *options, int depth)
{ {
struct ast_variable *v; struct ast_variable *v;
char *lang, *x, *rule = NULL; char *lang;
char *x;
char *rule = NULL;
char *rule_head = NULL;
int ret = 0; int ret = 0;
struct varshead head = { .first = NULL, .last = NULL }; struct varshead head = { .first = NULL, .last = NULL };
struct ast_var_t *n; struct ast_var_t *n;
@ -195,7 +198,7 @@ static int do_say(say_args_t *a, const char *s, const char *options, int depth)
for (;;) { for (;;) {
for (v = ast_variable_browse(say_cfg, lang); v ; v = v->next) { for (v = ast_variable_browse(say_cfg, lang); v ; v = v->next) {
if (ast_extension_match(v->name, s)) { if (ast_extension_match(v->name, s)) {
rule = ast_strdupa(v->value); rule_head = rule = ast_strdup(v->value);
break; break;
} }
} }
@ -220,6 +223,7 @@ static int do_say(say_args_t *a, const char *s, const char *options, int depth)
n = ast_var_assign("SAY", s); n = ast_var_assign("SAY", s);
if (!n) { if (!n) {
ast_log(LOG_ERROR, "Memory allocation error in do_say\n"); ast_log(LOG_ERROR, "Memory allocation error in do_say\n");
ast_free(rule_head);
return -1; return -1;
} }
AST_LIST_INSERT_HEAD(&head, n, entries); AST_LIST_INSERT_HEAD(&head, n, entries);
@ -281,6 +285,7 @@ static int do_say(say_args_t *a, const char *s, const char *options, int depth)
} }
} }
ast_var_delete(n); ast_var_delete(n);
ast_free(rule_head);
return ret; return ret;
} }

View File

@ -170,8 +170,7 @@ static int readexten_exec(struct ast_channel *chan, const char *data)
if (timeout <= 0) if (timeout <= 0)
timeout = ast_channel_pbx(chan) ? ast_channel_pbx(chan)->rtimeoutms : 10000; timeout = ast_channel_pbx(chan) ? ast_channel_pbx(chan)->rtimeoutms : 10000;
if (digit_timeout <= 0) digit_timeout = ast_channel_pbx(chan) ? ast_channel_pbx(chan)->dtimeoutms : 5000;
digit_timeout = ast_channel_pbx(chan) ? ast_channel_pbx(chan)->dtimeoutms : 5000;
if (ast_test_flag(&flags, OPT_INDICATION) && !ast_strlen_zero(arglist.filename)) { if (ast_test_flag(&flags, OPT_INDICATION) && !ast_strlen_zero(arglist.filename)) {
ts = ast_get_indication_tone(ast_channel_zone(chan), arglist.filename); ts = ast_get_indication_tone(ast_channel_zone(chan), arglist.filename);

View File

@ -1797,7 +1797,7 @@ static void vm_change_password(struct ast_vm_user *vmu, const char *newpassword)
struct ast_config *cfg = NULL; struct ast_config *cfg = NULL;
struct ast_variable *var = NULL; struct ast_variable *var = NULL;
struct ast_category *cat = NULL; struct ast_category *cat = NULL;
char *category = NULL, *value = NULL, *new = NULL; char *category = NULL;
const char *tmp = NULL; const char *tmp = NULL;
struct ast_flags config_flags = { CONFIG_FLAG_WITHCOMMENTS }; struct ast_flags config_flags = { CONFIG_FLAG_WITHCOMMENTS };
char secretfn[PATH_MAX] = ""; char secretfn[PATH_MAX] = "";
@ -1824,24 +1824,28 @@ static void vm_change_password(struct ast_vm_user *vmu, const char *newpassword)
if ((cfg = ast_config_load(VOICEMAIL_CONFIG, config_flags)) && valid_config(cfg)) { if ((cfg = ast_config_load(VOICEMAIL_CONFIG, config_flags)) && valid_config(cfg)) {
while ((category = ast_category_browse(cfg, category))) { while ((category = ast_category_browse(cfg, category))) {
if (!strcasecmp(category, vmu->context)) { if (!strcasecmp(category, vmu->context)) {
char *value = NULL;
char *new = NULL;
if (!(tmp = ast_variable_retrieve(cfg, category, vmu->mailbox))) { if (!(tmp = ast_variable_retrieve(cfg, category, vmu->mailbox))) {
ast_log(AST_LOG_WARNING, "We could not find the mailbox.\n"); ast_log(AST_LOG_WARNING, "We could not find the mailbox.\n");
break; break;
} }
value = strstr(tmp, ","); value = strstr(tmp, ",");
if (!value) { if (!value) {
new = ast_alloca(strlen(newpassword)+1); new = ast_malloc(strlen(newpassword) + 1);
sprintf(new, "%s", newpassword); sprintf(new, "%s", newpassword);
} else { } else {
new = ast_alloca((strlen(value) + strlen(newpassword) + 1)); new = ast_malloc((strlen(value) + strlen(newpassword) + 1));
sprintf(new, "%s%s", newpassword, value); sprintf(new, "%s%s", newpassword, value);
} }
if (!(cat = ast_category_get(cfg, category, NULL))) { if (!(cat = ast_category_get(cfg, category, NULL))) {
ast_log(AST_LOG_WARNING, "Failed to get category structure.\n"); ast_log(AST_LOG_WARNING, "Failed to get category structure.\n");
ast_free(new);
break; break;
} }
ast_variable_update(cat, vmu->mailbox, new, NULL, 0); ast_variable_update(cat, vmu->mailbox, new, NULL, 0);
found = 1; found = 1;
ast_free(new);
} }
} }
/* save the results */ /* save the results */
@ -1865,13 +1869,14 @@ static void vm_change_password(struct ast_vm_user *vmu, const char *newpassword)
for (category = ast_category_browse(cfg, NULL); category; category = ast_category_browse(cfg, category)) { for (category = ast_category_browse(cfg, NULL); category; category = ast_category_browse(cfg, category)) {
ast_debug(4, "users.conf: %s\n", category); ast_debug(4, "users.conf: %s\n", category);
if (!strcasecmp(category, vmu->mailbox)) { if (!strcasecmp(category, vmu->mailbox)) {
char new[strlen(newpassword) + 1];
if (!ast_variable_retrieve(cfg, category, "vmsecret")) { if (!ast_variable_retrieve(cfg, category, "vmsecret")) {
ast_debug(3, "looks like we need to make vmsecret!\n"); ast_debug(3, "looks like we need to make vmsecret!\n");
var = ast_variable_new("vmsecret", newpassword, ""); var = ast_variable_new("vmsecret", newpassword, "");
} else { } else {
var = NULL; var = NULL;
} }
new = ast_alloca(strlen(newpassword) + 1);
sprintf(new, "%s", newpassword); sprintf(new, "%s", newpassword);
if (!(cat = ast_category_get(cfg, category, NULL))) { if (!(cat = ast_category_get(cfg, category, NULL))) {
ast_debug(4, "failed to get category!\n"); ast_debug(4, "failed to get category!\n");
@ -2194,7 +2199,6 @@ static int imap_retrieve_greeting(const char *dir, const int msgnum, struct ast_
struct vm_state *vms_p; struct vm_state *vms_p;
char *file, *filename; char *file, *filename;
char dest[PATH_MAX]; char dest[PATH_MAX];
char *attachment;
int i; int i;
BODY *body; BODY *body;
int ret = 0; int ret = 0;
@ -2247,21 +2251,26 @@ static int imap_retrieve_greeting(const char *dir, const int msgnum, struct ast_
mail_fetchstructure(vms_p->mailstream, i + 1, &body); mail_fetchstructure(vms_p->mailstream, i + 1, &body);
/* We have the body, now we extract the file name of the first attachment. */ /* We have the body, now we extract the file name of the first attachment. */
if (body->nested.part && body->nested.part->next && body->nested.part->next->body.parameter->value) { if (body->nested.part && body->nested.part->next && body->nested.part->next->body.parameter->value) {
attachment = ast_strdupa(body->nested.part->next->body.parameter->value); char *attachment = body->nested.part->next->body.parameter->value;
char copy[strlen(attachment) + 1];
strcpy(copy, attachment); /* safe */
attachment = copy;
filename = strsep(&attachment, ".");
if (!strcmp(filename, file)) {
ast_copy_string(vms_p->fn, dir, sizeof(vms_p->fn));
vms_p->msgArray[vms_p->curmsg] = i + 1;
create_dirpath(dest, sizeof(dest), vmu->context, vms_p->username, "");
save_body(body, vms_p, "2", attachment, 0);
ret = 0;
break;
}
} else { } else {
ast_log(AST_LOG_ERROR, "There is no file attached to this IMAP message.\n"); ast_log(AST_LOG_ERROR, "There is no file attached to this IMAP message.\n");
ret = -1; ret = -1;
break; break;
} }
filename = strsep(&attachment, ".");
if (!strcmp(filename, file)) {
ast_copy_string(vms_p->fn, dir, sizeof(vms_p->fn));
vms_p->msgArray[vms_p->curmsg] = i + 1;
create_dirpath(dest, sizeof(dest), vmu->context, vms_p->username, "");
save_body(body, vms_p, "2", attachment, 0);
ret = 0;
break;
}
} }
if (curr_mbox != -1) { if (curr_mbox != -1) {
@ -8141,10 +8150,12 @@ static void queue_mwi_event(const char *channel_id, const char *box, int urgent,
aliases = ao2_find(mailbox_alias_mappings, box, OBJ_SEARCH_KEY | OBJ_MULTIPLE); aliases = ao2_find(mailbox_alias_mappings, box, OBJ_SEARCH_KEY | OBJ_MULTIPLE);
while ((mapping = ao2_iterator_next(aliases))) { while ((mapping = ao2_iterator_next(aliases))) {
char alias[strlen(mapping->alias) + 1];
strcpy(alias, mapping->alias); /* safe */
mailbox = NULL; mailbox = NULL;
context = NULL; context = NULL;
ast_debug(3, "Found alias mapping: %s -> %s\n", mapping->alias, box); ast_debug(3, "Found alias mapping: %s -> %s\n", mapping->alias, box);
separate_mailbox(ast_strdupa(mapping->alias), &mailbox, &context); separate_mailbox(alias, &mailbox, &context);
ast_publish_mwi_state_channel(mailbox, context, new + urgent, old, channel_id); ast_publish_mwi_state_channel(mailbox, context, new + urgent, old, channel_id);
ao2_ref(mapping, -1); ao2_ref(mapping, -1);
} }
@ -8364,12 +8375,12 @@ static int forward_message(struct ast_channel *chan, char *context, struct vm_st
directory_app = pbx_findapp("Directory"); directory_app = pbx_findapp("Directory");
if (directory_app) { if (directory_app) {
char vmcontext[256]; char vmcontext[256];
char *old_context; char old_context[strlen(ast_channel_context(chan)) + 1];
char *old_exten; char old_exten[strlen(ast_channel_exten(chan)) + 1];
int old_priority; int old_priority;
/* make backup copies */ /* make backup copies */
old_context = ast_strdupa(ast_channel_context(chan)); strcpy(old_context, ast_channel_context(chan)); /* safe */
old_exten = ast_strdupa(ast_channel_exten(chan)); strcpy(old_exten, ast_channel_exten(chan)); /* safe */
old_priority = ast_channel_priority(chan); old_priority = ast_channel_priority(chan);
/* call the Directory, changes the channel */ /* call the Directory, changes the channel */
@ -9050,7 +9061,6 @@ static int imap_remove_file(char *dir, int msgnum)
static int imap_delete_old_greeting (char *dir, struct vm_state *vms) static int imap_delete_old_greeting (char *dir, struct vm_state *vms)
{ {
char *file, *filename; char *file, *filename;
char *attachment;
char arg[11]; char arg[11];
int i; int i;
BODY* body; BODY* body;
@ -9079,17 +9089,22 @@ static int imap_delete_old_greeting (char *dir, struct vm_state *vms)
mail_fetchstructure(vms->mailstream, i + 1, &body); mail_fetchstructure(vms->mailstream, i + 1, &body);
/* We have the body, now we extract the file name of the first attachment. */ /* We have the body, now we extract the file name of the first attachment. */
if (body->nested.part->next && body->nested.part->next->body.parameter->value) { if (body->nested.part->next && body->nested.part->next->body.parameter->value) {
attachment = ast_strdupa(body->nested.part->next->body.parameter->value); char *attachment = body->nested.part->next->body.parameter->value;
char copy[strlen(attachment) + 1];
strcpy(copy, attachment); /* safe */
attachment = copy;
filename = strsep(&attachment, ".");
if (!strcmp(filename, file)) {
snprintf(arg, sizeof(arg), "%d", i + 1);
mail_setflag(vms->mailstream, arg, "\\DELETED");
}
} else { } else {
ast_log(AST_LOG_ERROR, "There is no file attached to this IMAP message.\n"); ast_log(AST_LOG_ERROR, "There is no file attached to this IMAP message.\n");
ast_mutex_unlock(&vms->lock); ast_mutex_unlock(&vms->lock);
return -1; return -1;
} }
filename = strsep(&attachment, ".");
if (!strcmp(filename, file)) {
snprintf(arg, sizeof(arg), "%d", i + 1);
mail_setflag(vms->mailstream, arg, "\\DELETED");
}
} }
mail_expunge(vms->mailstream); mail_expunge(vms->mailstream);
@ -13705,26 +13720,30 @@ static void load_zonemessages(struct ast_config *cfg)
var = ast_variable_browse(cfg, "zonemessages"); var = ast_variable_browse(cfg, "zonemessages");
while (var) { while (var) {
struct vm_zone *z; if (var->value) {
char *msg_format, *tzone; struct vm_zone *z;
char *msg_format, *tzone;
char storage[strlen(var->value) + 1];
z = ast_malloc(sizeof(*z)); z = ast_malloc(sizeof(*z));
if (!z) { if (!z) {
return; return;
} }
msg_format = ast_strdupa(var->value); strcpy(storage, var->value); /* safe */
tzone = strsep(&msg_format, "|,"); msg_format = storage;
if (msg_format) { tzone = strsep(&msg_format, "|,");
ast_copy_string(z->name, var->name, sizeof(z->name)); if (msg_format) {
ast_copy_string(z->timezone, tzone, sizeof(z->timezone)); ast_copy_string(z->name, var->name, sizeof(z->name));
ast_copy_string(z->msg_format, msg_format, sizeof(z->msg_format)); ast_copy_string(z->timezone, tzone, sizeof(z->timezone));
AST_LIST_LOCK(&zones); ast_copy_string(z->msg_format, msg_format, sizeof(z->msg_format));
AST_LIST_INSERT_HEAD(&zones, z, list); AST_LIST_LOCK(&zones);
AST_LIST_UNLOCK(&zones); AST_LIST_INSERT_HEAD(&zones, z, list);
} else { AST_LIST_UNLOCK(&zones);
ast_log(AST_LOG_WARNING, "Invalid timezone definition at line %d\n", var->lineno); } else {
ast_free(z); ast_log(AST_LOG_WARNING, "Invalid timezone definition at line %d\n", var->lineno);
ast_free(z);
}
} }
var = var->next; var = var->next;
} }

View File

@ -4382,7 +4382,7 @@ static char *alarm2str(int alm)
static const char *event2str(int event) static const char *event2str(int event)
{ {
static char buf[256]; static char buf[256];
if ((event < (ARRAY_LEN(events))) && (event > -1)) if ((event > -1) && (event < (ARRAY_LEN(events))) )
return events[event]; return events[event];
sprintf(buf, "Event %d", event); /* safe */ sprintf(buf, "Event %d", event); /* safe */
return buf; return buf;
@ -15174,7 +15174,7 @@ static void mfcr2_show_links_of(struct ast_cli_args *a, struct r2links *list_hea
inside_range = 0; inside_range = 0;
len = 0; len = 0;
/* Prepare nice string in channel_list[] */ /* Prepare nice string in channel_list[] */
for (i = 0; i < mfcr2->numchans; i++) { for (i = 0; i < mfcr2->numchans && len < sizeof(channel_list) - 1; i++) {
struct dahdi_pvt *p = mfcr2->pvts[i]; struct dahdi_pvt *p = mfcr2->pvts[i];
if (!p) { if (!p) {
continue; continue;
@ -18132,13 +18132,17 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct
} else if (!strcasecmp(v->name, "namedpickupgroup")) { } else if (!strcasecmp(v->name, "namedpickupgroup")) {
confp->chan.named_pickupgroups = ast_get_namedgroups(v->value); confp->chan.named_pickupgroups = ast_get_namedgroups(v->value);
} else if (!strcasecmp(v->name, "setvar")) { } else if (!strcasecmp(v->name, "setvar")) {
char *varname = ast_strdupa(v->value), *varval = NULL; if (v->value) {
struct ast_variable *tmpvar; char *varval = NULL;
if (varname && (varval = strchr(varname, '='))) { struct ast_variable *tmpvar;
*varval++ = '\0'; char varname[strlen(v->value) + 1];
if ((tmpvar = ast_variable_new(varname, varval, ""))) { strcpy(varname, v->value); /* safe */
tmpvar->next = confp->chan.vars; if ((varval = strchr(varname, '='))) {
confp->chan.vars = tmpvar; *varval++ = '\0';
if ((tmpvar = ast_variable_new(varname, varval, ""))) {
tmpvar->next = confp->chan.vars;
confp->chan.vars = tmpvar;
}
} }
} }
} else if (!strcasecmp(v->name, "immediate")) { } else if (!strcasecmp(v->name, "immediate")) {
@ -19082,9 +19086,12 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct
} else if (!strcasecmp(v->name, "mfcr2_logging")) { } else if (!strcasecmp(v->name, "mfcr2_logging")) {
openr2_log_level_t tmplevel; openr2_log_level_t tmplevel;
char *clevel; char *clevel;
char *logval = ast_strdupa(v->value); char *logval;
char copy[strlen(v->value) + 1];
strcpy(copy, v->value); /* safe */
logval = copy;
while (logval) { while (logval) {
clevel = strsep(&logval,","); clevel = strsep(&logval,",");
if (-1 == (tmplevel = openr2_log_get_level(clevel))) { if (-1 == (tmplevel = openr2_log_get_level(clevel))) {
ast_log(LOG_WARNING, "Ignoring invalid logging level: '%s' at line %d.\n", clevel, v->lineno); ast_log(LOG_WARNING, "Ignoring invalid logging level: '%s' at line %d.\n", clevel, v->lineno);
continue; continue;

View File

@ -692,15 +692,15 @@ struct dahdi_pvt {
openr2_calling_party_category_t mfcr2_category; openr2_calling_party_category_t mfcr2_category;
int mfcr2_dnis_index; int mfcr2_dnis_index;
int mfcr2_ani_index; int mfcr2_ani_index;
int mfcr2call:1; unsigned int mfcr2call:1;
int mfcr2_answer_pending:1; unsigned int mfcr2_answer_pending:1;
int mfcr2_charge_calls:1; unsigned int mfcr2_charge_calls:1;
int mfcr2_allow_collect_calls:1; unsigned int mfcr2_allow_collect_calls:1;
int mfcr2_forced_release:1; unsigned int mfcr2_forced_release:1;
int mfcr2_dnis_matched:1; unsigned int mfcr2_dnis_matched:1;
int mfcr2_call_accepted:1; unsigned int mfcr2_call_accepted:1;
int mfcr2_accept_on_offer:1; unsigned int mfcr2_accept_on_offer:1;
int mfcr2_progress_sent:1; unsigned int mfcr2_progress_sent:1;
#endif /* defined(HAVE_OPENR2) */ #endif /* defined(HAVE_OPENR2) */
/*! \brief DTMF digit in progress. 0 when no digit in progress. */ /*! \brief DTMF digit in progress. 0 when no digit in progress. */
char begindigit; char begindigit;

View File

@ -2086,15 +2086,16 @@ static int jingle_interpret_description(struct jingle_session *session, iks *des
/* Iterate the codecs updating the relevant RTP instance as we go */ /* Iterate the codecs updating the relevant RTP instance as we go */
for (codec = iks_child(description); codec; codec = iks_next(codec)) { for (codec = iks_child(description); codec; codec = iks_next(codec)) {
char *id = iks_find_attrib(codec, "id"), *name = iks_find_attrib(codec, "name"); char *id = iks_find_attrib(codec, "id");
char *attr_name = iks_find_attrib(codec, "name");
char *clockrate = iks_find_attrib(codec, "clockrate"); char *clockrate = iks_find_attrib(codec, "clockrate");
int rtp_id, rtp_clockrate; int rtp_id, rtp_clockrate;
if (!ast_strlen_zero(id) && !ast_strlen_zero(name) && (sscanf(id, "%30d", &rtp_id) == 1)) { if (!ast_strlen_zero(id) && !ast_strlen_zero(attr_name) && (sscanf(id, "%30d", &rtp_id) == 1)) {
if (!ast_strlen_zero(clockrate) && (sscanf(clockrate, "%30d", &rtp_clockrate) == 1)) { if (!ast_strlen_zero(clockrate) && (sscanf(clockrate, "%30d", &rtp_clockrate) == 1)) {
ast_rtp_codecs_payloads_set_rtpmap_type_rate(&codecs, NULL, rtp_id, media, name, 0, rtp_clockrate); ast_rtp_codecs_payloads_set_rtpmap_type_rate(&codecs, NULL, rtp_id, media, attr_name, 0, rtp_clockrate);
} else { } else {
ast_rtp_codecs_payloads_set_rtpmap_type(&codecs, NULL, rtp_id, media, name, 0); ast_rtp_codecs_payloads_set_rtpmap_type(&codecs, NULL, rtp_id, media, attr_name, 0);
} }
} }
} }

View File

@ -7,6 +7,9 @@
* *
*/ */
#ifndef ASTERISK_EX_ALAW_H
#define ASTERISK_EX_ALAW_H
static uint8_t ex_alaw[] = { static uint8_t ex_alaw[] = {
0x00, 0x03, 0x06, 0x09, 0x0c, 0x0f, 0x12, 0x15, 0x00, 0x03, 0x06, 0x09, 0x0c, 0x0f, 0x12, 0x15,
0x10, 0x18, 0x1b, 0x1e, 0x21, 0x24, 0x27, 0x2a, 0x10, 0x18, 0x1b, 0x1e, 0x21, 0x24, 0x27, 0x2a,
@ -34,3 +37,5 @@ static struct ast_frame *alaw_sample(void)
f.subclass.format = ast_format_alaw; f.subclass.format = ast_format_alaw;
return &f; return &f;
} }
#endif /* ASTERISK_EX_ALAW_H */

View File

@ -7,6 +7,9 @@
* *
*/ */
#ifndef ASTERISK_EX_G722_H
#define ASTERISK_EX_G722_H
static uint8_t ex_g722[] = { static uint8_t ex_g722[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@ -46,3 +49,5 @@ static struct ast_frame *g722_sample(void)
return &f; return &f;
} }
#endif /* ASTERISK_EX_G722_H */

View File

@ -7,6 +7,9 @@
* *
*/ */
#ifndef ASTERISK_EX_ULAW_H
#define ASTERISK_EX_ULAW_H
static uint8_t ex_ulaw[] = { static uint8_t ex_ulaw[] = {
0x00, 0x03, 0x06, 0x09, 0x0c, 0x0f, 0x12, 0x15, 0x00, 0x03, 0x06, 0x09, 0x0c, 0x0f, 0x12, 0x15,
0x10, 0x18, 0x1b, 0x1e, 0x21, 0x24, 0x27, 0x2a, 0x10, 0x18, 0x1b, 0x1e, 0x21, 0x24, 0x27, 0x2a,
@ -36,3 +39,5 @@ static struct ast_frame *ulaw_sample(void)
return &f; return &f;
} }
#endif /* ASTERISK_EX_ULAW_H */

View File

@ -199,7 +199,7 @@ static off_t g726_tell(struct ast_filestream *fs)
return ftello(fs->f) << 1; return ftello(fs->f) << 1;
} }
static struct ast_format_def f[] = { static struct ast_format_def f_def[] = {
{ {
.name = "g726-40", .name = "g726-40",
.exts = "g726-40", .exts = "g726-40",
@ -259,9 +259,9 @@ static int unload_module(void)
{ {
int i; int i;
for (i = 0; f[i].desc_size ; i++) { for (i = 0; f_def[i].desc_size ; i++) {
if (ast_format_def_unregister(f[i].name)) if (ast_format_def_unregister(f_def[i].name))
ast_log(LOG_WARNING, "Failed to unregister format %s.\n", f[i].name); ast_log(LOG_WARNING, "Failed to unregister format %s.\n", f_def[i].name);
} }
return(0); return(0);
} }
@ -270,10 +270,10 @@ static int load_module(void)
{ {
int i; int i;
for (i = 0; f[i].desc_size ; i++) { for (i = 0; f_def[i].desc_size ; i++) {
f[i].format = ast_format_g726; f_def[i].format = ast_format_g726;
if (ast_format_def_register(&f[i])) { /* errors are fatal */ if (ast_format_def_register(&f_def[i])) { /* errors are fatal */
ast_log(LOG_WARNING, "Failed to register format %s.\n", f[i].name); ast_log(LOG_WARNING, "Failed to register format %s.\n", f_def[i].name);
unload_module(); unload_module();
return AST_MODULE_LOAD_DECLINE; return AST_MODULE_LOAD_DECLINE;
} }

View File

@ -1,4 +1,6 @@
/* Conversion routines derived from code by guido@sienanet.it */ /* Conversion routines derived from code by guido@sienanet.it */
#ifndef ASTERISK_MSGSM_H
#define ASTERISK_MSGSM_H
#define GSM_MAGIC 0xD #define GSM_MAGIC 0xD
@ -687,3 +689,5 @@ static inline void conv65( wav_byte * c, gsm_byte * d){
writeGSM_33(d+33); writeGSM_33(d+33);
} }
#endif /* ASTERISK_MSGSM_H */

View File

@ -101,7 +101,7 @@ struct ast_ari_response {
/*! Corresponding text for the response code */ /*! Corresponding text for the response code */
const char *response_text; /* Shouldn't http.c handle this? */ const char *response_text; /* Shouldn't http.c handle this? */
/*! Flag to indicate that no further response is needed */ /*! Flag to indicate that no further response is needed */
int no_response:1; unsigned int no_response:1;
}; };
/*! /*!

View File

@ -133,8 +133,8 @@ struct ast_calendar {
int timeframe; /*!< Span (in mins) of calendar data to pull with each request */ int timeframe; /*!< Span (in mins) of calendar data to pull with each request */
pthread_t thread; /*!< The thread that the calendar is loaded/updated in */ pthread_t thread; /*!< The thread that the calendar is loaded/updated in */
ast_cond_t unload; ast_cond_t unload;
int unloading:1; unsigned int unloading:1;
int pending_deletion:1; unsigned int pending_deletion:1;
struct ao2_container *events; /*!< The events that are known at this time */ struct ao2_container *events; /*!< The events that are known at this time */
}; };

View File

@ -18,6 +18,9 @@
* \brief Internal channel functions for channel.c to use * \brief Internal channel functions for channel.c to use
*/ */
#ifndef ASTERISK_CHANNEL_INTERNAL_H
#define ASTERISK_CHANNEL_INTERNAL_H
#define ast_channel_internal_alloc(destructor, assignedid, requestor) __ast_channel_internal_alloc(destructor, assignedid, requestor, __FILE__, __LINE__, __PRETTY_FUNCTION__) #define ast_channel_internal_alloc(destructor, assignedid, requestor) __ast_channel_internal_alloc(destructor, assignedid, requestor, __FILE__, __LINE__, __PRETTY_FUNCTION__)
struct ast_channel *__ast_channel_internal_alloc(void (*destructor)(void *obj), const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *file, int line, const char *function); struct ast_channel *__ast_channel_internal_alloc(void (*destructor)(void *obj), const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *file, int line, const char *function);
void ast_channel_internal_finalize(struct ast_channel *chan); void ast_channel_internal_finalize(struct ast_channel *chan);
@ -33,3 +36,5 @@ void ast_channel_internal_set_stream_topology_change_source(
struct ast_channel *chan, void *change_source); struct ast_channel *chan, void *change_source);
void ast_channel_internal_swap_stream_topology(struct ast_channel *chan1, void ast_channel_internal_swap_stream_topology(struct ast_channel *chan1,
struct ast_channel *chan2); struct ast_channel *chan2);
#endif /* ASTERISK_CHANNEL_INTERNAL_H */

View File

@ -168,7 +168,7 @@ struct aco_file {
struct aco_info { struct aco_info {
const char *module; /*!< The name of the module whose config is being processed */ const char *module; /*!< The name of the module whose config is being processed */
int hidden:1; /*!< If enabled, this config item is hidden from users */ unsigned int hidden:1; /*!< If enabled, this config item is hidden from users */
aco_pre_apply_config pre_apply_config; /*!< A callback called after processing, but before changes are applied */ aco_pre_apply_config pre_apply_config; /*!< A callback called after processing, but before changes are applied */
aco_post_apply_config post_apply_config;/*!< A callback called after changes are applied */ aco_post_apply_config post_apply_config;/*!< A callback called after changes are applied */
aco_snapshot_alloc snapshot_alloc; /*!< Allocate an object to hold all global configs and item containers */ aco_snapshot_alloc snapshot_alloc; /*!< Allocate an object to hold all global configs and item containers */

View File

@ -23,6 +23,9 @@
* \author Joshua Colp <jcolp@digium.com> * \author Joshua Colp <jcolp@digium.com>
*/ */
#ifndef _ASTERISK_DNS_INTERNAL_H
#define _ASTERISK_DNS_INTERNAL_H
/*! \brief For AST_VECTOR */ /*! \brief For AST_VECTOR */
#include "asterisk/vector.h" #include "asterisk/vector.h"
@ -293,3 +296,5 @@ int dns_parse_string(char *cur, uint8_t *size, char **val);
* \note The query must be released upon completion or cancellation using ao2_ref * \note The query must be released upon completion or cancellation using ao2_ref
*/ */
struct ast_dns_query *dns_query_alloc(const char *name, int rr_type, int rr_class, ast_dns_resolve_callback callback, void *data); struct ast_dns_query *dns_query_alloc(const char *name, int rr_type, int rr_class, ast_dns_resolve_callback callback, void *data);
#endif /* _ASTERISK_DNS_INTERNAL_H */

View File

@ -17,6 +17,7 @@
*/ */
#ifndef MAX_FORWARDS_H #ifndef MAX_FORWARDS_H
#define MAX_FORWARDS_H
struct ast_channel; struct ast_channel;

View File

@ -23,6 +23,9 @@
* \author Jonathan Rose <jrose@digium.com> * \author Jonathan Rose <jrose@digium.com>
*/ */
#ifndef ASTERISK_MIX_MONITOR_H
#define ASTERISK_MIX_MONITOR_H
/*! /*!
* \brief Start a mixmonitor on a channel. * \brief Start a mixmonitor on a channel.
* \since 12.0.0 * \since 12.0.0
@ -103,3 +106,5 @@ int ast_start_mixmonitor(struct ast_channel *chan, const char *filename, const c
* \retval non-zero on failure * \retval non-zero on failure
*/ */
int ast_stop_mixmonitor(struct ast_channel *chan, const char *mixmon_id); int ast_stop_mixmonitor(struct ast_channel *chan, const char *mixmon_id);
#endif /* ASTERISK_MIX_MONITOR_H */

View File

@ -23,6 +23,9 @@
* \author Jonathan Rose <jrose@digium.com> * \author Jonathan Rose <jrose@digium.com>
*/ */
#ifndef ASTERISK_PARKING_H
#define ASTERISK_PARKING_H
#include "asterisk/stringfields.h" #include "asterisk/stringfields.h"
#include "asterisk/bridge.h" #include "asterisk/bridge.h"
@ -294,3 +297,5 @@ int ast_parking_unregister_bridge_features(const char *module_name);
* \retval 1 if there is a parking provider regsistered * \retval 1 if there is a parking provider regsistered
*/ */
int ast_parking_provider_registered(void); int ast_parking_provider_registered(void);
#endif /* ASTERISK_PARKING_H */

View File

@ -30,6 +30,9 @@
* This constant is useful to check against when trying to determine * This constant is useful to check against when trying to determine
* if printing XML succeeded or failed. * if printing XML succeeded or failed.
*/ */
#ifndef ASTERISK_PJSIP_PRESENCE_XML_H
#define ASTERISK_PJSIP_PRESENCE_XML_H
#define AST_PJSIP_XML_PROLOG_LEN 39 #define AST_PJSIP_XML_PROLOG_LEN 39
/*! /*!
@ -115,3 +118,5 @@ pj_xml_node *ast_sip_presence_xml_create_node(pj_pool_t *pool,
void ast_sip_presence_xml_find_node_attr(pj_pool_t* pool, void ast_sip_presence_xml_find_node_attr(pj_pool_t* pool,
pj_xml_node *parent, const char *node_name, const char *attr_name, pj_xml_node *parent, const char *node_name, const char *attr_name,
pj_xml_node **node, pj_xml_attr **attr); pj_xml_node **node, pj_xml_attr **attr);
#endif /* ASTERISK_PJSIP_PRESENCE_XML_H */

View File

@ -22,6 +22,9 @@
* Samples were truncated at 160 and 320 bytes. * Samples were truncated at 160 and 320 bytes.
*/ */
#ifndef ASTERISK_SLIN_H
#define ASTERISK_SLIN_H
static uint16_t ex_slin8[] = { static uint16_t ex_slin8[] = {
0x0002, 0xfffc, 0x0000, 0xfffe, 0x0000, 0xfffa, 0x002a, 0x007a, 0x0002, 0xfffc, 0x0000, 0xfffe, 0x0000, 0xfffa, 0x002a, 0x007a,
0x003a, 0xffbe, 0xff76, 0xff84, 0x0016, 0x007e, 0x0096, 0x00d2, 0x003a, 0xffbe, 0xff76, 0xff84, 0x0016, 0x007e, 0x0096, 0x00d2,
@ -91,3 +94,5 @@ static inline struct ast_frame *slin16_sample(void)
return &f; return &f;
} }
#endif /* ASTERISK_SLIN_H */

View File

@ -1504,7 +1504,7 @@ static int __ast_play_and_record(struct ast_channel *chan, const char *playfile,
char comment[256]; char comment[256];
int x, fmtcnt = 1, res = -1, outmsg = 0; int x, fmtcnt = 1, res = -1, outmsg = 0;
struct ast_filestream *others[AST_MAX_FORMATS]; struct ast_filestream *others[AST_MAX_FORMATS];
char *sfmt[AST_MAX_FORMATS]; const char *sfmt[AST_MAX_FORMATS];
char *stringp = NULL; char *stringp = NULL;
time_t start, end; time_t start, end;
struct ast_dsp *sildet = NULL; /* silence detector dsp */ struct ast_dsp *sildet = NULL; /* silence detector dsp */
@ -1579,7 +1579,12 @@ static int __ast_play_and_record(struct ast_channel *chan, const char *playfile,
ast_log(LOG_WARNING, "Please increase AST_MAX_FORMATS in file.h\n"); ast_log(LOG_WARNING, "Please increase AST_MAX_FORMATS in file.h\n");
break; break;
} }
sfmt[fmtcnt++] = ast_strdupa(fmt); /*
* Storage for 'fmt' is on the stack and held by 'fmts', which is maintained for
* the rest of this function. So okay to not duplicate 'fmt' here, but only keep
* a pointer to it.
*/
sfmt[fmtcnt++] = fmt;
} }
end = start = time(NULL); /* pre-initialize end to be same as start in case we never get into loop */ end = start = time(NULL); /* pre-initialize end to be same as start in case we never get into loop */

View File

@ -3491,10 +3491,11 @@ static void main_atexit(void)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int c; int c;
char * xarg = NULL;
int x; int x;
int isroot = 1, rundir_exists = 0; int isroot = 1, rundir_exists = 0;
const char *runuser = NULL, *rungroup = NULL; RAII_VAR(char *, runuser, NULL, ast_free);
RAII_VAR(char *, rungroup, NULL, ast_free);
RAII_VAR(char *, xarg, NULL, ast_free);
struct rlimit l; struct rlimit l;
static const char *getopt_settings = "BC:cde:FfG:ghIiL:M:mnpqRrs:TtU:VvWXx:"; static const char *getopt_settings = "BC:cde:FfG:ghIiL:M:mnpqRrs:TtU:VvWXx:";
@ -3599,7 +3600,7 @@ int main(int argc, char *argv[])
break; break;
#endif #endif
case 'G': case 'G':
rungroup = ast_strdupa(optarg); rungroup = ast_strdup(optarg);
break; break;
case 'g': case 'g':
ast_set_flag(&ast_options, AST_OPT_FLAG_DUMP_CORE); ast_set_flag(&ast_options, AST_OPT_FLAG_DUMP_CORE);
@ -3655,7 +3656,7 @@ int main(int argc, char *argv[])
ast_set_flag(&ast_options, AST_OPT_FLAG_CACHE_RECORD_FILES); ast_set_flag(&ast_options, AST_OPT_FLAG_CACHE_RECORD_FILES);
break; break;
case 'U': case 'U':
runuser = ast_strdupa(optarg); runuser = ast_strdup(optarg);
break; break;
case 'V': case 'V':
case 'v': case 'v':
@ -3670,7 +3671,7 @@ int main(int argc, char *argv[])
ast_set_flag(&ast_options, AST_OPT_FLAG_NO_FORK | AST_OPT_FLAG_REMOTE); ast_set_flag(&ast_options, AST_OPT_FLAG_NO_FORK | AST_OPT_FLAG_REMOTE);
ast_set_flag(&ast_options, AST_OPT_FLAG_EXEC | AST_OPT_FLAG_NO_COLOR); ast_set_flag(&ast_options, AST_OPT_FLAG_EXEC | AST_OPT_FLAG_NO_COLOR);
xarg = ast_strdupa(optarg); xarg = ast_strdup(optarg);
break; break;
case '?': case '?':
/* already processed. */ /* already processed. */
@ -3749,9 +3750,9 @@ int main(int argc, char *argv[])
#endif /* !defined(CONFIGURE_RAN_AS_ROOT) */ #endif /* !defined(CONFIGURE_RAN_AS_ROOT) */
if ((!rungroup) && !ast_strlen_zero(ast_config_AST_RUN_GROUP)) if ((!rungroup) && !ast_strlen_zero(ast_config_AST_RUN_GROUP))
rungroup = ast_config_AST_RUN_GROUP; rungroup = ast_strdup(ast_config_AST_RUN_GROUP);
if ((!runuser) && !ast_strlen_zero(ast_config_AST_RUN_USER)) if ((!runuser) && !ast_strlen_zero(ast_config_AST_RUN_USER))
runuser = ast_config_AST_RUN_USER; runuser = ast_strdup(ast_config_AST_RUN_USER);
/* Must install this signal handler up here to ensure that if the canary /* Must install this signal handler up here to ensure that if the canary
* fails to execute that it doesn't kill the Asterisk process. * fails to execute that it doesn't kill the Asterisk process.

View File

@ -419,7 +419,7 @@ struct ast_event *ast_event_new(enum ast_event_type type, ...)
ie_type != AST_EVENT_IE_END; ie_type != AST_EVENT_IE_END;
ie_type = va_arg(ap, enum ast_event_ie_type)) ie_type = va_arg(ap, enum ast_event_ie_type))
{ {
struct ast_event_ie_val *ie_value = ast_alloca(sizeof(*ie_value)); struct ast_event_ie_val *ie_value = ast_malloc(sizeof(*ie_value));
int insert = 0; int insert = 0;
memset(ie_value, 0, sizeof(*ie_value)); memset(ie_value, 0, sizeof(*ie_value));
@ -443,7 +443,7 @@ struct ast_event *ast_event_new(enum ast_event_type type, ...)
{ {
void *data = va_arg(ap, void *); void *data = va_arg(ap, void *);
size_t datalen = va_arg(ap, size_t); size_t datalen = va_arg(ap, size_t);
ie_value->payload.raw = ast_alloca(datalen); ie_value->payload.raw = ast_malloc(datalen);
memcpy(ie_value->payload.raw, data, datalen); memcpy(ie_value->payload.raw, data, datalen);
ie_value->raw_datalen = datalen; ie_value->raw_datalen = datalen;
insert = 1; insert = 1;
@ -491,7 +491,7 @@ struct ast_event *ast_event_new(enum ast_event_type type, ...)
/* realloc inside one of the append functions failed */ /* realloc inside one of the append functions failed */
if (!event) { if (!event) {
return NULL; goto cleanup;
} }
} }
@ -501,6 +501,17 @@ struct ast_event *ast_event_new(enum ast_event_type type, ...)
ast_event_append_eid(&event); ast_event_append_eid(&event);
} }
cleanup:
AST_LIST_TRAVERSE_SAFE_BEGIN(&ie_vals, ie_val, entry) {
AST_LIST_REMOVE_CURRENT(entry);
if (ie_val->ie_pltype == AST_EVENT_IE_PLTYPE_RAW) {
ast_free(ie_val->payload.raw);
}
ast_free(ie_val);
}
AST_LIST_TRAVERSE_SAFE_END;
return event; return event;
} }

View File

@ -517,7 +517,9 @@ static int filehelper(const char *filename, const void *arg2, const char *fmt, c
AST_RWLIST_RDLOCK(&formats); AST_RWLIST_RDLOCK(&formats);
/* Check for a specific format */ /* Check for a specific format */
AST_RWLIST_TRAVERSE(&formats, f, list) { AST_RWLIST_TRAVERSE(&formats, f, list) {
char *stringp, *ext = NULL; char *ext = NULL;
char storage[strlen(f->exts) + 1];
char *stringp;
if (fmt && !exts_compare(f->exts, fmt)) if (fmt && !exts_compare(f->exts, fmt))
continue; continue;
@ -526,7 +528,8 @@ static int filehelper(const char *filename, const void *arg2, const char *fmt, c
* The file must exist, and for OPEN, must match * The file must exist, and for OPEN, must match
* one of the formats supported by the channel. * one of the formats supported by the channel.
*/ */
stringp = ast_strdupa(f->exts); /* this is in the stack so does not need to be freed */ strcpy(storage, f->exts); /* safe - this is in the stack so does not need to be freed */
stringp = storage;
while ( (ext = strsep(&stringp, "|")) ) { while ( (ext = strsep(&stringp, "|")) ) {
struct stat st; struct stat st;
char *fn = build_filename(filename, ext); char *fn = build_filename(filename, ext);
@ -1407,13 +1410,13 @@ struct ast_filestream *ast_writefile(const char *filename, const char *type, con
We touch orig_fn just as a place-holder so other things (like vmail) see the file is there. We touch orig_fn just as a place-holder so other things (like vmail) see the file is there.
What we are really doing is writing to record_cache_dir until we are done then we will mv the file into place. What we are really doing is writing to record_cache_dir until we are done then we will mv the file into place.
*/ */
orig_fn = ast_strdupa(fn); orig_fn = ast_strdup(fn);
for (c = fn; *c; c++) for (c = fn; *c; c++)
if (*c == '/') if (*c == '/')
*c = '_'; *c = '_';
size = strlen(fn) + strlen(record_cache_dir) + 2; size = strlen(fn) + strlen(record_cache_dir) + 2;
buf = ast_alloca(size); buf = ast_malloc(size);
strcpy(buf, record_cache_dir); strcpy(buf, record_cache_dir);
strcat(buf, "/"); strcat(buf, "/");
strcat(buf, fn); strcat(buf, fn);
@ -1444,14 +1447,18 @@ struct ast_filestream *ast_writefile(const char *filename, const char *type, con
if (orig_fn) { if (orig_fn) {
unlink(fn); unlink(fn);
unlink(orig_fn); unlink(orig_fn);
ast_free(orig_fn);
} }
if (fs) { if (fs) {
ast_closestream(fs); ast_closestream(fs);
fs = NULL; fs = NULL;
} }
if (!buf) { /*
ast_free(fn); * 'fn' was has either been allocated from build_filename, or that was freed
} * and now 'fn' points to memory allocated for 'buf'. Either way the memory
* now needs to be released.
*/
ast_free(fn);
continue; continue;
} }
fs->trans = NULL; fs->trans = NULL;
@ -1459,8 +1466,14 @@ struct ast_filestream *ast_writefile(const char *filename, const char *type, con
fs->flags = flags; fs->flags = flags;
fs->mode = mode; fs->mode = mode;
if (orig_fn) { if (orig_fn) {
fs->realfilename = ast_strdup(orig_fn); fs->realfilename = orig_fn;
fs->filename = ast_strdup(fn); fs->filename = fn;
/*
* The above now manages the memory allocated for 'orig_fn' and 'fn', so
* set them to NULL, so they don't get released at the end of the loop.
*/
orig_fn = NULL;
fn = NULL;
} else { } else {
fs->realfilename = NULL; fs->realfilename = NULL;
fs->filename = ast_strdup(filename); fs->filename = ast_strdup(filename);
@ -1473,9 +1486,9 @@ struct ast_filestream *ast_writefile(const char *filename, const char *type, con
if (orig_fn) if (orig_fn)
unlink(orig_fn); unlink(orig_fn);
} }
/* if buf != NULL then fn is already free and pointing to it */ /* Free 'fn', or if 'fn' points to 'buf' then free 'buf' */
if (!buf) ast_free(fn);
ast_free(fn); ast_free(orig_fn);
} }
AST_RWLIST_UNLOCK(&formats); AST_RWLIST_UNLOCK(&formats);

View File

@ -904,11 +904,11 @@ static void store_tone_zone_ring_cadence(struct ast_tone_zone *zone, const char
ast_copy_string(buf, val, sizeof(buf)); ast_copy_string(buf, val, sizeof(buf));
while ((ring = strsep(&c, ","))) { while ((ring = strsep(&c, ","))) {
int *tmp, val; int *tmp, value;
ring = ast_strip(ring); ring = ast_strip(ring);
if (!isdigit(ring[0]) || (val = atoi(ring)) == -1) { if (!isdigit(ring[0]) || (value = atoi(ring)) == -1) {
ast_log(LOG_WARNING, "Invalid ringcadence given '%s'.\n", ring); ast_log(LOG_WARNING, "Invalid ringcadence given '%s'.\n", ring);
continue; continue;
} }
@ -918,7 +918,7 @@ static void store_tone_zone_ring_cadence(struct ast_tone_zone *zone, const char
} }
zone->ringcadence = tmp; zone->ringcadence = tmp;
tmp[zone->nrringcadence] = val; tmp[zone->nrringcadence] = value;
zone->nrringcadence++; zone->nrringcadence++;
} }
} }

View File

@ -1619,7 +1619,7 @@ struct mansession {
struct ast_iostream *stream; struct ast_iostream *stream;
struct ast_tcptls_session_instance *tcptls_session; struct ast_tcptls_session_instance *tcptls_session;
enum mansession_message_parsing parsing; enum mansession_message_parsing parsing;
int write_error:1; unsigned int write_error:1;
struct manager_custom_hook *hook; struct manager_custom_hook *hook;
ast_mutex_t lock; ast_mutex_t lock;
}; };
@ -3820,8 +3820,8 @@ static enum error_type handle_updates(struct mansession *s, const struct message
int allowdups = 0; int allowdups = 0;
int istemplate = 0; int istemplate = 0;
int ignoreerror = 0; int ignoreerror = 0;
char *inherit = NULL; RAII_VAR(char *, inherit, NULL, ast_free);
char *catfilter = NULL; RAII_VAR(char *, catfilter, NULL, ast_free);
char *token; char *token;
int foundvar = 0; int foundvar = 0;
int foundcat = 0; int foundcat = 0;
@ -3859,7 +3859,9 @@ static enum error_type handle_updates(struct mansession *s, const struct message
snprintf(hdr, sizeof(hdr), "Options-%06d", x); snprintf(hdr, sizeof(hdr), "Options-%06d", x);
options = astman_get_header(m, hdr); options = astman_get_header(m, hdr);
if (!ast_strlen_zero(options)) { if (!ast_strlen_zero(options)) {
dupoptions = ast_strdupa(options); char copy[strlen(options) + 1];
strcpy(copy, options); /* safe */
dupoptions = copy;
while ((token = ast_strsep(&dupoptions, ',', AST_STRSEP_STRIP))) { while ((token = ast_strsep(&dupoptions, ',', AST_STRSEP_STRIP))) {
if (!strcasecmp("allowdups", token)) { if (!strcasecmp("allowdups", token)) {
allowdups = 1; allowdups = 1;
@ -3877,7 +3879,7 @@ static enum error_type handle_updates(struct mansession *s, const struct message
char *c = ast_strsep(&token, '=', AST_STRSEP_STRIP); char *c = ast_strsep(&token, '=', AST_STRSEP_STRIP);
c = ast_strsep(&token, '=', AST_STRSEP_STRIP); c = ast_strsep(&token, '=', AST_STRSEP_STRIP);
if (c) { if (c) {
inherit = ast_strdupa(c); inherit = ast_strdup(c);
} }
continue; continue;
} }
@ -3885,7 +3887,7 @@ static enum error_type handle_updates(struct mansession *s, const struct message
char *c = ast_strsep(&token, '=', AST_STRSEP_STRIP); char *c = ast_strsep(&token, '=', AST_STRSEP_STRIP);
c = ast_strsep(&token, '=', AST_STRSEP_STRIP); c = ast_strsep(&token, '=', AST_STRSEP_STRIP);
if (c) { if (c) {
catfilter = ast_strdupa(c); catfilter = ast_strdup(c);
} }
continue; continue;
} }

View File

@ -630,9 +630,8 @@ void pbx_substitute_variables_helper_full(struct ast_channel *c, struct varshead
/* Substitutes variables into cp2, based on string cp1, cp2 NO LONGER NEEDS TO BE ZEROED OUT!!!! */ /* Substitutes variables into cp2, based on string cp1, cp2 NO LONGER NEEDS TO BE ZEROED OUT!!!! */
const char *whereweare; const char *whereweare;
const char *orig_cp2 = cp2; const char *orig_cp2 = cp2;
char *workspace = NULL; char ltmp[VAR_BUF_SIZE];
char *ltmp = NULL; char var[VAR_BUF_SIZE];
char *var = NULL;
*cp2 = 0; /* just in case nothing ends up there */ *cp2 = 0; /* just in case nothing ends up there */
whereweare = cp1; whereweare = cp1;
@ -690,6 +689,7 @@ void pbx_substitute_variables_helper_full(struct ast_channel *c, struct varshead
int offset2; int offset2;
int isfunction; int isfunction;
char *cp4; char *cp4;
char workspace[VAR_BUF_SIZE] = "";
/* We have a variable. Find the start and end, and determine /* We have a variable. Find the start and end, and determine
if we are going to have to recursively call ourselves on the if we are going to have to recursively call ourselves on the
@ -725,28 +725,17 @@ void pbx_substitute_variables_helper_full(struct ast_channel *c, struct varshead
/* Skip totally over variable string */ /* Skip totally over variable string */
whereweare = vare; whereweare = vare;
if (!var)
var = ast_alloca(VAR_BUF_SIZE);
/* Store variable name expression to lookup (and truncate). */ /* Store variable name expression to lookup (and truncate). */
ast_copy_string(var, vars, len + 1); ast_copy_string(var, vars, len + 1);
/* Substitute if necessary */ /* Substitute if necessary */
if (needsub) { if (needsub) {
if (!ltmp) {
ltmp = ast_alloca(VAR_BUF_SIZE);
}
pbx_substitute_variables_helper_full(c, headp, var, ltmp, VAR_BUF_SIZE - 1, NULL); pbx_substitute_variables_helper_full(c, headp, var, ltmp, VAR_BUF_SIZE - 1, NULL);
vars = ltmp; vars = ltmp;
} else { } else {
vars = var; vars = var;
} }
if (!workspace)
workspace = ast_alloca(VAR_BUF_SIZE);
workspace[0] = '\0';
parse_variable_name(vars, &offset, &offset2, &isfunction); parse_variable_name(vars, &offset, &offset2, &isfunction);
if (isfunction) { if (isfunction) {
/* Evaluate function */ /* Evaluate function */
@ -820,17 +809,11 @@ void pbx_substitute_variables_helper_full(struct ast_channel *c, struct varshead
/* Skip totally over expression */ /* Skip totally over expression */
whereweare = vare; whereweare = vare;
if (!var)
var = ast_alloca(VAR_BUF_SIZE);
/* Store expression to evaluate (and truncate). */ /* Store expression to evaluate (and truncate). */
ast_copy_string(var, vars, len + 1); ast_copy_string(var, vars, len + 1);
/* Substitute if necessary */ /* Substitute if necessary */
if (needsub) { if (needsub) {
if (!ltmp) {
ltmp = ast_alloca(VAR_BUF_SIZE);
}
pbx_substitute_variables_helper_full(c, headp, var, ltmp, VAR_BUF_SIZE - 1, NULL); pbx_substitute_variables_helper_full(c, headp, var, ltmp, VAR_BUF_SIZE - 1, NULL);
vars = ltmp; vars = ltmp;
} else { } else {

View File

@ -301,7 +301,7 @@
#define TOPIC_POOL_BUCKETS 57 #define TOPIC_POOL_BUCKETS 57
/*! Thread pool for topics that don't want a dedicated taskprocessor */ /*! Thread pool for topics that don't want a dedicated taskprocessor */
static struct ast_threadpool *pool; static struct ast_threadpool *threadpool;
STASIS_MESSAGE_TYPE_DEFN(stasis_subscription_change_type); STASIS_MESSAGE_TYPE_DEFN(stasis_subscription_change_type);
@ -900,7 +900,7 @@ struct stasis_subscription *internal_stasis_subscribe(
* pool should be used. * pool should be used.
*/ */
if (use_thread_pool) { if (use_thread_pool) {
sub->mailbox = ast_threadpool_serializer(tps_name, pool); sub->mailbox = ast_threadpool_serializer(tps_name, threadpool);
} else { } else {
sub->mailbox = ast_taskprocessor_get(tps_name, TPS_REF_DEFAULT); sub->mailbox = ast_taskprocessor_get(tps_name, TPS_REF_DEFAULT);
} }
@ -3027,8 +3027,8 @@ static void stasis_cleanup(void)
ast_cli_unregister_multiple(cli_stasis, ARRAY_LEN(cli_stasis)); ast_cli_unregister_multiple(cli_stasis, ARRAY_LEN(cli_stasis));
ao2_cleanup(topic_all); ao2_cleanup(topic_all);
topic_all = NULL; topic_all = NULL;
ast_threadpool_shutdown(pool); ast_threadpool_shutdown(threadpool);
pool = NULL; threadpool = NULL;
STASIS_MESSAGE_TYPE_CLEANUP(stasis_subscription_change_type); STASIS_MESSAGE_TYPE_CLEANUP(stasis_subscription_change_type);
STASIS_MESSAGE_TYPE_CLEANUP(ast_multi_user_event_type); STASIS_MESSAGE_TYPE_CLEANUP(ast_multi_user_event_type);
aco_info_destroy(&cfg_info); aco_info_destroy(&cfg_info);
@ -3105,9 +3105,9 @@ int stasis_init(void)
threadpool_opts.auto_increment = 1; threadpool_opts.auto_increment = 1;
threadpool_opts.max_size = cfg->threadpool_options->max_size; threadpool_opts.max_size = cfg->threadpool_options->max_size;
threadpool_opts.idle_timeout = cfg->threadpool_options->idle_timeout_sec; threadpool_opts.idle_timeout = cfg->threadpool_options->idle_timeout_sec;
pool = ast_threadpool_create("stasis", NULL, &threadpool_opts); threadpool = ast_threadpool_create("stasis", NULL, &threadpool_opts);
ao2_ref(cfg, -1); ao2_ref(cfg, -1);
if (!pool) { if (!threadpool) {
ast_log(LOG_ERROR, "Failed to create 'stasis-core' threadpool\n"); ast_log(LOG_ERROR, "Failed to create 'stasis-core' threadpool\n");
return -1; return -1;

View File

@ -863,13 +863,13 @@ static void caching_topic_exec(void *data, struct stasis_subscription *sub,
* continue to grow unabated. * continue to grow unabated.
*/ */
if (strcmp(change->description, "Unsubscribe") == 0) { if (strcmp(change->description, "Unsubscribe") == 0) {
struct stasis_cache_entry *sub; struct stasis_cache_entry *cached_sub;
ao2_wrlock(caching_topic->cache->entries); ao2_wrlock(caching_topic->cache->entries);
sub = cache_find(caching_topic->cache->entries, stasis_subscription_change_type(), change->uniqueid); cached_sub = cache_find(caching_topic->cache->entries, stasis_subscription_change_type(), change->uniqueid);
if (sub) { if (cached_sub) {
ao2_cleanup(cache_remove(caching_topic->cache->entries, sub, stasis_message_eid(message))); ao2_cleanup(cache_remove(caching_topic->cache->entries, cached_sub, stasis_message_eid(message)));
ao2_cleanup(sub); ao2_cleanup(cached_sub);
} }
ao2_unlock(caching_topic->cache->entries); ao2_unlock(caching_topic->cache->entries);
ao2_cleanup(caching_topic_needs_unref); ao2_cleanup(caching_topic_needs_unref);

View File

@ -165,7 +165,7 @@ static struct aco_type user_option = {
.item_offset = offsetof(struct ast_ari_conf, users), .item_offset = offsetof(struct ast_ari_conf, users),
}; };
static struct aco_type *user[] = ACO_TYPES(&user_option); static struct aco_type *global_user[] = ACO_TYPES(&user_option);
static void conf_general_dtor(void *obj) static void conf_general_dtor(void *obj)
{ {
@ -361,16 +361,16 @@ int ast_ari_config_init(void)
"", channelvars_handler, 0); "", channelvars_handler, 0);
/* ARI type=user category options */ /* ARI type=user category options */
aco_option_register(&cfg_info, "type", ACO_EXACT, user, NULL, aco_option_register(&cfg_info, "type", ACO_EXACT, global_user, NULL,
OPT_NOOP_T, 0, 0); OPT_NOOP_T, 0, 0);
aco_option_register(&cfg_info, "read_only", ACO_EXACT, user, aco_option_register(&cfg_info, "read_only", ACO_EXACT, global_user,
"no", OPT_BOOL_T, 1, "no", OPT_BOOL_T, 1,
FLDSET(struct ast_ari_conf_user, read_only)); FLDSET(struct ast_ari_conf_user, read_only));
aco_option_register(&cfg_info, "password", ACO_EXACT, user, aco_option_register(&cfg_info, "password", ACO_EXACT, global_user,
"", OPT_CHAR_ARRAY_T, 0, "", OPT_CHAR_ARRAY_T, 0,
FLDSET(struct ast_ari_conf_user, password), ARI_PASSWORD_LEN); FLDSET(struct ast_ari_conf_user, password), ARI_PASSWORD_LEN);
aco_option_register_custom(&cfg_info, "password_format", ACO_EXACT, aco_option_register_custom(&cfg_info, "password_format", ACO_EXACT,
user, "plain", password_format_handler, 0); global_user, "plain", password_format_handler, 0);
return process_config(0); return process_config(0);
} }

View File

@ -69,7 +69,7 @@ struct parked_subscription_datastore {
struct parked_subscription_data { struct parked_subscription_data {
struct transfer_channel_data *transfer_data; struct transfer_channel_data *transfer_data;
char *parkee_uuid; char *parkee_uuid;
int hangup_after:1; unsigned int hangup_after:1;
char parker_uuid[0]; char parker_uuid[0];
}; };

View File

@ -23,6 +23,9 @@
* \author Jonathan Rose <jrose@digium.com> * \author Jonathan Rose <jrose@digium.com>
*/ */
#ifndef ASTERISK_RES_PARKING_H
#define ASTERISK_RES_PARKING_H
#include "asterisk/pbx.h" #include "asterisk/pbx.h"
#include "asterisk/bridge.h" #include "asterisk/bridge.h"
#include "asterisk/parking.h" #include "asterisk/parking.h"
@ -574,3 +577,5 @@ int load_parking_tests(void);
* \return Nothing * \return Nothing
*/ */
void unload_parking_tests(void); void unload_parking_tests(void);
#endif /* ASTERISK_RES_PARKING_H */

View File

@ -156,7 +156,7 @@ static struct ast_config *realtime_multi_curl(const char *url, const char *unuse
for (field = fields; field; field = field->next) { for (field = fields; field; field = field->next) {
if (start) { if (start) {
char *op; char *op;
initfield = ast_strdupa(field->name); initfield = ast_strdup(field->name);
if ((op = strchr(initfield, ' '))) if ((op = strchr(initfield, ' ')))
*op = '\0'; *op = '\0';
} }
@ -172,6 +172,7 @@ static struct ast_config *realtime_multi_curl(const char *url, const char *unuse
ast_str_substitute_variables(&buffer, 0, NULL, ast_str_buffer(query)); ast_str_substitute_variables(&buffer, 0, NULL, ast_str_buffer(query));
if (!(cfg = ast_config_new())) { if (!(cfg = ast_config_new())) {
ast_free(initfield);
return NULL; return NULL;
} }
@ -206,6 +207,8 @@ static struct ast_config *realtime_multi_curl(const char *url, const char *unuse
ast_category_append(cfg, cat); ast_category_append(cfg, cat);
} }
ast_free(initfield);
return cfg; return cfg;
} }

View File

@ -607,13 +607,14 @@ static void build_profile(const char *name, struct ast_variable *v)
if (!strcasecmp(v->name, "mime_type")) { if (!strcasecmp(v->name, "mime_type")) {
ast_string_field_set(profile, default_mime_type, v->value); ast_string_field_set(profile, default_mime_type, v->value);
} else if (!strcasecmp(v->name, "setvar")) { } else if (!strcasecmp(v->name, "setvar")) {
char *value_copy = ast_strdupa(v->value); char value_copy[strlen(v->value) + 1];
AST_DECLARE_APP_ARGS(args, AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(varname); AST_APP_ARG(varname);
AST_APP_ARG(varval); AST_APP_ARG(varval);
); );
strcpy(value_copy, v->value); /* safe */
AST_NONSTANDARD_APP_ARGS(args, value_copy, '='); AST_NONSTANDARD_APP_ARGS(args, value_copy, '=');
do { do {
if (ast_strlen_zero(args.varname) || ast_strlen_zero(args.varval)) if (ast_strlen_zero(args.varname) || ast_strlen_zero(args.varval))
@ -629,7 +630,7 @@ static void build_profile(const char *name, struct ast_variable *v)
} else { } else {
struct phoneprov_file *pp_file; struct phoneprov_file *pp_file;
char *file_extension; char *file_extension;
char *value_copy = ast_strdupa(v->value); char value_copy[strlen(v->value) + 1];
AST_DECLARE_APP_ARGS(args, AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(filename); AST_APP_ARG(filename);
@ -644,6 +645,7 @@ static void build_profile(const char *name, struct ast_variable *v)
if ((file_extension = strrchr(pp_file->format, '.'))) if ((file_extension = strrchr(pp_file->format, '.')))
file_extension++; file_extension++;
strcpy(value_copy, v->value); /* safe */
AST_STANDARD_APP_ARGS(args, value_copy); AST_STANDARD_APP_ARGS(args, value_copy);
/* Mime type order of preference /* Mime type order of preference

View File

@ -83,7 +83,7 @@ static void *system_alloc(const char *name)
return system; return system;
} }
static int system_apply(const struct ast_sorcery *system_sorcery, void *obj) static int system_apply(const struct ast_sorcery *sorcery, void *obj)
{ {
struct system_config *system = obj; struct system_config *system = obj;
int min_timerb; int min_timerb;

View File

@ -1347,10 +1347,19 @@ static int transport_localnet_handler(const struct aco_option *opt, struct ast_v
return error; return error;
} }
static void localnet_to_vl_append(struct ast_variable **head, struct ast_ha *ha)
{
char str[MAX_OBJECT_FIELD];
const char *addr = ast_strdupa(ast_sockaddr_stringify_addr(&ha->addr));
snprintf(str, MAX_OBJECT_FIELD, "%s%s/%s", ha->sense == AST_SENSE_ALLOW ? "!" : "",
addr, ast_sockaddr_stringify_addr(&ha->netmask));
ast_variable_list_append(head, ast_variable_new("local_net", str, ""));
}
static int localnet_to_vl(const void *obj, struct ast_variable **fields) static int localnet_to_vl(const void *obj, struct ast_variable **fields)
{ {
const struct ast_sip_transport *transport = obj; const struct ast_sip_transport *transport = obj;
char str[MAX_OBJECT_FIELD];
struct ast_variable *head = NULL; struct ast_variable *head = NULL;
struct ast_ha *ha; struct ast_ha *ha;
RAII_VAR(struct ast_sip_transport_state *, state, find_state_by_transport(transport), ao2_cleanup); RAII_VAR(struct ast_sip_transport_state *, state, find_state_by_transport(transport), ao2_cleanup);
@ -1360,11 +1369,7 @@ static int localnet_to_vl(const void *obj, struct ast_variable **fields)
} }
for (ha = state->localnet; ha; ha = ha->next) { for (ha = state->localnet; ha; ha = ha->next) {
const char *addr = ast_strdupa(ast_sockaddr_stringify_addr(&ha->addr)); localnet_to_vl_append(&head, ha);
snprintf(str, MAX_OBJECT_FIELD, "%s%s/%s", ha->sense == AST_SENSE_ALLOW ? "!" : "",
addr, ast_sockaddr_stringify_addr(&ha->netmask));
ast_variable_list_append(&head, ast_variable_new("local_net", str, ""));
} }
if (head) { if (head) {

View File

@ -665,7 +665,7 @@ static void sip_check_transport(pj_pool_t *pool, pjsip_transport_type_e transpor
} }
/*! \brief External resolver implementation for PJSIP */ /*! \brief External resolver implementation for PJSIP */
static pjsip_ext_resolver resolver = { static pjsip_ext_resolver ext_resolver = {
.resolve = sip_resolve, .resolve = sip_resolve,
}; };
@ -697,7 +697,7 @@ static int sip_replace_resolver(void *data)
pjsip_endpt_release_pool(ast_sip_get_pjsip_endpoint(), pool); pjsip_endpt_release_pool(ast_sip_get_pjsip_endpoint(), pool);
/* Replace the PJSIP resolver with our own implementation */ /* Replace the PJSIP resolver with our own implementation */
pjsip_endpt_set_ext_resolver(ast_sip_get_pjsip_endpoint(), &resolver); pjsip_endpt_set_ext_resolver(ast_sip_get_pjsip_endpoint(), &ext_resolver);
return 0; return 0;
} }

View File

@ -551,20 +551,24 @@ static int match_to_str(const void *obj, const intptr_t *args, char **buf)
return 0; return 0;
} }
static int match_to_var_list(const void *obj, struct ast_variable **fields) static void match_to_var_list_append(struct ast_variable **head, struct ast_ha *ha)
{ {
char str[MAX_OBJECT_FIELD]; char str[MAX_OBJECT_FIELD];
const char *addr = ast_strdupa(ast_sockaddr_stringify_addr(&ha->addr));
snprintf(str, MAX_OBJECT_FIELD, "%s%s/%s", ha->sense == AST_SENSE_ALLOW ? "!" : "",
addr, ast_sockaddr_stringify_addr(&ha->netmask));
ast_variable_list_append(head, ast_variable_new("match", str, ""));
}
static int match_to_var_list(const void *obj, struct ast_variable **fields)
{
const struct ip_identify_match *identify = obj; const struct ip_identify_match *identify = obj;
struct ast_variable *head = NULL; struct ast_variable *head = NULL;
struct ast_ha *ha = identify->matches; struct ast_ha *ha = identify->matches;
for (; ha; ha = ha->next) { for (; ha; ha = ha->next) {
const char *addr = ast_strdupa(ast_sockaddr_stringify_addr(&ha->addr)); match_to_var_list_append(&head, ha);
snprintf(str, MAX_OBJECT_FIELD, "%s%s/%s", ha->sense == AST_SENSE_ALLOW ? "!" : "",
addr, ast_sockaddr_stringify_addr(&ha->netmask));
ast_variable_list_append(&head, ast_variable_new("match", str, ""));
} }
if (head) { if (head) {

View File

@ -1018,9 +1018,9 @@ static struct ast_sip_aor *find_registrar_aor(struct pjsip_rx_data *rdata, struc
case AST_SIP_ENDPOINT_IDENTIFY_BY_USERNAME: case AST_SIP_ENDPOINT_IDENTIFY_BY_USERNAME:
uri = pjsip_uri_get_uri(rdata->msg_info.to->uri); uri = pjsip_uri_get_uri(rdata->msg_info.to->uri);
domain_name = ast_alloca(uri->host.slen + 1); domain_name = ast_malloc(uri->host.slen + 1);
ast_copy_pj_str(domain_name, &uri->host, uri->host.slen + 1); ast_copy_pj_str(domain_name, &uri->host, uri->host.slen + 1);
username = ast_alloca(uri->user.slen + 1); username = ast_malloc(uri->user.slen + 1);
ast_copy_pj_str(username, &uri->user, uri->user.slen + 1); ast_copy_pj_str(username, &uri->user, uri->user.slen + 1);
/* /*
@ -1038,9 +1038,9 @@ static struct ast_sip_aor *find_registrar_aor(struct pjsip_rx_data *rdata, struc
while ((header = pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_AUTHORIZATION, while ((header = pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_AUTHORIZATION,
header ? header->next : NULL))) { header ? header->next : NULL))) {
if (header && !pj_stricmp2(&header->scheme, "digest")) { if (header && !pj_stricmp2(&header->scheme, "digest")) {
username = ast_alloca(header->credential.digest.username.slen + 1); username = ast_malloc(header->credential.digest.username.slen + 1);
ast_copy_pj_str(username, &header->credential.digest.username, header->credential.digest.username.slen + 1); ast_copy_pj_str(username, &header->credential.digest.username, header->credential.digest.username.slen + 1);
domain_name = ast_alloca(header->credential.digest.realm.slen + 1); domain_name = ast_malloc(header->credential.digest.realm.slen + 1);
ast_copy_pj_str(domain_name, &header->credential.digest.realm, header->credential.digest.realm.slen + 1); ast_copy_pj_str(domain_name, &header->credential.digest.realm, header->credential.digest.realm.slen + 1);
aor_name = find_aor_name(username, domain_name, endpoint->aors); aor_name = find_aor_name(username, domain_name, endpoint->aors);
@ -1058,6 +1058,9 @@ static struct ast_sip_aor *find_registrar_aor(struct pjsip_rx_data *rdata, struc
if (aor_name) { if (aor_name) {
break; break;
} }
ast_free(domain_name);
ast_free(username);
} }
if (ast_strlen_zero(aor_name) || !(aor = ast_sip_location_retrieve_aor(aor_name))) { if (ast_strlen_zero(aor_name) || !(aor = ast_sip_location_retrieve_aor(aor_name))) {
@ -1068,6 +1071,8 @@ static struct ast_sip_aor *find_registrar_aor(struct pjsip_rx_data *rdata, struc
username ?: "", ast_sorcery_object_get_id(endpoint)); username ?: "", ast_sorcery_object_get_id(endpoint));
} }
ast_free(aor_name); ast_free(aor_name);
ast_free(domain_name);
ast_free(username);
return aor; return aor;
} }

View File

@ -537,13 +537,13 @@ static struct ast_frame *t38_framehook(struct ast_channel *chan, struct ast_fram
if (f->frametype == AST_FRAME_CONTROL if (f->frametype == AST_FRAME_CONTROL
&& f->subclass.integer == AST_CONTROL_T38_PARAMETERS) { && f->subclass.integer == AST_CONTROL_T38_PARAMETERS) {
if (channel->session->endpoint->media.t38.enabled) { if (channel->session->endpoint->media.t38.enabled) {
struct t38_parameters_task_data *data; struct t38_parameters_task_data *task_data;
data = t38_parameters_task_data_alloc(channel->session, f); task_data = t38_parameters_task_data_alloc(channel->session, f);
if (data if (task_data
&& ast_sip_push_task(channel->session->serializer, && ast_sip_push_task(channel->session->serializer,
t38_interpret_parameters, data)) { t38_interpret_parameters, task_data)) {
ao2_ref(data, -1); ao2_ref(task_data, -1);
} }
} else { } else {
static const struct ast_control_t38_parameters rsp_refused = { static const struct ast_control_t38_parameters rsp_refused = {

View File

@ -260,11 +260,11 @@ static void unbound_resolver_callback(void *data, int err, struct ub_result *ub_
if (!ast_dns_resolver_set_result(query, ub_result->secure, ub_result->bogus, ub_result->rcode, if (!ast_dns_resolver_set_result(query, ub_result->secure, ub_result->bogus, ub_result->rcode,
S_OR(ub_result->canonname, ast_dns_query_get_name(query)), ub_result->answer_packet, ub_result->answer_len)) { S_OR(ub_result->canonname, ast_dns_query_get_name(query)), ub_result->answer_packet, ub_result->answer_len)) {
int i; int i;
char *data; char *result_data;
for (i = 0; (data = ub_result->data[i]); i++) { for (i = 0; (result_data = ub_result->data[i]); i++) {
if (ast_dns_resolver_add_record(query, ub_result->qtype, ub_result->qclass, ub_result->ttl, if (ast_dns_resolver_add_record(query, ub_result->qtype, ub_result->qclass, ub_result->ttl,
data, ub_result->len[i])) { result_data, ub_result->len[i])) {
break; break;
} }
} }

View File

@ -3087,11 +3087,11 @@ static int __rtp_recvfrom(struct ast_rtp_instance *instance, void *buf, size_t s
ao2_ref(ice, -1); ao2_ref(ice, -1);
ao2_lock(instance); ao2_lock(instance);
if (status != PJ_SUCCESS) { if (status != PJ_SUCCESS) {
char buf[100]; char err_buf[100];
pj_strerror(status, buf, sizeof(buf)); pj_strerror(status, err_buf, sizeof(err_buf));
ast_log(LOG_WARNING, "PJ ICE Rx error status code: %d '%s'.\n", ast_log(LOG_WARNING, "PJ ICE Rx error status code: %d '%s'.\n",
(int)status, buf); (int)status, err_buf);
return -1; return -1;
} }
if (!rtp->passthrough) { if (!rtp->passthrough) {

View File

@ -37,7 +37,7 @@ struct stasis_app_command {
void *data; void *data;
command_data_destructor_fn data_destructor; command_data_destructor_fn data_destructor;
int retval; int retval;
int is_done:1; unsigned int is_done:1;
}; };
static void command_dtor(void *obj) static void command_dtor(void *obj)

View File

@ -99,7 +99,7 @@ struct stasis_app_control {
/*! /*!
* When set, /c app_stasis should exit and continue in the dialplan. * When set, /c app_stasis should exit and continue in the dialplan.
*/ */
int is_done:1; unsigned int is_done:1;
}; };
static void control_dtor(void *obj) static void control_dtor(void *obj)