mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 20:20:07 +00:00
This set of changes is to make some callerID handling thread-safe.
The ast_set_callerid() function needed to lock the channel. Also, the handlers for the CALLERID() dialplan function needed to lock the channel when reading or writing callerid values directly on the channel structure. git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@90145 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user