diff options
-rw-r--r-- | funcs/func_callerid.c | 14 | ||||
-rw-r--r-- | include/asterisk/channel.h | 3 | ||||
-rw-r--r-- | main/channel.c | 4 |
3 files changed, 17 insertions, 4 deletions
diff --git a/funcs/func_callerid.c b/funcs/func_callerid.c index be3026325..9809f4d08 100644 --- a/funcs/func_callerid.c +++ b/funcs/func_callerid.c @@ -64,6 +64,8 @@ static int callerid_read(struct ast_channel *chan, char *cmd, char *data, ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data); } } else { + ast_channel_lock(chan); + if (!strncasecmp("all", data, 3)) { snprintf(buf, len, "\"%s\" <%s>", S_OR(chan->cid.cid_name, ""), @@ -92,6 +94,8 @@ static int callerid_read(struct ast_channel *chan, char *cmd, char *data, } else { ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data); } + + ast_channel_unlock(chan); } return 0; @@ -107,8 +111,8 @@ static int callerid_write(struct ast_channel *chan, char *cmd, char *data, char name[256]; char num[256]; - if (!ast_callerid_split(value, name, sizeof(name), num, sizeof(num))) - ast_set_callerid(chan, num, name, num); + if (!ast_callerid_split(value, name, sizeof(name), num, sizeof(num))) + ast_set_callerid(chan, num, name, num); } else if (!strncasecmp("name", data, 4)) { ast_set_callerid(chan, NULL, value, NULL); } else if (!strncasecmp("num", data, 3) || @@ -117,15 +121,17 @@ static int callerid_write(struct ast_channel *chan, char *cmd, char *data, } else if (!strncasecmp("ani", data, 3)) { ast_set_callerid(chan, NULL, NULL, value); } else if (!strncasecmp("dnid", data, 4)) { - /* do we need to lock chan here? */ + ast_channel_lock(chan); if (chan->cid.cid_dnid) free(chan->cid.cid_dnid); chan->cid.cid_dnid = ast_strdup(value); + ast_channel_unlock(chan); } else if (!strncasecmp("rdnis", data, 5)) { - /* do we need to lock chan here? */ + ast_channel_lock(chan); if (chan->cid.cid_rdnis) free(chan->cid.cid_rdnis); chan->cid.cid_rdnis = ast_strdup(value); + ast_channel_unlock(chan); } else { ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data); } diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h index 5a704199e..a05975a56 100644 --- a/include/asterisk/channel.h +++ b/include/asterisk/channel.h @@ -1109,6 +1109,9 @@ int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen, /*! Deactive an active generator */ void ast_deactivate_generator(struct ast_channel *chan); +/*! + * \note The channel does not need to be locked before calling this function. + */ void ast_set_callerid(struct ast_channel *chan, const char *cidnum, const char *cidname, const char *ani); diff --git a/main/channel.c b/main/channel.c index ce9f2ce74..3c4af0f93 100644 --- a/main/channel.c +++ b/main/channel.c @@ -3874,6 +3874,8 @@ int ast_do_masquerade(struct ast_channel *original) void ast_set_callerid(struct ast_channel *chan, const char *callerid, const char *calleridname, const char *ani) { + ast_channel_lock(chan); + if (callerid) { if (chan->cid.cid_num) free(chan->cid.cid_num); @@ -3904,6 +3906,8 @@ void ast_set_callerid(struct ast_channel *chan, const char *callerid, const char chan->cid.cid_pres, ast_describe_caller_presentation(chan->cid.cid_pres) ); + + ast_channel_unlock(chan); } int ast_setstate(struct ast_channel *chan, enum ast_channel_state state) |